diff --git a/config/linux-sun8i-default.config b/config/linux-sun8i-default.config index 0b1c2c912..9b016a0ca 100644 --- a/config/linux-sun8i-default.config +++ b/config/linux-sun8i-default.config @@ -2522,7 +2522,7 @@ CONFIG_DVB_USB_TECHNISAT_USB2=m CONFIG_DVB_USB_IT913X=m CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_USB_RTL28XXU=m -# CONFIG_DVB_USB_RTL2832U is not set +CONFIG_DVB_USB_RTL2832U=m CONFIG_SMS_SIANO_MDTV=m # diff --git a/configuration.sh b/configuration.sh index 57a3df424..41ffa0f2c 100644 --- a/configuration.sh +++ b/configuration.sh @@ -258,7 +258,7 @@ case $BOARD in #description H3 quad core 1Gb SoC Wifi #build 6wip LINUXFAMILY="sun8i" - BOOTCONFIG="orangepi_plus_defconfig" + BOOTCONFIG="Sinovoip_BPI_M2_plus_defconfig" MODULES="#gpio_sunxi #w1-sunxi #w1-gpio #w1-therm #ap6211" MODULES_NEXT="brcmfmac" CPUMIN="240000" diff --git a/patch/kernel/sun8i-default/0015-ap6210_module-bananapim2plus.patch.disabled b/patch/kernel/sun8i-default/0015-ap6210_module-bananapim2plus.patch.disabled new file mode 100644 index 000000000..acd751724 --- /dev/null +++ b/patch/kernel/sun8i-default/0015-ap6210_module-bananapim2plus.patch.disabled @@ -0,0 +1,127005 @@ +diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig +index 4d64904..f1e6979 100755 +--- a/drivers/net/wireless/Kconfig ++++ b/drivers/net/wireless/Kconfig +@@ -277,6 +277,7 @@ source "drivers/net/wireless/ath/Kconfig" + source "drivers/net/wireless/b43/Kconfig" + source "drivers/net/wireless/b43legacy/Kconfig" + source "drivers/net/wireless/bcmdhd/Kconfig" ++source "drivers/net/wireless/ap6210/Kconfig" + source "drivers/net/wireless/brcm80211/Kconfig" + source "drivers/net/wireless/hostap/Kconfig" + source "drivers/net/wireless/ipw2x00/Kconfig" +diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile +index 2251aca..aee4b10 100755 +--- a/drivers/net/wireless/Makefile ++++ b/drivers/net/wireless/Makefile +@@ -63,6 +63,7 @@ obj-$(CONFIG_IWM) += iwmc3200wifi/ + obj-$(CONFIG_MWIFIEX) += mwifiex/ + + obj-$(CONFIG_BCMDHD) += bcmdhd/ ++obj-$(CONFIG_AP6210) += ap6210/ + + obj-$(CONFIG_BRCMFMAC) += brcm80211/ + obj-$(CONFIG_BRCMSMAC) += brcm80211/ +diff --git a/drivers/net/wireless/ap6210/Kconfig b/drivers/net/wireless/ap6210/Kconfig +new file mode 100644 +index 0000000..9756ac7 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/Kconfig +@@ -0,0 +1,45 @@ ++config AP6210 ++ tristate "AMPAK AP6210 wireless/bluetooth module support" ++ depends on MMC ++ default n ++ ---help--- ++ This module adds support for the wireless and bluetooth ++ module of the CubieTruck. ++ ++config AP6210_FW_PATH ++ depends on AP6210 ++ string "Firmware path" ++ default "/system/vendor/modules/fw_bcmxxxx.bin" ++ ---help--- ++ Path to the firmware file. ++ ++config AP6210_NVRAM_PATH ++ depends on AP6210 ++ string "NVRAM path" ++ default "/system/vendor/modules/nvram_apxxxx.txt" ++ ---help--- ++ Path to the calibration file. ++ ++config AP6210_WEXT ++ bool "Enable WEXT support" ++ depends on AP6210 && CFG80211 = n ++ select WIRELESS_EXT ++ select WEXT_PRIV ++ help ++ Enables WEXT support ++ ++choice ++ depends on AP6210 ++ prompt "Interrupt type" ++config AP6210_OOB ++ depends on AP6210 ++ bool "Out-of-Band Interrupt" ++ ---help--- ++ Interrupt through WL_HOST_WAKE. ++config AP6210_SDIO_IRQ ++ depends on AP6210 ++ bool "In-Band Interrupt" ++ default y ++ ---help--- ++ Interrupt through SDIO DAT[1] ++endchoice +diff --git a/drivers/net/wireless/ap6210/Makefile b/drivers/net/wireless/ap6210/Makefile +new file mode 100644 +index 0000000..02c0b0f +--- /dev/null ++++ b/drivers/net/wireless/ap6210/Makefile +@@ -0,0 +1,65 @@ ++# ap6210 ++DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DBCMDRIVER \ ++ -DBCMDONGLEHOST -DUNRELEASEDCHIP -DBCMDMA32 -DBCMFILEIMAGE \ ++ -DDHDTHREAD -DDHD_DEBUG -DSDTEST -DBDC -DTOE \ ++ -DDHD_BCMEVENTS -DSHOW_EVENTS -DPROP_TXSTATUS -DBCMDBG \ ++ -DMMC_SDIO_ABORT -DBCMSDIO -DBCMLXSDMMC -DBCMPLATFORM_BUS -DWLP2P \ ++ -DWIFI_ACT_FRAME -DARP_OFFLOAD_SUPPORT \ ++ -DKEEP_ALIVE -DPKT_FILTER_SUPPORT \ ++ -DEMBEDDED_PLATFORM -DENABLE_INSMOD_NO_FW_LOAD -DPNO_SUPPORT \ ++ -DDHD_USE_IDLECOUNT -DSET_RANDOM_MAC_SOFTAP -DVSDB \ ++ -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST -DSDIO_CRC_ERROR_FIX \ ++ -DESCAN_RESULT_PATCH -DHT40_GO -DPASS_ARP_PACKET -DSUPPORT_PM2_ONLY \ ++ -DDHD_DONOT_FORWARD_BCMEVENT_AS_NETWORK_PKT -DAMPDU_HOSTREORDER \ ++ -DDISABLE_FW_ROAM_SUSPEND -DDISABLE_BUILTIN_ROAM \ ++ -DCUSTOM_SDIO_F2_BLKSIZE=128 -DWL_SDO -DWL_SUPPORT_BACKPORTED_KPATCHES\ ++ -Idrivers/net/wireless/ap6210 -Idrivers/net/wireless/ap6210/include ++ ++DHDOFILES = aiutils.o bcmsdh_sdmmc_linux.o dhd_linux.o siutils.o bcmutils.o \ ++ dhd_linux_sched.o dhd_sdio.o bcmwifi_channels.o bcmevent.o hndpmu.o \ ++ bcmsdh.o dhd_cdc.o bcmsdh_linux.o dhd_common.o linux_osl.o \ ++ bcmsdh_sdmmc.o dhd_custom_gpio.o sbutils.o wldev_common.o wl_android.o \ ++ ap6210_gpio_wifi.o ap6210_gpio_bt.o ++ ++obj-$(CONFIG_AP6210) += ap6210.o ++ap6210-objs += $(DHDOFILES) ++ ++DHDOFILES += dhd_gpio.o ++DHDCFLAGS += -DCUSTOMER_HW ++#DHDCFLAGS += -DBCMWAPI_WPI -DBCMWAPI_WAI ++ ++ifeq ($(CONFIG_AP6210_OOB),y) ++DHDCFLAGS += -DOOB_INTR_ONLY -DHW_OOB -DCUSTOMER_OOB ++else ++DHDCFLAGS += -DSDIO_ISR_THREAD ++endif ++ ++ifeq ($(CONFIG_AP6210_AG),y) ++ DHDCFLAGS += -DBAND_AG ++endif ++ ++ifneq ($(CONFIG_WIRELESS_EXT),) ++ap6210-objs += wl_iw.o ++DHDCFLAGS += -DSOFTAP -DWL_WIRELESS_EXT -DUSE_IW ++endif ++ifneq ($(CONFIG_CFG80211),) ++ap6210-objs += wl_cfg80211.o wl_cfgp2p.o wl_linux_mon.o dhd_cfg80211.o ++DHDCFLAGS += -DWL_CFG80211 -DWL_CFG80211_STA_EVENT -DWL_ENABLE_P2P_IF ++DHDCFLAGS += -DCUSTOM_ROAM_TRIGGER_SETTING=-65 ++DHDCFLAGS += -DCUSTOM_ROAM_DELTA_SETTING=15 ++DHDCFLAGS += -DCUSTOM_KEEP_ALIVE_SETTING=28000 ++DHDCFLAGS += -DCUSTOM_PNO_EVENT_LOCK_xTIME=7 ++DHDCFLAGS += -fno-aggressive-loop-optimizations ++endif ++ifneq ($(CONFIG_DHD_USE_SCHED_SCAN),) ++DHDCFLAGS += -DWL_SCHED_SCAN ++endif ++EXTRA_CFLAGS = $(DHDCFLAGS) ++ifeq ($(CONFIG_AP6210),m) ++EXTRA_LDFLAGS += --strip-debug ++endif ++ ++# GPIO Power Management Modules ++ ++#obj-$(CONFIG_AP6210) += ap6210_gpio_wifi.o ++#obj-$(CONFIG_AP6210) += ap6210_gpio_bt.o +diff --git a/drivers/net/wireless/ap6210/aiutils.c b/drivers/net/wireless/ap6210/aiutils.c +new file mode 100644 +index 0000000..bc116d7 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/aiutils.c +@@ -0,0 +1,873 @@ ++/* ++ * Misc utility routines for accessing chip-specific features ++ * of the SiliconBackplane-based Broadcom chips. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: aiutils.c 347614 2012-07-27 10:24:51Z $ ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "siutils_priv.h" ++ ++#include ++ ++#define BCM47162_DMP() (0) ++#define BCM5357_DMP() (0) ++#define remap_coreid(sih, coreid) (coreid) ++#define remap_corerev(sih, corerev) (corerev) ++ ++/* EROM parsing */ ++ ++static uint32 ++get_erom_ent(si_t *sih, uint32 **eromptr, uint32 mask, uint32 match) ++{ ++ uint32 ent; ++ uint inv = 0, nom = 0; ++ ++ while (TRUE) { ++ ent = R_REG(si_osh(sih), *eromptr); ++ (*eromptr)++; ++ ++ if (mask == 0) ++ break; ++ ++ if ((ent & ER_VALID) == 0) { ++ inv++; ++ continue; ++ } ++ ++ if (ent == (ER_END | ER_VALID)) ++ break; ++ ++ if ((ent & mask) == match) ++ break; ++ ++ nom++; ++ } ++ ++ AP6210_DEBUG("%s: Returning ent 0x%08x\n", __FUNCTION__, ent); ++ if (inv + nom) { ++ AP6210_DEBUG(" after %d invalid and %d non-matching entries\n", inv, nom); ++ } ++ return ent; ++} ++ ++static uint32 ++get_asd(si_t *sih, uint32 **eromptr, uint sp, uint ad, uint st, uint32 *addrl, uint32 *addrh, ++ uint32 *sizel, uint32 *sizeh) ++{ ++ uint32 asd, sz, szd; ++ ++ asd = get_erom_ent(sih, eromptr, ER_VALID, ER_VALID); ++ if (((asd & ER_TAG1) != ER_ADD) || ++ (((asd & AD_SP_MASK) >> AD_SP_SHIFT) != sp) || ++ ((asd & AD_ST_MASK) != st)) { ++ /* This is not what we want, "push" it back */ ++ (*eromptr)--; ++ return 0; ++ } ++ *addrl = asd & AD_ADDR_MASK; ++ if (asd & AD_AG32) ++ *addrh = get_erom_ent(sih, eromptr, 0, 0); ++ else ++ *addrh = 0; ++ *sizeh = 0; ++ sz = asd & AD_SZ_MASK; ++ if (sz == AD_SZ_SZD) { ++ szd = get_erom_ent(sih, eromptr, 0, 0); ++ *sizel = szd & SD_SZ_MASK; ++ if (szd & SD_SG32) ++ *sizeh = get_erom_ent(sih, eromptr, 0, 0); ++ } else ++ *sizel = AD_SZ_BASE << (sz >> AD_SZ_SHIFT); ++ ++ AP6210_DEBUG(" SP %d, ad %d: st = %d, 0x%08x_0x%08x @ 0x%08x_0x%08x\n", ++ sp, ad, st, *sizeh, *sizel, *addrh, *addrl); ++ ++ return asd; ++} ++ ++static void ++ai_hwfixup(si_info_t *sii) ++{ ++} ++ ++ ++/* parse the enumeration rom to identify all cores */ ++void ++ai_scan(si_t *sih, void *regs, uint devid) ++{ ++ si_info_t *sii = SI_INFO(sih); ++ chipcregs_t *cc = (chipcregs_t *)regs; ++ uint32 erombase, *eromptr, *eromlim; ++ ++ erombase = R_REG(sii->osh, &cc->eromptr); ++ ++ switch (BUSTYPE(sih->bustype)) { ++ case SI_BUS: ++ eromptr = (uint32 *)REG_MAP(erombase, SI_CORE_SIZE); ++ break; ++ ++ case PCI_BUS: ++ /* Set wrappers address */ ++ sii->curwrap = (void *)((uintptr)regs + SI_CORE_SIZE); ++ ++ /* Now point the window at the erom */ ++ OSL_PCI_WRITE_CONFIG(sii->osh, PCI_BAR0_WIN, 4, erombase); ++ eromptr = regs; ++ break; ++ ++ case SPI_BUS: ++ case SDIO_BUS: ++ eromptr = (uint32 *)(uintptr)erombase; ++ break; ++ ++ case PCMCIA_BUS: ++ default: ++ AP6210_ERR("Don't know how to do AXI enumertion on bus %d\n", sih->bustype); ++ ASSERT(0); ++ return; ++ } ++ eromlim = eromptr + (ER_REMAPCONTROL / sizeof(uint32)); ++ ++ AP6210_DEBUG("ai_scan: regs = 0x%p, erombase = 0x%08x, eromptr = 0x%p, eromlim = 0x%p\n", ++ regs, erombase, eromptr, eromlim); ++ while (eromptr < eromlim) { ++ uint32 cia, cib, cid, mfg, crev, nmw, nsw, nmp, nsp; ++ uint32 mpd, asd, addrl, addrh, sizel, sizeh; ++ uint i, j, idx; ++ bool br; ++ ++ br = FALSE; ++ ++ /* Grok a component */ ++ cia = get_erom_ent(sih, &eromptr, ER_TAG, ER_CI); ++ if (cia == (ER_END | ER_VALID)) { ++ AP6210_DEBUG("Found END of erom after %d cores\n", sii->numcores); ++ ai_hwfixup(sii); ++ return; ++ } ++ ++ cib = get_erom_ent(sih, &eromptr, 0, 0); ++ ++ if ((cib & ER_TAG) != ER_CI) { ++ AP6210_ERR("CIA not followed by CIB\n"); ++ goto error; ++ } ++ ++ cid = (cia & CIA_CID_MASK) >> CIA_CID_SHIFT; ++ mfg = (cia & CIA_MFG_MASK) >> CIA_MFG_SHIFT; ++ crev = (cib & CIB_REV_MASK) >> CIB_REV_SHIFT; ++ nmw = (cib & CIB_NMW_MASK) >> CIB_NMW_SHIFT; ++ nsw = (cib & CIB_NSW_MASK) >> CIB_NSW_SHIFT; ++ nmp = (cib & CIB_NMP_MASK) >> CIB_NMP_SHIFT; ++ nsp = (cib & CIB_NSP_MASK) >> CIB_NSP_SHIFT; ++ ++#ifdef BCMDBG_SI ++ AP6210_DEBUG("Found component 0x%04x/0x%04x rev %d at erom addr 0x%p, with nmw = %d, " ++ "nsw = %d, nmp = %d & nsp = %d\n", ++ mfg, cid, crev, eromptr - 1, nmw, nsw, nmp, nsp); ++#else ++ BCM_REFERENCE(crev); ++#endif ++ ++ if (((mfg == MFGID_ARM) && (cid == DEF_AI_COMP)) || (nsp == 0)) ++ continue; ++ if ((nmw + nsw == 0)) { ++ /* A component which is not a core */ ++ if (cid == OOB_ROUTER_CORE_ID) { ++ asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, ++ &addrl, &addrh, &sizel, &sizeh); ++ if (asd != 0) { ++ sii->oob_router = addrl; ++ } ++ } ++ if (cid != GMAC_COMMON_4706_CORE_ID) ++ continue; ++ } ++ ++ idx = sii->numcores; ++ ++ sii->cia[idx] = cia; ++ sii->cib[idx] = cib; ++ sii->coreid[idx] = remap_coreid(sih, cid); ++ ++ for (i = 0; i < nmp; i++) { ++ mpd = get_erom_ent(sih, &eromptr, ER_VALID, ER_VALID); ++ if ((mpd & ER_TAG) != ER_MP) { ++ AP6210_ERR("Not enough MP entries for component 0x%x\n", cid); ++ goto error; ++ } ++ AP6210_DEBUG(" Master port %d, mp: %d id: %d\n", i, ++ (mpd & MPD_MP_MASK) >> MPD_MP_SHIFT, ++ (mpd & MPD_MUI_MASK) >> MPD_MUI_SHIFT); ++ } ++ ++ /* First Slave Address Descriptor should be port 0: ++ * the main register space for the core ++ */ ++ asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, &addrl, &addrh, &sizel, &sizeh); ++ if (asd == 0) { ++ do { ++ /* Try again to see if it is a bridge */ ++ asd = get_asd(sih, &eromptr, 0, 0, AD_ST_BRIDGE, &addrl, &addrh, ++ &sizel, &sizeh); ++ if (asd != 0) ++ br = TRUE; ++ else { ++ if (br == TRUE) { ++ break; ++ } ++ else if ((addrh != 0) || (sizeh != 0) || ++ (sizel != SI_CORE_SIZE)) { ++ AP6210_ERR("addrh = 0x%x\t sizeh = 0x%x\t size1 =" ++ "0x%x\n", addrh, sizeh, sizel); ++ AP6210_ERR("First Slave ASD for" ++ "core 0x%04x malformed " ++ "(0x%08x)\n", cid, asd); ++ goto error; ++ } ++ } ++ } while (1); ++ } ++ sii->coresba[idx] = addrl; ++ sii->coresba_size[idx] = sizel; ++ /* Get any more ASDs in port 0 */ ++ j = 1; ++ do { ++ asd = get_asd(sih, &eromptr, 0, j, AD_ST_SLAVE, &addrl, &addrh, ++ &sizel, &sizeh); ++ if ((asd != 0) && (j == 1) && (sizel == SI_CORE_SIZE)) { ++ sii->coresba2[idx] = addrl; ++ sii->coresba2_size[idx] = sizel; ++ } ++ j++; ++ } while (asd != 0); ++ ++ /* Go through the ASDs for other slave ports */ ++ for (i = 1; i < nsp; i++) { ++ j = 0; ++ do { ++ asd = get_asd(sih, &eromptr, i, j, AD_ST_SLAVE, &addrl, &addrh, ++ &sizel, &sizeh); ++ ++ if (asd == 0) ++ break; ++ j++; ++ } while (1); ++ if (j == 0) { ++ AP6210_ERR(" SP %d has no address descriptors\n", i); ++ goto error; ++ } ++ } ++ ++ /* Now get master wrappers */ ++ for (i = 0; i < nmw; i++) { ++ asd = get_asd(sih, &eromptr, i, 0, AD_ST_MWRAP, &addrl, &addrh, ++ &sizel, &sizeh); ++ if (asd == 0) { ++ AP6210_ERR("Missing descriptor for MW %d\n", i); ++ goto error; ++ } ++ if ((sizeh != 0) || (sizel != SI_CORE_SIZE)) { ++ AP6210_ERR("Master wrapper %d is not 4KB\n", i); ++ goto error; ++ } ++ if (i == 0) ++ sii->wrapba[idx] = addrl; ++ } ++ ++ /* And finally slave wrappers */ ++ for (i = 0; i < nsw; i++) { ++ uint fwp = (nsp == 1) ? 0 : 1; ++ asd = get_asd(sih, &eromptr, fwp + i, 0, AD_ST_SWRAP, &addrl, &addrh, ++ &sizel, &sizeh); ++ if (asd == 0) { ++ AP6210_ERR("Missing descriptor for SW %d\n", i); ++ goto error; ++ } ++ if ((sizeh != 0) || (sizel != SI_CORE_SIZE)) { ++ AP6210_ERR("Slave wrapper %d is not 4KB\n", i); ++ goto error; ++ } ++ if ((nmw == 0) && (i == 0)) ++ sii->wrapba[idx] = addrl; ++ } ++ ++ ++ /* Don't record bridges */ ++ if (br) ++ continue; ++ ++ /* Done with core */ ++ sii->numcores++; ++ } ++ ++ AP6210_ERR("Reached end of erom without finding END"); ++ ++error: ++ sii->numcores = 0; ++ return; ++} ++ ++/* This function changes the logical "focus" to the indicated core. ++ * Return the current core's virtual address. ++ */ ++void * ++ai_setcoreidx(si_t *sih, uint coreidx) ++{ ++ si_info_t *sii = SI_INFO(sih); ++ uint32 addr, wrap; ++ void *regs; ++ ++ if (coreidx >= MIN(sii->numcores, SI_MAXCORES)) ++ return (NULL); ++ ++ addr = sii->coresba[coreidx]; ++ wrap = sii->wrapba[coreidx]; ++ ++ /* ++ * If the user has provided an interrupt mask enabled function, ++ * then assert interrupts are disabled before switching the core. ++ */ ++ ASSERT((sii->intrsenabled_fn == NULL) || !(*(sii)->intrsenabled_fn)((sii)->intr_arg)); ++ ++ switch (BUSTYPE(sih->bustype)) { ++ case SI_BUS: ++ /* map new one */ ++ if (!sii->regs[coreidx]) { ++ sii->regs[coreidx] = REG_MAP(addr, SI_CORE_SIZE); ++ ASSERT(GOODREGS(sii->regs[coreidx])); ++ } ++ sii->curmap = regs = sii->regs[coreidx]; ++ if (!sii->wrappers[coreidx]) { ++ sii->wrappers[coreidx] = REG_MAP(wrap, SI_CORE_SIZE); ++ ASSERT(GOODREGS(sii->wrappers[coreidx])); ++ } ++ sii->curwrap = sii->wrappers[coreidx]; ++ break; ++ ++ ++ case SPI_BUS: ++ case SDIO_BUS: ++ sii->curmap = regs = (void *)((uintptr)addr); ++ sii->curwrap = (void *)((uintptr)wrap); ++ break; ++ ++ case PCMCIA_BUS: ++ default: ++ ASSERT(0); ++ regs = NULL; ++ break; ++ } ++ ++ sii->curmap = regs; ++ sii->curidx = coreidx; ++ ++ return regs; ++} ++ ++void ++ai_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size) ++{ ++ si_info_t *sii = SI_INFO(sih); ++ chipcregs_t *cc = NULL; ++ uint32 erombase, *eromptr, *eromlim; ++ uint i, j, cidx; ++ uint32 cia, cib, nmp, nsp; ++ uint32 asd, addrl, addrh, sizel, sizeh; ++ ++ for (i = 0; i < sii->numcores; i++) { ++ if (sii->coreid[i] == CC_CORE_ID) { ++ cc = (chipcregs_t *)sii->regs[i]; ++ break; ++ } ++ } ++ if (cc == NULL) ++ goto error; ++ ++ erombase = R_REG(sii->osh, &cc->eromptr); ++ eromptr = (uint32 *)REG_MAP(erombase, SI_CORE_SIZE); ++ eromlim = eromptr + (ER_REMAPCONTROL / sizeof(uint32)); ++ ++ cidx = sii->curidx; ++ cia = sii->cia[cidx]; ++ cib = sii->cib[cidx]; ++ ++ nmp = (cib & CIB_NMP_MASK) >> CIB_NMP_SHIFT; ++ nsp = (cib & CIB_NSP_MASK) >> CIB_NSP_SHIFT; ++ ++ /* scan for cores */ ++ while (eromptr < eromlim) { ++ if ((get_erom_ent(sih, &eromptr, ER_TAG, ER_CI) == cia) && ++ (get_erom_ent(sih, &eromptr, 0, 0) == cib)) { ++ break; ++ } ++ } ++ ++ /* skip master ports */ ++ for (i = 0; i < nmp; i++) ++ get_erom_ent(sih, &eromptr, ER_VALID, ER_VALID); ++ ++ /* Skip ASDs in port 0 */ ++ asd = get_asd(sih, &eromptr, 0, 0, AD_ST_SLAVE, &addrl, &addrh, &sizel, &sizeh); ++ if (asd == 0) { ++ /* Try again to see if it is a bridge */ ++ asd = get_asd(sih, &eromptr, 0, 0, AD_ST_BRIDGE, &addrl, &addrh, ++ &sizel, &sizeh); ++ } ++ ++ j = 1; ++ do { ++ asd = get_asd(sih, &eromptr, 0, j, AD_ST_SLAVE, &addrl, &addrh, ++ &sizel, &sizeh); ++ j++; ++ } while (asd != 0); ++ ++ /* Go through the ASDs for other slave ports */ ++ for (i = 1; i < nsp; i++) { ++ j = 0; ++ do { ++ asd = get_asd(sih, &eromptr, i, j, AD_ST_SLAVE, &addrl, &addrh, ++ &sizel, &sizeh); ++ if (asd == 0) ++ break; ++ ++ if (!asidx--) { ++ *addr = addrl; ++ *size = sizel; ++ return; ++ } ++ j++; ++ } while (1); ++ ++ if (j == 0) { ++ AP6210_ERR(" SP %d has no address descriptors\n", i); ++ break; ++ } ++ } ++ ++error: ++ *size = 0; ++ return; ++} ++ ++/* Return the number of address spaces in current core */ ++int ++ai_numaddrspaces(si_t *sih) ++{ ++ return 2; ++} ++ ++/* Return the address of the nth address space in the current core */ ++uint32 ++ai_addrspace(si_t *sih, uint asidx) ++{ ++ si_info_t *sii; ++ uint cidx; ++ ++ sii = SI_INFO(sih); ++ cidx = sii->curidx; ++ ++ if (asidx == 0) ++ return sii->coresba[cidx]; ++ else if (asidx == 1) ++ return sii->coresba2[cidx]; ++ else { ++ AP6210_ERR("%s: Need to parse the erom again to find addr space %d\n", ++ __FUNCTION__, asidx); ++ return 0; ++ } ++} ++ ++/* Return the size of the nth address space in the current core */ ++uint32 ++ai_addrspacesize(si_t *sih, uint asidx) ++{ ++ si_info_t *sii; ++ uint cidx; ++ ++ sii = SI_INFO(sih); ++ cidx = sii->curidx; ++ ++ if (asidx == 0) ++ return sii->coresba_size[cidx]; ++ else if (asidx == 1) ++ return sii->coresba2_size[cidx]; ++ else { ++ AP6210_ERR("%s: Need to parse the erom again to find addr space %d\n", ++ __FUNCTION__, asidx); ++ return 0; ++ } ++} ++ ++uint ++ai_flag(si_t *sih) ++{ ++ si_info_t *sii; ++ aidmp_t *ai; ++ ++ sii = SI_INFO(sih); ++ if (BCM47162_DMP()) { ++ AP6210_ERR("%s: Attempting to read MIPS DMP registers on 47162a0", __FUNCTION__); ++ return sii->curidx; ++ } ++ if (BCM5357_DMP()) { ++ AP6210_ERR("%s: Attempting to read USB20H DMP registers on 5357b0\n", __FUNCTION__); ++ return sii->curidx; ++ } ++ ai = sii->curwrap; ++ ++ return (R_REG(sii->osh, &ai->oobselouta30) & 0x1f); ++} ++ ++void ++ai_setint(si_t *sih, int siflag) ++{ ++} ++ ++uint ++ai_wrap_reg(si_t *sih, uint32 offset, uint32 mask, uint32 val) ++{ ++ si_info_t *sii = SI_INFO(sih); ++ uint32 *map = (uint32 *) sii->curwrap; ++ ++ if (mask || val) { ++ uint32 w = R_REG(sii->osh, map+(offset/4)); ++ w &= ~mask; ++ w |= val; ++ W_REG(sii->osh, map+(offset/4), val); ++ } ++ ++ return (R_REG(sii->osh, map+(offset/4))); ++} ++ ++uint ++ai_corevendor(si_t *sih) ++{ ++ si_info_t *sii; ++ uint32 cia; ++ ++ sii = SI_INFO(sih); ++ cia = sii->cia[sii->curidx]; ++ return ((cia & CIA_MFG_MASK) >> CIA_MFG_SHIFT); ++} ++ ++uint ++ai_corerev(si_t *sih) ++{ ++ si_info_t *sii; ++ uint32 cib; ++ ++ sii = SI_INFO(sih); ++ cib = sii->cib[sii->curidx]; ++ return remap_corerev(sih, (cib & CIB_REV_MASK) >> CIB_REV_SHIFT); ++} ++ ++bool ++ai_iscoreup(si_t *sih) ++{ ++ si_info_t *sii; ++ aidmp_t *ai; ++ ++ sii = SI_INFO(sih); ++ ai = sii->curwrap; ++ ++ return (((R_REG(sii->osh, &ai->ioctrl) & (SICF_FGC | SICF_CLOCK_EN)) == SICF_CLOCK_EN) && ++ ((R_REG(sii->osh, &ai->resetctrl) & AIRC_RESET) == 0)); ++} ++ ++/* ++ * Switch to 'coreidx', issue a single arbitrary 32bit register mask&set operation, ++ * switch back to the original core, and return the new value. ++ * ++ * When using the silicon backplane, no fiddling with interrupts or core switches is needed. ++ * ++ * Also, when using pci/pcie, we can optimize away the core switching for pci registers ++ * and (on newer pci cores) chipcommon registers. ++ */ ++uint ++ai_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) ++{ ++ uint origidx = 0; ++ uint32 *r = NULL; ++ uint w; ++ uint intr_val = 0; ++ bool fast = FALSE; ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ ASSERT(GOODIDX(coreidx)); ++ ASSERT(regoff < SI_CORE_SIZE); ++ ASSERT((val & ~mask) == 0); ++ ++ if (coreidx >= SI_MAXCORES) ++ return 0; ++ ++ if (BUSTYPE(sih->bustype) == SI_BUS) { ++ /* If internal bus, we can always get at everything */ ++ fast = TRUE; ++ /* map if does not exist */ ++ if (!sii->regs[coreidx]) { ++ sii->regs[coreidx] = REG_MAP(sii->coresba[coreidx], ++ SI_CORE_SIZE); ++ ASSERT(GOODREGS(sii->regs[coreidx])); ++ } ++ r = (uint32 *)((uchar *)sii->regs[coreidx] + regoff); ++ } else if (BUSTYPE(sih->bustype) == PCI_BUS) { ++ /* If pci/pcie, we can get at pci/pcie regs and on newer cores to chipc */ ++ ++ if ((sii->coreid[coreidx] == CC_CORE_ID) && SI_FAST(sii)) { ++ /* Chipc registers are mapped at 12KB */ ++ ++ fast = TRUE; ++ r = (uint32 *)((char *)sii->curmap + PCI_16KB0_CCREGS_OFFSET + regoff); ++ } else if (sii->pub.buscoreidx == coreidx) { ++ /* pci registers are at either in the last 2KB of an 8KB window ++ * or, in pcie and pci rev 13 at 8KB ++ */ ++ fast = TRUE; ++ if (SI_FAST(sii)) ++ r = (uint32 *)((char *)sii->curmap + ++ PCI_16KB0_PCIREGS_OFFSET + regoff); ++ else ++ r = (uint32 *)((char *)sii->curmap + ++ ((regoff >= SBCONFIGOFF) ? ++ PCI_BAR0_PCISBR_OFFSET : PCI_BAR0_PCIREGS_OFFSET) + ++ regoff); ++ } ++ } ++ ++ if (!fast) { ++ INTR_OFF(sii, intr_val); ++ ++ /* save current core index */ ++ origidx = si_coreidx(&sii->pub); ++ ++ /* switch core */ ++ r = (uint32*) ((uchar*) ai_setcoreidx(&sii->pub, coreidx) + regoff); ++ } ++ ASSERT(r != NULL); ++ ++ /* mask and set */ ++ if (mask || val) { ++ w = (R_REG(sii->osh, r) & ~mask) | val; ++ W_REG(sii->osh, r, w); ++ } ++ ++ /* readback */ ++ w = R_REG(sii->osh, r); ++ ++ if (!fast) { ++ /* restore core index */ ++ if (origidx != coreidx) ++ ai_setcoreidx(&sii->pub, origidx); ++ ++ INTR_RESTORE(sii, intr_val); ++ } ++ ++ return (w); ++} ++ ++void ++ai_core_disable(si_t *sih, uint32 bits) ++{ ++ si_info_t *sii; ++ volatile uint32 dummy; ++ uint32 status; ++ aidmp_t *ai; ++ ++ sii = SI_INFO(sih); ++ ++ ASSERT(GOODREGS(sii->curwrap)); ++ ai = sii->curwrap; ++ ++ /* if core is already in reset, just return */ ++ if (R_REG(sii->osh, &ai->resetctrl) & AIRC_RESET) ++ return; ++ ++ /* ensure there are no pending backplane operations */ ++ SPINWAIT(((status = R_REG(sii->osh, &ai->resetstatus)) != 0), 300); ++ ++ /* if pending backplane ops still, try waiting longer */ ++ if (status != 0) { ++ /* 300usecs was sufficient to allow backplane ops to clear for big hammer */ ++ /* during driver load we may need more time */ ++ SPINWAIT(((status = R_REG(sii->osh, &ai->resetstatus)) != 0), 10000); ++ /* if still pending ops, continue on and try disable anyway */ ++ /* this is in big hammer path, so don't call wl_reinit in this case... */ ++ } ++ ++ W_REG(sii->osh, &ai->ioctrl, bits); ++ dummy = R_REG(sii->osh, &ai->ioctrl); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(10); ++ ++ W_REG(sii->osh, &ai->resetctrl, AIRC_RESET); ++ dummy = R_REG(sii->osh, &ai->resetctrl); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++} ++ ++/* reset and re-enable a core ++ * inputs: ++ * bits - core specific bits that are set during and after reset sequence ++ * resetbits - core specific bits that are set only during reset sequence ++ */ ++void ++ai_core_reset(si_t *sih, uint32 bits, uint32 resetbits) ++{ ++ si_info_t *sii; ++ aidmp_t *ai; ++ volatile uint32 dummy; ++ ++ sii = SI_INFO(sih); ++ ASSERT(GOODREGS(sii->curwrap)); ++ ai = sii->curwrap; ++ ++ /* ++ * Must do the disable sequence first to work for arbitrary current core state. ++ */ ++ ai_core_disable(sih, (bits | resetbits)); ++ ++ /* ++ * Now do the initialization sequence. ++ */ ++ W_REG(sii->osh, &ai->ioctrl, (bits | SICF_FGC | SICF_CLOCK_EN)); ++ dummy = R_REG(sii->osh, &ai->ioctrl); ++ BCM_REFERENCE(dummy); ++ ++ W_REG(sii->osh, &ai->resetctrl, 0); ++ dummy = R_REG(sii->osh, &ai->resetctrl); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++ ++ W_REG(sii->osh, &ai->ioctrl, (bits | SICF_CLOCK_EN)); ++ dummy = R_REG(sii->osh, &ai->ioctrl); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++} ++ ++void ++ai_core_cflags_wo(si_t *sih, uint32 mask, uint32 val) ++{ ++ si_info_t *sii; ++ aidmp_t *ai; ++ uint32 w; ++ ++ sii = SI_INFO(sih); ++ ++ if (BCM47162_DMP()) { ++ AP6210_ERR("%s: Accessing MIPS DMP register (ioctrl) on 47162a0", ++ __FUNCTION__); ++ return; ++ } ++ if (BCM5357_DMP()) { ++ AP6210_ERR("%s: Accessing USB20H DMP register (ioctrl) on 5357\n", ++ __FUNCTION__); ++ return; ++ } ++ ++ ASSERT(GOODREGS(sii->curwrap)); ++ ai = sii->curwrap; ++ ++ ASSERT((val & ~mask) == 0); ++ ++ if (mask || val) { ++ w = ((R_REG(sii->osh, &ai->ioctrl) & ~mask) | val); ++ W_REG(sii->osh, &ai->ioctrl, w); ++ } ++} ++ ++uint32 ++ai_core_cflags(si_t *sih, uint32 mask, uint32 val) ++{ ++ si_info_t *sii; ++ aidmp_t *ai; ++ uint32 w; ++ ++ sii = SI_INFO(sih); ++ if (BCM47162_DMP()) { ++ AP6210_ERR("%s: Accessing MIPS DMP register (ioctrl) on 47162a0", ++ __FUNCTION__); ++ return 0; ++ } ++ if (BCM5357_DMP()) { ++ AP6210_ERR("%s: Accessing USB20H DMP register (ioctrl) on 5357\n", ++ __FUNCTION__); ++ return 0; ++ } ++ ++ ASSERT(GOODREGS(sii->curwrap)); ++ ai = sii->curwrap; ++ ++ ASSERT((val & ~mask) == 0); ++ ++ if (mask || val) { ++ w = ((R_REG(sii->osh, &ai->ioctrl) & ~mask) | val); ++ W_REG(sii->osh, &ai->ioctrl, w); ++ } ++ ++ return R_REG(sii->osh, &ai->ioctrl); ++} ++ ++uint32 ++ai_core_sflags(si_t *sih, uint32 mask, uint32 val) ++{ ++ si_info_t *sii; ++ aidmp_t *ai; ++ uint32 w; ++ ++ sii = SI_INFO(sih); ++ if (BCM47162_DMP()) { ++ AP6210_ERR("%s: Accessing MIPS DMP register (iostatus) on 47162a0", ++ __FUNCTION__); ++ return 0; ++ } ++ if (BCM5357_DMP()) { ++ AP6210_ERR("%s: Accessing USB20H DMP register (iostatus) on 5357\n", ++ __FUNCTION__); ++ return 0; ++ } ++ ++ ASSERT(GOODREGS(sii->curwrap)); ++ ai = sii->curwrap; ++ ++ ASSERT((val & ~mask) == 0); ++ ASSERT((mask & ~SISF_CORE_BITS) == 0); ++ ++ if (mask || val) { ++ w = ((R_REG(sii->osh, &ai->iostatus) & ~mask) | val); ++ W_REG(sii->osh, &ai->iostatus, w); ++ } ++ ++ return R_REG(sii->osh, &ai->iostatus); ++} +diff --git a/drivers/net/wireless/ap6210/ap6210.h b/drivers/net/wireless/ap6210/ap6210.h +new file mode 100644 +index 0000000..90e7d8d +--- /dev/null ++++ b/drivers/net/wireless/ap6210/ap6210.h +@@ -0,0 +1,22 @@ ++#ifndef __AP6210_H__ ++#define __AP6210_H__ ++ ++#define AP6210_EMERG(...) pr_emerg("[ap6210] "__VA_ARGS__) ++#define AP6210_ALERT(...) pr_alert("[ap6210] "__VA_ARGS__) ++#define AP6210_CRIT(...) pr_crit("[ap6210] "__VA_ARGS__) ++#define AP6210_ERR(...) pr_err("[ap6210] "__VA_ARGS__) ++#define AP6210_WARN(...) pr_warn("[ap6210] "__VA_ARGS__) ++#define AP6210_NOTICE(...) pr_notice("[ap6210] "__VA_ARGS__) ++#define AP6210_INFO(...) pr_info("[ap6210] "__VA_ARGS__) ++#define AP6210_DEBUG(...) pr_debug("[ap6210] "__VA_ARGS__) ++#define AP6210_DUMP(...) pr_debug(__VA_ARGS__) ++#define AP6210_CONT(...) pr_cont(__VA_ARGS__) ++ ++extern int __init sw_rfkill_init(void); ++extern void __exit sw_rfkill_exit(void); ++ ++extern int __init ap6210_gpio_wifi_init(void); ++extern void __exit ap6210_gpio_wifi_exit(void); ++ ++ ++#endif /* __AP6210_H__ */ +diff --git a/drivers/net/wireless/ap6210/ap6210_gpio.h b/drivers/net/wireless/ap6210/ap6210_gpio.h +new file mode 100644 +index 0000000..96a3166 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/ap6210_gpio.h +@@ -0,0 +1,9 @@ ++#ifndef __AP6210_GPIO_H__ ++#define __AP6210_GPIO_H__ ++ ++extern int ap6210_gpio_wifi_get_mod_type(void); ++extern int ap6210_gpio_wifi_gpio_ctrl(char* name, int level); ++extern void ap6210_gpio_wifi_power(int on); ++extern char *ap6210_gpio_wifi_get_name(int module_sel); ++ ++#endif /* __AP6210_GPIO_H__ */ +diff --git a/drivers/net/wireless/ap6210/ap6210_gpio_bt.c b/drivers/net/wireless/ap6210/ap6210_gpio_bt.c +new file mode 100644 +index 0000000..4686615 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/ap6210_gpio_bt.c +@@ -0,0 +1,164 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if (defined CONFIG_MMC) ++#include "ap6210_gpio.h" ++#else ++static __inline int ap6210_gpio_wifi_get_mod_type(void) ++{ ++ AP6210_DEBUG("%s : not implemented!\n", __FUNCTION__ ); ++ return 0; ++} ++static __inline int ap6210_gpio_wifi_gpio_ctrl(char* name, int level) ++{ ++ AP6210_DEBUG("%s : not implemented!\n", __FUNCTION__ ); ++ return -1; ++} ++#endif ++ ++#include ++ ++static const char bt_name[] = "bcm40183"; ++static struct rfkill *sw_rfkill; ++static int bt_used; ++ ++static int rfkill_set_power(void *data, bool blocked) ++{ ++ unsigned int mod_sel = ap6210_gpio_wifi_get_mod_type(); ++ ++ AP6210_DEBUG("rfkill set power %s\n", ( blocked ? "blocked" : "unblocked" )); ++ ++ switch (mod_sel) ++ { ++ case 2: /* bcm40183 */ ++ if (!blocked) { ++ ap6210_gpio_wifi_gpio_ctrl("bcm40183_bt_regon", 1); ++ ap6210_gpio_wifi_gpio_ctrl("bcm40183_bt_rst", 1); ++ } else { ++ ap6210_gpio_wifi_gpio_ctrl("bcm40183_bt_rst", 0); ++ ap6210_gpio_wifi_gpio_ctrl("bcm40183_bt_regon", 0); ++ } ++ AP6210_ERR("Using %s configuration.\n", ap6210_gpio_wifi_get_name(mod_sel) ); ++ break; ++ case 3: /* realtek rtl8723as */ ++ if (!blocked) { ++ ap6210_gpio_wifi_gpio_ctrl("rtk_rtl8723as_bt_dis", 1); ++ } else { ++ ap6210_gpio_wifi_gpio_ctrl("rtk_rtl8723as_bt_dis", 0); ++ } ++ AP6210_ERR("Using %s configuration.\n", ap6210_gpio_wifi_get_name(mod_sel) ); ++ break; ++ case 7: /* ap6210 */ ++ case 8: /* ap6330 */ ++ if (!blocked) { ++ ap6210_gpio_wifi_gpio_ctrl("ap6xxx_bt_regon", 1); ++ } else { ++ ap6210_gpio_wifi_gpio_ctrl("ap6xxx_bt_regon", 0); ++ } ++ AP6210_ERR("Using %s configuration.\n", ap6210_gpio_wifi_get_name(mod_sel) ); ++ break; ++ case 10: /* realtek rtl8723au */ ++ if (!blocked) { ++ ap6210_gpio_wifi_gpio_ctrl("rtl8723au_bt", 1); ++ } else { ++ ap6210_gpio_wifi_gpio_ctrl("rtl8723au_bt", 0); ++ } ++ AP6210_ERR("Using %s configuration.\n", ap6210_gpio_wifi_get_name(mod_sel) ); ++ break; ++ default: ++ AP6210_ERR("no bluetooth module matched.\n" ); ++ } ++ ++ msleep(10); ++ return 0; ++} ++ ++static struct rfkill_ops sw_rfkill_ops = { ++ .set_block = rfkill_set_power, ++}; ++ ++static int sw_rfkill_probe(struct platform_device *pdev) ++{ ++ int ret = 0; ++ ++ sw_rfkill = rfkill_alloc(bt_name, &pdev->dev, ++ RFKILL_TYPE_BLUETOOTH, &sw_rfkill_ops, NULL); ++ if (unlikely(!sw_rfkill)) { ++ AP6210_DEBUG("Unable to alocate rfkill structure.\n" ); ++ return -ENOMEM; ++ } ++ ++ ret = rfkill_register(sw_rfkill); ++ if (unlikely(ret)) { ++ AP6210_DEBUG("Unable to register rfkill structure.\n" ); ++ rfkill_destroy(sw_rfkill); ++ } ++ AP6210_DEBUG("rfkill structure registered successfully.\n" ); ++ return ret; ++} ++ ++static int sw_rfkill_remove(struct platform_device *pdev) ++{ ++ if (likely(sw_rfkill)) { ++ rfkill_unregister(sw_rfkill); ++ rfkill_destroy(sw_rfkill); ++ AP6210_DEBUG("rfkill structure removed successfully.\n" ); ++ } ++ ++ return 0; ++} ++ ++static struct platform_driver sw_rfkill_driver = { ++ .probe = sw_rfkill_probe, ++ .remove = sw_rfkill_remove, ++ .driver = { ++ .name = "sunxi-rfkill", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static struct platform_device sw_rfkill_dev = { ++ .name = "sunxi-rfkill", ++}; ++ ++int __init sw_rfkill_init(void) ++{ ++ if (SCRIPT_PARSER_OK != script_parser_fetch("bt_para", "bt_used", &bt_used, 1)) { ++ AP6210_DEBUG("parse bt_used failed in script.fex.\n" ); ++ return -1; ++ } ++ ++ if (!bt_used) { ++ AP6210_ERR("bluetooth is disable in script.fex.\n" ); ++ return 0; ++ } ++ ++ platform_device_register(&sw_rfkill_dev); ++ AP6210_ERR("platform device registered successfully.\n" ); ++ return platform_driver_register(&sw_rfkill_driver); ++} ++ ++void __exit sw_rfkill_exit(void) ++{ ++ if (!bt_used) { ++ AP6210_ERR("exit no bt used in configuration\n" ); ++ return ; ++ } ++ ++ platform_device_unregister(&sw_rfkill_dev); ++ platform_driver_unregister(&sw_rfkill_driver); ++} ++ ++/* ++module_init(sw_rfkill_init); ++module_exit(sw_rfkill_exit); ++ ++MODULE_DESCRIPTION("sunxi-rfkill driver"); ++MODULE_AUTHOR("Aaron.magic"); ++MODULE_LICENSE("GPL"); ++*/ ++ +diff --git a/drivers/net/wireless/ap6210/ap6210_gpio_wifi.c b/drivers/net/wireless/ap6210/ap6210_gpio_wifi.c +new file mode 100644 +index 0000000..13e0bdf +--- /dev/null ++++ b/drivers/net/wireless/ap6210/ap6210_gpio_wifi.c +@@ -0,0 +1,433 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static char* wifi_para = "wifi_para"; ++ ++struct ap6210_gpio_wifi_ops { ++ char* mod_name; ++ int wifi_used; ++ int sdio_id; ++ int usb_id; ++ int module_sel; ++ int (*gpio_ctrl)(char* name, int level); ++ void (*standby)(int in); ++ void (*power)(int mode, int *updown); ++ ++#ifdef CONFIG_PROC_FS ++ struct proc_dir_entry *proc_root; ++ struct proc_dir_entry *proc_power; ++#endif /* CONFIG_PROC_FS */ ++}; ++ ++static int ap6210_wl_regon = 0; ++static int ap6210_bt_regon = 0; ++ ++struct ap6210_gpio_wifi_ops ap6210_wifi_select_pm_ops; ++ ++char *ap6210_gpio_wifi_get_name(int module_sel) { ++ char* mod_name[] = { " ", ++ "bcm40181", /* 1 - BCM40181(BCM4330)*/ ++ "bcm40183", /* 2 - BCM40183(BCM4330)*/ ++ "rtl8723as", /* 3 - RTL8723AS(RF-SM02B) */ ++ "rtl8189es", /* 4 - RTL8189ES(SM89E00) */ ++ "rtl8192cu", /* 5 - RTL8192CU*/ ++ "rtl8188eu", /* 6 - RTL8188EU*/ ++ "ap6210", /* 7 - AP6210*/ ++ "ap6330", /* 8 - AP6330*/ ++ "ap6181", /* 9 - AP6181*/ ++ "rtl8723au", /* 10 - RTL8723AU */ ++ }; ++ ++ return(mod_name[module_sel]); ++} ++ ++EXPORT_SYMBOL(ap6210_gpio_wifi_get_name); ++ ++static int ap6210_gpio_ctrl(char* name, int level) ++{ ++ int i = 0; ++ int ret = 0; ++ int gpio = 0; ++ char * gpio_name[2] = {"ap6210_wl_regon", "ap6210_bt_regon"}; ++ ++ for (i = 0; i < 2; i++) { ++ if (strcmp(name, gpio_name[i]) == 0) { ++ switch (i) ++ { ++ case 0: /*ap6210_wl_regon*/ ++ gpio = ap6210_wl_regon; ++ break; ++ case 1: /*ap6210_bt_regon*/ ++ gpio = ap6210_bt_regon; ++ break; ++ default: ++ AP6210_ERR("no matched gpio.\n" ); ++ } ++ break; ++ } ++ } ++ ++ ret = gpio_write_one_pin_value(gpio, level, name); ++ ++ return 0; ++} ++ ++static int ap6210_gpio_read(char* name) ++{ ++ int i = 0; ++ int gpio = 0; ++ int val = 0; ++ char * gpio_name[2] = {"ap6210_wl_regon", "ap6210_bt_regon"}; ++ ++ for (i = 0; i < 2; i++) { ++ if (strcmp(name, gpio_name[i]) == 0) { ++ switch (i) ++ { ++ case 0: /*ap6210_wl_regon*/ ++ gpio = ap6210_wl_regon; ++ break; ++ case 1: /*ap6210_bt_regon*/ ++ gpio = ap6210_bt_regon; ++ break; ++ default: ++ AP6210_ERR("no matched gpio.\n" ); ++ } ++ break; ++ } ++ } ++ ++ val = gpio_read_one_pin_value(gpio, name); ++ ++ return val; ++} ++ ++ ++void ap6210_power(int mode, int *updown) ++{ ++ if (mode) { ++ if (*updown) { ++ ap6210_gpio_ctrl("ap6210_wl_regon", 1); ++ mdelay(100); ++ } else { ++ ap6210_gpio_ctrl("ap6210_wl_regon", 0); ++ mdelay(100); ++ } ++ AP6210_DEBUG("sdio wifi power state: %s\n", *updown ? "on" : "off"); ++ } else { ++ *updown = ap6210_gpio_read("ap6210_wl_regon"); ++ } ++ ++ return; ++} ++ ++static void ap6210_cfg_gpio_32k_clkout(int gpio_index) ++{ ++ int ret; ++ struct clk *clk_32k, *parent; ++ ++ parent = clk_get(NULL, CLK_SYS_LOSC); ++ clk_32k = clk_get(NULL, CLK_MOD_OUTA); ++ ret = clk_set_parent(clk_32k, parent); ++ ++ if(ret){ ++ AP6210_ERR("32k clk_set_parent fail.\n" ); ++ return; ++ } ++ ++ ret = clk_set_rate(clk_32k, 32768); ++ if(ret){ ++ AP6210_ERR("32k clk_set_rate fail.\n" ); ++ return; ++ } ++ ++ clk_enable(clk_32k); ++} ++void ap6210_gpio_init(void) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ int ap6210_lpo = 0; ++ ++/* CT expected ap6210_lpo as a GPIO */ ++ ap6210_lpo = gpio_request_ex(wifi_para, "ap6xxx_lpo"); ++ if (!ap6210_lpo) { ++ AP6210_ERR("request lpo gpio failed.\n" ); ++ return; ++ } ++ ++ if(ap6210_lpo) { ++ AP6210_DEBUG("config 32k clock.\n" ); ++ ap6210_cfg_gpio_32k_clkout(ap6210_lpo); ++ } ++ ++ ap6210_wl_regon = gpio_request_ex(wifi_para, "ap6xxx_wl_regon"); ++ if (!ap6210_wl_regon) { ++ AP6210_ERR("request wl_regon gpio failed.\n" ); ++ return; ++ } ++ ++ ap6210_bt_regon = gpio_request_ex(wifi_para, "ap6xxx_bt_regon"); ++ if (!ap6210_bt_regon) { ++ AP6210_ERR("request ap6210_bt_regon gpio failed.\n" ); ++ return; ++ } ++ ++ ops->gpio_ctrl = ap6210_gpio_ctrl; ++ ops->power = ap6210_power; ++} ++ ++int ap6210_gpio_wifi_get_mod_type(void) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ if (ops->wifi_used) ++ return ops->module_sel; ++ else { ++ AP6210_ERR("No wifi type selected, please check your config.\n" ); ++ return 0; ++ } ++} ++EXPORT_SYMBOL(ap6210_gpio_wifi_get_mod_type); ++ ++int ap6210_gpio_wifi_gpio_ctrl(char* name, int level) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ if (ops->wifi_used && ops->gpio_ctrl) ++ return ops->gpio_ctrl(name, level); ++ else { ++ AP6210_ERR("No wifi type selected, please check your config.\n" ); ++ return -1; ++ } ++} ++EXPORT_SYMBOL(ap6210_gpio_wifi_gpio_ctrl); ++ ++void ap6210_gpio_wifi_power(int on) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ int power = on; ++ ++ if (ops->wifi_used && ops->power) ++ return ops->power(1, &power); ++ else { ++ AP6210_ERR("No wifi type selected, please check your config.\n" ); ++ return; ++ } ++} ++EXPORT_SYMBOL(ap6210_gpio_wifi_power); ++ ++#ifdef CONFIG_PROC_FS ++static int ap6210_gpio_wifi_power_stat(char *page, char **start, off_t off, int count, int *eof, void *data) ++{ ++ struct ap6210_gpio_wifi_ops *ops = (struct ap6210_gpio_wifi_ops *)data; ++ char *p = page; ++ int power = 0; ++ ++ if (ops->power) ++ ops->power(0, &power); ++ ++ p += sprintf(p, "%s : power state %s\n", ops->mod_name, power ? "on" : "off"); ++ return p - page; ++} ++ ++static int ap6210_gpio_wifi_power_ctrl(struct file *file, const char __user *buffer, unsigned long count, void *data) ++{ ++ struct ap6210_gpio_wifi_ops *ops = (struct ap6210_gpio_wifi_ops *)data; ++ int power = simple_strtoul(buffer, NULL, 10); ++ ++ power = power ? 1 : 0; ++ if (ops->power) ++ ops->power(1, &power); ++ else ++ AP6210_ERR("No power control for %s\n", ops->mod_name); ++ return sizeof(power); ++} ++ ++static inline void awwifi_procfs_attach(void) ++{ ++ char proc_rootname[] = "driver/ap6210_gpio_wifi"; ++ char proc_powername[] = "power"; ++ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ ++ ops->proc_root = proc_mkdir(proc_rootname, NULL); ++ if (IS_ERR(ops->proc_root)) ++ { ++ AP6210_ERR("failed to create procfs \"%s\".\n", proc_rootname ); ++ } ++ ++ ops->proc_power = create_proc_entry(proc_powername, 0644, ops->proc_root); ++ if (IS_ERR(ops->proc_power)) ++ { ++ AP6210_ERR("failed to create procfs \"%s\".\n", proc_powername); ++ } ++ ops->proc_power->data = ops; ++ ops->proc_power->read_proc = ap6210_gpio_wifi_power_stat; ++ ops->proc_power->write_proc = ap6210_gpio_wifi_power_ctrl; ++} ++ ++static inline void awwifi_procfs_remove(void) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ char proc_rootname[] = "driver/ap6210_gpio_wifi"; ++ ++ remove_proc_entry("power", ops->proc_root); ++ remove_proc_entry(proc_rootname, NULL); ++} ++#else ++static inline void awwifi_procfs_attach(void) {} ++static inline void awwifi_procfs_remove(void) {} ++#endif ++ ++ ++ ++static int ap6210_gpio_wifi_get_res(void) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ ++ if (SCRIPT_PARSER_OK != script_parser_fetch(wifi_para, "wifi_used", &ops->wifi_used, 1)) { ++ AP6210_ERR("parse wifi_used failed in script.fex.\n" ); ++ return -1; ++ } ++ if (!ops->wifi_used) { ++ AP6210_ERR("wifi pm disable in script.fex.\n" ); ++ return -1; ++ } ++ ++ if (SCRIPT_PARSER_OK != script_parser_fetch(wifi_para, "wifi_sdc_id", &ops->sdio_id, 1)) { ++ AP6210_ERR("parse wifi_sdc_id in script.fex failed.\n" ); ++ return -1; ++ } ++ ++ if (SCRIPT_PARSER_OK != script_parser_fetch(wifi_para, "wifi_usbc_id", &ops->usb_id, 1)) { ++ AP6210_ERR("parse wifi_sdc_id in script.fex failed.\n" ); ++ return -1; ++ } ++ ++ if (SCRIPT_PARSER_OK != script_parser_fetch(wifi_para, "wifi_mod_sel", &ops->module_sel, 1)) { ++ AP6210_ERR("parse wifi_sdc_id in script.fex failed.\n" ); ++ return -1; ++ } ++ ++ ops->mod_name = ap6210_gpio_wifi_get_name(ops->module_sel); ++ ++ AP6210_ERR("select wifi %s\n", ops->mod_name); ++ ++ return 0; ++} ++ ++static int __devinit ap6210_gpio_wifi_probe(struct platform_device *pdev) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ ++ switch (ops->module_sel) { ++ case 1: /* BCM40181 */ ++ case 2: /* BCM40183 */ ++ case 3: /* RTL8723AS */ ++ case 4: /* RTL8189ES */ ++ case 5: /* RTL8192CU */ ++ case 6: /* RTL8188EU */ ++ AP6210_ERR("Unsupported device.\n"); ++ break; ++ case 7: /* AP6210 */ ++ case 8: /* AP6330 */ ++ case 9: /* AP6181 */ ++ AP6210_ERR("Initializing %s.\n", ops->mod_name); ++ ap6210_gpio_init(); ++ break; ++ case 10: /* RTL8723AU */ ++ AP6210_ERR("Unsupported device.\n"); ++ break; ++ default: ++ AP6210_ERR("Unsupported device.\n"); ++ } ++ ++ awwifi_procfs_attach(); ++ AP6210_DEBUG("wifi gpio attached.\n" ); ++ return 0; ++} ++ ++static int __devexit ap6210_gpio_wifi_remove(struct platform_device *pdev) ++{ ++ awwifi_procfs_remove(); ++ AP6210_DEBUG("wifi gpio released.\n" ); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int ap6210_gpio_wifi_suspend(struct device *dev) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ ++ if (ops->standby) ++ ops->standby(1); ++ return 0; ++} ++ ++static int ap6210_gpio_wifi_resume(struct device *dev) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ ++ if (ops->standby) ++ ops->standby(0); ++ return 0; ++} ++ ++static struct dev_pm_ops wifi_dev_pm_ops = { ++ .suspend = ap6210_gpio_wifi_suspend, ++ .resume = ap6210_gpio_wifi_resume, ++}; ++#endif ++ ++static struct platform_device ap6210_gpio_wifi_dev = { ++ .name = "ap6210_gpio_wifi", ++}; ++ ++static struct platform_driver ap6210_gpio_wifi_driver = { ++ .driver.name = "ap6210_gpio_wifi", ++ .driver.owner = THIS_MODULE, ++#ifdef CONFIG_PM ++ .driver.pm = &wifi_dev_pm_ops, ++#endif ++ .probe = ap6210_gpio_wifi_probe, ++ .remove = __devexit_p(ap6210_gpio_wifi_remove), ++}; ++ ++int __init ap6210_gpio_wifi_init(void) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ ++ memset(ops, 0, sizeof(struct ap6210_gpio_wifi_ops)); ++ ap6210_gpio_wifi_get_res(); ++ if (!ops->wifi_used) ++ return 0; ++ ++ platform_device_register(&ap6210_gpio_wifi_dev); ++ return platform_driver_register(&ap6210_gpio_wifi_driver); ++} ++ ++void __exit ap6210_gpio_wifi_exit(void) ++{ ++ struct ap6210_gpio_wifi_ops *ops = &ap6210_wifi_select_pm_ops; ++ if (!ops->wifi_used) ++ return; ++ ++ platform_driver_unregister(&ap6210_gpio_wifi_driver); ++ memset(ops, 0, sizeof(struct ap6210_gpio_wifi_ops)); ++} ++ ++/* ++module_init(ap6210_gpio_wifi_init); ++module_exit(ap6210_gpio_wifi_exit); ++ ++MODULE_LICENSE("GPL"); ++*/ +\ No newline at end of file +diff --git a/drivers/net/wireless/ap6210/bcmevent.c b/drivers/net/wireless/ap6210/bcmevent.c +new file mode 100644 +index 0000000..16e2fca +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmevent.c +@@ -0,0 +1,152 @@ ++/* ++ * bcmevent read-only data shared by kernel or app layers ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: bcmevent.c 370587 2012-11-22 09:32:38Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if WLC_E_LAST != 107 ++#error "You need to add an entry to bcmevent_names[] for the new event" ++#endif ++ ++const bcmevent_name_t bcmevent_names[] = { ++ { WLC_E_SET_SSID, "SET_SSID" }, ++ { WLC_E_JOIN, "JOIN" }, ++ { WLC_E_START, "START" }, ++ { WLC_E_AUTH, "AUTH" }, ++ { WLC_E_AUTH_IND, "AUTH_IND" }, ++ { WLC_E_DEAUTH, "DEAUTH" }, ++ { WLC_E_DEAUTH_IND, "DEAUTH_IND" }, ++ { WLC_E_ASSOC, "ASSOC" }, ++ { WLC_E_ASSOC_IND, "ASSOC_IND" }, ++ { WLC_E_REASSOC, "REASSOC" }, ++ { WLC_E_REASSOC_IND, "REASSOC_IND" }, ++ { WLC_E_DISASSOC, "DISASSOC" }, ++ { WLC_E_DISASSOC_IND, "DISASSOC_IND" }, ++ { WLC_E_QUIET_START, "START_QUIET" }, ++ { WLC_E_QUIET_END, "END_QUIET" }, ++ { WLC_E_BEACON_RX, "BEACON_RX" }, ++ { WLC_E_LINK, "LINK" }, ++ { WLC_E_MIC_ERROR, "MIC_ERROR" }, ++ { WLC_E_NDIS_LINK, "NDIS_LINK" }, ++ { WLC_E_ROAM, "ROAM" }, ++ { WLC_E_TXFAIL, "TXFAIL" }, ++ { WLC_E_PMKID_CACHE, "PMKID_CACHE" }, ++ { WLC_E_RETROGRADE_TSF, "RETROGRADE_TSF" }, ++ { WLC_E_PRUNE, "PRUNE" }, ++ { WLC_E_AUTOAUTH, "AUTOAUTH" }, ++ { WLC_E_EAPOL_MSG, "EAPOL_MSG" }, ++ { WLC_E_SCAN_COMPLETE, "SCAN_COMPLETE" }, ++ { WLC_E_ADDTS_IND, "ADDTS_IND" }, ++ { WLC_E_DELTS_IND, "DELTS_IND" }, ++ { WLC_E_BCNSENT_IND, "BCNSENT_IND" }, ++ { WLC_E_BCNRX_MSG, "BCNRX_MSG" }, ++ { WLC_E_BCNLOST_MSG, "BCNLOST_IND" }, ++ { WLC_E_ROAM_PREP, "ROAM_PREP" }, ++ { WLC_E_PFN_NET_FOUND, "PFNFOUND_IND" }, ++ { WLC_E_PFN_NET_LOST, "PFNLOST_IND" }, ++#if defined(IBSS_PEER_DISCOVERY_EVENT) ++ { WLC_E_IBSS_ASSOC, "IBSS_ASSOC" }, ++#endif /* defined(IBSS_PEER_DISCOVERY_EVENT) */ ++ { WLC_E_RADIO, "RADIO" }, ++ { WLC_E_PSM_WATCHDOG, "PSM_WATCHDOG" }, ++ { WLC_E_PROBREQ_MSG, "PROBE_REQ_MSG" }, ++ { WLC_E_SCAN_CONFIRM_IND, "SCAN_CONFIRM_IND" }, ++ { WLC_E_PSK_SUP, "PSK_SUP" }, ++ { WLC_E_COUNTRY_CODE_CHANGED, "CNTRYCODE_IND" }, ++ { WLC_E_EXCEEDED_MEDIUM_TIME, "EXCEEDED_MEDIUM_TIME" }, ++ { WLC_E_ICV_ERROR, "ICV_ERROR" }, ++ { WLC_E_UNICAST_DECODE_ERROR, "UNICAST_DECODE_ERROR" }, ++ { WLC_E_MULTICAST_DECODE_ERROR, "MULTICAST_DECODE_ERROR" }, ++ { WLC_E_TRACE, "TRACE" }, ++#ifdef WLBTAMP ++ { WLC_E_BTA_HCI_EVENT, "BTA_HCI_EVENT" }, ++#endif ++ { WLC_E_IF, "IF" }, ++#ifdef WLP2P ++ { WLC_E_P2P_DISC_LISTEN_COMPLETE, "WLC_E_P2P_DISC_LISTEN_COMPLETE" }, ++#endif ++ { WLC_E_RSSI, "RSSI" }, ++ { WLC_E_PFN_SCAN_COMPLETE, "SCAN_COMPLETE" }, ++ { WLC_E_EXTLOG_MSG, "EXTERNAL LOG MESSAGE" }, ++#ifdef WIFI_ACT_FRAME ++ { WLC_E_ACTION_FRAME, "ACTION_FRAME" }, ++ { WLC_E_ACTION_FRAME_RX, "ACTION_FRAME_RX" }, ++ { WLC_E_ACTION_FRAME_COMPLETE, "ACTION_FRAME_COMPLETE" }, ++#endif ++#ifdef BCMWAPI_WAI ++ { WLC_E_WAI_STA_EVENT, "WAI_STA_EVENT" }, ++ { WLC_E_WAI_MSG, "WAI_MSG" }, ++#endif /* BCMWAPI_WAI */ ++#if 0 && (NDISVER >= 0x0620) ++ { WLC_E_PRE_ASSOC_IND, "ASSOC_RECV" }, ++ { WLC_E_PRE_REASSOC_IND, "REASSOC_RECV" }, ++ { WLC_E_CHANNEL_ADOPTED, "CHANNEL_ADOPTED" }, ++ { WLC_E_AP_STARTED, "AP_STARTED" }, ++ { WLC_E_DFS_AP_STOP, "DFS_AP_STOP" }, ++ { WLC_E_DFS_AP_RESUME, "DFS_AP_RESUME" }, ++ { WLC_E_ASSOC_IND_NDIS, "ASSOC_IND_NDIS"}, ++ { WLC_E_REASSOC_IND_NDIS, "REASSOC_IND_NDIS"}, ++ { WLC_E_ACTION_FRAME_RX_NDIS, "WLC_E_ACTION_FRAME_RX_NDIS" }, ++ { WLC_E_AUTH_REQ, "WLC_E_AUTH_REQ" }, ++#endif ++ { WLC_E_ESCAN_RESULT, "WLC_E_ESCAN_RESULT" }, ++ { WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE, "WLC_E_AF_OFF_CHAN_COMPLETE" }, ++#ifdef WLP2P ++ { WLC_E_PROBRESP_MSG, "PROBE_RESP_MSG" }, ++ { WLC_E_P2P_PROBREQ_MSG, "P2P PROBE_REQ_MSG" }, ++#endif ++#ifdef PROP_TXSTATUS ++ { WLC_E_FIFO_CREDIT_MAP, "FIFO_CREDIT_MAP" }, ++#endif ++ { WLC_E_WAKE_EVENT, "WAKE_EVENT" }, ++ { WLC_E_DCS_REQUEST, "DCS_REQUEST" }, ++ { WLC_E_RM_COMPLETE, "RM_COMPLETE" }, ++#ifdef WLMEDIA_HTSF ++ { WLC_E_HTSFSYNC, "HTSF_SYNC_EVENT" }, ++#endif ++ { WLC_E_OVERLAY_REQ, "OVERLAY_REQ_EVENT" }, ++ { WLC_E_CSA_COMPLETE_IND, "WLC_E_CSA_COMPLETE_IND"}, ++ { WLC_E_EXCESS_PM_WAKE_EVENT, "EXCESS_PM_WAKE_EVENT" }, ++ { WLC_E_PFN_SCAN_NONE, "PFN_SCAN_NONE" }, ++ { WLC_E_PFN_SCAN_ALLGONE, "PFN_SCAN_ALLGONE" }, ++#ifdef SOFTAP ++ { WLC_E_GTK_PLUMBED, "GTK_PLUMBED" }, ++#endif ++ { WLC_E_ASSOC_REQ_IE, "ASSOC_REQ_IE" }, ++ { WLC_E_ASSOC_RESP_IE, "ASSOC_RESP_IE" }, ++ { WLC_E_ACTION_FRAME_RX_NDIS, "WLC_E_ACTION_FRAME_RX_NDIS" }, ++#ifdef WLTDLS ++ { WLC_E_TDLS_PEER_EVENT, "TDLS_PEER_EVENT" }, ++#endif /* WLTDLS */ ++ { WLC_E_SERVICE_FOUND, "SERVICE_FOUND" }, ++ { WLC_E_P2PO_ADD_DEVICE, "P2PO_DEV_FOUND" }, ++ { WLC_E_P2PO_DEL_DEVICE, "P2PO_DEV_LOST" }, ++}; ++ ++const int bcmevent_names_size = ARRAYSIZE(bcmevent_names); +diff --git a/drivers/net/wireless/ap6210/bcmsdh.c b/drivers/net/wireless/ap6210/bcmsdh.c +new file mode 100644 +index 0000000..ca59ff8 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmsdh.c +@@ -0,0 +1,778 @@ ++/* ++ * BCMSDH interface glue ++ * implement bcmsdh API for SDIOH driver ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdh.c 373330 2012-12-07 04:46:17Z $ ++ */ ++ ++/** ++ * @file bcmsdh.c ++ */ ++ ++/* ****************** BCMSDH Interface Functions *************************** */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include /* BRCM API for SDIO clients (such as wl, dhd) */ ++#include /* common SDIO/controller interface */ ++#include /* SDIO device core hardware definitions. */ ++ ++#include /* SDIO Device and Protocol Specs */ ++ ++#include ++ ++#define SDIOH_API_ACCESS_RETRY_LIMIT 2 ++const uint bcmsdh_msglevel = BCMSDH_ERROR_VAL; ++ ++/** ++ * BCMSDH API context ++ */ ++struct bcmsdh_info ++{ ++ bool init_success; /* underlying driver successfully attached */ ++ void *sdioh; /* handler for sdioh */ ++ uint32 vendevid; /* Target Vendor and Device ID on SD bus */ ++ osl_t *osh; ++ bool regfail; /* Save status of last reg_read/reg_write call */ ++ uint32 sbwad; /* Save backplane window address */ ++}; ++/* local copy of bcm sd handler */ ++bcmsdh_info_t * l_bcmsdh = NULL; ++ ++#if defined(OOB_INTR_ONLY) && defined(HW_OOB) ++extern int ++sdioh_enable_hw_oob_intr(void *sdioh, bool enable); ++ ++void ++bcmsdh_enable_hw_oob_intr(bcmsdh_info_t *sdh, bool enable) ++{ ++ sdioh_enable_hw_oob_intr(sdh->sdioh, enable); ++} ++#endif ++ ++#if defined(HW_OOB) ++#include ++void ++bcmsdh_config_hw_oob_intr(bcmsdh_info_t *sdh, uint chip) ++{ ++ uint32 gpiocontrol, addr; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ if (CHIPID(chip) == BCM43362_CHIP_ID) { ++ addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, gpiocontrol); ++ gpiocontrol = bcmsdh_reg_read(sdh, addr, 4); ++ gpiocontrol |= 0x2; ++ bcmsdh_reg_write(sdh, addr, 4, gpiocontrol); ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, 0x10005, 0xf, NULL); ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, 0x10006, 0x0, NULL); ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, 0x10007, 0x2, NULL); ++ } ++} ++#endif ++ ++/* Attach BCMSDH layer to SDIO Host Controller Driver ++ * ++ * @param osh OSL Handle. ++ * @param cfghdl Configuration Handle. ++ * @param regsva Virtual address of controller registers. ++ * @param irq Interrupt number of SDIO controller. ++ * ++ * @return bcmsdh_info_t Handle to BCMSDH context. ++ */ ++bcmsdh_info_t * ++bcmsdh_attach(osl_t *osh, void *cfghdl, void **regsva, uint irq) ++{ ++ bcmsdh_info_t *bcmsdh; ++ ++ if ((bcmsdh = (bcmsdh_info_t *)MALLOC(osh, sizeof(bcmsdh_info_t))) == NULL) { ++ BCMSDH_ERROR(("bcmsdh_attach: out of memory, malloced %d bytes\n", MALLOCED(osh))); ++ return NULL; ++ } ++ bzero((char *)bcmsdh, sizeof(bcmsdh_info_t)); ++ ++ /* save the handler locally */ ++ l_bcmsdh = bcmsdh; ++ ++ if (!(bcmsdh->sdioh = sdioh_attach(osh, cfghdl, irq))) { ++ bcmsdh_detach(osh, bcmsdh); ++ return NULL; ++ } ++ ++ bcmsdh->osh = osh; ++ bcmsdh->init_success = TRUE; ++ ++ *regsva = (uint32 *)SI_ENUM_BASE; ++ ++ /* Report the BAR, to fix if needed */ ++ bcmsdh->sbwad = SI_ENUM_BASE; ++ return bcmsdh; ++} ++ ++int ++bcmsdh_detach(osl_t *osh, void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ if (bcmsdh != NULL) { ++ if (bcmsdh->sdioh) { ++ sdioh_detach(osh, bcmsdh->sdioh); ++ bcmsdh->sdioh = NULL; ++ } ++ MFREE(osh, bcmsdh, sizeof(bcmsdh_info_t)); ++ } ++ ++ l_bcmsdh = NULL; ++ return 0; ++} ++ ++int ++bcmsdh_iovar_op(void *sdh, const char *name, ++ void *params, int plen, void *arg, int len, bool set) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ return sdioh_iovar_op(bcmsdh->sdioh, name, params, plen, arg, len, set); ++} ++ ++bool ++bcmsdh_intr_query(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ bool on; ++ ++ ASSERT(bcmsdh); ++ status = sdioh_interrupt_query(bcmsdh->sdioh, &on); ++ if (SDIOH_API_SUCCESS(status)) ++ return FALSE; ++ else ++ return on; ++} ++ ++int ++bcmsdh_intr_enable(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ASSERT(bcmsdh); ++ ++ status = sdioh_interrupt_set(bcmsdh->sdioh, TRUE); ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++int ++bcmsdh_intr_disable(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ASSERT(bcmsdh); ++ ++ status = sdioh_interrupt_set(bcmsdh->sdioh, FALSE); ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++int ++bcmsdh_intr_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ASSERT(bcmsdh); ++ ++ status = sdioh_interrupt_register(bcmsdh->sdioh, fn, argh); ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++int ++bcmsdh_intr_dereg(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ASSERT(bcmsdh); ++ ++ status = sdioh_interrupt_deregister(bcmsdh->sdioh); ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++#if defined(DHD_DEBUG) ++bool ++bcmsdh_intr_pending(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ ASSERT(sdh); ++ return sdioh_interrupt_pending(bcmsdh->sdioh); ++} ++#endif ++ ++ ++int ++bcmsdh_devremove_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh) ++{ ++ ASSERT(sdh); ++ ++ /* don't support yet */ ++ return BCME_UNSUPPORTED; ++} ++ ++/** ++ * Read from SDIO Configuration Space ++ * @param sdh SDIO Host context. ++ * @param func_num Function number to read from. ++ * @param addr Address to read from. ++ * @param err Error return. ++ * @return value read from SDIO configuration space. ++ */ ++uint8 ++bcmsdh_cfg_read(void *sdh, uint fnc_num, uint32 addr, int *err) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++#ifdef SDIOH_API_ACCESS_RETRY_LIMIT ++ int32 retry = 0; ++#endif ++ uint8 data = 0; ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ++#ifdef SDIOH_API_ACCESS_RETRY_LIMIT ++ do { ++ if (retry) /* wait for 1 ms till bus get settled down */ ++ OSL_DELAY(1000); ++#endif ++ status = sdioh_cfg_read(bcmsdh->sdioh, fnc_num, addr, (uint8 *)&data); ++#ifdef SDIOH_API_ACCESS_RETRY_LIMIT ++ } while (!SDIOH_API_SUCCESS(status) && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); ++#endif ++ if (err) ++ *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); ++ ++ BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint8data = 0x%x\n", __FUNCTION__, ++ fnc_num, addr, data)); ++ ++ return data; ++} ++ ++void ++bcmsdh_cfg_write(void *sdh, uint fnc_num, uint32 addr, uint8 data, int *err) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++#ifdef SDIOH_API_ACCESS_RETRY_LIMIT ++ int32 retry = 0; ++#endif ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ++#ifdef SDIOH_API_ACCESS_RETRY_LIMIT ++ do { ++ if (retry) /* wait for 1 ms till bus get settled down */ ++ OSL_DELAY(1000); ++#endif ++ status = sdioh_cfg_write(bcmsdh->sdioh, fnc_num, addr, (uint8 *)&data); ++#ifdef SDIOH_API_ACCESS_RETRY_LIMIT ++ } while (!SDIOH_API_SUCCESS(status) && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); ++#endif ++ if (err) ++ *err = SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR; ++ ++ BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint8data = 0x%x\n", __FUNCTION__, ++ fnc_num, addr, data)); ++} ++ ++uint32 ++bcmsdh_cfg_read_word(void *sdh, uint fnc_num, uint32 addr, int *err) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ uint32 data = 0; ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ++ status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_READ, fnc_num, ++ addr, &data, 4); ++ ++ if (err) ++ *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); ++ ++ BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint32data = 0x%x\n", __FUNCTION__, ++ fnc_num, addr, data)); ++ ++ return data; ++} ++ ++void ++bcmsdh_cfg_write_word(void *sdh, uint fnc_num, uint32 addr, uint32 data, int *err) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ++ status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_WRITE, fnc_num, ++ addr, &data, 4); ++ ++ if (err) ++ *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); ++ ++ BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint32data = 0x%x\n", __FUNCTION__, fnc_num, ++ addr, data)); ++} ++ ++ ++int ++bcmsdh_cis_read(void *sdh, uint func, uint8 *cis, uint length) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ++ uint8 *tmp_buf, *tmp_ptr; ++ uint8 *ptr; ++ bool ascii = func & ~0xf; ++ func &= 0x7; ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ASSERT(cis); ++ ASSERT(length <= SBSDIO_CIS_SIZE_LIMIT); ++ ++ status = sdioh_cis_read(bcmsdh->sdioh, func, cis, length); ++ ++ if (ascii) { ++ /* Move binary bits to tmp and format them into the provided buffer. */ ++ if ((tmp_buf = (uint8 *)MALLOC(bcmsdh->osh, length)) == NULL) { ++ BCMSDH_ERROR(("%s: out of memory\n", __FUNCTION__)); ++ return BCME_NOMEM; ++ } ++ bcopy(cis, tmp_buf, length); ++ for (tmp_ptr = tmp_buf, ptr = cis; ptr < (cis + length - 4); tmp_ptr++) { ++ ptr += snprintf((char*)ptr, (cis + length - ptr - 4), ++ "%.2x ", *tmp_ptr & 0xff); ++ if ((((tmp_ptr - tmp_buf) + 1) & 0xf) == 0) ++ ptr += snprintf((char *)ptr, (cis + length - ptr -4), "\n"); ++ } ++ MFREE(bcmsdh->osh, tmp_buf, length); ++ } ++ ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++ ++int ++bcmsdhsdio_set_sbaddr_window(void *sdh, uint32 address, bool force_set) ++{ ++ int err = 0; ++ uint bar0 = address & ~SBSDIO_SB_OFT_ADDR_MASK; ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ if (bar0 != bcmsdh->sbwad || force_set) { ++ bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW, ++ (address >> 8) & SBSDIO_SBADDRLOW_MASK, &err); ++ if (!err) ++ bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRMID, ++ (address >> 16) & SBSDIO_SBADDRMID_MASK, &err); ++ if (!err) ++ bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRHIGH, ++ (address >> 24) & SBSDIO_SBADDRHIGH_MASK, &err); ++ ++ if (!err) ++ bcmsdh->sbwad = bar0; ++ else ++ /* invalidate cached window var */ ++ bcmsdh->sbwad = 0; ++ ++ } ++ ++ return err; ++} ++ ++uint32 ++bcmsdh_reg_read(void *sdh, uint32 addr, uint size) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ uint32 word = 0; ++ ++ BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, ", __FUNCTION__, addr)); ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ++ if (bcmsdhsdio_set_sbaddr_window(bcmsdh, addr, FALSE)) ++ return 0xFFFFFFFF; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ if (size == 4) ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ ++ status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, ++ SDIOH_READ, SDIO_FUNC_1, addr, &word, size); ++ ++ bcmsdh->regfail = !(SDIOH_API_SUCCESS(status)); ++ ++ BCMSDH_INFO(("uint32data = 0x%x\n", word)); ++ ++ /* if ok, return appropriately masked word */ ++ if (SDIOH_API_SUCCESS(status)) { ++ switch (size) { ++ case sizeof(uint8): ++ return (word & 0xff); ++ case sizeof(uint16): ++ return (word & 0xffff); ++ case sizeof(uint32): ++ return word; ++ default: ++ bcmsdh->regfail = TRUE; ++ ++ } ++ } ++ ++ /* otherwise, bad sdio access or invalid size */ ++ BCMSDH_ERROR(("%s: error reading addr 0x%04x size %d\n", __FUNCTION__, addr, size)); ++ return 0xFFFFFFFF; ++} ++ ++uint32 ++bcmsdh_reg_write(void *sdh, uint32 addr, uint size, uint32 data) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ int err = 0; ++ ++ BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, uint%ddata = 0x%x\n", ++ __FUNCTION__, addr, size*8, data)); ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ ASSERT(bcmsdh->init_success); ++ ++ if ((err = bcmsdhsdio_set_sbaddr_window(bcmsdh, addr, FALSE))) ++ return err; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ if (size == 4) ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_WRITE, SDIO_FUNC_1, ++ addr, &data, size); ++ bcmsdh->regfail = !(SDIOH_API_SUCCESS(status)); ++ ++ if (SDIOH_API_SUCCESS(status)) ++ return 0; ++ ++ BCMSDH_ERROR(("%s: error writing 0x%08x to addr 0x%04x size %d\n", ++ __FUNCTION__, data, addr, size)); ++ return 0xFFFFFFFF; ++} ++ ++bool ++bcmsdh_regfail(void *sdh) ++{ ++ return ((bcmsdh_info_t *)sdh)->regfail; ++} ++ ++int ++bcmsdh_recv_buf(void *sdh, uint32 addr, uint fn, uint flags, ++ uint8 *buf, uint nbytes, void *pkt, ++ bcmsdh_cmplt_fn_t complete_fn, void *handle) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ uint incr_fix; ++ uint width; ++ int err = 0; ++ ++ ASSERT(bcmsdh); ++ ASSERT(bcmsdh->init_success); ++ ++ BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n", ++ __FUNCTION__, fn, addr, nbytes)); ++ ++ /* Async not implemented yet */ ++ ASSERT(!(flags & SDIO_REQ_ASYNC)); ++ if (flags & SDIO_REQ_ASYNC) ++ return BCME_UNSUPPORTED; ++ ++ if ((err = bcmsdhsdio_set_sbaddr_window(bcmsdh, addr, FALSE))) ++ return err; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ ++ incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; ++ width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; ++ if (width == 4) ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ ++ status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix, ++ SDIOH_READ, fn, addr, width, nbytes, buf, pkt); ++ ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); ++} ++ ++int ++bcmsdh_send_buf(void *sdh, uint32 addr, uint fn, uint flags, ++ uint8 *buf, uint nbytes, void *pkt, ++ bcmsdh_cmplt_fn_t complete_fn, void *handle) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ uint incr_fix; ++ uint width; ++ int err = 0; ++ ++ ASSERT(bcmsdh); ++ ASSERT(bcmsdh->init_success); ++ ++ BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n", ++ __FUNCTION__, fn, addr, nbytes)); ++ ++ /* Async not implemented yet */ ++ ASSERT(!(flags & SDIO_REQ_ASYNC)); ++ if (flags & SDIO_REQ_ASYNC) ++ return BCME_UNSUPPORTED; ++ ++ if ((err = bcmsdhsdio_set_sbaddr_window(bcmsdh, addr, FALSE))) ++ return err; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ ++ incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; ++ width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; ++ if (width == 4) ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ ++ status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix, ++ SDIOH_WRITE, fn, addr, width, nbytes, buf, pkt); ++ ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++int ++bcmsdh_rwdata(void *sdh, uint rw, uint32 addr, uint8 *buf, uint nbytes) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ SDIOH_API_RC status; ++ ++ ASSERT(bcmsdh); ++ ASSERT(bcmsdh->init_success); ++ ASSERT((addr & SBSDIO_SBWINDOW_MASK) == 0); ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ ++ status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, SDIOH_DATA_INC, ++ (rw ? SDIOH_WRITE : SDIOH_READ), SDIO_FUNC_1, ++ addr, 4, nbytes, buf, NULL); ++ ++ return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); ++} ++ ++int ++bcmsdh_abort(void *sdh, uint fn) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ return sdioh_abort(bcmsdh->sdioh, fn); ++} ++ ++int ++bcmsdh_start(void *sdh, int stage) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ return sdioh_start(bcmsdh->sdioh, stage); ++} ++ ++int ++bcmsdh_stop(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ return sdioh_stop(bcmsdh->sdioh); ++} ++ ++int ++bcmsdh_waitlockfree(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ return sdioh_waitlockfree(bcmsdh->sdioh); ++} ++ ++ ++int ++bcmsdh_query_device(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ bcmsdh->vendevid = (VENDOR_BROADCOM << 16) | 0; ++ return (bcmsdh->vendevid); ++} ++ ++uint ++bcmsdh_query_iofnum(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ return (sdioh_query_iofnum(bcmsdh->sdioh)); ++} ++ ++int ++bcmsdh_reset(bcmsdh_info_t *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ return sdioh_sdio_reset(bcmsdh->sdioh); ++} ++ ++void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh) ++{ ++ ASSERT(sdh); ++ return sdh->sdioh; ++} ++ ++/* Function to pass device-status bits to DHD. */ ++uint32 ++bcmsdh_get_dstatus(void *sdh) ++{ ++ return 0; ++} ++uint32 ++bcmsdh_cur_sbwad(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ ++ if (!bcmsdh) ++ bcmsdh = l_bcmsdh; ++ ++ return (bcmsdh->sbwad); ++} ++ ++void ++bcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev) ++{ ++ return; ++} ++ ++ ++int ++bcmsdh_sleep(void *sdh, bool enab) ++{ ++#ifdef SDIOH_SLEEP_ENABLED ++ bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; ++ sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); ++ ++ return sdioh_sleep(sd, enab); ++#else ++ return BCME_UNSUPPORTED; ++#endif ++} ++ ++int ++bcmsdh_gpio_init(void *sdh) ++{ ++ bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; ++ sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); ++ ++ return sdioh_gpio_init(sd); ++} ++ ++bool ++bcmsdh_gpioin(void *sdh, uint32 gpio) ++{ ++ bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; ++ sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); ++ ++ return sdioh_gpioin(sd, gpio); ++} ++ ++int ++bcmsdh_gpioouten(void *sdh, uint32 gpio) ++{ ++ bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; ++ sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); ++ ++ return sdioh_gpioouten(sd, gpio); ++} ++ ++int ++bcmsdh_gpioout(void *sdh, uint32 gpio, bool enab) ++{ ++ bcmsdh_info_t *p = (bcmsdh_info_t *)sdh; ++ sdioh_info_t *sd = (sdioh_info_t *)(p->sdioh); ++ ++ return sdioh_gpioout(sd, gpio, enab); ++} ++ ++#ifdef BCMSDIOH_TXGLOM ++void ++bcmsdh_glom_post(void *sdh, uint8 *frame, uint len) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ sdioh_glom_post(bcmsdh->sdioh, frame, len); ++} ++ ++void ++bcmsdh_glom_clear(void *sdh) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ sdioh_glom_clear(bcmsdh->sdioh); ++} ++ ++uint ++bcmsdh_set_mode(void *sdh, uint mode) ++{ ++ bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; ++ return (sdioh_set_mode(bcmsdh->sdioh, mode)); ++} ++ ++bool ++bcmsdh_glom_enabled(void) ++{ ++ return (sdioh_glom_enabled()); ++} ++#endif /* BCMSDIOH_TXGLOM */ +diff --git a/drivers/net/wireless/ap6210/bcmsdh_linux.c b/drivers/net/wireless/ap6210/bcmsdh_linux.c +new file mode 100644 +index 0000000..71bb3d9 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmsdh_linux.c +@@ -0,0 +1,796 @@ ++/* ++ * SDIO access interface for drivers - linux specific (pci only) ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdh_linux.c 373359 2012-12-07 06:36:37Z $ ++ */ ++ ++/** ++ * @file bcmsdh_linux.c ++ */ ++ ++#define __UNDEF_NO_VERSION__ ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if defined(OOB_INTR_ONLY) ++#include ++extern void dhdsdio_isr(void * args); ++#include ++#include ++#include ++#include ++#include ++#endif ++ ++#include ++ ++/** ++ * SDIO Host Controller info ++ */ ++typedef struct bcmsdh_hc bcmsdh_hc_t; ++ ++struct bcmsdh_hc { ++ bcmsdh_hc_t *next; ++#ifdef BCMPLATFORM_BUS ++ struct device *dev; /* platform device handle */ ++#else ++ struct pci_dev *dev; /* pci device handle */ ++#endif /* BCMPLATFORM_BUS */ ++ osl_t *osh; ++ void *regs; /* SDIO Host Controller address */ ++ bcmsdh_info_t *sdh; /* SDIO Host Controller handle */ ++ void *ch; ++ unsigned int oob_irq; ++ unsigned long oob_flags; /* OOB Host specifiction as edge and etc */ ++ bool oob_irq_registered; ++ bool oob_irq_enable_flag; ++#if defined(OOB_INTR_ONLY) ++ spinlock_t irq_lock; ++#endif ++}; ++static bcmsdh_hc_t *sdhcinfo = NULL; ++ ++/* driver info, initialized when bcmsdh_register is called */ ++static bcmsdh_driver_t drvinfo = {NULL, NULL}; ++ ++/** ++ * Checks to see if vendor and device IDs match a supported SDIO Host Controller. ++ */ ++bool ++bcmsdh_chipmatch(uint16 vendor, uint16 device) ++{ ++ /* Add other vendors and devices as required */ ++ ++#ifdef BCMSDIOH_STD ++ /* Check for Arasan host controller */ ++ if (vendor == VENDOR_SI_IMAGE) { ++ return (TRUE); ++ } ++ /* Check for BRCM 27XX Standard host controller */ ++ if (device == BCM27XX_SDIOH_ID && vendor == VENDOR_BROADCOM) { ++ return (TRUE); ++ } ++ /* Check for BRCM Standard host controller */ ++ if (device == SDIOH_FPGA_ID && vendor == VENDOR_BROADCOM) { ++ return (TRUE); ++ } ++ /* Check for TI PCIxx21 Standard host controller */ ++ if (device == PCIXX21_SDIOH_ID && vendor == VENDOR_TI) { ++ return (TRUE); ++ } ++ if (device == PCIXX21_SDIOH0_ID && vendor == VENDOR_TI) { ++ return (TRUE); ++ } ++ /* Ricoh R5C822 Standard SDIO Host */ ++ if (device == R5C822_SDIOH_ID && vendor == VENDOR_RICOH) { ++ return (TRUE); ++ } ++ /* JMicron Standard SDIO Host */ ++ if (device == JMICRON_SDIOH_ID && vendor == VENDOR_JMICRON) { ++ return (TRUE); ++ } ++ ++#endif /* BCMSDIOH_STD */ ++#ifdef BCMSDIOH_SPI ++ /* This is the PciSpiHost. */ ++ if (device == SPIH_FPGA_ID && vendor == VENDOR_BROADCOM) { ++ AP6210_ERR("Found PCI SPI Host Controller\n"); ++ return (TRUE); ++ } ++ ++#endif /* BCMSDIOH_SPI */ ++ ++ return (FALSE); ++} ++ ++#if defined(BCMPLATFORM_BUS) ++#if defined(BCMLXSDMMC) ++/* forward declarations */ ++int bcmsdh_probe(struct device *dev); ++int bcmsdh_remove(struct device *dev); ++ ++EXPORT_SYMBOL(bcmsdh_probe); ++EXPORT_SYMBOL(bcmsdh_remove); ++ ++#else ++/* forward declarations */ ++static int __devinit bcmsdh_probe(struct device *dev); ++static int __devexit bcmsdh_remove(struct device *dev); ++#endif ++ ++#if !defined(BCMLXSDMMC) ++static ++#endif ++int bcmsdh_probe(struct device *dev) ++{ ++ osl_t *osh = NULL; ++ bcmsdh_hc_t *sdhc = NULL; ++ ulong regs = 0; ++ bcmsdh_info_t *sdh = NULL; ++#if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) ++ struct platform_device *pdev; ++ struct resource *r; ++#endif ++ int irq = 0; ++ uint32 vendevid; ++ unsigned long irq_flags = 0; ++ ++#if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) ++ pdev = to_platform_device(dev); ++ r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ irq = platform_get_irq(pdev, 0); ++ if (!r || irq == NO_IRQ) ++ return -ENXIO; ++#endif ++ ++#if defined(OOB_INTR_ONLY) ++#ifdef HW_OOB ++ irq_flags = ++ IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE; ++#else ++ irq_flags = IRQF_TRIGGER_FALLING; ++#endif /* HW_OOB */ ++ ++ /* Get customer specific OOB IRQ parametres: IRQ number as IRQ type */ ++ irq = dhd_customer_oob_irq_map(&irq_flags); ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) ++ /* Do not disable this IRQ during suspend */ ++ irq_flags |= IRQF_NO_SUSPEND; ++#endif /* defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) */ ++ if (irq < 0) { ++ AP6210_ERR("%s: Host irq is not defined\n", __FUNCTION__); ++ return 1; ++ } ++#endif ++ /* allocate SDIO Host Controller state info */ ++ if (!(osh = osl_attach(dev, PCI_BUS, FALSE))) { ++ AP6210_ERR("%s: osl_attach failed\n", __FUNCTION__); ++ goto err; ++ } ++ if (!(sdhc = MALLOC(osh, sizeof(bcmsdh_hc_t)))) { ++ AP6210_ERR("%s: out of memory, allocated %d bytes\n", ++ __FUNCTION__, ++ MALLOCED(osh)); ++ goto err; ++ } ++ bzero(sdhc, sizeof(bcmsdh_hc_t)); ++ sdhc->osh = osh; ++ ++ sdhc->dev = (void *)dev; ++ ++#if defined(BCMLXSDMMC) ++ if (!(sdh = bcmsdh_attach(osh, (void *)0, ++ (void **)®s, irq))) { ++ AP6210_ERR("%s: bcmsdh_attach failed\n", __FUNCTION__); ++ goto err; ++ } ++#else ++ if (!(sdh = bcmsdh_attach(osh, (void *)r->start, ++ (void **)®s, irq))) { ++ AP6210_ERR("%s: bcmsdh_attach failed\n", __FUNCTION__); ++ goto err; ++ } ++#endif ++ sdhc->sdh = sdh; ++ sdhc->oob_irq = irq; ++ sdhc->oob_flags = irq_flags; ++ sdhc->oob_irq_registered = FALSE; /* to make sure.. */ ++ sdhc->oob_irq_enable_flag = FALSE; ++#if defined(OOB_INTR_ONLY) ++ spin_lock_init(&sdhc->irq_lock); ++#endif ++ ++ /* chain SDIO Host Controller info together */ ++ sdhc->next = sdhcinfo; ++ sdhcinfo = sdhc; ++ ++ /* Read the vendor/device ID from the CIS */ ++ vendevid = bcmsdh_query_device(sdh); ++ /* try to attach to the target device */ ++ if (!(sdhc->ch = drvinfo.attach((vendevid >> 16), ++ (vendevid & 0xFFFF), 0, 0, 0, 0, ++ (void *)regs, NULL, sdh))) { ++ AP6210_ERR("%s: device attach failed\n", __FUNCTION__); ++ goto err; ++ } ++ ++ return 0; ++ ++ /* error handling */ ++err: ++ if (sdhc) { ++ if (sdhc->sdh) ++ bcmsdh_detach(sdhc->osh, sdhc->sdh); ++ MFREE(osh, sdhc, sizeof(bcmsdh_hc_t)); ++ } ++ if (osh) ++ osl_detach(osh); ++ return -ENODEV; ++} ++ ++#if !defined(BCMLXSDMMC) ++static ++#endif ++int bcmsdh_remove(struct device *dev) ++{ ++ bcmsdh_hc_t *sdhc, *prev; ++ osl_t *osh; ++ ++ sdhc = sdhcinfo; ++ drvinfo.detach(sdhc->ch); ++ bcmsdh_detach(sdhc->osh, sdhc->sdh); ++ ++ /* find the SDIO Host Controller state for this pdev and take it out from the list */ ++ for (sdhc = sdhcinfo, prev = NULL; sdhc; sdhc = sdhc->next) { ++ if (sdhc->dev == (void *)dev) { ++ if (prev) ++ prev->next = sdhc->next; ++ else ++ sdhcinfo = NULL; ++ break; ++ } ++ prev = sdhc; ++ } ++ if (!sdhc) { ++ AP6210_ERR("%s: failed\n", __FUNCTION__); ++ return 0; ++ } ++ ++ /* release SDIO Host Controller info */ ++ osh = sdhc->osh; ++ MFREE(osh, sdhc, sizeof(bcmsdh_hc_t)); ++ osl_detach(osh); ++ ++#if !defined(BCMLXSDMMC) || defined(OOB_INTR_ONLY) ++ dev_set_drvdata(dev, NULL); ++#endif ++ ++ return 0; ++} ++ ++#else /* BCMPLATFORM_BUS */ ++ ++#if !defined(BCMLXSDMMC) ++/* forward declarations for PCI probe and remove functions. */ ++static int __devinit bcmsdh_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent); ++static void __devexit bcmsdh_pci_remove(struct pci_dev *pdev); ++ ++/** ++ * pci id table ++ */ ++static struct pci_device_id bcmsdh_pci_devid[] __devinitdata = { ++ { vendor: PCI_ANY_ID, ++ device: PCI_ANY_ID, ++ subvendor: PCI_ANY_ID, ++ subdevice: PCI_ANY_ID, ++ class: 0, ++ class_mask: 0, ++ driver_data: 0, ++ }, ++ { 0, } ++}; ++MODULE_DEVICE_TABLE(pci, bcmsdh_pci_devid); ++ ++/** ++ * SDIO Host Controller pci driver info ++ */ ++static struct pci_driver bcmsdh_pci_driver = { ++ node: {}, ++ name: "bcmsdh", ++ id_table: bcmsdh_pci_devid, ++ probe: bcmsdh_pci_probe, ++ remove: bcmsdh_pci_remove, ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++ save_state: NULL, ++#endif ++ suspend: NULL, ++ resume: NULL, ++ }; ++ ++ ++extern uint sd_pci_slot; /* Force detection to a particular PCI */ ++ /* slot only . Allows for having multiple */ ++ /* WL devices at once in a PC */ ++ /* Only one instance of dhd will be */ ++ /* usable at a time */ ++ /* Upper word is bus number, */ ++ /* lower word is slot number */ ++ /* Default value of 0xffffffff turns this */ ++ /* off */ ++module_param(sd_pci_slot, uint, 0); ++ ++ ++/** ++ * Detect supported SDIO Host Controller and attach if found. ++ * ++ * Determine if the device described by pdev is a supported SDIO Host ++ * Controller. If so, attach to it and attach to the target device. ++ */ ++static int __devinit ++bcmsdh_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ++{ ++ osl_t *osh = NULL; ++ bcmsdh_hc_t *sdhc = NULL; ++ ulong regs; ++ bcmsdh_info_t *sdh = NULL; ++ int rc; ++ ++ if (sd_pci_slot != 0xFFFFffff) { ++ if (pdev->bus->number != (sd_pci_slot>>16) || ++ PCI_SLOT(pdev->devfn) != (sd_pci_slot&0xffff)) { ++ AP6210_DEBUG("%s: %s: bus %X, slot %X, vend %X, dev %X\n", ++ __FUNCTION__, ++ bcmsdh_chipmatch(pdev->vendor, pdev->device) ++ ?"Found compatible SDIOHC" ++ :"Probing unknown device", ++ pdev->bus->number, PCI_SLOT(pdev->devfn), pdev->vendor, ++ pdev->device); ++ return -ENODEV; ++ } ++ AP6210_DEBUG("%s: %s: bus %X, slot %X, vendor %X, device %X (good PCI location)\n", ++ __FUNCTION__, ++ bcmsdh_chipmatch(pdev->vendor, pdev->device) ++ ?"Using compatible SDIOHC" ++ :"WARNING, forced use of unkown device", ++ pdev->bus->number, PCI_SLOT(pdev->devfn), pdev->vendor, pdev->device); ++ } ++ ++ if ((pdev->vendor == VENDOR_TI) && ((pdev->device == PCIXX21_FLASHMEDIA_ID) || ++ (pdev->device == PCIXX21_FLASHMEDIA0_ID))) { ++ uint32 config_reg; ++ ++ AP6210_ERR("%s: Disabling TI FlashMedia Controller.\n", __FUNCTION__); ++ if (!(osh = osl_attach(pdev, PCI_BUS, FALSE))) { ++ AP6210_ERR("%s: osl_attach failed\n", __FUNCTION__); ++ goto err; ++ } ++ ++ config_reg = OSL_PCI_READ_CONFIG(osh, 0x4c, 4); ++ ++ /* ++ * Set MMC_SD_DIS bit in FlashMedia Controller. ++ * Disbling the SD/MMC Controller in the FlashMedia Controller ++ * allows the Standard SD Host Controller to take over control ++ * of the SD Slot. ++ */ ++ config_reg |= 0x02; ++ OSL_PCI_WRITE_CONFIG(osh, 0x4c, 4, config_reg); ++ osl_detach(osh); ++ } ++ /* match this pci device with what we support */ ++ /* we can't solely rely on this to believe it is our SDIO Host Controller! */ ++ if (!bcmsdh_chipmatch(pdev->vendor, pdev->device)) { ++ return -ENODEV; ++ } ++ ++ /* this is a pci device we might support */ ++ AP6210_ERR("%s: Found possible SDIO Host Controller: bus %d slot %d func %d irq %d\n", ++ __FUNCTION__, ++ pdev->bus->number, PCI_SLOT(pdev->devfn), ++ PCI_FUNC(pdev->devfn), pdev->irq); ++ ++ /* use bcmsdh_query_device() to get the vendor ID of the target device so ++ * it will eventually appear in the Broadcom string on the console ++ */ ++ ++ /* allocate SDIO Host Controller state info */ ++ if (!(osh = osl_attach(pdev, PCI_BUS, FALSE))) { ++ AP6210_ERR("%s: osl_attach failed\n", __FUNCTION__); ++ goto err; ++ } ++ if (!(sdhc = MALLOC(osh, sizeof(bcmsdh_hc_t)))) { ++ AP6210_ERR("%s: out of memory, allocated %d bytes\n", ++ __FUNCTION__, ++ MALLOCED(osh)); ++ goto err; ++ } ++ bzero(sdhc, sizeof(bcmsdh_hc_t)); ++ sdhc->osh = osh; ++ ++ sdhc->dev = pdev; ++ ++ /* map to address where host can access */ ++ pci_set_master(pdev); ++ rc = pci_enable_device(pdev); ++ if (rc) { ++ AP6210_ERR("%s: Cannot enable PCI device\n", __FUNCTION__); ++ goto err; ++ } ++ if (!(sdh = bcmsdh_attach(osh, (void *)(uintptr)pci_resource_start(pdev, 0), ++ (void **)®s, pdev->irq))) { ++ AP6210_ERR("%s: bcmsdh_attach failed\n", __FUNCTION__); ++ goto err; ++ } ++ ++ sdhc->sdh = sdh; ++ ++ /* try to attach to the target device */ ++ if (!(sdhc->ch = drvinfo.attach(VENDOR_BROADCOM, /* pdev->vendor, */ ++ bcmsdh_query_device(sdh) & 0xFFFF, 0, 0, 0, 0, ++ (void *)regs, NULL, sdh))) { ++ AP6210_ERR("%s: device attach failed\n", __FUNCTION__); ++ goto err; ++ } ++ ++ /* chain SDIO Host Controller info together */ ++ sdhc->next = sdhcinfo; ++ sdhcinfo = sdhc; ++ ++ return 0; ++ ++ /* error handling */ ++err: ++ if (sdhc) { ++ if (sdhc->sdh) ++ bcmsdh_detach(sdhc->osh, sdhc->sdh); ++ MFREE(osh, sdhc, sizeof(bcmsdh_hc_t)); ++ } ++ if (osh) ++ osl_detach(osh); ++ return -ENODEV; ++} ++ ++ ++/** ++ * Detach from target devices and SDIO Host Controller ++ */ ++static void __devexit ++bcmsdh_pci_remove(struct pci_dev *pdev) ++{ ++ bcmsdh_hc_t *sdhc, *prev; ++ osl_t *osh; ++ ++ /* find the SDIO Host Controller state for this pdev and take it out from the list */ ++ for (sdhc = sdhcinfo, prev = NULL; sdhc; sdhc = sdhc->next) { ++ if (sdhc->dev == pdev) { ++ if (prev) ++ prev->next = sdhc->next; ++ else ++ sdhcinfo = NULL; ++ break; ++ } ++ prev = sdhc; ++ } ++ if (!sdhc) ++ return; ++ ++ drvinfo.detach(sdhc->ch); ++ ++ bcmsdh_detach(sdhc->osh, sdhc->sdh); ++ ++ /* release SDIO Host Controller info */ ++ osh = sdhc->osh; ++ MFREE(osh, sdhc, sizeof(bcmsdh_hc_t)); ++ osl_detach(osh); ++} ++#endif /* BCMLXSDMMC */ ++#endif /* BCMPLATFORM_BUS */ ++ ++extern int sdio_function_init(void); ++ ++extern int sdio_func_reg_notify(void* semaphore); ++extern void sdio_func_unreg_notify(void); ++ ++#if defined(BCMLXSDMMC) ++int bcmsdh_reg_sdio_notify(void* semaphore) ++{ ++ return sdio_func_reg_notify(semaphore); ++} ++ ++void bcmsdh_unreg_sdio_notify(void) ++{ ++ sdio_func_unreg_notify(); ++} ++#endif /* defined(BCMLXSDMMC) */ ++ ++int ++bcmsdh_register(bcmsdh_driver_t *driver) ++{ ++ int error = 0; ++ ++ drvinfo = *driver; ++ ++#if defined(BCMPLATFORM_BUS) ++ AP6210_ERR("Linux Kernel SDIO/MMC Driver\n"); ++ error = sdio_function_init(); ++ return error; ++#endif /* defined(BCMPLATFORM_BUS) */ ++ ++#if !defined(BCMPLATFORM_BUS) && !defined(BCMLXSDMMC) ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++ if (!(error = pci_module_init(&bcmsdh_pci_driver))) ++ return 0; ++#else ++ if (!(error = pci_register_driver(&bcmsdh_pci_driver))) ++ return 0; ++#endif ++ ++ AP6210_ERR("%s: pci_module_init failed 0x%x\n", __FUNCTION__, error); ++#endif /* BCMPLATFORM_BUS */ ++ ++ return error; ++} ++ ++extern void sdio_function_cleanup(void); ++ ++void ++bcmsdh_unregister(void) ++{ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++ if (bcmsdh_pci_driver.node.next) ++#endif ++ ++#if defined(BCMLXSDMMC) ++ sdio_function_cleanup(); ++#endif /* BCMLXSDMMC */ ++ ++#if !defined(BCMPLATFORM_BUS) && !defined(BCMLXSDMMC) ++ pci_unregister_driver(&bcmsdh_pci_driver); ++#endif /* BCMPLATFORM_BUS */ ++} ++ ++int bcmsdh_set_drvdata(void * dhdp) ++{ ++ AP6210_DEBUG("%s Enter \n", __FUNCTION__); ++ ++ dev_set_drvdata(sdhcinfo->dev, dhdp); ++ ++ return 0; ++} ++ ++#if defined(OOB_INTR_ONLY) ++#define CONFIG_ARCH_SUN6I_AP6210 1 ++ ++void bcmsdh_oob_intr_set(bool enable) ++{ ++ static bool curstate = 1; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&sdhcinfo->irq_lock, flags); ++ if (curstate != enable) { ++ if(enable) { ++ enable_irq(sdhcinfo->oob_irq); ++ } ++ else { ++ disable_irq_nosync(sdhcinfo->oob_irq); ++ } ++ curstate = enable; ++ } ++ ++ spin_unlock_irqrestore(&sdhcinfo->irq_lock, flags); ++} ++ ++static irqreturn_t wlan_oob_irq(int irq, void *dev_id) ++{ ++ dhd_pub_t *dhdp; ++ ++ dhdp = (dhd_pub_t *)dev_get_drvdata(sdhcinfo->dev); ++ ++ bcmsdh_oob_intr_set(0); ++ ++ if (dhdp == NULL) { ++ AP6210_ERR("Out of band GPIO interrupt fired way too early\n"); ++ return IRQ_HANDLED; ++ } ++ ++ dhdsdio_isr((void *)dhdp->bus); ++ ++ return IRQ_HANDLED; ++} ++ ++extern int wl_host_wake_irqno; ++irqreturn_t bcmdhd_gpio_irq_handler(int irq, void *dev) ++{ ++ wlan_oob_irq(0, NULL); ++ return IRQ_HANDLED; ++} ++ ++int bcmsdh_register_oob_intr(void * dhdp) ++{ ++ int error = 0; ++ int ret; ++ AP6210_DEBUG("%s Enter \n", __FUNCTION__); ++ ++ /* IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE; */ ++ dev_set_drvdata(sdhcinfo->dev, dhdp); ++ ++ if (!sdhcinfo->oob_irq_registered) { ++ AP6210_DEBUG("%s IRQ=%d Type=%X \n", __FUNCTION__, ++ (int)sdhcinfo->oob_irq, (int)sdhcinfo->oob_flags); ++ ++ ret = request_irq(wl_host_wake_irqno, bcmdhd_gpio_irq_handler, IRQF_DISABLED| IRQF_SHARED| IRQF_TRIGGER_HIGH, "bcmdhd_gpio_irq", (void *)&wl_host_wake_irqno); ++ if (ret) { ++ AP6210_ERR("request irq%d failed\n", wl_host_wake_irqno); ++ return -1; ++ } ++ ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) || defined(CONFIG_ARCH_SUN6I_AP6210) ++ if (device_may_wakeup(sdhcinfo->dev)) { ++#endif ++ error = enable_irq_wake(sdhcinfo->oob_irq); ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) || defined(CONFIG_ARCH_SUN6I_AP6210) ++ } ++#endif ++ if (error) ++ AP6210_ERR("%s enable_irq_wake error=%d \n", __FUNCTION__, error); ++ sdhcinfo->oob_irq_registered = TRUE; ++ sdhcinfo->oob_irq_enable_flag = TRUE; ++ } ++ ++ return 0; ++} ++ ++void bcmsdh_set_irq(int flag) ++{ ++ if (sdhcinfo->oob_irq_registered && sdhcinfo->oob_irq_enable_flag != flag) { ++ AP6210_ERR("%s Flag = %d\n", __FUNCTION__, flag); ++ sdhcinfo->oob_irq_enable_flag = flag; ++ if (flag) { ++ enable_irq(sdhcinfo->oob_irq); ++ ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) || defined(CONFIG_ARCH_SUN6I_AP6210) ++ if (device_may_wakeup(sdhcinfo->dev)) ++#endif ++ enable_irq_wake(sdhcinfo->oob_irq); ++ } else { ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) || defined(CONFIG_ARCH_SUN6I_AP6210) ++ if (device_may_wakeup(sdhcinfo->dev)) ++#endif ++ disable_irq_wake(sdhcinfo->oob_irq); ++ ++ ++ disable_irq(sdhcinfo->oob_irq); ++ } ++ } ++} ++ ++void bcmsdh_unregister_oob_intr(void) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (sdhcinfo->oob_irq_registered == TRUE) { ++ ++ if(0 != wl_host_wake_irqno) { ++ AP6210_DEBUG("free_irq %d\n", wl_host_wake_irqno); ++ free_irq(wl_host_wake_irqno, &wl_host_wake_irqno); ++ } ++ ++ sdhcinfo->oob_irq_registered = FALSE; ++ } ++} ++#endif ++ ++#if defined(BCMLXSDMMC) ++void *bcmsdh_get_drvdata(void) ++{ ++ if (!sdhcinfo) ++ return NULL; ++ return dev_get_drvdata(sdhcinfo->dev); ++} ++#endif ++ ++/* Module parameters specific to each host-controller driver */ ++ ++extern uint sd_msglevel; /* Debug message level */ ++module_param(sd_msglevel, uint, 0); ++ ++extern uint sd_power; /* 0 = SD Power OFF, 1 = SD Power ON. */ ++module_param(sd_power, uint, 0); ++ ++extern uint sd_clock; /* SD Clock Control, 0 = SD Clock OFF, 1 = SD Clock ON */ ++module_param(sd_clock, uint, 0); ++ ++extern uint sd_divisor; /* Divisor (-1 means external clock) */ ++module_param(sd_divisor, uint, 0); ++ ++extern uint sd_sdmode; /* Default is SD4, 0=SPI, 1=SD1, 2=SD4 */ ++module_param(sd_sdmode, uint, 0); ++ ++extern uint sd_hiok; /* Ok to use hi-speed mode */ ++module_param(sd_hiok, uint, 0); ++ ++extern uint sd_f2_blocksize; ++module_param(sd_f2_blocksize, int, 0); ++ ++#ifdef BCMSDIOH_STD ++extern int sd_uhsimode; ++module_param(sd_uhsimode, int, 0); ++#endif ++ ++#ifdef BCMSDIOH_TXGLOM ++extern uint sd_txglom; ++module_param(sd_txglom, uint, 0); ++#endif ++ ++#ifdef BCMSDH_MODULE ++EXPORT_SYMBOL(bcmsdh_attach); ++EXPORT_SYMBOL(bcmsdh_detach); ++EXPORT_SYMBOL(bcmsdh_intr_query); ++EXPORT_SYMBOL(bcmsdh_intr_enable); ++EXPORT_SYMBOL(bcmsdh_intr_disable); ++EXPORT_SYMBOL(bcmsdh_intr_reg); ++EXPORT_SYMBOL(bcmsdh_intr_dereg); ++ ++#if defined(DHD_DEBUG) ++EXPORT_SYMBOL(bcmsdh_intr_pending); ++#endif ++ ++EXPORT_SYMBOL(bcmsdh_devremove_reg); ++EXPORT_SYMBOL(bcmsdh_cfg_read); ++EXPORT_SYMBOL(bcmsdh_cfg_write); ++EXPORT_SYMBOL(bcmsdh_cis_read); ++EXPORT_SYMBOL(bcmsdh_reg_read); ++EXPORT_SYMBOL(bcmsdh_reg_write); ++EXPORT_SYMBOL(bcmsdh_regfail); ++EXPORT_SYMBOL(bcmsdh_send_buf); ++EXPORT_SYMBOL(bcmsdh_recv_buf); ++ ++EXPORT_SYMBOL(bcmsdh_rwdata); ++EXPORT_SYMBOL(bcmsdh_abort); ++EXPORT_SYMBOL(bcmsdh_query_device); ++EXPORT_SYMBOL(bcmsdh_query_iofnum); ++EXPORT_SYMBOL(bcmsdh_iovar_op); ++EXPORT_SYMBOL(bcmsdh_register); ++EXPORT_SYMBOL(bcmsdh_unregister); ++EXPORT_SYMBOL(bcmsdh_chipmatch); ++EXPORT_SYMBOL(bcmsdh_reset); ++EXPORT_SYMBOL(bcmsdh_waitlockfree); ++ ++EXPORT_SYMBOL(bcmsdh_get_dstatus); ++EXPORT_SYMBOL(bcmsdh_cfg_read_word); ++EXPORT_SYMBOL(bcmsdh_cfg_write_word); ++EXPORT_SYMBOL(bcmsdh_cur_sbwad); ++EXPORT_SYMBOL(bcmsdh_chipinfo); ++ ++#endif /* BCMSDH_MODULE */ +diff --git a/drivers/net/wireless/ap6210/bcmsdh_sdmmc.c b/drivers/net/wireless/ap6210/bcmsdh_sdmmc.c +new file mode 100644 +index 0000000..5f0d300 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmsdh_sdmmc.c +@@ -0,0 +1,1532 @@ ++/* ++ * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdh_sdmmc.c 362913 2012-10-15 11:26:11Z $ ++ */ ++#include ++ ++#include ++#include ++#include ++#include ++#include /* SDIO Device and Protocol Specs */ ++#include /* Standard SDIO Host Controller Specification */ ++#include /* bcmsdh to/from specific controller APIs */ ++#include /* ioctl/iovars */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) ++#include ++extern volatile bool dhd_mmc_suspend; ++#endif ++#include "bcmsdh_sdmmc.h" ++ ++#include ++ ++#ifndef BCMSDH_MODULE ++extern int sdio_function_init(void); ++extern void sdio_function_cleanup(void); ++#endif /* BCMSDH_MODULE */ ++ ++#if !defined(OOB_INTR_ONLY) ++static void IRQHandler(struct sdio_func *func); ++static void IRQHandlerF2(struct sdio_func *func); ++#endif /* !defined(OOB_INTR_ONLY) */ ++static int sdioh_sdmmc_get_cisaddr(sdioh_info_t *sd, uint32 regaddr); ++extern int sdio_reset_comm(struct mmc_card *card); ++extern int sw_mci_check_r1_ready(struct mmc_host* mmc, unsigned ms); ++ ++extern PBCMSDH_SDMMC_INSTANCE gInstance; ++ ++#define DEFAULT_SDIO_F2_BLKSIZE 512 ++#ifndef CUSTOM_SDIO_F2_BLKSIZE ++#define CUSTOM_SDIO_F2_BLKSIZE DEFAULT_SDIO_F2_BLKSIZE ++#endif ++ ++uint sd_sdmode = SDIOH_MODE_SD4; /* Use SD4 mode by default */ ++uint sd_f2_blocksize = CUSTOM_SDIO_F2_BLKSIZE; ++uint sd_divisor = 2; /* Default 48MHz/2 = 24MHz */ ++ ++uint sd_power = 1; /* Default to SD Slot powered ON */ ++uint sd_clock = 1; /* Default to SD Clock turned ON */ ++uint sd_hiok = FALSE; /* Don't use hi-speed mode by default */ ++uint sd_msglevel = 0x01; ++uint sd_use_dma = TRUE; ++DHD_PM_RESUME_WAIT_INIT(sdioh_request_byte_wait); ++DHD_PM_RESUME_WAIT_INIT(sdioh_request_word_wait); ++DHD_PM_RESUME_WAIT_INIT(sdioh_request_packet_wait); ++DHD_PM_RESUME_WAIT_INIT(sdioh_request_buffer_wait); ++ ++#define DMA_ALIGN_MASK 0x03 ++#define MMC_SDIO_ABORT_RETRY_LIMIT 5 ++ ++int sdioh_sdmmc_card_regread(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 *data); ++ ++static int ++sdioh_sdmmc_card_enablefuncs(sdioh_info_t *sd) ++{ ++ int err_ret; ++ uint32 fbraddr; ++ uint8 func; ++ ++ AP6210_DEBUG("%s\n", __FUNCTION__);; ++ ++ /* Get the Card's common CIS address */ ++ sd->com_cis_ptr = sdioh_sdmmc_get_cisaddr(sd, SDIOD_CCCR_CISPTR_0); ++ sd->func_cis_ptr[0] = sd->com_cis_ptr; ++ AP6210_DEBUG("%s: Card's Common CIS Ptr = 0x%x\n", __FUNCTION__, sd->com_cis_ptr); ++ ++ /* Get the Card's function CIS (for each function) */ ++ for (fbraddr = SDIOD_FBR_STARTADDR, func = 1; ++ func <= sd->num_funcs; func++, fbraddr += SDIOD_FBR_SIZE) { ++ sd->func_cis_ptr[func] = sdioh_sdmmc_get_cisaddr(sd, SDIOD_FBR_CISPTR_0 + fbraddr); ++ AP6210_DEBUG("%s: Function %d CIS Ptr = 0x%x\n", ++ __FUNCTION__, func, sd->func_cis_ptr[func]); ++ } ++ ++ sd->func_cis_ptr[0] = sd->com_cis_ptr; ++ AP6210_DEBUG("%s: Card's Common CIS Ptr = 0x%x\n", __FUNCTION__, sd->com_cis_ptr); ++ ++ /* Enable Function 1 */ ++ sdio_claim_host(gInstance->func[1]); ++ err_ret = sdio_enable_func(gInstance->func[1]); ++ sdio_release_host(gInstance->func[1]); ++ if (err_ret) { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to enable F1 Err: 0x%08x", err_ret); ++ } ++ ++ return FALSE; ++} ++ ++/* ++ * Public entry points & extern's ++ */ ++extern sdioh_info_t * ++sdioh_attach(osl_t *osh, void *bar0, uint irq) ++{ ++ sdioh_info_t *sd; ++ int err_ret; ++ ++ AP6210_DEBUG("%s\n", __FUNCTION__); ++ ++ if (gInstance == NULL) { ++ AP6210_ERR("%s: SDIO Device not present\n", __FUNCTION__); ++ return NULL; ++ } ++ ++ if ((sd = (sdioh_info_t *)MALLOC(osh, sizeof(sdioh_info_t))) == NULL) { ++ AP6210_ERR("sdioh_attach: out of memory, malloced %d bytes\n", MALLOCED(osh)); ++ return NULL; ++ } ++ bzero((char *)sd, sizeof(sdioh_info_t)); ++ sd->osh = osh; ++ if (sdioh_sdmmc_osinit(sd) != 0) { ++ AP6210_ERR("%s:sdioh_sdmmc_osinit() failed\n", __FUNCTION__); ++ MFREE(sd->osh, sd, sizeof(sdioh_info_t)); ++ return NULL; ++ } ++ ++ sd->num_funcs = 2; ++ sd->sd_blockmode = TRUE; ++ sd->use_client_ints = TRUE; ++ sd->client_block_size[0] = 64; ++ sd->use_rxchain = FALSE; ++ ++ gInstance->sd = sd; ++ ++ /* Claim host controller */ ++ if (gInstance->func[1]) { ++ sdio_claim_host(gInstance->func[1]); ++ ++ sd->client_block_size[1] = 64; ++ err_ret = sdio_set_block_size(gInstance->func[1], 64); ++ if (err_ret) { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to set F1 blocksize\n"); ++ } ++ ++ /* Release host controller F1 */ ++ sdio_release_host(gInstance->func[1]); ++ } else { ++ AP6210_ERR("%s:gInstance->func[1] is null\n", __FUNCTION__); ++ MFREE(sd->osh, sd, sizeof(sdioh_info_t)); ++ return NULL; ++ } ++ ++ if (gInstance->func[2]) { ++ /* Claim host controller F2 */ ++ sdio_claim_host(gInstance->func[2]); ++ ++ sd->client_block_size[2] = sd_f2_blocksize; ++ err_ret = sdio_set_block_size(gInstance->func[2], sd_f2_blocksize); ++ if (err_ret) { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to set F2 blocksize to %d\n", ++ sd_f2_blocksize); ++ } ++ ++ /* Release host controller F2 */ ++ sdio_release_host(gInstance->func[2]); ++ } else { ++ AP6210_ERR("%s:gInstance->func[2] is null\n", __FUNCTION__); ++ MFREE(sd->osh, sd, sizeof(sdioh_info_t)); ++ return NULL; ++ } ++ ++ sdioh_sdmmc_card_enablefuncs(sd); ++ ++ AP6210_DEBUG("%s: Done\n", __FUNCTION__); ++ return sd; ++} ++ ++ ++extern SDIOH_API_RC ++sdioh_detach(osl_t *osh, sdioh_info_t *sd) ++{ ++ AP6210_DEBUG("%s\n", __FUNCTION__); ++ ++ if (sd) { ++ ++ /* Disable Function 2 */ ++ sdio_claim_host(gInstance->func[2]); ++ sdio_disable_func(gInstance->func[2]); ++ sdio_release_host(gInstance->func[2]); ++ ++ /* Disable Function 1 */ ++ if (gInstance->func[1]) { ++ sdio_claim_host(gInstance->func[1]); ++ sdio_disable_func(gInstance->func[1]); ++ sdio_release_host(gInstance->func[1]); ++ } ++ ++ gInstance->func[1] = NULL; ++ gInstance->func[2] = NULL; ++ ++ /* deregister irq */ ++ sdioh_sdmmc_osfree(sd); ++ ++ MFREE(sd->osh, sd, sizeof(sdioh_info_t)); ++ } ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++#if defined(OOB_INTR_ONLY) && defined(HW_OOB) ++ ++extern SDIOH_API_RC ++sdioh_enable_func_intr(void) ++{ ++ uint8 reg; ++ int err; ++ ++ if (gInstance->func[0]) { ++ sdio_claim_host(gInstance->func[0]); ++ ++ reg = sdio_readb(gInstance->func[0], SDIOD_CCCR_INTEN, &err); ++ if (err) { ++ AP6210_ERR("%s: error for read SDIO_CCCR_IENx : 0x%x\n", __FUNCTION__, err); ++ sdio_release_host(gInstance->func[0]); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ /* Enable F1 and F2 interrupts, set master enable */ ++ reg |= (INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN | INTR_CTL_MASTER_EN); ++ ++ sdio_writeb(gInstance->func[0], reg, SDIOD_CCCR_INTEN, &err); ++ sdio_release_host(gInstance->func[0]); ++ ++ if (err) { ++ AP6210_ERR("%s: error for write SDIO_CCCR_IENx : 0x%x\n", __FUNCTION__, err); ++ return SDIOH_API_RC_FAIL; ++ } ++ } ++ ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++extern SDIOH_API_RC ++sdioh_disable_func_intr(void) ++{ ++ uint8 reg; ++ int err; ++ ++ if (gInstance->func[0]) { ++ sdio_claim_host(gInstance->func[0]); ++ reg = sdio_readb(gInstance->func[0], SDIOD_CCCR_INTEN, &err); ++ if (err) { ++ AP6210_ERR("%s: error for read SDIO_CCCR_IENx : 0x%x\n", __FUNCTION__, err); ++ sdio_release_host(gInstance->func[0]); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ reg &= ~(INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN); ++ /* Disable master interrupt with the last function interrupt */ ++ if (!(reg & 0xFE)) ++ reg = 0; ++ sdio_writeb(gInstance->func[0], reg, SDIOD_CCCR_INTEN, &err); ++ ++ sdio_release_host(gInstance->func[0]); ++ if (err) { ++ AP6210_ERR("%s: error for write SDIO_CCCR_IENx : 0x%x\n", __FUNCTION__, err); ++ return SDIOH_API_RC_FAIL; ++ } ++ } ++ return SDIOH_API_RC_SUCCESS; ++} ++#endif /* defined(OOB_INTR_ONLY) && defined(HW_OOB) */ ++ ++/* Configure callback to client when we recieve client interrupt */ ++extern SDIOH_API_RC ++sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh) ++{ ++ AP6210_DEBUG("%s: Entering\n", __FUNCTION__); ++ if (fn == NULL) { ++ AP6210_ERR("%s: interrupt handler is NULL, not registering\n", __FUNCTION__); ++ return SDIOH_API_RC_FAIL; ++ } ++#if !defined(OOB_INTR_ONLY) ++ sd->intr_handler = fn; ++ sd->intr_handler_arg = argh; ++ sd->intr_handler_valid = TRUE; ++ ++ /* register and unmask irq */ ++ if (gInstance->func[2]) { ++ sdio_claim_host(gInstance->func[2]); ++ sdio_claim_irq(gInstance->func[2], IRQHandlerF2); ++ sdio_release_host(gInstance->func[2]); ++ } ++ ++ if (gInstance->func[1]) { ++ sdio_claim_host(gInstance->func[1]); ++ sdio_claim_irq(gInstance->func[1], IRQHandler); ++ sdio_release_host(gInstance->func[1]); ++ } ++#elif defined(HW_OOB) ++ sdioh_enable_func_intr(); ++#endif /* !defined(OOB_INTR_ONLY) */ ++ ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++extern SDIOH_API_RC ++sdioh_interrupt_deregister(sdioh_info_t *sd) ++{ ++ AP6210_DEBUG("%s: Entering\n", __FUNCTION__); ++ ++#if !defined(OOB_INTR_ONLY) ++ if (gInstance->func[1]) { ++ /* register and unmask irq */ ++ sdio_claim_host(gInstance->func[1]); ++ sdio_release_irq(gInstance->func[1]); ++ sdio_release_host(gInstance->func[1]); ++ } ++ ++ if (gInstance->func[2]) { ++ /* Claim host controller F2 */ ++ sdio_claim_host(gInstance->func[2]); ++ sdio_release_irq(gInstance->func[2]); ++ /* Release host controller F2 */ ++ sdio_release_host(gInstance->func[2]); ++ } ++ ++ sd->intr_handler_valid = FALSE; ++ sd->intr_handler = NULL; ++ sd->intr_handler_arg = NULL; ++#elif defined(HW_OOB) ++ sdioh_disable_func_intr(); ++#endif /* !defined(OOB_INTR_ONLY) */ ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++extern SDIOH_API_RC ++sdioh_interrupt_query(sdioh_info_t *sd, bool *onoff) ++{ ++ AP6210_DEBUG("%s: Entering\n", __FUNCTION__); ++ *onoff = sd->client_intr_enabled; ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++#if defined(DHD_DEBUG) ++extern bool ++sdioh_interrupt_pending(sdioh_info_t *sd) ++{ ++ return (0); ++} ++#endif ++ ++uint ++sdioh_query_iofnum(sdioh_info_t *sd) ++{ ++ return sd->num_funcs; ++} ++ ++/* IOVar table */ ++enum { ++ IOV_MSGLEVEL = 1, ++ IOV_BLOCKMODE, ++ IOV_BLOCKSIZE, ++ IOV_DMA, ++ IOV_USEINTS, ++ IOV_NUMINTS, ++ IOV_NUMLOCALINTS, ++ IOV_HOSTREG, ++ IOV_DEVREG, ++ IOV_DIVISOR, ++ IOV_SDMODE, ++ IOV_HISPEED, ++ IOV_HCIREGS, ++ IOV_POWER, ++ IOV_CLOCK, ++ IOV_RXCHAIN ++}; ++ ++const bcm_iovar_t sdioh_iovars[] = { ++ {"sd_msglevel", IOV_MSGLEVEL, 0, IOVT_UINT32, 0 }, ++ {"sd_blockmode", IOV_BLOCKMODE, 0, IOVT_BOOL, 0 }, ++ {"sd_blocksize", IOV_BLOCKSIZE, 0, IOVT_UINT32, 0 }, /* ((fn << 16) | size) */ ++ {"sd_dma", IOV_DMA, 0, IOVT_BOOL, 0 }, ++ {"sd_ints", IOV_USEINTS, 0, IOVT_BOOL, 0 }, ++ {"sd_numints", IOV_NUMINTS, 0, IOVT_UINT32, 0 }, ++ {"sd_numlocalints", IOV_NUMLOCALINTS, 0, IOVT_UINT32, 0 }, ++ {"sd_hostreg", IOV_HOSTREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, ++ {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, ++ {"sd_divisor", IOV_DIVISOR, 0, IOVT_UINT32, 0 }, ++ {"sd_power", IOV_POWER, 0, IOVT_UINT32, 0 }, ++ {"sd_clock", IOV_CLOCK, 0, IOVT_UINT32, 0 }, ++ {"sd_mode", IOV_SDMODE, 0, IOVT_UINT32, 100}, ++ {"sd_highspeed", IOV_HISPEED, 0, IOVT_UINT32, 0 }, ++ {"sd_rxchain", IOV_RXCHAIN, 0, IOVT_BOOL, 0 }, ++ {NULL, 0, 0, 0, 0 } ++}; ++ ++int ++sdioh_iovar_op(sdioh_info_t *si, const char *name, ++ void *params, int plen, void *arg, int len, bool set) ++{ ++ const bcm_iovar_t *vi = NULL; ++ int bcmerror = 0; ++ int val_size; ++ int32 int_val = 0; ++ bool bool_val; ++ uint32 actionid; ++ ++ ASSERT(name); ++ ASSERT(len >= 0); ++ ++ /* Get must have return space; Set does not take qualifiers */ ++ ASSERT(set || (arg && len)); ++ ASSERT(!set || (!params && !plen)); ++ ++ AP6210_DEBUG("%s: Enter (%s %s)\n", __FUNCTION__, (set ? "set" : "get"), name); ++ ++ if ((vi = bcm_iovar_lookup(sdioh_iovars, name)) == NULL) { ++ bcmerror = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ ++ if ((bcmerror = bcm_iovar_lencheck(vi, arg, len, set)) != 0) ++ goto exit; ++ ++ /* Set up params so get and set can share the convenience variables */ ++ if (params == NULL) { ++ params = arg; ++ plen = len; ++ } ++ ++ if (vi->type == IOVT_VOID) ++ val_size = 0; ++ else if (vi->type == IOVT_BUFFER) ++ val_size = len; ++ else ++ val_size = sizeof(int); ++ ++ if (plen >= (int)sizeof(int_val)) ++ bcopy(params, &int_val, sizeof(int_val)); ++ ++ bool_val = (int_val != 0) ? TRUE : FALSE; ++ BCM_REFERENCE(bool_val); ++ ++ actionid = set ? IOV_SVAL(vi->varid) : IOV_GVAL(vi->varid); ++ switch (actionid) { ++ case IOV_GVAL(IOV_MSGLEVEL): ++ int_val = (int32)sd_msglevel; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_MSGLEVEL): ++ sd_msglevel = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_BLOCKMODE): ++ int_val = (int32)si->sd_blockmode; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_BLOCKMODE): ++ si->sd_blockmode = (bool)int_val; ++ /* Haven't figured out how to make non-block mode with DMA */ ++ break; ++ ++ case IOV_GVAL(IOV_BLOCKSIZE): ++ if ((uint32)int_val > si->num_funcs) { ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ int_val = (int32)si->client_block_size[int_val]; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_BLOCKSIZE): ++ { ++ uint func = ((uint32)int_val >> 16); ++ uint blksize = (uint16)int_val; ++ uint maxsize; ++ ++ if (func > si->num_funcs) { ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ ++ switch (func) { ++ case 0: maxsize = 32; break; ++ case 1: maxsize = BLOCK_SIZE_4318; break; ++ case 2: maxsize = BLOCK_SIZE_4328; break; ++ default: maxsize = 0; ++ } ++ if (blksize > maxsize) { ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ if (!blksize) { ++ blksize = maxsize; ++ } ++ ++ /* Now set it */ ++ si->client_block_size[func] = blksize; ++ ++ break; ++ } ++ ++ case IOV_GVAL(IOV_RXCHAIN): ++ int_val = (int32)si->use_rxchain; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_GVAL(IOV_DMA): ++ int_val = (int32)si->sd_use_dma; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_DMA): ++ si->sd_use_dma = (bool)int_val; ++ break; ++ ++ case IOV_GVAL(IOV_USEINTS): ++ int_val = (int32)si->use_client_ints; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_USEINTS): ++ si->use_client_ints = (bool)int_val; ++ if (si->use_client_ints) ++ si->intmask |= CLIENT_INTR; ++ else ++ si->intmask &= ~CLIENT_INTR; ++ ++ break; ++ ++ case IOV_GVAL(IOV_DIVISOR): ++ int_val = (uint32)sd_divisor; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_DIVISOR): ++ sd_divisor = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_POWER): ++ int_val = (uint32)sd_power; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_POWER): ++ sd_power = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_CLOCK): ++ int_val = (uint32)sd_clock; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_CLOCK): ++ sd_clock = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_SDMODE): ++ int_val = (uint32)sd_sdmode; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_SDMODE): ++ sd_sdmode = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_HISPEED): ++ int_val = (uint32)sd_hiok; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_HISPEED): ++ sd_hiok = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_NUMINTS): ++ int_val = (int32)si->intrcount; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_GVAL(IOV_NUMLOCALINTS): ++ int_val = (int32)0; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_GVAL(IOV_HOSTREG): ++ { ++ sdreg_t *sd_ptr = (sdreg_t *)params; ++ ++ if (sd_ptr->offset < SD_SysAddr || sd_ptr->offset > SD_MaxCurCap) { ++ AP6210_ERR("%s: bad offset 0x%x\n", __FUNCTION__, sd_ptr->offset); ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ ++ AP6210_DEBUG("%s: rreg%d at offset %d\n", __FUNCTION__, ++ (sd_ptr->offset & 1) ? 8 : ((sd_ptr->offset & 2) ? 16 : 32), ++ sd_ptr->offset); ++ if (sd_ptr->offset & 1) ++ int_val = 8; /* sdioh_sdmmc_rreg8(si, sd_ptr->offset); */ ++ else if (sd_ptr->offset & 2) ++ int_val = 16; /* sdioh_sdmmc_rreg16(si, sd_ptr->offset); */ ++ else ++ int_val = 32; /* sdioh_sdmmc_rreg(si, sd_ptr->offset); */ ++ ++ bcopy(&int_val, arg, sizeof(int_val)); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_HOSTREG): ++ { ++ sdreg_t *sd_ptr = (sdreg_t *)params; ++ ++ if (sd_ptr->offset < SD_SysAddr || sd_ptr->offset > SD_MaxCurCap) { ++ AP6210_ERR("%s: bad offset 0x%x\n", __FUNCTION__, sd_ptr->offset); ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ ++ AP6210_DEBUG("%s: wreg%d value 0x%08x at offset %d\n", __FUNCTION__, sd_ptr->value, ++ (sd_ptr->offset & 1) ? 8 : ((sd_ptr->offset & 2) ? 16 : 32), ++ sd_ptr->offset); ++ break; ++ } ++ ++ case IOV_GVAL(IOV_DEVREG): ++ { ++ sdreg_t *sd_ptr = (sdreg_t *)params; ++ uint8 data = 0; ++ ++ if (sdioh_cfg_read(si, sd_ptr->func, sd_ptr->offset, &data)) { ++ bcmerror = BCME_SDIO_ERROR; ++ break; ++ } ++ ++ int_val = (int)data; ++ bcopy(&int_val, arg, sizeof(int_val)); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_DEVREG): ++ { ++ sdreg_t *sd_ptr = (sdreg_t *)params; ++ uint8 data = (uint8)sd_ptr->value; ++ ++ if (sdioh_cfg_write(si, sd_ptr->func, sd_ptr->offset, &data)) { ++ bcmerror = BCME_SDIO_ERROR; ++ break; ++ } ++ break; ++ } ++ ++ default: ++ bcmerror = BCME_UNSUPPORTED; ++ break; ++ } ++exit: ++ ++ return bcmerror; ++} ++ ++#if defined(OOB_INTR_ONLY) && defined(HW_OOB) ++ ++SDIOH_API_RC ++sdioh_enable_hw_oob_intr(sdioh_info_t *sd, bool enable) ++{ ++ SDIOH_API_RC status; ++ uint8 data; ++ ++ if (enable) ++ data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE | SDIO_SEPINT_ACT_HI; ++ else ++ data = SDIO_SEPINT_ACT_HI; /* disable hw oob interrupt */ ++ ++ status = sdioh_request_byte(sd, SDIOH_WRITE, 0, SDIOD_CCCR_BRCM_SEPINT, &data); ++ return status; ++} ++#endif /* defined(OOB_INTR_ONLY) && defined(HW_OOB) */ ++ ++extern SDIOH_API_RC ++sdioh_cfg_read(sdioh_info_t *sd, uint fnc_num, uint32 addr, uint8 *data) ++{ ++ SDIOH_API_RC status; ++ /* No lock needed since sdioh_request_byte does locking */ ++ status = sdioh_request_byte(sd, SDIOH_READ, fnc_num, addr, data); ++ return status; ++} ++ ++extern SDIOH_API_RC ++sdioh_cfg_write(sdioh_info_t *sd, uint fnc_num, uint32 addr, uint8 *data) ++{ ++ /* No lock needed since sdioh_request_byte does locking */ ++ SDIOH_API_RC status; ++ status = sdioh_request_byte(sd, SDIOH_WRITE, fnc_num, addr, data); ++ return status; ++} ++ ++static int ++sdioh_sdmmc_get_cisaddr(sdioh_info_t *sd, uint32 regaddr) ++{ ++ /* read 24 bits and return valid 17 bit addr */ ++ int i; ++ uint32 scratch, regdata; ++ uint8 *ptr = (uint8 *)&scratch; ++ for (i = 0; i < 3; i++) { ++ if ((sdioh_sdmmc_card_regread (sd, 0, regaddr, 1, ®data)) != SUCCESS) ++ AP6210_ERR("%s: Can't read!\n", __FUNCTION__); ++ ++ *ptr++ = (uint8) regdata; ++ regaddr++; ++ } ++ ++ /* Only the lower 17-bits are valid */ ++ scratch = ltoh32(scratch); ++ scratch &= 0x0001FFFF; ++ return (scratch); ++} ++ ++extern SDIOH_API_RC ++sdioh_cis_read(sdioh_info_t *sd, uint func, uint8 *cisd, uint32 length) ++{ ++ uint32 count; ++ int offset; ++ uint32 foo; ++ uint8 *cis = cisd; ++ ++ AP6210_DEBUG("%s: Func = %d\n", __FUNCTION__, func); ++ ++ if (!sd->func_cis_ptr[func]) { ++ bzero(cis, length); ++ AP6210_ERR("%s: no func_cis_ptr[%d]\n", __FUNCTION__, func); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ AP6210_ERR("%s: func_cis_ptr[%d]=0x%04x\n", __FUNCTION__, func, sd->func_cis_ptr[func]); ++ ++ for (count = 0; count < length; count++) { ++ offset = sd->func_cis_ptr[func] + count; ++ if (sdioh_sdmmc_card_regread (sd, 0, offset, 1, &foo) < 0) { ++ AP6210_ERR("%s: regread failed: Can't read CIS\n", __FUNCTION__); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ *cis = (uint8)(foo & 0xff); ++ cis++; ++ } ++ ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++extern SDIOH_API_RC ++sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr, uint8 *byte) ++{ ++ int err_ret; ++#if defined(MMC_SDIO_ABORT) ++ int sdio_abort_retry = MMC_SDIO_ABORT_RETRY_LIMIT; ++#endif ++ int ret = 0; ++ ++ AP6210_DEBUG("%s: rw=%d, func=%d, addr=0x%05x\n", __FUNCTION__, rw, func, regaddr); ++ ++ DHD_PM_RESUME_WAIT(sdioh_request_byte_wait); ++ DHD_PM_RESUME_RETURN_ERROR(SDIOH_API_RC_FAIL); ++ if(rw) { /* CMD52 Write */ ++ if (func == 0) { ++ /* Can only directly write to some F0 registers. Handle F2 enable ++ * as a special case. ++ */ ++ if (regaddr == SDIOD_CCCR_IOEN) { ++ if (gInstance->func[2]) { ++ sdio_claim_host(gInstance->func[2]); ++ if (*byte & SDIO_FUNC_ENABLE_2) { ++ /* Enable Function 2 */ ++ err_ret = sdio_enable_func(gInstance->func[2]); ++ if (err_ret) { ++ AP6210_ERR("bcmsdh_sdmmc: enable F2 failed:%d", ++ err_ret); ++ } ++ } else { ++ /* Disable Function 2 */ ++ err_ret = sdio_disable_func(gInstance->func[2]); ++ if (err_ret) { ++ AP6210_ERR("bcmsdh_sdmmc: Disab F2 failed:%d", ++ err_ret); ++ } ++ } ++ sdio_release_host(gInstance->func[2]); ++ } ++ } ++#if defined(MMC_SDIO_ABORT) ++ /* to allow abort command through F1 */ ++ else if (regaddr == SDIOD_CCCR_IOABORT) { ++ /* Because of SDIO3.0 host issue on Manta, ++ * sometimes the abort fails. ++ * Retrying again will fix this issue. ++ */ ++ while (sdio_abort_retry--) { ++ if (gInstance->func[func]) { ++ sdio_claim_host(gInstance->func[func]); ++ /* ++ * this sdio_f0_writeb() can be replaced with ++ * another api depending upon MMC driver change. ++ * As of this time, this is temporaray one ++ */ ++ sdio_writeb(gInstance->func[func], ++ *byte, regaddr, &err_ret); ++ sdio_release_host(gInstance->func[func]); ++ } ++ if (!err_ret) ++ break; ++ } ++ } ++#endif /* MMC_SDIO_ABORT */ ++ else if (regaddr < 0xF0) { ++ AP6210_ERR("bcmsdh_sdmmc: F0 Wr:0x%02x: write disallowed\n", regaddr); ++ } else { ++ /* Claim host controller, perform F0 write, and release */ ++ if (gInstance->func[func]) { ++ sdio_claim_host(gInstance->func[func]); ++ sdio_f0_writeb(gInstance->func[func], ++ *byte, regaddr, &err_ret); ++ sdio_release_host(gInstance->func[func]); ++ } ++ } ++ } else { ++ /* Claim host controller, perform Fn write, and release */ ++ if (gInstance->func[func]) { ++ sdio_claim_host(gInstance->func[func]); ++ sdio_writeb(gInstance->func[func], *byte, regaddr, &err_ret); ++ sdio_release_host(gInstance->func[func]); ++ } ++ } ++ } else { /* CMD52 Read */ ++ /* Claim host controller, perform Fn read, and release */ ++ if (gInstance->func[func]) { ++ sdio_claim_host(gInstance->func[func]); ++ if (func == 0) { ++ *byte = sdio_f0_readb(gInstance->func[func], regaddr, &err_ret); ++ } else { ++ *byte = sdio_readb(gInstance->func[func], regaddr, &err_ret); ++ } ++ sdio_release_host(gInstance->func[func]); ++ } ++ } ++ ++ //AW judge sdio read write timeout, 1s ++ ret = sw_mci_check_r1_ready(gInstance->func[func]->card->host, 1000); ++ if (ret != 0) ++ AP6210_DEBUG("%s data timeout.\n", __FUNCTION__); ++ ++ if (err_ret) { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n", ++ rw ? "Write" : "Read", func, regaddr, *byte, err_ret); ++ } ++ ++ return ((err_ret == 0) ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL); ++} ++ ++extern SDIOH_API_RC ++sdioh_request_word(sdioh_info_t *sd, uint cmd_type, uint rw, uint func, uint addr, ++ uint32 *word, uint nbytes) ++{ ++ int err_ret = SDIOH_API_RC_FAIL; ++#if defined(MMC_SDIO_ABORT) ++ int sdio_abort_retry = MMC_SDIO_ABORT_RETRY_LIMIT; ++#endif ++ int ret = 0; ++ ++ if (func == 0) { ++ AP6210_ERR("%s: Only CMD52 allowed to F0.\n", __FUNCTION__); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ AP6210_DEBUG("%s: cmd_type=%d, rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", ++ __FUNCTION__, cmd_type, rw, func, addr, nbytes); ++ ++ DHD_PM_RESUME_WAIT(sdioh_request_word_wait); ++ DHD_PM_RESUME_RETURN_ERROR(SDIOH_API_RC_FAIL); ++ /* Claim host controller */ ++ sdio_claim_host(gInstance->func[func]); ++ ++ if(rw) { /* CMD53 Write */ ++ if (nbytes == 4) { ++ sdio_writel(gInstance->func[func], *word, addr, &err_ret); ++ } else if (nbytes == 2) { ++ sdio_writew(gInstance->func[func], (*word & 0xFFFF), addr, &err_ret); ++ } else { ++ AP6210_ERR("%s: Invalid nbytes: %d\n", __FUNCTION__, nbytes); ++ } ++ } else { /* CMD52 Read */ ++ if (nbytes == 4) { ++ *word = sdio_readl(gInstance->func[func], addr, &err_ret); ++ } else if (nbytes == 2) { ++ *word = sdio_readw(gInstance->func[func], addr, &err_ret) & 0xFFFF; ++ } else { ++ AP6210_ERR("%s: Invalid nbytes: %d\n", __FUNCTION__, nbytes); ++ } ++ } ++ ++ //AW judge sdio read write timeout, 1s ++ ret = sw_mci_check_r1_ready(gInstance->func[func]->card->host, 1000); ++ if (ret != 0) ++ AP6210_DEBUG("%s data timeout.\n", __FUNCTION__); ++ ++ /* Release host controller */ ++ sdio_release_host(gInstance->func[func]); ++ ++ if (err_ret) { ++#if defined(MMC_SDIO_ABORT) ++ /* Any error on CMD53 transaction should abort that function using function 0. */ ++ while (sdio_abort_retry--) { ++ if (gInstance->func[0]) { ++ sdio_claim_host(gInstance->func[0]); ++ /* ++ * this sdio_f0_writeb() can be replaced with another api ++ * depending upon MMC driver change. ++ * As of this time, this is temporaray one ++ */ ++ sdio_writeb(gInstance->func[0], ++ func, SDIOD_CCCR_IOABORT, &err_ret); ++ sdio_release_host(gInstance->func[0]); ++ } ++ if (!err_ret) ++ break; ++ } ++ if (err_ret) ++#endif /* MMC_SDIO_ABORT */ ++ { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to %s word, Err: 0x%08x\n", ++ rw ? "Write" : "Read", err_ret); ++ } ++ } ++ ++ return ((err_ret == 0) ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL); ++} ++ ++static SDIOH_API_RC ++sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write, uint func, ++ uint addr, void *pkt) ++{ ++ bool fifo = (fix_inc == SDIOH_DATA_FIX); ++ uint32 SGCount = 0; ++ int err_ret = 0; ++ void *pnext, *pprev; ++ uint ttl_len, dma_len, lft_len, xfred_len, pkt_len; ++ uint blk_num; ++ int blk_size; ++ struct mmc_request mmc_req; ++ struct mmc_command mmc_cmd; ++ struct mmc_data mmc_dat; ++ int ret = 0; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ASSERT(pkt); ++ DHD_PM_RESUME_WAIT(sdioh_request_packet_wait); ++ DHD_PM_RESUME_RETURN_ERROR(SDIOH_API_RC_FAIL); ++ ++ ttl_len = xfred_len = 0; ++ /* at least 4 bytes alignment of skb buff is guaranteed */ ++ for (pnext = pkt; pnext; pnext = PKTNEXT(sd->osh, pnext)) ++ ttl_len += PKTLEN(sd->osh, pnext); ++ ++ blk_size = sd->client_block_size[func]; ++ if (!sd->use_rxchain || ttl_len <= blk_size) { ++ blk_num = 0; ++ dma_len = 0; ++ } else { ++ blk_num = ttl_len / blk_size; ++ dma_len = blk_num * blk_size; ++ } ++ lft_len = ttl_len - dma_len; ++ ++ AP6210_DEBUG("%s: %s %dB to func%d:%08x, %d blks with DMA, %dB leftover\n", ++ __FUNCTION__, write ? "W" : "R", ++ ttl_len, func, addr, blk_num, lft_len); ++ ++ if (0 != dma_len) { ++ memset(&mmc_req, 0, sizeof(struct mmc_request)); ++ memset(&mmc_cmd, 0, sizeof(struct mmc_command)); ++ memset(&mmc_dat, 0, sizeof(struct mmc_data)); ++ ++ /* Set up DMA descriptors */ ++ pprev = pkt; ++ for (pnext = pkt; ++ pnext && dma_len; ++ pnext = PKTNEXT(sd->osh, pnext)) { ++ pkt_len = PKTLEN(sd->osh, pnext); ++ ++ if (dma_len > pkt_len) ++ dma_len -= pkt_len; ++ else { ++ pkt_len = xfred_len = dma_len; ++ dma_len = 0; ++ pkt = pnext; ++ } ++ ++ sg_set_buf(&sd->sg_list[SGCount++], ++ (uint8*)PKTDATA(sd->osh, pnext), ++ pkt_len); ++ ++ if (SGCount >= SDIOH_SDMMC_MAX_SG_ENTRIES) { ++ AP6210_ERR("%s: sg list entries exceed limit\n", ++ __FUNCTION__); ++ return (SDIOH_API_RC_FAIL); ++ } ++ } ++ ++ mmc_dat.sg = sd->sg_list; ++ mmc_dat.sg_len = SGCount; ++ mmc_dat.blksz = blk_size; ++ mmc_dat.blocks = blk_num; ++ mmc_dat.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ; ++ ++ mmc_cmd.opcode = 53; /* SD_IO_RW_EXTENDED */ ++ mmc_cmd.arg = write ? 1<<31 : 0; ++ mmc_cmd.arg |= (func & 0x7) << 28; ++ mmc_cmd.arg |= 1<<27; ++ mmc_cmd.arg |= fifo ? 0 : 1<<26; ++ mmc_cmd.arg |= (addr & 0x1FFFF) << 9; ++ mmc_cmd.arg |= blk_num & 0x1FF; ++ mmc_cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC; ++ ++ mmc_req.cmd = &mmc_cmd; ++ mmc_req.data = &mmc_dat; ++ ++ sdio_claim_host(gInstance->func[func]); ++ mmc_set_data_timeout(&mmc_dat, gInstance->func[func]->card); ++ mmc_wait_for_req(gInstance->func[func]->card->host, &mmc_req); ++ sdio_release_host(gInstance->func[func]); ++ ++ err_ret = mmc_cmd.error? mmc_cmd.error : mmc_dat.error; ++ if (0 != err_ret) { ++ AP6210_ERR("%s:CMD53 %s failed with code %d\n", ++ __FUNCTION__, ++ write ? "write" : "read", ++ err_ret); ++ AP6210_ERR("%s:Disabling rxchain and fire it with PIO\n", ++ __FUNCTION__); ++ sd->use_rxchain = FALSE; ++ pkt = pprev; ++ lft_len = ttl_len; ++ } else if (!fifo) { ++ addr = addr + ttl_len - lft_len - dma_len; ++ } ++ } ++ ++ /* PIO mode */ ++ if (0 != lft_len) { ++ /* Claim host controller */ ++ sdio_claim_host(gInstance->func[func]); ++ for (pnext = pkt; pnext; pnext = PKTNEXT(sd->osh, pnext)) { ++ uint8 *buf = (uint8*)PKTDATA(sd->osh, pnext) + ++ xfred_len; ++ pkt_len = PKTLEN(sd->osh, pnext); ++ if (0 != xfred_len) { ++ pkt_len -= xfred_len; ++ xfred_len = 0; ++ } ++ ++ /* Align Patch ++ * read or small packet(ex:BDC header) skip 32 byte align ++ * otherwise, padding DHD_SDALIGN for performance ++ */ ++ if (write == 0 || pkt_len < 32) ++ pkt_len = (pkt_len + 3) & 0xFFFFFFFC; ++ else if (pkt_len % blk_size) ++ pkt_len += blk_size - (pkt_len % blk_size); ++ ++#ifdef CONFIG_MMC_MSM7X00A ++ if ((pkt_len % 64) == 32) { ++ AP6210_DEBUG("%s: Rounding up TX packet +=32\n", __FUNCTION__); ++ pkt_len += 32; ++ } ++#endif /* CONFIG_MMC_MSM7X00A */ ++ ++ if ((write) && (!fifo)) ++ err_ret = sdio_memcpy_toio( ++ gInstance->func[func], ++ addr, buf, pkt_len); ++ else if (write) ++ err_ret = sdio_memcpy_toio( ++ gInstance->func[func], ++ addr, buf, pkt_len); ++ else if (fifo) ++ err_ret = sdio_readsb( ++ gInstance->func[func], ++ buf, addr, pkt_len); ++ else ++ err_ret = sdio_memcpy_fromio( ++ gInstance->func[func], ++ buf, addr, pkt_len); ++ ++ //AW judge sdio read write timeout, 1s ++ ret = sw_mci_check_r1_ready(gInstance->func[func]->card->host, 1000); ++ if (ret != 0) ++ AP6210_DEBUG("%s data timeout.\n", __FUNCTION__); ++ ++ if (err_ret) ++ AP6210_ERR("%s: %s FAILED %p[%d], addr=0x%05x, pkt_len=%d, ERR=%d\n", ++ __FUNCTION__, ++ (write) ? "TX" : "RX", ++ pnext, SGCount, addr, pkt_len, err_ret); ++ else ++ AP6210_DEBUG("%s: %s xfr'd %p[%d], addr=0x%05x, len=%d\n", ++ __FUNCTION__, ++ (write) ? "TX" : "RX", ++ pnext, SGCount, addr, pkt_len); ++ ++ if (!fifo) ++ addr += pkt_len; ++ SGCount ++; ++ } ++ sdio_release_host(gInstance->func[func]); ++ } ++ ++ AP6210_DEBUG("%s: Exit\n", __FUNCTION__); ++ return ((err_ret == 0) ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL); ++} ++ ++ ++/* ++ * This function takes a buffer or packet, and fixes everything up so that in the ++ * end, a DMA-able packet is created. ++ * ++ * A buffer does not have an associated packet pointer, and may or may not be aligned. ++ * A packet may consist of a single packet, or a packet chain. If it is a packet chain, ++ * then all the packets in the chain must be properly aligned. If the packet data is not ++ * aligned, then there may only be one packet, and in this case, it is copied to a new ++ * aligned packet. ++ * ++ */ ++extern SDIOH_API_RC ++sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc, uint write, uint func, ++ uint addr, uint reg_width, uint buflen_u, uint8 *buffer, void *pkt) ++{ ++ SDIOH_API_RC Status; ++ void *mypkt = NULL; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ DHD_PM_RESUME_WAIT(sdioh_request_buffer_wait); ++ DHD_PM_RESUME_RETURN_ERROR(SDIOH_API_RC_FAIL); ++ /* Case 1: we don't have a packet. */ ++ if (pkt == NULL) { ++ AP6210_DEBUG("%s: Creating new %s Packet, len=%d\n", ++ __FUNCTION__, write ? "TX" : "RX", buflen_u); ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ if (!(mypkt = PKTGET_STATIC(sd->osh, buflen_u, write ? TRUE : FALSE))) ++#else ++ if (!(mypkt = PKTGET(sd->osh, buflen_u, write ? TRUE : FALSE))) ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ { ++ AP6210_ERR("%s: PKTGET failed: len %d\n", ++ __FUNCTION__, buflen_u); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ /* For a write, copy the buffer data into the packet. */ ++ if (write) { ++ bcopy(buffer, PKTDATA(sd->osh, mypkt), buflen_u); ++ } ++ ++ Status = sdioh_request_packet(sd, fix_inc, write, func, addr, mypkt); ++ ++ /* For a read, copy the packet data back to the buffer. */ ++ if (!write) { ++ bcopy(PKTDATA(sd->osh, mypkt), buffer, buflen_u); ++ } ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ PKTFREE_STATIC(sd->osh, mypkt, write ? TRUE : FALSE); ++#else ++ PKTFREE(sd->osh, mypkt, write ? TRUE : FALSE); ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ } else if (((uint32)(PKTDATA(sd->osh, pkt)) & DMA_ALIGN_MASK) != 0) { ++ /* Case 2: We have a packet, but it is unaligned. */ ++ ++ /* In this case, we cannot have a chain. */ ++ ASSERT(PKTNEXT(sd->osh, pkt) == NULL); ++ ++ AP6210_DEBUG("%s: Creating aligned %s Packet, len=%d\n", ++ __FUNCTION__, write ? "TX" : "RX", PKTLEN(sd->osh, pkt)); ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ if (!(mypkt = PKTGET_STATIC(sd->osh, PKTLEN(sd->osh, pkt), write ? TRUE : FALSE))) ++#else ++ if (!(mypkt = PKTGET(sd->osh, PKTLEN(sd->osh, pkt), write ? TRUE : FALSE))) ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ { ++ AP6210_ERR("%s: PKTGET failed: len %d\n", ++ __FUNCTION__, PKTLEN(sd->osh, pkt)); ++ return SDIOH_API_RC_FAIL; ++ } ++ ++ /* For a write, copy the buffer data into the packet. */ ++ if (write) { ++ bcopy(PKTDATA(sd->osh, pkt), ++ PKTDATA(sd->osh, mypkt), ++ PKTLEN(sd->osh, pkt)); ++ } ++ ++ Status = sdioh_request_packet(sd, fix_inc, write, func, addr, mypkt); ++ ++ /* For a read, copy the packet data back to the buffer. */ ++ if (!write) { ++ bcopy(PKTDATA(sd->osh, mypkt), ++ PKTDATA(sd->osh, pkt), ++ PKTLEN(sd->osh, mypkt)); ++ } ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ PKTFREE_STATIC(sd->osh, mypkt, write ? TRUE : FALSE); ++#else ++ PKTFREE(sd->osh, mypkt, write ? TRUE : FALSE); ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ } else { /* case 3: We have a packet and it is aligned. */ ++ AP6210_DEBUG("%s: Aligned %s Packet, direct DMA\n", ++ __FUNCTION__, write ? "Tx" : "Rx"); ++ Status = sdioh_request_packet(sd, fix_inc, write, func, addr, pkt); ++ } ++ ++ return (Status); ++} ++ ++/* this function performs "abort" for both of host & device */ ++extern int ++sdioh_abort(sdioh_info_t *sd, uint func) ++{ ++#if defined(MMC_SDIO_ABORT) ++ char t_func = (char) func; ++#endif /* defined(MMC_SDIO_ABORT) */ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++#if defined(MMC_SDIO_ABORT) ++ /* issue abort cmd52 command through F1 */ ++ sdioh_request_byte(sd, SD_IO_OP_WRITE, SDIO_FUNC_0, SDIOD_CCCR_IOABORT, &t_func); ++#endif /* defined(MMC_SDIO_ABORT) */ ++ ++ AP6210_DEBUG("%s: Exit\n", __FUNCTION__); ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++/* Reset and re-initialize the device */ ++int sdioh_sdio_reset(sdioh_info_t *si) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ AP6210_DEBUG("%s: Exit\n", __FUNCTION__); ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++/* Disable device interrupt */ ++void ++sdioh_sdmmc_devintr_off(sdioh_info_t *sd) ++{ ++ AP6210_DEBUG("%s: %d\n", __FUNCTION__, sd->use_client_ints); ++ sd->intmask &= ~CLIENT_INTR; ++} ++ ++/* Enable device interrupt */ ++void ++sdioh_sdmmc_devintr_on(sdioh_info_t *sd) ++{ ++ AP6210_DEBUG("%s: %d\n", __FUNCTION__, sd->use_client_ints); ++ sd->intmask |= CLIENT_INTR; ++} ++ ++/* Read client card reg */ ++int ++sdioh_sdmmc_card_regread(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 *data) ++{ ++ ++ if ((func == 0) || (regsize == 1)) { ++ uint8 temp = 0; ++ ++ sdioh_request_byte(sd, SDIOH_READ, func, regaddr, &temp); ++ *data = temp; ++ *data &= 0xff; ++ AP6210_DEBUG("%s: byte read data=0x%02x\n", ++ __FUNCTION__, *data); ++ } else { ++ sdioh_request_word(sd, 0, SDIOH_READ, func, regaddr, data, regsize); ++ if (regsize == 2) ++ *data &= 0xffff; ++ ++ AP6210_DEBUG("%s: word read data=0x%08x\n", ++ __FUNCTION__, *data); ++ } ++ ++ return SUCCESS; ++} ++ ++#if !defined(OOB_INTR_ONLY) ++/* bcmsdh_sdmmc interrupt handler */ ++static void IRQHandler(struct sdio_func *func) ++{ ++ sdioh_info_t *sd; ++ ++ AP6210_DEBUG("bcmsdh_sdmmc: ***IRQHandler\n"); ++ sd = gInstance->sd; ++ ++ ASSERT(sd != NULL); ++ sdio_release_host(gInstance->func[0]); ++ ++ if (sd->use_client_ints) { ++ sd->intrcount++; ++ ASSERT(sd->intr_handler); ++ ASSERT(sd->intr_handler_arg); ++ (sd->intr_handler)(sd->intr_handler_arg); ++ } else { ++ AP6210_ERR("bcmsdh_sdmmc: ***IRQHandler\n"); ++ ++ AP6210_ERR("%s: Not ready for intr: enabled %d, handler %p\n", ++ __FUNCTION__, sd->client_intr_enabled, sd->intr_handler); ++ } ++ ++ sdio_claim_host(gInstance->func[0]); ++} ++ ++/* bcmsdh_sdmmc interrupt handler for F2 (dummy handler) */ ++static void IRQHandlerF2(struct sdio_func *func) ++{ ++ sdioh_info_t *sd; ++ ++ AP6210_DEBUG("bcmsdh_sdmmc: ***IRQHandlerF2\n"); ++ ++ sd = gInstance->sd; ++ ++ ASSERT(sd != NULL); ++ BCM_REFERENCE(sd); ++} ++#endif /* !defined(OOB_INTR_ONLY) */ ++ ++#ifdef NOTUSED ++/* Write client card reg */ ++static int ++sdioh_sdmmc_card_regwrite(sdioh_info_t *sd, int func, uint32 regaddr, int regsize, uint32 data) ++{ ++ ++ if ((func == 0) || (regsize == 1)) { ++ uint8 temp; ++ ++ temp = data & 0xff; ++ sdioh_request_byte(sd, SDIOH_READ, func, regaddr, &temp); ++ AP6210_DEBUG("%s: byte write data=0x%02x\n", ++ __FUNCTION__, data); ++ } else { ++ if (regsize == 2) ++ data &= 0xffff; ++ ++ sdioh_request_word(sd, 0, SDIOH_READ, func, regaddr, &data, regsize); ++ ++ AP6210_DEBUG("%s: word write data=0x%08x\n", ++ __FUNCTION__, data); ++ } ++ ++ return SUCCESS; ++} ++#endif /* NOTUSED */ ++ ++int ++sdioh_start(sdioh_info_t *si, int stage) ++{ ++ int ret; ++ sdioh_info_t *sd = gInstance->sd; ++ ++ if (!sd) return (0); ++ ++ /* Need to do this stages as we can't enable the interrupt till ++ downloading of the firmware is complete, other wise polling ++ sdio access will come in way ++ */ ++ if (gInstance->func[0]) { ++ if (stage == 0) { ++ /* Since the power to the chip is killed, we will have ++ re enumerate the device again. Set the block size ++ and enable the fucntion 1 for in preparation for ++ downloading the code ++ */ ++ /* sdio_reset_comm() - has been fixed in latest kernel/msm.git for Linux ++ 2.6.27. The implementation prior to that is buggy, and needs broadcom's ++ patch for it ++ */ ++ if ((ret = sdio_reset_comm(gInstance->func[0]->card))) { ++ AP6210_ERR("%s Failed, error = %d\n", __FUNCTION__, ret); ++ return ret; ++ } ++ else { ++ sd->num_funcs = 2; ++ sd->sd_blockmode = TRUE; ++ sd->use_client_ints = TRUE; ++ sd->client_block_size[0] = 64; ++ ++ if (gInstance->func[1]) { ++ /* Claim host controller */ ++ sdio_claim_host(gInstance->func[1]); ++ ++ sd->client_block_size[1] = 64; ++ if (sdio_set_block_size(gInstance->func[1], 64)) { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to set F1 blocksize\n"); ++ } ++ ++ /* Release host controller F1 */ ++ sdio_release_host(gInstance->func[1]); ++ } ++ ++ if (gInstance->func[2]) { ++ /* Claim host controller F2 */ ++ sdio_claim_host(gInstance->func[2]); ++ ++ sd->client_block_size[2] = sd_f2_blocksize; ++ if (sdio_set_block_size(gInstance->func[2], ++ sd_f2_blocksize)) { ++ AP6210_ERR("bcmsdh_sdmmc: Failed to set F2 " ++ "blocksize to %d\n", sd_f2_blocksize); ++ } ++ ++ /* Release host controller F2 */ ++ sdio_release_host(gInstance->func[2]); ++ } ++ ++ sdioh_sdmmc_card_enablefuncs(sd); ++ } ++ } else { ++#if !defined(OOB_INTR_ONLY) ++ sdio_claim_host(gInstance->func[0]); ++ if (gInstance->func[2]) ++ sdio_claim_irq(gInstance->func[2], IRQHandlerF2); ++ if (gInstance->func[1]) ++ sdio_claim_irq(gInstance->func[1], IRQHandler); ++ sdio_release_host(gInstance->func[0]); ++#else /* defined(OOB_INTR_ONLY) */ ++#if defined(HW_OOB) ++ sdioh_enable_func_intr(); ++#endif ++ bcmsdh_oob_intr_set(TRUE); ++#endif /* !defined(OOB_INTR_ONLY) */ ++ } ++ } ++ else ++ AP6210_ERR("%s Failed\n", __FUNCTION__); ++ ++ return (0); ++} ++ ++int ++sdioh_stop(sdioh_info_t *si) ++{ ++ /* MSM7201A Android sdio stack has bug with interrupt ++ So internaly within SDIO stack they are polling ++ which cause issue when device is turned off. So ++ unregister interrupt with SDIO stack to stop the ++ polling ++ */ ++ if (gInstance->func[0]) { ++#if !defined(OOB_INTR_ONLY) ++ sdio_claim_host(gInstance->func[0]); ++ if (gInstance->func[1]) ++ sdio_release_irq(gInstance->func[1]); ++ if (gInstance->func[2]) ++ sdio_release_irq(gInstance->func[2]); ++ sdio_release_host(gInstance->func[0]); ++#else /* defined(OOB_INTR_ONLY) */ ++#if defined(HW_OOB) ++ sdioh_disable_func_intr(); ++#endif ++ bcmsdh_oob_intr_set(FALSE); ++#endif /* !defined(OOB_INTR_ONLY) */ ++ } ++ else ++ AP6210_ERR("%s Failed\n", __FUNCTION__); ++ return (0); ++} ++ ++int ++sdioh_waitlockfree(sdioh_info_t *sd) ++{ ++ return (1); ++} ++ ++ ++SDIOH_API_RC ++sdioh_gpioouten(sdioh_info_t *sd, uint32 gpio) ++{ ++ return SDIOH_API_RC_FAIL; ++} ++ ++SDIOH_API_RC ++sdioh_gpioout(sdioh_info_t *sd, uint32 gpio, bool enab) ++{ ++ return SDIOH_API_RC_FAIL; ++} ++ ++bool ++sdioh_gpioin(sdioh_info_t *sd, uint32 gpio) ++{ ++ return FALSE; ++} ++ ++SDIOH_API_RC ++sdioh_gpio_init(sdioh_info_t *sd) ++{ ++ return SDIOH_API_RC_FAIL; ++} +diff --git a/drivers/net/wireless/ap6210/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/ap6210/bcmsdh_sdmmc_linux.c +new file mode 100644 +index 0000000..98b5818 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmsdh_sdmmc_linux.c +@@ -0,0 +1,427 @@ ++/* ++ * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdh_sdmmc_linux.c 363783 2012-10-19 06:27:14Z $ ++ */ ++ ++#include ++#include ++#include /* SDIO Device and Protocol Specs */ ++#include /* bcmsdh to/from specific controller APIs */ ++#include /* to get msglevel bit values */ ++ ++#include /* request_irq() */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#if !defined(SDIO_VENDOR_ID_BROADCOM) ++#define SDIO_VENDOR_ID_BROADCOM 0x02d0 ++#endif /* !defined(SDIO_VENDOR_ID_BROADCOM) */ ++ ++#define SDIO_DEVICE_ID_BROADCOM_DEFAULT 0x0000 ++ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4325_SDGWB) ++#define SDIO_DEVICE_ID_BROADCOM_4325_SDGWB 0x0492 /* BCM94325SDGWB */ ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4325_SDGWB) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4325) ++#define SDIO_DEVICE_ID_BROADCOM_4325 0x0493 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4325) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4329) ++#define SDIO_DEVICE_ID_BROADCOM_4329 0x4329 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4329) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4319) ++#define SDIO_DEVICE_ID_BROADCOM_4319 0x4319 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4319) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4330) ++#define SDIO_DEVICE_ID_BROADCOM_4330 0x4330 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4330) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4334) ++#define SDIO_DEVICE_ID_BROADCOM_4334 0x4334 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4334) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_4324) ++#define SDIO_DEVICE_ID_BROADCOM_4324 0x4324 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_4324) */ ++#if !defined(SDIO_DEVICE_ID_BROADCOM_43239) ++#define SDIO_DEVICE_ID_BROADCOM_43239 43239 ++#endif /* !defined(SDIO_DEVICE_ID_BROADCOM_43239) */ ++ ++ ++#include ++ ++#include ++ ++#ifdef WL_CFG80211 ++extern void wl_cfg80211_set_parent_dev(void *dev); ++#endif ++ ++extern void sdioh_sdmmc_devintr_off(sdioh_info_t *sd); ++extern void sdioh_sdmmc_devintr_on(sdioh_info_t *sd); ++extern int dhd_os_check_wakelock(void *dhdp); ++extern int dhd_os_check_if_up(void *dhdp); ++extern void *bcmsdh_get_drvdata(void); ++ ++int sdio_function_init(void); ++void sdio_function_cleanup(void); ++ ++#define DESCRIPTION "bcmsdh_sdmmc Driver" ++#define AUTHOR "Broadcom Corporation" ++ ++/* module param defaults */ ++static int clockoverride = 0; ++ ++module_param(clockoverride, int, 0644); ++MODULE_PARM_DESC(clockoverride, "SDIO card clock override"); ++ ++PBCMSDH_SDMMC_INSTANCE gInstance; ++ ++/* Maximum number of bcmsdh_sdmmc devices supported by driver */ ++#define BCMSDH_SDMMC_MAX_DEVICES 1 ++ ++extern int bcmsdh_probe(struct device *dev); ++extern int bcmsdh_remove(struct device *dev); ++extern volatile bool dhd_mmc_suspend; ++ ++static int bcmsdh_sdmmc_probe(struct sdio_func *func, ++ const struct sdio_device_id *id) ++{ ++ int ret = 0; ++ static struct sdio_func sdio_func_0; ++ ++ if (func) { ++ AP6210_DEBUG("bcmsdh_sdmmc: %s Enter\n", __FUNCTION__); ++ AP6210_DEBUG("sdio_bcmsdh: func->class=%x\n", func->class); ++ AP6210_DEBUG("sdio_vendor: 0x%04x\n", func->vendor); ++ AP6210_DEBUG("sdio_device: 0x%04x\n", func->device); ++ AP6210_DEBUG("Function#: 0x%04x\n", func->num); ++ ++ if (func->num == 1) { ++ sdio_func_0.num = 0; ++ sdio_func_0.card = func->card; ++ gInstance->func[0] = &sdio_func_0; ++ if(func->device == 0x4) { /* 4318 */ ++ gInstance->func[2] = NULL; ++ AP6210_DEBUG("NIC found, calling bcmsdh_probe...\n"); ++ ret = bcmsdh_probe(&func->dev); ++ } ++ } ++ ++ gInstance->func[func->num] = func; ++ ++ if (func->num == 2) { ++ #ifdef WL_CFG80211 ++ wl_cfg80211_set_parent_dev(&func->dev); ++ #endif ++ AP6210_DEBUG("F2 found, calling bcmsdh_probe...\n"); ++ ret = bcmsdh_probe(&func->dev); ++ } ++ } else { ++ ret = -ENODEV; ++ } ++ ++ return ret; ++} ++ ++static void bcmsdh_sdmmc_remove(struct sdio_func *func) ++{ ++ if (func) { ++ AP6210_DEBUG("bcmsdh_sdmmc: %s Enter\n", __FUNCTION__); ++ AP6210_DEBUG("sdio_bcmsdh: func->class=%x\n", func->class); ++ AP6210_DEBUG("sdio_vendor: 0x%04x\n", func->vendor); ++ AP6210_DEBUG("sdio_device: 0x%04x\n", func->device); ++ AP6210_DEBUG("Function#: 0x%04x\n", func->num); ++ ++ if (gInstance->func[2]) { ++ AP6210_DEBUG("F2 found, calling bcmsdh_remove...\n"); ++ bcmsdh_remove(&func->dev); ++ gInstance->func[2] = NULL; ++ } ++ if (func->num == 1) { ++ sdio_claim_host(func); ++ sdio_disable_func(func); ++ sdio_release_host(func); ++ gInstance->func[1] = NULL; ++ } ++ } ++} ++ ++/* devices we support, null terminated */ ++static const struct sdio_device_id bcmsdh_sdmmc_ids[] = { ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_DEFAULT) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4325_SDGWB) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4325) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4329) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4319) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4324) }, ++ { SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43239) }, ++ { SDIO_DEVICE_CLASS(SDIO_CLASS_NONE) }, ++ { /* end: all zeroes */ }, ++}; ++ ++MODULE_DEVICE_TABLE(sdio, bcmsdh_sdmmc_ids); ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) ++static int bcmsdh_sdmmc_suspend(struct device *pdev) ++{ ++ struct sdio_func *func = dev_to_sdio_func(pdev); ++ mmc_pm_flag_t sdio_flags; ++ int ret; ++ ++ if (func->num != 2) ++ return 0; ++ ++ AP6210_DEBUG("%s Enter\n", __FUNCTION__); ++ ++ if (dhd_os_check_wakelock(bcmsdh_get_drvdata())) ++ return -EBUSY; ++ ++ sdio_flags = sdio_get_host_pm_caps(func); ++ ++ if (!(sdio_flags & MMC_PM_KEEP_POWER)) { ++ AP6210_ERR("%s: can't keep power while host is suspended\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* keep power while host suspended */ ++ ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); ++ if (ret) { ++ AP6210_ERR("%s: error while trying to keep power\n", __FUNCTION__); ++ return ret; ++ } ++ ++#if defined(OOB_INTR_ONLY) ++ bcmsdh_oob_intr_set(0); ++#endif /* defined(OOB_INTR_ONLY) */ ++ dhd_mmc_suspend = TRUE; ++ smp_mb(); ++ ++ return 0; ++} ++ ++static int bcmsdh_sdmmc_resume(struct device *pdev) ++{ ++#if defined(OOB_INTR_ONLY) ++ struct sdio_func *func = dev_to_sdio_func(pdev); ++#endif /* defined(OOB_INTR_ONLY) */ ++ AP6210_DEBUG("%s Enter\n", __FUNCTION__); ++ ++ dhd_mmc_suspend = FALSE; ++#if defined(OOB_INTR_ONLY) ++ if ((func->num == 2) && dhd_os_check_if_up(bcmsdh_get_drvdata())) ++ bcmsdh_oob_intr_set(1); ++#endif /* (OOB_INTR_ONLY) */ ++ smp_mb(); ++ return 0; ++} ++ ++static const struct dev_pm_ops bcmsdh_sdmmc_pm_ops = { ++ .suspend = bcmsdh_sdmmc_suspend, ++ .resume = bcmsdh_sdmmc_resume, ++}; ++#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) */ ++ ++#if defined(BCMLXSDMMC) ++static struct semaphore *notify_semaphore = NULL; ++ ++static int dummy_probe(struct sdio_func *func, ++ const struct sdio_device_id *id) ++{ ++ if (notify_semaphore) ++ up(notify_semaphore); ++ return 0; ++} ++ ++static void dummy_remove(struct sdio_func *func) ++{ ++} ++ ++static struct sdio_driver dummy_sdmmc_driver = { ++ .probe = dummy_probe, ++ .remove = dummy_remove, ++ .name = "dummy_sdmmc", ++ .id_table = bcmsdh_sdmmc_ids, ++ }; ++ ++int sdio_func_reg_notify(void* semaphore) ++{ ++ notify_semaphore = semaphore; ++ return sdio_register_driver(&dummy_sdmmc_driver); ++} ++ ++void sdio_func_unreg_notify(void) ++{ ++ sdio_unregister_driver(&dummy_sdmmc_driver); ++} ++ ++#endif /* defined(BCMLXSDMMC) */ ++ ++static struct sdio_driver bcmsdh_sdmmc_driver = { ++ .probe = bcmsdh_sdmmc_probe, ++ .remove = bcmsdh_sdmmc_remove, ++ .name = "bcmsdh_sdmmc", ++ .id_table = bcmsdh_sdmmc_ids, ++#if !defined(CONFIG_ARCH_RHEA) || !defined(CONFIG_ARCH_CAPRI) ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) ++ .drv = { ++ .pm = &bcmsdh_sdmmc_pm_ops, ++ }, ++#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) */ ++#endif /* !defined(CONFIG_ARCH_RHEA) || !defined(CONFIG_ARCH_CAPRI) */ ++ }; ++ ++struct sdos_info { ++ sdioh_info_t *sd; ++ spinlock_t lock; ++}; ++ ++ ++int ++sdioh_sdmmc_osinit(sdioh_info_t *sd) ++{ ++ struct sdos_info *sdos; ++ ++ if (!sd) ++ return BCME_BADARG; ++ ++ sdos = (struct sdos_info*)MALLOC(sd->osh, sizeof(struct sdos_info)); ++ sd->sdos_info = (void*)sdos; ++ if (sdos == NULL) ++ return BCME_NOMEM; ++ ++ sdos->sd = sd; ++ spin_lock_init(&sdos->lock); ++ return BCME_OK; ++} ++ ++void ++sdioh_sdmmc_osfree(sdioh_info_t *sd) ++{ ++ struct sdos_info *sdos; ++ ASSERT(sd && sd->sdos_info); ++ ++ sdos = (struct sdos_info *)sd->sdos_info; ++ MFREE(sd->osh, sdos, sizeof(struct sdos_info)); ++} ++ ++/* Interrupt enable/disable */ ++SDIOH_API_RC ++sdioh_interrupt_set(sdioh_info_t *sd, bool enable) ++{ ++ ulong flags; ++ struct sdos_info *sdos; ++ ++ if (!sd) ++ return BCME_BADARG; ++ ++ AP6210_DEBUG("%s: %s\n", __FUNCTION__, enable ? "Enabling" : "Disabling"); ++ ++ sdos = (struct sdos_info *)sd->sdos_info; ++ ASSERT(sdos); ++ ++#if !defined(OOB_INTR_ONLY) ++ if (enable && !(sd->intr_handler && sd->intr_handler_arg)) { ++ AP6210_ERR("%s: no handler registered, will not enable\n", __FUNCTION__); ++ return SDIOH_API_RC_FAIL; ++ } ++#endif /* !defined(OOB_INTR_ONLY) */ ++ ++ /* Ensure atomicity for enable/disable calls */ ++ spin_lock_irqsave(&sdos->lock, flags); ++ ++ sd->client_intr_enabled = enable; ++ if (enable) { ++ sdioh_sdmmc_devintr_on(sd); ++ } else { ++ sdioh_sdmmc_devintr_off(sd); ++ } ++ ++ spin_unlock_irqrestore(&sdos->lock, flags); ++ ++ return SDIOH_API_RC_SUCCESS; ++} ++ ++ ++#ifdef BCMSDH_MODULE ++static int __init ++bcmsdh_module_init(void) ++{ ++ int error = 0; ++ error = sdio_function_init(); ++ return error; ++} ++ ++static void __exit ++bcmsdh_module_cleanup(void) ++{ ++ sdio_function_cleanup(); ++} ++ ++module_init(bcmsdh_module_init); ++module_exit(bcmsdh_module_cleanup); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_DESCRIPTION(DESCRIPTION); ++MODULE_AUTHOR(AUTHOR); ++ ++#endif /* BCMSDH_MODULE */ ++/* ++ * module init ++*/ ++int sdio_function_init(void) ++{ ++ int error = 0; ++ AP6210_DEBUG("bcmsdh_sdmmc: %s Enter\n", __FUNCTION__); ++ ++ gInstance = kzalloc(sizeof(BCMSDH_SDMMC_INSTANCE), GFP_KERNEL); ++ if (!gInstance) ++ return -ENOMEM; ++ ++ error = sdio_register_driver(&bcmsdh_sdmmc_driver); ++ if (error && gInstance) { ++ kfree(gInstance); ++ gInstance = 0; ++ } ++ ++ return error; ++} ++ ++/* ++ * module cleanup ++*/ ++extern int bcmsdh_remove(struct device *dev); ++void sdio_function_cleanup(void) ++{ ++ AP6210_DEBUG("%s Enter\n", __FUNCTION__); ++ ++ ++ sdio_unregister_driver(&bcmsdh_sdmmc_driver); ++ ++ if (gInstance) ++ kfree(gInstance); ++} +diff --git a/drivers/net/wireless/ap6210/bcmutils.c b/drivers/net/wireless/ap6210/bcmutils.c +new file mode 100644 +index 0000000..631125a +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmutils.c +@@ -0,0 +1,2095 @@ ++/* ++ * Driver O/S-independent utility routines ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: bcmutils.c 312855 2012-02-04 02:01:18Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++#ifdef BCMDRIVER ++ ++#include ++#include ++ ++#else /* !BCMDRIVER */ ++ ++#include ++#include ++#include ++ ++#if defined(BCMEXTSUP) ++#include ++#endif ++ ++ ++#endif /* !BCMDRIVER */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++void *_bcmutils_dummy_fn = NULL; ++ ++#include ++ ++ ++#ifdef BCMDRIVER ++ ++ ++ ++/* copy a pkt buffer chain into a buffer */ ++uint ++pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf) ++{ ++ uint n, ret = 0; ++ ++ if (len < 0) ++ len = 4096; /* "infinite" */ ++ ++ /* skip 'offset' bytes */ ++ for (; p && offset; p = PKTNEXT(osh, p)) { ++ if (offset < (uint)PKTLEN(osh, p)) ++ break; ++ offset -= PKTLEN(osh, p); ++ } ++ ++ if (!p) ++ return 0; ++ ++ /* copy the data */ ++ for (; p && len; p = PKTNEXT(osh, p)) { ++ n = MIN((uint)PKTLEN(osh, p) - offset, (uint)len); ++ bcopy(PKTDATA(osh, p) + offset, buf, n); ++ buf += n; ++ len -= n; ++ ret += n; ++ offset = 0; ++ } ++ ++ return ret; ++} ++ ++/* copy a buffer into a pkt buffer chain */ ++uint ++pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf) ++{ ++ uint n, ret = 0; ++ ++ /* skip 'offset' bytes */ ++ for (; p && offset; p = PKTNEXT(osh, p)) { ++ if (offset < (uint)PKTLEN(osh, p)) ++ break; ++ offset -= PKTLEN(osh, p); ++ } ++ ++ if (!p) ++ return 0; ++ ++ /* copy the data */ ++ for (; p && len; p = PKTNEXT(osh, p)) { ++ n = MIN((uint)PKTLEN(osh, p) - offset, (uint)len); ++ bcopy(buf, PKTDATA(osh, p) + offset, n); ++ buf += n; ++ len -= n; ++ ret += n; ++ offset = 0; ++ } ++ ++ return ret; ++} ++ ++ ++ ++/* return total length of buffer chain */ ++uint BCMFASTPATH ++pkttotlen(osl_t *osh, void *p) ++{ ++ uint total; ++ int len; ++ ++ total = 0; ++ for (; p; p = PKTNEXT(osh, p)) { ++ len = PKTLEN(osh, p); ++ total += len; ++ } ++ ++ return (total); ++} ++ ++/* return the last buffer of chained pkt */ ++void * ++pktlast(osl_t *osh, void *p) ++{ ++ for (; PKTNEXT(osh, p); p = PKTNEXT(osh, p)) ++ ; ++ ++ return (p); ++} ++ ++/* count segments of a chained packet */ ++uint BCMFASTPATH ++pktsegcnt(osl_t *osh, void *p) ++{ ++ uint cnt; ++ ++ for (cnt = 0; p; p = PKTNEXT(osh, p)) ++ cnt++; ++ ++ return cnt; ++} ++ ++ ++/* count segments of a chained packet */ ++uint BCMFASTPATH ++pktsegcnt_war(osl_t *osh, void *p) ++{ ++ uint cnt; ++ uint8 *pktdata; ++ uint len, remain, align64; ++ ++ for (cnt = 0; p; p = PKTNEXT(osh, p)) { ++ cnt++; ++ len = PKTLEN(osh, p); ++ if (len > 128) { ++ pktdata = (uint8 *)PKTDATA(osh, p); /* starting address of data */ ++ /* Check for page boundary straddle (2048B) */ ++ if (((uintptr)pktdata & ~0x7ff) != ((uintptr)(pktdata+len) & ~0x7ff)) ++ cnt++; ++ ++ align64 = (uint)((uintptr)pktdata & 0x3f); /* aligned to 64B */ ++ align64 = (64 - align64) & 0x3f; ++ len -= align64; /* bytes from aligned 64B to end */ ++ /* if aligned to 128B, check for MOD 128 between 1 to 4B */ ++ remain = len % 128; ++ if (remain > 0 && remain <= 4) ++ cnt++; /* add extra seg */ ++ } ++ } ++ ++ return cnt; ++} ++ ++uint8 * BCMFASTPATH ++pktoffset(osl_t *osh, void *p, uint offset) ++{ ++ uint total = pkttotlen(osh, p); ++ uint pkt_off = 0, len = 0; ++ uint8 *pdata = (uint8 *) PKTDATA(osh, p); ++ ++ if (offset > total) ++ return NULL; ++ ++ for (; p; p = PKTNEXT(osh, p)) { ++ pdata = (uint8 *) PKTDATA(osh, p); ++ pkt_off = offset - len; ++ len += PKTLEN(osh, p); ++ if (len > offset) ++ break; ++ } ++ return (uint8*) (pdata+pkt_off); ++} ++ ++/* ++ * osl multiple-precedence packet queue ++ * hi_prec is always >= the number of the highest non-empty precedence ++ */ ++void * BCMFASTPATH ++pktq_penq(struct pktq *pq, int prec, void *p) ++{ ++ struct pktq_prec *q; ++ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ASSERT(PKTLINK(p) == NULL); /* queueing chains not allowed */ ++ ++ ASSERT(!pktq_full(pq)); ++ ASSERT(!pktq_pfull(pq, prec)); ++ ++ q = &pq->q[prec]; ++ ++ if (q->head) ++ PKTSETLINK(q->tail, p); ++ else ++ q->head = p; ++ ++ q->tail = p; ++ q->len++; ++ ++ pq->len++; ++ ++ if (pq->hi_prec < prec) ++ pq->hi_prec = (uint8)prec; ++ ++ return p; ++} ++ ++void * BCMFASTPATH ++pktq_penq_head(struct pktq *pq, int prec, void *p) ++{ ++ struct pktq_prec *q; ++ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ASSERT(PKTLINK(p) == NULL); /* queueing chains not allowed */ ++ ++ ASSERT(!pktq_full(pq)); ++ ASSERT(!pktq_pfull(pq, prec)); ++ ++ q = &pq->q[prec]; ++ ++ if (q->head == NULL) ++ q->tail = p; ++ ++ PKTSETLINK(p, q->head); ++ q->head = p; ++ q->len++; ++ ++ pq->len++; ++ ++ if (pq->hi_prec < prec) ++ pq->hi_prec = (uint8)prec; ++ ++ return p; ++} ++ ++void * BCMFASTPATH ++pktq_pdeq(struct pktq *pq, int prec) ++{ ++ struct pktq_prec *q; ++ void *p; ++ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ++ q = &pq->q[prec]; ++ ++ if ((p = q->head) == NULL) ++ return NULL; ++ ++ if ((q->head = PKTLINK(p)) == NULL) ++ q->tail = NULL; ++ ++ q->len--; ++ ++ pq->len--; ++ ++ PKTSETLINK(p, NULL); ++ ++ return p; ++} ++ ++void * BCMFASTPATH ++pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p) ++{ ++ struct pktq_prec *q; ++ void *p; ++ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ++ q = &pq->q[prec]; ++ ++ if (prev_p == NULL) ++ return NULL; ++ ++ if ((p = PKTLINK(prev_p)) == NULL) ++ return NULL; ++ ++ q->len--; ++ ++ pq->len--; ++ ++ PKTSETLINK(prev_p, PKTLINK(p)); ++ PKTSETLINK(p, NULL); ++ ++ return p; ++} ++ ++void * BCMFASTPATH ++pktq_pdeq_tail(struct pktq *pq, int prec) ++{ ++ struct pktq_prec *q; ++ void *p, *prev; ++ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ++ q = &pq->q[prec]; ++ ++ if ((p = q->head) == NULL) ++ return NULL; ++ ++ for (prev = NULL; p != q->tail; p = PKTLINK(p)) ++ prev = p; ++ ++ if (prev) ++ PKTSETLINK(prev, NULL); ++ else ++ q->head = NULL; ++ ++ q->tail = prev; ++ q->len--; ++ ++ pq->len--; ++ ++ return p; ++} ++ ++void ++pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir, ifpkt_cb_t fn, int arg) ++{ ++ struct pktq_prec *q; ++ void *p, *prev = NULL; ++ ++ q = &pq->q[prec]; ++ p = q->head; ++ while (p) { ++ if (fn == NULL || (*fn)(p, arg)) { ++ bool head = (p == q->head); ++ if (head) ++ q->head = PKTLINK(p); ++ else ++ PKTSETLINK(prev, PKTLINK(p)); ++ PKTSETLINK(p, NULL); ++ PKTFREE(osh, p, dir); ++ q->len--; ++ pq->len--; ++ p = (head ? q->head : PKTLINK(prev)); ++ } else { ++ prev = p; ++ p = PKTLINK(p); ++ } ++ } ++ ++ if (q->head == NULL) { ++ ASSERT(q->len == 0); ++ q->tail = NULL; ++ } ++} ++ ++bool BCMFASTPATH ++pktq_pdel(struct pktq *pq, void *pktbuf, int prec) ++{ ++ struct pktq_prec *q; ++ void *p; ++ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ++ if (!pktbuf) ++ return FALSE; ++ ++ q = &pq->q[prec]; ++ ++ if (q->head == pktbuf) { ++ if ((q->head = PKTLINK(pktbuf)) == NULL) ++ q->tail = NULL; ++ } else { ++ for (p = q->head; p && PKTLINK(p) != pktbuf; p = PKTLINK(p)) ++ ; ++ if (p == NULL) ++ return FALSE; ++ ++ PKTSETLINK(p, PKTLINK(pktbuf)); ++ if (q->tail == pktbuf) ++ q->tail = p; ++ } ++ ++ q->len--; ++ pq->len--; ++ PKTSETLINK(pktbuf, NULL); ++ return TRUE; ++} ++ ++void ++pktq_init(struct pktq *pq, int num_prec, int max_len) ++{ ++ int prec; ++ ++ ASSERT(num_prec > 0 && num_prec <= PKTQ_MAX_PREC); ++ ++ /* pq is variable size; only zero out what's requested */ ++ bzero(pq, OFFSETOF(struct pktq, q) + (sizeof(struct pktq_prec) * num_prec)); ++ ++ pq->num_prec = (uint16)num_prec; ++ ++ pq->max = (uint16)max_len; ++ ++ for (prec = 0; prec < num_prec; prec++) ++ pq->q[prec].max = pq->max; ++} ++ ++void ++pktq_set_max_plen(struct pktq *pq, int prec, int max_len) ++{ ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ++ if (prec < pq->num_prec) ++ pq->q[prec].max = (uint16)max_len; ++} ++ ++void * BCMFASTPATH ++pktq_deq(struct pktq *pq, int *prec_out) ++{ ++ struct pktq_prec *q; ++ void *p; ++ int prec; ++ ++ if (pq->len == 0) ++ return NULL; ++ ++ while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL) ++ pq->hi_prec--; ++ ++ q = &pq->q[prec]; ++ ++ if ((p = q->head) == NULL) ++ return NULL; ++ ++ if ((q->head = PKTLINK(p)) == NULL) ++ q->tail = NULL; ++ ++ q->len--; ++ ++ pq->len--; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ PKTSETLINK(p, NULL); ++ ++ return p; ++} ++ ++void * BCMFASTPATH ++pktq_deq_tail(struct pktq *pq, int *prec_out) ++{ ++ struct pktq_prec *q; ++ void *p, *prev; ++ int prec; ++ ++ if (pq->len == 0) ++ return NULL; ++ ++ for (prec = 0; prec < pq->hi_prec; prec++) ++ if (pq->q[prec].head) ++ break; ++ ++ q = &pq->q[prec]; ++ ++ if ((p = q->head) == NULL) ++ return NULL; ++ ++ for (prev = NULL; p != q->tail; p = PKTLINK(p)) ++ prev = p; ++ ++ if (prev) ++ PKTSETLINK(prev, NULL); ++ else ++ q->head = NULL; ++ ++ q->tail = prev; ++ q->len--; ++ ++ pq->len--; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ PKTSETLINK(p, NULL); ++ ++ return p; ++} ++ ++void * ++pktq_peek(struct pktq *pq, int *prec_out) ++{ ++ int prec; ++ ++ if (pq->len == 0) ++ return NULL; ++ ++ while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL) ++ pq->hi_prec--; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ return (pq->q[prec].head); ++} ++ ++void * ++pktq_peek_tail(struct pktq *pq, int *prec_out) ++{ ++ int prec; ++ ++ if (pq->len == 0) ++ return NULL; ++ ++ for (prec = 0; prec < pq->hi_prec; prec++) ++ if (pq->q[prec].head) ++ break; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ return (pq->q[prec].tail); ++} ++ ++void ++pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg) ++{ ++ int prec; ++ ++ /* Optimize flush, if pktq len = 0, just return. ++ * pktq len of 0 means pktq's prec q's are all empty. ++ */ ++ if (pq->len == 0) { ++ return; ++ } ++ ++ for (prec = 0; prec < pq->num_prec; prec++) ++ pktq_pflush(osh, pq, prec, dir, fn, arg); ++ if (fn == NULL) ++ ASSERT(pq->len == 0); ++} ++ ++/* Return sum of lengths of a specific set of precedences */ ++int ++pktq_mlen(struct pktq *pq, uint prec_bmp) ++{ ++ int prec, len; ++ ++ len = 0; ++ ++ for (prec = 0; prec <= pq->hi_prec; prec++) ++ if (prec_bmp & (1 << prec)) ++ len += pq->q[prec].len; ++ ++ return len; ++} ++ ++/* Priority peek from a specific set of precedences */ ++void * BCMFASTPATH ++pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out) ++{ ++ struct pktq_prec *q; ++ void *p; ++ int prec; ++ ++ if (pq->len == 0) ++ { ++ return NULL; ++ } ++ while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL) ++ pq->hi_prec--; ++ ++ while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL) ++ if (prec-- == 0) ++ return NULL; ++ ++ q = &pq->q[prec]; ++ ++ if ((p = q->head) == NULL) ++ return NULL; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ return p; ++} ++/* Priority dequeue from a specific set of precedences */ ++void * BCMFASTPATH ++pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out) ++{ ++ struct pktq_prec *q; ++ void *p; ++ int prec; ++ ++ if (pq->len == 0) ++ return NULL; ++ ++ while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL) ++ pq->hi_prec--; ++ ++ while ((pq->q[prec].head == NULL) || ((prec_bmp & (1 << prec)) == 0)) ++ if (prec-- == 0) ++ return NULL; ++ ++ q = &pq->q[prec]; ++ ++ if ((p = q->head) == NULL) ++ return NULL; ++ ++ if ((q->head = PKTLINK(p)) == NULL) ++ q->tail = NULL; ++ ++ q->len--; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ pq->len--; ++ ++ PKTSETLINK(p, NULL); ++ ++ return p; ++} ++ ++#endif /* BCMDRIVER */ ++ ++const unsigned char bcm_ctype[] = { ++ ++ _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C, /* 0-7 */ ++ _BCM_C, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C, ++ _BCM_C, /* 8-15 */ ++ _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C, /* 16-23 */ ++ _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C, /* 24-31 */ ++ _BCM_S|_BCM_SP,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P, /* 32-39 */ ++ _BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P, /* 40-47 */ ++ _BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D, /* 48-55 */ ++ _BCM_D,_BCM_D,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P, /* 56-63 */ ++ _BCM_P, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, ++ _BCM_U|_BCM_X, _BCM_U, /* 64-71 */ ++ _BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U, /* 72-79 */ ++ _BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U, /* 80-87 */ ++ _BCM_U,_BCM_U,_BCM_U,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P, /* 88-95 */ ++ _BCM_P, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, ++ _BCM_L|_BCM_X, _BCM_L, /* 96-103 */ ++ _BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L, /* 104-111 */ ++ _BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L, /* 112-119 */ ++ _BCM_L,_BCM_L,_BCM_L,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_C, /* 120-127 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128-143 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144-159 */ ++ _BCM_S|_BCM_SP, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, ++ _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, /* 160-175 */ ++ _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, ++ _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, /* 176-191 */ ++ _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, ++ _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, /* 192-207 */ ++ _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_P, _BCM_U, _BCM_U, _BCM_U, ++ _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_L, /* 208-223 */ ++ _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, ++ _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, /* 224-239 */ ++ _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_P, _BCM_L, _BCM_L, _BCM_L, ++ _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L /* 240-255 */ ++}; ++ ++ulong ++bcm_strtoul(const char *cp, char **endp, uint base) ++{ ++ ulong result, last_result = 0, value; ++ bool minus; ++ ++ minus = FALSE; ++ ++ while (bcm_isspace(*cp)) ++ cp++; ++ ++ if (cp[0] == '+') ++ cp++; ++ else if (cp[0] == '-') { ++ minus = TRUE; ++ cp++; ++ } ++ ++ if (base == 0) { ++ if (cp[0] == '0') { ++ if ((cp[1] == 'x') || (cp[1] == 'X')) { ++ base = 16; ++ cp = &cp[2]; ++ } else { ++ base = 8; ++ cp = &cp[1]; ++ } ++ } else ++ base = 10; ++ } else if (base == 16 && (cp[0] == '0') && ((cp[1] == 'x') || (cp[1] == 'X'))) { ++ cp = &cp[2]; ++ } ++ ++ result = 0; ++ ++ while (bcm_isxdigit(*cp) && ++ (value = bcm_isdigit(*cp) ? *cp-'0' : bcm_toupper(*cp)-'A'+10) < base) { ++ result = result*base + value; ++ /* Detected overflow */ ++ if (result < last_result && !minus) ++ return (ulong)-1; ++ last_result = result; ++ cp++; ++ } ++ ++ if (minus) ++ result = (ulong)(-(long)result); ++ ++ if (endp) ++ *endp = DISCARD_QUAL(cp, char); ++ ++ return (result); ++} ++ ++int ++bcm_atoi(const char *s) ++{ ++ return (int)bcm_strtoul(s, NULL, 10); ++} ++ ++/* return pointer to location of substring 'needle' in 'haystack' */ ++char * ++bcmstrstr(const char *haystack, const char *needle) ++{ ++ int len, nlen; ++ int i; ++ ++ if ((haystack == NULL) || (needle == NULL)) ++ return DISCARD_QUAL(haystack, char); ++ ++ nlen = strlen(needle); ++ len = strlen(haystack) - nlen + 1; ++ ++ for (i = 0; i < len; i++) ++ if (memcmp(needle, &haystack[i], nlen) == 0) ++ return DISCARD_QUAL(&haystack[i], char); ++ return (NULL); ++} ++ ++char * ++bcmstrcat(char *dest, const char *src) ++{ ++ char *p; ++ ++ p = dest + strlen(dest); ++ ++ while ((*p++ = *src++) != '\0') ++ ; ++ ++ return (dest); ++} ++ ++char * ++bcmstrncat(char *dest, const char *src, uint size) ++{ ++ char *endp; ++ char *p; ++ ++ p = dest + strlen(dest); ++ endp = p + size; ++ ++ while (p != endp && (*p++ = *src++) != '\0') ++ ; ++ ++ return (dest); ++} ++ ++ ++/**************************************************************************** ++* Function: bcmstrtok ++* ++* Purpose: ++* Tokenizes a string. This function is conceptually similiar to ANSI C strtok(), ++* but allows strToken() to be used by different strings or callers at the same ++* time. Each call modifies '*string' by substituting a NULL character for the ++* first delimiter that is encountered, and updates 'string' to point to the char ++* after the delimiter. Leading delimiters are skipped. ++* ++* Parameters: ++* string (mod) Ptr to string ptr, updated by token. ++* delimiters (in) Set of delimiter characters. ++* tokdelim (out) Character that delimits the returned token. (May ++* be set to NULL if token delimiter is not required). ++* ++* Returns: Pointer to the next token found. NULL when no more tokens are found. ++***************************************************************************** ++*/ ++char * ++bcmstrtok(char **string, const char *delimiters, char *tokdelim) ++{ ++ unsigned char *str; ++ unsigned long map[8]; ++ int count; ++ char *nextoken; ++ ++ if (tokdelim != NULL) { ++ /* Prime the token delimiter */ ++ *tokdelim = '\0'; ++ } ++ ++ /* Clear control map */ ++ for (count = 0; count < 8; count++) { ++ map[count] = 0; ++ } ++ ++ /* Set bits in delimiter table */ ++ do { ++ map[*delimiters >> 5] |= (1 << (*delimiters & 31)); ++ } ++ while (*delimiters++); ++ ++ str = (unsigned char*)*string; ++ ++ /* Find beginning of token (skip over leading delimiters). Note that ++ * there is no token iff this loop sets str to point to the terminal ++ * null (*str == '\0') ++ */ ++ while (((map[*str >> 5] & (1 << (*str & 31))) && *str) || (*str == ' ')) { ++ str++; ++ } ++ ++ nextoken = (char*)str; ++ ++ /* Find the end of the token. If it is not the end of the string, ++ * put a null there. ++ */ ++ for (; *str; str++) { ++ if (map[*str >> 5] & (1 << (*str & 31))) { ++ if (tokdelim != NULL) { ++ *tokdelim = *str; ++ } ++ ++ *str++ = '\0'; ++ break; ++ } ++ } ++ ++ *string = (char*)str; ++ ++ /* Determine if a token has been found. */ ++ if (nextoken == (char *) str) { ++ return NULL; ++ } ++ else { ++ return nextoken; ++ } ++} ++ ++ ++#define xToLower(C) \ ++ ((C >= 'A' && C <= 'Z') ? (char)((int)C - (int)'A' + (int)'a') : C) ++ ++ ++/**************************************************************************** ++* Function: bcmstricmp ++* ++* Purpose: Compare to strings case insensitively. ++* ++* Parameters: s1 (in) First string to compare. ++* s2 (in) Second string to compare. ++* ++* Returns: Return 0 if the two strings are equal, -1 if t1 < t2 and 1 if ++* t1 > t2, when ignoring case sensitivity. ++***************************************************************************** ++*/ ++int ++bcmstricmp(const char *s1, const char *s2) ++{ ++ char dc, sc; ++ ++ while (*s2 && *s1) { ++ dc = xToLower(*s1); ++ sc = xToLower(*s2); ++ if (dc < sc) return -1; ++ if (dc > sc) return 1; ++ s1++; ++ s2++; ++ } ++ ++ if (*s1 && !*s2) return 1; ++ if (!*s1 && *s2) return -1; ++ return 0; ++} ++ ++ ++/**************************************************************************** ++* Function: bcmstrnicmp ++* ++* Purpose: Compare to strings case insensitively, upto a max of 'cnt' ++* characters. ++* ++* Parameters: s1 (in) First string to compare. ++* s2 (in) Second string to compare. ++* cnt (in) Max characters to compare. ++* ++* Returns: Return 0 if the two strings are equal, -1 if t1 < t2 and 1 if ++* t1 > t2, when ignoring case sensitivity. ++***************************************************************************** ++*/ ++int ++bcmstrnicmp(const char* s1, const char* s2, int cnt) ++{ ++ char dc, sc; ++ ++ while (*s2 && *s1 && cnt) { ++ dc = xToLower(*s1); ++ sc = xToLower(*s2); ++ if (dc < sc) return -1; ++ if (dc > sc) return 1; ++ s1++; ++ s2++; ++ cnt--; ++ } ++ ++ if (!cnt) return 0; ++ if (*s1 && !*s2) return 1; ++ if (!*s1 && *s2) return -1; ++ return 0; ++} ++ ++/* parse a xx:xx:xx:xx:xx:xx format ethernet address */ ++int ++bcm_ether_atoe(const char *p, struct ether_addr *ea) ++{ ++ int i = 0; ++ char *ep; ++ ++ for (;;) { ++ ea->octet[i++] = (char) bcm_strtoul(p, &ep, 16); ++ p = ep; ++ if (!*p++ || i == 6) ++ break; ++ } ++ ++ return (i == 6); ++} ++ ++ ++#if defined(CONFIG_USBRNDIS_RETAIL) || defined(NDIS_MINIPORT_DRIVER) ++/* registry routine buffer preparation utility functions: ++ * parameter order is like strncpy, but returns count ++ * of bytes copied. Minimum bytes copied is null char(1)/wchar(2) ++ */ ++ulong ++wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen) ++{ ++ ulong copyct = 1; ++ ushort i; ++ ++ if (abuflen == 0) ++ return 0; ++ ++ /* wbuflen is in bytes */ ++ wbuflen /= sizeof(ushort); ++ ++ for (i = 0; i < wbuflen; ++i) { ++ if (--abuflen == 0) ++ break; ++ *abuf++ = (char) *wbuf++; ++ ++copyct; ++ } ++ *abuf = '\0'; ++ ++ return copyct; ++} ++#endif /* CONFIG_USBRNDIS_RETAIL || NDIS_MINIPORT_DRIVER */ ++ ++char * ++bcm_ether_ntoa(const struct ether_addr *ea, char *buf) ++{ ++ static const char hex[] = ++ { ++ '0', '1', '2', '3', '4', '5', '6', '7', ++ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ++ }; ++ const uint8 *octet = ea->octet; ++ char *p = buf; ++ int i; ++ ++ for (i = 0; i < 6; i++, octet++) { ++ *p++ = hex[(*octet >> 4) & 0xf]; ++ *p++ = hex[*octet & 0xf]; ++ *p++ = ':'; ++ } ++ ++ *(p-1) = '\0'; ++ ++ return (buf); ++} ++ ++char * ++bcm_ip_ntoa(struct ipv4_addr *ia, char *buf) ++{ ++ snprintf(buf, 16, "%d.%d.%d.%d", ++ ia->addr[0], ia->addr[1], ia->addr[2], ia->addr[3]); ++ return (buf); ++} ++ ++#ifdef BCMDRIVER ++ ++void ++bcm_mdelay(uint ms) ++{ ++ uint i; ++ ++ for (i = 0; i < ms; i++) { ++ OSL_DELAY(1000); ++ } ++} ++ ++ ++ ++ ++ ++#if defined(DHD_DEBUG) ++/* pretty hex print a pkt buffer chain */ ++void ++prpkt(const char *msg, osl_t *osh, void *p0) ++{ ++ void *p; ++ ++ if (msg && (msg[0] != '\0')) ++ AP6210_DEBUG("%s:\n", msg); ++ ++ for (p = p0; p; p = PKTNEXT(osh, p)) ++ prhex(NULL, PKTDATA(osh, p), PKTLEN(osh, p)); ++} ++#endif ++ ++/* Takes an Ethernet frame and sets out-of-bound PKTPRIO. ++ * Also updates the inplace vlan tag if requested. ++ * For debugging, it returns an indication of what it did. ++ */ ++uint BCMFASTPATH ++pktsetprio(void *pkt, bool update_vtag) ++{ ++ struct ether_header *eh; ++ struct ethervlan_header *evh; ++ uint8 *pktdata; ++ int priority = 0; ++ int rc = 0; ++ ++ pktdata = (uint8 *)PKTDATA(NULL, pkt); ++ ASSERT(ISALIGNED((uintptr)pktdata, sizeof(uint16))); ++ ++ eh = (struct ether_header *) pktdata; ++ ++ if (ntoh16(eh->ether_type) == ETHER_TYPE_8021Q) { ++ uint16 vlan_tag; ++ int vlan_prio, dscp_prio = 0; ++ ++ evh = (struct ethervlan_header *)eh; ++ ++ vlan_tag = ntoh16(evh->vlan_tag); ++ vlan_prio = (int) (vlan_tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK; ++ ++ if (ntoh16(evh->ether_type) == ETHER_TYPE_IP) { ++ uint8 *ip_body = pktdata + sizeof(struct ethervlan_header); ++ uint8 tos_tc = IP_TOS46(ip_body); ++ dscp_prio = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT); ++ } ++ ++ /* DSCP priority gets precedence over 802.1P (vlan tag) */ ++ if (dscp_prio != 0) { ++ priority = dscp_prio; ++ rc |= PKTPRIO_VDSCP; ++ } else { ++ priority = vlan_prio; ++ rc |= PKTPRIO_VLAN; ++ } ++ /* ++ * If the DSCP priority is not the same as the VLAN priority, ++ * then overwrite the priority field in the vlan tag, with the ++ * DSCP priority value. This is required for Linux APs because ++ * the VLAN driver on Linux, overwrites the skb->priority field ++ * with the priority value in the vlan tag ++ */ ++ if (update_vtag && (priority != vlan_prio)) { ++ vlan_tag &= ~(VLAN_PRI_MASK << VLAN_PRI_SHIFT); ++ vlan_tag |= (uint16)priority << VLAN_PRI_SHIFT; ++ evh->vlan_tag = hton16(vlan_tag); ++ rc |= PKTPRIO_UPD; ++ } ++ } else if (ntoh16(eh->ether_type) == ETHER_TYPE_IP) { ++ uint8 *ip_body = pktdata + sizeof(struct ether_header); ++ uint8 tos_tc = IP_TOS46(ip_body); ++ priority = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT); ++ rc |= PKTPRIO_DSCP; ++ } ++ ++ ASSERT(priority >= 0 && priority <= MAXPRIO); ++ PKTSETPRIO(pkt, priority); ++ return (rc | priority); ++} ++ ++ ++static char bcm_undeferrstr[32]; ++static const char *bcmerrorstrtable[] = BCMERRSTRINGTABLE; ++ ++/* Convert the error codes into related error strings */ ++const char * ++bcmerrorstr(int bcmerror) ++{ ++ /* check if someone added a bcmerror code but forgot to add errorstring */ ++ ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(bcmerrorstrtable) - 1)); ++ ++ if (bcmerror > 0 || bcmerror < BCME_LAST) { ++ snprintf(bcm_undeferrstr, sizeof(bcm_undeferrstr), "Undefined error %d", bcmerror); ++ return bcm_undeferrstr; ++ } ++ ++ ASSERT(strlen(bcmerrorstrtable[-bcmerror]) < BCME_STRLEN); ++ ++ return bcmerrorstrtable[-bcmerror]; ++} ++ ++ ++ ++/* iovar table lookup */ ++const bcm_iovar_t* ++bcm_iovar_lookup(const bcm_iovar_t *table, const char *name) ++{ ++ const bcm_iovar_t *vi; ++ const char *lookup_name; ++ ++ /* skip any ':' delimited option prefixes */ ++ lookup_name = strrchr(name, ':'); ++ if (lookup_name != NULL) ++ lookup_name++; ++ else ++ lookup_name = name; ++ ++ ASSERT(table != NULL); ++ ++ for (vi = table; vi->name; vi++) { ++ if (!strcmp(vi->name, lookup_name)) ++ return vi; ++ } ++ /* ran to end of table */ ++ ++ return NULL; /* var name not found */ ++} ++ ++int ++bcm_iovar_lencheck(const bcm_iovar_t *vi, void *arg, int len, bool set) ++{ ++ int bcmerror = 0; ++ ++ /* length check on io buf */ ++ switch (vi->type) { ++ case IOVT_BOOL: ++ case IOVT_INT8: ++ case IOVT_INT16: ++ case IOVT_INT32: ++ case IOVT_UINT8: ++ case IOVT_UINT16: ++ case IOVT_UINT32: ++ /* all integers are int32 sized args at the ioctl interface */ ++ if (len < (int)sizeof(int)) { ++ bcmerror = BCME_BUFTOOSHORT; ++ } ++ break; ++ ++ case IOVT_BUFFER: ++ /* buffer must meet minimum length requirement */ ++ if (len < vi->minlen) { ++ bcmerror = BCME_BUFTOOSHORT; ++ } ++ break; ++ ++ case IOVT_VOID: ++ if (!set) { ++ /* Cannot return nil... */ ++ bcmerror = BCME_UNSUPPORTED; ++ } else if (len) { ++ /* Set is an action w/o parameters */ ++ bcmerror = BCME_BUFTOOLONG; ++ } ++ break; ++ ++ default: ++ /* unknown type for length check in iovar info */ ++ ASSERT(0); ++ bcmerror = BCME_UNSUPPORTED; ++ } ++ ++ return bcmerror; ++} ++ ++#endif /* BCMDRIVER */ ++ ++ ++/******************************************************************************* ++ * crc8 ++ * ++ * Computes a crc8 over the input data using the polynomial: ++ * ++ * x^8 + x^7 +x^6 + x^4 + x^2 + 1 ++ * ++ * The caller provides the initial value (either CRC8_INIT_VALUE ++ * or the previous returned value) to allow for processing of ++ * discontiguous blocks of data. When generating the CRC the ++ * caller is responsible for complementing the final return value ++ * and inserting it into the byte stream. When checking, a final ++ * return value of CRC8_GOOD_VALUE indicates a valid CRC. ++ * ++ * Reference: Dallas Semiconductor Application Note 27 ++ * Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms", ++ * ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd., ++ * ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt ++ * ++ * **************************************************************************** ++ */ ++ ++static const uint8 crc8_table[256] = { ++ 0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B, ++ 0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21, ++ 0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF, ++ 0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5, ++ 0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14, ++ 0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E, ++ 0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80, ++ 0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA, ++ 0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95, ++ 0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF, ++ 0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01, ++ 0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B, ++ 0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA, ++ 0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0, ++ 0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E, ++ 0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34, ++ 0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0, ++ 0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A, ++ 0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54, ++ 0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E, ++ 0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF, ++ 0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5, ++ 0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B, ++ 0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61, ++ 0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E, ++ 0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74, ++ 0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA, ++ 0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0, ++ 0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41, ++ 0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B, ++ 0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5, ++ 0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F ++}; ++ ++#define CRC_INNER_LOOP(n, c, x) \ ++ (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff] ++ ++uint8 ++hndcrc8( ++ uint8 *pdata, /* pointer to array of data to process */ ++ uint nbytes, /* number of input data bytes to process */ ++ uint8 crc /* either CRC8_INIT_VALUE or previous return value */ ++) ++{ ++ /* hard code the crc loop instead of using CRC_INNER_LOOP macro ++ * to avoid the undefined and unnecessary (uint8 >> 8) operation. ++ */ ++ while (nbytes-- > 0) ++ crc = crc8_table[(crc ^ *pdata++) & 0xff]; ++ ++ return crc; ++} ++ ++/******************************************************************************* ++ * crc16 ++ * ++ * Computes a crc16 over the input data using the polynomial: ++ * ++ * x^16 + x^12 +x^5 + 1 ++ * ++ * The caller provides the initial value (either CRC16_INIT_VALUE ++ * or the previous returned value) to allow for processing of ++ * discontiguous blocks of data. When generating the CRC the ++ * caller is responsible for complementing the final return value ++ * and inserting it into the byte stream. When checking, a final ++ * return value of CRC16_GOOD_VALUE indicates a valid CRC. ++ * ++ * Reference: Dallas Semiconductor Application Note 27 ++ * Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms", ++ * ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd., ++ * ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt ++ * ++ * **************************************************************************** ++ */ ++ ++static const uint16 crc16_table[256] = { ++ 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, ++ 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, ++ 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, ++ 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, ++ 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, ++ 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, ++ 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, ++ 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, ++ 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, ++ 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, ++ 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, ++ 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, ++ 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, ++ 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, ++ 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, ++ 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, ++ 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, ++ 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, ++ 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, ++ 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, ++ 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, ++ 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, ++ 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, ++ 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, ++ 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, ++ 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, ++ 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, ++ 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, ++ 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, ++ 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, ++ 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, ++ 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78 ++}; ++ ++uint16 ++hndcrc16( ++ uint8 *pdata, /* pointer to array of data to process */ ++ uint nbytes, /* number of input data bytes to process */ ++ uint16 crc /* either CRC16_INIT_VALUE or previous return value */ ++) ++{ ++ while (nbytes-- > 0) ++ CRC_INNER_LOOP(16, crc, *pdata++); ++ return crc; ++} ++ ++static const uint32 crc32_table[256] = { ++ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, ++ 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, ++ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, ++ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, ++ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, ++ 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, ++ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, ++ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, ++ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, ++ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, ++ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, ++ 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, ++ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, ++ 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, ++ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, ++ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, ++ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, ++ 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, ++ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, ++ 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, ++ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, ++ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, ++ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, ++ 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, ++ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, ++ 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, ++ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, ++ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, ++ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, ++ 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, ++ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, ++ 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, ++ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, ++ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, ++ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, ++ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, ++ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, ++ 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, ++ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, ++ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, ++ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, ++ 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, ++ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, ++ 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, ++ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, ++ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, ++ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, ++ 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, ++ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, ++ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, ++ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, ++ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, ++ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, ++ 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, ++ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, ++ 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, ++ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, ++ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, ++ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, ++ 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, ++ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, ++ 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, ++ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, ++ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D ++}; ++ ++/* ++ * crc input is CRC32_INIT_VALUE for a fresh start, or previous return value if ++ * accumulating over multiple pieces. ++ */ ++uint32 ++hndcrc32(uint8 *pdata, uint nbytes, uint32 crc) ++{ ++ uint8 *pend; ++ pend = pdata + nbytes; ++ while (pdata < pend) ++ CRC_INNER_LOOP(32, crc, *pdata++); ++ ++ return crc; ++} ++ ++#ifdef notdef ++#define CLEN 1499 /* CRC Length */ ++#define CBUFSIZ (CLEN+4) ++#define CNBUFS 5 /* # of bufs */ ++ ++void ++testcrc32(void) ++{ ++ uint j, k, l; ++ uint8 *buf; ++ uint len[CNBUFS]; ++ uint32 crcr; ++ uint32 crc32tv[CNBUFS] = ++ {0xd2cb1faa, 0xd385c8fa, 0xf5b4f3f3, 0x55789e20, 0x00343110}; ++ ++ ASSERT((buf = MALLOC(CBUFSIZ*CNBUFS)) != NULL); ++ ++ /* step through all possible alignments */ ++ for (l = 0; l <= 4; l++) { ++ for (j = 0; j < CNBUFS; j++) { ++ len[j] = CLEN; ++ for (k = 0; k < len[j]; k++) ++ *(buf + j*CBUFSIZ + (k+l)) = (j+k) & 0xff; ++ } ++ ++ for (j = 0; j < CNBUFS; j++) { ++ crcr = crc32(buf + j*CBUFSIZ + l, len[j], CRC32_INIT_VALUE); ++ ASSERT(crcr == crc32tv[j]); ++ } ++ } ++ ++ MFREE(buf, CBUFSIZ*CNBUFS); ++ return; ++} ++#endif /* notdef */ ++ ++/* ++ * Advance from the current 1-byte tag/1-byte length/variable-length value ++ * triple, to the next, returning a pointer to the next. ++ * If the current or next TLV is invalid (does not fit in given buffer length), ++ * NULL is returned. ++ * *buflen is not modified if the TLV elt parameter is invalid, or is decremented ++ * by the TLV parameter's length if it is valid. ++ */ ++bcm_tlv_t * ++bcm_next_tlv(bcm_tlv_t *elt, int *buflen) ++{ ++ int len; ++ ++ /* validate current elt */ ++ if (!bcm_valid_tlv(elt, *buflen)) ++ return NULL; ++ ++ /* advance to next elt */ ++ len = elt->len; ++ elt = (bcm_tlv_t*)(elt->data + len); ++ *buflen -= (TLV_HDR_LEN + len); ++ ++ /* validate next elt */ ++ if (!bcm_valid_tlv(elt, *buflen)) ++ return NULL; ++ ++ return elt; ++} ++ ++/* ++ * Traverse a string of 1-byte tag/1-byte length/variable-length value ++ * triples, returning a pointer to the substring whose first element ++ * matches tag ++ */ ++bcm_tlv_t * ++bcm_parse_tlvs(void *buf, int buflen, uint key) ++{ ++ bcm_tlv_t *elt; ++ int totlen; ++ ++ elt = (bcm_tlv_t*)buf; ++ totlen = buflen; ++ ++ /* find tagged parameter */ ++ while (totlen >= TLV_HDR_LEN) { ++ int len = elt->len; ++ ++ /* validate remaining totlen */ ++ if ((elt->id == key) && ++ (totlen >= (len + TLV_HDR_LEN))) ++ return (elt); ++ ++ elt = (bcm_tlv_t*)((uint8*)elt + (len + TLV_HDR_LEN)); ++ totlen -= (len + TLV_HDR_LEN); ++ } ++ ++ return NULL; ++} ++ ++/* ++ * Traverse a string of 1-byte tag/1-byte length/variable-length value ++ * triples, returning a pointer to the substring whose first element ++ * matches tag. Stop parsing when we see an element whose ID is greater ++ * than the target key. ++ */ ++bcm_tlv_t * ++bcm_parse_ordered_tlvs(void *buf, int buflen, uint key) ++{ ++ bcm_tlv_t *elt; ++ int totlen; ++ ++ elt = (bcm_tlv_t*)buf; ++ totlen = buflen; ++ ++ /* find tagged parameter */ ++ while (totlen >= TLV_HDR_LEN) { ++ uint id = elt->id; ++ int len = elt->len; ++ ++ /* Punt if we start seeing IDs > than target key */ ++ if (id > key) ++ return (NULL); ++ ++ /* validate remaining totlen */ ++ if ((id == key) && ++ (totlen >= (len + TLV_HDR_LEN))) ++ return (elt); ++ ++ elt = (bcm_tlv_t*)((uint8*)elt + (len + TLV_HDR_LEN)); ++ totlen -= (len + TLV_HDR_LEN); ++ } ++ return NULL; ++} ++ ++#if defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || defined(WLMSG_ASSOC) || \ ++ defined(DHD_DEBUG) ++int ++bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len) ++{ ++ int i; ++ char* p = buf; ++ char hexstr[16]; ++ int slen = 0, nlen = 0; ++ uint32 bit; ++ const char* name; ++ ++ if (len < 2 || !buf) ++ return 0; ++ ++ buf[0] = '\0'; ++ ++ for (i = 0; flags != 0; i++) { ++ bit = bd[i].bit; ++ name = bd[i].name; ++ if (bit == 0 && flags != 0) { ++ /* print any unnamed bits */ ++ snprintf(hexstr, 16, "0x%X", flags); ++ name = hexstr; ++ flags = 0; /* exit loop */ ++ } else if ((flags & bit) == 0) ++ continue; ++ flags &= ~bit; ++ nlen = strlen(name); ++ slen += nlen; ++ /* count btwn flag space */ ++ if (flags != 0) ++ slen += 1; ++ /* need NULL char as well */ ++ if (len <= slen) ++ break; ++ /* copy NULL char but don't count it */ ++ strncpy(p, name, nlen + 1); ++ p += nlen; ++ /* copy btwn flag space and NULL char */ ++ if (flags != 0) ++ p += snprintf(p, 2, " "); ++ } ++ ++ /* indicate the str was too short */ ++ if (flags != 0) { ++ if (len < 2) ++ p -= 2 - len; /* overwrite last char */ ++ p += snprintf(p, 2, ">"); ++ } ++ ++ return (int)(p - buf); ++} ++ ++/* print bytes formatted as hex to a string. return the resulting string length */ ++int ++bcm_format_hex(char *str, const void *bytes, int len) ++{ ++ int i; ++ char *p = str; ++ const uint8 *src = (const uint8*)bytes; ++ ++ for (i = 0; i < len; i++) { ++ p += snprintf(p, 3, "%02X", *src); ++ src++; ++ } ++ return (int)(p - str); ++} ++#endif ++ ++/* pretty hex print a contiguous buffer */ ++void ++prhex(const char *msg, uchar *buf, uint nbytes) ++{ ++ char line[128], *p; ++ int len = sizeof(line); ++ int nchar; ++ uint i; ++ ++ if (msg && (msg[0] != '\0')) ++ AP6210_DEBUG("%s:\n", msg); ++ ++ p = line; ++ for (i = 0; i < nbytes; i++) { ++ if (i % 16 == 0) { ++ nchar = snprintf(p, len, " %04d: ", i); /* line prefix */ ++ p += nchar; ++ len -= nchar; ++ } ++ if (len > 0) { ++ nchar = snprintf(p, len, "%02x ", buf[i]); ++ p += nchar; ++ len -= nchar; ++ } ++ ++ if (i % 16 == 15) { ++ AP6210_DEBUG("%s\n", line); /* flush line */ ++ p = line; ++ len = sizeof(line); ++ } ++ } ++ ++ /* flush last partial line */ ++ if (p != line) ++ AP6210_DUMP("%s\n", line); ++} ++ ++static const char *crypto_algo_names[] = { ++ "NONE", ++ "WEP1", ++ "TKIP", ++ "WEP128", ++ "AES_CCM", ++ "AES_OCB_MSDU", ++ "AES_OCB_MPDU", ++ "NALG" ++ "UNDEF", ++ "UNDEF", ++ "UNDEF", ++#ifdef BCMWAPI_WPI ++ "WAPI", ++#endif /* BCMWAPI_WPI */ ++ "UNDEF" ++}; ++ ++const char * ++bcm_crypto_algo_name(uint algo) ++{ ++ return (algo < ARRAYSIZE(crypto_algo_names)) ? crypto_algo_names[algo] : "ERR"; ++} ++ ++ ++char * ++bcm_chipname(uint chipid, char *buf, uint len) ++{ ++ const char *fmt; ++ ++ fmt = ((chipid > 0xa000) || (chipid < 0x4000)) ? "%d" : "%x"; ++ snprintf(buf, len, fmt, chipid); ++ return buf; ++} ++ ++/* Produce a human-readable string for boardrev */ ++char * ++bcm_brev_str(uint32 brev, char *buf) ++{ ++ if (brev < 0x100) ++ snprintf(buf, 8, "%d.%d", (brev & 0xf0) >> 4, brev & 0xf); ++ else ++ snprintf(buf, 8, "%c%03x", ((brev & 0xf000) == 0x1000) ? 'P' : 'A', brev & 0xfff); ++ ++ return (buf); ++} ++ ++#define BUFSIZE_TODUMP_ATONCE 512 /* Buffer size */ ++ ++/* dump large strings to console */ ++void ++printbig(char *buf) ++{ ++ uint len, max_len; ++ char c; ++ ++ len = strlen(buf); ++ ++ max_len = BUFSIZE_TODUMP_ATONCE; ++ ++ while (len > max_len) { ++ c = buf[max_len]; ++ buf[max_len] = '\0'; ++ AP6210_DUMP("%s", buf); ++ buf[max_len] = c; ++ ++ buf += max_len; ++ len -= max_len; ++ } ++ /* print the remaining string */ ++ AP6210_DUMP("%s\n", buf); ++ return; ++} ++ ++/* routine to dump fields in a fileddesc structure */ ++uint ++bcmdumpfields(bcmutl_rdreg_rtn read_rtn, void *arg0, uint arg1, struct fielddesc *fielddesc_array, ++ char *buf, uint32 bufsize) ++{ ++ uint filled_len; ++ int len; ++ struct fielddesc *cur_ptr; ++ ++ filled_len = 0; ++ cur_ptr = fielddesc_array; ++ ++ while (bufsize > 1) { ++ if (cur_ptr->nameandfmt == NULL) ++ break; ++ len = snprintf(buf, bufsize, cur_ptr->nameandfmt, ++ read_rtn(arg0, arg1, cur_ptr->offset)); ++ /* check for snprintf overflow or error */ ++ if (len < 0 || (uint32)len >= bufsize) ++ len = bufsize - 1; ++ buf += len; ++ bufsize -= len; ++ filled_len += len; ++ cur_ptr++; ++ } ++ return filled_len; ++} ++ ++uint ++bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint buflen) ++{ ++ uint len; ++ ++ len = strlen(name) + 1; ++ ++ if ((len + datalen) > buflen) ++ return 0; ++ ++ strncpy(buf, name, buflen); ++ ++ /* append data onto the end of the name string */ ++ memcpy(&buf[len], data, datalen); ++ len += datalen; ++ ++ return len; ++} ++ ++/* Quarter dBm units to mW ++ * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153 ++ * Table is offset so the last entry is largest mW value that fits in ++ * a uint16. ++ */ ++ ++#define QDBM_OFFSET 153 /* Offset for first entry */ ++#define QDBM_TABLE_LEN 40 /* Table size */ ++ ++/* Smallest mW value that will round up to the first table entry, QDBM_OFFSET. ++ * Value is ( mW(QDBM_OFFSET - 1) + mW(QDBM_OFFSET) ) / 2 ++ */ ++#define QDBM_TABLE_LOW_BOUND 6493 /* Low bound */ ++ ++/* Largest mW value that will round down to the last table entry, ++ * QDBM_OFFSET + QDBM_TABLE_LEN-1. ++ * Value is ( mW(QDBM_OFFSET + QDBM_TABLE_LEN - 1) + mW(QDBM_OFFSET + QDBM_TABLE_LEN) ) / 2. ++ */ ++#define QDBM_TABLE_HIGH_BOUND 64938 /* High bound */ ++ ++static const uint16 nqdBm_to_mW_map[QDBM_TABLE_LEN] = { ++/* qdBm: +0 +1 +2 +3 +4 +5 +6 +7 */ ++/* 153: */ 6683, 7079, 7499, 7943, 8414, 8913, 9441, 10000, ++/* 161: */ 10593, 11220, 11885, 12589, 13335, 14125, 14962, 15849, ++/* 169: */ 16788, 17783, 18836, 19953, 21135, 22387, 23714, 25119, ++/* 177: */ 26607, 28184, 29854, 31623, 33497, 35481, 37584, 39811, ++/* 185: */ 42170, 44668, 47315, 50119, 53088, 56234, 59566, 63096 ++}; ++ ++uint16 ++bcm_qdbm_to_mw(uint8 qdbm) ++{ ++ uint factor = 1; ++ int idx = qdbm - QDBM_OFFSET; ++ ++ if (idx >= QDBM_TABLE_LEN) { ++ /* clamp to max uint16 mW value */ ++ return 0xFFFF; ++ } ++ ++ /* scale the qdBm index up to the range of the table 0-40 ++ * where an offset of 40 qdBm equals a factor of 10 mW. ++ */ ++ while (idx < 0) { ++ idx += 40; ++ factor *= 10; ++ } ++ ++ /* return the mW value scaled down to the correct factor of 10, ++ * adding in factor/2 to get proper rounding. ++ */ ++ return ((nqdBm_to_mW_map[idx] + factor/2) / factor); ++} ++ ++uint8 ++bcm_mw_to_qdbm(uint16 mw) ++{ ++ uint8 qdbm; ++ int offset; ++ uint mw_uint = mw; ++ uint boundary; ++ ++ /* handle boundary case */ ++ if (mw_uint <= 1) ++ return 0; ++ ++ offset = QDBM_OFFSET; ++ ++ /* move mw into the range of the table */ ++ while (mw_uint < QDBM_TABLE_LOW_BOUND) { ++ mw_uint *= 10; ++ offset -= 40; ++ } ++ ++ for (qdbm = 0; qdbm < QDBM_TABLE_LEN-1; qdbm++) { ++ boundary = nqdBm_to_mW_map[qdbm] + (nqdBm_to_mW_map[qdbm+1] - ++ nqdBm_to_mW_map[qdbm])/2; ++ if (mw_uint < boundary) break; ++ } ++ ++ qdbm += (uint8)offset; ++ ++ return (qdbm); ++} ++ ++ ++uint ++bcm_bitcount(uint8 *bitmap, uint length) ++{ ++ uint bitcount = 0, i; ++ uint8 tmp; ++ for (i = 0; i < length; i++) { ++ tmp = bitmap[i]; ++ while (tmp) { ++ bitcount++; ++ tmp &= (tmp - 1); ++ } ++ } ++ return bitcount; ++} ++ ++#ifdef BCMDRIVER ++ ++/* Initialization of bcmstrbuf structure */ ++void ++bcm_binit(struct bcmstrbuf *b, char *buf, uint size) ++{ ++ b->origsize = b->size = size; ++ b->origbuf = b->buf = buf; ++} ++ ++/* Buffer sprintf wrapper to guard against buffer overflow */ ++int ++bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...) ++{ ++ va_list ap; ++ int r; ++ ++ va_start(ap, fmt); ++ ++ r = vsnprintf(b->buf, b->size, fmt, ap); ++ ++ /* Non Ansi C99 compliant returns -1, ++ * Ansi compliant return r >= b->size, ++ * bcmstdlib returns 0, handle all ++ */ ++ /* r == 0 is also the case when strlen(fmt) is zero. ++ * typically the case when "" is passed as argument. ++ */ ++ if ((r == -1) || (r >= (int)b->size)) { ++ b->size = 0; ++ } else { ++ b->size -= r; ++ b->buf += r; ++ } ++ ++ va_end(ap); ++ ++ return r; ++} ++ ++void ++bcm_bprhex(struct bcmstrbuf *b, const char *msg, bool newline, uint8 *buf, int len) ++{ ++ int i; ++ ++ if (msg != NULL && msg[0] != '\0') ++ bcm_bprintf(b, "%s", msg); ++ for (i = 0; i < len; i ++) ++ bcm_bprintf(b, "%02X", buf[i]); ++ if (newline) ++ bcm_bprintf(b, "\n"); ++} ++ ++void ++bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount) ++{ ++ int i; ++ ++ for (i = 0; i < num_bytes; i++) { ++ num[i] += amount; ++ if (num[i] >= amount) ++ break; ++ amount = 1; ++ } ++} ++ ++int ++bcm_cmp_bytes(const uchar *arg1, const uchar *arg2, uint8 nbytes) ++{ ++ int i; ++ ++ for (i = nbytes - 1; i >= 0; i--) { ++ if (arg1[i] != arg2[i]) ++ return (arg1[i] - arg2[i]); ++ } ++ return 0; ++} ++ ++void ++bcm_print_bytes(const char *name, const uchar *data, int len) ++{ ++ int i; ++ int per_line = 0; ++ ++ AP6210_DEBUG("%s: %d \n", name ? name : "", len); ++ for (i = 0; i < len; i++) { ++ AP6210_DUMP("%02x ", *data++); ++ per_line++; ++ if (per_line == 16) { ++ per_line = 0; ++ AP6210_DUMP("\n"); ++ } ++ } ++ AP6210_DUMP("\n"); ++} ++#if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \ ++ defined(WLMSG_PRPKT) || defined(WLMSG_WSEC) ++#define SSID_FMT_BUF_LEN ((4 * DOT11_MAX_SSID_LEN) + 1) ++ ++int ++bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len) ++{ ++ uint i, c; ++ char *p = buf; ++ char *endp = buf + SSID_FMT_BUF_LEN; ++ ++ if (ssid_len > DOT11_MAX_SSID_LEN) ssid_len = DOT11_MAX_SSID_LEN; ++ ++ for (i = 0; i < ssid_len; i++) { ++ c = (uint)ssid[i]; ++ if (c == '\\') { ++ *p++ = '\\'; ++ *p++ = '\\'; ++ } else if (bcm_isprint((uchar)c)) { ++ *p++ = (char)c; ++ } else { ++ p += snprintf(p, (endp - p), "\\x%02X", c); ++ } ++ } ++ *p = '\0'; ++ ASSERT(p < endp); ++ ++ return (int)(p - buf); ++} ++#endif ++ ++#endif /* BCMDRIVER */ ++ ++/* ++ * ProcessVars:Takes a buffer of "=\n" lines read from a file and ending in a NUL. ++ * also accepts nvram files which are already in the format of =\0\=\0 ++ * Removes carriage returns, empty lines, comment lines, and converts newlines to NULs. ++ * Shortens buffer as needed and pads with NULs. End of buffer is marked by two NULs. ++*/ ++ ++unsigned int ++process_nvram_vars(char *varbuf, unsigned int len) ++{ ++ char *dp; ++ bool findNewline; ++ int column; ++ unsigned int buf_len, n; ++ unsigned int pad = 0; ++ ++ dp = varbuf; ++ ++ findNewline = FALSE; ++ column = 0; ++ ++ for (n = 0; n < len; n++) { ++ if (varbuf[n] == '\r') ++ continue; ++ if (findNewline && varbuf[n] != '\n') ++ continue; ++ findNewline = FALSE; ++ if (varbuf[n] == '#') { ++ findNewline = TRUE; ++ continue; ++ } ++ if (varbuf[n] == '\n') { ++ if (column == 0) ++ continue; ++ *dp++ = 0; ++ column = 0; ++ continue; ++ } ++ *dp++ = varbuf[n]; ++ column++; ++ } ++ buf_len = (unsigned int)(dp - varbuf); ++ if (buf_len % 4) { ++ pad = 4 - buf_len % 4; ++ if (pad && (buf_len + pad <= len)) { ++ buf_len += pad; ++ } ++ } ++ ++ while (dp < varbuf + n) ++ *dp++ = 0; ++ ++ return buf_len; ++} +diff --git a/drivers/net/wireless/ap6210/bcmwifi_channels.c b/drivers/net/wireless/ap6210/bcmwifi_channels.c +new file mode 100644 +index 0000000..6b5b0a3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/bcmwifi_channels.c +@@ -0,0 +1,1179 @@ ++/* ++ * Misc utility routines used by kernel or app-level. ++ * Contents are wifi-specific, used by any kernel or app-level ++ * software that might want wifi things as it grows. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: bcmwifi_channels.c 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#include ++#include ++ ++#ifdef BCMDRIVER ++#include ++#include ++#define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base)) ++#define tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c)) ++#else ++#include ++#include ++#include ++#ifndef ASSERT ++#define ASSERT(exp) ++#endif ++#endif /* BCMDRIVER */ ++ ++#ifdef _bcmwifi_c_ ++/* temporary for transitional compatibility */ ++#include ++#else ++#include ++#endif ++ ++#if defined(WIN32) && (defined(BCMDLL) || defined(WLMDLL)) ++#include /* For wl/exe/GNUmakefile.brcm_wlu and GNUmakefile.wlm_dll */ ++#endif ++ ++#ifndef D11AC_IOTYPES ++ ++/* Definitions for legacy Chanspec type */ ++ ++/* Chanspec ASCII representation: ++ * ++ * digit [AB] [N] [UL] ++ * ++ * : channel number of the 10MHz or 20MHz channel, ++ * or control sideband channel of 40MHz channel. ++ * : A for 5GHz, B for 2.4GHz ++ * : N for 10MHz, nothing for 20MHz or 40MHz ++ * (ctl-sideband spec implies 40MHz) ++ * : U for upper, L for lower ++ * ++ * may be omitted on input, and will be assumed to be ++ * 2.4GHz if channel number <= 14. ++ * ++ * Examples: ++ * 8 -> 2.4GHz channel 8, 20MHz ++ * 8b -> 2.4GHz channel 8, 20MHz ++ * 8l -> 2.4GHz channel 8, 40MHz, lower ctl sideband ++ * 8a -> 5GHz channel 8 (low 5 GHz band), 20MHz ++ * 36 -> 5GHz channel 36, 20MHz ++ * 36l -> 5GHz channel 36, 40MHz, lower ctl sideband ++ * 40u -> 5GHz channel 40, 40MHz, upper ctl sideband ++ * 180n -> channel 180, 10MHz ++ */ ++ ++ ++/* given a chanspec and a string buffer, format the chanspec as a ++ * string, and return the original pointer a. ++ * Min buffer length must be CHANSPEC_STR_LEN. ++ * On error return NULL ++ */ ++char * ++wf_chspec_ntoa(chanspec_t chspec, char *buf) ++{ ++ const char *band, *bw, *sb; ++ uint channel; ++ ++ band = ""; ++ bw = ""; ++ sb = ""; ++ channel = CHSPEC_CHANNEL(chspec); ++ /* check for non-default band spec */ ++ if ((CHSPEC_IS2G(chspec) && channel > CH_MAX_2G_CHANNEL) || ++ (CHSPEC_IS5G(chspec) && channel <= CH_MAX_2G_CHANNEL)) ++ band = (CHSPEC_IS2G(chspec)) ? "b" : "a"; ++ if (CHSPEC_IS40(chspec)) { ++ if (CHSPEC_SB_UPPER(chspec)) { ++ sb = "u"; ++ channel += CH_10MHZ_APART; ++ } else { ++ sb = "l"; ++ channel -= CH_10MHZ_APART; ++ } ++ } else if (CHSPEC_IS10(chspec)) { ++ bw = "n"; ++ } ++ ++ /* Outputs a max of 6 chars including '\0' */ ++ snprintf(buf, 6, "%d%s%s%s", channel, band, bw, sb); ++ return (buf); ++} ++ ++/* given a chanspec string, convert to a chanspec. ++ * On error return 0 ++ */ ++chanspec_t ++wf_chspec_aton(const char *a) ++{ ++ char *endp = NULL; ++ uint channel, band, bw, ctl_sb; ++ char c; ++ ++ channel = strtoul(a, &endp, 10); ++ ++ /* check for no digits parsed */ ++ if (endp == a) ++ return 0; ++ ++ if (channel > MAXCHANNEL) ++ return 0; ++ ++ band = ((channel <= CH_MAX_2G_CHANNEL) ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G); ++ bw = WL_CHANSPEC_BW_20; ++ ctl_sb = WL_CHANSPEC_CTL_SB_NONE; ++ ++ a = endp; ++ ++ c = tolower(a[0]); ++ if (c == '\0') ++ goto done; ++ ++ /* parse the optional ['A' | 'B'] band spec */ ++ if (c == 'a' || c == 'b') { ++ band = (c == 'a') ? WL_CHANSPEC_BAND_5G : WL_CHANSPEC_BAND_2G; ++ a++; ++ c = tolower(a[0]); ++ if (c == '\0') ++ goto done; ++ } ++ ++ /* parse bandwidth 'N' (10MHz) or 40MHz ctl sideband ['L' | 'U'] */ ++ if (c == 'n') { ++ bw = WL_CHANSPEC_BW_10; ++ } else if (c == 'l') { ++ bw = WL_CHANSPEC_BW_40; ++ ctl_sb = WL_CHANSPEC_CTL_SB_LOWER; ++ /* adjust channel to center of 40MHz band */ ++ if (channel <= (MAXCHANNEL - CH_20MHZ_APART)) ++ channel += CH_10MHZ_APART; ++ else ++ return 0; ++ } else if (c == 'u') { ++ bw = WL_CHANSPEC_BW_40; ++ ctl_sb = WL_CHANSPEC_CTL_SB_UPPER; ++ /* adjust channel to center of 40MHz band */ ++ if (channel > CH_20MHZ_APART) ++ channel -= CH_10MHZ_APART; ++ else ++ return 0; ++ } else { ++ return 0; ++ } ++ ++done: ++ return (channel | band | bw | ctl_sb); ++} ++ ++/* ++ * Verify the chanspec is using a legal set of parameters, i.e. that the ++ * chanspec specified a band, bw, ctl_sb and channel and that the ++ * combination could be legal given any set of circumstances. ++ * RETURNS: TRUE is the chanspec is malformed, false if it looks good. ++ */ ++bool ++wf_chspec_malformed(chanspec_t chanspec) ++{ ++ /* must be 2G or 5G band */ ++ if (!CHSPEC_IS5G(chanspec) && !CHSPEC_IS2G(chanspec)) ++ return TRUE; ++ /* must be 20 or 40 bandwidth */ ++ if (!CHSPEC_IS40(chanspec) && !CHSPEC_IS20(chanspec)) ++ return TRUE; ++ ++ /* 20MHZ b/w must have no ctl sb, 40 must have a ctl sb */ ++ if (CHSPEC_IS20(chanspec)) { ++ if (!CHSPEC_SB_NONE(chanspec)) ++ return TRUE; ++ } else { ++ if (!CHSPEC_SB_UPPER(chanspec) && !CHSPEC_SB_LOWER(chanspec)) ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++/* ++ * This function returns the channel number that control traffic is being sent on, for legacy ++ * channels this is just the channel number, for 40MHZ channels it is the upper or lower 20MHZ ++ * sideband depending on the chanspec selected ++ */ ++uint8 ++wf_chspec_ctlchan(chanspec_t chspec) ++{ ++ uint8 ctl_chan; ++ ++ /* Is there a sideband ? */ ++ if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_NONE) { ++ return CHSPEC_CHANNEL(chspec); ++ } else { ++ /* we only support 40MHZ with sidebands */ ++ ASSERT(CHSPEC_BW(chspec) == WL_CHANSPEC_BW_40); ++ /* chanspec channel holds the centre frequency, use that and the ++ * side band information to reconstruct the control channel number ++ */ ++ if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_UPPER) { ++ /* control chan is the upper 20 MHZ SB of the 40MHZ channel */ ++ ctl_chan = UPPER_20_SB(CHSPEC_CHANNEL(chspec)); ++ } else { ++ ASSERT(CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_LOWER); ++ /* control chan is the lower 20 MHZ SB of the 40MHZ channel */ ++ ctl_chan = LOWER_20_SB(CHSPEC_CHANNEL(chspec)); ++ } ++ } ++ ++ return ctl_chan; ++} ++ ++chanspec_t ++wf_chspec_ctlchspec(chanspec_t chspec) ++{ ++ chanspec_t ctl_chspec = 0; ++ uint8 channel; ++ ++ ASSERT(!wf_chspec_malformed(chspec)); ++ ++ /* Is there a sideband ? */ ++ if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_NONE) { ++ return chspec; ++ } else { ++ if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_UPPER) { ++ channel = UPPER_20_SB(CHSPEC_CHANNEL(chspec)); ++ } else { ++ channel = LOWER_20_SB(CHSPEC_CHANNEL(chspec)); ++ } ++ ctl_chspec = channel | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE; ++ ctl_chspec |= CHSPEC_BAND(chspec); ++ } ++ return ctl_chspec; ++} ++ ++#else /* D11AC_IOTYPES */ ++ ++/* Definitions for D11AC capable Chanspec type */ ++ ++/* Chanspec ASCII representation with 802.11ac capability: ++ * [ 'g'] ['/' []['/'<1st80channel>'-'<2nd80channel>]] ++ * ++ * : ++ * (optional) 2, 3, 4, 5 for 2.4GHz, 3GHz, 4GHz, and 5GHz respectively. ++ * Default value is 2g if channel <= 14, otherwise 5g. ++ * : ++ * channel number of the 5MHz, 10MHz, 20MHz channel, ++ * or primary channel of 40MHz, 80MHz, 160MHz, or 80+80MHz channel. ++ * : ++ * (optional) 5, 10, 20, 40, 80, 160, or 80+80. Default value is 20. ++ * : ++ * (only for 2.4GHz band 40MHz) U for upper sideband primary, L for lower. ++ * ++ * For 2.4GHz band 40MHz channels, the same primary channel may be the ++ * upper sideband for one 40MHz channel, and the lower sideband for an ++ * overlapping 40MHz channel. The U/L disambiguates which 40MHz channel ++ * is being specified. ++ * ++ * For 40MHz in the 5GHz band and all channel bandwidths greater than ++ * 40MHz, the U/L specificaion is not allowed since the channels are ++ * non-overlapping and the primary sub-band is derived from its ++ * position in the wide bandwidth channel. ++ * ++ * <1st80Channel>: ++ * <2nd80Channel>: ++ * Required for 80+80, otherwise not allowed. ++ * Specifies the center channel of the first and second 80MHz band. ++ * ++ * In its simplest form, it is a 20MHz channel number, with the implied band ++ * of 2.4GHz if channel number <= 14, and 5GHz otherwise. ++ * ++ * To allow for backward compatibility with scripts, the old form for ++ * 40MHz channels is also allowed: ++ * ++ * : ++ * primary channel of 40MHz, channel <= 14 is 2GHz, otherwise 5GHz ++ * : ++ * "U" for upper, "L" for lower (or lower case "u" "l") ++ * ++ * 5 GHz Examples: ++ * Chanspec BW Center Ch Channel Range Primary Ch ++ * 5g8 20MHz 8 - - ++ * 52 20MHz 52 - - ++ * 52/40 40MHz 54 52-56 52 ++ * 56/40 40MHz 54 52-56 56 ++ * 52/80 80MHz 58 52-64 52 ++ * 56/80 80MHz 58 52-64 56 ++ * 60/80 80MHz 58 52-64 60 ++ * 64/80 80MHz 58 52-64 64 ++ * 52/160 160MHz 50 36-64 52 ++ * 36/160 160MGz 50 36-64 36 ++ * 36/80+80/42-106 80+80MHz 42,106 36-48,100-112 36 ++ * ++ * 2 GHz Examples: ++ * Chanspec BW Center Ch Channel Range Primary Ch ++ * 2g8 20MHz 8 - - ++ * 8 20MHz 8 - - ++ * 6 20MHz 6 - - ++ * 6/40l 40MHz 8 6-10 6 ++ * 6l 40MHz 8 6-10 6 ++ * 6/40u 40MHz 4 2-6 6 ++ * 6u 40MHz 4 2-6 6 ++ */ ++ ++/* bandwidth ASCII string */ ++static const char *wf_chspec_bw_str[] = ++{ ++ "5", ++ "10", ++ "20", ++ "40", ++ "80", ++ "160", ++ "80+80", ++ "na" ++}; ++ ++static const uint8 wf_chspec_bw_mhz[] = ++{5, 10, 20, 40, 80, 160, 160}; ++ ++#define WF_NUM_BW \ ++ (sizeof(wf_chspec_bw_mhz)/sizeof(uint8)) ++ ++/* 40MHz channels in 5GHz band */ ++static const uint8 wf_5g_40m_chans[] = ++{38, 46, 54, 62, 102, 110, 118, 126, 134, 142, 151, 159}; ++#define WF_NUM_5G_40M_CHANS \ ++ (sizeof(wf_5g_40m_chans)/sizeof(uint8)) ++ ++/* 80MHz channels in 5GHz band */ ++static const uint8 wf_5g_80m_chans[] = ++{42, 58, 106, 122, 138, 155}; ++#define WF_NUM_5G_80M_CHANS \ ++ (sizeof(wf_5g_80m_chans)/sizeof(uint8)) ++ ++/* 160MHz channels in 5GHz band */ ++static const uint8 wf_5g_160m_chans[] = ++{50, 114}; ++#define WF_NUM_5G_160M_CHANS \ ++ (sizeof(wf_5g_160m_chans)/sizeof(uint8)) ++ ++ ++/* convert bandwidth from chanspec to MHz */ ++static uint ++bw_chspec_to_mhz(chanspec_t chspec) ++{ ++ uint bw; ++ ++ bw = (chspec & WL_CHANSPEC_BW_MASK) >> WL_CHANSPEC_BW_SHIFT; ++ return (bw >= WF_NUM_BW ? 0 : wf_chspec_bw_mhz[bw]); ++} ++ ++/* bw in MHz, return the channel count from the center channel to the ++ * the channel at the edge of the band ++ */ ++static uint8 ++center_chan_to_edge(uint bw) ++{ ++ /* edge channels separated by BW - 10MHz on each side ++ * delta from cf to edge is half of that, ++ * MHz to channel num conversion is 5MHz/channel ++ */ ++ return (uint8)(((bw - 20) / 2) / 5); ++} ++ ++/* return channel number of the low edge of the band ++ * given the center channel and BW ++ */ ++static uint8 ++channel_low_edge(uint center_ch, uint bw) ++{ ++ return (uint8)(center_ch - center_chan_to_edge(bw)); ++} ++ ++/* return side band number given center channel and control channel ++ * return -1 on error ++ */ ++static int ++channel_to_sb(uint center_ch, uint ctl_ch, uint bw) ++{ ++ uint lowest = channel_low_edge(center_ch, bw); ++ uint sb; ++ ++ if ((ctl_ch - lowest) % 4) { ++ /* bad ctl channel, not mult 4 */ ++ return -1; ++ } ++ ++ sb = ((ctl_ch - lowest) / 4); ++ ++ /* sb must be a index to a 20MHz channel in range */ ++ if (sb >= (bw / 20)) { ++ /* ctl_ch must have been too high for the center_ch */ ++ return -1; ++ } ++ ++ return sb; ++} ++ ++/* return control channel given center channel and side band */ ++static uint8 ++channel_to_ctl_chan(uint center_ch, uint bw, uint sb) ++{ ++ return (uint8)(channel_low_edge(center_ch, bw) + sb * 4); ++} ++ ++/* return index of 80MHz channel from channel number ++ * return -1 on error ++ */ ++static int ++channel_80mhz_to_id(uint ch) ++{ ++ uint i; ++ for (i = 0; i < WF_NUM_5G_80M_CHANS; i ++) { ++ if (ch == wf_5g_80m_chans[i]) ++ return i; ++ } ++ ++ return -1; ++} ++ ++/* given a chanspec and a string buffer, format the chanspec as a ++ * string, and return the original pointer a. ++ * Min buffer length must be CHANSPEC_STR_LEN. ++ * On error return NULL ++ */ ++char * ++wf_chspec_ntoa(chanspec_t chspec, char *buf) ++{ ++ const char *band; ++ uint ctl_chan; ++ ++ if (wf_chspec_malformed(chspec)) ++ return NULL; ++ ++ band = ""; ++ ++ /* check for non-default band spec */ ++ if ((CHSPEC_IS2G(chspec) && CHSPEC_CHANNEL(chspec) > CH_MAX_2G_CHANNEL) || ++ (CHSPEC_IS5G(chspec) && CHSPEC_CHANNEL(chspec) <= CH_MAX_2G_CHANNEL)) ++ band = (CHSPEC_IS2G(chspec)) ? "2g" : "5g"; ++ ++ /* ctl channel */ ++ ctl_chan = wf_chspec_ctlchan(chspec); ++ ++ /* bandwidth and ctl sideband */ ++ if (CHSPEC_IS20(chspec)) { ++ snprintf(buf, CHANSPEC_STR_LEN, "%s%d", band, ctl_chan); ++ } else if (!CHSPEC_IS8080(chspec)) { ++ const char *bw; ++ const char *sb = ""; ++ ++ bw = wf_chspec_bw_str[(chspec & WL_CHANSPEC_BW_MASK) >> WL_CHANSPEC_BW_SHIFT]; ++ ++#ifdef CHANSPEC_NEW_40MHZ_FORMAT ++ /* ctl sideband string if needed for 2g 40MHz */ ++ if (CHSPEC_IS40(chspec) && CHSPEC_IS2G(chspec)) { ++ sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; ++ } ++ ++ snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s%s", band, ctl_chan, bw, sb); ++#else ++ /* ctl sideband string instead of BW for 40MHz */ ++ if (CHSPEC_IS40(chspec)) { ++ sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; ++ snprintf(buf, CHANSPEC_STR_LEN, "%s%d%s", band, ctl_chan, sb); ++ } else { ++ snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s", band, ctl_chan, bw); ++ } ++#endif /* CHANSPEC_NEW_40MHZ_FORMAT */ ++ ++ } else { ++ /* 80+80 */ ++ uint chan1 = (chspec & WL_CHANSPEC_CHAN1_MASK) >> WL_CHANSPEC_CHAN1_SHIFT; ++ uint chan2 = (chspec & WL_CHANSPEC_CHAN2_MASK) >> WL_CHANSPEC_CHAN2_SHIFT; ++ ++ /* convert to channel number */ ++ chan1 = (chan1 < WF_NUM_5G_80M_CHANS) ? wf_5g_80m_chans[chan1] : 0; ++ chan2 = (chan2 < WF_NUM_5G_80M_CHANS) ? wf_5g_80m_chans[chan2] : 0; ++ ++ /* Outputs a max of CHANSPEC_STR_LEN chars including '\0' */ ++ snprintf(buf, CHANSPEC_STR_LEN, "%d/80+80/%d-%d", ctl_chan, chan1, chan2); ++ } ++ ++ return (buf); ++} ++ ++static int ++read_uint(const char **p, unsigned int *num) ++{ ++ unsigned long val; ++ char *endp = NULL; ++ ++ val = strtoul(*p, &endp, 10); ++ /* if endp is the initial pointer value, then a number was not read */ ++ if (endp == *p) ++ return 0; ++ ++ /* advance the buffer pointer to the end of the integer string */ ++ *p = endp; ++ /* return the parsed integer */ ++ *num = (unsigned int)val; ++ ++ return 1; ++} ++ ++/* given a chanspec string, convert to a chanspec. ++ * On error return 0 ++ */ ++chanspec_t ++wf_chspec_aton(const char *a) ++{ ++ chanspec_t chspec; ++ uint chspec_ch, chspec_band, bw, chspec_bw, chspec_sb; ++ uint num, ctl_ch; ++ uint ch1, ch2; ++ char c, sb_ul = '\0'; ++ int i; ++ ++ bw = 20; ++ chspec_sb = 0; ++ chspec_ch = ch1 = ch2 = 0; ++ ++ /* parse channel num or band */ ++ if (!read_uint(&a, &num)) ++ return 0; ++ ++ /* if we are looking at a 'g', then the first number was a band */ ++ c = tolower(a[0]); ++ if (c == 'g') { ++ a ++; /* consume the char */ ++ ++ /* band must be "2" or "5" */ ++ if (num == 2) ++ chspec_band = WL_CHANSPEC_BAND_2G; ++ else if (num == 5) ++ chspec_band = WL_CHANSPEC_BAND_5G; ++ else ++ return 0; ++ ++ /* read the channel number */ ++ if (!read_uint(&a, &ctl_ch)) ++ return 0; ++ ++ c = tolower(a[0]); ++ } ++ else { ++ /* first number is channel, use default for band */ ++ ctl_ch = num; ++ chspec_band = ((ctl_ch <= CH_MAX_2G_CHANNEL) ? ++ WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G); ++ } ++ ++ if (c == '\0') { ++ /* default BW of 20MHz */ ++ chspec_bw = WL_CHANSPEC_BW_20; ++ goto done_read; ++ } ++ ++ a ++; /* consume the 'u','l', or '/' */ ++ ++ /* check 'u'/'l' */ ++ if (c == 'u' || c == 'l') { ++ sb_ul = c; ++ chspec_bw = WL_CHANSPEC_BW_40; ++ goto done_read; ++ } ++ ++ /* next letter must be '/' */ ++ if (c != '/') ++ return 0; ++ ++ /* read bandwidth */ ++ if (!read_uint(&a, &bw)) ++ return 0; ++ ++ /* convert to chspec value */ ++ if (bw == 20) { ++ chspec_bw = WL_CHANSPEC_BW_20; ++ } else if (bw == 40) { ++ chspec_bw = WL_CHANSPEC_BW_40; ++ } else if (bw == 80) { ++ chspec_bw = WL_CHANSPEC_BW_80; ++ } else if (bw == 160) { ++ chspec_bw = WL_CHANSPEC_BW_160; ++ } else { ++ return 0; ++ } ++ ++ /* So far we have g/ ++ * Can now be followed by u/l if bw = 40, ++ * or '+80' if bw = 80, to make '80+80' bw. ++ */ ++ ++ c = tolower(a[0]); ++ ++ /* if we have a 2g/40 channel, we should have a l/u spec now */ ++ if (chspec_band == WL_CHANSPEC_BAND_2G && bw == 40) { ++ if (c == 'u' || c == 'l') { ++ a ++; /* consume the u/l char */ ++ sb_ul = c; ++ goto done_read; ++ } ++ } ++ ++ /* check for 80+80 */ ++ if (c == '+') { ++ /* 80+80 */ ++ static const char *plus80 = "80/"; ++ ++ /* must be looking at '+80/' ++ * check and consume this string. ++ */ ++ chspec_bw = WL_CHANSPEC_BW_8080; ++ ++ a ++; /* consume the char '+' */ ++ ++ /* consume the '80/' string */ ++ for (i = 0; i < 3; i++) { ++ if (*a++ != *plus80++) { ++ return 0; ++ } ++ } ++ ++ /* read primary 80MHz channel */ ++ if (!read_uint(&a, &ch1)) ++ return 0; ++ ++ /* must followed by '-' */ ++ if (a[0] != '-') ++ return 0; ++ a ++; /* consume the char */ ++ ++ /* read secondary 80MHz channel */ ++ if (!read_uint(&a, &ch2)) ++ return 0; ++ } ++ ++done_read: ++ /* skip trailing white space */ ++ while (a[0] == ' ') { ++ a ++; ++ } ++ ++ /* must be end of string */ ++ if (a[0] != '\0') ++ return 0; ++ ++ /* Now have all the chanspec string parts read; ++ * chspec_band, ctl_ch, chspec_bw, sb_ul, ch1, ch2. ++ * chspec_band and chspec_bw are chanspec values. ++ * Need to convert ctl_ch, sb_ul, and ch1,ch2 into ++ * a center channel (or two) and sideband. ++ */ ++ ++ /* if a sb u/l string was given, just use that, ++ * guaranteed to be bw = 40 by sting parse. ++ */ ++ if (sb_ul != '\0') { ++ if (sb_ul == 'l') { ++ chspec_ch = UPPER_20_SB(ctl_ch); ++ chspec_sb = WL_CHANSPEC_CTL_SB_LLL; ++ } else if (sb_ul == 'u') { ++ chspec_ch = LOWER_20_SB(ctl_ch); ++ chspec_sb = WL_CHANSPEC_CTL_SB_LLU; ++ } ++ } ++ /* if the bw is 20, center and sideband are trivial */ ++ else if (chspec_bw == WL_CHANSPEC_BW_20) { ++ chspec_ch = ctl_ch; ++ chspec_sb = 0; ++ } ++ /* if the bw is 40/80/160, not 80+80, a single method ++ * can be used to to find the center and sideband ++ */ ++ else if (chspec_bw != WL_CHANSPEC_BW_8080) { ++ /* figure out ctl sideband based on ctl channel and bandwidth */ ++ const uint8 *center_ch = NULL; ++ int num_ch = 0; ++ int sb = -1; ++ ++ if (chspec_bw == WL_CHANSPEC_BW_40) { ++ center_ch = wf_5g_40m_chans; ++ num_ch = WF_NUM_5G_40M_CHANS; ++ } else if (chspec_bw == WL_CHANSPEC_BW_80) { ++ center_ch = wf_5g_80m_chans; ++ num_ch = WF_NUM_5G_80M_CHANS; ++ } else if (chspec_bw == WL_CHANSPEC_BW_160) { ++ center_ch = wf_5g_160m_chans; ++ num_ch = WF_NUM_5G_160M_CHANS; ++ } else { ++ return 0; ++ } ++ ++ for (i = 0; i < num_ch; i ++) { ++ sb = channel_to_sb(center_ch[i], ctl_ch, bw); ++ if (sb >= 0) { ++ chspec_ch = center_ch[i]; ++ chspec_sb = sb << WL_CHANSPEC_CTL_SB_SHIFT; ++ break; ++ } ++ } ++ ++ /* check for no matching sb/center */ ++ if (sb < 0) { ++ return 0; ++ } ++ } ++ /* Otherwise, bw is 80+80. Figure out channel pair and sb */ ++ else { ++ int ch1_id = 0, ch2_id = 0; ++ int sb; ++ ++ ch1_id = channel_80mhz_to_id(ch1); ++ ch2_id = channel_80mhz_to_id(ch2); ++ ++ /* validate channels */ ++ if (ch1 >= ch2 || ch1_id < 0 || ch2_id < 0) ++ return 0; ++ ++ /* combined channel in chspec */ ++ chspec_ch = (((uint16)ch1_id << WL_CHANSPEC_CHAN1_SHIFT) | ++ ((uint16)ch2_id << WL_CHANSPEC_CHAN2_SHIFT)); ++ ++ /* figure out ctl sideband */ ++ ++ /* does the primary channel fit with the 1st 80MHz channel ? */ ++ sb = channel_to_sb(ch1, ctl_ch, bw); ++ if (sb < 0) { ++ /* no, so does the primary channel fit with the 2nd 80MHz channel ? */ ++ sb = channel_to_sb(ch2, ctl_ch, bw); ++ if (sb < 0) { ++ /* no match for ctl_ch to either 80MHz center channel */ ++ return 0; ++ } ++ /* sb index is 0-3 for the low 80MHz channel, and 4-7 for ++ * the high 80MHz channel. Add 4 to to shift to high set. ++ */ ++ sb += 4; ++ } ++ ++ chspec_sb = sb << WL_CHANSPEC_CTL_SB_SHIFT; ++ } ++ ++ chspec = (chspec_ch | chspec_band | chspec_bw | chspec_sb); ++ ++ if (wf_chspec_malformed(chspec)) ++ return 0; ++ ++ return chspec; ++} ++ ++/* ++ * Verify the chanspec is using a legal set of parameters, i.e. that the ++ * chanspec specified a band, bw, ctl_sb and channel and that the ++ * combination could be legal given any set of circumstances. ++ * RETURNS: TRUE is the chanspec is malformed, false if it looks good. ++ */ ++bool ++wf_chspec_malformed(chanspec_t chanspec) ++{ ++ uint chspec_bw = CHSPEC_BW(chanspec); ++ uint chspec_ch = CHSPEC_CHANNEL(chanspec); ++ ++ /* must be 2G or 5G band */ ++ if (CHSPEC_IS2G(chanspec)) { ++ /* must be valid bandwidth */ ++ if (chspec_bw != WL_CHANSPEC_BW_20 && ++ chspec_bw != WL_CHANSPEC_BW_40) { ++ return TRUE; ++ } ++ } else if (CHSPEC_IS5G(chanspec)) { ++ if (chspec_bw == WL_CHANSPEC_BW_8080) { ++ uint ch1_id, ch2_id; ++ ++ /* channel number in 80+80 must be in range */ ++ ch1_id = CHSPEC_CHAN1(chanspec); ++ ch2_id = CHSPEC_CHAN2(chanspec); ++ if (ch1_id >= WF_NUM_5G_80M_CHANS || ch2_id >= WF_NUM_5G_80M_CHANS) ++ return TRUE; ++ ++ /* ch2 must be above ch1 for the chanspec */ ++ if (ch2_id <= ch1_id) ++ return TRUE; ++ } else if (chspec_bw == WL_CHANSPEC_BW_20 || chspec_bw == WL_CHANSPEC_BW_40 || ++ chspec_bw == WL_CHANSPEC_BW_80 || chspec_bw == WL_CHANSPEC_BW_160) { ++ ++ if (chspec_ch > MAXCHANNEL) { ++ return TRUE; ++ } ++ } else { ++ /* invalid bandwidth */ ++ return TRUE; ++ } ++ } else { ++ /* must be 2G or 5G band */ ++ return TRUE; ++ } ++ ++ /* side band needs to be consistent with bandwidth */ ++ if (chspec_bw == WL_CHANSPEC_BW_20) { ++ if (CHSPEC_CTL_SB(chanspec) != WL_CHANSPEC_CTL_SB_LLL) ++ return TRUE; ++ } else if (chspec_bw == WL_CHANSPEC_BW_40) { ++ if (CHSPEC_CTL_SB(chanspec) > WL_CHANSPEC_CTL_SB_LLU) ++ return TRUE; ++ } else if (chspec_bw == WL_CHANSPEC_BW_80) { ++ if (CHSPEC_CTL_SB(chanspec) > WL_CHANSPEC_CTL_SB_LUU) ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++/* ++ * Verify the chanspec specifies a valid channel according to 802.11. ++ * RETURNS: TRUE if the chanspec is a valid 802.11 channel ++ */ ++bool ++wf_chspec_valid(chanspec_t chanspec) ++{ ++ uint chspec_bw = CHSPEC_BW(chanspec); ++ uint chspec_ch = CHSPEC_CHANNEL(chanspec); ++ ++ if (wf_chspec_malformed(chanspec)) ++ return FALSE; ++ ++ if (CHSPEC_IS2G(chanspec)) { ++ /* must be valid bandwidth and channel range */ ++ if (chspec_bw == WL_CHANSPEC_BW_20) { ++ if (chspec_ch >= 1 && chspec_ch <= 14) ++ return TRUE; ++ } else if (chspec_bw == WL_CHANSPEC_BW_40) { ++ if (chspec_ch >= 3 && chspec_ch <= 11) ++ return TRUE; ++ } ++ } else if (CHSPEC_IS5G(chanspec)) { ++ if (chspec_bw == WL_CHANSPEC_BW_8080) { ++ uint16 ch1, ch2; ++ ++ ch1 = wf_5g_80m_chans[CHSPEC_CHAN1(chanspec)]; ++ ch2 = wf_5g_80m_chans[CHSPEC_CHAN2(chanspec)]; ++ ++ /* the two channels must be separated by more than 80MHz by VHT req, ++ * and ch2 above ch1 for the chanspec ++ */ ++ if (ch2 > ch1 + CH_80MHZ_APART) ++ return TRUE; ++ } else { ++ const uint8 *center_ch; ++ uint num_ch, i; ++ ++ if (chspec_bw == WL_CHANSPEC_BW_20 || chspec_bw == WL_CHANSPEC_BW_40) { ++ center_ch = wf_5g_40m_chans; ++ num_ch = WF_NUM_5G_40M_CHANS; ++ } else if (chspec_bw == WL_CHANSPEC_BW_80) { ++ center_ch = wf_5g_80m_chans; ++ num_ch = WF_NUM_5G_80M_CHANS; ++ } else if (chspec_bw == WL_CHANSPEC_BW_160) { ++ center_ch = wf_5g_160m_chans; ++ num_ch = WF_NUM_5G_160M_CHANS; ++ } else { ++ /* invalid bandwidth */ ++ return FALSE; ++ } ++ ++ /* check for a valid center channel */ ++ if (chspec_bw == WL_CHANSPEC_BW_20) { ++ /* We don't have an array of legal 20MHz 5G channels, but they are ++ * each side of the legal 40MHz channels. Check the chanspec ++ * channel against either side of the 40MHz channels. ++ */ ++ for (i = 0; i < num_ch; i ++) { ++ if (chspec_ch == (uint)LOWER_20_SB(center_ch[i]) || ++ chspec_ch == (uint)UPPER_20_SB(center_ch[i])) ++ break; /* match found */ ++ } ++ ++ if (i == num_ch) { ++ /* check for legacy JP channels on failure */ ++ if (chspec_ch == 34 || chspec_ch == 38 || ++ chspec_ch == 42 || chspec_ch == 46) ++ i = 0; ++ } ++ } else { ++ /* check the chanspec channel to each legal channel */ ++ for (i = 0; i < num_ch; i ++) { ++ if (chspec_ch == center_ch[i]) ++ break; /* match found */ ++ } ++ } ++ ++ if (i < num_ch) { ++ /* match found */ ++ return TRUE; ++ } ++ } ++ } ++ ++ return FALSE; ++} ++ ++/* ++ * This function returns the channel number that control traffic is being sent on, for 20MHz ++ * channels this is just the channel number, for 40MHZ, 80MHz, 160MHz channels it is the 20MHZ ++ * sideband depending on the chanspec selected ++ */ ++uint8 ++wf_chspec_ctlchan(chanspec_t chspec) ++{ ++ uint center_chan; ++ uint bw_mhz; ++ uint sb; ++ ++ ASSERT(!wf_chspec_malformed(chspec)); ++ ++ /* Is there a sideband ? */ ++ if (CHSPEC_IS20(chspec)) { ++ return CHSPEC_CHANNEL(chspec); ++ } else { ++ sb = CHSPEC_CTL_SB(chspec) >> WL_CHANSPEC_CTL_SB_SHIFT; ++ ++ if (CHSPEC_IS8080(chspec)) { ++ bw_mhz = 80; ++ ++ if (sb < 4) { ++ center_chan = CHSPEC_CHAN1(chspec); ++ } ++ else { ++ center_chan = CHSPEC_CHAN2(chspec); ++ sb -= 4; ++ } ++ ++ /* convert from channel index to channel number */ ++ center_chan = wf_5g_80m_chans[center_chan]; ++ } ++ else { ++ bw_mhz = bw_chspec_to_mhz(chspec); ++ center_chan = CHSPEC_CHANNEL(chspec) >> WL_CHANSPEC_CHAN_SHIFT; ++ } ++ ++ return (channel_to_ctl_chan(center_chan, bw_mhz, sb)); ++ } ++} ++ ++/* ++ * This function returns the chanspec of the control channel of a given chanspec ++ */ ++chanspec_t ++wf_chspec_ctlchspec(chanspec_t chspec) ++{ ++ chanspec_t ctl_chspec = chspec; ++ uint8 ctl_chan; ++ ++ ASSERT(!wf_chspec_malformed(chspec)); ++ ++ /* Is there a sideband ? */ ++ if (!CHSPEC_IS20(chspec)) { ++ ctl_chan = wf_chspec_ctlchan(chspec); ++ ctl_chspec = ctl_chan | WL_CHANSPEC_BW_20; ++ ctl_chspec |= CHSPEC_BAND(chspec); ++ } ++ return ctl_chspec; ++} ++ ++/* return chanspec given control channel and bandwidth ++ * return 0 on error ++ */ ++uint16 ++wf_channel2chspec(uint ctl_ch, uint bw) ++{ ++ uint16 chspec; ++ const uint8 *center_ch = NULL; ++ int num_ch = 0; ++ int sb = -1; ++ int i = 0; ++ ++ chspec = ((ctl_ch <= CH_MAX_2G_CHANNEL) ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G); ++ ++ chspec |= bw; ++ ++ if (bw == WL_CHANSPEC_BW_40) { ++ center_ch = wf_5g_40m_chans; ++ num_ch = WF_NUM_5G_40M_CHANS; ++ bw = 40; ++ } else if (bw == WL_CHANSPEC_BW_80) { ++ center_ch = wf_5g_80m_chans; ++ num_ch = WF_NUM_5G_80M_CHANS; ++ bw = 80; ++ } else if (bw == WL_CHANSPEC_BW_160) { ++ center_ch = wf_5g_160m_chans; ++ num_ch = WF_NUM_5G_160M_CHANS; ++ bw = 160; ++ } else if (bw == WL_CHANSPEC_BW_20) { ++ chspec |= ctl_ch; ++ return chspec; ++ } else { ++ return 0; ++ } ++ ++ for (i = 0; i < num_ch; i ++) { ++ sb = channel_to_sb(center_ch[i], ctl_ch, bw); ++ if (sb >= 0) { ++ chspec |= center_ch[i]; ++ chspec |= (sb << WL_CHANSPEC_CTL_SB_SHIFT); ++ break; ++ } ++ } ++ ++ /* check for no matching sb/center */ ++ if (sb < 0) { ++ return 0; ++ } ++ ++ return chspec; ++} ++#endif /* D11AC_IOTYPES */ ++ ++/* ++ * This function returns the chanspec for the primary 40MHz of an 80MHz channel. ++ * The control sideband specifies the same 20MHz channel that the 80MHz channel is using ++ * as the primary 20MHz channel. ++ */ ++extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec) ++{ ++ chanspec_t chspec40 = chspec; ++ uint center_chan; ++ uint sb; ++ ++ ASSERT(!wf_chspec_malformed(chspec)); ++ ++ if (CHSPEC_IS80(chspec)) { ++ center_chan = CHSPEC_CHANNEL(chspec); ++ sb = CHSPEC_CTL_SB(chspec); ++ ++ if (sb == WL_CHANSPEC_CTL_SB_UL) { ++ /* Primary 40MHz is on upper side */ ++ sb = WL_CHANSPEC_CTL_SB_L; ++ center_chan += CH_20MHZ_APART; ++ } else if (sb == WL_CHANSPEC_CTL_SB_UU) { ++ /* Primary 40MHz is on upper side */ ++ sb = WL_CHANSPEC_CTL_SB_U; ++ center_chan += CH_20MHZ_APART; ++ } else { ++ /* Primary 40MHz is on lower side */ ++ /* sideband bits are the same for LL/LU and L/U */ ++ center_chan -= CH_20MHZ_APART; ++ } ++ ++ /* Create primary 40MHz chanspec */ ++ chspec40 = (WL_CHANSPEC_BAND_5G | WL_CHANSPEC_BW_40 | ++ sb | center_chan); ++ } ++ ++ return chspec40; ++} ++ ++/* ++ * Return the channel number for a given frequency and base frequency. ++ * The returned channel number is relative to the given base frequency. ++ * If the given base frequency is zero, a base frequency of 5 GHz is assumed for ++ * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz. ++ * ++ * Frequency is specified in MHz. ++ * The base frequency is specified as (start_factor * 500 kHz). ++ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for ++ * 2.4 GHz and 5 GHz bands. ++ * ++ * The returned channel will be in the range [1, 14] in the 2.4 GHz band ++ * and [0, 200] otherwise. ++ * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the ++ * frequency is not a 2.4 GHz channel, or if the frequency is not and even ++ * multiple of 5 MHz from the base frequency to the base plus 1 GHz. ++ * ++ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2 ++ */ ++int ++wf_mhz2channel(uint freq, uint start_factor) ++{ ++ int ch = -1; ++ uint base; ++ int offset; ++ ++ /* take the default channel start frequency */ ++ if (start_factor == 0) { ++ if (freq >= 2400 && freq <= 2500) ++ start_factor = WF_CHAN_FACTOR_2_4_G; ++ else if (freq >= 5000 && freq <= 6000) ++ start_factor = WF_CHAN_FACTOR_5_G; ++ } ++ ++ if (freq == 2484 && start_factor == WF_CHAN_FACTOR_2_4_G) ++ return 14; ++ ++ base = start_factor / 2; ++ ++ /* check that the frequency is in 1GHz range of the base */ ++ if ((freq < base) || (freq > base + 1000)) ++ return -1; ++ ++ offset = freq - base; ++ ch = offset / 5; ++ ++ /* check that frequency is a 5MHz multiple from the base */ ++ if (offset != (ch * 5)) ++ return -1; ++ ++ /* restricted channel range check for 2.4G */ ++ if (start_factor == WF_CHAN_FACTOR_2_4_G && (ch < 1 || ch > 13)) ++ return -1; ++ ++ return ch; ++} ++ ++/* ++ * Return the center frequency in MHz of the given channel and base frequency. ++ * The channel number is interpreted relative to the given base frequency. ++ * ++ * The valid channel range is [1, 14] in the 2.4 GHz band and [0, 200] otherwise. ++ * The base frequency is specified as (start_factor * 500 kHz). ++ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_4_G, and WF_CHAN_FACTOR_5_G ++ * are defined for 2.4 GHz, 4 GHz, and 5 GHz bands. ++ * The channel range of [1, 14] is only checked for a start_factor of ++ * WF_CHAN_FACTOR_2_4_G (4814 = 2407 * 2). ++ * Odd start_factors produce channels on .5 MHz boundaries, in which case ++ * the answer is rounded down to an integral MHz. ++ * -1 is returned for an out of range channel. ++ * ++ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2 ++ */ ++int ++wf_channel2mhz(uint ch, uint start_factor) ++{ ++ int freq; ++ ++ if ((start_factor == WF_CHAN_FACTOR_2_4_G && (ch < 1 || ch > 14)) || ++ (ch > 200)) ++ freq = -1; ++ else if ((start_factor == WF_CHAN_FACTOR_2_4_G) && (ch == 14)) ++ freq = 2484; ++ else ++ freq = ch * 5 + start_factor / 2; ++ ++ return freq; ++} +diff --git a/drivers/net/wireless/ap6210/dhd.h b/drivers/net/wireless/ap6210/dhd.h +new file mode 100644 +index 0000000..006a41c +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd.h +@@ -0,0 +1,888 @@ ++/* ++ * Header file describing the internal (inter-module) DHD interfaces. ++ * ++ * Provides type definitions and function prototypes used to link the ++ * DHD OS, bus, and protocol modules. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd.h 373887 2012-12-10 21:58:02Z $ ++ */ ++ ++/**************** ++ * Common types * ++ */ ++ ++#ifndef _dhd_h_ ++#define _dhd_h_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_HAS_WAKELOCK) ++#include ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined (CONFIG_HAS_WAKELOCK) */ ++/* The kernel threading is sdio-specific */ ++struct task_struct; ++struct sched_param; ++int setScheduler(struct task_struct *p, int policy, struct sched_param *param); ++ ++#define ALL_INTERFACES 0xff ++ ++#include ++#include ++ ++ ++/* Forward decls */ ++struct dhd_bus; ++struct dhd_prot; ++struct dhd_info; ++ ++/* The level of bus communication with the dongle */ ++enum dhd_bus_state { ++ DHD_BUS_DOWN, /* Not ready for frame transfers */ ++ DHD_BUS_LOAD, /* Download access only (CPU reset) */ ++ DHD_BUS_DATA /* Ready for frame transfers */ ++}; ++ ++enum dhd_op_flags { ++/* Firmware requested operation mode */ ++ DHD_FLAG_STA_MODE = BIT(0), /* STA only */ ++ DHD_FLAG_HOSTAP_MODE = BIT(1), /* SOFTAP only */ ++ DHD_FLAG_P2P_MODE = BIT(2), /* P2P Only */ ++ /* STA + P2P */ ++ DHD_FLAG_CONCURR_SINGLE_CHAN_MODE = (DHD_FLAG_STA_MODE | DHD_FLAG_P2P_MODE), ++ DHD_FLAG_CONCURR_MULTI_CHAN_MODE = BIT(4), /* STA + P2P */ ++ /* Current P2P mode for P2P connection */ ++ DHD_FLAG_P2P_GC_MODE = BIT(5), ++ DHD_FLAG_P2P_GO_MODE = BIT(6), ++ DHD_FLAG_MBSS_MODE = BIT(7) /* MBSS in future */ ++}; ++ ++#define MANUFACTRING_FW "WLTEST" ++ ++/* max sequential rxcntl timeouts to set HANG event */ ++#ifndef MAX_CNTL_TIMEOUT ++#define MAX_CNTL_TIMEOUT 2 ++#endif ++ ++#define DHD_SCAN_ASSOC_ACTIVE_TIME 40 /* ms: Embedded default Active setting from DHD */ ++#define DHD_SCAN_UNASSOC_ACTIVE_TIME 80 /* ms: Embedded def. Unassoc Active setting from DHD */ ++#define DHD_SCAN_PASSIVE_TIME 130 /* ms: Embedded default Passive setting from DHD */ ++ ++#ifndef POWERUP_MAX_RETRY ++#define POWERUP_MAX_RETRY 3 /* how many times we retry to power up the chip */ ++#endif ++#ifndef POWERUP_WAIT_MS ++#define POWERUP_WAIT_MS 2000 /* ms: time out in waiting wifi to come up */ ++#endif ++ ++enum dhd_bus_wake_state { ++ WAKE_LOCK_OFF, ++ WAKE_LOCK_PRIV, ++ WAKE_LOCK_DPC, ++ WAKE_LOCK_IOCTL, ++ WAKE_LOCK_DOWNLOAD, ++ WAKE_LOCK_TMOUT, ++ WAKE_LOCK_WATCHDOG, ++ WAKE_LOCK_LINK_DOWN_TMOUT, ++ WAKE_LOCK_PNO_FIND_TMOUT, ++ WAKE_LOCK_SOFTAP_SET, ++ WAKE_LOCK_SOFTAP_STOP, ++ WAKE_LOCK_SOFTAP_START, ++ WAKE_LOCK_SOFTAP_THREAD, ++ WAKE_LOCK_MAX ++}; ++ ++enum dhd_prealloc_index { ++ DHD_PREALLOC_PROT = 0, ++ DHD_PREALLOC_RXBUF, ++ DHD_PREALLOC_DATABUF, ++#if defined(STATIC_WL_PRIV_STRUCT) ++ DHD_PREALLOC_OSL_BUF, ++ DHD_PREALLOC_WIPHY_ESCAN0 = 5, ++#else ++ DHD_PREALLOC_OSL_BUF ++#endif /* STATIC_WL_PRIV_STRUCT */ ++}; ++ ++typedef enum { ++ DHD_IF_NONE = 0, ++ DHD_IF_ADD, ++ DHD_IF_DEL, ++ DHD_IF_CHANGE, ++ DHD_IF_DELETING ++} dhd_if_state_t; ++ ++ ++#if defined(CONFIG_DHD_USE_STATIC_BUF) ++ ++uint8* dhd_os_prealloc(void *osh, int section, uint size); ++void dhd_os_prefree(void *osh, void *addr, uint size); ++#define DHD_OS_PREALLOC(osh, section, size) dhd_os_prealloc(osh, section, size) ++#define DHD_OS_PREFREE(osh, addr, size) dhd_os_prefree(osh, addr, size) ++ ++#else ++ ++#define DHD_OS_PREALLOC(osh, section, size) MALLOC(osh, size) ++#define DHD_OS_PREFREE(osh, addr, size) MFREE(osh, addr, size) ++ ++#endif /* defined(CONFIG_DHD_USE_STATIC_BUF) */ ++ ++/* Packet alignment for most efficient SDIO (can change based on platform) */ ++#ifndef DHD_SDALIGN ++#define DHD_SDALIGN 32 ++#endif ++ ++/* host reordering packts logic */ ++/* followed the structure to hold the reorder buffers (void **p) */ ++typedef struct reorder_info { ++ void **p; ++ uint8 flow_id; ++ uint8 cur_idx; ++ uint8 exp_idx; ++ uint8 max_idx; ++ uint8 pend_pkts; ++} reorder_info_t; ++ ++/* Common structure for module and instance linkage */ ++typedef struct dhd_pub { ++ /* Linkage ponters */ ++ osl_t *osh; /* OSL handle */ ++ struct dhd_bus *bus; /* Bus module handle */ ++ struct dhd_prot *prot; /* Protocol module handle */ ++ struct dhd_info *info; /* Info module handle */ ++ ++ /* Internal dhd items */ ++ bool up; /* Driver up/down (to OS) */ ++ bool txoff; /* Transmit flow-controlled */ ++ bool dongle_reset; /* TRUE = DEVRESET put dongle into reset */ ++ enum dhd_bus_state busstate; ++ uint hdrlen; /* Total DHD header length (proto + bus) */ ++ uint maxctl; /* Max size rxctl request from proto to bus */ ++ uint rxsz; /* Rx buffer size bus module should use */ ++ uint8 wme_dp; /* wme discard priority */ ++ ++ /* Dongle media info */ ++ bool iswl; /* Dongle-resident driver is wl */ ++ ulong drv_version; /* Version of dongle-resident driver */ ++ struct ether_addr mac; /* MAC address obtained from dongle */ ++ dngl_stats_t dstats; /* Stats for dongle-based data */ ++ ++ /* Additional stats for the bus level */ ++ ulong tx_packets; /* Data packets sent to dongle */ ++ ulong tx_multicast; /* Multicast data packets sent to dongle */ ++ ulong tx_errors; /* Errors in sending data to dongle */ ++ ulong tx_ctlpkts; /* Control packets sent to dongle */ ++ ulong tx_ctlerrs; /* Errors sending control frames to dongle */ ++ ulong rx_packets; /* Packets sent up the network interface */ ++ ulong rx_multicast; /* Multicast packets sent up the network interface */ ++ ulong rx_errors; /* Errors processing rx data packets */ ++ ulong rx_ctlpkts; /* Control frames processed from dongle */ ++ ulong rx_ctlerrs; /* Errors in processing rx control frames */ ++ ulong rx_dropped; /* Packets dropped locally (no memory) */ ++ ulong rx_flushed; /* Packets flushed due to unscheduled sendup thread */ ++ ulong wd_dpc_sched; /* Number of times dhd dpc scheduled by watchdog timer */ ++ ++ ulong rx_readahead_cnt; /* Number of packets where header read-ahead was used. */ ++ ulong tx_realloc; /* Number of tx packets we had to realloc for headroom */ ++ ulong fc_packets; /* Number of flow control pkts recvd */ ++ ++ /* Last error return */ ++ int bcmerror; ++ uint tickcnt; ++ ++ /* Last error from dongle */ ++ int dongle_error; ++ ++ uint8 country_code[WLC_CNTRY_BUF_SZ]; ++ ++ /* Suspend disable flag and "in suspend" flag */ ++ int suspend_disable_flag; /* "1" to disable all extra powersaving during suspend */ ++ int in_suspend; /* flag set to 1 when early suspend called */ ++#ifdef PNO_SUPPORT ++ int pno_enable; /* pno status : "1" is pno enable */ ++ int pno_suspend; /* pno suspend status : "1" is pno suspended */ ++#endif /* PNO_SUPPORT */ ++ /* DTIM skip value, default 0(or 1) means wake each DTIM ++ * 3 means skip 2 DTIMs and wake up 3rd DTIM(9th beacon when AP DTIM is 3) ++ */ ++ int suspend_bcn_li_dtim; /* bcn_li_dtim value in suspend mode */ ++#ifdef PKT_FILTER_SUPPORT ++ int early_suspended; /* Early suspend status */ ++ int dhcp_in_progress; /* DHCP period */ ++#endif ++ ++ /* Pkt filter defination */ ++ char * pktfilter[100]; ++ int pktfilter_count; ++ ++ wl_country_t dhd_cspec; /* Current Locale info */ ++ char eventmask[WL_EVENTING_MASK_LEN]; ++ int op_mode; /* STA, HostAPD, WFD, SoftAP */ ++ ++/* Set this to 1 to use a seperate interface (p2p0) for p2p operations. ++ * For ICS MR1 releases it should be disable to be compatable with ICS MR1 Framework ++ * see target dhd-cdc-sdmmc-panda-cfg80211-icsmr1-gpl-debug in Makefile ++ */ ++/* #define WL_ENABLE_P2P_IF 1 */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ struct mutex wl_start_stop_lock; /* lock/unlock for Android start/stop */ ++ struct mutex wl_softap_lock; /* lock/unlock for any SoftAP/STA settings */ ++#endif ++ ++#ifdef WLBTAMP ++ uint16 maxdatablks; ++#endif /* WLBTAMP */ ++#ifdef PROP_TXSTATUS ++ int wlfc_enabled; ++ void* wlfc_state; ++#endif ++ bool dongle_isolation; ++ bool dongle_trap_occured; /* flag for sending HANG event to upper layer */ ++ int hang_was_sent; ++ int rxcnt_timeout; /* counter rxcnt timeout to send HANG */ ++ int txcnt_timeout; /* counter txcnt timeout to send HANG */ ++#ifdef WLMEDIA_HTSF ++ uint8 htsfdlystat_sz; /* Size of delay stats, max 255B */ ++#endif ++ struct reorder_info *reorder_bufs[WLHOST_REORDERDATA_MAXFLOWS]; ++#if defined(ARP_OFFLOAD_SUPPORT) ++ uint32 arp_version; ++#endif ++} dhd_pub_t; ++ ++ ++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) ++ ++ #define DHD_PM_RESUME_WAIT_INIT(a) DECLARE_WAIT_QUEUE_HEAD(a); ++ #define _DHD_PM_RESUME_WAIT(a, b) do {\ ++ int retry = 0; \ ++ SMP_RD_BARRIER_DEPENDS(); \ ++ while (dhd_mmc_suspend && retry++ != b) { \ ++ SMP_RD_BARRIER_DEPENDS(); \ ++ wait_event_interruptible_timeout(a, !dhd_mmc_suspend, 1); \ ++ } \ ++ } while (0) ++ #define DHD_PM_RESUME_WAIT(a) _DHD_PM_RESUME_WAIT(a, 200) ++ #define DHD_PM_RESUME_WAIT_FOREVER(a) _DHD_PM_RESUME_WAIT(a, ~0) ++ #define DHD_PM_RESUME_RETURN_ERROR(a) do { if (dhd_mmc_suspend) return a; } while (0) ++ #define DHD_PM_RESUME_RETURN do { if (dhd_mmc_suspend) return; } while (0) ++ ++ #define DHD_SPINWAIT_SLEEP_INIT(a) DECLARE_WAIT_QUEUE_HEAD(a); ++ #define SPINWAIT_SLEEP(a, exp, us) do { \ ++ uint countdown = (us) + 9999; \ ++ while ((exp) && (countdown >= 10000)) { \ ++ wait_event_interruptible_timeout(a, FALSE, 1); \ ++ countdown -= 10000; \ ++ } \ ++ } while (0) ++ ++ #else ++ ++ #define DHD_PM_RESUME_WAIT_INIT(a) ++ #define DHD_PM_RESUME_WAIT(a) ++ #define DHD_PM_RESUME_WAIT_FOREVER(a) ++ #define DHD_PM_RESUME_RETURN_ERROR(a) ++ #define DHD_PM_RESUME_RETURN ++ ++ #define DHD_SPINWAIT_SLEEP_INIT(a) ++ #define SPINWAIT_SLEEP(a, exp, us) do { \ ++ uint countdown = (us) + 9; \ ++ while ((exp) && (countdown >= 10)) { \ ++ OSL_DELAY(10); \ ++ countdown -= 10; \ ++ } \ ++ } while (0) ++ ++ #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ ++#ifndef DHDTHREAD ++#undef SPINWAIT_SLEEP ++#define SPINWAIT_SLEEP(a, exp, us) SPINWAIT(exp, us) ++#endif /* DHDTHREAD */ ++#define DHD_IF_VIF 0x01 /* Virtual IF (Hidden from user) */ ++ ++unsigned long dhd_os_spin_lock(dhd_pub_t *pub); ++void dhd_os_spin_unlock(dhd_pub_t *pub, unsigned long flags); ++ ++/* Wakelock Functions */ ++extern int dhd_os_wake_lock(dhd_pub_t *pub); ++extern int dhd_os_wake_unlock(dhd_pub_t *pub); ++extern int dhd_os_wake_lock_timeout(dhd_pub_t *pub); ++extern int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val); ++extern int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val); ++extern int dhd_os_wd_wake_lock(dhd_pub_t *pub); ++extern int dhd_os_wd_wake_unlock(dhd_pub_t *pub); ++ ++inline static void MUTEX_LOCK_SOFTAP_SET_INIT(dhd_pub_t * dhdp) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ mutex_init(&dhdp->wl_softap_lock); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++} ++ ++inline static void MUTEX_LOCK_SOFTAP_SET(dhd_pub_t * dhdp) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ mutex_lock(&dhdp->wl_softap_lock); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++} ++ ++inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ mutex_unlock(&dhdp->wl_softap_lock); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++} ++ ++#define DHD_OS_WAKE_LOCK(pub) dhd_os_wake_lock(pub) ++#define DHD_OS_WAKE_UNLOCK(pub) dhd_os_wake_unlock(pub) ++#define DHD_OS_WD_WAKE_LOCK(pub) dhd_os_wd_wake_lock(pub) ++#define DHD_OS_WD_WAKE_UNLOCK(pub) dhd_os_wd_wake_unlock(pub) ++#define DHD_OS_WAKE_LOCK_TIMEOUT(pub) dhd_os_wake_lock_timeout(pub) ++#define DHD_OS_WAKE_LOCK_RX_TIMEOUT_ENABLE(pub, val) \ ++ dhd_os_wake_lock_rx_timeout_enable(pub, val) ++#define DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(pub, val) \ ++ dhd_os_wake_lock_ctrl_timeout_enable(pub, val) ++#define DHD_PACKET_TIMEOUT_MS 1000 ++#define DHD_EVENT_TIMEOUT_MS 1500 ++ ++/* interface operations (register, remove) should be atomic, use this lock to prevent race ++ * condition among wifi on/off and interface operation functions ++ */ ++void dhd_net_if_lock(struct net_device *dev); ++void dhd_net_if_unlock(struct net_device *dev); ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++extern struct mutex _dhd_sdio_mutex_lock_; ++#endif ++ ++typedef struct dhd_if_event { ++ uint8 ifidx; ++ uint8 action; ++ uint8 flags; ++ uint8 bssidx; ++ uint8 is_AP; ++} dhd_if_event_t; ++ ++typedef enum dhd_attach_states ++{ ++ DHD_ATTACH_STATE_INIT = 0x0, ++ DHD_ATTACH_STATE_NET_ALLOC = 0x1, ++ DHD_ATTACH_STATE_DHD_ALLOC = 0x2, ++ DHD_ATTACH_STATE_ADD_IF = 0x4, ++ DHD_ATTACH_STATE_PROT_ATTACH = 0x8, ++ DHD_ATTACH_STATE_WL_ATTACH = 0x10, ++ DHD_ATTACH_STATE_THREADS_CREATED = 0x20, ++ DHD_ATTACH_STATE_WAKELOCKS_INIT = 0x40, ++ DHD_ATTACH_STATE_CFG80211 = 0x80, ++ DHD_ATTACH_STATE_EARLYSUSPEND_DONE = 0x100, ++ DHD_ATTACH_STATE_DONE = 0x200 ++} dhd_attach_states_t; ++ ++/* Value -1 means we are unsuccessful in creating the kthread. */ ++#define DHD_PID_KT_INVALID -1 ++/* Value -2 means we are unsuccessful in both creating the kthread and tasklet */ ++#define DHD_PID_KT_TL_INVALID -2 ++ ++/* ++ * Exported from dhd OS modules (dhd_linux/dhd_ndis) ++ */ ++ ++/* To allow osl_attach/detach calls from os-independent modules */ ++osl_t *dhd_osl_attach(void *pdev, uint bustype); ++void dhd_osl_detach(osl_t *osh); ++ ++/* Indication from bus module regarding presence/insertion of dongle. ++ * Return dhd_pub_t pointer, used as handle to OS module in later calls. ++ * Returned structure should have bus and prot pointers filled in. ++ * bus_hdrlen specifies required headroom for bus module header. ++ */ ++extern dhd_pub_t *dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen); ++#if defined(WLP2P) && defined(WL_CFG80211) ++/* To allow attach/detach calls corresponding to p2p0 interface */ ++extern int dhd_attach_p2p(dhd_pub_t *); ++extern int dhd_detach_p2p(dhd_pub_t *); ++#endif /* WLP2P && WL_CFG80211 */ ++extern int dhd_net_attach(dhd_pub_t *dhdp, int idx); ++ ++/* Indication from bus module regarding removal/absence of dongle */ ++extern void dhd_detach(dhd_pub_t *dhdp); ++extern void dhd_free(dhd_pub_t *dhdp); ++ ++/* Indication from bus module to change flow-control state */ ++extern void dhd_txflowcontrol(dhd_pub_t *dhdp, int ifidx, bool on); ++ ++extern bool dhd_prec_enq(dhd_pub_t *dhdp, struct pktq *q, void *pkt, int prec); ++ ++/* Receive frame for delivery to OS. Callee disposes of rxp. */ ++extern void dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *rxp, int numpkt, uint8 chan); ++ ++/* Return pointer to interface name */ ++extern char *dhd_ifname(dhd_pub_t *dhdp, int idx); ++ ++/* Request scheduling of the bus dpc */ ++extern void dhd_sched_dpc(dhd_pub_t *dhdp); ++ ++/* Notify tx completion */ ++extern void dhd_txcomplete(dhd_pub_t *dhdp, void *txp, bool success); ++ ++/* OS independent layer functions */ ++extern int dhd_os_proto_block(dhd_pub_t * pub); ++extern int dhd_os_proto_unblock(dhd_pub_t * pub); ++extern int dhd_os_ioctl_resp_wait(dhd_pub_t * pub, uint * condition, bool * pending); ++extern int dhd_os_ioctl_resp_wake(dhd_pub_t * pub); ++extern unsigned int dhd_os_get_ioctl_resp_timeout(void); ++extern void dhd_os_set_ioctl_resp_timeout(unsigned int timeout_msec); ++extern void * dhd_os_open_image(char * filename); ++extern int dhd_os_get_image_block(char * buf, int len, void * image); ++extern void dhd_os_close_image(void * image); ++extern void dhd_os_wd_timer(void *bus, uint wdtick); ++extern void dhd_os_sdlock(dhd_pub_t * pub); ++extern void dhd_os_sdunlock(dhd_pub_t * pub); ++extern void dhd_os_sdlock_txq(dhd_pub_t * pub); ++extern void dhd_os_sdunlock_txq(dhd_pub_t * pub); ++extern void dhd_os_sdlock_rxq(dhd_pub_t * pub); ++extern void dhd_os_sdunlock_rxq(dhd_pub_t * pub); ++extern void dhd_os_sdlock_sndup_rxq(dhd_pub_t * pub); ++extern void dhd_customer_gpio_wlan_ctrl(int onoff); ++extern int dhd_custom_get_mac_address(unsigned char *buf); ++extern void dhd_os_sdunlock_sndup_rxq(dhd_pub_t * pub); ++extern void dhd_os_sdlock_eventq(dhd_pub_t * pub); ++extern void dhd_os_sdunlock_eventq(dhd_pub_t * pub); ++extern bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret); ++extern int dhd_os_send_hang_message(dhd_pub_t *dhdp); ++extern void dhd_set_version_info(dhd_pub_t *pub, char *fw); ++ ++#ifdef PNO_SUPPORT ++extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled); ++extern int dhd_pno_clean(dhd_pub_t *dhd); ++extern int dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ++ ushort scan_fr, int pno_repeat, int pno_freq_expo_max); ++extern int dhd_pno_get_status(dhd_pub_t *dhd); ++extern int dhd_dev_pno_reset(struct net_device *dev); ++extern int dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local, ++ int nssid, ushort scan_fr, int pno_repeat, int pno_freq_expo_max); ++extern int dhd_dev_pno_enable(struct net_device *dev, int pfn_enabled); ++extern int dhd_dev_get_pno_status(struct net_device *dev); ++#endif /* PNO_SUPPORT */ ++ ++#ifdef PKT_FILTER_SUPPORT ++#define DHD_UNICAST_FILTER_NUM 0 ++#define DHD_BROADCAST_FILTER_NUM 1 ++#define DHD_MULTICAST4_FILTER_NUM 2 ++#define DHD_MULTICAST6_FILTER_NUM 3 ++#define DHD_MDNS_FILTER_NUM 4 ++extern int dhd_os_enable_packet_filter(dhd_pub_t *dhdp, int val); ++extern void dhd_enable_packet_filter(int value, dhd_pub_t *dhd); ++extern int net_os_enable_packet_filter(struct net_device *dev, int val); ++extern int net_os_rxfilter_add_remove(struct net_device *dev, int val, int num); ++#endif /* PKT_FILTER_SUPPORT */ ++ ++extern int dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd); ++extern bool dhd_support_sta_mode(dhd_pub_t *dhd); ++ ++#ifdef DHD_DEBUG ++extern int write_to_file(dhd_pub_t *dhd, uint8 *buf, int size); ++#endif /* DHD_DEBUG */ ++#if defined(OOB_INTR_ONLY) ++extern int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr); ++#endif ++extern void dhd_os_sdtxlock(dhd_pub_t * pub); ++extern void dhd_os_sdtxunlock(dhd_pub_t * pub); ++ ++typedef struct { ++ uint32 limit; /* Expiration time (usec) */ ++ uint32 increment; /* Current expiration increment (usec) */ ++ uint32 elapsed; /* Current elapsed time (usec) */ ++ uint32 tick; /* O/S tick time (usec) */ ++} dhd_timeout_t; ++ ++extern void dhd_timeout_start(dhd_timeout_t *tmo, uint usec); ++extern int dhd_timeout_expired(dhd_timeout_t *tmo); ++ ++extern int dhd_ifname2idx(struct dhd_info *dhd, char *name); ++extern int dhd_net2idx(struct dhd_info *dhd, struct net_device *net); ++extern struct net_device * dhd_idx2net(void *pub, int ifidx); ++extern int net_os_send_hang_message(struct net_device *dev); ++extern int wl_host_event(dhd_pub_t *dhd_pub, int *idx, void *pktdata, ++ wl_event_msg_t *, void **data_ptr); ++extern void wl_event_to_host_order(wl_event_msg_t * evt); ++ ++extern int dhd_wl_ioctl(dhd_pub_t *dhd_pub, int ifindex, wl_ioctl_t *ioc, void *buf, int len); ++extern int dhd_wl_ioctl_cmd(dhd_pub_t *dhd_pub, int cmd, void *arg, int len, uint8 set, ++ int ifindex); ++ ++extern void dhd_common_init(osl_t *osh); ++ ++extern int dhd_do_driver_init(struct net_device *net); ++extern int dhd_add_if(struct dhd_info *dhd, int ifidx, void *handle, ++ char *name, uint8 *mac_addr, uint32 flags, uint8 bssidx); ++extern void dhd_del_if(struct dhd_info *dhd, int ifidx); ++ ++extern void dhd_vif_add(struct dhd_info *dhd, int ifidx, char * name); ++extern void dhd_vif_del(struct dhd_info *dhd, int ifidx); ++ ++extern void dhd_event(struct dhd_info *dhd, char *evpkt, int evlen, int ifidx); ++extern void dhd_vif_sendup(struct dhd_info *dhd, int ifidx, uchar *cp, int len); ++ ++ ++/* Send packet to dongle via data channel */ ++extern int dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, void *pkt); ++ ++/* send up locally generated event */ ++extern void dhd_sendup_event_common(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data); ++/* Send event to host */ ++extern void dhd_sendup_event(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data); ++extern int dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag); ++extern uint dhd_bus_status(dhd_pub_t *dhdp); ++extern int dhd_bus_start(dhd_pub_t *dhdp); ++extern int dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint size); ++extern void dhd_print_buf(void *pbuf, int len, int bytes_per_line); ++extern bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf, int *retval); ++extern uint dhd_bus_chip_id(dhd_pub_t *dhdp); ++extern uint dhd_bus_chiprev_id(dhd_pub_t *dhdp); ++extern uint dhd_bus_chippkg_id(dhd_pub_t *dhdp); ++ ++#if defined(KEEP_ALIVE) ++extern int dhd_keep_alive_onoff(dhd_pub_t *dhd); ++#endif /* KEEP_ALIVE */ ++ ++extern bool dhd_is_concurrent_mode(dhd_pub_t *dhd); ++ ++typedef enum cust_gpio_modes { ++ WLAN_RESET_ON, ++ WLAN_RESET_OFF, ++ WLAN_POWER_ON, ++ WLAN_POWER_OFF ++} cust_gpio_modes_t; ++ ++extern int wl_iw_iscan_set_scan_broadcast_prep(struct net_device *dev, uint flag); ++extern int wl_iw_send_priv_event(struct net_device *dev, char *flag); ++/* ++ * Insmod parameters for debug/test ++ */ ++ ++/* Watchdog timer interval */ ++extern uint dhd_watchdog_ms; ++ ++#if defined(DHD_DEBUG) ++/* Console output poll interval */ ++extern uint dhd_console_ms; ++#endif /* defined(DHD_DEBUG) */ ++//extern uint android_msg_level; ++#ifdef CONFIG_WIRELESS_EXT ++extern uint iw_msg_level; ++#endif ++#ifdef WL_CFG80211 ++extern uint wl_dbg_level; ++#endif ++extern uint dhd_slpauto; ++ ++/* Use interrupts */ ++extern uint dhd_intr; ++ ++/* Use polling */ ++extern uint dhd_poll; ++ ++/* ARP offload agent mode */ ++extern uint dhd_arp_mode; ++ ++/* ARP offload enable */ ++extern uint dhd_arp_enable; ++ ++/* Pkt filte enable control */ ++extern uint dhd_pkt_filter_enable; ++ ++/* Pkt filter init setup */ ++extern uint dhd_pkt_filter_init; ++ ++/* Pkt filter mode control */ ++extern uint dhd_master_mode; ++ ++/* Roaming mode control */ ++extern uint dhd_roam_disable; ++ ++/* Roaming mode control */ ++extern uint dhd_radio_up; ++ ++/* Initial idletime ticks (may be -1 for immediate idle, 0 for no idle) */ ++extern int dhd_idletime; ++#ifdef DHD_USE_IDLECOUNT ++#define DHD_IDLETIME_TICKS 5 ++#else ++#define DHD_IDLETIME_TICKS 1 ++#endif /* DHD_USE_IDLECOUNT */ ++ ++/* SDIO Drive Strength */ ++extern uint dhd_sdiod_drive_strength; ++ ++/* Override to force tx queueing all the time */ ++extern uint dhd_force_tx_queueing; ++/* Default KEEP_ALIVE Period is 55 sec to prevent AP from sending Keep Alive probe frame */ ++#define DEFAULT_KEEP_ALIVE_VALUE 55000 /* msec */ ++#ifndef CUSTOM_KEEP_ALIVE_SETTING ++#define CUSTOM_KEEP_ALIVE_SETTING DEFAULT_KEEP_ALIVE_VALUE ++#endif /* DEFAULT_KEEP_ALIVE_VALUE */ ++ ++#define NULL_PKT_STR "null_pkt" ++ ++/* hooks for custom glom setting option via Makefile */ ++#define DEFAULT_GLOM_VALUE -1 ++#ifndef CUSTOM_GLOM_SETTING ++#define CUSTOM_GLOM_SETTING DEFAULT_GLOM_VALUE ++#endif ++ ++/* hooks for custom Roaming Trigger setting via Makefile */ ++#define DEFAULT_ROAM_TRIGGER_VALUE -75 /* dBm default roam trigger all band */ ++#define DEFAULT_ROAM_TRIGGER_SETTING -1 ++#ifndef CUSTOM_ROAM_TRIGGER_SETTING ++#define CUSTOM_ROAM_TRIGGER_SETTING DEFAULT_ROAM_TRIGGER_VALUE ++#endif ++ ++/* hooks for custom Roaming Romaing setting via Makefile */ ++#define DEFAULT_ROAM_DELTA_VALUE 10 /* dBm default roam delta all band */ ++#define DEFAULT_ROAM_DELTA_SETTING -1 ++#ifndef CUSTOM_ROAM_DELTA_SETTING ++#define CUSTOM_ROAM_DELTA_SETTING DEFAULT_ROAM_DELTA_VALUE ++#endif ++ ++/* hooks for custom PNO Event wake lock to guarantee enough time ++ for the Platform to detect Event before system suspended ++*/ ++#define DEFAULT_PNO_EVENT_LOCK_xTIME 2 /* multiplay of DHD_PACKET_TIMEOUT_MS */ ++#ifndef CUSTOM_PNO_EVENT_LOCK_xTIME ++#define CUSTOM_PNO_EVENT_LOCK_xTIME DEFAULT_PNO_EVENT_LOCK_xTIME ++#endif ++ ++/* hooks for custom dhd_dpc_prio setting option via Makefile */ ++#define DEFAULT_DHP_DPC_PRIO 1 ++#ifndef CUSTOM_DPC_PRIO_SETTING ++#define CUSTOM_DPC_PRIO_SETTING DEFAULT_DHP_DPC_PRIO ++#endif ++ ++#define DEFAULT_SUSPEND_BCN_LI_DTIM 3 ++#ifndef CUSTOM_SUSPEND_BCN_LI_DTIM ++#define CUSTOM_SUSPEND_BCN_LI_DTIM DEFAULT_SUSPEND_BCN_LI_DTIM ++#endif ++ ++#ifdef SDTEST ++/* Echo packet generator (SDIO), pkts/s */ ++extern uint dhd_pktgen; ++ ++/* Echo packet len (0 => sawtooth, max 1800) */ ++extern uint dhd_pktgen_len; ++#define MAX_PKTGEN_LEN 1800 ++#endif ++ ++ ++/* optionally set by a module_param_string() */ ++#define MOD_PARAM_PATHLEN 2048 ++extern char fw_path[MOD_PARAM_PATHLEN]; ++extern char nv_path[MOD_PARAM_PATHLEN]; ++ ++#define MOD_PARAM_INFOLEN 512 ++ ++#ifdef SOFTAP ++extern char fw_path2[MOD_PARAM_PATHLEN]; ++#endif ++ ++#define FW_PATH_AUTO_SELECT 1 ++extern char firmware_path[MOD_PARAM_PATHLEN]; ++extern void dhd_bus_select_firmware_name_by_chip(struct dhd_bus *bus, char *dst, char *src); ++#define COPY_FW_PATH_BY_CHIP(bus, dst, src) dhd_bus_select_firmware_name_by_chip(bus, dst, src); ++ ++/* Flag to indicate if we should download firmware on driver load */ ++extern uint dhd_download_fw_on_driverload; ++ ++ ++/* For supporting multiple interfaces */ ++#define DHD_MAX_IFS 16 ++#define DHD_DEL_IF -0xe ++#define DHD_BAD_IF -0xf ++#define WL_AUTO_ROAM_TRIGGER -75 ++ ++#ifdef PROP_TXSTATUS ++/* Please be mindful that total pkttag space is 32 octets only */ ++typedef struct dhd_pkttag { ++ /* ++ b[11 ] - 1 = this packet was sent in response to one time packet request, ++ do not increment credit on status for this one. [WLFC_CTL_TYPE_MAC_REQUEST_PACKET]. ++ b[10 ] - 1 = signal-only-packet to firmware [i.e. nothing to piggyback on] ++ b[9 ] - 1 = packet is host->firmware (transmit direction) ++ - 0 = packet received from firmware (firmware->host) ++ b[8 ] - 1 = packet was sent due to credit_request (pspoll), ++ packet does not count against FIFO credit. ++ - 0 = normal transaction, packet counts against FIFO credit ++ b[7 ] - 1 = AP, 0 = STA ++ b[6:4] - AC FIFO number ++ b[3:0] - interface index ++ */ ++ uint16 if_flags; ++ /* destination MAC address for this packet so that not every ++ module needs to open the packet to find this ++ */ ++ uint8 dstn_ether[ETHER_ADDR_LEN]; ++ /* ++ This 32-bit goes from host to device for every packet. ++ */ ++ uint32 htod_tag; ++ /* bus specific stuff */ ++ union { ++ struct { ++ void* stuff; ++ uint32 thing1; ++ uint32 thing2; ++ } sd; ++ struct { ++ void* bus; ++ void* urb; ++ } usb; ++ } bus_specific; ++} dhd_pkttag_t; ++ ++#define DHD_PKTTAG_SET_H2DTAG(tag, h2dvalue) ((dhd_pkttag_t*)(tag))->htod_tag = (h2dvalue) ++#define DHD_PKTTAG_H2DTAG(tag) (((dhd_pkttag_t*)(tag))->htod_tag) ++ ++#define DHD_PKTTAG_IFMASK 0xf ++#define DHD_PKTTAG_IFTYPE_MASK 0x1 ++#define DHD_PKTTAG_IFTYPE_SHIFT 7 ++#define DHD_PKTTAG_FIFO_MASK 0x7 ++#define DHD_PKTTAG_FIFO_SHIFT 4 ++ ++#define DHD_PKTTAG_SIGNALONLY_MASK 0x1 ++#define DHD_PKTTAG_SIGNALONLY_SHIFT 10 ++ ++#define DHD_PKTTAG_ONETIMEPKTRQST_MASK 0x1 ++#define DHD_PKTTAG_ONETIMEPKTRQST_SHIFT 11 ++ ++#define DHD_PKTTAG_PKTDIR_MASK 0x1 ++#define DHD_PKTTAG_PKTDIR_SHIFT 9 ++ ++#define DHD_PKTTAG_CREDITCHECK_MASK 0x1 ++#define DHD_PKTTAG_CREDITCHECK_SHIFT 8 ++ ++#define DHD_PKTTAG_INVALID_FIFOID 0x7 ++ ++#define DHD_PKTTAG_SETFIFO(tag, fifo) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & ~(DHD_PKTTAG_FIFO_MASK << DHD_PKTTAG_FIFO_SHIFT)) | \ ++ (((fifo) & DHD_PKTTAG_FIFO_MASK) << DHD_PKTTAG_FIFO_SHIFT) ++#define DHD_PKTTAG_FIFO(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ ++ DHD_PKTTAG_FIFO_SHIFT) & DHD_PKTTAG_FIFO_MASK) ++ ++#define DHD_PKTTAG_SETIF(tag, if) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & ~DHD_PKTTAG_IFMASK) | ((if) & DHD_PKTTAG_IFMASK) ++#define DHD_PKTTAG_IF(tag) (((dhd_pkttag_t*)(tag))->if_flags & DHD_PKTTAG_IFMASK) ++ ++#define DHD_PKTTAG_SETIFTYPE(tag, isAP) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & \ ++ ~(DHD_PKTTAG_IFTYPE_MASK << DHD_PKTTAG_IFTYPE_SHIFT)) | \ ++ (((isAP) & DHD_PKTTAG_IFTYPE_MASK) << DHD_PKTTAG_IFTYPE_SHIFT) ++#define DHD_PKTTAG_IFTYPE(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ ++ DHD_PKTTAG_IFTYPE_SHIFT) & DHD_PKTTAG_IFTYPE_MASK) ++ ++#define DHD_PKTTAG_SETCREDITCHECK(tag, check) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & \ ++ ~(DHD_PKTTAG_CREDITCHECK_MASK << DHD_PKTTAG_CREDITCHECK_SHIFT)) | \ ++ (((check) & DHD_PKTTAG_CREDITCHECK_MASK) << DHD_PKTTAG_CREDITCHECK_SHIFT) ++#define DHD_PKTTAG_CREDITCHECK(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ ++ DHD_PKTTAG_CREDITCHECK_SHIFT) & DHD_PKTTAG_CREDITCHECK_MASK) ++ ++#define DHD_PKTTAG_SETPKTDIR(tag, dir) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & \ ++ ~(DHD_PKTTAG_PKTDIR_MASK << DHD_PKTTAG_PKTDIR_SHIFT)) | \ ++ (((dir) & DHD_PKTTAG_PKTDIR_MASK) << DHD_PKTTAG_PKTDIR_SHIFT) ++#define DHD_PKTTAG_PKTDIR(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ ++ DHD_PKTTAG_PKTDIR_SHIFT) & DHD_PKTTAG_PKTDIR_MASK) ++ ++#define DHD_PKTTAG_SETSIGNALONLY(tag, signalonly) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & \ ++ ~(DHD_PKTTAG_SIGNALONLY_MASK << DHD_PKTTAG_SIGNALONLY_SHIFT)) | \ ++ (((signalonly) & DHD_PKTTAG_SIGNALONLY_MASK) << DHD_PKTTAG_SIGNALONLY_SHIFT) ++#define DHD_PKTTAG_SIGNALONLY(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ ++ DHD_PKTTAG_SIGNALONLY_SHIFT) & DHD_PKTTAG_SIGNALONLY_MASK) ++ ++#define DHD_PKTTAG_SETONETIMEPKTRQST(tag) ((dhd_pkttag_t*)(tag))->if_flags = \ ++ (((dhd_pkttag_t*)(tag))->if_flags & \ ++ ~(DHD_PKTTAG_ONETIMEPKTRQST_MASK << DHD_PKTTAG_ONETIMEPKTRQST_SHIFT)) | \ ++ (1 << DHD_PKTTAG_ONETIMEPKTRQST_SHIFT) ++#define DHD_PKTTAG_ONETIMEPKTRQST(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \ ++ DHD_PKTTAG_ONETIMEPKTRQST_SHIFT) & DHD_PKTTAG_ONETIMEPKTRQST_MASK) ++ ++#define DHD_PKTTAG_SETDSTN(tag, dstn_MAC_ea) memcpy(((dhd_pkttag_t*)((tag)))->dstn_ether, \ ++ (dstn_MAC_ea), ETHER_ADDR_LEN) ++#define DHD_PKTTAG_DSTN(tag) ((dhd_pkttag_t*)(tag))->dstn_ether ++ ++typedef int (*f_commitpkt_t)(void* ctx, void* p, bool wlfc_locked); ++ ++#ifdef PROP_TXSTATUS_DEBUG ++#define DHD_WLFC_CTRINC_MAC_CLOSE(entry) do { (entry)->closed_ct++; } while (0) ++#define DHD_WLFC_CTRINC_MAC_OPEN(entry) do { (entry)->opened_ct++; } while (0) ++#else ++#define DHD_WLFC_CTRINC_MAC_CLOSE(entry) do {} while (0) ++#define DHD_WLFC_CTRINC_MAC_OPEN(entry) do {} while (0) ++#endif ++ ++#endif /* PROP_TXSTATUS */ ++ ++extern void dhd_wait_for_event(dhd_pub_t *dhd, bool *lockvar); ++extern void dhd_wait_event_wakeup(dhd_pub_t*dhd); ++ ++#define IFLOCK_INIT(lock) *lock = 0 ++#define IFLOCK(lock) while (InterlockedCompareExchange((lock), 1, 0)) \ ++ NdisStallExecution(1); ++#define IFUNLOCK(lock) InterlockedExchange((lock), 0) ++#define IFLOCK_FREE(lock) ++ ++#ifdef PNO_SUPPORT ++extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled); ++extern int dhd_pnoenable(dhd_pub_t *dhd, int pfn_enabled); ++extern int dhd_pno_clean(dhd_pub_t *dhd); ++extern int dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ++ ushort scan_fr, int pno_repeat, int pno_freq_expo_max); ++extern int dhd_pno_get_status(dhd_pub_t *dhd); ++extern int dhd_pno_set_add(dhd_pub_t *dhd, wl_pfn_t *netinfo, int nssid, ushort scan_fr, ++ ushort slowscan_fr, uint8 pno_repeat, uint8 pno_freq_expo_max, int16 flags); ++extern int dhd_pno_cfg(dhd_pub_t *dhd, wl_pfn_cfg_t *pcfg); ++extern int dhd_pno_suspend(dhd_pub_t *dhd, int pfn_suspend); ++#endif /* PNO_SUPPORT */ ++#ifdef ARP_OFFLOAD_SUPPORT ++#define MAX_IPV4_ENTRIES 8 ++void dhd_arp_offload_set(dhd_pub_t * dhd, int arp_mode); ++void dhd_arp_offload_enable(dhd_pub_t * dhd, int arp_enable); ++ ++/* dhd_commn arp offload wrapers */ ++void dhd_aoe_hostip_clr(dhd_pub_t *dhd, int idx); ++void dhd_aoe_arp_clr(dhd_pub_t *dhd, int idx); ++int dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx); ++void dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx); ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++#endif /* _dhd_h_ */ +diff --git a/drivers/net/wireless/ap6210/dhd_bta.c b/drivers/net/wireless/ap6210/dhd_bta.c +new file mode 100644 +index 0000000..3752bbd +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_bta.c +@@ -0,0 +1,338 @@ ++/* ++ * BT-AMP support routines ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_bta.c 303834 2011-12-20 06:17:39Z $ ++ */ ++#ifndef WLBTAMP ++#error "WLBTAMP is not defined" ++#endif /* WLBTAMP */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++ ++#ifdef SEND_HCI_CMD_VIA_IOCTL ++#define BTA_HCI_CMD_MAX_LEN HCI_CMD_PREAMBLE_SIZE + HCI_CMD_DATA_SIZE ++ ++/* Send HCI cmd via wl iovar HCI_cmd to the dongle. */ ++int ++dhd_bta_docmd(dhd_pub_t *pub, void *cmd_buf, uint cmd_len) ++{ ++ amp_hci_cmd_t *cmd = (amp_hci_cmd_t *)cmd_buf; ++ uint8 buf[BTA_HCI_CMD_MAX_LEN + 16]; ++ uint len = sizeof(buf); ++ wl_ioctl_t ioc; ++ ++ if (cmd_len < HCI_CMD_PREAMBLE_SIZE) ++ return BCME_BADLEN; ++ ++ if ((uint)cmd->plen + HCI_CMD_PREAMBLE_SIZE > cmd_len) ++ return BCME_BADLEN; ++ ++ len = bcm_mkiovar("HCI_cmd", ++ (char *)cmd, (uint)cmd->plen + HCI_CMD_PREAMBLE_SIZE, (char *)buf, len); ++ ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ++ ioc.cmd = WLC_SET_VAR; ++ ioc.buf = buf; ++ ioc.len = len; ++ ioc.set = TRUE; ++ ++ return dhd_wl_ioctl(pub, &ioc, ioc.buf, ioc.len); ++} ++#else /* !SEND_HCI_CMD_VIA_IOCTL */ ++ ++static void ++dhd_bta_flush_hcidata(dhd_pub_t *pub, uint16 llh) ++{ ++ int prec; ++ struct pktq *q; ++ uint count = 0; ++ ++ q = dhd_bus_txq(pub->bus); ++ if (q == NULL) ++ return; ++ ++ DHD_BTA(("dhd: flushing HCI ACL data for logical link %u...\n", llh)); ++ ++ dhd_os_sdlock_txq(pub); ++ ++ /* Walk through the txq and toss all HCI ACL data packets */ ++ PKTQ_PREC_ITER(q, prec) { ++ void *head_pkt = NULL; ++ ++ while (pktq_ppeek(q, prec) != head_pkt) { ++ void *pkt = pktq_pdeq(q, prec); ++ int ifidx; ++ ++ PKTPULL(pub->osh, pkt, dhd_bus_hdrlen(pub->bus)); ++ dhd_prot_hdrpull(pub, &ifidx, pkt, NULL, NULL); ++ ++ if (PKTLEN(pub->osh, pkt) >= RFC1042_HDR_LEN) { ++ struct ether_header *eh = ++ (struct ether_header *)PKTDATA(pub->osh, pkt); ++ ++ if (ntoh16(eh->ether_type) < ETHER_TYPE_MIN) { ++ struct dot11_llc_snap_header *lsh = ++ (struct dot11_llc_snap_header *)&eh[1]; ++ ++ if (bcmp(lsh, BT_SIG_SNAP_MPROT, ++ DOT11_LLC_SNAP_HDR_LEN - 2) == 0 && ++ ntoh16(lsh->type) == BTA_PROT_L2CAP) { ++ amp_hci_ACL_data_t *ACL_data = ++ (amp_hci_ACL_data_t *)&lsh[1]; ++ uint16 handle = ltoh16(ACL_data->handle); ++ ++ if (HCI_ACL_DATA_HANDLE(handle) == llh) { ++ PKTFREE(pub->osh, pkt, TRUE); ++ count ++; ++ continue; ++ } ++ } ++ } ++ } ++ ++ dhd_prot_hdrpush(pub, ifidx, pkt); ++ PKTPUSH(pub->osh, pkt, dhd_bus_hdrlen(pub->bus)); ++ ++ if (head_pkt == NULL) ++ head_pkt = pkt; ++ pktq_penq(q, prec, pkt); ++ } ++ } ++ ++ dhd_os_sdunlock_txq(pub); ++ ++ DHD_BTA(("dhd: flushed %u packet(s) for logical link %u...\n", count, llh)); ++} ++ ++/* Handle HCI cmd locally. ++ * Return 0: continue to send the cmd across SDIO ++ * < 0: stop, fail ++ * > 0: stop, succuess ++ */ ++static int ++_dhd_bta_docmd(dhd_pub_t *pub, amp_hci_cmd_t *cmd) ++{ ++ int status = 0; ++ ++ switch (ltoh16_ua((uint8 *)&cmd->opcode)) { ++ case HCI_Enhanced_Flush: { ++ eflush_cmd_parms_t *cmdparms = (eflush_cmd_parms_t *)cmd->parms; ++ dhd_bta_flush_hcidata(pub, ltoh16_ua(cmdparms->llh)); ++ break; ++ } ++ default: ++ break; ++ } ++ ++ return status; ++} ++ ++/* Send HCI cmd encapsulated in BT-SIG frame via data channel to the dongle. */ ++int ++dhd_bta_docmd(dhd_pub_t *pub, void *cmd_buf, uint cmd_len) ++{ ++ amp_hci_cmd_t *cmd = (amp_hci_cmd_t *)cmd_buf; ++ struct ether_header *eh; ++ struct dot11_llc_snap_header *lsh; ++ osl_t *osh = pub->osh; ++ uint len; ++ void *p; ++ int status; ++ ++ if (cmd_len < HCI_CMD_PREAMBLE_SIZE) { ++ AP6210_ERR("dhd_bta_docmd: short command, cmd_len %u\n", cmd_len); ++ return BCME_BADLEN; ++ } ++ ++ if ((len = (uint)cmd->plen + HCI_CMD_PREAMBLE_SIZE) > cmd_len) { ++ AP6210_ERR("dhd_bta_docmd: malformed command, len %u cmd_len %u\n", ++ len, cmd_len); ++ /* return BCME_BADLEN; */ ++ } ++ ++ p = PKTGET(osh, pub->hdrlen + RFC1042_HDR_LEN + len, TRUE); ++ if (p == NULL) { ++ AP6210_ERR("dhd_bta_docmd: out of memory\n"); ++ return BCME_NOMEM; ++ } ++ ++ ++ /* intercept and handle the HCI cmd locally */ ++ if ((status = _dhd_bta_docmd(pub, cmd)) > 0) ++ return 0; ++ else if (status < 0) ++ return status; ++ ++ /* copy in HCI cmd */ ++ PKTPULL(osh, p, pub->hdrlen + RFC1042_HDR_LEN); ++ bcopy(cmd, PKTDATA(osh, p), len); ++ ++ /* copy in partial Ethernet header with BT-SIG LLC/SNAP header */ ++ PKTPUSH(osh, p, RFC1042_HDR_LEN); ++ eh = (struct ether_header *)PKTDATA(osh, p); ++ bzero(eh->ether_dhost, ETHER_ADDR_LEN); ++ ETHER_SET_LOCALADDR(eh->ether_dhost); ++ bcopy(&pub->mac, eh->ether_shost, ETHER_ADDR_LEN); ++ eh->ether_type = hton16(len + DOT11_LLC_SNAP_HDR_LEN); ++ lsh = (struct dot11_llc_snap_header *)&eh[1]; ++ bcopy(BT_SIG_SNAP_MPROT, lsh, DOT11_LLC_SNAP_HDR_LEN - 2); ++ lsh->type = 0; ++ ++ return dhd_sendpkt(pub, 0, p); ++} ++#endif /* !SEND_HCI_CMD_VIA_IOCTL */ ++ ++/* Send HCI ACL data to dongle via data channel */ ++int ++dhd_bta_tx_hcidata(dhd_pub_t *pub, void *data_buf, uint data_len) ++{ ++ amp_hci_ACL_data_t *data = (amp_hci_ACL_data_t *)data_buf; ++ struct ether_header *eh; ++ struct dot11_llc_snap_header *lsh; ++ osl_t *osh = pub->osh; ++ uint len; ++ void *p; ++ ++ if (data_len < HCI_ACL_DATA_PREAMBLE_SIZE) { ++ AP6210_ERR("dhd_bta_tx_hcidata: short data_buf, data_len %u\n", data_len); ++ return BCME_BADLEN; ++ } ++ ++ if ((len = (uint)ltoh16(data->dlen) + HCI_ACL_DATA_PREAMBLE_SIZE) > data_len) { ++ AP6210_ERR("dhd_bta_tx_hcidata: malformed hci data, len %u data_len %u\n", ++ len, data_len); ++ /* return BCME_BADLEN; */ ++ } ++ ++ p = PKTGET(osh, pub->hdrlen + RFC1042_HDR_LEN + len, TRUE); ++ if (p == NULL) { ++ AP6210_ERR("dhd_bta_tx_hcidata: out of memory\n"); ++ return BCME_NOMEM; ++ } ++ ++ ++ /* copy in HCI ACL data header and HCI ACL data */ ++ PKTPULL(osh, p, pub->hdrlen + RFC1042_HDR_LEN); ++ bcopy(data, PKTDATA(osh, p), len); ++ ++ /* copy in partial Ethernet header with BT-SIG LLC/SNAP header */ ++ PKTPUSH(osh, p, RFC1042_HDR_LEN); ++ eh = (struct ether_header *)PKTDATA(osh, p); ++ bzero(eh->ether_dhost, ETHER_ADDR_LEN); ++ bcopy(&pub->mac, eh->ether_shost, ETHER_ADDR_LEN); ++ eh->ether_type = hton16(len + DOT11_LLC_SNAP_HDR_LEN); ++ lsh = (struct dot11_llc_snap_header *)&eh[1]; ++ bcopy(BT_SIG_SNAP_MPROT, lsh, DOT11_LLC_SNAP_HDR_LEN - 2); ++ lsh->type = HTON16(BTA_PROT_L2CAP); ++ ++ return dhd_sendpkt(pub, 0, p); ++} ++ ++/* txcomplete callback */ ++void ++dhd_bta_tx_hcidata_complete(dhd_pub_t *dhdp, void *txp, bool success) ++{ ++ uint8 *pktdata = (uint8 *)PKTDATA(dhdp->osh, txp); ++ amp_hci_ACL_data_t *ACL_data = (amp_hci_ACL_data_t *)(pktdata + RFC1042_HDR_LEN); ++ uint16 handle = ltoh16(ACL_data->handle); ++ uint16 llh = HCI_ACL_DATA_HANDLE(handle); ++ ++ wl_event_msg_t event; ++ uint8 data[HCI_EVT_PREAMBLE_SIZE + sizeof(num_completed_data_blocks_evt_parms_t)]; ++ amp_hci_event_t *evt; ++ num_completed_data_blocks_evt_parms_t *parms; ++ ++ uint16 len = HCI_EVT_PREAMBLE_SIZE + sizeof(num_completed_data_blocks_evt_parms_t); ++ ++ /* update the event struct */ ++ memset(&event, 0, sizeof(event)); ++ event.version = hton16(BCM_EVENT_MSG_VERSION); ++ event.event_type = hton32(WLC_E_BTA_HCI_EVENT); ++ event.status = 0; ++ event.reason = 0; ++ event.auth_type = 0; ++ event.datalen = hton32(len); ++ event.flags = 0; ++ ++ /* generate Number of Completed Blocks event */ ++ evt = (amp_hci_event_t *)data; ++ evt->ecode = HCI_Number_of_Completed_Data_Blocks; ++ evt->plen = sizeof(num_completed_data_blocks_evt_parms_t); ++ ++ parms = (num_completed_data_blocks_evt_parms_t *)evt->parms; ++ htol16_ua_store(dhdp->maxdatablks, (uint8 *)&parms->num_blocks); ++ parms->num_handles = 1; ++ htol16_ua_store(llh, (uint8 *)&parms->completed[0].handle); ++ parms->completed[0].pkts = 1; ++ parms->completed[0].blocks = 1; ++ ++ dhd_sendup_event_common(dhdp, &event, data); ++} ++ ++/* event callback */ ++void ++dhd_bta_doevt(dhd_pub_t *dhdp, void *data_buf, uint data_len) ++{ ++ amp_hci_event_t *evt = (amp_hci_event_t *)data_buf; ++ ++ switch (evt->ecode) { ++ case HCI_Command_Complete: { ++ cmd_complete_parms_t *parms = (cmd_complete_parms_t *)evt->parms; ++ switch (ltoh16_ua((uint8 *)&parms->opcode)) { ++ case HCI_Read_Data_Block_Size: { ++ read_data_block_size_evt_parms_t *parms2 = ++ (read_data_block_size_evt_parms_t *)parms->parms; ++ dhdp->maxdatablks = ltoh16_ua((uint8 *)&parms2->data_block_num); ++ break; ++ } ++ } ++ break; ++ } ++ ++ case HCI_Flush_Occurred: { ++ flush_occurred_evt_parms_t *evt_parms = (flush_occurred_evt_parms_t *)evt->parms; ++ dhd_bta_flush_hcidata(dhdp, ltoh16_ua((uint8 *)&evt_parms->handle)); ++ break; ++ } ++ default: ++ break; ++ } ++} +diff --git a/drivers/net/wireless/ap6210/dhd_bta.h b/drivers/net/wireless/ap6210/dhd_bta.h +new file mode 100644 +index 0000000..0337f15 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_bta.h +@@ -0,0 +1,39 @@ ++/* ++ * BT-AMP support routines ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_bta.h 291086 2011-10-21 01:17:24Z $ ++ */ ++#ifndef __dhd_bta_h__ ++#define __dhd_bta_h__ ++ ++struct dhd_pub; ++ ++extern int dhd_bta_docmd(struct dhd_pub *pub, void *cmd_buf, uint cmd_len); ++ ++extern void dhd_bta_doevt(struct dhd_pub *pub, void *data_buf, uint data_len); ++ ++extern int dhd_bta_tx_hcidata(struct dhd_pub *pub, void *data_buf, uint data_len); ++extern void dhd_bta_tx_hcidata_complete(struct dhd_pub *dhdp, void *txp, bool success); ++ ++ ++#endif /* __dhd_bta_h__ */ +diff --git a/drivers/net/wireless/ap6210/dhd_bus.h b/drivers/net/wireless/ap6210/dhd_bus.h +new file mode 100644 +index 0000000..131907d +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_bus.h +@@ -0,0 +1,111 @@ ++/* ++ * Header file describing the internal (inter-module) DHD interfaces. ++ * ++ * Provides type definitions and function prototypes used to link the ++ * DHD OS, bus, and protocol modules. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_bus.h 347614 2012-07-27 10:24:51Z $ ++ */ ++ ++#ifndef _dhd_bus_h_ ++#define _dhd_bus_h_ ++ ++/* ++ * Exported from dhd bus module (dhd_usb, dhd_sdio) ++ */ ++ ++/* Indicate (dis)interest in finding dongles. */ ++extern int dhd_bus_register(void); ++extern void dhd_bus_unregister(void); ++ ++/* Download firmware image and nvram image */ ++extern bool dhd_bus_download_firmware(struct dhd_bus *bus, osl_t *osh, ++ char *fw_path, char *nv_path); ++ ++/* Stop bus module: clear pending frames, disable data flow */ ++extern void dhd_bus_stop(struct dhd_bus *bus, bool enforce_mutex); ++ ++/* Initialize bus module: prepare for communication w/dongle */ ++extern int dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex); ++ ++/* Get the Bus Idle Time */ ++extern void dhd_bus_getidletime(dhd_pub_t *dhdp, int *idletime); ++ ++/* Set the Bus Idle Time */ ++extern void dhd_bus_setidletime(dhd_pub_t *dhdp, int idle_time); ++ ++/* Send a data frame to the dongle. Callee disposes of txp. */ ++extern int dhd_bus_txdata(struct dhd_bus *bus, void *txp, bool wlfc_locked); ++ ++/* Send/receive a control message to/from the dongle. ++ * Expects caller to enforce a single outstanding transaction. ++ */ ++extern int dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen); ++extern int dhd_bus_rxctl(struct dhd_bus *bus, uchar *msg, uint msglen); ++ ++/* Watchdog timer function */ ++extern bool dhd_bus_watchdog(dhd_pub_t *dhd); ++extern void dhd_disable_intr(dhd_pub_t *dhd); ++ ++#if defined(DHD_DEBUG) ++/* Device console input function */ ++extern int dhd_bus_console_in(dhd_pub_t *dhd, uchar *msg, uint msglen); ++#endif /* defined(DHD_DEBUG) */ ++ ++/* Deferred processing for the bus, return TRUE requests reschedule */ ++extern bool dhd_bus_dpc(struct dhd_bus *bus); ++extern void dhd_bus_isr(bool * InterruptRecognized, bool * QueueMiniportHandleInterrupt, void *arg); ++ ++ ++/* Check for and handle local prot-specific iovar commands */ ++extern int dhd_bus_iovar_op(dhd_pub_t *dhdp, const char *name, ++ void *params, int plen, void *arg, int len, bool set); ++ ++/* Add bus dump output to a buffer */ ++extern void dhd_bus_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf); ++ ++/* Clear any bus counters */ ++extern void dhd_bus_clearcounts(dhd_pub_t *dhdp); ++ ++/* return the dongle chipid */ ++extern uint dhd_bus_chip(struct dhd_bus *bus); ++ ++/* Set user-specified nvram parameters. */ ++extern void dhd_bus_set_nvram_params(struct dhd_bus * bus, const char *nvram_params); ++ ++extern void *dhd_bus_pub(struct dhd_bus *bus); ++extern void *dhd_bus_txq(struct dhd_bus *bus); ++extern uint dhd_bus_hdrlen(struct dhd_bus *bus); ++ ++ ++#define DHD_SET_BUS_STATE_DOWN(_bus) do { \ ++ (_bus)->dhd->busstate = DHD_BUS_DOWN; \ ++} while (0) ++ ++/* Register a dummy SDIO client driver in order to be notified of new SDIO device */ ++extern int dhd_bus_reg_sdio_notify(void* semaphore); ++extern void dhd_bus_unreg_sdio_notify(void); ++ ++extern void dhd_txglom_enable(dhd_pub_t *dhdp, bool enable); ++ ++#endif /* _dhd_bus_h_ */ +diff --git a/drivers/net/wireless/ap6210/dhd_cdc.c b/drivers/net/wireless/ap6210/dhd_cdc.c +new file mode 100644 +index 0000000..3a7f55b +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_cdc.c +@@ -0,0 +1,3191 @@ ++/* ++ * DHD Protocol Module for CDC and BDC. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_cdc.c 368762 2012-11-14 21:59:17Z $ ++ * ++ * BDC is like CDC, except it includes a header for data packets to convey ++ * packet priority over the bus, and flags (e.g. to indicate checksum status ++ * for dongle offload.) ++ */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++ ++#ifdef PROP_TXSTATUS ++#include ++#include ++#endif ++ ++#include ++ ++#define RETRIES 2 /* # of retries to retrieve matching ioctl response */ ++#define BUS_HEADER_LEN (24+DHD_SDALIGN) /* Must be at least SDPCM_RESERVE ++ * defined in dhd_sdio.c (amount of header tha might be added) ++ * plus any space that might be needed for alignment padding. ++ */ ++#define ROUND_UP_MARGIN 2048 /* Biggest SDIO block size possible for ++ * round off at the end of buffer ++ */ ++ ++#define BUS_RETRIES 1 /* # of retries before aborting a bus tx operation */ ++ ++#ifdef PROP_TXSTATUS ++typedef struct dhd_wlfc_commit_info { ++ uint8 needs_hdr; ++ uint8 ac_fifo_credit_spent; ++ ewlfc_packet_state_t pkt_type; ++ wlfc_mac_descriptor_t* mac_entry; ++ void* p; ++} dhd_wlfc_commit_info_t; ++#endif /* PROP_TXSTATUS */ ++ ++ ++typedef struct dhd_prot { ++ uint16 reqid; ++ uint8 pending; ++ uint32 lastcmd; ++ uint8 bus_header[BUS_HEADER_LEN]; ++ cdc_ioctl_t msg; ++ unsigned char buf[WLC_IOCTL_MAXLEN + ROUND_UP_MARGIN]; ++} dhd_prot_t; ++ ++ ++static int ++dhdcdc_msg(dhd_pub_t *dhd) ++{ ++ int err = 0; ++ dhd_prot_t *prot = dhd->prot; ++ int len = ltoh32(prot->msg.len) + sizeof(cdc_ioctl_t); ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ DHD_OS_WAKE_LOCK(dhd); ++ ++ /* NOTE : cdc->msg.len holds the desired length of the buffer to be ++ * returned. Only up to CDC_MAX_MSG_SIZE of this buffer area ++ * is actually sent to the dongle ++ */ ++ if (len > CDC_MAX_MSG_SIZE) ++ len = CDC_MAX_MSG_SIZE; ++ ++ /* Send request */ ++ err = dhd_bus_txctl(dhd->bus, (uchar*)&prot->msg, len); ++ ++ DHD_OS_WAKE_UNLOCK(dhd); ++ return err; ++} ++ ++static int ++dhdcdc_cmplt(dhd_pub_t *dhd, uint32 id, uint32 len) ++{ ++ int ret; ++ int cdc_len = len + sizeof(cdc_ioctl_t); ++ dhd_prot_t *prot = dhd->prot; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ do { ++ ret = dhd_bus_rxctl(dhd->bus, (uchar*)&prot->msg, cdc_len); ++ if (ret < 0) ++ break; ++ } while (CDC_IOC_ID(ltoh32(prot->msg.flags)) != id); ++ ++ return ret; ++} ++ ++static int ++dhdcdc_query_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len, uint8 action) ++{ ++ dhd_prot_t *prot = dhd->prot; ++ cdc_ioctl_t *msg = &prot->msg; ++ void *info; ++ int ret = 0, retries = 0; ++ uint32 id, flags = 0; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ AP6210_DEBUG("%s: cmd %d len %d\n", __FUNCTION__, cmd, len); ++ ++ ++ /* Respond "bcmerror" and "bcmerrorstr" with local cache */ ++ if (cmd == WLC_GET_VAR && buf) ++ { ++ if (!strcmp((char *)buf, "bcmerrorstr")) ++ { ++ strncpy((char *)buf, bcmerrorstr(dhd->dongle_error), BCME_STRLEN); ++ goto done; ++ } ++ else if (!strcmp((char *)buf, "bcmerror")) ++ { ++ *(int *)buf = dhd->dongle_error; ++ goto done; ++ } ++ } ++ ++ memset(msg, 0, sizeof(cdc_ioctl_t)); ++ ++ msg->cmd = htol32(cmd); ++ msg->len = htol32(len); ++ msg->flags = (++prot->reqid << CDCF_IOC_ID_SHIFT); ++ CDC_SET_IF_IDX(msg, ifidx); ++ /* add additional action bits */ ++ action &= WL_IOCTL_ACTION_MASK; ++ msg->flags |= (action << CDCF_IOC_ACTION_SHIFT); ++ msg->flags = htol32(msg->flags); ++ ++ if (buf) ++ memcpy(prot->buf, buf, len); ++ ++ if ((ret = dhdcdc_msg(dhd)) < 0) { ++ if (!dhd->hang_was_sent) ++ AP6210_ERR("dhdcdc_query_ioctl: dhdcdc_msg failed w/status %d\n", ret); ++ goto done; ++ } ++ ++retry: ++ /* wait for interrupt and get first fragment */ ++ if ((ret = dhdcdc_cmplt(dhd, prot->reqid, len)) < 0) ++ goto done; ++ ++ flags = ltoh32(msg->flags); ++ id = (flags & CDCF_IOC_ID_MASK) >> CDCF_IOC_ID_SHIFT; ++ ++ if ((id < prot->reqid) && (++retries < RETRIES)) ++ goto retry; ++ if (id != prot->reqid) { ++ AP6210_ERR("%s: %s: unexpected request id %d (expected %d)\n", ++ dhd_ifname(dhd, ifidx), __FUNCTION__, id, prot->reqid); ++ ret = -EINVAL; ++ goto done; ++ } ++ ++ /* Check info buffer */ ++ info = (void*)&msg[1]; ++ ++ /* Copy info buffer */ ++ if (buf) ++ { ++ if (ret < (int)len) ++ len = ret; ++ memcpy(buf, info, len); ++ } ++ ++ /* Check the ERROR flag */ ++ if (flags & CDCF_IOC_ERROR) ++ { ++ ret = ltoh32(msg->status); ++ /* Cache error from dongle */ ++ dhd->dongle_error = ret; ++ } ++ ++done: ++ return ret; ++} ++ ++static int ++dhdcdc_set_ioctl(dhd_pub_t *dhd, int ifidx, uint cmd, void *buf, uint len, uint8 action) ++{ ++ dhd_prot_t *prot = dhd->prot; ++ cdc_ioctl_t *msg = &prot->msg; ++ int ret = 0; ++ uint32 flags, id; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ AP6210_DEBUG("%s: cmd %d len %d\n", __FUNCTION__, cmd, len); ++ ++ if (dhd->busstate == DHD_BUS_DOWN) { ++ AP6210_ERR("%s : bus is down. we have nothing to do\n", __FUNCTION__); ++ return -EIO; ++ } ++ ++ /* don't talk to the dongle if fw is about to be reloaded */ ++ if (dhd->hang_was_sent) { ++ AP6210_ERR("%s: HANG was sent up earlier. Not talking to the chip\n", ++ __FUNCTION__); ++ return -EIO; ++ } ++ ++ memset(msg, 0, sizeof(cdc_ioctl_t)); ++ ++ msg->cmd = htol32(cmd); ++ msg->len = htol32(len); ++ msg->flags = (++prot->reqid << CDCF_IOC_ID_SHIFT); ++ CDC_SET_IF_IDX(msg, ifidx); ++ /* add additional action bits */ ++ action &= WL_IOCTL_ACTION_MASK; ++ msg->flags |= (action << CDCF_IOC_ACTION_SHIFT) | CDCF_IOC_SET; ++ msg->flags = htol32(msg->flags); ++ ++ if (buf) ++ memcpy(prot->buf, buf, len); ++ ++ if ((ret = dhdcdc_msg(dhd)) < 0) { ++ AP6210_ERR("%s: dhdcdc_msg failed w/status %d\n", __FUNCTION__, ret); ++ goto done; ++ } ++ ++ if ((ret = dhdcdc_cmplt(dhd, prot->reqid, len)) < 0) ++ goto done; ++ ++ flags = ltoh32(msg->flags); ++ id = (flags & CDCF_IOC_ID_MASK) >> CDCF_IOC_ID_SHIFT; ++ ++ if (id != prot->reqid) { ++ AP6210_ERR("%s: %s: unexpected request id %d (expected %d)\n", ++ dhd_ifname(dhd, ifidx), __FUNCTION__, id, prot->reqid); ++ ret = -EINVAL; ++ goto done; ++ } ++ ++ /* Check the ERROR flag */ ++ if (flags & CDCF_IOC_ERROR) ++ { ++ ret = ltoh32(msg->status); ++ /* Cache error from dongle */ ++ dhd->dongle_error = ret; ++ } ++ ++done: ++ return ret; ++} ++ ++ ++int ++dhd_prot_ioctl(dhd_pub_t *dhd, int ifidx, wl_ioctl_t * ioc, void * buf, int len) ++{ ++ dhd_prot_t *prot = dhd->prot; ++ int ret = -1; ++ uint8 action; ++#if defined(NDIS630) ++ bool acquired = FALSE; ++#endif ++ ++ if ((dhd->busstate == DHD_BUS_DOWN) || dhd->hang_was_sent) { ++ AP6210_ERR("%s : bus is down. we have nothing to do\n", __FUNCTION__); ++ goto done; ++ } ++#if defined(NDIS630) ++ if (dhd_os_proto_block(dhd)) ++ { ++ acquired = TRUE; ++ } ++ else ++ { ++ /* attempt to acquire protocol mutex timed out. */ ++ ret = -1; ++ return ret; ++ } ++#endif /* NDIS630 */ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ASSERT(len <= WLC_IOCTL_MAXLEN); ++ ++ if (len > WLC_IOCTL_MAXLEN) ++ goto done; ++ ++ if (prot->pending == TRUE) { ++ AP6210_ERR("CDC packet is pending!!!! cmd=0x%x (%lu) lastcmd=0x%x (%lu)\n", ++ ioc->cmd, (unsigned long)ioc->cmd, prot->lastcmd, ++ (unsigned long)prot->lastcmd); ++ if ((ioc->cmd == WLC_SET_VAR) || (ioc->cmd == WLC_GET_VAR)) { ++ AP6210_DEBUG("iovar cmd=%s\n", (char*)buf); ++ } ++ goto done; ++ } ++ ++ prot->pending = TRUE; ++ prot->lastcmd = ioc->cmd; ++ action = ioc->set; ++ if (action & WL_IOCTL_ACTION_SET) ++ ret = dhdcdc_set_ioctl(dhd, ifidx, ioc->cmd, buf, len, action); ++ else { ++ ret = dhdcdc_query_ioctl(dhd, ifidx, ioc->cmd, buf, len, action); ++ if (ret > 0) ++ ioc->used = ret - sizeof(cdc_ioctl_t); ++ } ++ ++ /* Too many programs assume ioctl() returns 0 on success */ ++ if (ret >= 0) ++ ret = 0; ++ else { ++ cdc_ioctl_t *msg = &prot->msg; ++ ioc->needed = ltoh32(msg->len); /* len == needed when set/query fails from dongle */ ++ } ++ ++ /* Intercept the wme_dp ioctl here */ ++ if ((!ret) && (ioc->cmd == WLC_SET_VAR) && (!strcmp(buf, "wme_dp"))) { ++ int slen, val = 0; ++ ++ slen = strlen("wme_dp") + 1; ++ if (len >= (int)(slen + sizeof(int))) ++ bcopy(((char *)buf + slen), &val, sizeof(int)); ++ dhd->wme_dp = (uint8) ltoh32(val); ++ } ++ ++ prot->pending = FALSE; ++ ++done: ++#if defined(NDIS630) ++ if (acquired) ++ dhd_os_proto_unblock(dhd); ++#endif ++ return ret; ++} ++ ++int ++dhd_prot_iovar_op(dhd_pub_t *dhdp, const char *name, ++ void *params, int plen, void *arg, int len, bool set) ++{ ++ return BCME_UNSUPPORTED; ++} ++ ++#ifdef PROP_TXSTATUS ++void ++dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) ++{ ++ int i; ++ uint8* ea; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhdp->wlfc_state; ++ wlfc_hanger_t* h; ++ wlfc_mac_descriptor_t* mac_table; ++ wlfc_mac_descriptor_t* interfaces; ++ char* iftypes[] = {"STA", "AP", "WDS", "p2pGO", "p2pCL"}; ++ ++ if (wlfc == NULL) { ++ bcm_bprintf(strbuf, "wlfc not initialized yet\n"); ++ return; ++ } ++ h = (wlfc_hanger_t*)wlfc->hanger; ++ if (h == NULL) { ++ bcm_bprintf(strbuf, "wlfc-hanger not initialized yet\n"); ++ } ++ ++ mac_table = wlfc->destination_entries.nodes; ++ interfaces = wlfc->destination_entries.interfaces; ++ bcm_bprintf(strbuf, "---- wlfc stats ----\n"); ++ if (h) { ++ bcm_bprintf(strbuf, "wlfc hanger (pushed,popped,f_push," ++ "f_pop,f_slot, pending) = (%d,%d,%d,%d,%d,%d)\n", ++ h->pushed, ++ h->popped, ++ h->failed_to_push, ++ h->failed_to_pop, ++ h->failed_slotfind, ++ (h->pushed - h->popped)); ++ } ++ ++ bcm_bprintf(strbuf, "wlfc fail(tlv,credit_rqst,mac_update,psmode_update), " ++ "(dq_full,sendq_full, rollback_fail) = (%d,%d,%d,%d), (%d,%d,%d)\n", ++ wlfc->stats.tlv_parse_failed, ++ wlfc->stats.credit_request_failed, ++ wlfc->stats.mac_update_failed, ++ wlfc->stats.psmode_update_failed, ++ wlfc->stats.delayq_full_error, ++ wlfc->stats.sendq_full_error, ++ wlfc->stats.rollback_failed); ++ ++ bcm_bprintf(strbuf, "SENDQ (len,credit,sent) " ++ "(AC0[%d,%d,%d],AC1[%d,%d,%d],AC2[%d,%d,%d],AC3[%d,%d,%d],BC_MC[%d,%d,%d])\n", ++ wlfc->SENDQ.q[0].len, wlfc->FIFO_credit[0], wlfc->stats.sendq_pkts[0], ++ wlfc->SENDQ.q[1].len, wlfc->FIFO_credit[1], wlfc->stats.sendq_pkts[1], ++ wlfc->SENDQ.q[2].len, wlfc->FIFO_credit[2], wlfc->stats.sendq_pkts[2], ++ wlfc->SENDQ.q[3].len, wlfc->FIFO_credit[3], wlfc->stats.sendq_pkts[3], ++ wlfc->SENDQ.q[4].len, wlfc->FIFO_credit[4], wlfc->stats.sendq_pkts[4]); ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ bcm_bprintf(strbuf, "SENDQ dropped: AC[0-3]:(%d,%d,%d,%d), (bcmc,atim):(%d,%d)\n", ++ wlfc->stats.dropped_qfull[0], wlfc->stats.dropped_qfull[1], ++ wlfc->stats.dropped_qfull[2], wlfc->stats.dropped_qfull[3], ++ wlfc->stats.dropped_qfull[4], wlfc->stats.dropped_qfull[5]); ++#endif ++ ++ bcm_bprintf(strbuf, "\n"); ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ if (interfaces[i].occupied) { ++ char* iftype_desc; ++ ++ if (interfaces[i].iftype > WLC_E_IF_ROLE_P2P_CLIENT) ++ iftype_desc = "hostif_flow_state[i] == OFF) ++ ? " OFF":" ON")); ++ ++ bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ(len,state,credit)" ++ "= (%d,%s,%d)\n", ++ i, ++ interfaces[i].psq.len, ++ ((interfaces[i].state == ++ WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), ++ interfaces[i].requested_credit); ++ ++ bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ" ++ "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " ++ "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", ++ i, ++ interfaces[i].psq.q[0].len, ++ interfaces[i].psq.q[1].len, ++ interfaces[i].psq.q[2].len, ++ interfaces[i].psq.q[3].len, ++ interfaces[i].psq.q[4].len, ++ interfaces[i].psq.q[5].len, ++ interfaces[i].psq.q[6].len, ++ interfaces[i].psq.q[7].len); ++ } ++ } ++ ++ bcm_bprintf(strbuf, "\n"); ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (mac_table[i].occupied) { ++ ea = mac_table[i].ea; ++ bcm_bprintf(strbuf, "MAC_table[%d].ea = " ++ "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d \n", i, ++ ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], ++ mac_table[i].interface_id); ++ ++ bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ(len,state,credit)" ++ "= (%d,%s,%d)\n", ++ i, ++ mac_table[i].psq.len, ++ ((mac_table[i].state == ++ WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), ++ mac_table[i].requested_credit); ++#ifdef PROP_TXSTATUS_DEBUG ++ bcm_bprintf(strbuf, "MAC_table[%d]: (opened, closed) = (%d, %d)\n", ++ i, mac_table[i].opened_ct, mac_table[i].closed_ct); ++#endif ++ bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ" ++ "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " ++ "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", ++ i, ++ mac_table[i].psq.q[0].len, ++ mac_table[i].psq.q[1].len, ++ mac_table[i].psq.q[2].len, ++ mac_table[i].psq.q[3].len, ++ mac_table[i].psq.q[4].len, ++ mac_table[i].psq.q[5].len, ++ mac_table[i].psq.q[6].len, ++ mac_table[i].psq.q[7].len); ++ } ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ int avg; ++ int moving_avg = 0; ++ int moving_samples; ++ ++ if (wlfc->stats.latency_sample_count) { ++ moving_samples = sizeof(wlfc->stats.deltas)/sizeof(uint32); ++ ++ for (i = 0; i < moving_samples; i++) ++ moving_avg += wlfc->stats.deltas[i]; ++ moving_avg /= moving_samples; ++ ++ avg = (100 * wlfc->stats.total_status_latency) / ++ wlfc->stats.latency_sample_count; ++ bcm_bprintf(strbuf, "txstatus latency (average, last, moving[%d]) = " ++ "(%d.%d, %03d, %03d)\n", ++ moving_samples, avg/100, (avg - (avg/100)*100), ++ wlfc->stats.latency_most_recent, ++ moving_avg); ++ } ++ } ++ ++ bcm_bprintf(strbuf, "wlfc- fifo[0-5] credit stats: sent = (%d,%d,%d,%d,%d,%d), " ++ "back = (%d,%d,%d,%d,%d,%d)\n", ++ wlfc->stats.fifo_credits_sent[0], ++ wlfc->stats.fifo_credits_sent[1], ++ wlfc->stats.fifo_credits_sent[2], ++ wlfc->stats.fifo_credits_sent[3], ++ wlfc->stats.fifo_credits_sent[4], ++ wlfc->stats.fifo_credits_sent[5], ++ ++ wlfc->stats.fifo_credits_back[0], ++ wlfc->stats.fifo_credits_back[1], ++ wlfc->stats.fifo_credits_back[2], ++ wlfc->stats.fifo_credits_back[3], ++ wlfc->stats.fifo_credits_back[4], ++ wlfc->stats.fifo_credits_back[5]); ++ { ++ uint32 fifo_cr_sent = 0; ++ uint32 fifo_cr_acked = 0; ++ uint32 request_cr_sent = 0; ++ uint32 request_cr_ack = 0; ++ uint32 bc_mc_cr_ack = 0; ++ ++ for (i = 0; i < sizeof(wlfc->stats.fifo_credits_sent)/sizeof(uint32); i++) { ++ fifo_cr_sent += wlfc->stats.fifo_credits_sent[i]; ++ } ++ ++ for (i = 0; i < sizeof(wlfc->stats.fifo_credits_back)/sizeof(uint32); i++) { ++ fifo_cr_acked += wlfc->stats.fifo_credits_back[i]; ++ } ++ ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (wlfc->destination_entries.nodes[i].occupied) { ++ request_cr_sent += ++ wlfc->destination_entries.nodes[i].dstncredit_sent_packets; ++ } ++ } ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ if (wlfc->destination_entries.interfaces[i].occupied) { ++ request_cr_sent += ++ wlfc->destination_entries.interfaces[i].dstncredit_sent_packets; ++ } ++ } ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (wlfc->destination_entries.nodes[i].occupied) { ++ request_cr_ack += ++ wlfc->destination_entries.nodes[i].dstncredit_acks; ++ } ++ } ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ if (wlfc->destination_entries.interfaces[i].occupied) { ++ request_cr_ack += ++ wlfc->destination_entries.interfaces[i].dstncredit_acks; ++ } ++ } ++ bcm_bprintf(strbuf, "wlfc- (sent, status) => pq(%d,%d), vq(%d,%d)," ++ "other:%d, bc_mc:%d, signal-only, (sent,freed): (%d,%d)", ++ fifo_cr_sent, fifo_cr_acked, ++ request_cr_sent, request_cr_ack, ++ wlfc->destination_entries.other.dstncredit_acks, ++ bc_mc_cr_ack, ++ wlfc->stats.signal_only_pkts_sent, wlfc->stats.signal_only_pkts_freed); ++ } ++#endif /* PROP_TXSTATUS_DEBUG */ ++ bcm_bprintf(strbuf, "\n"); ++ bcm_bprintf(strbuf, "wlfc- pkt((in,2bus,txstats,hdrpull),(dropped,hdr_only,wlc_tossed)" ++ "(freed,free_err,rollback)) = " ++ "((%d,%d,%d,%d),(%d,%d,%d),(%d,%d,%d))\n", ++ wlfc->stats.pktin, ++ wlfc->stats.pkt2bus, ++ wlfc->stats.txstatus_in, ++ wlfc->stats.dhd_hdrpulls, ++ ++ wlfc->stats.pktdropped, ++ wlfc->stats.wlfc_header_only_pkt, ++ wlfc->stats.wlc_tossed_pkts, ++ ++ wlfc->stats.pkt_freed, ++ wlfc->stats.pkt_free_err, wlfc->stats.rollback); ++ ++ bcm_bprintf(strbuf, "wlfc- suppress((d11,wlc,err),enq(d11,wl,hq,mac?),retx(d11,wlc,hq)) = " ++ "((%d,%d,%d),(%d,%d,%d,%d),(%d,%d,%d))\n", ++ ++ wlfc->stats.d11_suppress, ++ wlfc->stats.wl_suppress, ++ wlfc->stats.bad_suppress, ++ ++ wlfc->stats.psq_d11sup_enq, ++ wlfc->stats.psq_wlsup_enq, ++ wlfc->stats.psq_hostq_enq, ++ wlfc->stats.mac_handle_notfound, ++ ++ wlfc->stats.psq_d11sup_retx, ++ wlfc->stats.psq_wlsup_retx, ++ wlfc->stats.psq_hostq_retx); ++ return; ++} ++ ++/* Create a place to store all packet pointers submitted to the firmware until ++ a status comes back, suppress or otherwise. ++ ++ hang-er: noun, a contrivance on which things are hung, as a hook. ++*/ ++static void* ++dhd_wlfc_hanger_create(osl_t *osh, int max_items) ++{ ++ int i; ++ wlfc_hanger_t* hanger; ++ ++ /* allow only up to a specific size for now */ ++ ASSERT(max_items == WLFC_HANGER_MAXITEMS); ++ ++ if ((hanger = (wlfc_hanger_t*)MALLOC(osh, WLFC_HANGER_SIZE(max_items))) == NULL) ++ return NULL; ++ ++ memset(hanger, 0, WLFC_HANGER_SIZE(max_items)); ++ hanger->max_items = max_items; ++ ++ for (i = 0; i < hanger->max_items; i++) { ++ hanger->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ return hanger; ++} ++ ++static int ++dhd_wlfc_hanger_delete(osl_t *osh, void* hanger) ++{ ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ if (h) { ++ MFREE(osh, h, WLFC_HANGER_SIZE(h->max_items)); ++ return BCME_OK; ++ } ++ return BCME_BADARG; ++} ++ ++static uint16 ++dhd_wlfc_hanger_get_free_slot(void* hanger) ++{ ++ uint32 i; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ if (h) { ++ for (i = (h->slot_pos + 1); i != h->slot_pos;) { ++ if (h->items[i].state == WLFC_HANGER_ITEM_STATE_FREE) { ++ h->slot_pos = i; ++ return (uint16)i; ++ } ++ (i == h->max_items)? i = 0 : i++; ++ } ++ h->failed_slotfind++; ++ } ++ return WLFC_HANGER_MAXITEMS; ++} ++ ++static int ++dhd_wlfc_hanger_get_genbit(void* hanger, void* pkt, uint32 slot_id, int* gen) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ *gen = 0xff; ++ ++ /* this packet was not pushed at the time it went to the firmware */ ++ if (slot_id == WLFC_HANGER_MAXITEMS) ++ return BCME_NOTFOUND; ++ ++ if (h) { ++ if ((h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) || ++ (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED)) { ++ *gen = h->items[slot_id].gen; ++ } ++ else { ++ rc = BCME_NOTFOUND; ++ } ++ } ++ else ++ rc = BCME_BADARG; ++ return rc; ++} ++ ++static int ++dhd_wlfc_hanger_pushpkt(void* hanger, void* pkt, uint32 slot_id) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ if (h && (slot_id < WLFC_HANGER_MAXITEMS)) { ++ if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_FREE) { ++ h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE; ++ h->items[slot_id].pkt = pkt; ++ h->items[slot_id].identifier = slot_id; ++ h->pushed++; ++ } ++ else { ++ h->failed_to_push++; ++ rc = BCME_NOTFOUND; ++ } ++ } ++ else ++ rc = BCME_BADARG; ++ return rc; ++} ++ ++static int ++dhd_wlfc_hanger_poppkt(void* hanger, uint32 slot_id, void** pktout, int remove_from_hanger) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ /* this packet was not pushed at the time it went to the firmware */ ++ if (slot_id == WLFC_HANGER_MAXITEMS) ++ return BCME_NOTFOUND; ++ ++ if (h) { ++ if (h->items[slot_id].state != WLFC_HANGER_ITEM_STATE_FREE) { ++ *pktout = h->items[slot_id].pkt; ++ if (remove_from_hanger) { ++ h->items[slot_id].state = ++ WLFC_HANGER_ITEM_STATE_FREE; ++ h->items[slot_id].pkt = NULL; ++ h->items[slot_id].identifier = 0; ++ h->items[slot_id].gen = 0xff; ++ h->popped++; ++ } ++ } ++ else { ++ h->failed_to_pop++; ++ rc = BCME_NOTFOUND; ++ } ++ } ++ else ++ rc = BCME_BADARG; ++ return rc; ++} ++ ++static int ++dhd_wlfc_hanger_mark_suppressed(void* hanger, uint32 slot_id, uint8 gen) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ /* this packet was not pushed at the time it went to the firmware */ ++ if (slot_id == WLFC_HANGER_MAXITEMS) ++ return BCME_NOTFOUND; ++ if (h) { ++ h->items[slot_id].gen = gen; ++ if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) { ++ h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED; ++ } ++ else ++ rc = BCME_BADARG; ++ } ++ else ++ rc = BCME_BADARG; ++ ++ return rc; ++} ++ ++static int ++_dhd_wlfc_pushheader(athost_wl_status_info_t* ctx, void* p, bool tim_signal, ++ uint8 tim_bmp, uint8 mac_handle, uint32 htodtag) ++{ ++ uint32 wl_pktinfo = 0; ++ uint8* wlh; ++ uint8 dataOffset; ++ uint8 fillers; ++ uint8 tim_signal_len = 0; ++ ++ struct bdc_header *h; ++ ++ if (tim_signal) { ++ tim_signal_len = 1 + 1 + WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; ++ } ++ ++ /* +2 is for Type[1] and Len[1] in TLV, plus TIM signal */ ++ dataOffset = WLFC_CTL_VALUE_LEN_PKTTAG + 2 + tim_signal_len; ++ fillers = ROUNDUP(dataOffset, 4) - dataOffset; ++ dataOffset += fillers; ++ ++ PKTPUSH(ctx->osh, p, dataOffset); ++ wlh = (uint8*) PKTDATA(ctx->osh, p); ++ ++ wl_pktinfo = htol32(htodtag); ++ ++ wlh[0] = WLFC_CTL_TYPE_PKTTAG; ++ wlh[1] = WLFC_CTL_VALUE_LEN_PKTTAG; ++ memcpy(&wlh[2], &wl_pktinfo, sizeof(uint32)); ++ ++ if (tim_signal_len) { ++ wlh[dataOffset - fillers - tim_signal_len ] = ++ WLFC_CTL_TYPE_PENDING_TRAFFIC_BMP; ++ wlh[dataOffset - fillers - tim_signal_len + 1] = ++ WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; ++ wlh[dataOffset - fillers - tim_signal_len + 2] = mac_handle; ++ wlh[dataOffset - fillers - tim_signal_len + 3] = tim_bmp; ++ } ++ if (fillers) ++ memset(&wlh[dataOffset - fillers], WLFC_CTL_TYPE_FILLER, fillers); ++ ++ PKTPUSH(ctx->osh, p, BDC_HEADER_LEN); ++ h = (struct bdc_header *)PKTDATA(ctx->osh, p); ++ h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); ++ if (PKTSUMNEEDED(p)) ++ h->flags |= BDC_FLAG_SUM_NEEDED; ++ ++ ++ h->priority = (PKTPRIO(p) & BDC_PRIORITY_MASK); ++ h->flags2 = 0; ++ h->dataOffset = dataOffset >> 2; ++ BDC_SET_IF_IDX(h, DHD_PKTTAG_IF(PKTTAG(p))); ++ return BCME_OK; ++} ++ ++static int ++_dhd_wlfc_pullheader(athost_wl_status_info_t* ctx, void* pktbuf) ++{ ++ struct bdc_header *h; ++ ++ if (PKTLEN(ctx->osh, pktbuf) < BDC_HEADER_LEN) { ++ AP6210_DEBUG("%s: rx data too short (%d < %d)\n", __FUNCTION__, ++ PKTLEN(ctx->osh, pktbuf), BDC_HEADER_LEN); ++ return BCME_ERROR; ++ } ++ h = (struct bdc_header *)PKTDATA(ctx->osh, pktbuf); ++ ++ /* pull BDC header */ ++ PKTPULL(ctx->osh, pktbuf, BDC_HEADER_LEN); ++ ++ if (PKTLEN(ctx->osh, pktbuf) < (h->dataOffset << 2)) { ++ AP6210_DEBUG("%s: rx data too short (%d < %d)\n", __FUNCTION__, ++ PKTLEN(ctx->osh, pktbuf), (h->dataOffset << 2)); ++ return BCME_ERROR; ++ } ++ /* pull wl-header */ ++ PKTPULL(ctx->osh, pktbuf, (h->dataOffset << 2)); ++ return BCME_OK; ++} ++ ++static wlfc_mac_descriptor_t* ++_dhd_wlfc_find_table_entry(athost_wl_status_info_t* ctx, void* p) ++{ ++ int i; ++ wlfc_mac_descriptor_t* table = ctx->destination_entries.nodes; ++ uint8 ifid = DHD_PKTTAG_IF(PKTTAG(p)); ++ uint8* dstn = DHD_PKTTAG_DSTN(PKTTAG(p)); ++ ++ if (((ctx->destination_entries.interfaces[ifid].iftype == WLC_E_IF_ROLE_STA) || ++ ETHER_ISMULTI(dstn) || ++ (ctx->destination_entries.interfaces[ifid].iftype == WLC_E_IF_ROLE_P2P_CLIENT)) && ++ (ctx->destination_entries.interfaces[ifid].occupied)) { ++ return &ctx->destination_entries.interfaces[ifid]; ++ } ++ ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (table[i].occupied) { ++ if (table[i].interface_id == ifid) { ++ if (!memcmp(table[i].ea, dstn, ETHER_ADDR_LEN)) ++ return &table[i]; ++ } ++ } ++ } ++ return &ctx->destination_entries.other; ++} ++ ++static int ++_dhd_wlfc_rollback_packet_toq(athost_wl_status_info_t* ctx, ++ void* p, ewlfc_packet_state_t pkt_type, uint32 hslot) ++{ ++ /* ++ put the packet back to the head of queue ++ ++ - a packet from send-q will need to go back to send-q and not delay-q ++ since that will change the order of packets. ++ - suppressed packet goes back to suppress sub-queue ++ - pull out the header, if new or delayed packet ++ ++ Note: hslot is used only when header removal is done. ++ */ ++ wlfc_mac_descriptor_t* entry; ++ void* pktout; ++ int rc = BCME_OK; ++ int prec; ++ ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ prec = DHD_PKTTAG_FIFO(PKTTAG(p)); ++ if (entry != NULL) { ++ if (pkt_type == eWLFC_PKTTYPE_SUPPRESSED) { ++ /* wl-header is saved for suppressed packets */ ++ if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, ((prec << 1) + 1), p) == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ } ++ else { ++ /* remove header first */ ++ rc = _dhd_wlfc_pullheader(ctx, p); ++ if (rc != BCME_OK) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ /* free the hanger slot */ ++ dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); ++ PKTFREE(ctx->osh, p, TRUE); ++ rc = BCME_ERROR; ++ return rc; ++ } ++ ++ if (pkt_type == eWLFC_PKTTYPE_DELAYED) { ++ /* delay-q packets are going to delay-q */ ++ if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, (prec << 1), p) == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ } ++ else { ++ /* these are going to SENDQ */ ++ if (WLFC_PKTQ_PENQ_HEAD(&ctx->SENDQ, prec, p) == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ } ++ /* free the hanger slot */ ++ dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); ++ ++ /* decrement sequence count */ ++ WLFC_DECR_SEQCOUNT(entry, prec); ++ } ++ /* ++ if this packet did not count against FIFO credit, it must have ++ taken a requested_credit from the firmware (for pspoll etc.) ++ */ ++ if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { ++ entry->requested_credit++; ++ } ++ } ++ else { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ if (rc != BCME_OK) ++ ctx->stats.rollback_failed++; ++ else ++ ctx->stats.rollback++; ++ ++ return rc; ++} ++ ++static void ++_dhd_wlfc_flow_control_check(athost_wl_status_info_t* ctx, struct pktq* pq, uint8 if_id) ++{ ++ if ((pq->len <= WLFC_FLOWCONTROL_LOWATER) && (ctx->hostif_flow_state[if_id] == ON)) { ++ /* start traffic */ ++ ctx->hostif_flow_state[if_id] = OFF; ++ /* ++ AP6210_DEBUG("qlen:%02d, if:%02d, ->OFF, start traffic %s()\n", ++ pq->len, if_id, __FUNCTION__); ++ */ ++ AP6210_DEBUG("F"); ++ dhd_txflowcontrol(ctx->dhdp, if_id, OFF); ++ ctx->toggle_host_if = 0; ++ } ++ if ((pq->len >= WLFC_FLOWCONTROL_HIWATER) && (ctx->hostif_flow_state[if_id] == OFF)) { ++ /* stop traffic */ ++ ctx->hostif_flow_state[if_id] = ON; ++ /* ++ AP6210_DEBUG("qlen:%02d, if:%02d, ->ON, stop traffic %s()\n", ++ pq->len, if_id, __FUNCTION__); ++ */ ++ AP6210_DEBUG("N"); ++ dhd_txflowcontrol(ctx->dhdp, if_id, ON); ++ ctx->host_ifidx = if_id; ++ ctx->toggle_host_if = 1; ++ } ++ return; ++} ++ ++static int ++_dhd_wlfc_send_signalonly_packet(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, ++ uint8 ta_bmp) ++{ ++ int rc = BCME_OK; ++ void* p = NULL; ++ int dummylen = ((dhd_pub_t *)ctx->dhdp)->hdrlen+ 12; ++ ++ /* allocate a dummy packet */ ++ p = PKTGET(ctx->osh, dummylen, TRUE); ++ if (p) { ++ PKTPULL(ctx->osh, p, dummylen); ++ DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), 0); ++ _dhd_wlfc_pushheader(ctx, p, TRUE, ta_bmp, entry->mac_handle, 0); ++ DHD_PKTTAG_SETSIGNALONLY(PKTTAG(p), 1); ++#ifdef PROP_TXSTATUS_DEBUG ++ ctx->stats.signal_only_pkts_sent++; ++#endif ++ rc = dhd_bus_txdata(((dhd_pub_t *)ctx->dhdp)->bus, p, FALSE); ++ if (rc != BCME_OK) { ++ PKTFREE(ctx->osh, p, TRUE); ++ } ++ } ++ else { ++ AP6210_ERR("%s: couldn't allocate new %d-byte packet\n", ++ __FUNCTION__, dummylen); ++ rc = BCME_NOMEM; ++ } ++ return rc; ++} ++ ++/* Return TRUE if traffic availability changed */ ++static bool ++_dhd_wlfc_traffic_pending_check(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, ++ int prec) ++{ ++ bool rc = FALSE; ++ ++ if (entry->state == WLFC_STATE_CLOSE) { ++ if ((pktq_plen(&entry->psq, (prec << 1)) == 0) && ++ (pktq_plen(&entry->psq, ((prec << 1) + 1)) == 0)) { ++ ++ if (entry->traffic_pending_bmp & NBITVAL(prec)) { ++ rc = TRUE; ++ entry->traffic_pending_bmp = ++ entry->traffic_pending_bmp & ~ NBITVAL(prec); ++ } ++ } ++ else { ++ if (!(entry->traffic_pending_bmp & NBITVAL(prec))) { ++ rc = TRUE; ++ entry->traffic_pending_bmp = ++ entry->traffic_pending_bmp | NBITVAL(prec); ++ } ++ } ++ } ++ if (rc) { ++ /* request a TIM update to firmware at the next piggyback opportunity */ ++ if (entry->traffic_lastreported_bmp != entry->traffic_pending_bmp) { ++ entry->send_tim_signal = 1; ++ _dhd_wlfc_send_signalonly_packet(ctx, entry, entry->traffic_pending_bmp); ++ entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; ++ entry->send_tim_signal = 0; ++ } ++ else { ++ rc = FALSE; ++ } ++ } ++ return rc; ++} ++ ++static int ++_dhd_wlfc_enque_suppressed(athost_wl_status_info_t* ctx, int prec, void* p) ++{ ++ wlfc_mac_descriptor_t* entry; ++ ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ if (entry == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_NOTFOUND; ++ } ++ /* ++ - suppressed packets go to sub_queue[2*prec + 1] AND ++ - delayed packets go to sub_queue[2*prec + 0] to ensure ++ order of delivery. ++ */ ++ if (WLFC_PKTQ_PENQ(&entry->psq, ((prec << 1) + 1), p) == NULL) { ++ ctx->stats.delayq_full_error++; ++ /* AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); */ ++ AP6210_DEBUG("s"); ++ return BCME_ERROR; ++ } ++ /* A packet has been pushed, update traffic availability bitmap, if applicable */ ++ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); ++ _dhd_wlfc_flow_control_check(ctx, &entry->psq, DHD_PKTTAG_IF(PKTTAG(p))); ++ return BCME_OK; ++} ++ ++static int ++_dhd_wlfc_pretx_pktprocess(athost_wl_status_info_t* ctx, ++ wlfc_mac_descriptor_t* entry, void* p, int header_needed, uint32* slot) ++{ ++ int rc = BCME_OK; ++ int hslot = WLFC_HANGER_MAXITEMS; ++ bool send_tim_update = FALSE; ++ uint32 htod = 0; ++ uint8 free_ctr; ++ ++ *slot = hslot; ++ ++ if (entry == NULL) { ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ } ++ ++ if (entry == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_ERROR; ++ } ++ if (entry->send_tim_signal) { ++ send_tim_update = TRUE; ++ entry->send_tim_signal = 0; ++ entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; ++ } ++ if (header_needed) { ++ hslot = dhd_wlfc_hanger_get_free_slot(ctx->hanger); ++ free_ctr = WLFC_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); ++ DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); ++ WLFC_PKTFLAG_SET_GENERATION(htod, entry->generation); ++ entry->transit_count++; ++ } ++ else { ++ hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ } ++ WLFC_PKTID_HSLOT_SET(htod, hslot); ++ WLFC_PKTID_FREERUNCTR_SET(htod, free_ctr); ++ DHD_PKTTAG_SETPKTDIR(PKTTAG(p), 1); ++ WL_TXSTATUS_SET_FLAGS(htod, WLFC_PKTFLAG_PKTFROMHOST); ++ WL_TXSTATUS_SET_FIFO(htod, DHD_PKTTAG_FIFO(PKTTAG(p))); ++ ++ if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { ++ /* ++ Indicate that this packet is being sent in response to an ++ explicit request from the firmware side. ++ */ ++ WLFC_PKTFLAG_SET_PKTREQUESTED(htod); ++ } ++ else { ++ WLFC_PKTFLAG_CLR_PKTREQUESTED(htod); ++ } ++ if (header_needed) { ++ rc = _dhd_wlfc_pushheader(ctx, p, send_tim_update, ++ entry->traffic_lastreported_bmp, entry->mac_handle, htod); ++ if (rc == BCME_OK) { ++ DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); ++ /* ++ a new header was created for this packet. ++ push to hanger slot and scrub q. Since bus ++ send succeeded, increment seq number as well. ++ */ ++ rc = dhd_wlfc_hanger_pushpkt(ctx->hanger, p, hslot); ++ if (rc == BCME_OK) { ++ /* increment free running sequence count */ ++ WLFC_INCR_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); ++#ifdef PROP_TXSTATUS_DEBUG ++ ((wlfc_hanger_t*)(ctx->hanger))->items[hslot].push_time = ++ OSL_SYSUPTIME(); ++#endif ++ } ++ else { ++ AP6210_DEBUG("%s() hanger_pushpkt() failed, rc: %d\n", ++ __FUNCTION__, rc); ++ } ++ } ++ } ++ else { ++ int gen; ++ ++ /* remove old header */ ++ rc = _dhd_wlfc_pullheader(ctx, p); ++ if (rc == BCME_OK) { ++ hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ dhd_wlfc_hanger_get_genbit(ctx->hanger, p, hslot, &gen); ++ ++ WLFC_PKTFLAG_SET_GENERATION(htod, gen); ++ free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ /* push new header */ ++ _dhd_wlfc_pushheader(ctx, p, send_tim_update, ++ entry->traffic_lastreported_bmp, entry->mac_handle, htod); ++ } ++ } ++ *slot = hslot; ++ return rc; ++} ++ ++static int ++_dhd_wlfc_is_destination_closed(athost_wl_status_info_t* ctx, ++ wlfc_mac_descriptor_t* entry, int prec) ++{ ++ if (ctx->destination_entries.interfaces[entry->interface_id].iftype == ++ WLC_E_IF_ROLE_P2P_GO) { ++ /* - destination interface is of type p2p GO. ++ For a p2pGO interface, if the destination is OPEN but the interface is ++ CLOSEd, do not send traffic. But if the dstn is CLOSEd while there is ++ destination-specific-credit left send packets. This is because the ++ firmware storing the destination-specific-requested packet in queue. ++ */ ++ if ((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && ++ (entry->requested_packet == 0)) ++ return 1; ++ } ++ /* AP, p2p_go -> unicast desc entry, STA/p2p_cl -> interface desc. entry */ ++ if (((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && ++ (entry->requested_packet == 0)) || ++ (!(entry->ac_bitmap & (1 << prec)))) ++ return 1; ++ ++ return 0; ++} ++ ++static void* ++_dhd_wlfc_deque_delayedq(athost_wl_status_info_t* ctx, ++ int prec, uint8* ac_credit_spent, uint8* needs_hdr, wlfc_mac_descriptor_t** entry_out) ++{ ++ wlfc_mac_descriptor_t* entry; ++ wlfc_mac_descriptor_t* table; ++ uint8 token_pos; ++ int total_entries; ++ void* p = NULL; ++ int pout; ++ int i; ++ ++ *entry_out = NULL; ++ token_pos = ctx->token_pos[prec]; ++ /* most cases a packet will count against FIFO credit */ ++ *ac_credit_spent = 1; ++ *needs_hdr = 1; ++ ++ /* search all entries, include nodes as well as interfaces */ ++ table = (wlfc_mac_descriptor_t*)&ctx->destination_entries; ++ total_entries = sizeof(ctx->destination_entries)/sizeof(wlfc_mac_descriptor_t); ++ ++ for (i = 0; i < total_entries; i++) { ++ entry = &table[(token_pos + i) % total_entries]; ++ if (entry->occupied) { ++ if (!_dhd_wlfc_is_destination_closed(ctx, entry, prec)) { ++ p = pktq_mdeq(&entry->psq, ++ /* higher precedence will be picked up first, ++ * i.e. suppressed packets before delayed ones ++ */ ++ NBITVAL((prec << 1) + 1), &pout); ++ *needs_hdr = 0; ++ ++ if (p == NULL) { ++ if (entry->suppressed == TRUE) { ++ if ((entry->suppr_transit_count <= ++ entry->suppress_count)) { ++ entry->suppressed = FALSE; ++ } else { ++ return NULL; ++ } ++ } ++ /* De-Q from delay Q */ ++ p = pktq_mdeq(&entry->psq, ++ NBITVAL((prec << 1)), ++ &pout); ++ *needs_hdr = 1; ++ } ++ ++ if (p != NULL) { ++ /* did the packet come from suppress sub-queue? */ ++ if (entry->requested_credit > 0) { ++ entry->requested_credit--; ++#ifdef PROP_TXSTATUS_DEBUG ++ entry->dstncredit_sent_packets++; ++#endif ++ /* ++ if the packet was pulled out while destination is in ++ closed state but had a non-zero packets requested, ++ then this should not count against the FIFO credit. ++ That is due to the fact that the firmware will ++ most likely hold onto this packet until a suitable ++ time later to push it to the appropriate AC FIFO. ++ */ ++ if (entry->state == WLFC_STATE_CLOSE) ++ *ac_credit_spent = 0; ++ } ++ else if (entry->requested_packet > 0) { ++ entry->requested_packet--; ++ DHD_PKTTAG_SETONETIMEPKTRQST(PKTTAG(p)); ++ if (entry->state == WLFC_STATE_CLOSE) ++ *ac_credit_spent = 0; ++ } ++ /* move token to ensure fair round-robin */ ++ ctx->token_pos[prec] = ++ (token_pos + i + 1) % total_entries; ++ *entry_out = entry; ++ _dhd_wlfc_flow_control_check(ctx, &entry->psq, ++ DHD_PKTTAG_IF(PKTTAG(p))); ++ /* ++ A packet has been picked up, update traffic ++ availability bitmap, if applicable ++ */ ++ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); ++ return p; ++ } ++ } ++ } ++ } ++ return NULL; ++} ++ ++static void* ++_dhd_wlfc_deque_sendq(athost_wl_status_info_t* ctx, int prec) ++{ ++ wlfc_mac_descriptor_t* entry; ++ void* p; ++ ++ ++ p = pktq_pdeq(&ctx->SENDQ, prec); ++ if (p != NULL) { ++ if (ETHER_ISMULTI(DHD_PKTTAG_DSTN(PKTTAG(p)))) ++ /* bc/mc packets do not have a delay queue */ ++ return p; ++ ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ ++ if (entry == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return p; ++ } ++ ++ while ((p != NULL)) { ++ /* ++ - suppressed packets go to sub_queue[2*prec + 1] AND ++ - delayed packets go to sub_queue[2*prec + 0] to ensure ++ order of delivery. ++ */ ++ if (WLFC_PKTQ_PENQ(&entry->psq, (prec << 1), p) == NULL) { ++ AP6210_DEBUG("D"); ++ /* dhd_txcomplete(ctx->dhdp, p, FALSE); */ ++ PKTFREE(ctx->osh, p, TRUE); ++ ctx->stats.delayq_full_error++; ++ } ++ /* ++ A packet has been pushed, update traffic availability bitmap, ++ if applicable ++ */ ++ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); ++ ++ p = pktq_pdeq(&ctx->SENDQ, prec); ++ if (p == NULL) ++ break; ++ ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ ++ if ((entry == NULL) || (ETHER_ISMULTI(DHD_PKTTAG_DSTN(PKTTAG(p))))) { ++ return p; ++ } ++ } ++ } ++ return p; ++} ++ ++static int ++_dhd_wlfc_mac_entry_update(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, ++ ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) ++{ ++ int rc = BCME_OK; ++ ++ if (action == eWLFC_MAC_ENTRY_ACTION_ADD) { ++ entry->occupied = 1; ++ entry->state = WLFC_STATE_OPEN; ++ entry->requested_credit = 0; ++ entry->interface_id = ifid; ++ entry->iftype = iftype; ++ entry->ac_bitmap = 0xff; /* update this when handling APSD */ ++ /* for an interface entry we may not care about the MAC address */ ++ if (ea != NULL) ++ memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); ++ pktq_init(&entry->psq, WLFC_PSQ_PREC_COUNT, WLFC_PSQ_LEN); ++ } ++ else if (action == eWLFC_MAC_ENTRY_ACTION_UPDATE) { ++ entry->occupied = 1; ++ entry->state = WLFC_STATE_OPEN; ++ entry->requested_credit = 0; ++ entry->interface_id = ifid; ++ entry->iftype = iftype; ++ entry->ac_bitmap = 0xff; /* update this when handling APSD */ ++ /* for an interface entry we may not care about the MAC address */ ++ if (ea != NULL) ++ memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); ++ } ++ else if (action == eWLFC_MAC_ENTRY_ACTION_DEL) { ++ entry->occupied = 0; ++ entry->state = WLFC_STATE_CLOSE; ++ entry->requested_credit = 0; ++ /* enable after packets are queued-deqeued properly. ++ pktq_flush(dhd->osh, &entry->psq, FALSE, NULL, 0); ++ */ ++ } ++ return rc; ++} ++ ++int ++_dhd_wlfc_borrow_credit(athost_wl_status_info_t* ctx, uint8 available_credit_map, int borrower_ac) ++{ ++ int lender_ac; ++ int rc = BCME_ERROR; ++ ++ if (ctx == NULL || available_credit_map == 0) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_BADARG; ++ } ++ ++ /* Borrow from lowest priority available AC (including BC/MC credits) */ ++ for (lender_ac = 0; lender_ac <= AC_COUNT; lender_ac++) { ++ if ((available_credit_map && (1 << lender_ac)) && ++ (ctx->FIFO_credit[lender_ac] > 0)) { ++ ctx->credits_borrowed[borrower_ac][lender_ac]++; ++ ctx->FIFO_credit[lender_ac]--; ++ rc = BCME_OK; ++ break; ++ } ++ } ++ ++ return rc; ++} ++ ++int ++dhd_wlfc_interface_entry_update(void* state, ++ ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) ++{ ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ wlfc_mac_descriptor_t* entry; ++ ++ if (ifid >= WLFC_MAX_IFNUM) ++ return BCME_BADARG; ++ ++ entry = &ctx->destination_entries.interfaces[ifid]; ++ return _dhd_wlfc_mac_entry_update(ctx, entry, action, ifid, iftype, ea); ++} ++ ++int ++dhd_wlfc_FIFOcreditmap_update(void* state, uint8* credits) ++{ ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ ++ /* update the AC FIFO credit map */ ++ ctx->FIFO_credit[0] = credits[0]; ++ ctx->FIFO_credit[1] = credits[1]; ++ ctx->FIFO_credit[2] = credits[2]; ++ ctx->FIFO_credit[3] = credits[3]; ++ /* credit for bc/mc packets */ ++ ctx->FIFO_credit[4] = credits[4]; ++ /* credit for ATIM FIFO is not used yet. */ ++ ctx->FIFO_credit[5] = 0; ++ return BCME_OK; ++} ++ ++int ++dhd_wlfc_enque_sendq(void* state, int prec, void* p) ++{ ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ ++ if ((state == NULL) || ++ /* prec = AC_COUNT is used for bc/mc queue */ ++ (prec > AC_COUNT) || ++ (p == NULL)) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_BADARG; ++ } ++ if (FALSE == dhd_prec_enq(ctx->dhdp, &ctx->SENDQ, p, prec)) { ++ ctx->stats.sendq_full_error++; ++ /* ++ AP6210_DEBUG("Error: %s():%d, qlen:%d\n", ++ __FUNCTION__, __LINE__, ctx->SENDQ.len); ++ */ ++ WLFC_HOST_FIFO_DROPPEDCTR_INC(ctx, prec); ++ AP6210_DEBUG("Q"); ++ PKTFREE(ctx->osh, p, TRUE); ++ return BCME_ERROR; ++ } ++ ctx->stats.pktin++; ++ /* _dhd_wlfc_flow_control_check(ctx, &ctx->SENDQ, DHD_PKTTAG_IF(PKTTAG(p))); */ ++ return BCME_OK; ++} ++ ++int ++_dhd_wlfc_handle_packet_commit(athost_wl_status_info_t* ctx, int ac, ++ dhd_wlfc_commit_info_t *commit_info, f_commitpkt_t fcommit, void* commit_ctx) ++{ ++ uint32 hslot; ++ int rc; ++ ++ /* ++ if ac_fifo_credit_spent = 0 ++ ++ This packet will not count against the FIFO credit. ++ To ensure the txstatus corresponding to this packet ++ does not provide an implied credit (default behavior) ++ mark the packet accordingly. ++ ++ if ac_fifo_credit_spent = 1 ++ ++ This is a normal packet and it counts against the FIFO ++ credit count. ++ */ ++ DHD_PKTTAG_SETCREDITCHECK(PKTTAG(commit_info->p), commit_info->ac_fifo_credit_spent); ++ rc = _dhd_wlfc_pretx_pktprocess(ctx, commit_info->mac_entry, commit_info->p, ++ commit_info->needs_hdr, &hslot); ++ ++ if (rc == BCME_OK) ++ rc = fcommit(commit_ctx, commit_info->p, TRUE); ++ else ++ ctx->stats.generic_error++; ++ ++ if (rc == BCME_OK) { ++ ctx->stats.pkt2bus++; ++ if (commit_info->ac_fifo_credit_spent) { ++ ctx->stats.sendq_pkts[ac]++; ++ WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac); ++ } ++ } else if (rc == BCME_NORESOURCE) ++ rc = BCME_ERROR; ++ else { ++ /* ++ bus commit has failed, rollback. ++ - remove wl-header for a delayed packet ++ - save wl-header header for suppressed packets ++ */ ++ rc = _dhd_wlfc_rollback_packet_toq(ctx, commit_info->p, ++ (commit_info->pkt_type), hslot); ++ if (rc != BCME_OK) ++ ctx->stats.rollback_failed++; ++ ++ rc = BCME_ERROR; ++ } ++ ++ return rc; ++} ++ ++int ++dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx) ++{ ++ int ac; ++ int credit; ++ int rc; ++ dhd_wlfc_commit_info_t commit_info; ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ int credit_count = 0; ++ int bus_retry_count = 0; ++ uint8 ac_available = 0; /* Bitmask for 4 ACs + BC/MC */ ++ ++ if ((state == NULL) || ++ (fcommit == NULL)) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_BADARG; ++ } ++ ++ memset(&commit_info, 0, sizeof(commit_info)); ++ ++ /* ++ Commit packets for regular AC traffic. Higher priority first. ++ First, use up FIFO credits available to each AC. Based on distribution ++ and credits left, borrow from other ACs as applicable ++ ++ -NOTE: ++ If the bus between the host and firmware is overwhelmed by the ++ traffic from host, it is possible that higher priority traffic ++ starves the lower priority queue. If that occurs often, we may ++ have to employ weighted round-robin or ucode scheme to avoid ++ low priority packet starvation. ++ */ ++ ++ for (ac = AC_COUNT; ac >= 0; ac--) { ++ ++ int initial_credit_count = ctx->FIFO_credit[ac]; ++ ++ /* packets from SENDQ are fresh and they'd need header and have no MAC entry */ ++ commit_info.needs_hdr = 1; ++ commit_info.mac_entry = NULL; ++ commit_info.pkt_type = eWLFC_PKTTYPE_NEW; ++ ++ do { ++ commit_info.p = _dhd_wlfc_deque_sendq(ctx, ac); ++ if (commit_info.p == NULL) ++ break; ++ else if (ETHER_ISMULTI(DHD_PKTTAG_DSTN(PKTTAG(commit_info.p)))) { ++ ASSERT(ac == AC_COUNT); ++ ++ if (ctx->FIFO_credit[ac]) { ++ rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, ++ fcommit, commit_ctx); ++ ++ /* Bus commits may fail (e.g. flow control); abort after retries */ ++ if (rc == BCME_OK) { ++ if (commit_info.ac_fifo_credit_spent) { ++ (void) _dhd_wlfc_borrow_credit(ctx, ++ ac_available, ac); ++ credit_count--; ++ } ++ } else { ++ bus_retry_count++; ++ if (bus_retry_count >= BUS_RETRIES) { ++ AP6210_ERR(" %s: bus error\n", ++ __FUNCTION__); ++ return rc; ++ } ++ } ++ } ++ } ++ ++ } while (commit_info.p); ++ ++ for (credit = 0; credit < ctx->FIFO_credit[ac];) { ++ commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, ++ &(commit_info.ac_fifo_credit_spent), ++ &(commit_info.needs_hdr), ++ &(commit_info.mac_entry)); ++ ++ if (commit_info.p == NULL) ++ break; ++ ++ commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : ++ eWLFC_PKTTYPE_SUPPRESSED; ++ ++ rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, ++ fcommit, commit_ctx); ++ ++ /* Bus commits may fail (e.g. flow control); abort after retries */ ++ if (rc == BCME_OK) { ++ if (commit_info.ac_fifo_credit_spent) { ++ credit++; ++ } ++ } ++ else { ++ bus_retry_count++; ++ if (bus_retry_count >= BUS_RETRIES) { ++ AP6210_ERR("dhd_wlfc_commit_packets(): bus error\n"); ++ ctx->FIFO_credit[ac] -= credit; ++ return rc; ++ } ++ } ++ } ++ ++ ctx->FIFO_credit[ac] -= credit; ++ ++ ++ /* If no credits were used, the queue is idle and can be re-used ++ Note that resv credits cannot be borrowed ++ */ ++ if (initial_credit_count == ctx->FIFO_credit[ac]) { ++ ac_available |= (1 << ac); ++ credit_count += ctx->FIFO_credit[ac]; ++ } ++ } ++ ++ /* We borrow only for AC_BE and only if no other traffic seen for DEFER_PERIOD ++ ++ Note that (ac_available & WLFC_AC_BE_TRAFFIC_ONLY) is done to: ++ a) ignore BC/MC for deferring borrow ++ b) ignore AC_BE being available along with other ACs ++ (this should happen only for pure BC/MC traffic) ++ ++ i.e. AC_VI, AC_VO, AC_BK all MUST be available (i.e. no traffic) and ++ we do not care if AC_BE and BC/MC are available or not ++ */ ++ if ((ac_available & WLFC_AC_BE_TRAFFIC_ONLY) == WLFC_AC_BE_TRAFFIC_ONLY) { ++ ++ if (ctx->allow_credit_borrow) { ++ ac = 1; /* Set ac to AC_BE and borrow credits */ ++ } ++ else { ++ int delta; ++ int curr_t = OSL_SYSUPTIME(); ++ ++ if (curr_t > ctx->borrow_defer_timestamp) ++ delta = curr_t - ctx->borrow_defer_timestamp; ++ else ++ delta = 0xffffffff + curr_t - ctx->borrow_defer_timestamp; ++ ++ if (delta >= WLFC_BORROW_DEFER_PERIOD_MS) { ++ /* Reset borrow but defer to next iteration (defensive borrowing) */ ++ ctx->allow_credit_borrow = TRUE; ++ ctx->borrow_defer_timestamp = 0; ++ } ++ return BCME_OK; ++ } ++ } ++ else { ++ /* If we have multiple AC traffic, turn off borrowing, mark time and bail out */ ++ ctx->allow_credit_borrow = FALSE; ++ ctx->borrow_defer_timestamp = OSL_SYSUPTIME(); ++ return BCME_OK; ++ } ++ ++ /* At this point, borrow all credits only for "ac" (which should be set above to AC_BE) ++ Generically use "ac" only in case we extend to all ACs in future ++ */ ++ for (; (credit_count > 0);) { ++ ++ commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, ++ &(commit_info.ac_fifo_credit_spent), ++ &(commit_info.needs_hdr), ++ &(commit_info.mac_entry)); ++ if (commit_info.p == NULL) ++ break; ++ ++ commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : ++ eWLFC_PKTTYPE_SUPPRESSED; ++ ++ rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, ++ fcommit, commit_ctx); ++ ++ /* Bus commits may fail (e.g. flow control); abort after retries */ ++ if (rc == BCME_OK) { ++ if (commit_info.ac_fifo_credit_spent) { ++ (void) _dhd_wlfc_borrow_credit(ctx, ac_available, ac); ++ credit_count--; ++ } ++ } ++ else { ++ bus_retry_count++; ++ if (bus_retry_count >= BUS_RETRIES) { ++ AP6210_ERR("dhd_wlfc_commit_packets(): bus error\n"); ++ return rc; ++ } ++ } ++ } ++ ++ return BCME_OK; ++} ++ ++static uint8 ++dhd_wlfc_find_mac_desc_id_from_mac(dhd_pub_t *dhdp, uint8* ea) ++{ ++ wlfc_mac_descriptor_t* table = ++ ((athost_wl_status_info_t*)dhdp->wlfc_state)->destination_entries.nodes; ++ uint8 table_index; ++ ++ if (ea != NULL) { ++ for (table_index = 0; table_index < WLFC_MAC_DESC_TABLE_SIZE; table_index++) { ++ if ((memcmp(ea, &table[table_index].ea[0], ETHER_ADDR_LEN) == 0) && ++ table[table_index].occupied) ++ return table_index; ++ } ++ } ++ return WLFC_MAC_DESC_ID_INVALID; ++} ++ ++void ++dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success, bool wake_locked) ++{ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ void* p; ++ int fifo_id; ++ ++ if (!wake_locked) ++ dhd_os_wlfc_block(dhd); ++ ++ if (DHD_PKTTAG_SIGNALONLY(PKTTAG(txp))) { ++#ifdef PROP_TXSTATUS_DEBUG ++ wlfc->stats.signal_only_pkts_freed++; ++#endif ++ if (success) ++ /* is this a signal-only packet? */ ++ PKTFREE(wlfc->osh, txp, TRUE); ++ if (!wake_locked) ++ dhd_os_wlfc_unblock(dhd); ++ return; ++ } ++ if (!success) { ++ AP6210_DEBUG("At: %s():%d, bus_complete() failure for %p, htod_tag:0x%08x\n", ++ __FUNCTION__, __LINE__, txp, DHD_PKTTAG_H2DTAG(PKTTAG(txp))); ++ dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG ++ (PKTTAG(txp))), &p, 1); ++ ++ /* indicate failure and free the packet */ ++ dhd_txcomplete(dhd, txp, FALSE); ++ ++ /* return the credit, if necessary */ ++ if (DHD_PKTTAG_CREDITCHECK(PKTTAG(txp))) { ++ int lender, credit_returned = 0; /* Note that borrower is fifo_id */ ++ ++ fifo_id = DHD_PKTTAG_FIFO(PKTTAG(txp)); ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; lender >= 0; lender--) { ++ if (wlfc->credits_borrowed[fifo_id][lender] > 0) { ++ wlfc->FIFO_credit[lender]++; ++ wlfc->credits_borrowed[fifo_id][lender]--; ++ credit_returned = 1; ++ break; ++ } ++ } ++ ++ if (!credit_returned) { ++ wlfc->FIFO_credit[fifo_id]++; ++ } ++ } ++ ++ PKTFREE(wlfc->osh, txp, TRUE); ++ } ++ if (!wake_locked) ++ dhd_os_wlfc_unblock(dhd); ++ return; ++} ++ ++static int ++dhd_wlfc_compressed_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info, uint8 len) ++{ ++ uint8 status_flag; ++ uint32 status; ++ int ret; ++ int remove_from_hanger = 1; ++ void* pktbuf; ++ uint8 fifo_id; ++ uint8 count = 0; ++ uint32 status_g; ++ uint32 hslot, hcnt; ++ wlfc_mac_descriptor_t* entry = NULL; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ ++ memcpy(&status, pkt_info, sizeof(uint32)); ++ status_flag = WL_TXSTATUS_GET_FLAGS(status); ++ status_g = status & 0xff000000; ++ hslot = (status & 0x00ffff00) >> 8; ++ hcnt = status & 0xff; ++ len = pkt_info[4]; ++ ++ wlfc->stats.txstatus_in++; ++ ++ if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { ++ wlfc->stats.pkt_freed++; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { ++ wlfc->stats.d11_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { ++ wlfc->stats.wl_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { ++ wlfc->stats.wlc_tossed_pkts++; ++ } ++ while (count < len) { ++ status = (status_g << 24) | (hslot << 8) | (hcnt); ++ count++; ++ hslot++; ++ hcnt++; ++ ++ ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); ++ if (ret != BCME_OK) { ++ /* do something */ ++ continue; ++ } ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ ++ if (!remove_from_hanger) { ++ /* this packet was suppressed */ ++ if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { ++ entry->suppressed = TRUE; ++ entry->suppress_count = pktq_mlen(&entry->psq, ++ NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); ++ entry->suppr_transit_count = entry->transit_count; ++ } ++ entry->generation = WLFC_PKTID_GEN(status); ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ uint32 new_t = OSL_SYSUPTIME(); ++ uint32 old_t; ++ uint32 delta; ++ old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ ++ WLFC_PKTID_HSLOT_GET(status)].push_time; ++ ++ ++ wlfc->stats.latency_sample_count++; ++ if (new_t > old_t) ++ delta = new_t - old_t; ++ else ++ delta = 0xffffffff + new_t - old_t; ++ wlfc->stats.total_status_latency += delta; ++ wlfc->stats.latency_most_recent = delta; ++ ++ wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; ++ if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) ++ wlfc->stats.idx_delta = 0; ++ } ++#endif /* PROP_TXSTATUS_DEBUG */ ++ ++ fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); ++ ++ /* pick up the implicit credit from this packet */ ++ if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { ++ if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { ++ ++ int lender, credit_returned = 0; /* Note that borrower is fifo_id */ ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; lender >= 0; lender--) { ++ if (wlfc->credits_borrowed[fifo_id][lender] > 0) { ++ wlfc->FIFO_credit[lender]++; ++ wlfc->credits_borrowed[fifo_id][lender]--; ++ credit_returned = 1; ++ break; ++ } ++ } ++ ++ if (!credit_returned) { ++ wlfc->FIFO_credit[fifo_id]++; ++ } ++ } ++ } ++ else { ++ /* ++ if this packet did not count against FIFO credit, it must have ++ taken a requested_credit from the destination entry (for pspoll etc.) ++ */ ++ if (!entry) { ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ } ++ if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) ++ entry->requested_credit++; ++#ifdef PROP_TXSTATUS_DEBUG ++ entry->dstncredit_acks++; ++#endif ++ } ++ if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || ++ (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { ++ ++ ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); ++ if (ret != BCME_OK) { ++ /* delay q is full, drop this packet */ ++ dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), ++ &pktbuf, 1); ++ ++ /* indicate failure and free the packet */ ++ dhd_txcomplete(dhd, pktbuf, FALSE); ++ entry->transit_count--; ++ /* packet is transmitted Successfully by dongle ++ * after first suppress. ++ */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } else { ++ /* Mark suppressed to avoid a double free during wlfc cleanup */ ++ ++ dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); ++ entry->suppress_count++; ++ } ++ } ++ else { ++ dhd_txcomplete(dhd, pktbuf, TRUE); ++ entry->transit_count--; ++ ++ /* This packet is transmitted Successfully by dongle ++ * even after first suppress. ++ */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ /* free the packet */ ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } ++ } ++ return BCME_OK; ++} ++ ++/* Handle discard or suppress indication */ ++static int ++dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) ++{ ++ uint8 status_flag; ++ uint32 status; ++ int ret; ++ int remove_from_hanger = 1; ++ void* pktbuf; ++ uint8 fifo_id; ++ wlfc_mac_descriptor_t* entry = NULL; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ ++ memcpy(&status, pkt_info, sizeof(uint32)); ++ status_flag = WL_TXSTATUS_GET_FLAGS(status); ++ wlfc->stats.txstatus_in++; ++ ++ if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { ++ wlfc->stats.pkt_freed++; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { ++ wlfc->stats.d11_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { ++ wlfc->stats.wl_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { ++ wlfc->stats.wlc_tossed_pkts++; ++ } ++ ++ ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); ++ if (ret != BCME_OK) { ++ /* do something */ ++ return ret; ++ } ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ ++ if (!remove_from_hanger) { ++ /* this packet was suppressed */ ++ if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { ++ entry->suppressed = TRUE; ++ entry->suppress_count = pktq_mlen(&entry->psq, ++ NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); ++ entry->suppr_transit_count = entry->transit_count; ++ } ++ entry->generation = WLFC_PKTID_GEN(status); ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ uint32 new_t = OSL_SYSUPTIME(); ++ uint32 old_t; ++ uint32 delta; ++ old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ ++ WLFC_PKTID_HSLOT_GET(status)].push_time; ++ ++ ++ wlfc->stats.latency_sample_count++; ++ if (new_t > old_t) ++ delta = new_t - old_t; ++ else ++ delta = 0xffffffff + new_t - old_t; ++ wlfc->stats.total_status_latency += delta; ++ wlfc->stats.latency_most_recent = delta; ++ ++ wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; ++ if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) ++ wlfc->stats.idx_delta = 0; ++ } ++#endif /* PROP_TXSTATUS_DEBUG */ ++ ++ fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); ++ ++ /* pick up the implicit credit from this packet */ ++ if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { ++ if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { ++ ++ int lender, credit_returned = 0; /* Note that borrower is fifo_id */ ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; lender >= 0; lender--) { ++ if (wlfc->credits_borrowed[fifo_id][lender] > 0) { ++ wlfc->FIFO_credit[lender]++; ++ wlfc->credits_borrowed[fifo_id][lender]--; ++ credit_returned = 1; ++ break; ++ } ++ } ++ ++ if (!credit_returned) { ++ wlfc->FIFO_credit[fifo_id]++; ++ } ++ } ++ } ++ else { ++ /* ++ if this packet did not count against FIFO credit, it must have ++ taken a requested_credit from the destination entry (for pspoll etc.) ++ */ ++ if (!entry) { ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ } ++ if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) ++ entry->requested_credit++; ++#ifdef PROP_TXSTATUS_DEBUG ++ entry->dstncredit_acks++; ++#endif ++ } ++ if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || ++ (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { ++ ++ ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); ++ if (ret != BCME_OK) { ++ /* delay q is full, drop this packet */ ++ dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), ++ &pktbuf, 1); ++ ++ /* indicate failure and free the packet */ ++ dhd_txcomplete(dhd, pktbuf, FALSE); ++ entry->transit_count--; ++ /* This packet is transmitted Successfully by ++ * dongle even after first suppress. ++ */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } else { ++ /* Mark suppressed to avoid a double free during wlfc cleanup */ ++ dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); ++ entry->suppress_count++; ++ } ++ } ++ else { ++ dhd_txcomplete(dhd, pktbuf, TRUE); ++ entry->transit_count--; ++ ++ /* This packet is transmitted Successfully by dongle even after first suppress. */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ /* free the packet */ ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_fifocreditback_indicate(dhd_pub_t *dhd, uint8* credits) ++{ ++ int i; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ for (i = 0; i < WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK; i++) { ++#ifdef PROP_TXSTATUS_DEBUG ++ wlfc->stats.fifo_credits_back[i] += credits[i]; ++#endif ++ /* update FIFO credits */ ++ if (wlfc->proptxstatus_mode == WLFC_FCMODE_EXPLICIT_CREDIT) ++ { ++ int lender; /* Note that borrower is i */ ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; (lender >= 0) && (credits[i] > 0); lender--) { ++ if (wlfc->credits_borrowed[i][lender] > 0) { ++ if (credits[i] >= wlfc->credits_borrowed[i][lender]) { ++ credits[i] -= wlfc->credits_borrowed[i][lender]; ++ wlfc->FIFO_credit[lender] += ++ wlfc->credits_borrowed[i][lender]; ++ wlfc->credits_borrowed[i][lender] = 0; ++ } ++ else { ++ wlfc->credits_borrowed[i][lender] -= credits[i]; ++ wlfc->FIFO_credit[lender] += credits[i]; ++ credits[i] = 0; ++ } ++ } ++ } ++ ++ /* If we have more credits left over, these must belong to the AC */ ++ if (credits[i] > 0) { ++ wlfc->FIFO_credit[i] += credits[i]; ++ } ++ } ++ } ++ ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_dbg_senum_check(dhd_pub_t *dhd, uint8 *value) ++{ ++ uint32 timestamp; ++ ++ (void)dhd; ++ ++ bcopy(&value[2], ×tamp, sizeof(uint32)); ++ AP6210_DEBUG("RXPKT: SEQ: %d, timestamp %d\n", value[1], timestamp); ++ return BCME_OK; ++} ++ ++ ++static int ++dhd_wlfc_rssi_indicate(dhd_pub_t *dhd, uint8* rssi) ++{ ++ (void)dhd; ++ (void)rssi; ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_mac_table_update(dhd_pub_t *dhd, uint8* value, uint8 type) ++{ ++ int rc; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ uint8 existing_index; ++ uint8 table_index; ++ uint8 ifid; ++ uint8* ea; ++ ++ AP6210_DEBUG("%s(), mac [%02x:%02x:%02x:%02x:%02x:%02x],%s,idx:%d,id:0x%02x\n", ++ __FUNCTION__, value[2], value[3], value[4], value[5], value[6], value[7], ++ ((type == WLFC_CTL_TYPE_MACDESC_ADD) ? "ADD":"DEL"), ++ WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]), value[0]); ++ ++ table = wlfc->destination_entries.nodes; ++ table_index = WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]); ++ ifid = value[1]; ++ ea = &value[2]; ++ ++ if (type == WLFC_CTL_TYPE_MACDESC_ADD) { ++ existing_index = dhd_wlfc_find_mac_desc_id_from_mac(dhd, &value[2]); ++ if (existing_index == WLFC_MAC_DESC_ID_INVALID) { ++ /* this MAC entry does not exist, create one */ ++ if (!table[table_index].occupied) { ++ table[table_index].mac_handle = value[0]; ++ rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], ++ eWLFC_MAC_ENTRY_ACTION_ADD, ifid, ++ wlfc->destination_entries.interfaces[ifid].iftype, ++ ea); ++ } ++ else { ++ /* the space should have been empty, but it's not */ ++ wlfc->stats.mac_update_failed++; ++ } ++ } ++ else { ++ /* ++ there is an existing entry, move it to new index ++ if necessary. ++ */ ++ if (existing_index != table_index) { ++ /* if we already have an entry, free the old one */ ++ table[existing_index].occupied = 0; ++ table[existing_index].state = WLFC_STATE_CLOSE; ++ table[existing_index].requested_credit = 0; ++ table[existing_index].interface_id = 0; ++ /* enable after packets are queued-deqeued properly. ++ pktq_flush(dhd->osh, &table[existing_index].psq, FALSE, NULL, 0); ++ */ ++ } ++ } ++ } ++ if (type == WLFC_CTL_TYPE_MACDESC_DEL) { ++ if (table[table_index].occupied) { ++ rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], ++ eWLFC_MAC_ENTRY_ACTION_DEL, ifid, ++ wlfc->destination_entries.interfaces[ifid].iftype, ++ ea); ++ } ++ else { ++ /* the space should have been occupied, but it's not */ ++ wlfc->stats.mac_update_failed++; ++ } ++ } ++ BCM_REFERENCE(rc); ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_psmode_update(dhd_pub_t *dhd, uint8* value, uint8 type) ++{ ++ /* Handle PS on/off indication */ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_mac_descriptor_t* desc; ++ uint8 mac_handle = value[0]; ++ int i; ++ ++ table = wlfc->destination_entries.nodes; ++ desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; ++ if (desc->occupied) { ++ /* a fresh PS mode should wipe old ps credits? */ ++ desc->requested_credit = 0; ++ if (type == WLFC_CTL_TYPE_MAC_OPEN) { ++ desc->state = WLFC_STATE_OPEN; ++ DHD_WLFC_CTRINC_MAC_OPEN(desc); ++ } ++ else { ++ desc->state = WLFC_STATE_CLOSE; ++ DHD_WLFC_CTRINC_MAC_CLOSE(desc); ++ /* ++ Indicate to firmware if there is any traffic pending. ++ */ ++ for (i = AC_BE; i < AC_COUNT; i++) { ++ _dhd_wlfc_traffic_pending_check(wlfc, desc, i); ++ } ++ } ++ } ++ else { ++ wlfc->stats.psmode_update_failed++; ++ } ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_interface_update(dhd_pub_t *dhd, uint8* value, uint8 type) ++{ ++ /* Handle PS on/off indication */ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ uint8 if_id = value[0]; ++ ++ if (if_id < WLFC_MAX_IFNUM) { ++ table = wlfc->destination_entries.interfaces; ++ if (table[if_id].occupied) { ++ if (type == WLFC_CTL_TYPE_INTERFACE_OPEN) { ++ table[if_id].state = WLFC_STATE_OPEN; ++ /* AP6210_DEBUG("INTERFACE[%d] OPEN\n", if_id); */ ++ } ++ else { ++ table[if_id].state = WLFC_STATE_CLOSE; ++ /* AP6210_DEBUG("INTERFACE[%d] CLOSE\n", if_id); */ ++ } ++ return BCME_OK; ++ } ++ } ++ wlfc->stats.interface_update_failed++; ++ ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_credit_request(dhd_pub_t *dhd, uint8* value) ++{ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_mac_descriptor_t* desc; ++ uint8 mac_handle; ++ uint8 credit; ++ ++ table = wlfc->destination_entries.nodes; ++ mac_handle = value[1]; ++ credit = value[0]; ++ ++ desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; ++ if (desc->occupied) { ++ desc->requested_credit = credit; ++ ++ desc->ac_bitmap = value[2]; ++ } ++ else { ++ wlfc->stats.credit_request_failed++; ++ } ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_packet_request(dhd_pub_t *dhd, uint8* value) ++{ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_mac_descriptor_t* desc; ++ uint8 mac_handle; ++ uint8 packet_count; ++ ++ table = wlfc->destination_entries.nodes; ++ mac_handle = value[1]; ++ packet_count = value[0]; ++ ++ desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; ++ if (desc->occupied) { ++ desc->requested_packet = packet_count; ++ ++ desc->ac_bitmap = value[2]; ++ } ++ else { ++ wlfc->stats.packet_request_failed++; ++ } ++ return BCME_OK; ++} ++ ++static void ++dhd_wlfc_reorderinfo_indicate(uint8 *val, uint8 len, uchar *info_buf, uint *info_len) ++{ ++ if (info_len) { ++ if (info_buf) { ++ bcopy(val, info_buf, len); ++ *info_len = len; ++ } ++ else ++ *info_len = 0; ++ } ++} ++ ++static int ++dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len, uchar *reorder_info_buf, ++ uint *reorder_info_len) ++{ ++ uint8 type, len; ++ uint8* value; ++ uint8* tmpbuf; ++ uint16 remainder = tlv_hdr_len; ++ uint16 processed = 0; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ tmpbuf = (uint8*)PKTDATA(dhd->osh, pktbuf); ++ if (remainder) { ++ while ((processed < (WLFC_MAX_PENDING_DATALEN * 2)) && (remainder > 0)) { ++ type = tmpbuf[processed]; ++ if (type == WLFC_CTL_TYPE_FILLER) { ++ remainder -= 1; ++ processed += 1; ++ continue; ++ } ++ ++ len = tmpbuf[processed + 1]; ++ value = &tmpbuf[processed + 2]; ++ ++ if (remainder < (2 + len)) ++ break; ++ ++ remainder -= 2 + len; ++ processed += 2 + len; ++ if (type == WLFC_CTL_TYPE_TXSTATUS) ++ dhd_wlfc_txstatus_update(dhd, value); ++ if (type == WLFC_CTL_TYPE_COMP_TXSTATUS) ++ dhd_wlfc_compressed_txstatus_update(dhd, value, len); ++ ++ else if (type == WLFC_CTL_TYPE_HOST_REORDER_RXPKTS) ++ dhd_wlfc_reorderinfo_indicate(value, len, reorder_info_buf, ++ reorder_info_len); ++ else if (type == WLFC_CTL_TYPE_FIFO_CREDITBACK) ++ dhd_wlfc_fifocreditback_indicate(dhd, value); ++ ++ else if (type == WLFC_CTL_TYPE_RSSI) ++ dhd_wlfc_rssi_indicate(dhd, value); ++ ++ else if (type == WLFC_CTL_TYPE_MAC_REQUEST_CREDIT) ++ dhd_wlfc_credit_request(dhd, value); ++ ++ else if (type == WLFC_CTL_TYPE_MAC_REQUEST_PACKET) ++ dhd_wlfc_packet_request(dhd, value); ++ ++ else if ((type == WLFC_CTL_TYPE_MAC_OPEN) || ++ (type == WLFC_CTL_TYPE_MAC_CLOSE)) ++ dhd_wlfc_psmode_update(dhd, value, type); ++ ++ else if ((type == WLFC_CTL_TYPE_MACDESC_ADD) || ++ (type == WLFC_CTL_TYPE_MACDESC_DEL)) ++ dhd_wlfc_mac_table_update(dhd, value, type); ++ ++ else if (type == WLFC_CTL_TYPE_TRANS_ID) ++ dhd_wlfc_dbg_senum_check(dhd, value); ++ ++ else if ((type == WLFC_CTL_TYPE_INTERFACE_OPEN) || ++ (type == WLFC_CTL_TYPE_INTERFACE_CLOSE)) { ++ dhd_wlfc_interface_update(dhd, value, type); ++ } ++ } ++ if (remainder != 0) { ++ /* trouble..., something is not right */ ++ wlfc->stats.tlv_parse_failed++; ++ } ++ } ++ return BCME_OK; ++} ++ ++int ++dhd_wlfc_init(dhd_pub_t *dhd) ++{ ++ char iovbuf[12]; /* Room for "tlv" + '\0' + parameter */ ++ /* enable all signals & indicate host proptxstatus logic is active */ ++ uint32 tlv = dhd->wlfc_enabled? ++ WLFC_FLAGS_RSSI_SIGNALS | ++ WLFC_FLAGS_XONXOFF_SIGNALS | ++ WLFC_FLAGS_CREDIT_STATUS_SIGNALS | ++ WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | ++ WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; ++ /* WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; */ ++ ++ ++ /* ++ try to enable/disable signaling by sending "tlv" iovar. if that fails, ++ fallback to no flow control? Print a message for now. ++ */ ++ ++ /* enable proptxtstatus signaling by default */ ++ bcm_mkiovar("tlv", (char *)&tlv, 4, iovbuf, sizeof(iovbuf)); ++ if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) < 0) { ++ AP6210_ERR("dhd_wlfc_init(): failed to enable/disable bdcv2 tlv signaling\n"); ++ } ++ else { ++ /* ++ Leaving the message for now, it should be removed after a while; once ++ the tlv situation is stable. ++ */ ++ AP6210_DEBUG("dhd_wlfc_init(): successfully %s bdcv2 tlv signaling, %d\n", ++ dhd->wlfc_enabled?"enabled":"disabled", tlv); ++ } ++ return BCME_OK; ++} ++ ++int ++dhd_wlfc_enable(dhd_pub_t *dhd) ++{ ++ int i; ++ athost_wl_status_info_t* wlfc; ++ ++ AP6210_DEBUG("Enter %s\n", __FUNCTION__); ++ ++ if (!dhd->wlfc_enabled || dhd->wlfc_state) ++ return BCME_OK; ++ ++ /* allocate space to track txstatus propagated from firmware */ ++ dhd->wlfc_state = MALLOC(dhd->osh, sizeof(athost_wl_status_info_t)); ++ if (dhd->wlfc_state == NULL) ++ return BCME_NOMEM; ++ ++ /* initialize state space */ ++ wlfc = (athost_wl_status_info_t*)dhd->wlfc_state; ++ memset(wlfc, 0, sizeof(athost_wl_status_info_t)); ++ ++ /* remember osh & dhdp */ ++ wlfc->osh = dhd->osh; ++ wlfc->dhdp = dhd; ++ ++ wlfc->hanger = ++ dhd_wlfc_hanger_create(dhd->osh, WLFC_HANGER_MAXITEMS); ++ if (wlfc->hanger == NULL) { ++ MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); ++ dhd->wlfc_state = NULL; ++ return BCME_NOMEM; ++ } ++ ++ /* initialize all interfaces to accept traffic */ ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ wlfc->hostif_flow_state[i] = OFF; ++ } ++ ++ /* ++ create the SENDQ containing ++ sub-queues for all AC precedences + 1 for bc/mc traffic ++ */ ++ pktq_init(&wlfc->SENDQ, (AC_COUNT + 1), WLFC_SENDQ_LEN); ++ ++ wlfc->destination_entries.other.state = WLFC_STATE_OPEN; ++ /* bc/mc FIFO is always open [credit aside], i.e. b[5] */ ++ wlfc->destination_entries.other.ac_bitmap = 0x1f; ++ wlfc->destination_entries.other.interface_id = 0; ++ ++ wlfc->proptxstatus_mode = WLFC_FCMODE_EXPLICIT_CREDIT; ++ ++ wlfc->allow_credit_borrow = TRUE; ++ wlfc->borrow_defer_timestamp = 0; ++ ++ return BCME_OK; ++} ++ ++/* release all packet resources */ ++void ++dhd_wlfc_cleanup(dhd_pub_t *dhd) ++{ ++ int i; ++ int total_entries; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_hanger_t* h; ++ int prec; ++ void *pkt = NULL; ++ struct pktq *txq = NULL; ++ ++ AP6210_DEBUG("Enter %s\n", __FUNCTION__); ++ if (dhd->wlfc_state == NULL) ++ return; ++ /* flush bus->txq */ ++ txq = dhd_bus_txq(dhd->bus); ++ ++ /* any in the hanger? */ ++ h = (wlfc_hanger_t*)wlfc->hanger; ++ total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); ++ /* search all entries, include nodes as well as interfaces */ ++ table = (wlfc_mac_descriptor_t*)&wlfc->destination_entries; ++ ++ for (i = 0; i < total_entries; i++) { ++ if (table[i].occupied) { ++ if (table[i].psq.len) { ++ AP6210_DEBUG("%s(): DELAYQ[%d].len = %d\n", ++ __FUNCTION__, i, table[i].psq.len); ++ /* release packets held in DELAYQ */ ++ pktq_flush(wlfc->osh, &table[i].psq, TRUE, NULL, 0); ++ } ++ table[i].occupied = 0; ++ } ++ } ++ /* release packets held in SENDQ */ ++ if (wlfc->SENDQ.len) ++ pktq_flush(wlfc->osh, &wlfc->SENDQ, TRUE, NULL, 0); ++ for (prec = 0; prec < txq->num_prec; prec++) { ++ pkt = pktq_pdeq(txq, prec); ++ while (pkt) { ++ for (i = 0; i < h->max_items; i++) { ++ if (pkt == h->items[i].pkt) { ++ if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { ++ PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ h->items[i].pkt = NULL; ++ h->items[i].identifier = 0; ++ } else if (h->items[i].state == ++ WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { ++ /* These are already freed from the psq */ ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ break; ++ } ++ } ++ pkt = pktq_pdeq(txq, prec); ++ } ++ } ++ /* flush remained pkt in hanger queue, not in bus->txq */ ++ for (i = 0; i < h->max_items; i++) { ++ if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { ++ PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } else if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { ++ /* These are freed from the psq so no need to free again */ ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ } ++ ++ return; ++} ++ ++void ++dhd_wlfc_deinit(dhd_pub_t *dhd) ++{ ++ /* cleanup all psq related resources */ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ ++ AP6210_DEBUG("Enter %s\n", __FUNCTION__); ++ ++ dhd_os_wlfc_block(dhd); ++ if (dhd->wlfc_state == NULL) { ++ dhd_os_wlfc_unblock(dhd); ++ return; ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ int i; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)wlfc->hanger; ++ for (i = 0; i < h->max_items; i++) { ++ if (h->items[i].state != WLFC_HANGER_ITEM_STATE_FREE) { ++ AP6210_DEBUG("%s() pkt[%d] = 0x%p, FIFO_credit_used:%d\n", ++ __FUNCTION__, i, h->items[i].pkt, ++ DHD_PKTTAG_CREDITCHECK(PKTTAG(h->items[i].pkt))); ++ } ++ } ++ } ++#endif ++ /* delete hanger */ ++ dhd_wlfc_hanger_delete(dhd->osh, wlfc->hanger); ++ ++ /* free top structure */ ++ MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); ++ dhd->wlfc_state = NULL; ++ dhd_os_wlfc_unblock(dhd); ++ ++ return; ++} ++#endif /* PROP_TXSTATUS */ ++ ++void ++dhd_prot_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) ++{ ++ bcm_bprintf(strbuf, "Protocol CDC: reqid %d\n", dhdp->prot->reqid); ++#ifdef PROP_TXSTATUS ++ dhd_os_wlfc_block(dhdp); ++ if (dhdp->wlfc_state) ++ dhd_wlfc_dump(dhdp, strbuf); ++ dhd_os_wlfc_unblock(dhdp); ++#endif ++} ++ ++void ++dhd_prot_hdrpush(dhd_pub_t *dhd, int ifidx, void *pktbuf) ++{ ++#ifdef BDC ++ struct bdc_header *h; ++#endif /* BDC */ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++#ifdef BDC ++ /* Push BDC header used to convey priority for buses that don't */ ++ ++ PKTPUSH(dhd->osh, pktbuf, BDC_HEADER_LEN); ++ ++ h = (struct bdc_header *)PKTDATA(dhd->osh, pktbuf); ++ ++ h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); ++ if (PKTSUMNEEDED(pktbuf)) ++ h->flags |= BDC_FLAG_SUM_NEEDED; ++ ++ ++ h->priority = (PKTPRIO(pktbuf) & BDC_PRIORITY_MASK); ++ h->flags2 = 0; ++ h->dataOffset = 0; ++#endif /* BDC */ ++ BDC_SET_IF_IDX(h, ifidx); ++} ++ ++int ++dhd_prot_hdrpull(dhd_pub_t *dhd, int *ifidx, void *pktbuf, uchar *reorder_buf_info, ++ uint *reorder_info_len) ++{ ++#ifdef BDC ++ struct bdc_header *h; ++#endif ++ uint8 data_offset = 0; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++#ifdef BDC ++ if (reorder_info_len) ++ *reorder_info_len = 0; ++ /* Pop BDC header used to convey priority for buses that don't */ ++ ++ if (PKTLEN(dhd->osh, pktbuf) < BDC_HEADER_LEN) { ++ AP6210_ERR("%s: rx data too short (%d < %d)\n", __FUNCTION__, ++ PKTLEN(dhd->osh, pktbuf), BDC_HEADER_LEN); ++ return BCME_ERROR; ++ } ++ ++ h = (struct bdc_header *)PKTDATA(dhd->osh, pktbuf); ++ ++#if defined(NDIS630) ++ h->dataOffset = 0; ++#endif ++ ++ if (!ifidx) { ++ /* for tx packet, skip the analysis */ ++ data_offset = h->dataOffset; ++ PKTPULL(dhd->osh, pktbuf, BDC_HEADER_LEN); ++ goto exit; ++ } ++ ++ if ((*ifidx = BDC_GET_IF_IDX(h)) >= DHD_MAX_IFS) { ++ AP6210_ERR("%s: rx data ifnum out of range (%d)\n", ++ __FUNCTION__, *ifidx); ++ return BCME_ERROR; ++ } ++ ++ if (((h->flags & BDC_FLAG_VER_MASK) >> BDC_FLAG_VER_SHIFT) != BDC_PROTO_VER) { ++ AP6210_ERR("%s: non-BDC packet received, flags = 0x%x\n", ++ dhd_ifname(dhd, *ifidx), h->flags); ++ if (((h->flags & BDC_FLAG_VER_MASK) >> BDC_FLAG_VER_SHIFT) == BDC_PROTO_VER_1) ++ h->dataOffset = 0; ++ else ++ return BCME_ERROR; ++ } ++ ++ if (h->flags & BDC_FLAG_SUM_GOOD) { ++ AP6210_DEBUG("%s: BDC packet received with good rx-csum, flags 0x%x\n", ++ dhd_ifname(dhd, *ifidx), h->flags); ++ PKTSETSUMGOOD(pktbuf, TRUE); ++ } ++ ++ PKTSETPRIO(pktbuf, (h->priority & BDC_PRIORITY_MASK)); ++ data_offset = h->dataOffset; ++ PKTPULL(dhd->osh, pktbuf, BDC_HEADER_LEN); ++#endif /* BDC */ ++ ++#if !defined(NDIS630) ++ if (PKTLEN(dhd->osh, pktbuf) < (uint32) (data_offset << 2)) { ++ AP6210_ERR("%s: rx data too short (%d < %d)\n", __FUNCTION__, ++ PKTLEN(dhd->osh, pktbuf), (data_offset * 4)); ++ return BCME_ERROR; ++ } ++#endif ++#ifdef PROP_TXSTATUS ++ if (dhd->wlfc_state && ++ ((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode ++ != WLFC_FCMODE_NONE && ++ (!DHD_PKTTAG_PKTDIR(PKTTAG(pktbuf)))) { ++ /* ++ - parse txstatus only for packets that came from the firmware ++ */ ++ dhd_os_wlfc_block(dhd); ++ dhd_wlfc_parse_header_info(dhd, pktbuf, (data_offset << 2), ++ reorder_buf_info, reorder_info_len); ++ ((athost_wl_status_info_t*)dhd->wlfc_state)->stats.dhd_hdrpulls++; ++ dhd_os_wlfc_unblock(dhd); ++ } ++#endif /* PROP_TXSTATUS */ ++ ++exit: ++#if !defined(NDIS630) ++ PKTPULL(dhd->osh, pktbuf, (data_offset << 2)); ++#endif ++ return 0; ++} ++ ++#if defined(PROP_TXSTATUS) ++void ++dhd_wlfc_trigger_pktcommit(dhd_pub_t *dhd) ++{ ++ if (dhd->wlfc_state && ++ (((athost_wl_status_info_t*)dhd->wlfc_state)->proptxstatus_mode ++ != WLFC_FCMODE_NONE)) { ++ dhd_os_wlfc_block(dhd); ++ dhd_wlfc_commit_packets(dhd->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, ++ (void *)dhd->bus); ++ dhd_os_wlfc_unblock(dhd); ++ } ++} ++#endif ++ ++int ++dhd_prot_attach(dhd_pub_t *dhd) ++{ ++ dhd_prot_t *cdc; ++ ++ if (!(cdc = (dhd_prot_t *)DHD_OS_PREALLOC(dhd->osh, DHD_PREALLOC_PROT, ++ sizeof(dhd_prot_t)))) { ++ AP6210_ERR("%s: kmalloc failed\n", __FUNCTION__); ++ goto fail; ++ } ++ memset(cdc, 0, sizeof(dhd_prot_t)); ++ ++ /* ensure that the msg buf directly follows the cdc msg struct */ ++ if ((uintptr)(&cdc->msg + 1) != (uintptr)cdc->buf) { ++ AP6210_ERR("dhd_prot_t is not correctly defined\n"); ++ goto fail; ++ } ++ ++ dhd->prot = cdc; ++#ifdef BDC ++ dhd->hdrlen += BDC_HEADER_LEN; ++#endif ++ dhd->maxctl = WLC_IOCTL_MAXLEN + sizeof(cdc_ioctl_t) + ROUND_UP_MARGIN; ++ return 0; ++ ++fail: ++#ifndef CONFIG_DHD_USE_STATIC_BUF ++ if (cdc != NULL) ++ MFREE(dhd->osh, cdc, sizeof(dhd_prot_t)); ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ return BCME_NOMEM; ++} ++ ++/* ~NOTE~ What if another thread is waiting on the semaphore? Holding it? */ ++void ++dhd_prot_detach(dhd_pub_t *dhd) ++{ ++#ifdef PROP_TXSTATUS ++ dhd_wlfc_deinit(dhd); ++#endif ++#ifndef CONFIG_DHD_USE_STATIC_BUF ++ MFREE(dhd->osh, dhd->prot, sizeof(dhd_prot_t)); ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ dhd->prot = NULL; ++} ++ ++void ++dhd_prot_dstats(dhd_pub_t *dhd) ++{ ++ /* No stats from dongle added yet, copy bus stats */ ++ dhd->dstats.tx_packets = dhd->tx_packets; ++ dhd->dstats.tx_errors = dhd->tx_errors; ++ dhd->dstats.rx_packets = dhd->rx_packets; ++ dhd->dstats.rx_errors = dhd->rx_errors; ++ dhd->dstats.rx_dropped = dhd->rx_dropped; ++ dhd->dstats.multicast = dhd->rx_multicast; ++ return; ++} ++ ++int ++dhd_prot_init(dhd_pub_t *dhd) ++{ ++ int ret = 0; ++ wlc_rev_info_t revinfo; ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ++ /* Get the device rev info */ ++ memset(&revinfo, 0, sizeof(revinfo)); ++ ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_REVINFO, &revinfo, sizeof(revinfo), FALSE, 0); ++ if (ret < 0) ++ goto done; ++ ++ ++#if defined(WL_CFG80211) ++ if (dhd_download_fw_on_driverload) ++#endif /* defined(WL_CFG80211) */ ++ ret = dhd_preinit_ioctls(dhd); ++ ++#ifdef PROP_TXSTATUS ++ ret = dhd_wlfc_init(dhd); ++#endif ++ ++ /* Always assumes wl for now */ ++ dhd->iswl = TRUE; ++ ++done: ++ return ret; ++} ++ ++void ++dhd_prot_stop(dhd_pub_t *dhd) ++{ ++ /* Nothing to do for CDC */ ++} ++ ++ ++static void ++dhd_get_hostreorder_pkts(void *osh, struct reorder_info *ptr, void **pkt, ++ uint32 *pkt_count, void **pplast, uint8 start, uint8 end) ++{ ++ uint i; ++ void *plast = NULL, *p; ++ uint32 pkt_cnt = 0; ++ ++ if (ptr->pend_pkts == 0) { ++ AP6210_DEBUG("%s: no packets in reorder queue \n", __FUNCTION__); ++ *pplast = NULL; ++ *pkt_count = 0; ++ *pkt = NULL; ++ return; ++ } ++ if (start == end) ++ i = ptr->max_idx + 1; ++ else { ++ if (start > end) ++ i = ((ptr->max_idx + 1) - start) + end; ++ else ++ i = end - start; ++ } ++ while (i) { ++ p = (void *)(ptr->p[start]); ++ ptr->p[start] = NULL; ++ ++ if (p != NULL) { ++ if (plast == NULL) ++ *pkt = p; ++ else ++ PKTSETNEXT(osh, plast, p); ++ ++ plast = p; ++ pkt_cnt++; ++ } ++ i--; ++ if (start++ == ptr->max_idx) ++ start = 0; ++ } ++ *pplast = plast; ++ *pkt_count = (uint32)pkt_cnt; ++} ++ ++int ++dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, uint reorder_info_len, ++ void **pkt, uint32 *pkt_count) ++{ ++ uint8 flow_id, max_idx, cur_idx, exp_idx; ++ struct reorder_info *ptr; ++ uint8 flags; ++ void *cur_pkt, *plast = NULL; ++ uint32 cnt = 0; ++ ++ if (pkt == NULL) { ++ if (pkt_count != NULL) ++ *pkt_count = 0; ++ return 0; ++ } ++ ++ flow_id = reorder_info_buf[WLHOST_REORDERDATA_FLOWID_OFFSET]; ++ flags = reorder_info_buf[WLHOST_REORDERDATA_FLAGS_OFFSET]; ++ ++ AP6210_DEBUG("flow_id %d, flags 0x%02x, idx(%d, %d, %d)\n", flow_id, flags, ++ reorder_info_buf[WLHOST_REORDERDATA_CURIDX_OFFSET], ++ reorder_info_buf[WLHOST_REORDERDATA_EXPIDX_OFFSET], ++ reorder_info_buf[WLHOST_REORDERDATA_MAXIDX_OFFSET]); ++ ++ /* validate flags and flow id */ ++ if (flags == 0xFF) { ++ AP6210_ERR("%s: invalid flags...so ignore this packet\n", __FUNCTION__); ++ *pkt_count = 1; ++ return 0; ++ } ++ ++ cur_pkt = *pkt; ++ *pkt = NULL; ++ ++ ptr = dhd->reorder_bufs[flow_id]; ++ if (flags & WLHOST_REORDERDATA_DEL_FLOW) { ++ uint32 buf_size = sizeof(struct reorder_info); ++ ++ AP6210_DEBUG("%s: Flags indicating to delete a flow id %d\n", ++ __FUNCTION__, flow_id); ++ ++ if (ptr == NULL) { ++ AP6210_ERR("%s: received flags to cleanup, but no flow (%d) yet\n", ++ __FUNCTION__, flow_id); ++ *pkt_count = 1; ++ *pkt = cur_pkt; ++ return 0; ++ } ++ ++ dhd_get_hostreorder_pkts(dhd->osh, ptr, pkt, &cnt, &plast, ++ ptr->exp_idx, ptr->exp_idx); ++ /* set it to the last packet */ ++ if (plast) { ++ PKTSETNEXT(dhd->osh, plast, cur_pkt); ++ cnt++; ++ } ++ else { ++ if (cnt != 0) { ++ AP6210_ERR("%s: del flow: something fishy, pending packets %d\n", ++ __FUNCTION__, cnt); ++ } ++ *pkt = cur_pkt; ++ cnt = 1; ++ } ++ buf_size += ((ptr->max_idx + 1) * sizeof(void *)); ++ MFREE(dhd->osh, ptr, buf_size); ++ dhd->reorder_bufs[flow_id] = NULL; ++ *pkt_count = cnt; ++ return 0; ++ } ++ /* all the other cases depend on the existance of the reorder struct for that flow id */ ++ if (ptr == NULL) { ++ uint32 buf_size_alloc = sizeof(reorder_info_t); ++ max_idx = reorder_info_buf[WLHOST_REORDERDATA_MAXIDX_OFFSET]; ++ ++ buf_size_alloc += ((max_idx + 1) * sizeof(void*)); ++ /* allocate space to hold the buffers, index etc */ ++ ++ AP6210_DEBUG("%s: alloc buffer of size %d size, reorder info id %d, maxidx %d\n", ++ __FUNCTION__, buf_size_alloc, flow_id, max_idx); ++ ptr = (struct reorder_info *)MALLOC(dhd->osh, buf_size_alloc); ++ if (ptr == NULL) { ++ AP6210_ERR("%s: Malloc failed to alloc buffer\n", __FUNCTION__); ++ *pkt_count = 1; ++ return 0; ++ } ++ bzero(ptr, buf_size_alloc); ++ dhd->reorder_bufs[flow_id] = ptr; ++ ptr->p = (void *)(ptr+1); ++ ptr->max_idx = max_idx; ++ } ++ if (flags & WLHOST_REORDERDATA_NEW_HOLE) { ++ AP6210_DEBUG("%s: new hole, so cleanup pending buffers\n", __FUNCTION__); ++ if (ptr->pend_pkts) { ++ dhd_get_hostreorder_pkts(dhd->osh, ptr, pkt, &cnt, &plast, ++ ptr->exp_idx, ptr->exp_idx); ++ ptr->pend_pkts = 0; ++ } ++ ptr->cur_idx = reorder_info_buf[WLHOST_REORDERDATA_CURIDX_OFFSET]; ++ ptr->exp_idx = reorder_info_buf[WLHOST_REORDERDATA_EXPIDX_OFFSET]; ++ ptr->max_idx = reorder_info_buf[WLHOST_REORDERDATA_MAXIDX_OFFSET]; ++ ptr->p[ptr->cur_idx] = cur_pkt; ++ ptr->pend_pkts++; ++ *pkt_count = cnt; ++ } ++ else if (flags & WLHOST_REORDERDATA_CURIDX_VALID) { ++ cur_idx = reorder_info_buf[WLHOST_REORDERDATA_CURIDX_OFFSET]; ++ exp_idx = reorder_info_buf[WLHOST_REORDERDATA_EXPIDX_OFFSET]; ++ ++ ++ if ((exp_idx == ptr->exp_idx) && (cur_idx != ptr->exp_idx)) { ++ /* still in the current hole */ ++ /* enqueue the current on the buffer chain */ ++ if (ptr->p[cur_idx] != NULL) { ++ AP6210_DEBUG("%s: HOLE: ERROR buffer pending..free it\n", ++ __FUNCTION__); ++ PKTFREE(dhd->osh, ptr->p[cur_idx], TRUE); ++ ptr->p[cur_idx] = NULL; ++ } ++ ptr->p[cur_idx] = cur_pkt; ++ ptr->pend_pkts++; ++ ptr->cur_idx = cur_idx; ++ AP6210_DEBUG("%s: fill up a hole..pending packets is %d\n", ++ __FUNCTION__, ptr->pend_pkts); ++ *pkt_count = 0; ++ *pkt = NULL; ++ } ++ else if (ptr->exp_idx == cur_idx) { ++ /* got the right one ..flush from cur to exp and update exp */ ++ AP6210_DEBUG("%s: got the right one now, cur_idx is %d\n", ++ __FUNCTION__, cur_idx); ++ if (ptr->p[cur_idx] != NULL) { ++ AP6210_DEBUG("%s: Error buffer pending..free it\n", ++ __FUNCTION__); ++ PKTFREE(dhd->osh, ptr->p[cur_idx], TRUE); ++ ptr->p[cur_idx] = NULL; ++ } ++ ptr->p[cur_idx] = cur_pkt; ++ ptr->pend_pkts++; ++ ++ ptr->cur_idx = cur_idx; ++ ptr->exp_idx = exp_idx; ++ ++ dhd_get_hostreorder_pkts(dhd->osh, ptr, pkt, &cnt, &plast, ++ cur_idx, exp_idx); ++ ptr->pend_pkts -= (uint8)cnt; ++ *pkt_count = cnt; ++ AP6210_DEBUG("%s: freeing up buffers %d, still pending %d\n", ++ __FUNCTION__, cnt, ptr->pend_pkts); ++ } ++ else { ++ uint8 end_idx; ++ bool flush_current = FALSE; ++ /* both cur and exp are moved now .. */ ++ AP6210_DEBUG("%s:, flow %d, both moved, cur %d(%d), exp %d(%d)\n", ++ __FUNCTION__, flow_id, ptr->cur_idx, cur_idx, ++ ptr->exp_idx, exp_idx); ++ if (flags & WLHOST_REORDERDATA_FLUSH_ALL) ++ end_idx = ptr->exp_idx; ++ else ++ end_idx = exp_idx; ++ ++ /* flush pkts first */ ++ dhd_get_hostreorder_pkts(dhd->osh, ptr, pkt, &cnt, &plast, ++ ptr->exp_idx, end_idx); ++ ++ if (cur_idx == ptr->max_idx) { ++ if (exp_idx == 0) ++ flush_current = TRUE; ++ } else { ++ if (exp_idx == cur_idx + 1) ++ flush_current = TRUE; ++ } ++ if (flush_current) { ++ if (plast) ++ PKTSETNEXT(dhd->osh, plast, cur_pkt); ++ else ++ *pkt = cur_pkt; ++ cnt++; ++ } ++ else { ++ ptr->p[cur_idx] = cur_pkt; ++ ptr->pend_pkts++; ++ } ++ ptr->exp_idx = exp_idx; ++ ptr->cur_idx = cur_idx; ++ *pkt_count = cnt; ++ } ++ } ++ else { ++ uint8 end_idx; ++ /* no real packet but update to exp_seq...that means explicit window move */ ++ exp_idx = reorder_info_buf[WLHOST_REORDERDATA_EXPIDX_OFFSET]; ++ ++ AP6210_DEBUG("%s: move the window, cur_idx is %d, exp is %d, new exp is %d\n", ++ __FUNCTION__, ptr->cur_idx, ptr->exp_idx, exp_idx); ++ if (flags & WLHOST_REORDERDATA_FLUSH_ALL) ++ end_idx = ptr->exp_idx; ++ else ++ end_idx = exp_idx; ++ ++ dhd_get_hostreorder_pkts(dhd->osh, ptr, pkt, &cnt, &plast, ptr->exp_idx, end_idx); ++ ptr->pend_pkts -= (uint8)cnt; ++ if (plast) ++ PKTSETNEXT(dhd->osh, plast, cur_pkt); ++ else ++ *pkt = cur_pkt; ++ cnt++; ++ *pkt_count = cnt; ++ /* set the new expected idx */ ++ ptr->exp_idx = exp_idx; ++ } ++ return 0; ++} +diff --git a/drivers/net/wireless/ap6210/dhd_cfg80211.c b/drivers/net/wireless/ap6210/dhd_cfg80211.c +new file mode 100644 +index 0000000..8cb440e +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_cfg80211.c +@@ -0,0 +1,680 @@ ++/* ++ * Linux cfg80211 driver - Dongle Host Driver (DHD) related ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_cfg80211.c,v 1.1.4.1.2.14 2011/02/09 01:40:07 Exp $ ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++ ++#ifdef PKT_FILTER_SUPPORT ++#include ++#include ++#endif ++ ++extern struct wl_priv *wlcfg_drv_priv; ++ ++#ifdef PKT_FILTER_SUPPORT ++extern uint dhd_pkt_filter_enable; ++extern uint dhd_master_mode; ++extern void dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_mode); ++#endif ++ ++static int dhd_dongle_up = FALSE; ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++static s32 wl_dongle_up(struct net_device *ndev, u32 up); ++ ++/** ++ * Function implementations ++ */ ++ ++s32 dhd_cfg80211_init(struct wl_priv *wl) ++{ ++ dhd_dongle_up = FALSE; ++ return 0; ++} ++ ++s32 dhd_cfg80211_deinit(struct wl_priv *wl) ++{ ++ dhd_dongle_up = FALSE; ++ return 0; ++} ++ ++s32 dhd_cfg80211_down(struct wl_priv *wl) ++{ ++ dhd_dongle_up = FALSE; ++ return 0; ++} ++ ++s32 dhd_cfg80211_set_p2p_info(struct wl_priv *wl, int val) ++{ ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++ dhd->op_mode |= val; ++ AP6210_ERR("Set : op_mode=0x%04x\n", dhd->op_mode); ++#ifdef ARP_OFFLOAD_SUPPORT ++ if (dhd->arp_version == 1) { ++ /* IF P2P is enabled, disable arpoe */ ++ dhd_arp_offload_set(dhd, 0); ++ dhd_arp_offload_enable(dhd, false); ++ } ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++ return 0; ++} ++ ++s32 dhd_cfg80211_clean_p2p_info(struct wl_priv *wl) ++{ ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++ dhd->op_mode &= ~(DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE); ++ AP6210_ERR("Clean : op_mode=0x%04x\n", dhd->op_mode); ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++ if (dhd->arp_version == 1) { ++ /* IF P2P is disabled, enable arpoe back for STA mode. */ ++ dhd_arp_offload_set(dhd, dhd_arp_mode); ++ dhd_arp_offload_enable(dhd, true); ++ } ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++ return 0; ++} ++ ++static s32 wl_dongle_up(struct net_device *ndev, u32 up) ++{ ++ s32 err = 0; ++ ++ err = wldev_ioctl(ndev, WLC_UP, &up, sizeof(up), true); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_UP error (%d)\n", err); ++ } ++ return err; ++} ++s32 dhd_config_dongle(struct wl_priv *wl, bool need_lock) ++{ ++#ifndef DHD_SDALIGN ++#define DHD_SDALIGN 32 ++#endif ++ struct net_device *ndev; ++ s32 err = 0; ++ ++ AP6210_DEBUG("In\n"); ++ if (dhd_dongle_up) { ++ AP6210_ERR("Dongle is already up\n"); ++ return err; ++ } ++ ++ ndev = wl_to_prmry_ndev(wl); ++ ++ if (need_lock) ++ rtnl_lock(); ++ ++ err = wl_dongle_up(ndev, 0); ++ if (unlikely(err)) { ++ AP6210_ERR("wl_dongle_up failed\n"); ++ goto default_conf_out; ++ } ++ dhd_dongle_up = true; ++ ++default_conf_out: ++ if (need_lock) ++ rtnl_unlock(); ++ return err; ++ ++} ++ ++ ++/* TODO: clean up the BT-Coex code, it still have some legacy ioctl/iovar functions */ ++#define COEX_DHCP ++ ++#if defined(COEX_DHCP) ++ ++/* use New SCO/eSCO smart YG suppression */ ++#define BT_DHCP_eSCO_FIX ++/* this flag boost wifi pkt priority to max, caution: -not fair to sco */ ++#define BT_DHCP_USE_FLAGS ++/* T1 start SCO/ESCo priority suppression */ ++#define BT_DHCP_OPPR_WIN_TIME 2500 ++/* T2 turn off SCO/SCO supperesion is (timeout) */ ++#define BT_DHCP_FLAG_FORCE_TIME 5500 ++ ++enum wl_cfg80211_btcoex_status { ++ BT_DHCP_IDLE, ++ BT_DHCP_START, ++ BT_DHCP_OPPR_WIN, ++ BT_DHCP_FLAG_FORCE_TIMEOUT ++}; ++ ++/* ++ * get named driver variable to uint register value and return error indication ++ * calling example: dev_wlc_intvar_get_reg(dev, "btc_params",66, ®_value) ++ */ ++static int ++dev_wlc_intvar_get_reg(struct net_device *dev, char *name, ++ uint reg, int *retval) ++{ ++ union { ++ char buf[WLC_IOCTL_SMLEN]; ++ int val; ++ } var; ++ int error; ++ ++ bcm_mkiovar(name, (char *)(®), sizeof(reg), ++ (char *)(&var), sizeof(var.buf)); ++ error = wldev_ioctl(dev, WLC_GET_VAR, (char *)(&var), sizeof(var.buf), false); ++ ++ *retval = dtoh32(var.val); ++ return (error); ++} ++ ++static int ++dev_wlc_bufvar_set(struct net_device *dev, char *name, char *buf, int len) ++{ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) ++ char ioctlbuf_local[1024]; ++#else ++ static char ioctlbuf_local[1024]; ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) */ ++ ++ bcm_mkiovar(name, buf, len, ioctlbuf_local, sizeof(ioctlbuf_local)); ++ ++ return (wldev_ioctl(dev, WLC_SET_VAR, ioctlbuf_local, sizeof(ioctlbuf_local), true)); ++} ++/* ++get named driver variable to uint register value and return error indication ++calling example: dev_wlc_intvar_set_reg(dev, "btc_params",66, value) ++*/ ++static int ++dev_wlc_intvar_set_reg(struct net_device *dev, char *name, char *addr, char * val) ++{ ++ char reg_addr[8]; ++ ++ memset(reg_addr, 0, sizeof(reg_addr)); ++ memcpy((char *)®_addr[0], (char *)addr, 4); ++ memcpy((char *)®_addr[4], (char *)val, 4); ++ ++ return (dev_wlc_bufvar_set(dev, name, (char *)®_addr[0], sizeof(reg_addr))); ++} ++ ++static bool btcoex_is_sco_active(struct net_device *dev) ++{ ++ int ioc_res = 0; ++ bool res = FALSE; ++ int sco_id_cnt = 0; ++ int param27; ++ int i; ++ ++ for (i = 0; i < 12; i++) { ++ ++ ioc_res = dev_wlc_intvar_get_reg(dev, "btc_params", 27, ¶m27); ++ ++ AP6210_DEBUG("%s, sample[%d], btc params: 27:%x\n", ++ __FUNCTION__, i, param27); ++ ++ if (ioc_res < 0) { ++ AP6210_ERR("%s ioc read btc params error\n", __FUNCTION__); ++ break; ++ } ++ ++ if ((param27 & 0x6) == 2) { /* count both sco & esco */ ++ sco_id_cnt++; ++ } ++ ++ if (sco_id_cnt > 2) { ++ AP6210_DEBUG("%s, sco/esco detected, pkt id_cnt:%d samples:%d\n", ++ __FUNCTION__, sco_id_cnt, i); ++ res = TRUE; ++ break; ++ } ++ ++ msleep(5); ++ } ++ ++ return res; ++} ++ ++#if defined(BT_DHCP_eSCO_FIX) ++/* Enhanced BT COEX settings for eSCO compatibility during DHCP window */ ++static int set_btc_esco_params(struct net_device *dev, bool trump_sco) ++{ ++ static bool saved_status = FALSE; ++ ++ char buf_reg50va_dhcp_on[8] = ++ { 50, 00, 00, 00, 0x22, 0x80, 0x00, 0x00 }; ++ char buf_reg51va_dhcp_on[8] = ++ { 51, 00, 00, 00, 0x00, 0x00, 0x00, 0x00 }; ++ char buf_reg64va_dhcp_on[8] = ++ { 64, 00, 00, 00, 0x00, 0x00, 0x00, 0x00 }; ++ char buf_reg65va_dhcp_on[8] = ++ { 65, 00, 00, 00, 0x00, 0x00, 0x00, 0x00 }; ++ char buf_reg71va_dhcp_on[8] = ++ { 71, 00, 00, 00, 0x00, 0x00, 0x00, 0x00 }; ++ uint32 regaddr; ++ static uint32 saved_reg50; ++ static uint32 saved_reg51; ++ static uint32 saved_reg64; ++ static uint32 saved_reg65; ++ static uint32 saved_reg71; ++ ++ if (trump_sco) { ++ /* this should reduce eSCO agressive retransmit ++ * w/o breaking it ++ */ ++ ++ /* 1st save current */ ++ AP6210_DEBUG("Do new SCO/eSCO coex algo {save &" ++ "override}\n"); ++ if ((!dev_wlc_intvar_get_reg(dev, "btc_params", 50, &saved_reg50)) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 51, &saved_reg51)) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 64, &saved_reg64)) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 65, &saved_reg65)) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 71, &saved_reg71))) { ++ saved_status = TRUE; ++ AP6210_DEBUG("%s saved bt_params[50,51,64,65,71]:" ++ "0x%x 0x%x 0x%x 0x%x 0x%x\n", ++ __FUNCTION__, saved_reg50, saved_reg51, ++ saved_reg64, saved_reg65, saved_reg71); ++ } else { ++ AP6210_ERR(":%s: save btc_params failed\n", ++ __FUNCTION__); ++ saved_status = FALSE; ++ return -1; ++ } ++ ++ AP6210_DEBUG("override with [50,51,64,65,71]:" ++ "0x%x 0x%x 0x%x 0x%x 0x%x\n", ++ *(u32 *)(buf_reg50va_dhcp_on+4), ++ *(u32 *)(buf_reg51va_dhcp_on+4), ++ *(u32 *)(buf_reg64va_dhcp_on+4), ++ *(u32 *)(buf_reg65va_dhcp_on+4), ++ *(u32 *)(buf_reg71va_dhcp_on+4)); ++ ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg50va_dhcp_on[0], 8); ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg51va_dhcp_on[0], 8); ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg64va_dhcp_on[0], 8); ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg65va_dhcp_on[0], 8); ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg71va_dhcp_on[0], 8); ++ ++ saved_status = TRUE; ++ } else if (saved_status) { ++ /* restore previously saved bt params */ ++ AP6210_DEBUG("Do new SCO/eSCO coex algo {save &" ++ "override}\n"); ++ ++ regaddr = 50; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg50); ++ regaddr = 51; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg51); ++ regaddr = 64; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg64); ++ regaddr = 65; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg65); ++ regaddr = 71; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg71); ++ ++ AP6210_DEBUG("restore bt_params[50,51,64,65,71]:" ++ "0x%x 0x%x 0x%x 0x%x 0x%x\n", ++ saved_reg50, saved_reg51, saved_reg64, ++ saved_reg65, saved_reg71); ++ ++ saved_status = FALSE; ++ } else { ++ AP6210_ERR(":%s att to restore not saved BTCOEX params\n", ++ __FUNCTION__); ++ return -1; ++ } ++ return 0; ++} ++#endif /* BT_DHCP_eSCO_FIX */ ++ ++static void ++wl_cfg80211_bt_setflag(struct net_device *dev, bool set) ++{ ++#if defined(BT_DHCP_USE_FLAGS) ++ char buf_flag7_dhcp_on[8] = { 7, 00, 00, 00, 0x1, 0x0, 0x00, 0x00 }; ++ char buf_flag7_default[8] = { 7, 00, 00, 00, 0x0, 0x00, 0x00, 0x00}; ++#endif ++ ++ ++#if defined(BT_DHCP_eSCO_FIX) ++ /* set = 1, save & turn on 0 - off & restore prev settings */ ++ set_btc_esco_params(dev, set); ++#endif ++ ++#if defined(BT_DHCP_USE_FLAGS) ++ AP6210_DEBUG("WI-FI priority boost via bt flags, set:%d\n", set); ++ if (set == TRUE) ++ /* Forcing bt_flag7 */ ++ dev_wlc_bufvar_set(dev, "btc_flags", ++ (char *)&buf_flag7_dhcp_on[0], ++ sizeof(buf_flag7_dhcp_on)); ++ else ++ /* Restoring default bt flag7 */ ++ dev_wlc_bufvar_set(dev, "btc_flags", ++ (char *)&buf_flag7_default[0], ++ sizeof(buf_flag7_default)); ++#endif ++} ++ ++static void wl_cfg80211_bt_timerfunc(ulong data) ++{ ++ struct btcoex_info *bt_local = (struct btcoex_info *)data; ++ AP6210_DEBUG("%s\n", __FUNCTION__); ++ bt_local->timer_on = 0; ++ schedule_work(&bt_local->work); ++} ++ ++static void wl_cfg80211_bt_handler(struct work_struct *work) ++{ ++ struct btcoex_info *btcx_inf; ++ ++ btcx_inf = container_of(work, struct btcoex_info, work); ++ ++ if (btcx_inf->timer_on) { ++ btcx_inf->timer_on = 0; ++ del_timer_sync(&btcx_inf->timer); ++ } ++ ++ switch (btcx_inf->bt_state) { ++ case BT_DHCP_START: ++ /* DHCP started ++ * provide OPPORTUNITY window to get DHCP address ++ */ ++ AP6210_DEBUG("%s bt_dhcp stm: started \n", ++ __FUNCTION__); ++ btcx_inf->bt_state = BT_DHCP_OPPR_WIN; ++ mod_timer(&btcx_inf->timer, ++ jiffies + msecs_to_jiffies(BT_DHCP_OPPR_WIN_TIME)); ++ btcx_inf->timer_on = 1; ++ break; ++ ++ case BT_DHCP_OPPR_WIN: ++ if (btcx_inf->dhcp_done) { ++ AP6210_DEBUG("%s DHCP Done before T1 expiration\n", ++ __FUNCTION__); ++ goto btc_coex_idle; ++ } ++ ++ /* DHCP is not over yet, start lowering BT priority ++ * enforce btc_params + flags if necessary ++ */ ++ AP6210_DEBUG("%s DHCP T1:%d expired\n", __FUNCTION__, ++ BT_DHCP_OPPR_WIN_TIME); ++ if (btcx_inf->dev) ++ wl_cfg80211_bt_setflag(btcx_inf->dev, TRUE); ++ btcx_inf->bt_state = BT_DHCP_FLAG_FORCE_TIMEOUT; ++ mod_timer(&btcx_inf->timer, ++ jiffies + msecs_to_jiffies(BT_DHCP_FLAG_FORCE_TIME)); ++ btcx_inf->timer_on = 1; ++ break; ++ ++ case BT_DHCP_FLAG_FORCE_TIMEOUT: ++ if (btcx_inf->dhcp_done) { ++ AP6210_DEBUG("%s DHCP Done before T2 expiration\n", ++ __FUNCTION__); ++ } else { ++ /* Noo dhcp during T1+T2, restore BT priority */ ++ AP6210_DEBUG("%s DHCP wait interval T2:%d" ++ "msec expired\n", __FUNCTION__, ++ BT_DHCP_FLAG_FORCE_TIME); ++ } ++ ++ /* Restoring default bt priority */ ++ if (btcx_inf->dev) ++ wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); ++btc_coex_idle: ++ btcx_inf->bt_state = BT_DHCP_IDLE; ++ btcx_inf->timer_on = 0; ++ break; ++ ++ default: ++ AP6210_ERR("%s error g_status=%d !!!\n", __FUNCTION__, ++ btcx_inf->bt_state); ++ if (btcx_inf->dev) ++ wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); ++ btcx_inf->bt_state = BT_DHCP_IDLE; ++ btcx_inf->timer_on = 0; ++ break; ++ } ++ ++ net_os_wake_unlock(btcx_inf->dev); ++} ++ ++int wl_cfg80211_btcoex_init(struct wl_priv *wl) ++{ ++ struct btcoex_info *btco_inf = NULL; ++ ++ btco_inf = kmalloc(sizeof(struct btcoex_info), GFP_KERNEL); ++ if (!btco_inf) ++ return -ENOMEM; ++ ++ btco_inf->bt_state = BT_DHCP_IDLE; ++ btco_inf->ts_dhcp_start = 0; ++ btco_inf->ts_dhcp_ok = 0; ++ /* Set up timer for BT */ ++ btco_inf->timer_ms = 10; ++ init_timer(&btco_inf->timer); ++ btco_inf->timer.data = (ulong)btco_inf; ++ btco_inf->timer.function = wl_cfg80211_bt_timerfunc; ++ ++ btco_inf->dev = wl->wdev->netdev; ++ ++ INIT_WORK(&btco_inf->work, wl_cfg80211_bt_handler); ++ ++ wl->btcoex_info = btco_inf; ++ return 0; ++} ++ ++void wl_cfg80211_btcoex_deinit(struct wl_priv *wl) ++{ ++ if (!wl->btcoex_info) ++ return; ++ ++ if (wl->btcoex_info->timer_on) { ++ wl->btcoex_info->timer_on = 0; ++ del_timer_sync(&wl->btcoex_info->timer); ++ } ++ ++ cancel_work_sync(&wl->btcoex_info->work); ++ ++ kfree(wl->btcoex_info); ++ wl->btcoex_info = NULL; ++} ++#endif ++ ++int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command) ++{ ++ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ char powermode_val = 0; ++ char buf_reg66va_dhcp_on[8] = { 66, 00, 00, 00, 0x10, 0x27, 0x00, 0x00 }; ++ char buf_reg41va_dhcp_on[8] = { 41, 00, 00, 00, 0x33, 0x00, 0x00, 0x00 }; ++ char buf_reg68va_dhcp_on[8] = { 68, 00, 00, 00, 0x90, 0x01, 0x00, 0x00 }; ++ ++ uint32 regaddr; ++ static uint32 saved_reg66; ++ static uint32 saved_reg41; ++ static uint32 saved_reg68; ++ static bool saved_status = FALSE; ++ ++#ifdef COEX_DHCP ++ char buf_flag7_default[8] = { 7, 00, 00, 00, 0x0, 0x00, 0x00, 0x00}; ++ struct btcoex_info *btco_inf = wl->btcoex_info; ++#endif /* COEX_DHCP */ ++ ++#ifdef PKT_FILTER_SUPPORT ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++#endif ++ ++ /* Figure out powermode 1 or o command */ ++ strncpy((char *)&powermode_val, command + strlen("BTCOEXMODE") +1, 1); ++ ++ if (strnicmp((char *)&powermode_val, "1", strlen("1")) == 0) { ++ AP6210_DEBUG("%s: DHCP session starts\n", __FUNCTION__); ++ ++#if defined(DHCP_SCAN_SUPPRESS) ++ /* Suppress scan during the DHCP */ ++ wl_cfg80211_scan_suppress(dev, 1); ++#endif /* OEM_ANDROID */ ++ ++#ifdef PKT_FILTER_SUPPORT ++ dhd->dhcp_in_progress = 1; ++ ++ if (dhd->early_suspended) { ++ AP6210_DEBUG("DHCP in progressing , disable packet filter!!!\n"); ++ dhd_enable_packet_filter(0, dhd); ++ } ++#endif ++ ++ /* Retrieve and saved orig regs value */ ++ if ((saved_status == FALSE) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 66, &saved_reg66)) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 41, &saved_reg41)) && ++ (!dev_wlc_intvar_get_reg(dev, "btc_params", 68, &saved_reg68))) { ++ saved_status = TRUE; ++ AP6210_DEBUG("Saved 0x%x 0x%x 0x%x\n", ++ saved_reg66, saved_reg41, saved_reg68); ++ ++ /* Disable PM mode during dhpc session */ ++ ++ /* Disable PM mode during dhpc session */ ++#ifdef COEX_DHCP ++ /* Start BT timer only for SCO connection */ ++ if (btcoex_is_sco_active(dev)) { ++ /* btc_params 66 */ ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg66va_dhcp_on[0], ++ sizeof(buf_reg66va_dhcp_on)); ++ /* btc_params 41 0x33 */ ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg41va_dhcp_on[0], ++ sizeof(buf_reg41va_dhcp_on)); ++ /* btc_params 68 0x190 */ ++ dev_wlc_bufvar_set(dev, "btc_params", ++ (char *)&buf_reg68va_dhcp_on[0], ++ sizeof(buf_reg68va_dhcp_on)); ++ saved_status = TRUE; ++ ++ btco_inf->bt_state = BT_DHCP_START; ++ btco_inf->timer_on = 1; ++ mod_timer(&btco_inf->timer, btco_inf->timer.expires); ++ AP6210_DEBUG("%s enable BT DHCP Timer\n", ++ __FUNCTION__); ++ } ++#endif /* COEX_DHCP */ ++ } ++ else if (saved_status == TRUE) { ++ AP6210_ERR("%s was called w/o DHCP OFF. Continue\n", __FUNCTION__); ++ } ++ } ++ else if (strnicmp((char *)&powermode_val, "2", strlen("2")) == 0) { ++ ++ ++#ifdef PKT_FILTER_SUPPORT ++ dhd->dhcp_in_progress = 0; ++ AP6210_DEBUG("%s: DHCP is complete \n", __FUNCTION__); ++ ++#if defined(DHCP_SCAN_SUPPRESS) ++ /* Since DHCP is complete, enable the scan back */ ++ wl_cfg80211_scan_suppress(dev, 0); ++#endif /* OEM_ANDROID */ ++ ++ /* Enable packet filtering */ ++ if (dhd->early_suspended) { ++ AP6210_DEBUG("DHCP is complete , enable packet filter!!!\n"); ++ dhd_enable_packet_filter(1, dhd); ++ } ++#endif /* PKT_FILTER_SUPPORT */ ++ ++ /* Restoring PM mode */ ++ ++#ifdef COEX_DHCP ++ /* Stop any bt timer because DHCP session is done */ ++ AP6210_DEBUG("%s disable BT DHCP Timer\n", __FUNCTION__); ++ if (btco_inf->timer_on) { ++ btco_inf->timer_on = 0; ++ del_timer_sync(&btco_inf->timer); ++ ++ if (btco_inf->bt_state != BT_DHCP_IDLE) { ++ /* need to restore original btc flags & extra btc params */ ++ AP6210_DEBUG("%s bt->bt_state:%d\n", ++ __FUNCTION__, btco_inf->bt_state); ++ /* wake up btcoex thread to restore btlags+params */ ++ schedule_work(&btco_inf->work); ++ } ++ } ++ ++ /* Restoring btc_flag paramter anyway */ ++ if (saved_status == TRUE) ++ dev_wlc_bufvar_set(dev, "btc_flags", ++ (char *)&buf_flag7_default[0], sizeof(buf_flag7_default)); ++#endif /* COEX_DHCP */ ++ ++ /* Restore original values */ ++ if (saved_status == TRUE) { ++ regaddr = 66; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg66); ++ regaddr = 41; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg41); ++ regaddr = 68; ++ dev_wlc_intvar_set_reg(dev, "btc_params", ++ (char *)®addr, (char *)&saved_reg68); ++ ++ AP6210_DEBUG("restore regs {66,41,68} <- 0x%x 0x%x 0x%x\n", ++ saved_reg66, saved_reg41, saved_reg68); ++ } ++ saved_status = FALSE; ++ ++ } ++ else { ++ AP6210_ERR("%s Unkwown yet power setting, ignored\n", ++ __FUNCTION__); ++ } ++ ++ snprintf(command, 3, "OK"); ++ ++ return (strlen("OK")); ++} +diff --git a/drivers/net/wireless/ap6210/dhd_cfg80211.h b/drivers/net/wireless/ap6210/dhd_cfg80211.h +new file mode 100644 +index 0000000..922d6ed +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_cfg80211.h +@@ -0,0 +1,44 @@ ++/* ++ * Linux cfg80211 driver - Dongle Host Driver (DHD) related ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_cfg80211.c,v 1.1.4.1.2.14 2011/02/09 01:40:07 Exp $ ++ */ ++ ++ ++#ifndef __DHD_CFG80211__ ++#define __DHD_CFG80211__ ++ ++#include ++#include ++ ++s32 dhd_cfg80211_init(struct wl_priv *wl); ++s32 dhd_cfg80211_deinit(struct wl_priv *wl); ++s32 dhd_cfg80211_down(struct wl_priv *wl); ++s32 dhd_cfg80211_set_p2p_info(struct wl_priv *wl, int val); ++s32 dhd_cfg80211_clean_p2p_info(struct wl_priv *wl); ++s32 dhd_config_dongle(struct wl_priv *wl, bool need_lock); ++ ++int wl_cfg80211_btcoex_init(struct wl_priv *wl); ++void wl_cfg80211_btcoex_deinit(struct wl_priv *wl); ++ ++#endif /* __DHD_CFG80211__ */ +diff --git a/drivers/net/wireless/ap6210/dhd_common.c b/drivers/net/wireless/ap6210/dhd_common.c +new file mode 100644 +index 0000000..96c021f +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_common.c +@@ -0,0 +1,2255 @@ ++/* ++ * Broadcom Dongle Host Driver (DHD), common DHD core. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_common.c 373873 2012-12-10 20:45:58Z $ ++ */ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++ ++#ifdef WL_CFG80211 ++#include ++#endif ++#ifdef WLBTAMP ++#include ++#include ++#endif ++#ifdef SET_RANDOM_MAC_SOFTAP ++#include ++#include ++#endif ++ ++#define htod32(i) i ++#define htod16(i) i ++#define dtoh32(i) i ++#define dtoh16(i) i ++#define htodchanspec(i) i ++#define dtohchanspec(i) i ++ ++#ifdef PROP_TXSTATUS ++#include ++#include ++#endif ++ ++#include ++#include ++ ++#ifdef WLMEDIA_HTSF ++extern void htsf_update(struct dhd_info *dhd, void *data); ++#endif ++int dhd_msg_level = DHD_ERROR_VAL; ++ ++ ++#include ++ ++char fw_path[MOD_PARAM_PATHLEN]; ++char nv_path[MOD_PARAM_PATHLEN]; ++ ++#ifdef SOFTAP ++char fw_path2[MOD_PARAM_PATHLEN]; ++extern bool softap_enabled; ++#endif ++ ++/* Last connection success/failure status */ ++uint32 dhd_conn_event; ++uint32 dhd_conn_status; ++uint32 dhd_conn_reason; ++ ++extern int dhd_iscan_request(void * dhdp, uint16 action); ++extern void dhd_ind_scan_confirm(void *h, bool status); ++extern int dhd_iscan_in_progress(void *h); ++void dhd_iscan_lock(void); ++void dhd_iscan_unlock(void); ++extern int dhd_change_mtu(dhd_pub_t *dhd, int new_mtu, int ifidx); ++#if !defined(AP) && defined(WLP2P) ++extern int dhd_get_concurrent_capabilites(dhd_pub_t *dhd); ++#endif ++bool ap_cfg_running = FALSE; ++bool ap_fw_loaded = FALSE; ++ ++ ++#ifdef DHD_DEBUG ++const char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR "\nCompiled on " ++ __DATE__ " at " __TIME__; ++#else ++const char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR; ++#endif ++ ++void dhd_set_timer(void *bus, uint wdtick); ++ ++/* IOVar table */ ++enum { ++ IOV_VERSION = 1, ++ IOV_WLMSGLEVEL, ++ IOV_MSGLEVEL, ++ IOV_BCMERRORSTR, ++ IOV_BCMERROR, ++ IOV_WDTICK, ++ IOV_DUMP, ++ IOV_CLEARCOUNTS, ++ IOV_LOGDUMP, ++ IOV_LOGCAL, ++ IOV_LOGSTAMP, ++ IOV_GPIOOB, ++ IOV_IOCTLTIMEOUT, ++#ifdef WLBTAMP ++ IOV_HCI_CMD, /* HCI command */ ++ IOV_HCI_ACL_DATA, /* HCI data packet */ ++#endif ++#if defined(DHD_DEBUG) ++ IOV_CONS, ++ IOV_DCONSOLE_POLL, ++#endif /* defined(DHD_DEBUG) */ ++#ifdef PROP_TXSTATUS ++ IOV_PROPTXSTATUS_ENABLE, ++ IOV_PROPTXSTATUS_MODE, ++#endif ++ IOV_BUS_TYPE, ++#ifdef WLMEDIA_HTSF ++ IOV_WLPKTDLYSTAT_SZ, ++#endif ++ IOV_CHANGEMTU, ++ IOV_HOSTREORDER_FLOWS, ++ IOV_LAST ++}; ++ ++const bcm_iovar_t dhd_iovars[] = { ++ {"version", IOV_VERSION, 0, IOVT_BUFFER, sizeof(dhd_version) }, ++ {"wlmsglevel", IOV_WLMSGLEVEL, 0, IOVT_UINT32, 0 }, ++#ifdef DHD_DEBUG ++ {"msglevel", IOV_MSGLEVEL, 0, IOVT_UINT32, 0 }, ++#endif /* DHD_DEBUG */ ++ {"bcmerrorstr", IOV_BCMERRORSTR, 0, IOVT_BUFFER, BCME_STRLEN }, ++ {"bcmerror", IOV_BCMERROR, 0, IOVT_INT8, 0 }, ++ {"wdtick", IOV_WDTICK, 0, IOVT_UINT32, 0 }, ++ {"dump", IOV_DUMP, 0, IOVT_BUFFER, DHD_IOCTL_MAXLEN }, ++#ifdef DHD_DEBUG ++ {"cons", IOV_CONS, 0, IOVT_BUFFER, 0 }, ++ {"dconpoll", IOV_DCONSOLE_POLL, 0, IOVT_UINT32, 0 }, ++#endif ++ {"clearcounts", IOV_CLEARCOUNTS, 0, IOVT_VOID, 0 }, ++ {"gpioob", IOV_GPIOOB, 0, IOVT_UINT32, 0 }, ++ {"ioctl_timeout", IOV_IOCTLTIMEOUT, 0, IOVT_UINT32, 0 }, ++#ifdef WLBTAMP ++ {"HCI_cmd", IOV_HCI_CMD, 0, IOVT_BUFFER, 0}, ++ {"HCI_ACL_data", IOV_HCI_ACL_DATA, 0, IOVT_BUFFER, 0}, ++#endif ++#ifdef PROP_TXSTATUS ++ {"proptx", IOV_PROPTXSTATUS_ENABLE, 0, IOVT_UINT32, 0 }, ++ /* ++ set the proptxtstatus operation mode: ++ 0 - Do not do any proptxtstatus flow control ++ 1 - Use implied credit from a packet status ++ 2 - Use explicit credit ++ */ ++ {"ptxmode", IOV_PROPTXSTATUS_MODE, 0, IOVT_UINT32, 0 }, ++#endif ++ {"bustype", IOV_BUS_TYPE, 0, IOVT_UINT32, 0}, ++#ifdef WLMEDIA_HTSF ++ {"pktdlystatsz", IOV_WLPKTDLYSTAT_SZ, 0, IOVT_UINT8, 0 }, ++#endif ++ {"changemtu", IOV_CHANGEMTU, 0, IOVT_UINT32, 0 }, ++ {"host_reorder_flows", IOV_HOSTREORDER_FLOWS, 0, IOVT_BUFFER, ++ (WLHOST_REORDERDATA_MAXFLOWS + 1) }, ++ {NULL, 0, 0, 0, 0 } ++}; ++ ++void ++dhd_common_init(osl_t *osh) ++{ ++ int select_type = 0; ++ //aw checkout which wifi had select ++ select_type = ap6210_gpio_wifi_get_mod_type(); ++ ++#ifdef CONFIG_AP6210_FW_PATH ++ //select bcm40181/ap6181/ap6210 ++ if (select_type == 1 || select_type == 7 || select_type == 9) { ++ bcm_strncpy_s(fw_path, sizeof(fw_path), "/lib/firmware/ap6210/fw_bcm40181a2.bin", MOD_PARAM_PATHLEN-1); ++ } ++ //select bcm40183 ++ if (select_type == 2) { ++ bcm_strncpy_s(fw_path, sizeof(fw_path), "/lib/firmware/ap6210/fw_bcm40183b2.bin", MOD_PARAM_PATHLEN-1); ++ } ++ //select ap6330 ++ if (select_type == 8) { ++ bcm_strncpy_s(fw_path, sizeof(fw_path), "/lib/firmware/ap6210/fw_bcm40183b2_ag.bin", MOD_PARAM_PATHLEN-1); ++ } ++ ++#else /* CONFIG_AP6210_FW_PATH */ ++ fw_path[0] = '\0'; ++#endif /* CONFIG_AP6210_FW_PATH */ ++#ifdef CONFIG_AP6210_NVRAM_PATH ++ //select bcm40181 ++ if (select_type == 1) { ++ bcm_strncpy_s(nv_path, sizeof(nv_path), "/lib/firmware/ap6210/nvram_bcm40181.txt", MOD_PARAM_PATHLEN-1); ++ } ++ //select bcm40183 ++ if (select_type == 2) { ++ bcm_strncpy_s(nv_path, sizeof(nv_path), "/lib/firmware/ap6210/nvram_bcm40183.txt", MOD_PARAM_PATHLEN-1); ++ } ++ //select ap6210 ++ if (select_type == 7) { ++ bcm_strncpy_s(nv_path, sizeof(nv_path), "/lib/firmware/ap6210/nvram_ap6210.txt", MOD_PARAM_PATHLEN-1); ++ } ++ ++ //select ap6330 ++ if (select_type == 8) { ++ bcm_strncpy_s(nv_path, sizeof(nv_path), "/lib/firmware/ap6210/nvram_ap6330.txt", MOD_PARAM_PATHLEN-1); ++ } ++ //select ap6181 ++ if (select_type == 9) { ++ bcm_strncpy_s(nv_path, sizeof(nv_path), "/lib/firmware/ap6210/nvram_ap6181.txt", MOD_PARAM_PATHLEN-1); ++ } ++#else /* CONFIG_AP6210_NVRAM_PATH */ ++ nv_path[0] = '\0'; ++#endif /* CONFIG_AP6210_NVRAM_PATH */ ++#ifdef SOFTAP ++ fw_path2[0] = '\0'; ++#endif ++} ++ ++static int ++dhd_dump(dhd_pub_t *dhdp, char *buf, int buflen) ++{ ++ char eabuf[ETHER_ADDR_STR_LEN]; ++ ++ struct bcmstrbuf b; ++ struct bcmstrbuf *strbuf = &b; ++ ++ bcm_binit(strbuf, buf, buflen); ++ ++ /* Base DHD info */ ++ bcm_bprintf(strbuf, "%s\n", dhd_version); ++ bcm_bprintf(strbuf, "\n"); ++ bcm_bprintf(strbuf, "pub.up %d pub.txoff %d pub.busstate %d\n", ++ dhdp->up, dhdp->txoff, dhdp->busstate); ++ bcm_bprintf(strbuf, "pub.hdrlen %d pub.maxctl %d pub.rxsz %d\n", ++ dhdp->hdrlen, dhdp->maxctl, dhdp->rxsz); ++ bcm_bprintf(strbuf, "pub.iswl %d pub.drv_version %ld pub.mac %s\n", ++ dhdp->iswl, dhdp->drv_version, bcm_ether_ntoa(&dhdp->mac, eabuf)); ++ bcm_bprintf(strbuf, "pub.bcmerror %d tickcnt %d\n", dhdp->bcmerror, dhdp->tickcnt); ++ ++ bcm_bprintf(strbuf, "dongle stats:\n"); ++ bcm_bprintf(strbuf, "tx_packets %ld tx_bytes %ld tx_errors %ld tx_dropped %ld\n", ++ dhdp->dstats.tx_packets, dhdp->dstats.tx_bytes, ++ dhdp->dstats.tx_errors, dhdp->dstats.tx_dropped); ++ bcm_bprintf(strbuf, "rx_packets %ld rx_bytes %ld rx_errors %ld rx_dropped %ld\n", ++ dhdp->dstats.rx_packets, dhdp->dstats.rx_bytes, ++ dhdp->dstats.rx_errors, dhdp->dstats.rx_dropped); ++ bcm_bprintf(strbuf, "multicast %ld\n", dhdp->dstats.multicast); ++ ++ bcm_bprintf(strbuf, "bus stats:\n"); ++ bcm_bprintf(strbuf, "tx_packets %ld tx_multicast %ld tx_errors %ld\n", ++ dhdp->tx_packets, dhdp->tx_multicast, dhdp->tx_errors); ++ bcm_bprintf(strbuf, "tx_ctlpkts %ld tx_ctlerrs %ld\n", ++ dhdp->tx_ctlpkts, dhdp->tx_ctlerrs); ++ bcm_bprintf(strbuf, "rx_packets %ld rx_multicast %ld rx_errors %ld \n", ++ dhdp->rx_packets, dhdp->rx_multicast, dhdp->rx_errors); ++ bcm_bprintf(strbuf, "rx_ctlpkts %ld rx_ctlerrs %ld rx_dropped %ld\n", ++ dhdp->rx_ctlpkts, dhdp->rx_ctlerrs, dhdp->rx_dropped); ++ bcm_bprintf(strbuf, "rx_readahead_cnt %ld tx_realloc %ld\n", ++ dhdp->rx_readahead_cnt, dhdp->tx_realloc); ++ bcm_bprintf(strbuf, "\n"); ++ ++ /* Add any prot info */ ++ dhd_prot_dump(dhdp, strbuf); ++ bcm_bprintf(strbuf, "\n"); ++ ++ /* Add any bus info */ ++ dhd_bus_dump(dhdp, strbuf); ++ ++ return (!strbuf->size ? BCME_BUFTOOSHORT : 0); ++} ++ ++int ++dhd_wl_ioctl_cmd(dhd_pub_t *dhd_pub, int cmd, void *arg, int len, uint8 set, int ifindex) ++{ ++ wl_ioctl_t ioc; ++ ++ ioc.cmd = cmd; ++ ioc.buf = arg; ++ ioc.len = len; ++ ioc.set = set; ++ ++ return dhd_wl_ioctl(dhd_pub, ifindex, &ioc, arg, len); ++} ++ ++ ++int ++dhd_wl_ioctl(dhd_pub_t *dhd_pub, int ifindex, wl_ioctl_t *ioc, void *buf, int len) ++{ ++ int ret; ++ ++ dhd_os_proto_block(dhd_pub); ++ ++ ret = dhd_prot_ioctl(dhd_pub, ifindex, ioc, buf, len); ++ if ((ret) && (dhd_pub->up)) ++ /* Send hang event only if dhd_open() was success */ ++ dhd_os_check_hang(dhd_pub, ifindex, ret); ++ ++ dhd_os_proto_unblock(dhd_pub); ++ ++ return ret; ++} ++ ++static int ++dhd_doiovar(dhd_pub_t *dhd_pub, const bcm_iovar_t *vi, uint32 actionid, const char *name, ++ void *params, int plen, void *arg, int len, int val_size) ++{ ++ int bcmerror = 0; ++ int32 int_val = 0; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ AP6210_DEBUG("%s: actionid = %d; name %s\n", __FUNCTION__, actionid, name); ++ ++ if ((bcmerror = bcm_iovar_lencheck(vi, arg, len, IOV_ISSET(actionid))) != 0) ++ goto exit; ++ ++ if (plen >= (int)sizeof(int_val)) ++ bcopy(params, &int_val, sizeof(int_val)); ++ ++ switch (actionid) { ++ case IOV_GVAL(IOV_VERSION): ++ /* Need to have checked buffer length */ ++ bcm_strncpy_s((char*)arg, len, dhd_version, len); ++ break; ++ ++ case IOV_GVAL(IOV_WLMSGLEVEL): ++ //AP6210_DEBUG("android_msg_level=0x%x\n", android_msg_level); ++#if defined(CONFIG_WIRELESS_EXT) ++ int_val = (int32)iw_msg_level; ++ bcopy(&int_val, arg, val_size); ++ AP6210_DEBUG("iw_msg_level=0x%x\n", iw_msg_level); ++#endif ++#ifdef WL_CFG80211 ++ int_val = (int32)wl_dbg_level; ++ bcopy(&int_val, arg, val_size); ++ AP6210_DEBUG("cfg_msg_level=0x%x\n", wl_dbg_level); ++#endif ++ break; ++ ++ case IOV_SVAL(IOV_WLMSGLEVEL): ++#if defined(CONFIG_WIRELESS_EXT) ++ if (int_val & DHD_IW_VAL) { ++ iw_msg_level = (uint)(int_val & 0xFFFF); ++ AP6210_DEBUG("iw_msg_level=0x%x\n", iw_msg_level); ++ } else ++#endif ++#ifdef WL_CFG80211 ++ if (int_val & DHD_CFG_VAL) { ++ wl_cfg80211_enable_trace((u32)(int_val & 0xFFFF)); ++ } else ++#endif ++ { ++ //android_msg_level = (uint)int_val; ++ //AP6210_DEBUG("android_msg_level=0x%x\n", android_msg_level); ++ } ++ break; ++ ++ case IOV_GVAL(IOV_MSGLEVEL): ++ int_val = (int32)dhd_msg_level; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_MSGLEVEL): ++ dhd_msg_level = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_BCMERRORSTR): ++ bcm_strncpy_s((char *)arg, len, bcmerrorstr(dhd_pub->bcmerror), BCME_STRLEN); ++ ((char *)arg)[BCME_STRLEN - 1] = 0x00; ++ break; ++ ++ case IOV_GVAL(IOV_BCMERROR): ++ int_val = (int32)dhd_pub->bcmerror; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_GVAL(IOV_WDTICK): ++ int_val = (int32)dhd_watchdog_ms; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_WDTICK): ++ if (!dhd_pub->up) { ++ bcmerror = BCME_NOTUP; ++ break; ++ } ++ dhd_os_wd_timer(dhd_pub, (uint)int_val); ++ break; ++ ++ case IOV_GVAL(IOV_DUMP): ++ bcmerror = dhd_dump(dhd_pub, arg, len); ++ break; ++ ++#ifdef DHD_DEBUG ++ case IOV_GVAL(IOV_DCONSOLE_POLL): ++ int_val = (int32)dhd_console_ms; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_DCONSOLE_POLL): ++ dhd_console_ms = (uint)int_val; ++ break; ++ ++ case IOV_SVAL(IOV_CONS): ++ if (len > 0) ++ bcmerror = dhd_bus_console_in(dhd_pub, arg, len - 1); ++ break; ++#endif /* DHD_DEBUG */ ++ ++ case IOV_SVAL(IOV_CLEARCOUNTS): ++ dhd_pub->tx_packets = dhd_pub->rx_packets = 0; ++ dhd_pub->tx_errors = dhd_pub->rx_errors = 0; ++ dhd_pub->tx_ctlpkts = dhd_pub->rx_ctlpkts = 0; ++ dhd_pub->tx_ctlerrs = dhd_pub->rx_ctlerrs = 0; ++ dhd_pub->rx_dropped = 0; ++ dhd_pub->rx_readahead_cnt = 0; ++ dhd_pub->tx_realloc = 0; ++ dhd_pub->wd_dpc_sched = 0; ++ memset(&dhd_pub->dstats, 0, sizeof(dhd_pub->dstats)); ++ dhd_bus_clearcounts(dhd_pub); ++#ifdef PROP_TXSTATUS ++ /* clear proptxstatus related counters */ ++ if (dhd_pub->wlfc_state) { ++ athost_wl_status_info_t *wlfc = ++ (athost_wl_status_info_t*)dhd_pub->wlfc_state; ++ wlfc_hanger_t* hanger; ++ ++ memset(&wlfc->stats, 0, sizeof(athost_wl_stat_counters_t)); ++ ++ hanger = (wlfc_hanger_t*)wlfc->hanger; ++ hanger->pushed = 0; ++ hanger->popped = 0; ++ hanger->failed_slotfind = 0; ++ hanger->failed_to_pop = 0; ++ hanger->failed_to_push = 0; ++ } ++#endif /* PROP_TXSTATUS */ ++ break; ++ ++ ++ case IOV_GVAL(IOV_IOCTLTIMEOUT): { ++ int_val = (int32)dhd_os_get_ioctl_resp_timeout(); ++ bcopy(&int_val, arg, sizeof(int_val)); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_IOCTLTIMEOUT): { ++ if (int_val <= 0) ++ bcmerror = BCME_BADARG; ++ else ++ dhd_os_set_ioctl_resp_timeout((unsigned int)int_val); ++ break; ++ } ++ ++#ifdef WLBTAMP ++ case IOV_SVAL(IOV_HCI_CMD): { ++ amp_hci_cmd_t *cmd = (amp_hci_cmd_t *)arg; ++ ++ /* sanity check: command preamble present */ ++ if (len < HCI_CMD_PREAMBLE_SIZE) ++ return BCME_BUFTOOSHORT; ++ ++ /* sanity check: command parameters are present */ ++ if (len < (int)(HCI_CMD_PREAMBLE_SIZE + cmd->plen)) ++ return BCME_BUFTOOSHORT; ++ ++ dhd_bta_docmd(dhd_pub, cmd, len); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_HCI_ACL_DATA): { ++ amp_hci_ACL_data_t *ACL_data = (amp_hci_ACL_data_t *)arg; ++ ++ /* sanity check: HCI header present */ ++ if (len < HCI_ACL_DATA_PREAMBLE_SIZE) ++ return BCME_BUFTOOSHORT; ++ ++ /* sanity check: ACL data is present */ ++ if (len < (int)(HCI_ACL_DATA_PREAMBLE_SIZE + ACL_data->dlen)) ++ return BCME_BUFTOOSHORT; ++ ++ dhd_bta_tx_hcidata(dhd_pub, ACL_data, len); ++ break; ++ } ++#endif /* WLBTAMP */ ++ ++#ifdef PROP_TXSTATUS ++ case IOV_GVAL(IOV_PROPTXSTATUS_ENABLE): ++ int_val = dhd_pub->wlfc_enabled? 1 : 0; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_PROPTXSTATUS_ENABLE): ++ dhd_pub->wlfc_enabled = int_val? 1 : 0; ++ break; ++ ++ case IOV_GVAL(IOV_PROPTXSTATUS_MODE): { ++ athost_wl_status_info_t *wlfc = ++ (athost_wl_status_info_t*)dhd_pub->wlfc_state; ++ int_val = dhd_pub->wlfc_state ? (int32)wlfc->proptxstatus_mode : 0; ++ bcopy(&int_val, arg, val_size); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_PROPTXSTATUS_MODE): ++ if (dhd_pub->wlfc_state) { ++ athost_wl_status_info_t *wlfc = ++ (athost_wl_status_info_t*)dhd_pub->wlfc_state; ++ wlfc->proptxstatus_mode = int_val & 0xff; ++ } ++ break; ++#endif /* PROP_TXSTATUS */ ++ ++ case IOV_GVAL(IOV_BUS_TYPE): ++ /* The dhd application queries the driver to check if its usb or sdio. */ ++#ifdef AP6210USB ++ int_val = BUS_TYPE_USB; ++#endif ++ int_val = BUS_TYPE_SDIO; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ ++#ifdef WLMEDIA_HTSF ++ case IOV_GVAL(IOV_WLPKTDLYSTAT_SZ): ++ int_val = dhd_pub->htsfdlystat_sz; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_WLPKTDLYSTAT_SZ): ++ dhd_pub->htsfdlystat_sz = int_val & 0xff; ++ AP6210_DEBUG("Setting tsfdlystat_sz:%d\n", dhd_pub->htsfdlystat_sz); ++ break; ++#endif ++ case IOV_SVAL(IOV_CHANGEMTU): ++ int_val &= 0xffff; ++ bcmerror = dhd_change_mtu(dhd_pub, int_val, 0); ++ break; ++ ++ case IOV_GVAL(IOV_HOSTREORDER_FLOWS): ++ { ++ uint i = 0; ++ uint8 *ptr = (uint8 *)arg; ++ uint8 count = 0; ++ ++ ptr++; ++ for (i = 0; i < WLHOST_REORDERDATA_MAXFLOWS; i++) { ++ if (dhd_pub->reorder_bufs[i] != NULL) { ++ *ptr = dhd_pub->reorder_bufs[i]->flow_id; ++ ptr++; ++ count++; ++ } ++ } ++ ptr = (uint8 *)arg; ++ *ptr = count; ++ break; ++ } ++ ++ default: ++ bcmerror = BCME_UNSUPPORTED; ++ break; ++ } ++ ++exit: ++ AP6210_DEBUG("%s: actionid %d, bcmerror %d\n", __FUNCTION__, actionid, bcmerror); ++ return bcmerror; ++} ++ ++/* Store the status of a connection attempt for later retrieval by an iovar */ ++void ++dhd_store_conn_status(uint32 event, uint32 status, uint32 reason) ++{ ++ /* Do not overwrite a WLC_E_PRUNE with a WLC_E_SET_SSID ++ * because an encryption/rsn mismatch results in both events, and ++ * the important information is in the WLC_E_PRUNE. ++ */ ++ if (!(event == WLC_E_SET_SSID && status == WLC_E_STATUS_FAIL && ++ dhd_conn_event == WLC_E_PRUNE)) { ++ dhd_conn_event = event; ++ dhd_conn_status = status; ++ dhd_conn_reason = reason; ++ } ++} ++ ++bool ++dhd_prec_enq(dhd_pub_t *dhdp, struct pktq *q, void *pkt, int prec) ++{ ++ void *p; ++ int eprec = -1; /* precedence to evict from */ ++ bool discard_oldest; ++ ++ /* Fast case, precedence queue is not full and we are also not ++ * exceeding total queue length ++ */ ++ if (!pktq_pfull(q, prec) && !pktq_full(q)) { ++ pktq_penq(q, prec, pkt); ++ return TRUE; ++ } ++ ++ /* Determine precedence from which to evict packet, if any */ ++ if (pktq_pfull(q, prec)) ++ eprec = prec; ++ else if (pktq_full(q)) { ++ pktq_peek_tail(q, &eprec); ++ if (eprec > prec || eprec < 0) ++ return FALSE; ++ } ++ ++ /* Evict if needed */ ++ if (eprec >= 0) { ++ /* Detect queueing to unconfigured precedence */ ++ ASSERT(!pktq_pempty(q, eprec)); ++ discard_oldest = AC_BITMAP_TST(dhdp->wme_dp, eprec); ++ if (eprec == prec && !discard_oldest) ++ return FALSE; /* refuse newer (incoming) packet */ ++ /* Evict packet according to discard policy */ ++ p = discard_oldest ? pktq_pdeq(q, eprec) : pktq_pdeq_tail(q, eprec); ++ ASSERT(p); ++ ++ PKTFREE(dhdp->osh, p, TRUE); ++ } ++ ++ /* Enqueue */ ++ pktq_penq(q, prec, pkt); ++ ++ return TRUE; ++} ++ ++static int ++dhd_iovar_op(dhd_pub_t *dhd_pub, const char *name, ++ void *params, int plen, void *arg, int len, bool set) ++{ ++ int bcmerror = 0; ++ int val_size; ++ const bcm_iovar_t *vi = NULL; ++ uint32 actionid; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ASSERT(name); ++ ASSERT(len >= 0); ++ ++ /* Get MUST have return space */ ++ ASSERT(set || (arg && len)); ++ ++ /* Set does NOT take qualifiers */ ++ ASSERT(!set || (!params && !plen)); ++ ++ if ((vi = bcm_iovar_lookup(dhd_iovars, name)) == NULL) { ++ bcmerror = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ ++ AP6210_DEBUG("%s: %s %s, len %d plen %d\n", __FUNCTION__, ++ name, (set ? "set" : "get"), len, plen); ++ ++ /* set up 'params' pointer in case this is a set command so that ++ * the convenience int and bool code can be common to set and get ++ */ ++ if (params == NULL) { ++ params = arg; ++ plen = len; ++ } ++ ++ if (vi->type == IOVT_VOID) ++ val_size = 0; ++ else if (vi->type == IOVT_BUFFER) ++ val_size = len; ++ else ++ /* all other types are integer sized */ ++ val_size = sizeof(int); ++ ++ actionid = set ? IOV_SVAL(vi->varid) : IOV_GVAL(vi->varid); ++ ++ bcmerror = dhd_doiovar(dhd_pub, vi, actionid, name, params, plen, arg, len, val_size); ++ ++exit: ++ return bcmerror; ++} ++ ++int ++dhd_ioctl(dhd_pub_t * dhd_pub, dhd_ioctl_t *ioc, void * buf, uint buflen) ++{ ++ int bcmerror = 0; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (!buf) { ++ return BCME_BADARG; ++ } ++ ++ switch (ioc->cmd) { ++ case DHD_GET_MAGIC: ++ if (buflen < sizeof(int)) ++ bcmerror = BCME_BUFTOOSHORT; ++ else ++ *(int*)buf = DHD_IOCTL_MAGIC; ++ break; ++ ++ case DHD_GET_VERSION: ++ if (buflen < sizeof(int)) ++ bcmerror = -BCME_BUFTOOSHORT; ++ else ++ *(int*)buf = DHD_IOCTL_VERSION; ++ break; ++ ++ case DHD_GET_VAR: ++ case DHD_SET_VAR: { ++ char *arg; ++ uint arglen; ++ ++ /* scan past the name to any arguments */ ++ for (arg = buf, arglen = buflen; *arg && arglen; arg++, arglen--) ++ ; ++ ++ if (*arg) { ++ bcmerror = BCME_BUFTOOSHORT; ++ break; ++ } ++ ++ /* account for the NUL terminator */ ++ arg++, arglen--; ++ ++ /* call with the appropriate arguments */ ++ if (ioc->cmd == DHD_GET_VAR) ++ bcmerror = dhd_iovar_op(dhd_pub, buf, arg, arglen, ++ buf, buflen, IOV_GET); ++ else ++ bcmerror = dhd_iovar_op(dhd_pub, buf, NULL, 0, arg, arglen, IOV_SET); ++ if (bcmerror != BCME_UNSUPPORTED) ++ break; ++ ++ /* not in generic table, try protocol module */ ++ if (ioc->cmd == DHD_GET_VAR) ++ bcmerror = dhd_prot_iovar_op(dhd_pub, buf, arg, ++ arglen, buf, buflen, IOV_GET); ++ else ++ bcmerror = dhd_prot_iovar_op(dhd_pub, buf, ++ NULL, 0, arg, arglen, IOV_SET); ++ if (bcmerror != BCME_UNSUPPORTED) ++ break; ++ ++ /* if still not found, try bus module */ ++ if (ioc->cmd == DHD_GET_VAR) { ++ bcmerror = dhd_bus_iovar_op(dhd_pub, buf, ++ arg, arglen, buf, buflen, IOV_GET); ++ } else { ++ bcmerror = dhd_bus_iovar_op(dhd_pub, buf, ++ NULL, 0, arg, arglen, IOV_SET); ++ } ++ ++ break; ++ } ++ ++ default: ++ bcmerror = BCME_UNSUPPORTED; ++ } ++ ++ return bcmerror; ++} ++ ++#ifdef SHOW_EVENTS ++static void ++wl_show_host_event(wl_event_msg_t *event, void *event_data) ++{ ++ uint i, status, reason; ++ bool group = FALSE, flush_txq = FALSE, link = FALSE; ++ const char *auth_str; ++ const char *event_name; ++ uchar *buf; ++ char err_msg[256], eabuf[ETHER_ADDR_STR_LEN]; ++ uint event_type, flags, auth_type, datalen; ++ ++ event_type = ntoh32(event->event_type); ++ flags = ntoh16(event->flags); ++ status = ntoh32(event->status); ++ reason = ntoh32(event->reason); ++ BCM_REFERENCE(reason); ++ auth_type = ntoh32(event->auth_type); ++ datalen = ntoh32(event->datalen); ++ ++ /* debug dump of event messages */ ++ snprintf(eabuf, sizeof(eabuf), "%02x:%02x:%02x:%02x:%02x:%02x", ++ (uchar)event->addr.octet[0]&0xff, ++ (uchar)event->addr.octet[1]&0xff, ++ (uchar)event->addr.octet[2]&0xff, ++ (uchar)event->addr.octet[3]&0xff, ++ (uchar)event->addr.octet[4]&0xff, ++ (uchar)event->addr.octet[5]&0xff); ++ ++ event_name = "UNKNOWN"; ++ for (i = 0; i < (uint)bcmevent_names_size; i++) ++ if (bcmevent_names[i].event == event_type) ++ event_name = bcmevent_names[i].name; ++ ++ if (flags & WLC_EVENT_MSG_LINK) ++ link = TRUE; ++ if (flags & WLC_EVENT_MSG_GROUP) ++ group = TRUE; ++ if (flags & WLC_EVENT_MSG_FLUSHTXQ) ++ flush_txq = TRUE; ++ ++ switch (event_type) { ++ case WLC_E_START: ++ case WLC_E_DEAUTH: ++ case WLC_E_DISASSOC: ++ AP6210_DEBUG("MACEVENT: %s, MAC %s\n", event_name, eabuf); ++ break; ++ ++ case WLC_E_ASSOC_IND: ++ case WLC_E_REASSOC_IND: ++ ++ AP6210_DEBUG("MACEVENT: %s, MAC %s\n", event_name, eabuf); ++ break; ++ ++ case WLC_E_ASSOC: ++ case WLC_E_REASSOC: ++ if (status == WLC_E_STATUS_SUCCESS) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, SUCCESS\n", event_name, eabuf); ++ } else if (status == WLC_E_STATUS_TIMEOUT) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, TIMEOUT\n", event_name, eabuf); ++ } else if (status == WLC_E_STATUS_FAIL) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, FAILURE, reason %d\n", ++ event_name, eabuf, (int)reason); ++ } else { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, unexpected status %d\n", ++ event_name, eabuf, (int)status); ++ } ++ break; ++ ++ case WLC_E_DEAUTH_IND: ++ case WLC_E_DISASSOC_IND: ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, reason %d\n", event_name, eabuf, (int)reason); ++ break; ++ ++ case WLC_E_AUTH: ++ case WLC_E_AUTH_IND: ++ if (auth_type == DOT11_OPEN_SYSTEM) ++ auth_str = "Open System"; ++ else if (auth_type == DOT11_SHARED_KEY) ++ auth_str = "Shared Key"; ++ else { ++ snprintf(err_msg, sizeof(err_msg), "AUTH unknown: %d", (int)auth_type); ++ auth_str = err_msg; ++ } ++ if (event_type == WLC_E_AUTH_IND) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, %s\n", event_name, eabuf, auth_str); ++ } else if (status == WLC_E_STATUS_SUCCESS) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, %s, SUCCESS\n", ++ event_name, eabuf, auth_str); ++ } else if (status == WLC_E_STATUS_TIMEOUT) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, %s, TIMEOUT\n", ++ event_name, eabuf, auth_str); ++ } else if (status == WLC_E_STATUS_FAIL) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, %s, FAILURE, reason %d\n", ++ event_name, eabuf, auth_str, (int)reason); ++ } ++ BCM_REFERENCE(auth_str); ++ ++ break; ++ ++ case WLC_E_JOIN: ++ case WLC_E_ROAM: ++ case WLC_E_SET_SSID: ++ if (status == WLC_E_STATUS_SUCCESS) { ++ AP6210_DEBUG("MACEVENT: %s, MAC %s\n", event_name, eabuf); ++ } else if (status == WLC_E_STATUS_FAIL) { ++ AP6210_DEBUG("MACEVENT: %s, failed\n", event_name); ++ } else if (status == WLC_E_STATUS_NO_NETWORKS) { ++ AP6210_DEBUG("MACEVENT: %s, no networks found\n", event_name); ++ } else { ++ AP6210_DEBUG("MACEVENT: %s, unexpected status %d\n", ++ event_name, (int)status); ++ } ++ break; ++ ++ case WLC_E_BEACON_RX: ++ if (status == WLC_E_STATUS_SUCCESS) { ++ AP6210_DEBUG("MACEVENT: %s, SUCCESS\n", event_name); ++ } else if (status == WLC_E_STATUS_FAIL) { ++ AP6210_DEBUG("MACEVENT: %s, FAIL\n", event_name); ++ } else { ++ AP6210_DEBUG("MACEVENT: %s, status %d\n", event_name, status); ++ } ++ break; ++ ++ case WLC_E_LINK: ++ AP6210_DEBUG("MACEVENT: %s %s\n", event_name, link?"UP":"DOWN"); ++ BCM_REFERENCE(link); ++ break; ++ ++ case WLC_E_MIC_ERROR: ++ AP6210_DEBUG("MACEVENT: %s, MAC %s, Group %d, Flush %d\n", ++ event_name, eabuf, group, flush_txq); ++ BCM_REFERENCE(group); ++ BCM_REFERENCE(flush_txq); ++ break; ++ ++ case WLC_E_ICV_ERROR: ++ case WLC_E_UNICAST_DECODE_ERROR: ++ case WLC_E_MULTICAST_DECODE_ERROR: ++ AP6210_DEBUG("MACEVENT: %s, MAC %s\n", ++ event_name, eabuf); ++ break; ++ ++ case WLC_E_TXFAIL: ++ AP6210_DEBUG("MACEVENT: %s, RA %s\n", event_name, eabuf); ++ break; ++ ++ case WLC_E_SCAN_COMPLETE: ++ case WLC_E_ASSOC_REQ_IE: ++ case WLC_E_ASSOC_RESP_IE: ++ case WLC_E_PMKID_CACHE: ++ AP6210_DEBUG("MACEVENT: %s\n", event_name); ++ break; ++ ++ case WLC_E_PFN_NET_FOUND: ++ case WLC_E_PFN_NET_LOST: ++ case WLC_E_PFN_SCAN_COMPLETE: ++ case WLC_E_PFN_SCAN_NONE: ++ case WLC_E_PFN_SCAN_ALLGONE: ++ AP6210_DEBUG("PNOEVENT: %s\n", event_name); ++ break; ++ ++ case WLC_E_PSK_SUP: ++ case WLC_E_PRUNE: ++ AP6210_DEBUG("MACEVENT: %s, status %d, reason %d\n", ++ event_name, (int)status, (int)reason); ++ break; ++ ++#ifdef WIFI_ACT_FRAME ++ case WLC_E_ACTION_FRAME: ++ AP6210_DEBUG("MACEVENT: %s Bssid %s\n", event_name, eabuf); ++ break; ++#endif /* WIFI_ACT_FRAME */ ++ ++ case WLC_E_TRACE: { ++ static uint32 seqnum_prev = 0; ++ msgtrace_hdr_t hdr; ++ uint32 nblost; ++ char *s, *p; ++ ++ buf = (uchar *) event_data; ++ memcpy(&hdr, buf, MSGTRACE_HDRLEN); ++ ++ if (hdr.version != MSGTRACE_VERSION) { ++ AP6210_DEBUG("MACEVENT: %s [unsupported version --> " ++ "dhd version:%d dongle version:%d]\n", ++ event_name, MSGTRACE_VERSION, hdr.version); ++ /* Reset datalen to avoid display below */ ++ datalen = 0; ++ break; ++ } ++ ++ /* There are 2 bytes available at the end of data */ ++ buf[MSGTRACE_HDRLEN + ntoh16(hdr.len)] = '\0'; ++ ++ if (ntoh32(hdr.discarded_bytes) || ntoh32(hdr.discarded_printf)) { ++ AP6210_DEBUG("WLC_E_TRACE: [Discarded traces in dongle -->" ++ "discarded_bytes %d discarded_printf %d]\n", ++ ntoh32(hdr.discarded_bytes), ntoh32(hdr.discarded_printf)); ++ } ++ ++ nblost = ntoh32(hdr.seqnum) - seqnum_prev - 1; ++ if (nblost > 0) { ++ AP6210_DEBUG("WLC_E_TRACE: [Event lost --> seqnum %d nblost %d\n", ++ ntoh32(hdr.seqnum), nblost); ++ } ++ seqnum_prev = ntoh32(hdr.seqnum); ++ ++ /* Display the trace buffer. Advance from \n to \n to avoid display big ++ * printf (issue with Linux printk ) ++ */ ++ p = (char *)&buf[MSGTRACE_HDRLEN]; ++ while ((s = strstr(p, "\n")) != NULL) { ++ *s = '\0'; ++ AP6210_DEBUG("%s\n", p); ++ p = s+1; ++ } ++ AP6210_DEBUG("%s\n", p); ++ ++ /* Reset datalen to avoid display below */ ++ datalen = 0; ++ break; ++ } ++ ++ ++ case WLC_E_RSSI: ++ AP6210_DEBUG("MACEVENT: %s %d\n", event_name, ntoh32(*((int *)event_data))); ++ break; ++ ++ case WLC_E_SERVICE_FOUND: ++ case WLC_E_P2PO_ADD_DEVICE: ++ case WLC_E_P2PO_DEL_DEVICE: ++ AP6210_DEBUG("MACEVENT: %s, MAC: %s\n", event_name, eabuf); ++ break; ++ ++ default: ++ AP6210_DEBUG("MACEVENT: %s %d, MAC %s, status %d, reason %d, auth %d\n", ++ event_name, event_type, eabuf, (int)status, (int)reason, ++ (int)auth_type); ++ break; ++ } ++ ++ /* show any appended data */ ++ if (datalen) { ++ buf = (uchar *) event_data; ++ AP6210_DEBUG(" data (%d) : ", datalen); ++ for (i = 0; i < datalen; i++) ++ AP6210_DUMP(" 0x%02x ", *buf++); ++ AP6210_DUMP("\n"); ++ } ++} ++#endif /* SHOW_EVENTS */ ++ ++int ++wl_host_event(dhd_pub_t *dhd_pub, int *ifidx, void *pktdata, ++ wl_event_msg_t *event, void **data_ptr) ++{ ++ /* check whether packet is a BRCM event pkt */ ++ bcm_event_t *pvt_data = (bcm_event_t *)pktdata; ++ uint8 *event_data; ++ uint32 type, status, datalen; ++ uint16 flags; ++ int evlen; ++ ++ if (bcmp(BRCM_OUI, &pvt_data->bcm_hdr.oui[0], DOT11_OUI_LEN)) { ++ AP6210_ERR("%s: mismatched OUI, bailing\n", __FUNCTION__); ++ return (BCME_ERROR); ++ } ++ ++ /* BRCM event pkt may be unaligned - use xxx_ua to load user_subtype. */ ++ if (ntoh16_ua((void *)&pvt_data->bcm_hdr.usr_subtype) != BCMILCP_BCM_SUBTYPE_EVENT) { ++ AP6210_ERR("%s: mismatched subtype, bailing\n", __FUNCTION__); ++ return (BCME_ERROR); ++ } ++ ++ *data_ptr = &pvt_data[1]; ++ event_data = *data_ptr; ++ ++ /* memcpy since BRCM event pkt may be unaligned. */ ++ memcpy(event, &pvt_data->event, sizeof(wl_event_msg_t)); ++ ++ type = ntoh32_ua((void *)&event->event_type); ++ flags = ntoh16_ua((void *)&event->flags); ++ status = ntoh32_ua((void *)&event->status); ++ datalen = ntoh32_ua((void *)&event->datalen); ++ evlen = datalen + sizeof(bcm_event_t); ++ ++ switch (type) { ++#ifdef PROP_TXSTATUS ++ case WLC_E_FIFO_CREDIT_MAP: ++ dhd_wlfc_event(dhd_pub->info); ++ dhd_wlfc_FIFOcreditmap_event(dhd_pub->info, event_data); ++ AP6210_DEBUG("WLC_E_FIFO_CREDIT_MAP:(AC0,AC1,AC2,AC3),(BC_MC),(OTHER): " ++ "(%d,%d,%d,%d),(%d),(%d)\n", event_data[0], event_data[1], ++ event_data[2], ++ event_data[3], event_data[4], event_data[5]); ++ break; ++#endif ++ ++ case WLC_E_IF: ++ { ++ dhd_if_event_t *ifevent = (dhd_if_event_t *)event_data; ++#ifdef PROP_TXSTATUS ++ { ++ uint8* ea = pvt_data->eth.ether_dhost; ++ AP6210_DEBUG("WLC_E_IF: idx:%d, action:%s, iftype:%s, " ++ "[%02x:%02x:%02x:%02x:%02x:%02x]\n", ++ ifevent->ifidx, ++ ((ifevent->action == WLC_E_IF_ADD) ? "ADD":"DEL"), ++ ((ifevent->is_AP == 0) ? "STA":"AP "), ++ ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]); ++ (void)ea; ++ if (ifevent->action == WLC_E_IF_CHANGE) ++ dhd_wlfc_interface_event(dhd_pub->info, ++ eWLFC_MAC_ENTRY_ACTION_UPDATE, ++ ifevent->ifidx, ifevent->is_AP, ea); ++ else ++ dhd_wlfc_interface_event(dhd_pub->info, ++ ((ifevent->action == WLC_E_IF_ADD) ? ++ eWLFC_MAC_ENTRY_ACTION_ADD : eWLFC_MAC_ENTRY_ACTION_DEL), ++ ifevent->ifidx, ifevent->is_AP, ea); ++ ++ ++ /* dhd already has created an interface by default, for 0 */ ++ if (ifevent->ifidx == 0) ++ break; ++ } ++#endif /* PROP_TXSTATUS */ ++ ++#ifdef WL_CFG80211 ++ if (wl_cfg80211_is_progress_ifchange()) { ++ AP6210_ERR("%s: ifidx %d for %s action %d\n", ++ __FUNCTION__, ifevent->ifidx, ++ event->ifname, ifevent->action); ++ if (ifevent->action == WLC_E_IF_ADD || ++ ifevent->action == WLC_E_IF_CHANGE) ++ wl_cfg80211_notify_ifchange(); ++ return (BCME_OK); ++ } ++#endif /* WL_CFG80211 */ ++ if (ifevent->ifidx > 0 && ifevent->ifidx < DHD_MAX_IFS) { ++ if (ifevent->action == WLC_E_IF_ADD) { ++ if (dhd_add_if(dhd_pub->info, ifevent->ifidx, ++ NULL, event->ifname, ++ event->addr.octet, ++ ifevent->flags, ifevent->bssidx)) { ++ AP6210_ERR("%s: dhd_add_if failed!!" ++ " ifidx: %d for %s\n", ++ __FUNCTION__, ++ ifevent->ifidx, ++ event->ifname); ++ return (BCME_ERROR); ++ } ++ } ++ else if (ifevent->action == WLC_E_IF_DEL) ++ dhd_del_if(dhd_pub->info, ifevent->ifidx); ++ } else { ++#ifndef PROP_TXSTATUS ++ AP6210_ERR("%s: Invalid ifidx %d for %s\n", ++ __FUNCTION__, ifevent->ifidx, event->ifname); ++#endif /* !PROP_TXSTATUS */ ++ } ++ } ++ /* send up the if event: btamp user needs it */ ++ *ifidx = dhd_ifname2idx(dhd_pub->info, event->ifname); ++ /* push up to external supp/auth */ ++ dhd_event(dhd_pub->info, (char *)pvt_data, evlen, *ifidx); ++ break; ++ ++ ++#ifdef WLMEDIA_HTSF ++ case WLC_E_HTSFSYNC: ++ htsf_update(dhd_pub->info, event_data); ++ break; ++#endif /* WLMEDIA_HTSF */ ++#if defined(NDIS630) ++ case WLC_E_NDIS_LINK: ++ break; ++#else /* defined(NDIS630) && defined(BCMDONGLEHOST) */ ++ case WLC_E_NDIS_LINK: { ++ uint32 temp = hton32(WLC_E_LINK); ++ ++ memcpy((void *)(&pvt_data->event.event_type), &temp, ++ sizeof(pvt_data->event.event_type)); ++ } ++#endif ++ /* These are what external supplicant/authenticator wants */ ++ /* fall through */ ++ case WLC_E_LINK: ++ case WLC_E_DEAUTH: ++ case WLC_E_DEAUTH_IND: ++ case WLC_E_DISASSOC: ++ case WLC_E_DISASSOC_IND: ++ AP6210_DEBUG("%s: Link event %d, flags %x, status %x\n", ++ __FUNCTION__, type, flags, status); ++ /* fall through */ ++ default: ++ *ifidx = dhd_ifname2idx(dhd_pub->info, event->ifname); ++ /* push up to external supp/auth */ ++ dhd_event(dhd_pub->info, (char *)pvt_data, evlen, *ifidx); ++ AP6210_DEBUG("%s: MAC event %d, flags %x, status %x\n", ++ __FUNCTION__, type, flags, status); ++ BCM_REFERENCE(flags); ++ BCM_REFERENCE(status); ++ ++ /* put it back to WLC_E_NDIS_LINK */ ++ if (type == WLC_E_NDIS_LINK) { ++ uint32 temp; ++ ++ temp = ntoh32_ua((void *)&event->event_type); ++ AP6210_DEBUG("Converted to WLC_E_LINK type %d\n", temp); ++ ++ temp = ntoh32(WLC_E_NDIS_LINK); ++ memcpy((void *)(&pvt_data->event.event_type), &temp, ++ sizeof(pvt_data->event.event_type)); ++ } ++ break; ++ } ++ ++#ifdef SHOW_EVENTS ++ wl_show_host_event(event, (void *)event_data); ++#endif /* SHOW_EVENTS */ ++ ++ return (BCME_OK); ++} ++ ++void ++wl_event_to_host_order(wl_event_msg_t * evt) ++{ ++ /* Event struct members passed from dongle to host are stored in network ++ * byte order. Convert all members to host-order. ++ */ ++ evt->event_type = ntoh32(evt->event_type); ++ evt->flags = ntoh16(evt->flags); ++ evt->status = ntoh32(evt->status); ++ evt->reason = ntoh32(evt->reason); ++ evt->auth_type = ntoh32(evt->auth_type); ++ evt->datalen = ntoh32(evt->datalen); ++ evt->version = ntoh16(evt->version); ++} ++ ++void ++dhd_print_buf(void *pbuf, int len, int bytes_per_line) ++{ ++#ifdef DHD_DEBUG ++ int i, j = 0; ++ unsigned char *buf = pbuf; ++ ++ if (bytes_per_line == 0) { ++ bytes_per_line = len; ++ } ++ ++ for (i = 0; i < len; i++) { ++ AP6210_DUMP("%2.2x", *buf++); ++ j++; ++ if (j == bytes_per_line) { ++ AP6210_DUMP("\n"); ++ j = 0; ++ } else { ++ AP6210_DUMP(":"); ++ } ++ } ++ AP6210_DUMP("\n"); ++#endif /* DHD_DEBUG */ ++} ++ ++#ifndef strtoul ++#define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base)) ++#endif ++ ++#ifdef PKT_FILTER_SUPPORT ++/* Convert user's input in hex pattern to byte-size mask */ ++static int ++wl_pattern_atoh(char *src, char *dst) ++{ ++ int i; ++ if (strncmp(src, "0x", 2) != 0 && ++ strncmp(src, "0X", 2) != 0) { ++ AP6210_ERR("Mask invalid format. Needs to start with 0x\n"); ++ return -1; ++ } ++ src = src + 2; /* Skip past 0x */ ++ if (strlen(src) % 2 != 0) { ++ AP6210_ERR("Mask invalid format. Needs to be of even length\n"); ++ return -1; ++ } ++ for (i = 0; *src != '\0'; i++) { ++ char num[3]; ++ bcm_strncpy_s(num, sizeof(num), src, 2); ++ num[2] = '\0'; ++ dst[i] = (uint8)strtoul(num, NULL, 16); ++ src += 2; ++ } ++ return i; ++} ++ ++void ++dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_mode) ++{ ++ char *argv[8]; ++ int i = 0; ++ const char *str; ++ int buf_len; ++ int str_len; ++ char *arg_save = 0, *arg_org = 0; ++ int rc; ++ char buf[128]; ++ wl_pkt_filter_enable_t enable_parm; ++ wl_pkt_filter_enable_t * pkt_filterp; ++ ++ if (!arg) ++ return; ++ ++ if (!(arg_save = MALLOC(dhd->osh, strlen(arg) + 1))) { ++ AP6210_ERR("%s: kmalloc failed\n", __FUNCTION__); ++ goto fail; ++ } ++ arg_org = arg_save; ++ memcpy(arg_save, arg, strlen(arg) + 1); ++ ++ argv[i] = bcmstrtok(&arg_save, " ", 0); ++ ++ i = 0; ++ if (argv[i] == NULL) { ++ AP6210_ERR("No args provided\n"); ++ goto fail; ++ } ++ ++ str = "pkt_filter_enable"; ++ str_len = strlen(str); ++ bcm_strncpy_s(buf, sizeof(buf), str, str_len); ++ buf[str_len] = '\0'; ++ buf_len = str_len + 1; ++ ++ pkt_filterp = (wl_pkt_filter_enable_t *)(buf + str_len + 1); ++ ++ /* Parse packet filter id. */ ++ enable_parm.id = htod32(strtoul(argv[i], NULL, 0)); ++ ++ /* Parse enable/disable value. */ ++ enable_parm.enable = htod32(enable); ++ ++ buf_len += sizeof(enable_parm); ++ memcpy((char *)pkt_filterp, ++ &enable_parm, ++ sizeof(enable_parm)); ++ ++ /* Enable/disable the specified filter. */ ++ rc = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, buf_len, TRUE, 0); ++ rc = rc >= 0 ? 0 : rc; ++ if (rc) ++ AP6210_DEBUG("%s: failed to add pktfilter %s, retcode = %d\n", ++ __FUNCTION__, arg, rc); ++ else ++ AP6210_DEBUG("%s: successfully added pktfilter %s\n", ++ __FUNCTION__, arg); ++ ++ /* Contorl the master mode */ ++ bcm_mkiovar("pkt_filter_mode", (char *)&master_mode, 4, buf, sizeof(buf)); ++ rc = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0); ++ rc = rc >= 0 ? 0 : rc; ++ if (rc) ++ AP6210_DEBUG("%s: failed to add pktfilter %s, retcode = %d\n", ++ __FUNCTION__, arg, rc); ++ ++fail: ++ if (arg_org) ++ MFREE(dhd->osh, arg_org, strlen(arg) + 1); ++} ++ ++void ++dhd_pktfilter_offload_set(dhd_pub_t * dhd, char *arg) ++{ ++ const char *str; ++ wl_pkt_filter_t pkt_filter; ++ wl_pkt_filter_t *pkt_filterp; ++ int buf_len; ++ int str_len; ++ int rc; ++ uint32 mask_size; ++ uint32 pattern_size; ++ char *argv[8], * buf = 0; ++ int i = 0; ++ char *arg_save = 0, *arg_org = 0; ++#define BUF_SIZE 2048 ++ ++ if (!arg) ++ return; ++ ++ if (!(arg_save = MALLOC(dhd->osh, strlen(arg) + 1))) { ++ AP6210_ERR("%s: kmalloc failed\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ arg_org = arg_save; ++ ++ if (!(buf = MALLOC(dhd->osh, BUF_SIZE))) { ++ AP6210_ERR("%s: kmalloc failed\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ memcpy(arg_save, arg, strlen(arg) + 1); ++ ++ if (strlen(arg) > BUF_SIZE) { ++ AP6210_ERR("Not enough buffer %d < %d\n", (int)strlen(arg), (int)sizeof(buf)); ++ goto fail; ++ } ++ ++ argv[i] = bcmstrtok(&arg_save, " ", 0); ++ while (argv[i++]) ++ argv[i] = bcmstrtok(&arg_save, " ", 0); ++ ++ i = 0; ++ if (argv[i] == NULL) { ++ AP6210_ERR("No args provided\n"); ++ goto fail; ++ } ++ ++ str = "pkt_filter_add"; ++ str_len = strlen(str); ++ bcm_strncpy_s(buf, BUF_SIZE, str, str_len); ++ buf[ str_len ] = '\0'; ++ buf_len = str_len + 1; ++ ++ pkt_filterp = (wl_pkt_filter_t *) (buf + str_len + 1); ++ ++ /* Parse packet filter id. */ ++ pkt_filter.id = htod32(strtoul(argv[i], NULL, 0)); ++ ++ if (argv[++i] == NULL) { ++ AP6210_ERR("Polarity not provided\n"); ++ goto fail; ++ } ++ ++ /* Parse filter polarity. */ ++ pkt_filter.negate_match = htod32(strtoul(argv[i], NULL, 0)); ++ ++ if (argv[++i] == NULL) { ++ AP6210_ERR("Filter type not provided\n"); ++ goto fail; ++ } ++ ++ /* Parse filter type. */ ++ pkt_filter.type = htod32(strtoul(argv[i], NULL, 0)); ++ ++ if (argv[++i] == NULL) { ++ AP6210_ERR("Offset not provided\n"); ++ goto fail; ++ } ++ ++ /* Parse pattern filter offset. */ ++ pkt_filter.u.pattern.offset = htod32(strtoul(argv[i], NULL, 0)); ++ ++ if (argv[++i] == NULL) { ++ AP6210_ERR("Bitmask not provided\n"); ++ goto fail; ++ } ++ ++ /* Parse pattern filter mask. */ ++ mask_size = ++ htod32(wl_pattern_atoh(argv[i], (char *) pkt_filterp->u.pattern.mask_and_pattern)); ++ ++ if (argv[++i] == NULL) { ++ AP6210_ERR("Pattern not provided\n"); ++ goto fail; ++ } ++ ++ /* Parse pattern filter pattern. */ ++ pattern_size = ++ htod32(wl_pattern_atoh(argv[i], ++ (char *) &pkt_filterp->u.pattern.mask_and_pattern[mask_size])); ++ ++ if (mask_size != pattern_size) { ++ AP6210_ERR("Mask and pattern not the same size\n"); ++ goto fail; ++ } ++ ++ pkt_filter.u.pattern.size_bytes = mask_size; ++ buf_len += WL_PKT_FILTER_FIXED_LEN; ++ buf_len += (WL_PKT_FILTER_PATTERN_FIXED_LEN + 2 * mask_size); ++ ++ /* Keep-alive attributes are set in local variable (keep_alive_pkt), and ++ ** then memcpy'ed into buffer (keep_alive_pktp) since there is no ++ ** guarantee that the buffer is properly aligned. ++ */ ++ memcpy((char *)pkt_filterp, ++ &pkt_filter, ++ WL_PKT_FILTER_FIXED_LEN + WL_PKT_FILTER_PATTERN_FIXED_LEN); ++ ++ rc = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, buf_len, TRUE, 0); ++ rc = rc >= 0 ? 0 : rc; ++ ++ if (rc) ++ AP6210_DEBUG("%s: failed to add pktfilter %s, retcode = %d\n", ++ __FUNCTION__, arg, rc); ++ else ++ AP6210_DEBUG("%s: successfully added pktfilter %s\n", ++ __FUNCTION__, arg); ++ ++fail: ++ if (arg_org) ++ MFREE(dhd->osh, arg_org, strlen(arg) + 1); ++ ++ if (buf) ++ MFREE(dhd->osh, buf, BUF_SIZE); ++} ++#endif /* PKT_FILTER_SUPPORT */ ++ ++/* ========================== */ ++/* ==== ARP OFFLOAD SUPPORT = */ ++/* ========================== */ ++#ifdef ARP_OFFLOAD_SUPPORT ++void ++dhd_arp_offload_set(dhd_pub_t * dhd, int arp_mode) ++{ ++ char iovbuf[32]; ++ int retcode; ++ ++ bcm_mkiovar("arp_ol", (char *)&arp_mode, 4, iovbuf, sizeof(iovbuf)); ++ retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ retcode = retcode >= 0 ? 0 : retcode; ++ if (retcode) ++ AP6210_DEBUG("%s: failed to set ARP offload mode to 0x%x, retcode = %d\n", ++ __FUNCTION__, arp_mode, retcode); ++ else ++ AP6210_DEBUG("%s: successfully set ARP offload mode to 0x%x\n", ++ __FUNCTION__, arp_mode); ++} ++ ++void ++dhd_arp_offload_enable(dhd_pub_t * dhd, int arp_enable) ++{ ++ char iovbuf[32]; ++ int retcode; ++ ++ bcm_mkiovar("arpoe", (char *)&arp_enable, 4, iovbuf, sizeof(iovbuf)); ++ retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ retcode = retcode >= 0 ? 0 : retcode; ++ if (retcode) ++ AP6210_DEBUG("%s: failed to enabe ARP offload to %d, retcode = %d\n", ++ __FUNCTION__, arp_enable, retcode); ++ else ++ AP6210_DEBUG("%s: successfully enabed ARP offload to %d\n", ++ __FUNCTION__, arp_enable); ++ if (arp_enable) { ++ uint32 version; ++ bcm_mkiovar("arp_version", 0, 0, iovbuf, sizeof(iovbuf)); ++ retcode = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iovbuf, sizeof(iovbuf), FALSE, 0); ++ if (retcode) { ++ AP6210_DEBUG("%s: fail to get version (maybe version 1:retcode = %d\n", ++ __FUNCTION__, retcode); ++ dhd->arp_version = 1; ++ } ++ else { ++ memcpy(&version, iovbuf, sizeof(version)); ++ AP6210_DEBUG("%s: ARP Version= %x\n", __FUNCTION__, version); ++ dhd->arp_version = version; ++ } ++ } ++} ++ ++void ++dhd_aoe_arp_clr(dhd_pub_t *dhd, int idx) ++{ ++ int ret = 0; ++ int iov_len = 0; ++ char iovbuf[128]; ++ ++ if (dhd == NULL) return; ++ if (dhd->arp_version == 1) ++ idx = 0; ++ ++ iov_len = bcm_mkiovar("arp_table_clear", 0, 0, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx) < 0)) ++ AP6210_ERR("%s failed code %d\n", __FUNCTION__, ret); ++} ++ ++void ++dhd_aoe_hostip_clr(dhd_pub_t *dhd, int idx) ++{ ++ int ret = 0; ++ int iov_len = 0; ++ char iovbuf[128]; ++ ++ if (dhd == NULL) return; ++ if (dhd->arp_version == 1) ++ idx = 0; ++ ++ iov_len = bcm_mkiovar("arp_hostip_clear", 0, 0, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx)) < 0) ++ AP6210_ERR("%s failed code %d\n", __FUNCTION__, ret); ++} ++ ++void ++dhd_arp_offload_add_ip(dhd_pub_t *dhd, uint32 ipaddr, int idx) ++{ ++ int iov_len = 0; ++ char iovbuf[32]; ++ int retcode; ++ ++ ++ if (dhd == NULL) return; ++ if (dhd->arp_version == 1) ++ idx = 0; ++ iov_len = bcm_mkiovar("arp_hostip", (char *)&ipaddr, ++ sizeof(ipaddr), iovbuf, sizeof(iovbuf)); ++ retcode = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, iov_len, TRUE, idx); ++ ++ if (retcode) ++ AP6210_DEBUG("%s: ARP ip addr add failed, retcode = %d\n", ++ __FUNCTION__, retcode); ++ else ++ AP6210_DEBUG("%s: sARP H ipaddr entry added \n", ++ __FUNCTION__); ++} ++ ++int ++dhd_arp_get_arp_hostip_table(dhd_pub_t *dhd, void *buf, int buflen, int idx) ++{ ++ int retcode, i; ++ int iov_len; ++ uint32 *ptr32 = buf; ++ bool clr_bottom = FALSE; ++ ++ if (!buf) ++ return -1; ++ if (dhd == NULL) return -1; ++ if (dhd->arp_version == 1) ++ idx = 0; ++ ++ iov_len = bcm_mkiovar("arp_hostip", 0, 0, buf, buflen); ++ BCM_REFERENCE(iov_len); ++ retcode = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, buflen, FALSE, idx); ++ ++ if (retcode) { ++ AP6210_DEBUG("%s: ioctl WLC_GET_VAR error %d\n", ++ __FUNCTION__, retcode); ++ ++ return -1; ++ } ++ ++ /* clean up the buf, ascii reminder */ ++ for (i = 0; i < MAX_IPV4_ENTRIES; i++) { ++ if (!clr_bottom) { ++ if (*ptr32 == 0) ++ clr_bottom = TRUE; ++ } else { ++ *ptr32 = 0; ++ } ++ ptr32++; ++ } ++ ++ return 0; ++} ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++/* send up locally generated event */ ++void ++dhd_sendup_event_common(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data) ++{ ++ switch (ntoh32(event->event_type)) { ++#ifdef WLBTAMP ++ case WLC_E_BTA_HCI_EVENT: ++ break; ++#endif /* WLBTAMP */ ++ default: ++ break; ++ } ++ ++ /* Call per-port handler. */ ++ dhd_sendup_event(dhdp, event, data); ++} ++ ++ ++/* ++ * returns = TRUE if associated, FALSE if not associated ++ */ ++bool dhd_is_associated(dhd_pub_t *dhd, void *bss_buf, int *retval) ++{ ++ char bssid[6], zbuf[6]; ++ int ret = -1; ++ ++ bzero(bssid, 6); ++ bzero(zbuf, 6); ++ ++ ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_BSSID, (char *)&bssid, ETHER_ADDR_LEN, FALSE, 0); ++ AP6210_DEBUG(" %s WLC_GET_BSSID ioctl res = %d\n", __FUNCTION__, ret); ++ ++ if (ret == BCME_NOTASSOCIATED) { ++ AP6210_DEBUG("%s: not associated! res:%d\n", __FUNCTION__, ret); ++ } ++ ++ if (retval) ++ *retval = ret; ++ ++ if (ret < 0) ++ return FALSE; ++ ++ if ((memcmp(bssid, zbuf, ETHER_ADDR_LEN) != 0)) { ++ /* STA is assocoated BSSID is non zero */ ++ ++ if (bss_buf) { ++ /* return bss if caller provided buf */ ++ memcpy(bss_buf, bssid, ETHER_ADDR_LEN); ++ } ++ return TRUE; ++ } else { ++ AP6210_DEBUG("%s: WLC_GET_BSSID ioctl returned zero bssid\n", __FUNCTION__); ++ return FALSE; ++ } ++} ++ ++ ++/* Function to estimate possible DTIM_SKIP value */ ++int ++dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd) ++{ ++ int bcn_li_dtim; ++ int ret = -1; ++ int dtim_assoc = 0; ++ ++ bcn_li_dtim = dhd->suspend_bcn_li_dtim; ++ ++ /* Check if associated */ ++ if (dhd_is_associated(dhd, NULL, NULL) == FALSE) { ++ AP6210_DEBUG("%s NOT assoc ret %d\n", __FUNCTION__, ret); ++ goto exit; ++ } ++ ++ /* if assoc grab ap's dtim value */ ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_DTIMPRD, ++ &dtim_assoc, sizeof(dtim_assoc), FALSE, 0)) < 0) { ++ AP6210_ERR("%s failed code %d\n", __FUNCTION__, ret); ++ goto exit; ++ } ++ ++ AP6210_ERR("%s bcn_li_dtim=%d DTIM=%d Listen=%d\n", ++ __FUNCTION__, bcn_li_dtim, dtim_assoc, LISTEN_INTERVAL); ++ ++ /* if not assocated just eixt */ ++ if (dtim_assoc == 0) { ++ goto exit; ++ } ++ ++ /* check if sta listen interval fits into AP dtim */ ++ if (dtim_assoc > LISTEN_INTERVAL) { ++ /* AP DTIM to big for our Listen Interval : no dtim skiping */ ++ bcn_li_dtim = 1; ++ AP6210_ERR("%s DTIM=%d > Listen=%d : too big ...\n", ++ __FUNCTION__, dtim_assoc, LISTEN_INTERVAL); ++ goto exit; ++ } ++ ++ if ((bcn_li_dtim * dtim_assoc) > LISTEN_INTERVAL) { ++ /* Round up dtim_skip to fit into STAs Listen Interval */ ++ bcn_li_dtim = (int)(LISTEN_INTERVAL / dtim_assoc); ++ AP6210_DEBUG("%s agjust dtim_skip as %d\n", __FUNCTION__, bcn_li_dtim); ++ } ++ ++exit: ++ return bcn_li_dtim; ++} ++ ++/* Check if the mode supports STA MODE */ ++bool dhd_support_sta_mode(dhd_pub_t *dhd) ++{ ++ ++#ifdef WL_CFG80211 ++ if (!(dhd->op_mode & DHD_FLAG_STA_MODE)) ++ return FALSE; ++ else ++#endif /* WL_CFG80211 */ ++ return TRUE; ++} ++ ++#if defined(PNO_SUPPORT) ++int ++dhd_pno_clean(dhd_pub_t *dhd) ++{ ++ char iovbuf[128]; ++ int pfn_enabled = 0; ++ int iov_len = 0; ++ int ret; ++ ++ /* Disable pfn */ ++ iov_len = bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) >= 0) { ++ /* clear pfn */ ++ iov_len = bcm_mkiovar("pfnclear", 0, 0, iovbuf, sizeof(iovbuf)); ++ if (iov_len) { ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, ++ iov_len, TRUE, 0)) < 0) { ++ AP6210_ERR("%s failed code %d\n", __FUNCTION__, ret); ++ } ++ } ++ else { ++ ret = -1; ++ AP6210_ERR("%s failed code %d\n", __FUNCTION__, iov_len); ++ } ++ } ++ else ++ AP6210_ERR("%s failed code %d\n", __FUNCTION__, ret); ++ ++ return ret; ++} ++ ++int ++dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled) ++{ ++ char iovbuf[128]; ++ int ret = -1; ++ ++ if ((!dhd) && ((pfn_enabled != 0) || (pfn_enabled != 1))) { ++ AP6210_ERR("%s error exit\n", __FUNCTION__); ++ return ret; ++ } ++ ++#ifndef WL_SCHED_SCAN ++ if (!dhd_support_sta_mode(dhd)) ++ return (ret); ++ ++ memset(iovbuf, 0, sizeof(iovbuf)); ++ ++ if ((pfn_enabled) && (dhd_is_associated(dhd, NULL, NULL) == TRUE)) { ++ AP6210_ERR("%s pno is NOT enable : called in assoc mode , ignore\n", __FUNCTION__); ++ return ret; ++ } ++#endif /* !WL_SCHED_SCAN */ ++ ++ /* Enable/disable PNO */ ++ if ((ret = bcm_mkiovar("pfn", (char *)&pfn_enabled, 4, iovbuf, sizeof(iovbuf))) > 0) { ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, ++ iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { ++ AP6210_ERR("%s failed for error=%d\n", __FUNCTION__, ret); ++ return ret; ++ } ++ else { ++ dhd->pno_enable = pfn_enabled; ++ AP6210_DEBUG("%s set pno as %s\n", ++ __FUNCTION__, dhd->pno_enable ? "Enable" : "Disable"); ++ } ++ } ++ else AP6210_ERR("%s failed err=%d\n", __FUNCTION__, ret); ++ ++ return ret; ++} ++ ++/* Function to execute combined scan */ ++int ++dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ushort scan_fr, ++ int pno_repeat, int pno_freq_expo_max) ++{ ++ int err = -1; ++ char iovbuf[128]; ++ int k, i; ++ wl_pfn_param_t pfn_param; ++ wl_pfn_t pfn_element; ++ uint len = 0; ++ ++ AP6210_DEBUG("%s nssid=%d nchan=%d\n", __FUNCTION__, nssid, scan_fr); ++ ++ if ((!dhd) || (!ssids_local)) { ++ AP6210_ERR("%s error exit(%s %s)\n", __FUNCTION__, ++ (!dhd)?"dhd is null":"", (!ssids_local)?"ssid is null":""); ++ err = -1; ++ return err; ++ } ++#ifndef WL_SCHED_SCAN ++ if (!dhd_support_sta_mode(dhd)) ++ return err; ++#endif /* !WL_SCHED_SCAN */ ++ ++ /* Check for broadcast ssid */ ++ for (k = 0; k < nssid; k++) { ++ if (!ssids_local[k].SSID_len) { ++ AP6210_ERR("%d: Broadcast SSID is ilegal for PNO setting\n", k); ++ return err; ++ } ++ } ++/* #define PNO_DUMP 1 */ ++#ifdef PNO_DUMP ++ { ++ int j; ++ for (j = 0; j < nssid; j++) { ++ AP6210_ERR("%d: scan for %s size =%d\n", j, ++ ssids_local[j].SSID, ssids_local[j].SSID_len); ++ } ++ } ++#endif /* PNO_DUMP */ ++ ++ /* clean up everything */ ++ if ((err = dhd_pno_clean(dhd)) < 0) { ++ AP6210_ERR("%s failed error=%d\n", __FUNCTION__, err); ++ return err; ++ } ++ memset(iovbuf, 0, sizeof(iovbuf)); ++ memset(&pfn_param, 0, sizeof(pfn_param)); ++ memset(&pfn_element, 0, sizeof(pfn_element)); ++ ++ /* set pfn parameters */ ++ pfn_param.version = htod32(PFN_VERSION); ++ pfn_param.flags = htod16((PFN_LIST_ORDER << SORT_CRITERIA_BIT)); ++ ++ /* check and set extra pno params */ ++ if ((pno_repeat != 0) || (pno_freq_expo_max != 0)) { ++ pfn_param.flags |= htod16(ENABLE << ENABLE_ADAPTSCAN_BIT); ++ pfn_param.repeat = (uchar) (pno_repeat); ++ pfn_param.exp = (uchar) (pno_freq_expo_max); ++ } ++ /* set up pno scan fr */ ++ if (scan_fr != 0) ++ pfn_param.scan_freq = htod32(scan_fr); ++ ++ if (pfn_param.scan_freq > PNO_SCAN_MAX_FW_SEC) { ++ AP6210_ERR("%s pno freq above %d sec\n", __FUNCTION__, PNO_SCAN_MAX_FW_SEC); ++ return err; ++ } ++ if (pfn_param.scan_freq < PNO_SCAN_MIN_FW_SEC) { ++ AP6210_ERR("%s pno freq less %d sec\n", __FUNCTION__, PNO_SCAN_MIN_FW_SEC); ++ return err; ++ } ++ ++ len = bcm_mkiovar("pfn_set", (char *)&pfn_param, sizeof(pfn_param), iovbuf, sizeof(iovbuf)); ++ if ((err = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, len, TRUE, 0)) < 0) { ++ AP6210_ERR("%s pfn_set failed for error=%d\n", ++ __FUNCTION__, err); ++ return err; ++ } ++ ++ /* set all pfn ssid */ ++ for (i = 0; i < nssid; i++) { ++ ++ pfn_element.infra = htod32(DOT11_BSSTYPE_INFRASTRUCTURE); ++ pfn_element.auth = (DOT11_OPEN_SYSTEM); ++ pfn_element.wpa_auth = htod32(WPA_AUTH_PFN_ANY); ++ pfn_element.wsec = htod32(0); ++ pfn_element.infra = htod32(1); ++ pfn_element.flags = htod32(ENABLE << WL_PFN_HIDDEN_BIT); ++ memcpy((char *)pfn_element.ssid.SSID, ssids_local[i].SSID, ssids_local[i].SSID_len); ++ pfn_element.ssid.SSID_len = ssids_local[i].SSID_len; ++ ++ if ((len = ++ bcm_mkiovar("pfn_add", (char *)&pfn_element, ++ sizeof(pfn_element), iovbuf, sizeof(iovbuf))) > 0) { ++ if ((err = ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, len, TRUE, 0)) < 0) { ++ AP6210_ERR("%s failed for i=%d error=%d\n", ++ __FUNCTION__, i, err); ++ return err; ++ } ++ else ++ AP6210_DEBUG("%s set OK with PNO time=%d repeat=%d max_adjust=%d\n", ++ __FUNCTION__, pfn_param.scan_freq, ++ pfn_param.repeat, pfn_param.exp); ++ } ++ else AP6210_ERR("%s failed err=%d\n", __FUNCTION__, err); ++ } ++ ++ /* Enable PNO */ ++ /* dhd_pno_enable(dhd, 1); */ ++ return err; ++} ++ ++int ++dhd_pno_get_status(dhd_pub_t *dhd) ++{ ++ int ret = -1; ++ ++ if (!dhd) ++ return ret; ++ else ++ return (dhd->pno_enable); ++} ++ ++#endif /* OEM_ANDROID && PNO_SUPPORT */ ++ ++#if defined(KEEP_ALIVE) ++int dhd_keep_alive_onoff(dhd_pub_t *dhd) ++{ ++ char buf[256]; ++ const char *str; ++ wl_mkeep_alive_pkt_t mkeep_alive_pkt; ++ wl_mkeep_alive_pkt_t *mkeep_alive_pktp; ++ int buf_len; ++ int str_len; ++ int res = -1; ++ ++ if (!dhd_support_sta_mode(dhd)) ++ return res; ++ ++ AP6210_DEBUG("%s execution\n", __FUNCTION__); ++ ++ str = "mkeep_alive"; ++ str_len = strlen(str); ++ strncpy(buf, str, str_len); ++ buf[ str_len ] = '\0'; ++ mkeep_alive_pktp = (wl_mkeep_alive_pkt_t *) (buf + str_len + 1); ++ mkeep_alive_pkt.period_msec = CUSTOM_KEEP_ALIVE_SETTING; ++ buf_len = str_len + 1; ++ mkeep_alive_pkt.version = htod16(WL_MKEEP_ALIVE_VERSION); ++ mkeep_alive_pkt.length = htod16(WL_MKEEP_ALIVE_FIXED_LEN); ++ /* Setup keep alive zero for null packet generation */ ++ mkeep_alive_pkt.keep_alive_id = 0; ++ mkeep_alive_pkt.len_bytes = 0; ++ buf_len += WL_MKEEP_ALIVE_FIXED_LEN; ++ bzero(mkeep_alive_pkt.data, sizeof(mkeep_alive_pkt.data)); ++ /* Keep-alive attributes are set in local variable (mkeep_alive_pkt), and ++ * then memcpy'ed into buffer (mkeep_alive_pktp) since there is no ++ * guarantee that the buffer is properly aligned. ++ */ ++ memcpy((char *)mkeep_alive_pktp, &mkeep_alive_pkt, WL_MKEEP_ALIVE_FIXED_LEN); ++ ++ res = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, buf_len, TRUE, 0); ++ ++ return res; ++} ++#endif /* defined(KEEP_ALIVE) */ ++/* Android ComboSCAN support */ ++ ++/* ++ * data parsing from ComboScan tlv list ++*/ ++int ++wl_iw_parse_data_tlv(char** list_str, void *dst, int dst_size, const char token, ++ int input_size, int *bytes_left) ++{ ++ char* str; ++ uint16 short_temp; ++ uint32 int_temp; ++ ++ if ((list_str == NULL) || (*list_str == NULL) ||(bytes_left == NULL) || (*bytes_left < 0)) { ++ AP6210_ERR("%s error paramters\n", __FUNCTION__); ++ return -1; ++ } ++ str = *list_str; ++ ++ /* Clean all dest bytes */ ++ memset(dst, 0, dst_size); ++ while (*bytes_left > 0) { ++ ++ if (str[0] != token) { ++ AP6210_DEBUG("%s NOT Type=%d get=%d left_parse=%d \n", ++ __FUNCTION__, token, str[0], *bytes_left); ++ return -1; ++ } ++ ++ *bytes_left -= 1; ++ str += 1; ++ ++ if (input_size == 1) { ++ memcpy(dst, str, input_size); ++ } ++ else if (input_size == 2) { ++ memcpy(dst, (char *)htod16(memcpy(&short_temp, str, input_size)), ++ input_size); ++ } ++ else if (input_size == 4) { ++ memcpy(dst, (char *)htod32(memcpy(&int_temp, str, input_size)), ++ input_size); ++ } ++ ++ *bytes_left -= input_size; ++ str += input_size; ++ *list_str = str; ++ return 1; ++ } ++ return 1; ++} ++ ++/* ++ * channel list parsing from cscan tlv list ++*/ ++int ++wl_iw_parse_channel_list_tlv(char** list_str, uint16* channel_list, ++ int channel_num, int *bytes_left) ++{ ++ char* str; ++ int idx = 0; ++ ++ if ((list_str == NULL) || (*list_str == NULL) ||(bytes_left == NULL) || (*bytes_left < 0)) { ++ AP6210_ERR("%s error paramters\n", __FUNCTION__); ++ return -1; ++ } ++ str = *list_str; ++ ++ while (*bytes_left > 0) { ++ ++ if (str[0] != CSCAN_TLV_TYPE_CHANNEL_IE) { ++ *list_str = str; ++ AP6210_DEBUG("End channel=%d left_parse=%d %d\n", idx, *bytes_left, str[0]); ++ return idx; ++ } ++ /* Get proper CSCAN_TLV_TYPE_CHANNEL_IE */ ++ *bytes_left -= 1; ++ str += 1; ++ ++ if (str[0] == 0) { ++ /* All channels */ ++ channel_list[idx] = 0x0; ++ } ++ else { ++ channel_list[idx] = (uint16)str[0]; ++ AP6210_DEBUG("%s channel=%d \n", __FUNCTION__, channel_list[idx]); ++ } ++ *bytes_left -= 1; ++ str += 1; ++ ++ if (idx++ > 255) { ++ AP6210_ERR("%s Too many channels \n", __FUNCTION__); ++ return -1; ++ } ++ } ++ ++ *list_str = str; ++ return idx; ++} ++ ++/* ++ * SSIDs list parsing from cscan tlv list ++ */ ++int ++wl_iw_parse_ssid_list_tlv(char** list_str, wlc_ssid_t* ssid, int max, int *bytes_left) ++{ ++ char* str; ++ int idx = 0; ++ ++ if ((list_str == NULL) || (*list_str == NULL) || (*bytes_left < 0)) { ++ AP6210_ERR("%s error paramters\n", __FUNCTION__); ++ return -1; ++ } ++ str = *list_str; ++ while (*bytes_left > 0) { ++ ++ if (str[0] != CSCAN_TLV_TYPE_SSID_IE) { ++ *list_str = str; ++ AP6210_DEBUG("nssid=%d left_parse=%d %d\n", idx, *bytes_left, str[0]); ++ return idx; ++ } ++ ++ /* Get proper CSCAN_TLV_TYPE_SSID_IE */ ++ *bytes_left -= 1; ++ str += 1; ++ ++ if (str[0] == 0) { ++ /* Broadcast SSID */ ++ ssid[idx].SSID_len = 0; ++ memset((char*)ssid[idx].SSID, 0x0, DOT11_MAX_SSID_LEN); ++ *bytes_left -= 1; ++ str += 1; ++ ++ AP6210_DEBUG("BROADCAST SCAN left=%d\n", *bytes_left); ++ } ++ else if (str[0] <= DOT11_MAX_SSID_LEN) { ++ /* Get proper SSID size */ ++ ssid[idx].SSID_len = str[0]; ++ *bytes_left -= 1; ++ str += 1; ++ ++ /* Get SSID */ ++ if (ssid[idx].SSID_len > *bytes_left) { ++ AP6210_ERR("%s out of memory range len=%d but left=%d\n", ++ __FUNCTION__, ssid[idx].SSID_len, *bytes_left); ++ return -1; ++ } ++ ++ memcpy((char*)ssid[idx].SSID, str, ssid[idx].SSID_len); ++ ++ *bytes_left -= ssid[idx].SSID_len; ++ str += ssid[idx].SSID_len; ++ ++ AP6210_DEBUG("%s :size=%d left=%d\n", ++ (char*)ssid[idx].SSID, ssid[idx].SSID_len, *bytes_left); ++ } ++ else { ++ AP6210_ERR("### SSID size more that %d\n", str[0]); ++ return -1; ++ } ++ ++ if (idx++ > max) { ++ AP6210_ERR("%s number of SSIDs more that %d\n", __FUNCTION__, idx); ++ return -1; ++ } ++ } ++ ++ *list_str = str; ++ return idx; ++} ++ ++/* Parse a comma-separated list from list_str into ssid array, starting ++ * at index idx. Max specifies size of the ssid array. Parses ssids ++ * and returns updated idx; if idx >= max not all fit, the excess have ++ * not been copied. Returns -1 on empty string, or on ssid too long. ++ */ ++int ++wl_iw_parse_ssid_list(char** list_str, wlc_ssid_t* ssid, int idx, int max) ++{ ++ char* str, *ptr; ++ ++ if ((list_str == NULL) || (*list_str == NULL)) ++ return -1; ++ ++ for (str = *list_str; str != NULL; str = ptr) { ++ ++ /* check for next TAG */ ++ if (!strncmp(str, GET_CHANNEL, strlen(GET_CHANNEL))) { ++ *list_str = str + strlen(GET_CHANNEL); ++ return idx; ++ } ++ ++ if ((ptr = strchr(str, ',')) != NULL) { ++ *ptr++ = '\0'; ++ } ++ ++ if (strlen(str) > DOT11_MAX_SSID_LEN) { ++ AP6210_ERR("ssid <%s> exceeds %d\n", str, DOT11_MAX_SSID_LEN); ++ return -1; ++ } ++ ++ if (strlen(str) == 0) ++ ssid[idx].SSID_len = 0; ++ ++ if (idx < max) { ++ bzero(ssid[idx].SSID, sizeof(ssid[idx].SSID)); ++ strncpy((char*)ssid[idx].SSID, str, sizeof(ssid[idx].SSID) - 1); ++ ssid[idx].SSID_len = strlen(str); ++ } ++ idx++; ++ } ++ return idx; ++} ++ ++/* ++ * Parse channel list from iwpriv CSCAN ++ */ ++int ++wl_iw_parse_channel_list(char** list_str, uint16* channel_list, int channel_num) ++{ ++ int num; ++ int val; ++ char* str; ++ char* endptr = NULL; ++ ++ if ((list_str == NULL)||(*list_str == NULL)) ++ return -1; ++ ++ str = *list_str; ++ num = 0; ++ while (strncmp(str, GET_NPROBE, strlen(GET_NPROBE))) { ++ val = (int)strtoul(str, &endptr, 0); ++ if (endptr == str) { ++ AP6210_ERR("could not parse channel number starting at" ++ " substring \"%s\" in list:\n%s\n", ++ str, *list_str); ++ return -1; ++ } ++ str = endptr + strspn(endptr, " ,"); ++ ++ if (num == channel_num) { ++ AP6210_ERR("too many channels (more than %d) in channel list:\n%s\n", ++ channel_num, *list_str); ++ return -1; ++ } ++ ++ channel_list[num++] = (uint16)val; ++ } ++ *list_str = str; ++ return num; ++} +diff --git a/drivers/net/wireless/ap6210/dhd_custom_gpio.c b/drivers/net/wireless/ap6210/dhd_custom_gpio.c +new file mode 100644 +index 0000000..afdb9b3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_custom_gpio.c +@@ -0,0 +1,313 @@ ++/* ++* Customer code to add GPIO control during WLAN start/stop ++* Copyright (C) 1999-2012, Broadcom Corporation ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2 (the "GPL"), ++* available at http://www.broadcom.com/licenses/GPLv2.php, with the ++* following added to such license: ++* ++* As a special exception, the copyright holders of this software give you ++* permission to link this software with independent modules, and to copy and ++* distribute the resulting executable under terms of your choice, provided that ++* you also meet, for each linked independent module, the terms and conditions of ++* the license of that module. An independent module is a module which is not ++* derived from this software. The special exception does not apply to any ++* modifications of the software. ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a license ++* other than the GPL, without Broadcom's express prior written consent. ++* ++* $Id: dhd_custom_gpio.c 353167 2012-08-24 22:11:30Z $ ++*/ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++extern void sunximmc_rescan_card(unsigned id, unsigned insert); ++ ++#ifdef CUSTOMER_HW ++#include ++#if defined(CUSTOMER_OOB) ++extern int bcm_wlan_get_oob_irq(void); ++#endif ++extern void bcm_wlan_power_off(int); ++extern void bcm_wlan_power_on(int); ++#endif /* CUSTOMER_HW */ ++#if defined(CUSTOMER_HW2) ++#ifdef CONFIG_WIFI_CONTROL_FUNC ++int wifi_set_power(int on, unsigned long msec); ++int wifi_get_irq_number(unsigned long *irq_flags_ptr); ++int wifi_get_mac_addr(unsigned char *buf); ++void *wifi_get_country_code(char *ccode); ++#else ++int wifi_set_power(int on, unsigned long msec) { return -1; } ++int wifi_get_irq_number(unsigned long *irq_flags_ptr) { return -1; } ++int wifi_get_mac_addr(unsigned char *buf) { return -1; } ++void *wifi_get_country_code(char *ccode) { return NULL; } ++#endif /* CONFIG_WIFI_CONTROL_FUNC */ ++#endif ++ ++#if defined(OOB_INTR_ONLY) ++ ++#if defined(BCMLXSDMMC) ++extern int sdioh_mmc_irq(int irq); ++#endif /* (BCMLXSDMMC) */ ++ ++#ifdef CUSTOMER_HW3 ++#include ++#endif ++ ++/* Customer specific Host GPIO defintion */ ++static int dhd_oob_gpio_num = 2; ++ ++module_param(dhd_oob_gpio_num, int, 0644); ++MODULE_PARM_DESC(dhd_oob_gpio_num, "DHD oob gpio number"); ++ ++/* This function will return: ++ * 1) return : Host gpio interrupt number per customer platform ++ * 2) irq_flags_ptr : Type of Host interrupt as Level or Edge ++ * ++ * NOTE : ++ * Customer should check his platform definitions ++ * and his Host Interrupt spec ++ * to figure out the proper setting for his platform. ++ * Broadcom provides just reference settings as example. ++ * ++ */ ++int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr) ++{ ++ int host_oob_irq = -1; ++ ++#if defined(CUSTOMER_HW2) ++ host_oob_irq = wifi_get_irq_number(irq_flags_ptr); ++ ++#elif defined(CUSTOMER_OOB) ++ host_oob_irq = bcm_wlan_get_oob_irq(); ++ AP6210_DEBUG("irq=%d, flags=0x%08lx\n", host_oob_irq, *irq_flags_ptr); ++#else ++#if defined(CUSTOM_OOB_GPIO_NUM) ++ if (dhd_oob_gpio_num < 0) { ++ dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM; ++ } ++#endif /* CUSTOMER_OOB_GPIO_NUM */ ++ ++ if (dhd_oob_gpio_num < 0) { ++ AP6210_ERR("%s: ERROR customer specific Host GPIO is NOT defined \n", ++ __FUNCTION__); ++ return (dhd_oob_gpio_num); ++ } ++ ++ AP6210_ERR("%s: customer specific Host GPIO number is (%d)\n", ++ __FUNCTION__, dhd_oob_gpio_num); ++ ++#if defined CUSTOMER_HW ++ AP6210_ERR("%s: should not be here!\n", __FUNCTION__); ++#elif defined CUSTOMER_HW3 ++ gpio_request(dhd_oob_gpio_num, "oob irq"); ++ host_oob_irq = gpio_to_irq(dhd_oob_gpio_num); ++ gpio_direction_input(dhd_oob_gpio_num); ++#endif /* CUSTOMER_HW */ ++#endif ++ ++ return (host_oob_irq); ++} ++#endif ++ ++/* Customer function to control hw specific wlan gpios */ ++void ++dhd_customer_gpio_wlan_ctrl(int onoff) ++{ ++ static int sdc_id = 3; ++ ++ switch (onoff) { ++ case WLAN_RESET_OFF: ++ AP6210_DEBUG("%s: call customer specific GPIO to insert WLAN RESET\n", ++ __FUNCTION__); ++#ifdef CUSTOMER_HW ++ ap6210_gpio_wifi_power(0); ++#endif /* CUSTOMER_HW */ ++#if defined(CUSTOMER_HW2) ++ wifi_set_power(0, 0); ++#endif ++ mdelay(100); ++ AP6210_ERR("WLAN placed in RESET\n"); ++ break; ++ ++ case WLAN_RESET_ON: ++ AP6210_DEBUG("%s: callc customer specific GPIO to remove WLAN RESET\n", ++ __FUNCTION__); ++#ifdef CUSTOMER_HW ++ ap6210_gpio_wifi_power(1); ++#endif /* CUSTOMER_HW */ ++#if defined(CUSTOMER_HW2) ++ wifi_set_power(1, 0); ++#endif ++ mdelay(100); ++ AP6210_ERR("WLAN going back to live\n"); ++ break; ++ ++ case WLAN_POWER_OFF: ++ AP6210_DEBUG("%s: call customer specific GPIO to turn off WL_REG_ON\n", ++ __FUNCTION__); ++#ifdef CUSTOMER_HW ++ ap6210_gpio_wifi_power(0); ++ sunximmc_rescan_card(sdc_id, 0); ++#endif /* CUSTOMER_HW */ ++ AP6210_ERR("WLAN placed in POWER OFF\n"); ++ break; ++ ++ case WLAN_POWER_ON: ++ AP6210_DEBUG("%s: call customer specific GPIO to turn on WL_REG_ON\n", ++ __FUNCTION__); ++#ifdef CUSTOMER_HW ++ ap6210_gpio_wifi_power(1); ++ sunximmc_rescan_card(sdc_id, 1); ++ /* Lets customer power to get stable */ ++#endif /* CUSTOMER_HW */ ++ mdelay(100); ++ AP6210_ERR("WLAN placed in POWER ON\n"); ++ break; ++ } ++} ++ ++#ifdef GET_CUSTOM_MAC_ENABLE ++/* Function to get custom MAC address */ ++int ++dhd_custom_get_mac_address(unsigned char *buf) ++{ ++ int ret = 0; ++ ++ AP6210_DEBUG("%s Enter\n", __FUNCTION__); ++ if (!buf) ++ return -EINVAL; ++ ++ /* Customer access to MAC address stored outside of DHD driver */ ++#if defined(CUSTOMER_HW2) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) ++ ret = wifi_get_mac_addr(buf); ++#endif ++ ++#ifdef EXAMPLE_GET_MAC ++ /* EXAMPLE code */ ++ { ++ struct ether_addr ea_example = {{0x00, 0x11, 0x22, 0x33, 0x44, 0xFF}}; ++ bcopy((char *)&ea_example, buf, sizeof(struct ether_addr)); ++ } ++#endif /* EXAMPLE_GET_MAC */ ++ ++ return ret; ++} ++#endif /* GET_CUSTOM_MAC_ENABLE */ ++ ++/* Customized Locale table : OPTIONAL feature */ ++const struct cntry_locales_custom translate_custom_table[] = { ++/* Table should be filled out based on custom platform regulatory requirement */ ++#ifdef EXAMPLE_TABLE ++ {"", "XY", 4}, /* Universal if Country code is unknown or empty */ ++ {"US", "US", 69}, /* input ISO "US" to : US regrev 69 */ ++ {"CA", "US", 69}, /* input ISO "CA" to : US regrev 69 */ ++ {"EU", "EU", 5}, /* European union countries to : EU regrev 05 */ ++ {"AT", "EU", 5}, ++ {"BE", "EU", 5}, ++ {"BG", "EU", 5}, ++ {"CY", "EU", 5}, ++ {"CZ", "EU", 5}, ++ {"DK", "EU", 5}, ++ {"EE", "EU", 5}, ++ {"FI", "EU", 5}, ++ {"FR", "EU", 5}, ++ {"DE", "EU", 5}, ++ {"GR", "EU", 5}, ++ {"HU", "EU", 5}, ++ {"IE", "EU", 5}, ++ {"IT", "EU", 5}, ++ {"LV", "EU", 5}, ++ {"LI", "EU", 5}, ++ {"LT", "EU", 5}, ++ {"LU", "EU", 5}, ++ {"MT", "EU", 5}, ++ {"NL", "EU", 5}, ++ {"PL", "EU", 5}, ++ {"PT", "EU", 5}, ++ {"RO", "EU", 5}, ++ {"SK", "EU", 5}, ++ {"SI", "EU", 5}, ++ {"ES", "EU", 5}, ++ {"SE", "EU", 5}, ++ {"GB", "EU", 5}, ++ {"KR", "XY", 3}, ++ {"AU", "XY", 3}, ++ {"CN", "XY", 3}, /* input ISO "CN" to : XY regrev 03 */ ++ {"TW", "XY", 3}, ++ {"AR", "XY", 3}, ++ {"MX", "XY", 3}, ++ {"IL", "IL", 0}, ++ {"CH", "CH", 0}, ++ {"TR", "TR", 0}, ++ {"NO", "NO", 0}, ++#endif /* EXMAPLE_TABLE */ ++}; ++ ++ ++/* Customized Locale convertor ++* input : ISO 3166-1 country abbreviation ++* output: customized cspec ++*/ ++void get_customized_country_code(char *country_iso_code, wl_country_t *cspec) ++{ ++#if defined(CUSTOMER_HW2) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) ++ ++ struct cntry_locales_custom *cloc_ptr; ++ ++ if (!cspec) ++ return; ++ ++ cloc_ptr = wifi_get_country_code(country_iso_code); ++ if (cloc_ptr) { ++ strlcpy(cspec->ccode, cloc_ptr->custom_locale, WLC_CNTRY_BUF_SZ); ++ cspec->rev = cloc_ptr->custom_locale_rev; ++ } ++ return; ++#else ++ int size, i; ++ ++ size = ARRAYSIZE(translate_custom_table); ++ ++ if (cspec == 0) ++ return; ++ ++ if (size == 0) ++ return; ++ ++ for (i = 0; i < size; i++) { ++ if (strcmp(country_iso_code, translate_custom_table[i].iso_abbrev) == 0) { ++ memcpy(cspec->ccode, ++ translate_custom_table[i].custom_locale, WLC_CNTRY_BUF_SZ); ++ cspec->rev = translate_custom_table[i].custom_locale_rev; ++ return; ++ } ++ } ++#ifdef EXAMPLE_TABLE ++ /* if no country code matched return first universal code from translate_custom_table */ ++ memcpy(cspec->ccode, translate_custom_table[0].custom_locale, WLC_CNTRY_BUF_SZ); ++ cspec->rev = translate_custom_table[0].custom_locale_rev; ++#endif /* EXMAPLE_TABLE */ ++ return; ++#endif /* defined(CUSTOMER_HW2) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)) */ ++} +diff --git a/drivers/net/wireless/ap6210/dhd_dbg.h b/drivers/net/wireless/ap6210/dhd_dbg.h +new file mode 100644 +index 0000000..67cd2e5 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_dbg.h +@@ -0,0 +1,79 @@ ++/* ++ * Debug/trace/assert driver definitions for Dongle Host Driver. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_dbg.h 353490 2012-08-27 21:10:02Z $ ++ */ ++ ++#ifndef _dhd_dbg_ ++#define _dhd_dbg_ ++ ++#define USE_NET_RATELIMIT net_ratelimit() ++ ++#if defined(DHD_DEBUG) ++ ++#define DHD_ERROR_ON() (dhd_msg_level & DHD_ERROR_VAL) ++#define DHD_TRACE_ON() (dhd_msg_level & DHD_TRACE_VAL) ++#define DHD_INFO_ON() (dhd_msg_level & DHD_INFO_VAL) ++#define DHD_DATA_ON() (dhd_msg_level & DHD_DATA_VAL) ++#define DHD_CTL_ON() (dhd_msg_level & DHD_CTL_VAL) ++#define DHD_TIMER_ON() (dhd_msg_level & DHD_TIMER_VAL) ++#define DHD_HDRS_ON() (dhd_msg_level & DHD_HDRS_VAL) ++#define DHD_BYTES_ON() (dhd_msg_level & DHD_BYTES_VAL) ++#define DHD_INTR_ON() (dhd_msg_level & DHD_INTR_VAL) ++#define DHD_GLOM_ON() (dhd_msg_level & DHD_GLOM_VAL) ++#define DHD_EVENT_ON() (dhd_msg_level & DHD_EVENT_VAL) ++#define DHD_BTA_ON() (dhd_msg_level & DHD_BTA_VAL) ++#define DHD_ISCAN_ON() (dhd_msg_level & DHD_ISCAN_VAL) ++#define DHD_ARPOE_ON() (dhd_msg_level & DHD_ARPOE_VAL) ++#define DHD_REORDER_ON() (dhd_msg_level & DHD_REORDER_VAL) ++ ++#else /* defined(BCMDBG) || defined(DHD_DEBUG) */ ++ ++#define DHD_ERROR_ON() 0 ++#define DHD_TRACE_ON() 0 ++#define DHD_INFO_ON() 0 ++#define DHD_DATA_ON() 0 ++#define DHD_CTL_ON() 0 ++#define DHD_TIMER_ON() 0 ++#define DHD_HDRS_ON() 0 ++#define DHD_BYTES_ON() 0 ++#define DHD_INTR_ON() 0 ++#define DHD_GLOM_ON() 0 ++#define DHD_EVENT_ON() 0 ++#define DHD_BTA_ON() 0 ++#define DHD_ISCAN_ON() 0 ++#define DHD_ARPOE_ON() 0 ++#define DHD_REORDER_ON() 0 ++#endif ++ ++#define DHD_LOG(args) ++ ++#define DHD_BLOG(cp, size) ++ ++#define DHD_NONE(args) ++extern int dhd_msg_level; ++ ++/* Defines msg bits */ ++#include ++ ++#endif /* _dhd_dbg_ */ +diff --git a/drivers/net/wireless/ap6210/dhd_gpio.c b/drivers/net/wireless/ap6210/dhd_gpio.c +new file mode 100644 +index 0000000..dae0dd3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_gpio.c +@@ -0,0 +1,47 @@ ++/* ++* Customer code to add GPIO control during WLAN start/stop ++* Copyright (C) 1999-2011, Broadcom Corporation ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2 (the "GPL"), ++* available at http://www.broadcom.com/licenses/GPLv2.php, with the ++* following added to such license: ++* ++* As a special exception, the copyright holders of this software give you ++* permission to link this software with independent modules, and to copy and ++* distribute the resulting executable under terms of your choice, provided that ++* you also meet, for each linked independent module, the terms and conditions of ++* the license of that module. An independent module is a module which is not ++* derived from this software. The special exception does not apply to any ++* modifications of the software. ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a license ++* other than the GPL, without Broadcom's express prior written consent. ++* ++* $Id: dhd_custom_gpio.c,v 1.2.42.1 2010-10-19 00:41:09 Exp $ ++*/ ++ ++#include ++ ++#include ++#include ++ ++#ifdef CUSTOMER_HW ++ ++extern int __gpio_to_irq(unsigned gpio); ++extern int gpio_direction_input(unsigned gpio); ++extern int gpio_request(unsigned gpio, const char *label); ++extern void gpio_free(unsigned gpio); ++ ++#ifdef CUSTOMER_OOB ++extern int wl_host_wake_irqno; ++int bcm_wlan_get_oob_irq(void) ++{ ++ return wl_host_wake_irqno; ++} ++#endif ++ ++ ++#endif /* CUSTOMER_HW */ +diff --git a/drivers/net/wireless/ap6210/dhd_ip.c b/drivers/net/wireless/ap6210/dhd_ip.c +new file mode 100644 +index 0000000..05abc93 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_ip.c +@@ -0,0 +1,111 @@ ++/* ++ * IP Packet Parser Module. ++ * ++ * Copyright (C) 1999-2013, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id$ ++ */ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++/* special values */ ++/* 802.3 llc/snap header */ ++static const uint8 llc_snap_hdr[SNAP_HDR_LEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; ++ ++pkt_frag_t pkt_frag_info(osl_t *osh, void *p) ++{ ++ uint8 *frame; ++ int length; ++ uint8 *pt; /* Pointer to type field */ ++ uint16 ethertype; ++ struct ipv4_hdr *iph; /* IP frame pointer */ ++ int ipl; /* IP frame length */ ++ uint16 iph_frag; ++ ++ ASSERT(osh && p); ++ ++ frame = PKTDATA(osh, p); ++ length = PKTLEN(osh, p); ++ ++ /* Process Ethernet II or SNAP-encapsulated 802.3 frames */ ++ if (length < ETHER_HDR_LEN) { ++ AP6210_DEBUG("%s: short eth frame (%d)\n", __FUNCTION__, length); ++ return DHD_PKT_FRAG_NONE; ++ } else if (ntoh16(*(uint16 *)(frame + ETHER_TYPE_OFFSET)) >= ETHER_TYPE_MIN) { ++ /* Frame is Ethernet II */ ++ pt = frame + ETHER_TYPE_OFFSET; ++ } else if (length >= ETHER_HDR_LEN + SNAP_HDR_LEN + ETHER_TYPE_LEN && ++ !bcmp(llc_snap_hdr, frame + ETHER_HDR_LEN, SNAP_HDR_LEN)) { ++ pt = frame + ETHER_HDR_LEN + SNAP_HDR_LEN; ++ } else { ++ AP6210_DEBUG("%s: non-SNAP 802.3 frame\n", __FUNCTION__); ++ return DHD_PKT_FRAG_NONE; ++ } ++ ++ ethertype = ntoh16(*(uint16 *)pt); ++ ++ /* Skip VLAN tag, if any */ ++ if (ethertype == ETHER_TYPE_8021Q) { ++ pt += VLAN_TAG_LEN; ++ ++ if (pt + ETHER_TYPE_LEN > frame + length) { ++ AP6210_DEBUG("%s: short VLAN frame (%d)\n", __FUNCTION__, length); ++ return DHD_PKT_FRAG_NONE; ++ } ++ ++ ethertype = ntoh16(*(uint16 *)pt); ++ } ++ ++ if (ethertype != ETHER_TYPE_IP) { ++ AP6210_DEBUG("%s: non-IP frame (ethertype 0x%x, length %d)\n", ++ __FUNCTION__, ethertype, length); ++ return DHD_PKT_FRAG_NONE; ++ } ++ ++ iph = (struct ipv4_hdr *)(pt + ETHER_TYPE_LEN); ++ ipl = length - (pt + ETHER_TYPE_LEN - frame); ++ ++ /* We support IPv4 only */ ++ if ((ipl < IPV4_OPTIONS_OFFSET) || (IP_VER(iph) != IP_VER_4)) { ++ AP6210_DEBUG("%s: short frame (%d) or non-IPv4\n", __FUNCTION__, ipl); ++ return DHD_PKT_FRAG_NONE; ++ } ++ ++ iph_frag = ntoh16(iph->frag); ++ ++ if (iph_frag & IPV4_FRAG_DONT) { ++ return DHD_PKT_FRAG_NONE; ++ } else if ((iph_frag & IPV4_FRAG_MORE) == 0) { ++ return DHD_PKT_FRAG_LAST; ++ } else { ++ return (iph_frag & IPV4_FRAG_OFFSET_MASK)? DHD_PKT_FRAG_CONT : DHD_PKT_FRAG_FIRST; ++ } ++} +diff --git a/drivers/net/wireless/ap6210/dhd_ip.h b/drivers/net/wireless/ap6210/dhd_ip.h +new file mode 100644 +index 0000000..ceb3877 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_ip.h +@@ -0,0 +1,42 @@ ++/* ++ * Header file describing the common ip parser function. ++ * ++ * Provides type definitions and function prototypes used to parse ip packet. ++ * ++ * Copyright (C) 1999-2013, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id$ ++ */ ++ ++#ifndef _dhd_ip_h_ ++#define _dhd_ip_h_ ++ ++typedef enum pkt_frag ++{ ++ DHD_PKT_FRAG_NONE = 0, ++ DHD_PKT_FRAG_FIRST, ++ DHD_PKT_FRAG_CONT, ++ DHD_PKT_FRAG_LAST ++} pkt_frag_t; ++ ++extern pkt_frag_t pkt_frag_info(osl_t *osh, void *p); ++ ++#endif /* _dhd_ip_h_ */ +diff --git a/drivers/net/wireless/ap6210/dhd_linux.c b/drivers/net/wireless/ap6210/dhd_linux.c +new file mode 100644 +index 0000000..82a0a58 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_linux.c +@@ -0,0 +1,6151 @@ ++/* ++ * Broadcom Dongle Host Driver (DHD), Linux-specific network interface ++ * Basically selected code segments from usb-cdc.c and usb-rndis.c ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_linux.c 374275 2012-12-12 11:44:18Z $ ++ */ ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef CONFIG_HAS_WAKELOCK ++#include ++#endif ++#ifdef WL_CFG80211 ++#include ++#endif ++ ++#ifdef WLBTAMP ++#include ++#include ++#include ++#endif ++ ++#include ++#include ++ ++#ifdef WLMEDIA_HTSF ++#include ++#include ++ ++#define HTSF_MINLEN 200 /* min. packet length to timestamp */ ++#define HTSF_BUS_DELAY 150 /* assume a fix propagation in us */ ++#define TSMAX 1000 /* max no. of timing record kept */ ++#define NUMBIN 34 ++static uint32 tsidx = 0; ++static uint32 htsf_seqnum = 0; ++uint32 tsfsync; ++struct timeval tsync; ++static uint32 tsport = 5010; ++ ++typedef struct histo_ { ++ uint32 bin[NUMBIN]; ++} histo_t; ++ ++#if !ISPOWEROF2(DHD_SDALIGN) ++#error DHD_SDALIGN is not a power of 2! ++#endif ++ ++static histo_t vi_d1, vi_d2, vi_d3, vi_d4; ++#endif /* WLMEDIA_HTSF */ ++ ++#if defined(PKT_FILTER_SUPPORT) ++#endif /* PKT_FILTER_SUPPORT */ ++ ++#if defined(SOFTAP) ++extern bool ap_cfg_running; ++extern bool ap_fw_loaded; ++#endif ++ ++/* enable HOSTIP cache update from the host side when an eth0:N is up */ ++#define AOE_IP_ALIAS_SUPPORT 1 ++ ++#ifdef BCM_FD_AGGR ++#include ++#include ++#endif ++#ifdef PROP_TXSTATUS ++#include ++#include ++#endif ++ ++#include ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++void aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add, int idx); ++static int dhd_device_event(struct notifier_block *this, ++ unsigned long event, ++ void *ptr); ++ ++static struct notifier_block dhd_notifier = { ++ .notifier_call = dhd_device_event ++}; ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) ++#include ++volatile bool dhd_mmc_suspend = FALSE; ++DECLARE_WAIT_QUEUE_HEAD(dhd_dpc_wait); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ ++ ++#if defined(OOB_INTR_ONLY) ++extern void dhd_enable_oob_intr(struct dhd_bus *bus, bool enable); ++#endif ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) ++static void dhd_hang_process(struct work_struct *work); ++#endif ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++MODULE_LICENSE("GPL v2"); ++#endif /* LinuxVer */ ++ ++#include ++ ++#ifdef BCM_FD_AGGR ++#define DBUS_RX_BUFFER_SIZE_DHD(net) (BCM_RPC_TP_DNGL_AGG_MAX_BYTE) ++#else ++#ifndef PROP_TXSTATUS ++#define DBUS_RX_BUFFER_SIZE_DHD(net) (net->mtu + net->hard_header_len + dhd->pub.hdrlen) ++#else ++#define DBUS_RX_BUFFER_SIZE_DHD(net) (net->mtu + net->hard_header_len + dhd->pub.hdrlen + 128) ++#endif ++#endif /* BCM_FD_AGGR */ ++ ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 15) ++const char * ++print_tainted() ++{ ++ return ""; ++} ++#endif /* LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 15) */ ++ ++/* Linux wireless extension support */ ++#if defined(CONFIG_WIRELESS_EXT) ++#include ++extern wl_iw_extra_params_t g_wl_iw_params; ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ++#include ++#endif /* defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) */ ++ ++extern int dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd); ++ ++#ifdef PKT_FILTER_SUPPORT ++extern void dhd_pktfilter_offload_set(dhd_pub_t * dhd, char *arg); ++extern void dhd_pktfilter_offload_enable(dhd_pub_t * dhd, char *arg, int enable, int master_mode); ++#endif ++ ++#ifdef READ_MACADDR ++extern int dhd_read_macaddr(struct dhd_info *dhd, struct ether_addr *mac); ++#endif ++#ifdef RDWR_MACADDR ++extern int dhd_check_rdwr_macaddr(struct dhd_info *dhd, dhd_pub_t *dhdp, struct ether_addr *mac); ++extern int dhd_write_rdwr_macaddr(struct ether_addr *mac); ++#endif ++#ifdef WRITE_MACADDR ++extern int dhd_write_macaddr(struct ether_addr *mac); ++#endif ++#ifdef GET_MAC_FROM_OTP ++extern int dhd_check_module_mac(dhd_pub_t *dhd, struct ether_addr *mac); ++#endif ++#ifdef MIMO_ANT_SETTING ++extern int dhd_sel_ant_from_file(dhd_pub_t *dhd); ++#endif ++ ++#ifdef GLOBALCONFIG_WLAN_COUNTRY_CODE ++int dhd_customer_set_country(dhd_pub_t *dhd); ++#endif ++ ++/* Interface control information */ ++typedef struct dhd_if { ++ struct dhd_info *info; /* back pointer to dhd_info */ ++ /* OS/stack specifics */ ++ struct net_device *net; ++ struct net_device_stats stats; ++ int idx; /* iface idx in dongle */ ++ dhd_if_state_t state; /* interface state */ ++ uint subunit; /* subunit */ ++ uint8 mac_addr[ETHER_ADDR_LEN]; /* assigned MAC address */ ++ bool attached; /* Delayed attachment when unset */ ++ bool txflowcontrol; /* Per interface flow control indicator */ ++ char name[IFNAMSIZ+1]; /* linux interface name */ ++ uint8 bssidx; /* bsscfg index for the interface */ ++ bool set_multicast; ++ bool event2cfg80211; /* To determine if pass event to cfg80211 */ ++} dhd_if_t; ++ ++#ifdef WLMEDIA_HTSF ++typedef struct { ++ uint32 low; ++ uint32 high; ++} tsf_t; ++ ++typedef struct { ++ uint32 last_cycle; ++ uint32 last_sec; ++ uint32 last_tsf; ++ uint32 coef; /* scaling factor */ ++ uint32 coefdec1; /* first decimal */ ++ uint32 coefdec2; /* second decimal */ ++} htsf_t; ++ ++typedef struct { ++ uint32 t1; ++ uint32 t2; ++ uint32 t3; ++ uint32 t4; ++} tstamp_t; ++ ++static tstamp_t ts[TSMAX]; ++static tstamp_t maxdelayts; ++static uint32 maxdelay = 0, tspktcnt = 0, maxdelaypktno = 0; ++ ++#endif /* WLMEDIA_HTSF */ ++ ++/* Local private structure (extension of pub) */ ++typedef struct dhd_info { ++#if defined(CONFIG_WIRELESS_EXT) ++ wl_iw_t iw; /* wireless extensions state (must be first) */ ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++ dhd_pub_t pub; ++ ++ /* For supporting multiple interfaces */ ++ dhd_if_t *iflist[DHD_MAX_IFS]; ++ ++ struct semaphore proto_sem; ++#ifdef PROP_TXSTATUS ++ spinlock_t wlfc_spinlock; ++#endif /* PROP_TXSTATUS */ ++#ifdef WLMEDIA_HTSF ++ htsf_t htsf; ++#endif ++ wait_queue_head_t ioctl_resp_wait; ++ struct timer_list timer; ++ bool wd_timer_valid; ++ struct tasklet_struct tasklet; ++ spinlock_t sdlock; ++ spinlock_t txqlock; ++ spinlock_t dhd_lock; ++#ifdef DHDTHREAD ++ /* Thread based operation */ ++ bool threads_only; ++ struct semaphore sdsem; ++ ++ tsk_ctl_t thr_dpc_ctl; ++ tsk_ctl_t thr_wdt_ctl; ++#endif /* DHDTHREAD */ ++ bool dhd_tasklet_create; ++ tsk_ctl_t thr_sysioc_ctl; ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ struct work_struct work_hang; ++#endif ++ ++ /* Wakelocks */ ++#if defined(CONFIG_HAS_WAKELOCK) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ struct wake_lock *wl_wifi; /* Wifi wakelock */ ++ struct wake_lock *wl_rxwake; /* Wifi rx wakelock */ ++ struct wake_lock *wl_ctrlwake; /* Wifi ctrl wakelock */ ++ struct wake_lock *wl_wdwake; /* Wifi wd wakelock */ ++#endif ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ /* net_device interface lock, prevent race conditions among net_dev interface ++ * calls and wifi_on or wifi_off ++ */ ++ struct mutex dhd_net_if_mutex; ++ struct mutex dhd_suspend_mutex; ++#endif ++ spinlock_t wakelock_spinlock; ++ int wakelock_counter; ++ int wakelock_wd_counter; ++ int wakelock_rx_timeout_enable; ++ int wakelock_ctrl_timeout_enable; ++ ++ /* Thread to issue ioctl for multicast */ ++ unsigned char set_macaddress; ++ struct ether_addr macvalue; ++ wait_queue_head_t ctrl_wait; ++ atomic_t pend_8021x_cnt; ++ dhd_attach_states_t dhd_state; ++ ++#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ++ struct early_suspend early_suspend; ++#endif /* CONFIG_HAS_EARLYSUSPEND && defined(DHD_USE_EARLYSUSPEND) */ ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++ u32 pend_ipaddr; ++#endif /* ARP_OFFLOAD_SUPPORT */ ++#ifdef BCM_FD_AGGR ++ void *rpc_th; ++ void *rpc_osh; ++ struct timer_list rpcth_timer; ++ bool rpcth_timer_active; ++ bool fdaggr; ++#endif ++} dhd_info_t; ++ ++/* Flag to indicate if we should download firmware on driver load */ ++uint dhd_download_fw_on_driverload = TRUE; ++ ++/* Definitions to provide path to the firmware and nvram ++ * example nvram_path[MOD_PARAM_PATHLEN]="/projects/wlan/nvram.txt" ++ */ ++char firmware_path[MOD_PARAM_PATHLEN]; ++char nvram_path[MOD_PARAM_PATHLEN]; ++ ++/* information string to keep firmware, chio, cheip version info visiable from log */ ++char info_string[MOD_PARAM_INFOLEN]; ++module_param_string(info_string, info_string, MOD_PARAM_INFOLEN, 0444); ++ ++int op_mode = 0; ++int disable_proptx = 0; ++module_param(op_mode, int, 0644); ++extern int wl_control_wl_start(struct net_device *dev); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++struct semaphore dhd_registration_sem; ++struct semaphore dhd_chipup_sem; ++int dhd_registration_check = FALSE; ++ ++#define DHD_REGISTRATION_TIMEOUT 12000 /* msec : allowed time to finished dhd registration */ ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ ++/* Spawn a thread for system ioctls (set mac, set mcast) */ ++uint dhd_sysioc = TRUE; ++module_param(dhd_sysioc, uint, 0); ++ ++/* Error bits */ ++module_param(dhd_msg_level, int, 0); ++#if defined(CONFIG_WIRELESS_EXT) ++module_param(iw_msg_level, int, 0); ++#endif ++#ifdef WL_CFG80211 ++module_param(wl_dbg_level, int, 0); ++#endif ++//module_param(android_msg_level, int, 0); ++ ++/* Disable Prop tx */ ++module_param(disable_proptx, int, 0644); ++ ++/* load firmware and/or nvram values from the filesystem */ ++module_param_string(firmware_path, firmware_path, MOD_PARAM_PATHLEN, 0660); ++module_param_string(nvram_path, nvram_path, MOD_PARAM_PATHLEN, 0); ++ ++/* Watchdog interval */ ++uint dhd_watchdog_ms = 10; ++module_param(dhd_watchdog_ms, uint, 0); ++ ++#if defined(DHD_DEBUG) ++/* Console poll interval */ ++uint dhd_console_ms = 0; ++module_param(dhd_console_ms, uint, 0644); ++#endif /* defined(DHD_DEBUG) */ ++ ++uint dhd_slpauto = TRUE; ++module_param(dhd_slpauto, uint, 0); ++ ++/* ARP offload agent mode : Enable ARP Host Auto-Reply and ARP Peer Auto-Reply */ ++uint dhd_arp_mode = ARP_OL_AGENT | ARP_OL_PEER_AUTO_REPLY; ++module_param(dhd_arp_mode, uint, 0); ++ ++/* ARP offload enable */ ++uint dhd_arp_enable = TRUE; ++module_param(dhd_arp_enable, uint, 0); ++ ++#ifdef PKT_FILTER_SUPPORT ++/* Global Pkt filter enable control */ ++uint dhd_pkt_filter_enable = TRUE; ++module_param(dhd_pkt_filter_enable, uint, 0); ++#endif ++ ++/* Pkt filter init setup */ ++uint dhd_pkt_filter_init = 0; ++module_param(dhd_pkt_filter_init, uint, 0); ++ ++/* Pkt filter mode control */ ++#ifdef GAN_LITE_NAT_KEEPALIVE_FILTER ++uint dhd_master_mode = FALSE; ++#else ++uint dhd_master_mode = TRUE; ++#endif /* GAL_LITE_NAT_KEEPALIVE_FILTER */ ++module_param(dhd_master_mode, uint, 0); ++ ++#ifdef DHDTHREAD ++int dhd_watchdog_prio = 0; ++module_param(dhd_watchdog_prio, int, 0); ++ ++/* DPC thread priority */ ++int dhd_dpc_prio = CUSTOM_DPC_PRIO_SETTING; ++module_param(dhd_dpc_prio, int, 0); ++ ++/* DPC thread priority, -1 to use tasklet */ ++extern int dhd_dongle_memsize; ++module_param(dhd_dongle_memsize, int, 0); ++#endif /* DHDTHREAD */ ++/* Control fw roaming */ ++uint dhd_roam_disable = 0; ++ ++/* Control radio state */ ++uint dhd_radio_up = 1; ++ ++/* Network inteface name */ ++char iface_name[IFNAMSIZ] = {'\0'}; ++module_param_string(iface_name, iface_name, IFNAMSIZ, 0); ++ ++/* The following are specific to the SDIO dongle */ ++ ++/* IOCTL response timeout */ ++int dhd_ioctl_timeout_msec = IOCTL_RESP_TIMEOUT; ++ ++/* Idle timeout for backplane clock */ ++int dhd_idletime = DHD_IDLETIME_TICKS; ++module_param(dhd_idletime, int, 0); ++ ++/* Use polling */ ++uint dhd_poll = FALSE; ++module_param(dhd_poll, uint, 0); ++ ++/* Use interrupts */ ++uint dhd_intr = TRUE; ++module_param(dhd_intr, uint, 0); ++ ++/* SDIO Drive Strength (in milliamps) */ ++uint dhd_sdiod_drive_strength = 6; ++module_param(dhd_sdiod_drive_strength, uint, 0); ++ ++/* Tx/Rx bounds */ ++extern uint dhd_txbound; ++extern uint dhd_rxbound; ++module_param(dhd_txbound, uint, 0); ++module_param(dhd_rxbound, uint, 0); ++ ++/* Deferred transmits */ ++extern uint dhd_deferred_tx; ++module_param(dhd_deferred_tx, uint, 0); ++ ++#ifdef BCMDBGFS ++extern void dhd_dbg_init(dhd_pub_t *dhdp); ++extern void dhd_dbg_remove(void); ++#endif /* BCMDBGFS */ ++ ++/* ++ * the the 2 vars init at init time ++ *benn@cubietech.com ++ */ ++#define WL_HOST_WAKE_DEF_GPIO 2 ++int wl_host_wake_irqno = -1; ++int wl_host_wake = -1; ++ ++ ++#ifdef SDTEST ++/* Echo packet generator (pkts/s) */ ++uint dhd_pktgen = 0; ++module_param(dhd_pktgen, uint, 0); ++ ++/* Echo packet len (0 => sawtooth, max 2040) */ ++uint dhd_pktgen_len = 0; ++module_param(dhd_pktgen_len, uint, 0); ++#endif /* SDTEST */ ++ ++/* Version string to report */ ++#ifdef DHD_DEBUG ++#ifndef SRCBASE ++#define SRCBASE "drivers/net/wireless/ap6210" ++#endif ++#define DHD_COMPILED "\nCompiled in " SRCBASE ++#else ++#define DHD_COMPILED ++#endif /* DHD_DEBUG */ ++ ++static char dhd_version[] = "Dongle Host Driver, version " EPI_VERSION_STR "."; ++#ifdef DHD_DEBUG ++static char dhd_version_info[] = "Compiled in " SRCBASE " on " __DATE__ " at " __TIME__ "."; ++#endif ++ ++static void dhd_net_if_lock_local(dhd_info_t *dhd); ++static void dhd_net_if_unlock_local(dhd_info_t *dhd); ++static void dhd_suspend_lock(dhd_pub_t *dhdp); ++static void dhd_suspend_unlock(dhd_pub_t *dhdp); ++ ++#ifdef WLMEDIA_HTSF ++void htsf_update(dhd_info_t *dhd, void *data); ++tsf_t prev_tsf, cur_tsf; ++ ++uint32 dhd_get_htsf(dhd_info_t *dhd, int ifidx); ++static int dhd_ioctl_htsf_get(dhd_info_t *dhd, int ifidx); ++static void dhd_dump_latency(void); ++static void dhd_htsf_addtxts(dhd_pub_t *dhdp, void *pktbuf); ++static void dhd_htsf_addrxts(dhd_pub_t *dhdp, void *pktbuf); ++static void dhd_dump_htsfhisto(histo_t *his, char *s); ++#endif /* WLMEDIA_HTSF */ ++ ++/* Monitor interface */ ++int dhd_monitor_init(void *dhd_pub); ++int dhd_monitor_uninit(void); ++ ++ ++#if defined(CONFIG_WIRELESS_EXT) ++struct iw_statistics *dhd_get_wireless_stats(struct net_device *dev); ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++static void dhd_dpc(ulong data); ++/* forward decl */ ++extern int dhd_wait_pend8021x(struct net_device *dev); ++ ++#ifdef TOE ++#ifndef BDC ++#error TOE requires BDC ++#endif /* !BDC */ ++static int dhd_toe_get(dhd_info_t *dhd, int idx, uint32 *toe_ol); ++static int dhd_toe_set(dhd_info_t *dhd, int idx, uint32 toe_ol); ++#endif /* TOE */ ++ ++static int dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, ++ wl_event_msg_t *event_ptr, void **data_ptr); ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) ++static int dhd_sleep_pm_callback(struct notifier_block *nfb, unsigned long action, void *ignored) ++{ ++ int ret = NOTIFY_DONE; ++ ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) || (LINUX_VERSION_CODE <= \ ++ KERNEL_VERSION(2, 6, 39)) ++ switch (action) { ++ case PM_HIBERNATION_PREPARE: ++ case PM_SUSPEND_PREPARE: ++ dhd_mmc_suspend = TRUE; ++ ret = NOTIFY_OK; ++ break; ++ case PM_POST_HIBERNATION: ++ case PM_POST_SUSPEND: ++ dhd_mmc_suspend = FALSE; ++ ret = NOTIFY_OK; ++ break; ++ } ++ smp_mb(); ++#endif ++ return ret; ++} ++ ++static struct notifier_block dhd_sleep_pm_notifier = { ++ .notifier_call = dhd_sleep_pm_callback, ++ .priority = 10 ++}; ++extern int register_pm_notifier(struct notifier_block *nb); ++extern int unregister_pm_notifier(struct notifier_block *nb); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ ++ ++void dhd_set_packet_filter(dhd_pub_t *dhd) ++{ ++#ifdef PKT_FILTER_SUPPORT ++ int i; ++ ++ AP6210_DEBUG("%s: enter\n", __FUNCTION__); ++ if (dhd_pkt_filter_enable) { ++ for (i = 0; i < dhd->pktfilter_count; i++) { ++ dhd_pktfilter_offload_set(dhd, dhd->pktfilter[i]); ++ } ++ } ++#endif /* PKT_FILTER_SUPPORT */ ++} ++ ++void dhd_enable_packet_filter(int value, dhd_pub_t *dhd) ++{ ++#ifdef PKT_FILTER_SUPPORT ++ int i; ++ ++ AP6210_DEBUG("%s: enter, value = %d\n", __FUNCTION__, value); ++ /* 1 - Enable packet filter, only allow unicast packet to send up */ ++ /* 0 - Disable packet filter */ ++ if (dhd_pkt_filter_enable && (!value || ++ (dhd_support_sta_mode(dhd) && !dhd->dhcp_in_progress))) { ++ for (i = 0; i < dhd->pktfilter_count; i++) { ++#ifdef PASS_ARP_PACKET ++ if (value && (i == dhd->pktfilter_count -1) && ++ !(dhd->op_mode & (DHD_FLAG_P2P_GC_MODE | DHD_FLAG_P2P_GO_MODE))) { ++ AP6210_DEBUG("Do not turn on ARP white list pkt filter:" ++ "val %d, cnt %d, op_mode 0x%x\n", ++ value, i, dhd->op_mode); ++ continue; ++ } ++#endif ++ dhd_pktfilter_offload_enable(dhd, dhd->pktfilter[i], ++ value, dhd_master_mode); ++ } ++ } ++#endif /* PKT_FILTER_SUPPORT */ ++} ++ ++static int dhd_set_suspend(int value, dhd_pub_t *dhd) ++{ ++#if !defined(SUPPORT_PM2_ONLY) ++ int power_mode = PM_MAX; ++#endif ++ /* wl_pkt_filter_enable_t enable_parm; */ ++ char iovbuf[32]; ++ int bcn_li_dtim = 0; /* Default bcn_li_dtim in resume mode is 0 */ ++#ifndef DISABLE_FW_ROAM_SUSPEND ++ uint roamvar = 1; ++#endif ++#ifdef ENABLE_BCN_LI_BCN_WAKEUP ++ int bcn_li_bcn; ++#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ ++#ifdef PASS_ALL_MCAST_PKTS ++ struct dhd_info *dhdinfo = dhd->info; ++ uint32 allmulti; ++ uint i; ++#endif /* PASS_ALL_MCAST_PKTS */ ++ ++ AP6210_DEBUG("%s: enter, value = %d in_suspend=%d\n", ++ __FUNCTION__, value, dhd->in_suspend); ++ ++ dhd_suspend_lock(dhd); ++ if (dhd && dhd->up) { ++ if (value && dhd->in_suspend) { ++#ifdef PKT_FILTER_SUPPORT ++ dhd->early_suspended = 1; ++#endif ++ /* Kernel suspended */ ++ AP6210_ERR("%s: force extra Suspend setting\n", __FUNCTION__); ++ ++#if !defined(SUPPORT_PM2_ONLY) ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, ++ sizeof(power_mode), TRUE, 0); ++#endif ++ /* Enable packet filter, only allow unicast packet to send up */ ++ dhd_enable_packet_filter(1, dhd); ++#ifdef PASS_ALL_MCAST_PKTS ++ allmulti = 0; ++ bcm_mkiovar("allmulti", (char *)&allmulti, ++ 4, iovbuf, sizeof(iovbuf)); ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ if (dhdinfo->iflist[i] && dhdinfo->iflist[i]->net) ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, ++ sizeof(iovbuf), TRUE, i); ++ } ++#endif /* PASS_ALL_MCAST_PKTS */ ++ ++ /* If DTIM skip is set up as default, force it to wake ++ * each third DTIM for better power savings. Note that ++ * one side effect is a chance to miss BC/MC packet. ++ */ ++ bcn_li_dtim = dhd_get_suspend_bcn_li_dtim(dhd); ++ bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, ++ 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ ++#ifndef DISABLE_FW_ROAM_SUSPEND ++ /* Disable firmware roaming during suspend */ ++ bcm_mkiovar("roam_off", (char *)&roamvar, 4, ++ iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif ++#ifdef ENABLE_BCN_LI_BCN_WAKEUP ++ bcn_li_bcn = 0; ++ bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, ++ 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ ++ ++ } else { ++#ifdef PKT_FILTER_SUPPORT ++ dhd->early_suspended = 0; ++#endif ++ /* Kernel resumed */ ++ AP6210_ERR("%s: Remove extra suspend setting\n", __FUNCTION__); ++ ++#if !defined(SUPPORT_PM2_ONLY) ++ power_mode = PM_FAST; ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, ++ sizeof(power_mode), TRUE, 0); ++#endif ++ /* disable pkt filter */ ++ dhd_enable_packet_filter(0, dhd); ++#ifdef PASS_ALL_MCAST_PKTS ++ allmulti = 1; ++ bcm_mkiovar("allmulti", (char *)&allmulti, ++ 4, iovbuf, sizeof(iovbuf)); ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ if (dhdinfo->iflist[i] && dhdinfo->iflist[i]->net) ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, ++ sizeof(iovbuf), TRUE, i); ++ } ++#endif /* PASS_ALL_MCAST_PKTS */ ++ ++ /* restore pre-suspend setting for dtim_skip */ ++ bcm_mkiovar("bcn_li_dtim", (char *)&bcn_li_dtim, ++ 4, iovbuf, sizeof(iovbuf)); ++ ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#ifndef DISABLE_FW_ROAM_SUSPEND ++ roamvar = dhd_roam_disable; ++ bcm_mkiovar("roam_off", (char *)&roamvar, 4, iovbuf, ++ sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif ++#ifdef ENABLE_BCN_LI_BCN_WAKEUP ++ bcn_li_bcn = 1; ++ bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, ++ 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ ++ ++ } ++ } ++ ++ dhd_suspend_unlock(dhd); ++ return 0; ++} ++ ++static int dhd_suspend_resume_helper(struct dhd_info *dhd, int val, int force) ++{ ++ dhd_pub_t *dhdp = &dhd->pub; ++ int ret = 0; ++ ++ DHD_OS_WAKE_LOCK(dhdp); ++ /* Set flag when early suspend was called */ ++ dhdp->in_suspend = val; ++ if ((force || !dhdp->suspend_disable_flag) && ++ dhd_support_sta_mode(dhdp)) ++ { ++ ret = dhd_set_suspend(val, dhdp); ++ } ++ ++ DHD_OS_WAKE_UNLOCK(dhdp); ++ return ret; ++} ++ ++#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ++static void dhd_early_suspend(struct early_suspend *h) ++{ ++ struct dhd_info *dhd = container_of(h, struct dhd_info, early_suspend); ++ AP6210_DEBUG("%s: enter\n", __FUNCTION__); ++ ++ if (dhd) ++ dhd_suspend_resume_helper(dhd, 1, 0); ++} ++ ++static void dhd_late_resume(struct early_suspend *h) ++{ ++ struct dhd_info *dhd = container_of(h, struct dhd_info, early_suspend); ++ AP6210_DEBUG("%s: enter\n", __FUNCTION__); ++ ++ if (dhd) ++ dhd_suspend_resume_helper(dhd, 0, 0); ++} ++#endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ ++ ++/* ++ * Generalized timeout mechanism. Uses spin sleep with exponential back-off until ++ * the sleep time reaches one jiffy, then switches over to task delay. Usage: ++ * ++ * dhd_timeout_start(&tmo, usec); ++ * while (!dhd_timeout_expired(&tmo)) ++ * if (poll_something()) ++ * break; ++ * if (dhd_timeout_expired(&tmo)) ++ * fatal(); ++ */ ++ ++void ++dhd_timeout_start(dhd_timeout_t *tmo, uint usec) ++{ ++ tmo->limit = usec; ++ tmo->increment = 0; ++ tmo->elapsed = 0; ++ tmo->tick = jiffies_to_usecs(1); ++} ++ ++int ++dhd_timeout_expired(dhd_timeout_t *tmo) ++{ ++ /* Does nothing the first call */ ++ if (tmo->increment == 0) { ++ tmo->increment = 1; ++ return 0; ++ } ++ ++ if (tmo->elapsed >= tmo->limit) ++ return 1; ++ ++ /* Add the delay that's about to take place */ ++ tmo->elapsed += tmo->increment; ++ ++ if (tmo->increment < tmo->tick) { ++ OSL_DELAY(tmo->increment); ++ tmo->increment *= 2; ++ if (tmo->increment > tmo->tick) ++ tmo->increment = tmo->tick; ++ } else { ++ wait_queue_head_t delay_wait; ++ DECLARE_WAITQUEUE(wait, current); ++ init_waitqueue_head(&delay_wait); ++ add_wait_queue(&delay_wait, &wait); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ remove_wait_queue(&delay_wait, &wait); ++ set_current_state(TASK_RUNNING); ++ } ++ ++ return 0; ++} ++ ++int ++dhd_net2idx(dhd_info_t *dhd, struct net_device *net) ++{ ++ int i = 0; ++ ++ ASSERT(dhd); ++ while (i < DHD_MAX_IFS) { ++ if (dhd->iflist[i] && (dhd->iflist[i]->net == net)) ++ return i; ++ i++; ++ } ++ ++ return DHD_BAD_IF; ++} ++ ++struct net_device * dhd_idx2net(void *pub, int ifidx) ++{ ++ struct dhd_pub *dhd_pub = (struct dhd_pub *)pub; ++ struct dhd_info *dhd_info; ++ ++ if (!dhd_pub || ifidx < 0 || ifidx >= DHD_MAX_IFS) ++ return NULL; ++ dhd_info = dhd_pub->info; ++ if (dhd_info && dhd_info->iflist[ifidx]) ++ return dhd_info->iflist[ifidx]->net; ++ return NULL; ++} ++ ++int ++dhd_ifname2idx(dhd_info_t *dhd, char *name) ++{ ++ int i = DHD_MAX_IFS; ++ ++ ASSERT(dhd); ++ ++ if (name == NULL || *name == '\0') ++ return 0; ++ ++ while (--i > 0) ++ if (dhd->iflist[i] && !strncmp(dhd->iflist[i]->name, name, IFNAMSIZ)) ++ break; ++ ++ AP6210_DEBUG("%s: return idx %d for \"%s\"\n", __FUNCTION__, i, name); ++ ++ return i; /* default - the primary interface */ ++} ++ ++char * ++dhd_ifname(dhd_pub_t *dhdp, int ifidx) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)dhdp->info; ++ ++ ASSERT(dhd); ++ ++ if (ifidx < 0 || ifidx >= DHD_MAX_IFS) { ++ AP6210_ERR("%s: ifidx %d out of range\n", __FUNCTION__, ifidx); ++ return ""; ++ } ++ ++ if (dhd->iflist[ifidx] == NULL) { ++ AP6210_ERR("%s: null i/f %d\n", __FUNCTION__, ifidx); ++ return ""; ++ } ++ ++ if (dhd->iflist[ifidx]->net) ++ return dhd->iflist[ifidx]->net->name; ++ ++ return ""; ++} ++ ++uint8 * ++dhd_bssidx2bssid(dhd_pub_t *dhdp, int idx) ++{ ++ int i; ++ dhd_info_t *dhd = (dhd_info_t *)dhdp; ++ ++ ASSERT(dhd); ++ for (i = 0; i < DHD_MAX_IFS; i++) ++ if (dhd->iflist[i] && dhd->iflist[i]->bssidx == idx) ++ return dhd->iflist[i]->mac_addr; ++ ++ return NULL; ++} ++ ++ ++static void ++_dhd_set_multicast_list(dhd_info_t *dhd, int ifidx) ++{ ++ struct net_device *dev; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) ++ struct netdev_hw_addr *ha; ++#else ++ struct dev_mc_list *mclist; ++#endif ++ uint32 allmulti, cnt; ++ ++ wl_ioctl_t ioc; ++ char *buf, *bufp; ++ uint buflen; ++ int ret; ++ ++ ASSERT(dhd && dhd->iflist[ifidx]); ++ dev = dhd->iflist[ifidx]->net; ++ if (!dev) ++ return; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++ netif_addr_lock_bh(dev); ++#endif ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) ++ cnt = netdev_mc_count(dev); ++#else ++ cnt = dev->mc_count; ++#endif /* LINUX_VERSION_CODE */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++ netif_addr_unlock_bh(dev); ++#endif ++ ++ /* Determine initial value of allmulti flag */ ++ allmulti = (dev->flags & IFF_ALLMULTI) ? TRUE : FALSE; ++#ifdef PASS_ALL_MCAST_PKTS ++#ifdef PKT_FILTER_SUPPORT ++ if (!dhd->pub.early_suspended) ++#endif /* PKT_FILTER_SUPPORT */ ++ allmulti = TRUE; ++#endif /* PASS_ALL_MCAST_PKTS */ ++ ++ /* Send down the multicast list first. */ ++ ++ ++ buflen = sizeof("mcast_list") + sizeof(cnt) + (cnt * ETHER_ADDR_LEN); ++ if (!(bufp = buf = MALLOC(dhd->pub.osh, buflen))) { ++ AP6210_ERR("%s: out of memory for mcast_list, cnt %d\n", ++ dhd_ifname(&dhd->pub, ifidx), cnt); ++ return; ++ } ++ ++ strncpy(bufp, "mcast_list", buflen - 1); ++ bufp[buflen - 1] = '\0'; ++ bufp += strlen("mcast_list") + 1; ++ ++ cnt = htol32(cnt); ++ memcpy(bufp, &cnt, sizeof(cnt)); ++ bufp += sizeof(cnt); ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++ netif_addr_lock_bh(dev); ++#endif ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) ++ netdev_for_each_mc_addr(ha, dev) { ++ if (!cnt) ++ break; ++ memcpy(bufp, ha->addr, ETHER_ADDR_LEN); ++ bufp += ETHER_ADDR_LEN; ++ cnt--; ++ } ++#else ++ for (mclist = dev->mc_list; (mclist && (cnt > 0)); ++ cnt--, mclist = mclist->next) { ++ memcpy(bufp, (void *)mclist->dmi_addr, ETHER_ADDR_LEN); ++ bufp += ETHER_ADDR_LEN; ++ } ++#endif /* LINUX_VERSION_CODE */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++ netif_addr_unlock_bh(dev); ++#endif ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ioc.cmd = WLC_SET_VAR; ++ ioc.buf = buf; ++ ioc.len = buflen; ++ ioc.set = TRUE; ++ ++ ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len); ++ if (ret < 0) { ++ AP6210_ERR("%s: set mcast_list failed, cnt %d\n", ++ dhd_ifname(&dhd->pub, ifidx), cnt); ++ allmulti = cnt ? TRUE : allmulti; ++ } ++ ++ MFREE(dhd->pub.osh, buf, buflen); ++ ++ /* Now send the allmulti setting. This is based on the setting in the ++ * net_device flags, but might be modified above to be turned on if we ++ * were trying to set some addresses and dongle rejected it... ++ */ ++ ++ buflen = sizeof("allmulti") + sizeof(allmulti); ++ if (!(buf = MALLOC(dhd->pub.osh, buflen))) { ++ AP6210_ERR("%s: out of memory for allmulti\n", dhd_ifname(&dhd->pub, ifidx)); ++ return; ++ } ++ allmulti = htol32(allmulti); ++ ++ if (!bcm_mkiovar("allmulti", (void*)&allmulti, sizeof(allmulti), buf, buflen)) { ++ AP6210_ERR("%s: mkiovar failed for allmulti, datalen %d buflen %u\n", ++ dhd_ifname(&dhd->pub, ifidx), (int)sizeof(allmulti), buflen); ++ MFREE(dhd->pub.osh, buf, buflen); ++ return; ++ } ++ ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ioc.cmd = WLC_SET_VAR; ++ ioc.buf = buf; ++ ioc.len = buflen; ++ ioc.set = TRUE; ++ ++ ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len); ++ if (ret < 0) { ++ AP6210_ERR("%s: set allmulti %d failed\n", ++ dhd_ifname(&dhd->pub, ifidx), ltoh32(allmulti)); ++ } ++ ++ MFREE(dhd->pub.osh, buf, buflen); ++ ++ /* Finally, pick up the PROMISC flag as well, like the NIC driver does */ ++ ++ allmulti = (dev->flags & IFF_PROMISC) ? TRUE : FALSE; ++ allmulti = htol32(allmulti); ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ioc.cmd = WLC_SET_PROMISC; ++ ioc.buf = &allmulti; ++ ioc.len = sizeof(allmulti); ++ ioc.set = TRUE; ++ ++ ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len); ++ if (ret < 0) { ++ AP6210_ERR("%s: set promisc %d failed\n", ++ dhd_ifname(&dhd->pub, ifidx), ltoh32(allmulti)); ++ } ++} ++ ++int ++_dhd_set_mac_address(dhd_info_t *dhd, int ifidx, struct ether_addr *addr) ++{ ++ char buf[32]; ++ wl_ioctl_t ioc; ++ int ret; ++ ++ if (!bcm_mkiovar("cur_etheraddr", (char*)addr, ETHER_ADDR_LEN, buf, 32)) { ++ AP6210_ERR("%s: mkiovar failed for cur_etheraddr\n", dhd_ifname(&dhd->pub, ifidx)); ++ return -1; ++ } ++ memset(&ioc, 0, sizeof(ioc)); ++ ioc.cmd = WLC_SET_VAR; ++ ioc.buf = buf; ++ ioc.len = 32; ++ ioc.set = TRUE; ++ ++ ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len); ++ if (ret < 0) { ++ AP6210_ERR("%s: set cur_etheraddr failed\n", dhd_ifname(&dhd->pub, ifidx)); ++ } else { ++ memcpy(dhd->iflist[ifidx]->net->dev_addr, addr, ETHER_ADDR_LEN); ++ memcpy(dhd->pub.mac.octet, addr, ETHER_ADDR_LEN); ++ } ++ ++ return ret; ++} ++ ++#ifdef SOFTAP ++extern struct net_device *ap_net_dev; ++extern tsk_ctl_t ap_eth_ctl; /* ap netdev heper thread ctl */ ++#endif ++ ++static void ++dhd_op_if(dhd_if_t *ifp) ++{ ++ dhd_info_t *dhd; ++ int ret = 0, err = 0; ++#ifdef SOFTAP ++ unsigned long flags; ++#endif ++ ++ if (!ifp || !ifp->info || !ifp->idx) ++ return; ++ ASSERT(ifp && ifp->info && ifp->idx); /* Virtual interfaces only */ ++ dhd = ifp->info; ++ ++ AP6210_DEBUG("%s: idx %d, state %d\n", __FUNCTION__, ifp->idx, ifp->state); ++ ++#ifdef WL_CFG80211 ++ if (wl_cfg80211_is_progress_ifchange()) ++ return; ++ ++#endif ++ switch (ifp->state) { ++ case DHD_IF_ADD: ++ /* ++ * Delete the existing interface before overwriting it ++ * in case we missed the WLC_E_IF_DEL event. ++ */ ++ if (ifp->net != NULL) { ++ AP6210_ERR("%s: ERROR: netdev:%s already exists, try free & unregister \n", ++ __FUNCTION__, ifp->net->name); ++ netif_stop_queue(ifp->net); ++ unregister_netdev(ifp->net); ++ free_netdev(ifp->net); ++ } ++ /* Allocate etherdev, including space for private structure */ ++ if (!(ifp->net = alloc_etherdev(sizeof(dhd)))) { ++ AP6210_ERR("%s: OOM - alloc_etherdev\n", __FUNCTION__); ++ ret = -ENOMEM; ++ } ++ if (ret == 0) { ++ strncpy(ifp->net->name, ifp->name, IFNAMSIZ); ++ ifp->net->name[IFNAMSIZ - 1] = '\0'; ++ memcpy(netdev_priv(ifp->net), &dhd, sizeof(dhd)); ++#ifdef WL_CFG80211 ++ if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) ++ if (!wl_cfg80211_notify_ifadd(ifp->net, ifp->idx, ifp->bssidx, ++ (void*)dhd_net_attach)) { ++ ifp->state = DHD_IF_NONE; ++ ifp->event2cfg80211 = TRUE; ++ return; ++ } ++#endif ++ if ((err = dhd_net_attach(&dhd->pub, ifp->idx)) != 0) { ++ AP6210_ERR("%s: dhd_net_attach failed, err %d\n", ++ __FUNCTION__, err); ++ ret = -EOPNOTSUPP; ++ } else { ++#if defined(SOFTAP) ++ if (ap_fw_loaded && !(dhd->dhd_state & DHD_ATTACH_STATE_CFG80211)) { ++ /* semaphore that the soft AP CODE waits on */ ++ flags = dhd_os_spin_lock(&dhd->pub); ++ ++ /* save ptr to wl0.1 netdev for use in wl_iw.c */ ++ ap_net_dev = ifp->net; ++ /* signal to the SOFTAP 'sleeper' thread, wl0.1 is ready */ ++ up(&ap_eth_ctl.sema); ++ dhd_os_spin_unlock(&dhd->pub, flags); ++ } ++#endif ++ AP6210_DEBUG(" ==== pid:%x, net_device for if:%s created ===\n\n", ++ current->pid, ifp->net->name); ++ ifp->state = DHD_IF_NONE; ++ } ++ } ++ break; ++ case DHD_IF_DEL: ++ /* Make sure that we don't enter again here if .. */ ++ /* dhd_op_if is called again from some other context */ ++ ifp->state = DHD_IF_DELETING; ++ if (ifp->net != NULL) { ++ AP6210_DEBUG("%s: got 'DHD_IF_DEL' state\n", __FUNCTION__); ++ netif_stop_queue(ifp->net); ++#ifdef WL_CFG80211 ++ if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { ++ wl_cfg80211_ifdel_ops(ifp->net); ++ } ++#endif ++ unregister_netdev(ifp->net); ++ ret = DHD_DEL_IF; /* Make sure the free_netdev() is called */ ++#ifdef WL_CFG80211 ++ if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { ++ wl_cfg80211_notify_ifdel(); ++ } ++#endif ++ } ++ break; ++ case DHD_IF_DELETING: ++ break; ++ default: ++ AP6210_ERR("%s: bad op %d\n", __FUNCTION__, ifp->state); ++ ASSERT(!ifp->state); ++ break; ++ } ++ ++ if (ret < 0) { ++ ifp->set_multicast = FALSE; ++ if (ifp->net) { ++ free_netdev(ifp->net); ++ ifp->net = NULL; ++ } ++ dhd->iflist[ifp->idx] = NULL; ++#ifdef SOFTAP ++ flags = dhd_os_spin_lock(&dhd->pub); ++ if (ifp->net == ap_net_dev) ++ ap_net_dev = NULL; /* NULL SOFTAP global wl0.1 as well */ ++ dhd_os_spin_unlock(&dhd->pub, flags); ++#endif /* SOFTAP */ ++ MFREE(dhd->pub.osh, ifp, sizeof(*ifp)); ++ } ++} ++ ++static int ++_dhd_sysioc_thread(void *data) ++{ ++ tsk_ctl_t *tsk = (tsk_ctl_t *)data; ++ dhd_info_t *dhd = (dhd_info_t *)tsk->parent; ++ ++ ++ int i; ++#ifdef SOFTAP ++ bool in_ap = FALSE; ++ unsigned long flags; ++#endif ++#ifndef USE_KTHREAD_API ++ DAEMONIZE("dhd_sysioc"); ++ ++ complete(&tsk->completed); ++#endif ++ ++ while (down_interruptible(&tsk->sema) == 0) { ++ ++ SMP_RD_BARRIER_DEPENDS(); ++ if (tsk->terminated) { ++ break; ++ } ++ ++ dhd_net_if_lock_local(dhd); ++ DHD_OS_WAKE_LOCK(&dhd->pub); ++ ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ if (dhd->iflist[i]) { ++ AP6210_DEBUG("%s: interface %d\n", __FUNCTION__, i); ++#ifdef SOFTAP ++ flags = dhd_os_spin_lock(&dhd->pub); ++ in_ap = (ap_net_dev != NULL); ++ dhd_os_spin_unlock(&dhd->pub, flags); ++#endif /* SOFTAP */ ++ if (dhd->iflist[i] && dhd->iflist[i]->state) ++ dhd_op_if(dhd->iflist[i]); ++ ++ if (dhd->iflist[i] == NULL) { ++ AP6210_DEBUG("%s: interface %d just been removed,!\n", __FUNCTION__, i); ++ continue; ++ } ++#ifdef SOFTAP ++ if (in_ap && dhd->set_macaddress == i+1) { ++ AP6210_DEBUG("attempt to set MAC for %s in AP Mode," ++ "blocked. \n", dhd->iflist[i]->net->name); ++ dhd->set_macaddress = 0; ++ continue; ++ } ++ ++ if (in_ap && dhd->iflist[i]->set_multicast) { ++ AP6210_DEBUG("attempt to set MULTICAST list for %s" ++ "in AP Mode, blocked. \n", dhd->iflist[i]->net->name); ++ dhd->iflist[i]->set_multicast = FALSE; ++ continue; ++ } ++#endif /* SOFTAP */ ++ if (dhd->pub.up == 0) ++ continue; ++ if (dhd->iflist[i]->set_multicast) { ++ dhd->iflist[i]->set_multicast = FALSE; ++ _dhd_set_multicast_list(dhd, i); ++ } ++ if (dhd->set_macaddress == i+1) { ++ dhd->set_macaddress = 0; ++ if (_dhd_set_mac_address(dhd, i, &dhd->macvalue) == 0) { ++ AP6210_DEBUG( ++ "dhd_sysioc_thread: MACID is overwritten\n"); ++ } else { ++ AP6210_ERR( ++ "dhd_sysioc_thread: _dhd_set_mac_address() failed\n"); ++ } ++ } ++ } ++ } ++ ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ dhd_net_if_unlock_local(dhd); ++ } ++ AP6210_DEBUG("%s: stopped\n", __FUNCTION__); ++ complete_and_exit(&tsk->completed, 0); ++} ++ ++static int ++dhd_set_mac_address(struct net_device *dev, void *addr) ++{ ++ int ret = 0; ++ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ struct sockaddr *sa = (struct sockaddr *)addr; ++ int ifidx; ++ ++ ifidx = dhd_net2idx(dhd, dev); ++ if (ifidx == DHD_BAD_IF) ++ return -1; ++ ++ ASSERT(dhd->thr_sysioc_ctl.thr_pid >= 0); ++ memcpy(&dhd->macvalue, sa->sa_data, ETHER_ADDR_LEN); ++ dhd->set_macaddress = ifidx+1; ++ up(&dhd->thr_sysioc_ctl.sema); ++ ++ return ret; ++} ++ ++static void ++dhd_set_multicast_list(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ifidx; ++ ++ ifidx = dhd_net2idx(dhd, dev); ++ if (ifidx == DHD_BAD_IF) ++ return; ++ ++ ASSERT(dhd->thr_sysioc_ctl.thr_pid >= 0); ++ dhd->iflist[ifidx]->set_multicast = TRUE; ++ up(&dhd->thr_sysioc_ctl.sema); ++} ++ ++#ifdef PROP_TXSTATUS ++int ++dhd_os_wlfc_block(dhd_pub_t *pub) ++{ ++ dhd_info_t *di = (dhd_info_t *)(pub->info); ++ ASSERT(di != NULL); ++ spin_lock_bh(&di->wlfc_spinlock); ++ return 1; ++} ++ ++int ++dhd_os_wlfc_unblock(dhd_pub_t *pub) ++{ ++ dhd_info_t *di = (dhd_info_t *)(pub->info); ++ ++ ASSERT(di != NULL); ++ spin_unlock_bh(&di->wlfc_spinlock); ++ return 1; ++} ++ ++const uint8 wme_fifo2ac[] = { 0, 1, 2, 3, 1, 1 }; ++uint8 prio2fifo[8] = { 1, 0, 0, 1, 2, 2, 3, 3 }; ++#define WME_PRIO2AC(prio) wme_fifo2ac[prio2fifo[(prio)]] ++ ++#endif /* PROP_TXSTATUS */ ++int ++dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, void *pktbuf) ++{ ++ int ret; ++ dhd_info_t *dhd = (dhd_info_t *)(dhdp->info); ++ struct ether_header *eh = NULL; ++ ++ /* Reject if down */ ++ if (!dhdp->up || (dhdp->busstate == DHD_BUS_DOWN)) { ++ /* free the packet here since the caller won't */ ++ PKTFREE(dhdp->osh, pktbuf, TRUE); ++ return -ENODEV; ++ } ++ ++ /* Update multicast statistic */ ++ if (PKTLEN(dhdp->osh, pktbuf) >= ETHER_HDR_LEN) { ++ uint8 *pktdata = (uint8 *)PKTDATA(dhdp->osh, pktbuf); ++ eh = (struct ether_header *)pktdata; ++ ++ if (ETHER_ISMULTI(eh->ether_dhost)) ++ dhdp->tx_multicast++; ++ if (ntoh16(eh->ether_type) == ETHER_TYPE_802_1X) ++ atomic_inc(&dhd->pend_8021x_cnt); ++ } else { ++ PKTFREE(dhd->pub.osh, pktbuf, TRUE); ++ return BCME_ERROR; ++ } ++ ++ /* Look into the packet and update the packet priority */ ++#ifndef PKTPRIO_OVERRIDE ++ if (PKTPRIO(pktbuf) == 0) ++#endif ++ pktsetprio(pktbuf, FALSE); ++ ++#ifdef PROP_TXSTATUS ++ if (dhdp->wlfc_state) { ++ /* store the interface ID */ ++ DHD_PKTTAG_SETIF(PKTTAG(pktbuf), ifidx); ++ ++ /* store destination MAC in the tag as well */ ++ DHD_PKTTAG_SETDSTN(PKTTAG(pktbuf), eh->ether_dhost); ++ ++ /* decide which FIFO this packet belongs to */ ++ if (ETHER_ISMULTI(eh->ether_dhost)) ++ /* one additional queue index (highest AC + 1) is used for bc/mc queue */ ++ DHD_PKTTAG_SETFIFO(PKTTAG(pktbuf), AC_COUNT); ++ else ++ DHD_PKTTAG_SETFIFO(PKTTAG(pktbuf), WME_PRIO2AC(PKTPRIO(pktbuf))); ++ } else ++#endif /* PROP_TXSTATUS */ ++ /* If the protocol uses a data header, apply it */ ++ dhd_prot_hdrpush(dhdp, ifidx, pktbuf); ++ ++ /* Use bus module to send data frame */ ++#ifdef WLMEDIA_HTSF ++ dhd_htsf_addtxts(dhdp, pktbuf); ++#endif ++#ifdef PROP_TXSTATUS ++ dhd_os_wlfc_block(dhdp); ++ if (dhdp->wlfc_state && ((athost_wl_status_info_t*)dhdp->wlfc_state)->proptxstatus_mode ++ != WLFC_FCMODE_NONE) { ++ ret = dhd_wlfc_enque_sendq(dhdp->wlfc_state, DHD_PKTTAG_FIFO(PKTTAG(pktbuf)), ++ pktbuf); ++ dhd_wlfc_commit_packets(dhdp->wlfc_state, (f_commitpkt_t)dhd_bus_txdata, ++ dhdp->bus); ++ if (((athost_wl_status_info_t*)dhdp->wlfc_state)->toggle_host_if) { ++ ((athost_wl_status_info_t*)dhdp->wlfc_state)->toggle_host_if = 0; ++ } ++ dhd_os_wlfc_unblock(dhdp); ++ } ++ else { ++ dhd_os_wlfc_unblock(dhdp); ++ /* non-proptxstatus way */ ++ ret = dhd_bus_txdata(dhdp->bus, pktbuf, FALSE); ++ } ++#else ++ ret = dhd_bus_txdata(dhdp->bus, pktbuf, FALSE); ++#endif /* PROP_TXSTATUS */ ++ ++ return ret; ++} ++ ++int ++dhd_start_xmit(struct sk_buff *skb, struct net_device *net) ++{ ++ int ret; ++ void *pktbuf; ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); ++ int ifidx; ++#ifdef WLMEDIA_HTSF ++ uint8 htsfdlystat_sz = dhd->pub.htsfdlystat_sz; ++#else ++ uint8 htsfdlystat_sz = 0; ++#endif ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ DHD_OS_WAKE_LOCK(&dhd->pub); ++ ++ /* Reject if down */ ++ if (dhd->pub.busstate == DHD_BUS_DOWN || dhd->pub.hang_was_sent) { ++ AP6210_ERR("%s: xmit rejected pub.up=%d busstate=%d \n", ++ __FUNCTION__, dhd->pub.up, dhd->pub.busstate); ++ netif_stop_queue(net); ++ /* Send Event when bus down detected during data session */ ++ if (dhd->pub.up) { ++ AP6210_ERR("%s: Event HANG sent up\n", __FUNCTION__); ++ net_os_send_hang_message(net); ++ } ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)) ++ return -ENODEV; ++#else ++ return NETDEV_TX_BUSY; ++#endif ++ } ++ ++ ifidx = dhd_net2idx(dhd, net); ++ if (ifidx == DHD_BAD_IF) { ++ AP6210_ERR("%s: bad ifidx %d\n", __FUNCTION__, ifidx); ++ netif_stop_queue(net); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)) ++ return -ENODEV; ++#else ++ return NETDEV_TX_BUSY; ++#endif ++ } ++ ++ /* Make sure there's enough room for any header */ ++ ++ if (skb_headroom(skb) < dhd->pub.hdrlen + htsfdlystat_sz) { ++ struct sk_buff *skb2; ++ ++ AP6210_DEBUG("%s: insufficient headroom\n", ++ dhd_ifname(&dhd->pub, ifidx)); ++ dhd->pub.tx_realloc++; ++ ++ skb2 = skb_realloc_headroom(skb, dhd->pub.hdrlen + htsfdlystat_sz); ++ ++ dev_kfree_skb(skb); ++ if ((skb = skb2) == NULL) { ++ AP6210_ERR("%s: skb_realloc_headroom failed\n", ++ dhd_ifname(&dhd->pub, ifidx)); ++ ret = -ENOMEM; ++ goto done; ++ } ++ } ++ ++ /* Convert to packet */ ++ if (!(pktbuf = PKTFRMNATIVE(dhd->pub.osh, skb))) { ++ AP6210_ERR("%s: PKTFRMNATIVE failed\n", ++ dhd_ifname(&dhd->pub, ifidx)); ++ dev_kfree_skb_any(skb); ++ ret = -ENOMEM; ++ goto done; ++ } ++#ifdef WLMEDIA_HTSF ++ if (htsfdlystat_sz && PKTLEN(dhd->pub.osh, pktbuf) >= ETHER_ADDR_LEN) { ++ uint8 *pktdata = (uint8 *)PKTDATA(dhd->pub.osh, pktbuf); ++ struct ether_header *eh = (struct ether_header *)pktdata; ++ ++ if (!ETHER_ISMULTI(eh->ether_dhost) && ++ (ntoh16(eh->ether_type) == ETHER_TYPE_IP)) { ++ eh->ether_type = hton16(ETHER_TYPE_BRCM_PKTDLYSTATS); ++ } ++ } ++#endif ++ ++ ret = dhd_sendpkt(&dhd->pub, ifidx, pktbuf); ++ ++ ++done: ++ if (ret) ++ dhd->pub.dstats.tx_dropped++; ++ else ++ dhd->pub.tx_packets++; ++ ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ ++ /* Return ok: we always eat the packet */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)) ++ return 0; ++#else ++ return NETDEV_TX_OK; ++#endif ++} ++ ++void ++dhd_txflowcontrol(dhd_pub_t *dhdp, int ifidx, bool state) ++{ ++ struct net_device *net; ++ dhd_info_t *dhd = dhdp->info; ++ int i; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ASSERT(dhd); ++ ++ if (ifidx == ALL_INTERFACES) { ++ /* Flow control on all active interfaces */ ++ dhdp->txoff = state; ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ if (dhd->iflist[i]) { ++ net = dhd->iflist[i]->net; ++ if (state == ON) ++ netif_stop_queue(net); ++ else ++ netif_wake_queue(net); ++ } ++ } ++ } ++ else { ++ if (dhd->iflist[ifidx]) { ++ net = dhd->iflist[ifidx]->net; ++ if (state == ON) ++ netif_stop_queue(net); ++ else ++ netif_wake_queue(net); ++ } ++ } ++} ++ ++#ifdef DHD_RX_DUMP ++typedef struct { ++ uint16 type; ++ const char *str; ++} PKTTYPE_INFO; ++ ++static const PKTTYPE_INFO packet_type_info[] = ++{ ++ { ETHER_TYPE_IP, "IP" }, ++ { ETHER_TYPE_ARP, "ARP" }, ++ { ETHER_TYPE_BRCM, "BRCM" }, ++ { ETHER_TYPE_802_1X, "802.1X" }, ++ { ETHER_TYPE_WAI, "WAPI" }, ++ { 0, ""} ++}; ++ ++static const char *_get_packet_type_str(uint16 type) ++{ ++ int i; ++ int n = sizeof(packet_type_info)/sizeof(packet_type_info[1]) - 1; ++ ++ for (i = 0; i < n; i++) { ++ if (packet_type_info[i].type == type) ++ return packet_type_info[i].str; ++ } ++ ++ return packet_type_info[n].str; ++} ++#endif /* DHD_RX_DUMP */ ++ ++void ++dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)dhdp->info; ++ struct sk_buff *skb; ++ uchar *eth; ++ uint len; ++ void *data, *pnext = NULL; ++ int i; ++ dhd_if_t *ifp; ++ wl_event_msg_t event; ++ int tout_rx = 0; ++ int tout_ctrl = 0; ++ ++#ifdef DHD_RX_DUMP ++#ifdef DHD_RX_FULL_DUMP ++ int k; ++#endif /* DHD_RX_FULL_DUMP */ ++ char *dump_data; ++ uint16 protocol; ++#endif /* DHD_RX_DUMP */ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ for (i = 0; pktbuf && i < numpkt; i++, pktbuf = pnext) { ++#ifdef WLBTAMP ++ struct ether_header *eh; ++ struct dot11_llc_snap_header *lsh; ++#endif ++ ++ ifp = dhd->iflist[ifidx]; ++ if (ifp == NULL) { ++ AP6210_ERR("%s: ifp is NULL. drop packet\n", ++ __FUNCTION__); ++ PKTFREE(dhdp->osh, pktbuf, TRUE); ++ continue; ++ } ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) ++ /* Dropping packets before registering net device to avoid kernel panic */ ++#ifndef PROP_TXSTATUS_VSDB ++ if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED) { ++#else ++ if (!ifp->net || ifp->net->reg_state != NETREG_REGISTERED || !dhd->pub.up) { ++#endif /* PROP_TXSTATUS_VSDB */ ++ AP6210_ERR("%s: net device is NOT registered yet. drop packet\n", ++ __FUNCTION__); ++ PKTFREE(dhdp->osh, pktbuf, TRUE); ++ continue; ++ } ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) */ ++ ++ pnext = PKTNEXT(dhdp->osh, pktbuf); ++ PKTSETNEXT(wl->sh.osh, pktbuf, NULL); ++ ++#ifdef WLBTAMP ++ eh = (struct ether_header *)PKTDATA(wl->sh.osh, pktbuf); ++ lsh = (struct dot11_llc_snap_header *)&eh[1]; ++ ++ if ((ntoh16(eh->ether_type) < ETHER_TYPE_MIN) && ++ (PKTLEN(wl->sh.osh, pktbuf) >= RFC1042_HDR_LEN) && ++ bcmp(lsh, BT_SIG_SNAP_MPROT, DOT11_LLC_SNAP_HDR_LEN - 2) == 0 && ++ lsh->type == HTON16(BTA_PROT_L2CAP)) { ++ amp_hci_ACL_data_t *ACL_data = (amp_hci_ACL_data_t *) ++ ((uint8 *)eh + RFC1042_HDR_LEN); ++ ACL_data = NULL; ++ } ++#endif /* WLBTAMP */ ++ ++#ifdef PROP_TXSTATUS ++ if (dhdp->wlfc_state && PKTLEN(wl->sh.osh, pktbuf) == 0) { ++ /* WLFC may send header only packet when ++ there is an urgent message but no packet to ++ piggy-back on ++ */ ++ ((athost_wl_status_info_t*)dhdp->wlfc_state)->stats.wlfc_header_only_pkt++; ++ PKTFREE(dhdp->osh, pktbuf, TRUE); ++ continue; ++ } ++#endif ++ ++ skb = PKTTONATIVE(dhdp->osh, pktbuf); ++ ++ /* Get the protocol, maintain skb around eth_type_trans() ++ * The main reason for this hack is for the limitation of ++ * Linux 2.4 where 'eth_type_trans' uses the 'net->hard_header_len' ++ * to perform skb_pull inside vs ETH_HLEN. Since to avoid ++ * coping of the packet coming from the network stack to add ++ * BDC, Hardware header etc, during network interface registration ++ * we set the 'net->hard_header_len' to ETH_HLEN + extra space required ++ * for BDC, Hardware header etc. and not just the ETH_HLEN ++ */ ++ eth = skb->data; ++ len = skb->len; ++ ++#ifdef DHD_RX_DUMP ++ dump_data = skb->data; ++ protocol = (dump_data[12] << 8) | dump_data[13]; ++ AP6210_ERR("RX DUMP - %s\n", _get_packet_type_str(protocol)); ++ ++#ifdef DHD_RX_FULL_DUMP ++ if (protocol != ETHER_TYPE_BRCM) { ++ for (k = 0; k < skb->len; k++) { ++ AP6210_ERR("%02X ", dump_data[k])); ++ if ((k & 15) == 15) ++ AP6210_ERR("\n"); ++ } ++ AP6210_ERR("\n"); ++ } ++#endif /* DHD_RX_FULL_DUMP */ ++ ++ if (protocol != ETHER_TYPE_BRCM) { ++ if (dump_data[0] == 0xFF) { ++ AP6210_ERR("%s: BROADCAST\n", __FUNCTION__); ++ ++ if ((dump_data[12] == 8) && ++ (dump_data[13] == 6)) { ++ AP6210_ERR("%s: ARP %d\n", ++ __FUNCTION__, dump_data[0x15]); ++ } ++ } else if (dump_data[0] & 1) { ++ AP6210_ERR("%s: MULTICAST: " MACDBG "\n", ++ __FUNCTION__, MAC2STRDBG(dump_data)); ++ } ++ ++ if (protocol == ETHER_TYPE_802_1X) { ++ AP6210_ERR("ETHER_TYPE_802_1X: " ++ "ver %d, type %d, replay %d\n", ++ dump_data[14], dump_data[15], ++ dump_data[30]); ++ } ++ } ++ ++#endif /* DHD_RX_DUMP */ ++ ++ ifp = dhd->iflist[ifidx]; ++ if (ifp == NULL) ++ ifp = dhd->iflist[0]; ++ ++ ASSERT(ifp); ++ skb->dev = ifp->net; ++ skb->protocol = eth_type_trans(skb, skb->dev); ++ ++ if (skb->pkt_type == PACKET_MULTICAST) { ++ dhd->pub.rx_multicast++; ++ } ++ ++ skb->data = eth; ++ skb->len = len; ++ ++#ifdef WLMEDIA_HTSF ++ dhd_htsf_addrxts(dhdp, pktbuf); ++#endif ++ /* Strip header, count, deliver upward */ ++ skb_pull(skb, ETH_HLEN); ++ ++ /* Process special event packets and then discard them */ ++ if (ntoh16(skb->protocol) == ETHER_TYPE_BRCM) { ++ dhd_wl_host_event(dhd, &ifidx, ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) ++ skb->mac_header, ++#else ++ skb->mac.raw, ++#endif ++ &event, ++ &data); ++ ++ wl_event_to_host_order(&event); ++ if (!tout_ctrl) ++ tout_ctrl = DHD_PACKET_TIMEOUT_MS; ++#ifdef WLBTAMP ++ if (event.event_type == WLC_E_BTA_HCI_EVENT) { ++ dhd_bta_doevt(dhdp, data, event.datalen); ++ } ++#endif /* WLBTAMP */ ++ ++#if defined(PNO_SUPPORT) ++ if (event.event_type == WLC_E_PFN_NET_FOUND) { ++ /* enforce custom wake lock to garantee that Kernel not suspended */ ++ tout_ctrl = CUSTOM_PNO_EVENT_LOCK_xTIME * DHD_PACKET_TIMEOUT_MS; ++ } ++#endif /* PNO_SUPPORT */ ++ ++#ifdef DHD_DONOT_FORWARD_BCMEVENT_AS_NETWORK_PKT ++ PKTFREE(dhdp->osh, pktbuf, TRUE); ++ continue; ++#endif ++ } else { ++ tout_rx = DHD_PACKET_TIMEOUT_MS; ++ } ++ ++ ASSERT(ifidx < DHD_MAX_IFS && dhd->iflist[ifidx]); ++ if (dhd->iflist[ifidx] && !dhd->iflist[ifidx]->state) ++ ifp = dhd->iflist[ifidx]; ++ ++ if (ifp->net) ++ ifp->net->last_rx = jiffies; ++ ++ dhdp->dstats.rx_bytes += skb->len; ++ dhdp->rx_packets++; /* Local count */ ++ ++ if (in_interrupt()) { ++ netif_rx(skb); ++ } else { ++ /* If the receive is not processed inside an ISR, ++ * the softirqd must be woken explicitly to service ++ * the NET_RX_SOFTIRQ. In 2.6 kernels, this is handled ++ * by netif_rx_ni(), but in earlier kernels, we need ++ * to do it manually. ++ */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) ++ netif_rx_ni(skb); ++#else ++ ulong flags; ++ netif_rx(skb); ++ local_irq_save(flags); ++ RAISE_RX_SOFTIRQ(); ++ local_irq_restore(flags); ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) */ ++ } ++ } ++ ++ DHD_OS_WAKE_LOCK_RX_TIMEOUT_ENABLE(dhdp, tout_rx); ++ DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(dhdp, tout_ctrl); ++} ++ ++void ++dhd_event(struct dhd_info *dhd, char *evpkt, int evlen, int ifidx) ++{ ++ /* Linux version has nothing to do */ ++ return; ++} ++ ++void ++dhd_txcomplete(dhd_pub_t *dhdp, void *txp, bool success) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(dhdp->info); ++ struct ether_header *eh; ++ uint16 type; ++#ifdef WLBTAMP ++ uint len; ++#endif ++ ++ dhd_prot_hdrpull(dhdp, NULL, txp, NULL, NULL); ++ ++ eh = (struct ether_header *)PKTDATA(dhdp->osh, txp); ++ type = ntoh16(eh->ether_type); ++ ++ if (type == ETHER_TYPE_802_1X) ++ atomic_dec(&dhd->pend_8021x_cnt); ++ ++#ifdef WLBTAMP ++ /* Crack open the packet and check to see if it is BT HCI ACL data packet. ++ * If yes generate packet completion event. ++ */ ++ len = PKTLEN(dhdp->osh, txp); ++ ++ /* Generate ACL data tx completion event locally to avoid SDIO bus transaction */ ++ if ((type < ETHER_TYPE_MIN) && (len >= RFC1042_HDR_LEN)) { ++ struct dot11_llc_snap_header *lsh = (struct dot11_llc_snap_header *)&eh[1]; ++ ++ if (bcmp(lsh, BT_SIG_SNAP_MPROT, DOT11_LLC_SNAP_HDR_LEN - 2) == 0 && ++ ntoh16(lsh->type) == BTA_PROT_L2CAP) { ++ ++ dhd_bta_tx_hcidata_complete(dhdp, txp, success); ++ } ++ } ++#endif /* WLBTAMP */ ++} ++ ++static struct net_device_stats * ++dhd_get_stats(struct net_device *net) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); ++ dhd_if_t *ifp; ++ int ifidx; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ifidx = dhd_net2idx(dhd, net); ++ if (ifidx == DHD_BAD_IF) { ++ AP6210_ERR("%s: BAD_IF\n", __FUNCTION__); ++ return NULL; ++ } ++ ++ ifp = dhd->iflist[ifidx]; ++ ASSERT(dhd && ifp); ++ ++ if (dhd->pub.up) { ++ /* Use the protocol to get dongle stats */ ++ dhd_prot_dstats(&dhd->pub); ++ } ++ ++ /* Copy dongle stats to net device stats */ ++ ifp->stats.rx_packets = dhd->pub.dstats.rx_packets; ++ ifp->stats.tx_packets = dhd->pub.dstats.tx_packets; ++ ifp->stats.rx_bytes = dhd->pub.dstats.rx_bytes; ++ ifp->stats.tx_bytes = dhd->pub.dstats.tx_bytes; ++ ifp->stats.rx_errors = dhd->pub.dstats.rx_errors; ++ ifp->stats.tx_errors = dhd->pub.dstats.tx_errors; ++ ifp->stats.rx_dropped = dhd->pub.dstats.rx_dropped; ++ ifp->stats.tx_dropped = dhd->pub.dstats.tx_dropped; ++ ifp->stats.multicast = dhd->pub.dstats.multicast; ++ ++ return &ifp->stats; ++} ++ ++#ifdef DHDTHREAD ++static int ++dhd_watchdog_thread(void *data) ++{ ++ tsk_ctl_t *tsk = (tsk_ctl_t *)data; ++ dhd_info_t *dhd = (dhd_info_t *)tsk->parent; ++ /* This thread doesn't need any user-level access, ++ * so get rid of all our resources ++ */ ++ if (dhd_watchdog_prio > 0) { ++ struct sched_param param; ++ param.sched_priority = (dhd_watchdog_prio < MAX_RT_PRIO)? ++ dhd_watchdog_prio:(MAX_RT_PRIO-1); ++ setScheduler(current, SCHED_FIFO, ¶m); ++ } ++#ifndef USE_KTHREAD_API ++ DAEMONIZE("dhd_watchdog"); ++ ++ /* Run until signal received */ ++ complete(&tsk->completed); ++#endif ++ ++ while (1) ++ if (down_interruptible (&tsk->sema) == 0) { ++ unsigned long flags; ++ unsigned long jiffies_at_start = jiffies; ++ unsigned long time_lapse; ++ ++ SMP_RD_BARRIER_DEPENDS(); ++ if (tsk->terminated) { ++ break; ++ } ++ ++ dhd_os_sdlock(&dhd->pub); ++ if (dhd->pub.dongle_reset == FALSE) { ++ AP6210_DEBUG("%s:\n", __FUNCTION__); ++ ++ /* Call the bus module watchdog */ ++ dhd_bus_watchdog(&dhd->pub); ++ ++ flags = dhd_os_spin_lock(&dhd->pub); ++ /* Count the tick for reference */ ++ dhd->pub.tickcnt++; ++ time_lapse = jiffies - jiffies_at_start; ++ ++ /* Reschedule the watchdog */ ++ if (dhd->wd_timer_valid) ++ mod_timer(&dhd->timer, ++ jiffies + ++ msecs_to_jiffies(dhd_watchdog_ms) - ++ min(msecs_to_jiffies(dhd_watchdog_ms), time_lapse)); ++ dhd_os_spin_unlock(&dhd->pub, flags); ++ } ++ dhd_os_sdunlock(&dhd->pub); ++ } else { ++ break; ++ } ++ ++ complete_and_exit(&tsk->completed, 0); ++} ++#endif /* DHDTHREAD */ ++ ++static void dhd_watchdog(ulong data) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)data; ++ unsigned long flags; ++ ++ if (dhd->pub.dongle_reset) { ++ return; ++ } ++ ++#ifdef DHDTHREAD ++ if (dhd->thr_wdt_ctl.thr_pid >= 0) { ++ up(&dhd->thr_wdt_ctl.sema); ++ return; ++ } ++#endif /* DHDTHREAD */ ++ ++ dhd_os_sdlock(&dhd->pub); ++ /* Call the bus module watchdog */ ++ dhd_bus_watchdog(&dhd->pub); ++ ++ flags = dhd_os_spin_lock(&dhd->pub); ++ /* Count the tick for reference */ ++ dhd->pub.tickcnt++; ++ ++ /* Reschedule the watchdog */ ++ if (dhd->wd_timer_valid) ++ mod_timer(&dhd->timer, jiffies + msecs_to_jiffies(dhd_watchdog_ms)); ++ dhd_os_spin_unlock(&dhd->pub, flags); ++ dhd_os_sdunlock(&dhd->pub); ++} ++ ++#ifdef DHDTHREAD ++static int ++dhd_dpc_thread(void *data) ++{ ++ tsk_ctl_t *tsk = (tsk_ctl_t *)data; ++ dhd_info_t *dhd = (dhd_info_t *)tsk->parent; ++ ++ /* This thread doesn't need any user-level access, ++ * so get rid of all our resources ++ */ ++ if (dhd_dpc_prio > 0) ++ { ++ struct sched_param param; ++ param.sched_priority = (dhd_dpc_prio < MAX_RT_PRIO)?dhd_dpc_prio:(MAX_RT_PRIO-1); ++ setScheduler(current, SCHED_FIFO, ¶m); ++ } ++#ifndef USE_KTHREAD_API ++ DAEMONIZE("dhd_dpc"); ++ /* DHD_OS_WAKE_LOCK is called in dhd_sched_dpc[dhd_linux.c] down below */ ++ ++ /* signal: thread has started */ ++ complete(&tsk->completed); ++#endif ++ ++ /* Run until signal received */ ++ while (1) { ++ if (down_interruptible(&tsk->sema) == 0) { ++ ++ SMP_RD_BARRIER_DEPENDS(); ++ if (tsk->terminated) { ++ break; ++ } ++ ++ /* Call bus dpc unless it indicated down (then clean stop) */ ++ if (dhd->pub.busstate != DHD_BUS_DOWN) { ++ if (dhd_bus_dpc(dhd->pub.bus)) { ++ up(&tsk->sema); ++ } ++ else { ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ } ++ } else { ++ if (dhd->pub.up) ++ dhd_bus_stop(dhd->pub.bus, TRUE); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ } ++ } ++ else ++ break; ++ } ++ ++ complete_and_exit(&tsk->completed, 0); ++} ++#endif /* DHDTHREAD */ ++ ++static void ++dhd_dpc(ulong data) ++{ ++ dhd_info_t *dhd; ++ ++ dhd = (dhd_info_t *)data; ++ ++ /* this (tasklet) can be scheduled in dhd_sched_dpc[dhd_linux.c] ++ * down below , wake lock is set, ++ * the tasklet is initialized in dhd_attach() ++ */ ++ /* Call bus dpc unless it indicated down (then clean stop) */ ++ if (dhd->pub.busstate != DHD_BUS_DOWN) { ++ if (dhd_bus_dpc(dhd->pub.bus)) ++ tasklet_schedule(&dhd->tasklet); ++ else ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ } else { ++ dhd_bus_stop(dhd->pub.bus, TRUE); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ } ++} ++ ++void ++dhd_sched_dpc(dhd_pub_t *dhdp) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)dhdp->info; ++ ++ DHD_OS_WAKE_LOCK(dhdp); ++#ifdef DHDTHREAD ++ if (dhd->thr_dpc_ctl.thr_pid >= 0) { ++ up(&dhd->thr_dpc_ctl.sema); ++ return; ++ } ++#endif /* DHDTHREAD */ ++ ++ if (dhd->dhd_tasklet_create) ++ tasklet_schedule(&dhd->tasklet); ++} ++ ++#ifdef TOE ++/* Retrieve current toe component enables, which are kept as a bitmap in toe_ol iovar */ ++static int ++dhd_toe_get(dhd_info_t *dhd, int ifidx, uint32 *toe_ol) ++{ ++ wl_ioctl_t ioc; ++ char buf[32]; ++ int ret; ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ++ ioc.cmd = WLC_GET_VAR; ++ ioc.buf = buf; ++ ioc.len = (uint)sizeof(buf); ++ ioc.set = FALSE; ++ ++ strncpy(buf, "toe_ol", sizeof(buf) - 1); ++ buf[sizeof(buf) - 1] = '\0'; ++ if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { ++ /* Check for older dongle image that doesn't support toe_ol */ ++ if (ret == -EIO) { ++ AP6210_ERR("%s: toe not supported by device\n", ++ dhd_ifname(&dhd->pub, ifidx)); ++ return -EOPNOTSUPP; ++ } ++ ++ AP6210_DEBUG("%s: could not get toe_ol: ret=%d\n", dhd_ifname(&dhd->pub, ifidx), ret); ++ return ret; ++ } ++ ++ memcpy(toe_ol, buf, sizeof(uint32)); ++ return 0; ++} ++ ++/* Set current toe component enables in toe_ol iovar, and set toe global enable iovar */ ++static int ++dhd_toe_set(dhd_info_t *dhd, int ifidx, uint32 toe_ol) ++{ ++ wl_ioctl_t ioc; ++ char buf[32]; ++ int toe, ret; ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ++ ioc.cmd = WLC_SET_VAR; ++ ioc.buf = buf; ++ ioc.len = (uint)sizeof(buf); ++ ioc.set = TRUE; ++ ++ /* Set toe_ol as requested */ ++ ++ strncpy(buf, "toe_ol", sizeof(buf) - 1); ++ buf[sizeof(buf) - 1] = '\0'; ++ memcpy(&buf[sizeof("toe_ol")], &toe_ol, sizeof(uint32)); ++ ++ if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { ++ AP6210_ERR("%s: could not set toe_ol: ret=%d\n", ++ dhd_ifname(&dhd->pub, ifidx), ret); ++ return ret; ++ } ++ ++ /* Enable toe globally only if any components are enabled. */ ++ ++ toe = (toe_ol != 0); ++ ++ strcpy(buf, "toe"); ++ memcpy(&buf[sizeof("toe")], &toe, sizeof(uint32)); ++ ++ if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { ++ AP6210_ERR("%s: could not set toe: ret=%d\n", dhd_ifname(&dhd->pub, ifidx), ret); ++ return ret; ++ } ++ ++ return 0; ++} ++#endif /* TOE */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) ++static void ++dhd_ethtool_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); ++ ++ snprintf(info->driver, sizeof(info->driver), "wl"); ++ snprintf(info->version, sizeof(info->version), "%lu", dhd->pub.drv_version); ++} ++ ++struct ethtool_ops dhd_ethtool_ops = { ++ .get_drvinfo = dhd_ethtool_get_drvinfo ++}; ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ ++ ++ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 2) ++static int ++dhd_ethtool(dhd_info_t *dhd, void *uaddr) ++{ ++ struct ethtool_drvinfo info; ++ char drvname[sizeof(info.driver)]; ++ uint32 cmd; ++#ifdef TOE ++ struct ethtool_value edata; ++ uint32 toe_cmpnt, csum_dir; ++ int ret; ++#endif ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ /* all ethtool calls start with a cmd word */ ++ if (copy_from_user(&cmd, uaddr, sizeof (uint32))) ++ return -EFAULT; ++ ++ switch (cmd) { ++ case ETHTOOL_GDRVINFO: ++ /* Copy out any request driver name */ ++ if (copy_from_user(&info, uaddr, sizeof(info))) ++ return -EFAULT; ++ strncpy(drvname, info.driver, sizeof(info.driver)); ++ drvname[sizeof(info.driver)-1] = '\0'; ++ ++ /* clear struct for return */ ++ memset(&info, 0, sizeof(info)); ++ info.cmd = cmd; ++ ++ /* if dhd requested, identify ourselves */ ++ if (strcmp(drvname, "?dhd") == 0) { ++ snprintf(info.driver, sizeof(info.driver), "dhd"); ++ strncpy(info.version, EPI_VERSION_STR, sizeof(info.version) - 1); ++ info.version[sizeof(info.version) - 1] = '\0'; ++ } ++ ++ /* otherwise, require dongle to be up */ ++ else if (!dhd->pub.up) { ++ AP6210_ERR("%s: dongle is not up\n", __FUNCTION__); ++ return -ENODEV; ++ } ++ ++ /* finally, report dongle driver type */ ++ else if (dhd->pub.iswl) ++ snprintf(info.driver, sizeof(info.driver), "wl"); ++ else ++ snprintf(info.driver, sizeof(info.driver), "xx"); ++ ++ snprintf(info.version, sizeof(info.version), "%lu", dhd->pub.drv_version); ++ if (copy_to_user(uaddr, &info, sizeof(info))) ++ return -EFAULT; ++ AP6210_DEBUG("%s: given %*s, returning %s\n", __FUNCTION__, ++ (int)sizeof(drvname), drvname, info.driver); ++ break; ++ ++#ifdef TOE ++ /* Get toe offload components from dongle */ ++ case ETHTOOL_GRXCSUM: ++ case ETHTOOL_GTXCSUM: ++ if ((ret = dhd_toe_get(dhd, 0, &toe_cmpnt)) < 0) ++ return ret; ++ ++ csum_dir = (cmd == ETHTOOL_GTXCSUM) ? TOE_TX_CSUM_OL : TOE_RX_CSUM_OL; ++ ++ edata.cmd = cmd; ++ edata.data = (toe_cmpnt & csum_dir) ? 1 : 0; ++ ++ if (copy_to_user(uaddr, &edata, sizeof(edata))) ++ return -EFAULT; ++ break; ++ ++ /* Set toe offload components in dongle */ ++ case ETHTOOL_SRXCSUM: ++ case ETHTOOL_STXCSUM: ++ if (copy_from_user(&edata, uaddr, sizeof(edata))) ++ return -EFAULT; ++ ++ /* Read the current settings, update and write back */ ++ if ((ret = dhd_toe_get(dhd, 0, &toe_cmpnt)) < 0) ++ return ret; ++ ++ csum_dir = (cmd == ETHTOOL_STXCSUM) ? TOE_TX_CSUM_OL : TOE_RX_CSUM_OL; ++ ++ if (edata.data != 0) ++ toe_cmpnt |= csum_dir; ++ else ++ toe_cmpnt &= ~csum_dir; ++ ++ if ((ret = dhd_toe_set(dhd, 0, toe_cmpnt)) < 0) ++ return ret; ++ ++ /* If setting TX checksum mode, tell Linux the new mode */ ++ if (cmd == ETHTOOL_STXCSUM) { ++ if (edata.data) ++ dhd->iflist[0]->net->features |= NETIF_F_IP_CSUM; ++ else ++ dhd->iflist[0]->net->features &= ~NETIF_F_IP_CSUM; ++ } ++ ++ break; ++#endif /* TOE */ ++ ++ default: ++ return -EOPNOTSUPP; ++ } ++ ++ return 0; ++} ++#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 2) */ ++ ++static bool dhd_check_hang(struct net_device *net, dhd_pub_t *dhdp, int error) ++{ ++ dhd_info_t * dhd; ++ ++ if (!dhdp) ++ return FALSE; ++ ++ dhd = (dhd_info_t *)dhdp->info; ++ if (dhd->thr_sysioc_ctl.thr_pid < 0) { ++ AP6210_ERR("%s : skipped due to negative pid - unloading?\n", __FUNCTION__); ++ return FALSE; ++ } ++ ++ if ((error == -ETIMEDOUT) || (error == -EREMOTEIO) || ++ ((dhdp->busstate == DHD_BUS_DOWN) && (!dhdp->dongle_reset))) { ++ AP6210_ERR("%s: Event HANG send up due to re=%d te=%d e=%d s=%d\n", __FUNCTION__, ++ dhdp->rxcnt_timeout, dhdp->txcnt_timeout, error, dhdp->busstate); ++ net_os_send_hang_message(net); ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++static int ++dhd_ioctl_entry(struct net_device *net, struct ifreq *ifr, int cmd) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); ++ dhd_ioctl_t ioc; ++ int bcmerror = 0; ++ int buflen = 0; ++ void *buf = NULL; ++ uint driver = 0; ++ int ifidx; ++ int ret; ++ ++ DHD_OS_WAKE_LOCK(&dhd->pub); ++ ++ /* send to dongle only if we are not waiting for reload already */ ++ if (dhd->pub.hang_was_sent) { ++ AP6210_ERR("%s: HANG was sent up earlier\n", __FUNCTION__); ++ DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE(&dhd->pub, DHD_EVENT_TIMEOUT_MS); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return OSL_ERROR(BCME_DONGLE_DOWN); ++ } ++ ++ ifidx = dhd_net2idx(dhd, net); ++ AP6210_DEBUG("%s: ifidx %d, cmd 0x%04x\n", __FUNCTION__, ifidx, cmd); ++ ++ if (ifidx == DHD_BAD_IF) { ++ AP6210_ERR("%s: BAD IF\n", __FUNCTION__); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return -1; ++ } ++ ++#if defined(CONFIG_WIRELESS_EXT) ++ /* linux wireless extensions */ ++ if ((cmd >= SIOCIWFIRST) && (cmd <= SIOCIWLAST)) { ++ /* may recurse, do NOT lock */ ++ ret = wl_iw_ioctl(net, ifr, cmd); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return ret; ++ } ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 2) ++ if (cmd == SIOCETHTOOL) { ++ ret = dhd_ethtool(dhd, (void*)ifr->ifr_data); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return ret; ++ } ++#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 2) */ ++ ++ if (cmd == SIOCDEVPRIVATE+1) { ++ ret = wl_android_priv_cmd(net, ifr, cmd); ++ dhd_check_hang(net, &dhd->pub, ret); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return ret; ++ } ++ ++ if (cmd != SIOCDEVPRIVATE) { ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return -EOPNOTSUPP; ++ } ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ++ /* Copy the ioc control structure part of ioctl request */ ++ if (copy_from_user(&ioc, ifr->ifr_data, sizeof(wl_ioctl_t))) { ++ bcmerror = BCME_BADADDR; ++ goto done; ++ } ++ ++ /* Copy out any buffer passed */ ++ if (ioc.buf) { ++ if (ioc.len == 0) { ++ AP6210_DEBUG("%s: ioc.len=0, returns BCME_BADARG \n", __FUNCTION__); ++ bcmerror = BCME_BADARG; ++ goto done; ++ } ++ buflen = MIN(ioc.len, DHD_IOCTL_MAXLEN); ++ /* optimization for direct ioctl calls from kernel */ ++ /* ++ if (segment_eq(get_fs(), KERNEL_DS)) { ++ buf = ioc.buf; ++ } else { ++ */ ++ { ++ if (!(buf = (char*)MALLOC(dhd->pub.osh, buflen))) { ++ bcmerror = BCME_NOMEM; ++ goto done; ++ } ++ if (copy_from_user(buf, ioc.buf, buflen)) { ++ bcmerror = BCME_BADADDR; ++ goto done; ++ } ++ } ++ } ++ ++ /* To differentiate between wl and dhd read 4 more byes */ ++ if ((copy_from_user(&driver, (char *)ifr->ifr_data + sizeof(wl_ioctl_t), ++ sizeof(uint)) != 0)) { ++ bcmerror = BCME_BADADDR; ++ goto done; ++ } ++ ++ if (!capable(CAP_NET_ADMIN)) { ++ bcmerror = BCME_EPERM; ++ goto done; ++ } ++ ++ /* check for local dhd ioctl and handle it */ ++ if (driver == DHD_IOCTL_MAGIC) { ++ bcmerror = dhd_ioctl((void *)&dhd->pub, &ioc, buf, buflen); ++ if (bcmerror) ++ dhd->pub.bcmerror = bcmerror; ++ goto done; ++ } ++ ++ /* send to dongle (must be up, and wl). */ ++ if (dhd->pub.busstate != DHD_BUS_DATA) { ++ bcmerror = BCME_DONGLE_DOWN; ++ goto done; ++ } ++ ++ if (!dhd->pub.iswl) { ++ bcmerror = BCME_DONGLE_DOWN; ++ goto done; ++ } ++ ++ /* ++ * Flush the TX queue if required for proper message serialization: ++ * Intercept WLC_SET_KEY IOCTL - serialize M4 send and set key IOCTL to ++ * prevent M4 encryption and ++ * intercept WLC_DISASSOC IOCTL - serialize WPS-DONE and WLC_DISASSOC IOCTL to ++ * prevent disassoc frame being sent before WPS-DONE frame. ++ */ ++ if (ioc.cmd == WLC_SET_KEY || ++ (ioc.cmd == WLC_SET_VAR && ioc.buf != NULL && ++ strncmp("wsec_key", ioc.buf, 9) == 0) || ++ (ioc.cmd == WLC_SET_VAR && ioc.buf != NULL && ++ strncmp("bsscfg:wsec_key", ioc.buf, 15) == 0) || ++ ioc.cmd == WLC_DISASSOC) ++ dhd_wait_pend8021x(net); ++ ++#ifdef WLMEDIA_HTSF ++ if (ioc.buf) { ++ /* short cut wl ioctl calls here */ ++ if (strcmp("htsf", ioc.buf) == 0) { ++ dhd_ioctl_htsf_get(dhd, 0); ++ return BCME_OK; ++ } ++ ++ if (strcmp("htsflate", ioc.buf) == 0) { ++ if (ioc.set) { ++ memset(ts, 0, sizeof(tstamp_t)*TSMAX); ++ memset(&maxdelayts, 0, sizeof(tstamp_t)); ++ maxdelay = 0; ++ tspktcnt = 0; ++ maxdelaypktno = 0; ++ memset(&vi_d1.bin, 0, sizeof(uint32)*NUMBIN); ++ memset(&vi_d2.bin, 0, sizeof(uint32)*NUMBIN); ++ memset(&vi_d3.bin, 0, sizeof(uint32)*NUMBIN); ++ memset(&vi_d4.bin, 0, sizeof(uint32)*NUMBIN); ++ } else { ++ dhd_dump_latency(); ++ } ++ return BCME_OK; ++ } ++ if (strcmp("htsfclear", ioc.buf) == 0) { ++ memset(&vi_d1.bin, 0, sizeof(uint32)*NUMBIN); ++ memset(&vi_d2.bin, 0, sizeof(uint32)*NUMBIN); ++ memset(&vi_d3.bin, 0, sizeof(uint32)*NUMBIN); ++ memset(&vi_d4.bin, 0, sizeof(uint32)*NUMBIN); ++ htsf_seqnum = 0; ++ return BCME_OK; ++ } ++ if (strcmp("htsfhis", ioc.buf) == 0) { ++ dhd_dump_htsfhisto(&vi_d1, "H to D"); ++ dhd_dump_htsfhisto(&vi_d2, "D to D"); ++ dhd_dump_htsfhisto(&vi_d3, "D to H"); ++ dhd_dump_htsfhisto(&vi_d4, "H to H"); ++ return BCME_OK; ++ } ++ if (strcmp("tsport", ioc.buf) == 0) { ++ if (ioc.set) { ++ memcpy(&tsport, ioc.buf + 7, 4); ++ } else { ++ AP6210_ERR("current timestamp port: %d \n", tsport); ++ } ++ return BCME_OK; ++ } ++ } ++#endif /* WLMEDIA_HTSF */ ++ ++ if ((ioc.cmd == WLC_SET_VAR || ioc.cmd == WLC_GET_VAR) && ++ ioc.buf != NULL && strncmp("rpc_", ioc.buf, 4) == 0) { ++#ifdef BCM_FD_AGGR ++ bcmerror = dhd_fdaggr_ioctl(&dhd->pub, ifidx, (wl_ioctl_t *)&ioc, buf, buflen); ++#else ++ bcmerror = BCME_UNSUPPORTED; ++#endif ++ goto done; ++ } ++ bcmerror = dhd_wl_ioctl(&dhd->pub, ifidx, (wl_ioctl_t *)&ioc, buf, buflen); ++ ++done: ++ dhd_check_hang(net, &dhd->pub, bcmerror); ++ ++ if (!bcmerror && buf && ioc.buf) { ++ if (copy_to_user(ioc.buf, buf, buflen)) ++ bcmerror = -EFAULT; ++ } ++ ++ if (buf) ++ MFREE(dhd->pub.osh, buf, buflen); ++ ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ ++ return OSL_ERROR(bcmerror); ++} ++ ++#ifdef WL_CFG80211 ++static int ++dhd_cleanup_virt_ifaces(dhd_info_t *dhd) ++{ ++ int i = 1; /* Leave ifidx 0 [Primary Interface] */ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ int rollback_lock = FALSE; ++#endif ++ ++ AP6210_DEBUG("%s: Enter \n", __func__); ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ /* release lock for unregister_netdev */ ++ if (rtnl_is_locked()) { ++ rtnl_unlock(); ++ rollback_lock = TRUE; ++ } ++#endif ++ ++ for (i = 1; i < DHD_MAX_IFS; i++) { ++ dhd_net_if_lock_local(dhd); ++ if (dhd->iflist[i]) { ++ AP6210_DEBUG("Deleting IF: %d \n", i); ++ if ((dhd->iflist[i]->state != DHD_IF_DEL) && ++ (dhd->iflist[i]->state != DHD_IF_DELETING)) { ++ dhd->iflist[i]->state = DHD_IF_DEL; ++ dhd->iflist[i]->idx = i; ++ dhd_op_if(dhd->iflist[i]); ++ } ++ } ++ dhd_net_if_unlock_local(dhd); ++ } ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ if (rollback_lock) ++ rtnl_lock(); ++#endif ++ ++ return 0; ++} ++#endif /* WL_CFG80211 */ ++ ++ ++static int ++dhd_stop(struct net_device *net) ++{ ++ int ifidx = 0; ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); ++ DHD_OS_WAKE_LOCK(&dhd->pub); ++ AP6210_DEBUG("%s: Enter %p\n", __FUNCTION__, net); ++ if (dhd->pub.up == 0) { ++ goto exit; ++ } ++ ifidx = dhd_net2idx(dhd, net); ++ BCM_REFERENCE(ifidx); ++ ++ /* Set state and stop OS transmissions */ ++ netif_stop_queue(net); ++ dhd->pub.up = 0; ++ ++#ifdef WL_CFG80211 ++ if (ifidx == 0) { ++ wl_cfg80211_down(NULL); ++ ++ /* ++ * For CFG80211: Clean up all the left over virtual interfaces ++ * when the primary Interface is brought down. [ifconfig wlan0 down] ++ */ ++ if ((dhd->dhd_state & DHD_ATTACH_STATE_ADD_IF) && ++ (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211)) { ++ dhd_cleanup_virt_ifaces(dhd); ++ } ++ } ++#endif ++ ++#ifdef PROP_TXSTATUS ++ dhd_os_wlfc_block(&dhd->pub); ++ dhd_wlfc_cleanup(&dhd->pub); ++ dhd_os_wlfc_unblock(&dhd->pub); ++#endif ++ /* Stop the protocol module */ ++ dhd_prot_stop(&dhd->pub); ++ ++ OLD_MOD_DEC_USE_COUNT; ++exit: ++#if defined(WL_CFG80211) ++ if (ifidx == 0) { ++ if (!dhd_download_fw_on_driverload) ++ wl_android_wifi_off(net); ++ } ++#endif ++ dhd->pub.rxcnt_timeout = 0; ++ dhd->pub.txcnt_timeout = 0; ++ ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ return 0; ++} ++ ++static int ++dhd_open(struct net_device *net) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(net); ++#ifdef TOE ++ uint32 toe_ol; ++#endif ++ int ifidx; ++ int32 ret = 0; ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ if (mutex_is_locked(&_dhd_sdio_mutex_lock_) != 0) { ++ AP6210_ERR("%s : dhd_open: call dev open before insmod complete!\n", __FUNCTION__); ++ } ++ mutex_lock(&_dhd_sdio_mutex_lock_); ++#endif ++ ++ AP6210_DEBUG("%s, firmware path %s\n", __func__, firmware_path); ++ ++ DHD_OS_WAKE_LOCK(&dhd->pub); ++ /* Update FW path if it was changed */ ++ if (strlen(firmware_path) != 0) { ++ if (firmware_path[strlen(firmware_path)-1] == '\n') ++ firmware_path[strlen(firmware_path)-1] = '\0'; ++ COPY_FW_PATH_BY_CHIP( dhd->pub.bus, fw_path, firmware_path); ++ } ++ ++ ++ dhd->pub.dongle_trap_occured = 0; ++ dhd->pub.hang_was_sent = 0; ++#if !defined(WL_CFG80211) ++ /* ++ * Force start if ifconfig_up gets called before START command ++ * We keep WEXT's wl_control_wl_start to provide backward compatibility ++ * This should be removed in the future ++ */ ++ ret = wl_control_wl_start(net); ++ if (ret != 0) { ++ AP6210_ERR("%s: failed with code %d\n", __FUNCTION__, ret); ++ ret = -1; ++ goto exit; ++ } ++#endif ++ ++ ifidx = dhd_net2idx(dhd, net); ++ AP6210_DEBUG("%s: ifidx %d\n", __FUNCTION__, ifidx); ++ ++ if (ifidx < 0) { ++ AP6210_ERR("%s: Error: called with invalid IF\n", __FUNCTION__); ++ ret = -1; ++ goto exit; ++ } ++ ++ if (!dhd->iflist[ifidx] || dhd->iflist[ifidx]->state == DHD_IF_DEL) { ++ AP6210_ERR("%s: Error: called when IF already deleted\n", __FUNCTION__); ++ ret = -1; ++ goto exit; ++ } ++ ++ if (ifidx == 0) { ++ atomic_set(&dhd->pend_8021x_cnt, 0); ++#if defined(WL_CFG80211) ++ AP6210_ERR("%s\n", dhd_version); ++#if defined(DHD_DEBUG) ++ AP6210_ERR("%s\n", dhd_version_info); ++#endif ++ ++ if (!dhd_download_fw_on_driverload) { ++ ret = wl_android_wifi_on(net); ++ if (ret != 0) { ++ AP6210_ERR("%s: failed with code %d\n", __FUNCTION__, ret); ++ ret = -1; ++ goto exit; ++ } ++ } else { ++ } ++#endif ++ ++ if (dhd->pub.busstate != DHD_BUS_DATA) { ++ ++ /* try to bring up bus */ ++ if ((ret = dhd_bus_start(&dhd->pub)) != 0) { ++ AP6210_ERR("%s: failed with code %d\n", __FUNCTION__, ret); ++ ret = -1; ++ goto exit; ++ } ++ ++ } ++ ++ /* dhd_prot_init has been called in dhd_bus_start or wl_android_wifi_on */ ++ memcpy(net->dev_addr, dhd->pub.mac.octet, ETHER_ADDR_LEN); ++ ++#ifdef TOE ++ /* Get current TOE mode from dongle */ ++ if (dhd_toe_get(dhd, ifidx, &toe_ol) >= 0 && (toe_ol & TOE_TX_CSUM_OL) != 0) ++ dhd->iflist[ifidx]->net->features |= NETIF_F_IP_CSUM; ++ else ++ dhd->iflist[ifidx]->net->features &= ~NETIF_F_IP_CSUM; ++#endif /* TOE */ ++ ++#if defined(WL_CFG80211) ++ if (unlikely(wl_cfg80211_up(NULL))) { ++ AP6210_ERR("%s: failed to bring up cfg80211\n", __FUNCTION__); ++ ret = -1; ++ goto exit; ++ } ++#endif /* WL_CFG80211 */ ++ } ++ ++ /* Allow transmit calls */ ++ netif_start_queue(net); ++ dhd->pub.up = 1; ++ ++#ifdef BCMDBGFS ++ dhd_dbg_init(&dhd->pub); ++#endif ++ ++ OLD_MOD_INC_USE_COUNT; ++exit: ++ if (ret) ++ dhd_stop(net); ++ ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ mutex_unlock(&_dhd_sdio_mutex_lock_); ++#endif ++ return ret; ++} ++ ++int dhd_do_driver_init(struct net_device *net) ++{ ++ dhd_info_t *dhd = NULL; ++ ++ if (!net) { ++ AP6210_ERR("Primary Interface not initialized \n"); ++ return -EINVAL; ++ } ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++#ifdef MULTIPLE_SUPPLICANT ++ if (mutex_is_locked(&_dhd_sdio_mutex_lock_) != 0) { ++ AP6210_ERR("%s : dhdsdio_probe is already running!\n", __FUNCTION__); ++ return 0; ++ } ++#endif /* MULTIPLE_SUPPLICANT */ ++#endif ++ ++ dhd = *(dhd_info_t **)netdev_priv(net); ++ ++ /* If driver is already initialized, do nothing ++ */ ++ if (dhd->pub.busstate == DHD_BUS_DATA) { ++ AP6210_DEBUG("Driver already Inititalized. Nothing to do"); ++ return 0; ++ } ++ ++ if (dhd_open(net) < 0) { ++ AP6210_ERR("Driver Init Failed \n"); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++osl_t * ++dhd_osl_attach(void *pdev, uint bustype) ++{ ++ return osl_attach(pdev, bustype, TRUE); ++} ++ ++void ++dhd_osl_detach(osl_t *osh) ++{ ++ if (MALLOCED(osh)) { ++ AP6210_ERR("%s: MEMORY LEAK %d bytes\n", __FUNCTION__, MALLOCED(osh)); ++ } ++ osl_detach(osh); ++#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ dhd_registration_check = FALSE; ++ up(&dhd_registration_sem); ++#if defined(BCMLXSDMMC) ++ up(&dhd_chipup_sem); ++#endif ++#endif ++} ++ ++int ++dhd_add_if(dhd_info_t *dhd, int ifidx, void *handle, char *name, ++ uint8 *mac_addr, uint32 flags, uint8 bssidx) ++{ ++ dhd_if_t *ifp; ++ ++ AP6210_DEBUG("%s: idx %d, handle->%p\n", __FUNCTION__, ifidx, handle); ++ ++ ASSERT(dhd && (ifidx < DHD_MAX_IFS)); ++ ++ ifp = dhd->iflist[ifidx]; ++ if (ifp != NULL) { ++ if (ifp->net != NULL) { ++ netif_stop_queue(ifp->net); ++ unregister_netdev(ifp->net); ++ free_netdev(ifp->net); ++ } ++ } else ++ if ((ifp = MALLOC(dhd->pub.osh, sizeof(dhd_if_t))) == NULL) { ++ AP6210_ERR("%s: OOM - dhd_if_t\n", __FUNCTION__); ++ return -ENOMEM; ++ } ++ ++ memset(ifp, 0, sizeof(dhd_if_t)); ++ ifp->event2cfg80211 = FALSE; ++ ifp->info = dhd; ++ dhd->iflist[ifidx] = ifp; ++ strncpy(ifp->name, name, IFNAMSIZ); ++ ifp->name[IFNAMSIZ] = '\0'; ++ if (mac_addr != NULL) ++ memcpy(&ifp->mac_addr, mac_addr, ETHER_ADDR_LEN); ++ ++ if (handle == NULL) { ++ ifp->state = DHD_IF_ADD; ++ ifp->idx = ifidx; ++ ifp->bssidx = bssidx; ++ ASSERT(dhd->thr_sysioc_ctl.thr_pid >= 0); ++ up(&dhd->thr_sysioc_ctl.sema); ++ } else ++ ifp->net = (struct net_device *)handle; ++ ++ if (ifidx == 0) { ++ ifp->event2cfg80211 = TRUE; ++ } ++ ++ return 0; ++} ++ ++void ++dhd_del_if(dhd_info_t *dhd, int ifidx) ++{ ++ dhd_if_t *ifp; ++ ++ AP6210_DEBUG("%s: idx %d\n", __FUNCTION__, ifidx); ++ ++ ASSERT(dhd && ifidx && (ifidx < DHD_MAX_IFS)); ++ ifp = dhd->iflist[ifidx]; ++ if (!ifp) { ++ AP6210_ERR("%s: Null interface\n", __FUNCTION__); ++ return; ++ } ++ ++ ifp->state = DHD_IF_DEL; ++ ifp->idx = ifidx; ++ ASSERT(dhd->thr_sysioc_ctl.thr_pid >= 0); ++ up(&dhd->thr_sysioc_ctl.sema); ++} ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) ++static struct net_device_ops dhd_ops_pri = { ++ .ndo_open = dhd_open, ++ .ndo_stop = dhd_stop, ++ .ndo_get_stats = dhd_get_stats, ++ .ndo_do_ioctl = dhd_ioctl_entry, ++ .ndo_start_xmit = dhd_start_xmit, ++ .ndo_set_mac_address = dhd_set_mac_address, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) ++ .ndo_set_rx_mode = dhd_set_multicast_list, ++#else ++ .ndo_set_multicast_list = dhd_set_multicast_list, ++#endif ++}; ++ ++static struct net_device_ops dhd_ops_virt = { ++ .ndo_get_stats = dhd_get_stats, ++ .ndo_do_ioctl = dhd_ioctl_entry, ++ .ndo_start_xmit = dhd_start_xmit, ++ .ndo_set_mac_address = dhd_set_mac_address, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) ++ .ndo_set_rx_mode = dhd_set_multicast_list, ++#else ++ .ndo_set_multicast_list = dhd_set_multicast_list, ++#endif ++}; ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) */ ++ ++dhd_pub_t * ++dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen) ++{ ++ dhd_info_t *dhd = NULL; ++ struct net_device *net = NULL; ++ ++ dhd_attach_states_t dhd_state = DHD_ATTACH_STATE_INIT; ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ AP6210_DEBUG("%s, firmware path %s\n", __func__, firmware_path); ++ ++ /* updates firmware nvram path if it was provided as module parameters */ ++ if ((firmware_path != NULL) && (firmware_path[0] != '\0')) ++ COPY_FW_PATH_BY_CHIP(bus, fw_path, firmware_path); ++ if (strlen(nvram_path) != 0) { ++ strncpy(nv_path, nvram_path, sizeof(nv_path) -1); ++ nv_path[sizeof(nv_path) -1] = '\0'; ++ } ++ ++ /* Allocate etherdev, including space for private structure */ ++ if (!(net = alloc_etherdev(sizeof(dhd)))) { ++ AP6210_ERR("%s: OOM - alloc_etherdev\n", __FUNCTION__); ++ goto fail; ++ } ++ dhd_state |= DHD_ATTACH_STATE_NET_ALLOC; ++ ++ /* Allocate primary dhd_info */ ++ if (!(dhd = MALLOC(osh, sizeof(dhd_info_t)))) { ++ AP6210_ERR("%s: OOM - alloc dhd_info\n", __FUNCTION__); ++ goto fail; ++ } ++ memset(dhd, 0, sizeof(dhd_info_t)); ++ ++#ifdef DHDTHREAD ++ dhd->thr_dpc_ctl.thr_pid = DHD_PID_KT_TL_INVALID; ++ dhd->thr_wdt_ctl.thr_pid = DHD_PID_KT_INVALID; ++#endif /* DHDTHREAD */ ++ dhd->dhd_tasklet_create = FALSE; ++ dhd->thr_sysioc_ctl.thr_pid = DHD_PID_KT_INVALID; ++ dhd_state |= DHD_ATTACH_STATE_DHD_ALLOC; ++ ++ /* ++ * Save the dhd_info into the priv ++ */ ++ memcpy((void *)netdev_priv(net), &dhd, sizeof(dhd)); ++ dhd->pub.osh = osh; ++ ++ /* Link to info module */ ++ dhd->pub.info = dhd; ++ /* Link to bus module */ ++ dhd->pub.bus = bus; ++ dhd->pub.hdrlen = bus_hdrlen; ++ ++ /* Set network interface name if it was provided as module parameter */ ++ if (iface_name[0]) { ++ int len; ++ char ch; ++ strncpy(net->name, iface_name, IFNAMSIZ); ++ net->name[IFNAMSIZ - 1] = 0; ++ len = strlen(net->name); ++ ch = net->name[len - 1]; ++ if ((ch > '9' || ch < '0') && (len < IFNAMSIZ - 2)) ++ strcat(net->name, "%d"); ++ } ++ ++ if (dhd_add_if(dhd, 0, (void *)net, net->name, NULL, 0, 0) == DHD_BAD_IF) ++ goto fail; ++ dhd_state |= DHD_ATTACH_STATE_ADD_IF; ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) ++ net->open = NULL; ++#else ++ net->netdev_ops = NULL; ++#endif ++ ++ sema_init(&dhd->proto_sem, 1); ++ ++#ifdef PROP_TXSTATUS ++ spin_lock_init(&dhd->wlfc_spinlock); ++#ifdef PROP_TXSTATUS_VSDB ++ dhd->pub.wlfc_enabled = FALSE; ++#else ++ dhd->pub.wlfc_enabled = TRUE; ++#endif /* PROP_TXSTATUS_VSDB */ ++#endif /* PROP_TXSTATUS */ ++ ++ /* Initialize other structure content */ ++ init_waitqueue_head(&dhd->ioctl_resp_wait); ++ init_waitqueue_head(&dhd->ctrl_wait); ++ ++ /* Initialize the spinlocks */ ++ spin_lock_init(&dhd->sdlock); ++ spin_lock_init(&dhd->txqlock); ++ spin_lock_init(&dhd->dhd_lock); ++ ++ /* Initialize Wakelock stuff */ ++ spin_lock_init(&dhd->wakelock_spinlock); ++ dhd->wakelock_counter = 0; ++ dhd->wakelock_wd_counter = 0; ++ dhd->wakelock_rx_timeout_enable = 0; ++ dhd->wakelock_ctrl_timeout_enable = 0; ++#ifdef CONFIG_HAS_WAKELOCK ++ dhd->wl_wifi = MALLOC(osh, sizeof(struct wake_lock)); ++ dhd->wl_rxwake = MALLOC(osh, sizeof(struct wake_lock)); ++ dhd->wl_ctrlwake = MALLOC(osh, sizeof(struct wake_lock)); ++ dhd->wl_wdwake = MALLOC(osh, sizeof(struct wake_lock)); ++ if (!dhd->wl_wifi || !dhd->wl_rxwake || !dhd->wl_ctrlwake || !dhd->wl_wdwake) { ++ AP6210_ERR("%s: mem alloc for wake lock failed\n", __FUNCTION__); ++ goto fail; ++ } ++ wake_lock_init(dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake"); ++ wake_lock_init(dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake"); ++ wake_lock_init(dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake"); ++ wake_lock_init(dhd->wl_wdwake, WAKE_LOCK_SUSPEND, "wlan_wd_wake"); ++#endif /* CONFIG_HAS_WAKELOCK */ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ mutex_init(&dhd->dhd_net_if_mutex); ++ mutex_init(&dhd->dhd_suspend_mutex); ++#endif ++ dhd_state |= DHD_ATTACH_STATE_WAKELOCKS_INIT; ++ ++ /* Attach and link in the protocol */ ++ if (dhd_prot_attach(&dhd->pub) != 0) { ++ AP6210_ERR("dhd_prot_attach failed\n"); ++ goto fail; ++ } ++ dhd_state |= DHD_ATTACH_STATE_PROT_ATTACH; ++ ++#ifdef WL_CFG80211 ++ /* Attach and link in the cfg80211 */ ++ if (unlikely(wl_cfg80211_attach(net, &dhd->pub))) { ++ AP6210_ERR("wl_cfg80211_attach failed\n"); ++ goto fail; ++ } ++ ++ dhd_monitor_init(&dhd->pub); ++ dhd_state |= DHD_ATTACH_STATE_CFG80211; ++#endif ++#if defined(CONFIG_WIRELESS_EXT) ++ /* Attach and link in the iw */ ++ if (!(dhd_state & DHD_ATTACH_STATE_CFG80211)) { ++ if (wl_iw_attach(net, (void *)&dhd->pub) != 0) { ++ AP6210_ERR("wl_iw_attach failed\n"); ++ goto fail; ++ } ++ dhd_state |= DHD_ATTACH_STATE_WL_ATTACH; ++ } ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++ ++ /* Set up the watchdog timer */ ++ init_timer(&dhd->timer); ++ dhd->timer.data = (ulong)dhd; ++ dhd->timer.function = dhd_watchdog; ++ ++#ifdef DHDTHREAD ++ /* Initialize thread based operation and lock */ ++ sema_init(&dhd->sdsem, 1); ++ if ((dhd_watchdog_prio >= 0) && (dhd_dpc_prio >= 0)) { ++ dhd->threads_only = TRUE; ++ } ++ else { ++ dhd->threads_only = FALSE; ++ } ++ ++ if (dhd_watchdog_prio >= 0) { ++ /* Initialize watchdog thread */ ++#ifdef USE_KTHREAD_API ++ PROC_START2(dhd_watchdog_thread, dhd, &dhd->thr_wdt_ctl, 0, "dhd_watchdog_thread"); ++#else ++ PROC_START(dhd_watchdog_thread, dhd, &dhd->thr_wdt_ctl, 0); ++#endif ++ } else { ++ dhd->thr_wdt_ctl.thr_pid = -1; ++ } ++ ++ /* Set up the bottom half handler */ ++ if (dhd_dpc_prio >= 0) { ++ /* Initialize DPC thread */ ++#ifdef USE_KTHREAD_API ++ PROC_START2(dhd_dpc_thread, dhd, &dhd->thr_dpc_ctl, 0, "dhd_dpc"); ++#else ++ PROC_START(dhd_dpc_thread, dhd, &dhd->thr_dpc_ctl, 0); ++#endif ++ } else { ++ /* use tasklet for dpc */ ++ tasklet_init(&dhd->tasklet, dhd_dpc, (ulong)dhd); ++ dhd->thr_dpc_ctl.thr_pid = -1; ++ } ++#else ++ /* Set up the bottom half handler */ ++ tasklet_init(&dhd->tasklet, dhd_dpc, (ulong)dhd); ++ dhd->dhd_tasklet_create = TRUE; ++#endif /* DHDTHREAD */ ++ ++ if (dhd_sysioc) { ++#ifdef USE_KTHREAD_API ++ PROC_START2(_dhd_sysioc_thread, dhd, &dhd->thr_sysioc_ctl, 0, "dhd_sysioc"); ++#else ++ PROC_START(_dhd_sysioc_thread, dhd, &dhd->thr_sysioc_ctl, 0); ++#endif ++ } else { ++ dhd->thr_sysioc_ctl.thr_pid = -1; ++ } ++ dhd_state |= DHD_ATTACH_STATE_THREADS_CREATED; ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) ++ INIT_WORK(&dhd->work_hang, dhd_hang_process); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ /* ++ * Save the dhd_info into the priv ++ */ ++ memcpy(netdev_priv(net), &dhd, sizeof(dhd)); ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) ++ register_pm_notifier(&dhd_sleep_pm_notifier); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ ++ ++#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ++ dhd->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 20; ++ dhd->early_suspend.suspend = dhd_early_suspend; ++ dhd->early_suspend.resume = dhd_late_resume; ++ register_early_suspend(&dhd->early_suspend); ++ dhd_state |= DHD_ATTACH_STATE_EARLYSUSPEND_DONE; ++#endif ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++ dhd->pend_ipaddr = 0; ++ register_inetaddr_notifier(&dhd_notifier); ++#endif /* ARP_OFFLOAD_SUPPORT */ ++#ifdef IPV6 ++ register_inet6addr_notifier(&dhd_notifier_ipv6); ++#endif ++ ++#ifdef DHDTCPACK_SUPPRESS ++ dhd->pub.tcp_ack_info_cnt = 0; ++ bzero(dhd->pub.tcp_ack_info_tbl, sizeof(struct tcp_ack_info)*MAXTCPSTREAMS); ++#endif /* DHDTCPACK_SUPPRESS */ ++ ++ dhd_state |= DHD_ATTACH_STATE_DONE; ++ dhd->dhd_state = dhd_state; ++ return &dhd->pub; ++ ++fail: ++ if (dhd_state < DHD_ATTACH_STATE_DHD_ALLOC) { ++ if (net) free_netdev(net); ++ } else { ++ AP6210_DEBUG("%s: Calling dhd_detach dhd_state 0x%x &dhd->pub %p\n", ++ __FUNCTION__, dhd_state, &dhd->pub); ++ dhd->dhd_state = dhd_state; ++ dhd_detach(&dhd->pub); ++ dhd_free(&dhd->pub); ++ } ++ ++ return NULL; ++} ++ ++int ++dhd_bus_start(dhd_pub_t *dhdp) ++{ ++ int ret = -1; ++ dhd_info_t *dhd = (dhd_info_t*)dhdp->info; ++ unsigned long flags; ++ ++ ASSERT(dhd); ++ ++ AP6210_DEBUG("Enter %s:\n", __FUNCTION__); ++ ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdlock(dhdp); ++#endif /* DHDTHREAD */ ++ ++ ++ /* try to download image and nvram to the dongle */ ++ if ((dhd->pub.busstate == DHD_BUS_DOWN) && ++ (fw_path != NULL) && (fw_path[0] != '\0') && ++ (nv_path != NULL) && (nv_path[0] != '\0')) { ++ /* wake lock moved to dhdsdio_download_firmware */ ++ if (!(dhd_bus_download_firmware(dhd->pub.bus, dhd->pub.osh, ++ fw_path, nv_path))) { ++ AP6210_ERR("%s: dhdsdio_probe_download failed. firmware = %s nvram = %s\n", ++ __FUNCTION__, fw_path, nv_path); ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ return -1; ++ } ++ } ++ if (dhd->pub.busstate != DHD_BUS_LOAD) { ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ return -ENETDOWN; ++ } ++ ++ /* Start the watchdog timer */ ++ dhd->pub.tickcnt = 0; ++ dhd_os_wd_timer(&dhd->pub, dhd_watchdog_ms); ++ ++ /* Bring up the bus */ ++ if ((ret = dhd_bus_init(&dhd->pub, FALSE)) != 0) { ++ ++ AP6210_ERR("%s, dhd_bus_init failed %d\n", __FUNCTION__, ret); ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ return ret; ++ } ++ bcmsdh_set_drvdata(dhdp); ++#if defined(OOB_INTR_ONLY) ++ /* Host registration for OOB interrupt */ ++ if (bcmsdh_register_oob_intr(dhdp)) { ++ /* deactivate timer and wait for the handler to finish */ ++ ++ flags = dhd_os_spin_lock(&dhd->pub); ++ dhd->wd_timer_valid = FALSE; ++ dhd_os_spin_unlock(&dhd->pub, flags); ++ del_timer_sync(&dhd->timer); ++ AP6210_ERR("%s Host failed to register for OOB\n", __FUNCTION__); ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ DHD_OS_WD_WAKE_UNLOCK(&dhd->pub); ++ return -ENODEV; ++ } ++ ++ /* Enable oob at firmware */ ++ dhd_enable_oob_intr(dhd->pub.bus, TRUE); ++#endif ++ ++ /* If bus is not ready, can't come up */ ++ if (dhd->pub.busstate != DHD_BUS_DATA) { ++ flags = dhd_os_spin_lock(&dhd->pub); ++ dhd->wd_timer_valid = FALSE; ++ dhd_os_spin_unlock(&dhd->pub, flags); ++ del_timer_sync(&dhd->timer); ++ AP6210_ERR("%s failed bus is not ready\n", __FUNCTION__); ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ DHD_OS_WD_WAKE_UNLOCK(&dhd->pub); ++ return -ENODEV; ++ } ++ ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ ++#ifdef BCMSDIOH_TXGLOM ++ if ((dhd->pub.busstate == DHD_BUS_DATA) && bcmsdh_glom_enabled()) { ++ dhd_txglom_enable(dhdp, TRUE); ++ } ++#endif ++ ++#ifdef READ_MACADDR ++ dhd_read_macaddr(dhd); ++#endif ++ ++ /* Bus is ready, do any protocol initialization */ ++ if ((ret = dhd_prot_init(&dhd->pub)) < 0) ++ return ret; ++ ++#ifdef WRITE_MACADDR ++ dhd_write_macaddr(dhd->pub.mac.octet); ++#endif ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++ if (dhd->pend_ipaddr) { ++#ifdef AOE_IP_ALIAS_SUPPORT ++ aoe_update_host_ipv4_table(&dhd->pub, dhd->pend_ipaddr, TRUE, 0); ++#endif /* AOE_IP_ALIAS_SUPPORT */ ++ dhd->pend_ipaddr = 0; ++ } ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++ return 0; ++} ++ ++bool dhd_is_concurrent_mode(dhd_pub_t *dhd) ++{ ++ if (!dhd) ++ return FALSE; ++ ++ if (dhd->op_mode & DHD_FLAG_CONCURR_MULTI_CHAN_MODE) ++ return TRUE; ++ else if ((dhd->op_mode & DHD_FLAG_CONCURR_SINGLE_CHAN_MODE) == ++ DHD_FLAG_CONCURR_SINGLE_CHAN_MODE) ++ return TRUE; ++ else ++ return FALSE; ++} ++ ++#if !defined(AP) && defined(WLP2P) ++/* From Android JerryBean release, the concurrent mode is enabled by default and the firmware ++ * name would be fw_bcmdhd.bin. So we need to determine whether P2P is enabled in the STA ++ * firmware and accordingly enable concurrent mode (Apply P2P settings). SoftAP firmware ++ * would still be named as fw_bcmdhd_apsta. ++ */ ++uint32 ++dhd_get_concurrent_capabilites(dhd_pub_t *dhd) ++{ ++ int32 ret = 0; ++ char buf[WLC_IOCTL_SMLEN]; ++ bool mchan_supported = FALSE; ++ /* if dhd->op_mode is already set for HOSTAP, ++ * that means we only will use the mode as it is ++ */ ++ if (dhd->op_mode & DHD_FLAG_HOSTAP_MODE) ++ return 0; ++ memset(buf, 0, sizeof(buf)); ++ bcm_mkiovar("cap", 0, 0, buf, sizeof(buf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), ++ FALSE, 0)) < 0) { ++ AP6210_ERR("%s: Get Capability failed (error=%d)\n", ++ __FUNCTION__, ret); ++ return 0; ++ } ++ if (strstr(buf, "vsdb")) { ++ mchan_supported = TRUE; ++ } ++ if (strstr(buf, "p2p") == NULL) { ++ AP6210_DEBUG("Chip does not support p2p\n"); ++ return 0; ++ } ++ else { ++ /* Chip supports p2p but ensure that p2p is really implemented in firmware or not */ ++ memset(buf, 0, sizeof(buf)); ++ bcm_mkiovar("p2p", 0, 0, buf, sizeof(buf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), ++ FALSE, 0)) < 0) { ++ AP6210_ERR("%s: Get P2P failed (error=%d)\n", __FUNCTION__, ret); ++ return 0; ++ } ++ else { ++ if (buf[0] == 1) { ++ /* By default, chip supports single chan concurrency, ++ * now lets check for mchan ++ */ ++ ret = DHD_FLAG_CONCURR_SINGLE_CHAN_MODE; ++ if (mchan_supported) ++ ret |= DHD_FLAG_CONCURR_MULTI_CHAN_MODE; ++#if defined(WL_ENABLE_P2P_IF) ++ /* For customer_hw4, although ICS, ++ * we still support concurrent mode ++ */ ++ return ret; ++#else ++ return 0; ++#endif ++ } ++ } ++ } ++ return 0; ++} ++#endif ++int ++dhd_preinit_ioctls(dhd_pub_t *dhd) ++{ ++ int ret = 0; ++ char eventmask[WL_EVENTING_MASK_LEN]; ++ char iovbuf[WL_EVENTING_MASK_LEN + 12]; /* Room for "event_msgs" + '\0' + bitvec */ ++ ++#if !defined(WL_CFG80211) ++ uint up = 0; ++#endif /* !defined(WL_CFG80211) */ ++ uint power_mode = PM_FAST; ++ uint32 dongle_align = DHD_SDALIGN; ++ uint32 glom = CUSTOM_GLOM_SETTING; ++#if defined(VSDB) || defined(ROAM_ENABLE) ++ uint bcn_timeout = 8; ++#else ++ uint bcn_timeout = 4; ++#endif ++#ifdef ENABLE_BCN_LI_BCN_WAKEUP ++ uint32 bcn_li_bcn = 1; ++#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ ++ uint retry_max = 3; ++#if defined(ARP_OFFLOAD_SUPPORT) ++ int arpoe = 1; ++#endif ++ int scan_assoc_time = DHD_SCAN_ASSOC_ACTIVE_TIME; ++ int scan_unassoc_time = DHD_SCAN_UNASSOC_ACTIVE_TIME; ++ int scan_passive_time = DHD_SCAN_PASSIVE_TIME; ++ char buf[WLC_IOCTL_SMLEN]; ++ char *ptr; ++ uint32 listen_interval = LISTEN_INTERVAL; /* Default Listen Interval in Beacons */ ++#ifdef ROAM_ENABLE ++ uint roamvar = 0; ++ int roam_trigger[2] = {CUSTOM_ROAM_TRIGGER_SETTING, WLC_BAND_ALL}; ++ int roam_scan_period[2] = {10, WLC_BAND_ALL}; ++ int roam_delta[2] = {CUSTOM_ROAM_DELTA_SETTING, WLC_BAND_ALL}; ++#ifdef FULL_ROAMING_SCAN_PERIOD_60_SEC ++ int roam_fullscan_period = 60; ++#else /* FULL_ROAMING_SCAN_PERIOD_60_SEC */ ++ int roam_fullscan_period = 120; ++#endif /* FULL_ROAMING_SCAN_PERIOD_60_SEC */ ++#else ++#ifdef DISABLE_BUILTIN_ROAM ++ uint roamvar = 1; ++#endif /* DISABLE_BUILTIN_ROAM */ ++#endif /* ROAM_ENABLE */ ++ ++#if defined(SOFTAP) ++ uint dtim = 1; ++#endif ++#if (defined(AP) && !defined(WLP2P)) || (!defined(AP) && defined(WL_CFG80211)) ++ uint32 mpc = 0; /* Turn MPC off for AP/APSTA mode */ ++ struct ether_addr p2p_ea; ++#endif ++ uint32 mimo_bw_cap = 1; /* Turn HT40 on in 2.4 GHz */ ++ ++#if defined(AP) || defined(WLP2P) ++ uint32 apsta = 1; /* Enable APSTA mode */ ++#endif /* defined(AP) || defined(WLP2P) */ ++#ifdef GET_CUSTOM_MAC_ENABLE ++ struct ether_addr ea_addr; ++#endif /* GET_CUSTOM_MAC_ENABLE */ ++#ifdef DISABLE_11N ++ uint32 nmode = 0; ++#else ++#ifdef AMPDU_HOSTREORDER ++ uint32 hostreorder = 1; ++#endif ++#endif /* DISABLE_11N */ ++ dhd->suspend_bcn_li_dtim = CUSTOM_SUSPEND_BCN_LI_DTIM; ++#ifdef PROP_TXSTATUS ++#ifdef PROP_TXSTATUS_VSDB ++ dhd->wlfc_enabled = FALSE; ++ /* enable WLFC only if the firmware is VSDB */ ++#else ++ dhd->wlfc_enabled = TRUE; ++#endif /* PROP_TXSTATUS_VSDB */ ++#endif /* PROP_TXSTATUS */ ++ AP6210_DEBUG("Enter %s\n", __FUNCTION__); ++ dhd->op_mode = 0; ++#ifdef GET_CUSTOM_MAC_ENABLE ++ ret = dhd_custom_get_mac_address(ea_addr.octet); ++ if (!ret) { ++ memset(buf, 0, sizeof(buf)); ++ bcm_mkiovar("cur_etheraddr", (void *)&ea_addr, ETHER_ADDR_LEN, buf, sizeof(buf)); ++ ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0); ++ if (ret < 0) { ++ AP6210_ERR("%s: can't set MAC address , error=%d\n", __FUNCTION__, ret); ++ return BCME_NOTUP; ++ } ++ memcpy(dhd->mac.octet, ea_addr.octet, ETHER_ADDR_LEN); ++ } else { ++#endif /* GET_CUSTOM_MAC_ENABLE */ ++ /* Get the default device MAC address directly from firmware */ ++ memset(buf, 0, sizeof(buf)); ++ bcm_mkiovar("cur_etheraddr", 0, 0, buf, sizeof(buf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), ++ FALSE, 0)) < 0) { ++ AP6210_ERR("%s: can't get MAC address , error=%d\n", __FUNCTION__, ret); ++ return BCME_NOTUP; ++ } ++ /* Update public MAC address after reading from Firmware */ ++ memcpy(dhd->mac.octet, buf, ETHER_ADDR_LEN); ++ ++#ifdef GET_CUSTOM_MAC_ENABLE ++ } ++#endif /* GET_CUSTOM_MAC_ENABLE */ ++ ++ AP6210_DEBUG("Firmware = %s\n", fw_path); ++ ++ if ((!op_mode && strstr(fw_path, "_apsta") != NULL) || ++ (op_mode == DHD_FLAG_HOSTAP_MODE)) { ++#ifdef SET_RANDOM_MAC_SOFTAP ++ uint rand_mac; ++#endif ++ dhd->op_mode = DHD_FLAG_HOSTAP_MODE; ++#if defined(ARP_OFFLOAD_SUPPORT) ++ arpoe = 0; ++#endif ++#ifdef PKT_FILTER_SUPPORT ++ dhd_pkt_filter_enable = FALSE; ++#endif ++#ifdef SET_RANDOM_MAC_SOFTAP ++ srandom32((uint)jiffies); ++ rand_mac = random32(); ++ iovbuf[0] = 0x02; /* locally administered bit */ ++ iovbuf[1] = 0x1A; ++ iovbuf[2] = 0x11; ++ iovbuf[3] = (unsigned char)(rand_mac & 0x0F) | 0xF0; ++ iovbuf[4] = (unsigned char)(rand_mac >> 8); ++ iovbuf[5] = (unsigned char)(rand_mac >> 16); ++ ++ bcm_mkiovar("cur_etheraddr", (void *)iovbuf, ETHER_ADDR_LEN, buf, sizeof(buf)); ++ ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0); ++ if (ret < 0) { ++ AP6210_ERR("%s: can't set MAC address , error=%d\n", __FUNCTION__, ret); ++ } else ++ memcpy(dhd->mac.octet, iovbuf, ETHER_ADDR_LEN); ++#endif /* SET_RANDOM_MAC_SOFTAP */ ++#if !defined(AP) && defined(WL_CFG80211) ++ /* Turn off MPC in AP mode */ ++ bcm_mkiovar("mpc", (char *)&mpc, 4, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, ++ sizeof(iovbuf), TRUE, 0)) < 0) { ++ AP6210_ERR("%s mpc for HostAPD failed %d\n", __FUNCTION__, ret); ++ } ++#endif ++ ++ } ++ else { ++ uint32 concurrent_mode = 0; ++ if ((!op_mode && strstr(fw_path, "_p2p") != NULL) || ++ (op_mode == DHD_FLAG_P2P_MODE)) { ++#if defined(ARP_OFFLOAD_SUPPORT) ++ arpoe = 0; ++#endif ++#ifdef PKT_FILTER_SUPPORT ++ dhd_pkt_filter_enable = FALSE; ++#endif ++ dhd->op_mode = DHD_FLAG_P2P_MODE; ++ } ++ else ++ dhd->op_mode = DHD_FLAG_STA_MODE; ++#if !defined(AP) && defined(WLP2P) ++ if ((concurrent_mode = dhd_get_concurrent_capabilites(dhd))) { ++#if defined(ARP_OFFLOAD_SUPPORT) ++ arpoe = 1; ++#endif ++ dhd->op_mode |= concurrent_mode; ++ } ++ ++ /* Check if we are enabling p2p */ ++ if (dhd->op_mode & DHD_FLAG_P2P_MODE) { ++ bcm_mkiovar("apsta", (char *)&apsta, 4, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, ++ iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { ++ AP6210_ERR("%s APSTA for P2P failed ret= %d\n", __FUNCTION__, ret); ++ } ++ ++ memcpy(&p2p_ea, &dhd->mac, ETHER_ADDR_LEN); ++ ETHER_SET_LOCALADDR(&p2p_ea); ++ bcm_mkiovar("p2p_da_override", (char *)&p2p_ea, ++ ETHER_ADDR_LEN, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, ++ iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { ++ AP6210_ERR("%s p2p_da_override ret= %d\n", __FUNCTION__, ret); ++ } else { ++ AP6210_DEBUG("dhd_preinit_ioctls: p2p_da_override succeeded\n"); ++ } ++ } ++#else ++ (void)concurrent_mode; ++#endif ++ } ++ ++ AP6210_ERR("Firmware up: op_mode=0x%04x, " ++ "Broadcom Dongle Host Driver mac="MACDBG"\n", ++ dhd->op_mode, ++ MAC2STRDBG(dhd->mac.octet)); ++ /* Set Country code */ ++ if (dhd->dhd_cspec.ccode[0] != 0) { ++ bcm_mkiovar("country", (char *)&dhd->dhd_cspec, ++ sizeof(wl_country_t), iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) ++ AP6210_ERR("%s: country code setting failed\n", __FUNCTION__); ++ } ++ ++ /* Set Listen Interval */ ++ bcm_mkiovar("assoc_listen", (char *)&listen_interval, 4, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) ++ AP6210_ERR("%s assoc_listen failed %d\n", __FUNCTION__, ret); ++ ++#if defined(ROAM_ENABLE) || defined(DISABLE_BUILTIN_ROAM) ++ /* Disable built-in roaming to allowed ext supplicant to take care of roaming */ ++ bcm_mkiovar("roam_off", (char *)&roamvar, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif /* ROAM_ENABLE || DISABLE_BUILTIN_ROAM */ ++#ifdef ROAM_ENABLE ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_TRIGGER, roam_trigger, ++ sizeof(roam_trigger), TRUE, 0)) < 0) ++ AP6210_ERR("%s: roam trigger set failed %d\n", __FUNCTION__, ret); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_SCAN_PERIOD, roam_scan_period, ++ sizeof(roam_scan_period), TRUE, 0)) < 0) ++ AP6210_ERR("%s: roam scan period set failed %d\n", __FUNCTION__, ret); ++ if ((dhd_wl_ioctl_cmd(dhd, WLC_SET_ROAM_DELTA, roam_delta, ++ sizeof(roam_delta), TRUE, 0)) < 0) ++ AP6210_ERR("%s: roam delta set failed %d\n", __FUNCTION__, ret); ++ bcm_mkiovar("fullroamperiod", (char *)&roam_fullscan_period, 4, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) ++ AP6210_ERR("%s: roam fullscan period set failed %d\n", __FUNCTION__, ret); ++#endif /* ROAM_ENABLE */ ++ ++ /* Set PowerSave mode */ ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_PM, (char *)&power_mode, sizeof(power_mode), TRUE, 0); ++ ++ /* Match Host and Dongle rx alignment */ ++ bcm_mkiovar("bus:txglomalign", (char *)&dongle_align, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ ++ if (glom != DEFAULT_GLOM_VALUE) { ++ AP6210_DEBUG("%s set glom=0x%X\n", __FUNCTION__, glom); ++ bcm_mkiovar("bus:txglom", (char *)&glom, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ } ++ ++ /* Setup timeout if Beacons are lost and roam is off to report link down */ ++ bcm_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ /* Setup assoc_retry_max count to reconnect target AP in dongle */ ++ bcm_mkiovar("assoc_retry_max", (char *)&retry_max, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#if defined(AP) && !defined(WLP2P) ++ /* Turn off MPC in AP mode */ ++ bcm_mkiovar("mpc", (char *)&mpc, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ bcm_mkiovar("apsta", (char *)&apsta, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif /* defined(AP) && !defined(WLP2P) */ ++ ++ if (dhd_bus_chip_id(dhd) == BCM43341_CHIP_ID || dhd_bus_chip_id(dhd) == BCM4324_CHIP_ID) { ++ /* Turn on HT40 in 2.4 GHz */ ++ bcm_mkiovar("mimo_bw_cap", (char *)&mimo_bw_cap, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++ } ++ ++#if defined(SOFTAP) ++ if (ap_fw_loaded == TRUE) { ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_DTIMPRD, (char *)&dtim, sizeof(dtim), TRUE, 0); ++ } ++#endif ++ ++#if defined(KEEP_ALIVE) ++ { ++ /* Set Keep Alive : be sure to use FW with -keepalive */ ++ int res; ++ ++#if defined(SOFTAP) ++ if (ap_fw_loaded == FALSE) ++#endif ++ if (!(dhd->op_mode & DHD_FLAG_HOSTAP_MODE)) { ++ if ((res = dhd_keep_alive_onoff(dhd)) < 0) ++ AP6210_ERR("%s set keeplive failed %d\n", ++ __FUNCTION__, res); ++ } ++ } ++#endif /* defined(KEEP_ALIVE) */ ++ ++ /* Read event_msgs mask */ ++ bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iovbuf, sizeof(iovbuf), FALSE, 0)) < 0) { ++ AP6210_ERR("%s read Event mask failed %d\n", __FUNCTION__, ret); ++ goto done; ++ } ++ bcopy(iovbuf, eventmask, WL_EVENTING_MASK_LEN); ++ ++ /* Setup event_msgs */ ++ setbit(eventmask, WLC_E_SET_SSID); ++ setbit(eventmask, WLC_E_PRUNE); ++ setbit(eventmask, WLC_E_AUTH); ++ setbit(eventmask, WLC_E_ASSOC); ++ setbit(eventmask, WLC_E_REASSOC); ++ setbit(eventmask, WLC_E_REASSOC_IND); ++ setbit(eventmask, WLC_E_DEAUTH); ++ setbit(eventmask, WLC_E_DEAUTH_IND); ++ setbit(eventmask, WLC_E_DISASSOC_IND); ++ setbit(eventmask, WLC_E_DISASSOC); ++ setbit(eventmask, WLC_E_JOIN); ++ setbit(eventmask, WLC_E_ASSOC_IND); ++ setbit(eventmask, WLC_E_PSK_SUP); ++ setbit(eventmask, WLC_E_LINK); ++ setbit(eventmask, WLC_E_NDIS_LINK); ++ setbit(eventmask, WLC_E_MIC_ERROR); ++ setbit(eventmask, WLC_E_ASSOC_REQ_IE); ++ setbit(eventmask, WLC_E_ASSOC_RESP_IE); ++#ifndef WL_CFG80211 ++ setbit(eventmask, WLC_E_PMKID_CACHE); ++ setbit(eventmask, WLC_E_TXFAIL); ++#endif ++ setbit(eventmask, WLC_E_JOIN_START); ++ setbit(eventmask, WLC_E_SCAN_COMPLETE); ++#ifdef WLMEDIA_HTSF ++ setbit(eventmask, WLC_E_HTSFSYNC); ++#endif /* WLMEDIA_HTSF */ ++#ifdef PNO_SUPPORT ++ setbit(eventmask, WLC_E_PFN_NET_FOUND); ++#endif /* PNO_SUPPORT */ ++ /* enable dongle roaming event */ ++ setbit(eventmask, WLC_E_ROAM); ++#ifdef WL_CFG80211 ++ setbit(eventmask, WLC_E_ESCAN_RESULT); ++ if (dhd->op_mode & DHD_FLAG_P2P_MODE) { ++ setbit(eventmask, WLC_E_ACTION_FRAME_RX); ++ setbit(eventmask, WLC_E_P2P_DISC_LISTEN_COMPLETE); ++ } ++#endif /* WL_CFG80211 */ ++ ++ /* Write updated Event mask */ ++ bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) { ++ AP6210_ERR("%s Set Event mask failed %d\n", __FUNCTION__, ret); ++ goto done; ++ } ++ ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_SCAN_CHANNEL_TIME, (char *)&scan_assoc_time, ++ sizeof(scan_assoc_time), TRUE, 0); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_SCAN_UNASSOC_TIME, (char *)&scan_unassoc_time, ++ sizeof(scan_unassoc_time), TRUE, 0); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_SCAN_PASSIVE_TIME, (char *)&scan_passive_time, ++ sizeof(scan_passive_time), TRUE, 0); ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++ /* Set and enable ARP offload feature for STA only */ ++#if defined(SOFTAP) ++ if (arpoe && !ap_fw_loaded) { ++#else ++ if (arpoe) { ++#endif ++ dhd_arp_offload_enable(dhd, TRUE); ++ dhd_arp_offload_set(dhd, dhd_arp_mode); ++ } else { ++ dhd_arp_offload_enable(dhd, FALSE); ++ dhd_arp_offload_set(dhd, 0); ++ } ++ dhd_arp_enable = arpoe; ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++#ifdef PKT_FILTER_SUPPORT ++ /* Setup default defintions for pktfilter , enable in suspend */ ++ dhd->pktfilter_count = 5; ++ /* Setup filter to allow only unicast */ ++ dhd->pktfilter[0] = "100 0 0 0 0x01 0x00"; ++ dhd->pktfilter[1] = NULL; ++ dhd->pktfilter[2] = NULL; ++ dhd->pktfilter[3] = NULL; ++ /* Add filter to pass multicastDNS packet and NOT filter out as Broadcast */ ++ dhd->pktfilter[4] = "104 0 0 0 0xFFFFFFFFFFFF 0x01005E0000FB"; ++ dhd_set_packet_filter(dhd); ++ ++#if defined(SOFTAP) ++ if (ap_fw_loaded) { ++ dhd_enable_packet_filter(0, dhd); ++ } ++#endif /* defined(SOFTAP) */ ++ ++#endif /* PKT_FILTER_SUPPORT */ ++#ifdef DISABLE_11N ++ bcm_mkiovar("nmode", (char *)&nmode, 4, iovbuf, sizeof(iovbuf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0)) < 0) ++ AP6210_ERR("%s wl nmode 0 failed %d\n", __FUNCTION__, ret); ++#else ++#ifdef AMPDU_HOSTREORDER ++ bcm_mkiovar("ampdu_hostreorder", (char *)&hostreorder, 4, buf, sizeof(buf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, sizeof(buf), TRUE, 0); ++#endif /* AMPDU_HOSTREORDER */ ++#endif /* DISABLE_11N */ ++ ++#if !defined(WL_CFG80211) ++ /* Force STA UP */ ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_UP, (char *)&up, sizeof(up), TRUE, 0)) < 0) { ++ AP6210_ERR("%s Setting WL UP failed %d\n", __FUNCTION__, ret); ++ goto done; ++ } ++#endif ++ ++#ifdef ENABLE_BCN_LI_BCN_WAKEUP ++ bcm_mkiovar("bcn_li_bcn", (char *)&bcn_li_bcn, 4, iovbuf, sizeof(iovbuf)); ++ dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0); ++#endif /* ENABLE_BCN_LI_BCN_WAKEUP */ ++ ++ /* query for 'ver' to get version info from firmware */ ++ memset(buf, 0, sizeof(buf)); ++ ptr = buf; ++ bcm_mkiovar("ver", (char *)&buf, 4, buf, sizeof(buf)); ++ if ((ret = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, buf, sizeof(buf), FALSE, 0)) < 0) ++ AP6210_ERR("%s failed %d\n", __FUNCTION__, ret); ++ else { ++ bcmstrtok(&ptr, "\n", 0); ++ /* Print fw version info */ ++ AP6210_ERR("Firmware version = %s\n", buf); ++ ++ dhd_set_version_info(dhd, buf); ++ ++ DHD_BLOG(buf, strlen(buf) + 1); ++ DHD_BLOG(dhd_version, strlen(dhd_version) + 1); ++ DHD_BLOG(dhd_version_info, strlen(dhd_version_info) +1); ++ ++ /* Check and adjust IOCTL response timeout for Manufactring firmware */ ++ if (strstr(buf, MANUFACTRING_FW) != NULL) { ++ dhd_os_set_ioctl_resp_timeout(20000); ++ AP6210_ERR("%s : adjust IOCTL response time for Manufactring Firmware\n", ++ __FUNCTION__); ++ } ++ } ++ ++done: ++ return ret; ++} ++ ++ ++int ++dhd_iovar(dhd_pub_t *pub, int ifidx, char *name, char *cmd_buf, uint cmd_len, int set) ++{ ++ char buf[strlen(name) + 1 + cmd_len]; ++ int len = sizeof(buf); ++ wl_ioctl_t ioc; ++ int ret; ++ ++ len = bcm_mkiovar(name, cmd_buf, cmd_len, buf, len); ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ++ ioc.cmd = set? WLC_SET_VAR : WLC_GET_VAR; ++ ioc.buf = buf; ++ ioc.len = len; ++ ioc.set = TRUE; ++ ++ ret = dhd_wl_ioctl(pub, ifidx, &ioc, ioc.buf, ioc.len); ++ if (!set && ret >= 0) ++ memcpy(cmd_buf, buf, cmd_len); ++ ++ return ret; ++} ++ ++int dhd_change_mtu(dhd_pub_t *dhdp, int new_mtu, int ifidx) ++{ ++ struct dhd_info *dhd = dhdp->info; ++ struct net_device *dev = NULL; ++ ++ ASSERT(dhd && dhd->iflist[ifidx]); ++ dev = dhd->iflist[ifidx]->net; ++ ASSERT(dev); ++ ++ if (netif_running(dev)) { ++ AP6210_ERR("%s: Must be down to change its MTU", dev->name); ++ return BCME_NOTDOWN; ++ } ++ ++#define DHD_MIN_MTU 1500 ++#define DHD_MAX_MTU 1752 ++ ++ if ((new_mtu < DHD_MIN_MTU) || (new_mtu > DHD_MAX_MTU)) { ++ AP6210_ERR("%s: MTU size %d is invalid.\n", __FUNCTION__, new_mtu); ++ return BCME_BADARG; ++ } ++ ++ dev->mtu = new_mtu; ++ return 0; ++} ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++/* add or remove AOE host ip(s) (up to 8 IPs on the interface) */ ++void ++aoe_update_host_ipv4_table(dhd_pub_t *dhd_pub, u32 ipa, bool add, int idx) ++{ ++ u32 ipv4_buf[MAX_IPV4_ENTRIES]; /* temp save for AOE host_ip table */ ++ int i; ++ int ret; ++ ++ bzero(ipv4_buf, sizeof(ipv4_buf)); ++ ++ /* display what we've got */ ++ ret = dhd_arp_get_arp_hostip_table(dhd_pub, ipv4_buf, sizeof(ipv4_buf), idx); ++ AP6210_DEBUG("%s: hostip table read from Dongle:\n", __FUNCTION__); ++#ifdef AOE_DBG ++ dhd_print_buf(ipv4_buf, 32, 4); /* max 8 IPs 4b each */ ++#endif ++ /* now we saved hoste_ip table, clr it in the dongle AOE */ ++ dhd_aoe_hostip_clr(dhd_pub, idx); ++ ++ if (ret) { ++ AP6210_ERR("%s failed\n", __FUNCTION__); ++ return; ++ } ++ ++ for (i = 0; i < MAX_IPV4_ENTRIES; i++) { ++ if (add && (ipv4_buf[i] == 0)) { ++ ipv4_buf[i] = ipa; ++ add = FALSE; /* added ipa to local table */ ++ AP6210_DEBUG("%s: Saved new IP in temp arp_hostip[%d]\n", ++ __FUNCTION__, i); ++ } else if (ipv4_buf[i] == ipa) { ++ ipv4_buf[i] = 0; ++ AP6210_DEBUG("%s: removed IP:%x from temp table %d\n", ++ __FUNCTION__, ipa, i); ++ } ++ ++ if (ipv4_buf[i] != 0) { ++ /* add back host_ip entries from our local cache */ ++ dhd_arp_offload_add_ip(dhd_pub, ipv4_buf[i], idx); ++ AP6210_DEBUG("%s: added IP:%x to dongle arp_hostip[%d]\n\n", ++ __FUNCTION__, ipv4_buf[i], i); ++ } ++ } ++#ifdef AOE_DBG ++ /* see the resulting hostip table */ ++ dhd_arp_get_arp_hostip_table(dhd_pub, ipv4_buf, sizeof(ipv4_buf), idx); ++ AP6210_DEBUG("%s: read back arp_hostip table:\n", __FUNCTION__); ++ dhd_print_buf(ipv4_buf, 32, 4); /* max 8 IPs 4b each */ ++#endif ++} ++ ++/* ++ * Notification mechanism from kernel to our driver. This function is called by the Linux kernel ++ * whenever there is an event related to an IP address. ++ * ptr : kernel provided pointer to IP address that has changed ++ */ ++static int dhd_device_event(struct notifier_block *this, ++ unsigned long event, ++ void *ptr) ++{ ++ struct in_ifaddr *ifa = (struct in_ifaddr *)ptr; ++ ++ dhd_info_t *dhd; ++ dhd_pub_t *dhd_pub; ++ int idx; ++ ++ if (!dhd_arp_enable) ++ return NOTIFY_DONE; ++ if (!ifa || !(ifa->ifa_dev->dev)) ++ return NOTIFY_DONE; ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) ++ /* Filter notifications meant for non Broadcom devices */ ++ if ((ifa->ifa_dev->dev->netdev_ops != &dhd_ops_pri) && ++ (ifa->ifa_dev->dev->netdev_ops != &dhd_ops_virt)) { ++#ifdef WLP2P ++ if (!wl_cfgp2p_is_ifops(ifa->ifa_dev->dev->netdev_ops)) ++#endif ++ return NOTIFY_DONE; ++ } ++#endif /* LINUX_VERSION_CODE */ ++ ++ dhd = *(dhd_info_t **)netdev_priv(ifa->ifa_dev->dev); ++ if (!dhd) ++ return NOTIFY_DONE; ++ ++ dhd_pub = &dhd->pub; ++ ++ if (dhd_pub->arp_version == 1) { ++ idx = 0; ++ } ++ else { ++ for (idx = 0; idx < DHD_MAX_IFS; idx++) { ++ if (dhd->iflist[idx] && dhd->iflist[idx]->net == ifa->ifa_dev->dev) ++ break; ++ } ++ if (idx < DHD_MAX_IFS) ++ AP6210_DEBUG("ifidx : %p %s %d\n", dhd->iflist[idx]->net, ++ dhd->iflist[idx]->name, dhd->iflist[idx]->idx); ++ else { ++ AP6210_ERR("Cannot find ifidx for(%s) set to 0\n", ifa->ifa_label); ++ idx = 0; ++ } ++ } ++ ++ switch (event) { ++ case NETDEV_UP: ++ AP6210_DEBUG("%s: [%s] Up IP: 0x%x\n", ++ __FUNCTION__, ifa->ifa_label, ifa->ifa_address); ++ ++ if (dhd->pub.busstate != DHD_BUS_DATA) { ++ AP6210_ERR("%s: bus not ready, exit\n", __FUNCTION__); ++ if (dhd->pend_ipaddr) { ++ AP6210_ERR("%s: overwrite pending ipaddr: 0x%x\n", ++ __FUNCTION__, dhd->pend_ipaddr); ++ } ++ dhd->pend_ipaddr = ifa->ifa_address; ++ break; ++ } ++ ++#ifdef AOE_IP_ALIAS_SUPPORT ++ AP6210_DEBUG("%s:add aliased IP to AOE hostip cache\n", ++ __FUNCTION__); ++ aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, TRUE, idx); ++#endif ++ break; ++ ++ case NETDEV_DOWN: ++ AP6210_DEBUG("%s: [%s] Down IP: 0x%x\n", ++ __FUNCTION__, ifa->ifa_label, ifa->ifa_address); ++ dhd->pend_ipaddr = 0; ++#ifdef AOE_IP_ALIAS_SUPPORT ++ AP6210_DEBUG("%s:interface is down, AOE clr all for this if\n", ++ __FUNCTION__); ++ aoe_update_host_ipv4_table(dhd_pub, ifa->ifa_address, FALSE, idx); ++#else ++ dhd_aoe_hostip_clr(&dhd->pub, idx); ++ dhd_aoe_arp_clr(&dhd->pub, idx); ++#endif /* AOE_IP_ALIAS_SUPPORT */ ++ break; ++ ++ default: ++ AP6210_DEBUG("%s: do noting for [%s] Event: %lu\n", ++ __func__, ifa->ifa_label, event); ++ break; ++ } ++ return NOTIFY_DONE; ++} ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++int ++dhd_net_attach(dhd_pub_t *dhdp, int ifidx) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)dhdp->info; ++ struct net_device *net = NULL; ++ int err = 0; ++ uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x11, 0x22, 0x33 }; ++ ++ AP6210_DEBUG("%s: ifidx %d\n", __FUNCTION__, ifidx); ++ ++ ASSERT(dhd && dhd->iflist[ifidx]); ++ ++ net = dhd->iflist[ifidx]->net; ++ ASSERT(net); ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) ++ ASSERT(!net->open); ++ net->get_stats = dhd_get_stats; ++ net->do_ioctl = dhd_ioctl_entry; ++ net->hard_start_xmit = dhd_start_xmit; ++ net->set_mac_address = dhd_set_mac_address; ++ net->set_multicast_list = dhd_set_multicast_list; ++ net->open = net->stop = NULL; ++#else ++ ASSERT(!net->netdev_ops); ++ net->netdev_ops = &dhd_ops_virt; ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) */ ++ ++ /* Ok, link into the network layer... */ ++ if (ifidx == 0) { ++ /* ++ * device functions for the primary interface only ++ */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) ++ net->open = dhd_open; ++ net->stop = dhd_stop; ++#else ++ net->netdev_ops = &dhd_ops_pri; ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) */ ++ if (!ETHER_ISNULLADDR(dhd->pub.mac.octet)) ++ memcpy(temp_addr, dhd->pub.mac.octet, ETHER_ADDR_LEN); ++ } else { ++ /* ++ * We have to use the primary MAC for virtual interfaces ++ */ ++ memcpy(temp_addr, dhd->iflist[ifidx]->mac_addr, ETHER_ADDR_LEN); ++ /* ++ * Android sets the locally administered bit to indicate that this is a ++ * portable hotspot. This will not work in simultaneous AP/STA mode, ++ * nor with P2P. Need to set the Donlge's MAC address, and then use that. ++ */ ++ if (!memcmp(temp_addr, dhd->iflist[0]->mac_addr, ++ ETHER_ADDR_LEN)) { ++ AP6210_ERR("%s interface [%s]: set locally administered bit in MAC\n", ++ __func__, net->name); ++ temp_addr[0] |= 0x02; ++ } ++ } ++ ++ net->hard_header_len = ETH_HLEN + dhd->pub.hdrlen; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) ++ net->ethtool_ops = &dhd_ethtool_ops; ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ ++ ++#if defined(CONFIG_WIRELESS_EXT) ++#if WIRELESS_EXT < 19 ++ net->get_wireless_stats = dhd_get_wireless_stats; ++#endif /* WIRELESS_EXT < 19 */ ++#if WIRELESS_EXT > 12 ++ net->wireless_handlers = (struct iw_handler_def *)&wl_iw_handler_def; ++#endif /* WIRELESS_EXT > 12 */ ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++ dhd->pub.rxsz = DBUS_RX_BUFFER_SIZE_DHD(net); ++ ++ memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN); ++ ++ if ((err = register_netdev(net)) != 0) { ++ AP6210_ERR("couldn't register the net device, err %d\n", err); ++ goto fail; ++ } ++ AP6210_ERR("Broadcom Dongle Host Driver: register interface [%s] MAC: "MACDBG"\n", ++ net->name, ++ MAC2STRDBG(net->dev_addr)); ++ ++#if defined(SOFTAP) && defined(CONFIG_WIRELESS_EXT) && !defined(WL_CFG80211) ++ wl_iw_iscan_set_scan_broadcast_prep(net, 1); ++#endif ++ ++#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ if (ifidx == 0) { ++ dhd_registration_check = TRUE; ++ up(&dhd_registration_sem); ++ } ++#endif ++ return 0; ++ ++fail: ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31) ++ net->open = NULL; ++#else ++ net->netdev_ops = NULL; ++#endif ++ return err; ++} ++ ++void ++dhd_bus_detach(dhd_pub_t *dhdp) ++{ ++ dhd_info_t *dhd; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (dhdp) { ++ dhd = (dhd_info_t *)dhdp->info; ++ if (dhd) { ++ ++ /* ++ * In case of Android cfg80211 driver, the bus is down in dhd_stop, ++ * calling stop again will cuase SD read/write errors. ++ */ ++ if (dhd->pub.busstate != DHD_BUS_DOWN) { ++ /* Stop the protocol module */ ++ dhd_prot_stop(&dhd->pub); ++ ++ /* Stop the bus module */ ++ dhd_bus_stop(dhd->pub.bus, TRUE); ++ } ++ ++#if defined(OOB_INTR_ONLY) ++ bcmsdh_unregister_oob_intr(); ++#endif ++ } ++ } ++} ++ ++ ++void dhd_detach(dhd_pub_t *dhdp) ++{ ++ dhd_info_t *dhd; ++ unsigned long flags; ++ int timer_valid = FALSE; ++ ++ if (!dhdp) ++ return; ++ ++ dhd = (dhd_info_t *)dhdp->info; ++ if (!dhd) ++ return; ++ ++ AP6210_DEBUG("%s: Enter state 0x%x\n", __FUNCTION__, dhd->dhd_state); ++#ifdef ARP_OFFLOAD_SUPPORT ++ unregister_inetaddr_notifier(&dhd_notifier); ++#endif /* ARP_OFFLOAD_SUPPORT */ ++#ifdef IPV6 ++ unregister_inet6addr_notifier(&dhd_notifier_ipv6); ++#endif ++ ++ dhd->pub.up = 0; ++ if (!(dhd->dhd_state & DHD_ATTACH_STATE_DONE)) { ++ /* Give sufficient time for threads to start running in case ++ * dhd_attach() has failed ++ */ ++ osl_delay(1000*100); ++ } ++ ++ if (dhd->dhd_state & DHD_ATTACH_STATE_PROT_ATTACH) { ++ dhd_bus_detach(dhdp); ++ ++ if (dhdp->prot) ++ dhd_prot_detach(dhdp); ++ } ++ ++#ifdef ARP_OFFLOAD_SUPPORT ++ unregister_inetaddr_notifier(&dhd_notifier); ++#endif /* ARP_OFFLOAD_SUPPORT */ ++ ++#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ++ if (dhd->dhd_state & DHD_ATTACH_STATE_EARLYSUSPEND_DONE) { ++ if (dhd->early_suspend.suspend) ++ unregister_early_suspend(&dhd->early_suspend); ++ } ++#endif /* defined(CONFIG_HAS_EARLYSUSPEND) */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ cancel_work_sync(&dhd->work_hang); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ ++#if defined(CONFIG_WIRELESS_EXT) ++ if (dhd->dhd_state & DHD_ATTACH_STATE_WL_ATTACH) { ++ /* Detatch and unlink in the iw */ ++ wl_iw_detach(); ++ } ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++ if (dhd->thr_sysioc_ctl.thr_pid >= 0) { ++ PROC_STOP(&dhd->thr_sysioc_ctl); ++ } ++ ++ /* delete all interfaces, start with virtual */ ++ if (dhd->dhd_state & DHD_ATTACH_STATE_ADD_IF) { ++ int i = 1; ++ dhd_if_t *ifp; ++ ++ /* Cleanup virtual interfaces */ ++ for (i = 1; i < DHD_MAX_IFS; i++) { ++ dhd_net_if_lock_local(dhd); ++ if (dhd->iflist[i]) { ++ dhd->iflist[i]->state = DHD_IF_DEL; ++ dhd->iflist[i]->idx = i; ++ dhd_op_if(dhd->iflist[i]); ++ } ++ ++ dhd_net_if_unlock_local(dhd); ++ } ++ /* delete primary interface 0 */ ++ ifp = dhd->iflist[0]; ++ ASSERT(ifp); ++ ASSERT(ifp->net); ++ if (ifp && ifp->net) { ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) ++ if (ifp->net->open) ++#else ++ if (ifp->net->netdev_ops == &dhd_ops_pri) ++#endif ++ { ++ unregister_netdev(ifp->net); ++ free_netdev(ifp->net); ++ ifp->net = NULL; ++ MFREE(dhd->pub.osh, ifp, sizeof(*ifp)); ++ dhd->iflist[0] = NULL; ++ } ++ } ++ } ++ ++ /* Clear the watchdog timer */ ++ flags = dhd_os_spin_lock(&dhd->pub); ++ timer_valid = dhd->wd_timer_valid; ++ dhd->wd_timer_valid = FALSE; ++ dhd_os_spin_unlock(&dhd->pub, flags); ++ if (timer_valid) ++ del_timer_sync(&dhd->timer); ++ ++ if (dhd->dhd_state & DHD_ATTACH_STATE_THREADS_CREATED) { ++#ifdef DHDTHREAD ++ if (dhd->thr_wdt_ctl.thr_pid >= 0) { ++ PROC_STOP(&dhd->thr_wdt_ctl); ++ } ++ ++ if (dhd->thr_dpc_ctl.thr_pid >= 0) { ++ PROC_STOP(&dhd->thr_dpc_ctl); ++ } ++ else ++#endif /* DHDTHREAD */ ++ tasklet_kill(&dhd->tasklet); ++ } ++ ++#ifdef WL_CFG80211 ++ if (dhd->dhd_state & DHD_ATTACH_STATE_CFG80211) { ++ wl_cfg80211_detach(NULL); ++ dhd_monitor_uninit(); ++ } ++#endif ++ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) ++ unregister_pm_notifier(&dhd_sleep_pm_notifier); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && defined(CONFIG_PM_SLEEP) */ ++ /* && defined(CONFIG_PM_SLEEP) */ ++ ++ if (dhd->dhd_state & DHD_ATTACH_STATE_WAKELOCKS_INIT) { ++#ifdef CONFIG_HAS_WAKELOCK ++ dhd->wakelock_counter = 0; ++ dhd->wakelock_wd_counter = 0; ++ dhd->wakelock_rx_timeout_enable = 0; ++ dhd->wakelock_ctrl_timeout_enable = 0; ++ if (dhd->wl_wifi) { ++ wake_lock_destroy(dhd->wl_wifi); ++ MFREE(dhd->pub.osh, dhd->wl_wifi, sizeof(struct wake_lock)); ++ dhd->wl_wifi = NULL; ++ } ++ if (dhd->wl_rxwake) { ++ wake_lock_destroy(dhd->wl_rxwake); ++ MFREE(dhd->pub.osh, dhd->wl_rxwake, sizeof(struct wake_lock)); ++ dhd->wl_rxwake = NULL; ++ } ++ if (dhd->wl_ctrlwake) { ++ wake_lock_destroy(dhd->wl_ctrlwake); ++ MFREE(dhd->pub.osh, dhd->wl_ctrlwake, sizeof(struct wake_lock)); ++ dhd->wl_ctrlwake = NULL; ++ } ++ if (dhd->wl_wdwake) { ++ wake_lock_destroy(dhd->wl_wdwake); ++ MFREE(dhd->pub.osh, dhd->wl_wdwake, sizeof(struct wake_lock)); ++ dhd->wl_wdwake = NULL; ++ } ++#endif /* CONFIG_HAS_WAKELOCK */ ++ } ++} ++ ++ ++void ++dhd_free(dhd_pub_t *dhdp) ++{ ++ dhd_info_t *dhd; ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (dhdp) { ++ int i; ++ for (i = 0; i < ARRAYSIZE(dhdp->reorder_bufs); i++) { ++ if (dhdp->reorder_bufs[i]) { ++ reorder_info_t *ptr; ++ uint32 buf_size = sizeof(struct reorder_info); ++ ++ ptr = dhdp->reorder_bufs[i]; ++ ++ buf_size += ((ptr->max_idx + 1) * sizeof(void*)); ++ AP6210_DEBUG("free flow id buf %d, maxidx is %d, buf_size %d\n", ++ i, ptr->max_idx, buf_size); ++ ++ MFREE(dhdp->osh, dhdp->reorder_bufs[i], buf_size); ++ dhdp->reorder_bufs[i] = NULL; ++ } ++ } ++ dhd = (dhd_info_t *)dhdp->info; ++ if (dhd) ++ MFREE(dhd->pub.osh, dhd, sizeof(*dhd)); ++ } ++} ++ ++static void __exit ++dhd_module_cleanup(void) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ dhd_bus_unregister(); ++ ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++ wl_android_wifictrl_func_del(); ++#endif /* CONFIG_WIFI_CONTROL_FUNC */ ++ wl_android_exit(); ++ ++ /* Call customer gpio to turn off power with WL_REG_ON signal */ ++ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF); ++ ++ if (wl_host_wake > 0) ++ gpio_free(wl_host_wake); ++ wl_host_wake = -1; ++ ++ sw_rfkill_exit(); ++ ap6210_gpio_wifi_exit(); ++} ++ ++ ++static int __init ++dhd_module_init(void) ++{ ++ int error = 0; ++ ++#if 1 && defined(BCMLXSDMMC) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ int retry = POWERUP_MAX_RETRY; ++ int chip_up = 0; ++#endif ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ap6210_gpio_wifi_init(); ++ sw_rfkill_init(); ++ ++ if (gpio_request(WL_HOST_WAKE_DEF_GPIO, "wl_host_wake")) { ++ AP6210_ERR("[%s] get wl_host_wake gpio failed\n", __FUNCTION__); ++ wl_host_wake = -1; ++ return -1; ++ } ++ wl_host_wake = WL_HOST_WAKE_DEF_GPIO; ++ gpio_direction_input(wl_host_wake); ++ wl_host_wake_irqno = gpio_to_irq(wl_host_wake); ++ AP6210_DEBUG("got gpio%d, mapped to irqno%d\n", wl_host_wake, wl_host_wake_irqno); ++ ++ wl_android_init(); ++ ++#if defined(DHDTHREAD) ++ /* Sanity check on the module parameters */ ++ do { ++ /* Both watchdog and DPC as tasklets are ok */ ++ if ((dhd_watchdog_prio < 0) && (dhd_dpc_prio < 0)) ++ break; ++ ++ /* If both watchdog and DPC are threads, TX must be deferred */ ++ if ((dhd_watchdog_prio >= 0) && (dhd_dpc_prio >= 0) && dhd_deferred_tx) ++ break; ++ ++ AP6210_ERR("Invalid module parameters.\n"); ++ return -EINVAL; ++ } while (0); ++#endif ++ ++#if 1 && defined(BCMLXSDMMC) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ do { ++ sema_init(&dhd_chipup_sem, 0); ++ dhd_bus_reg_sdio_notify(&dhd_chipup_sem); ++ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_ON); ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++ if (wl_android_wifictrl_func_add() < 0) { ++ dhd_bus_unreg_sdio_notify(); ++ goto fail_1; ++ } ++#endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ ++ if (down_timeout(&dhd_chipup_sem, ++ msecs_to_jiffies(POWERUP_WAIT_MS)) == 0) { ++ dhd_bus_unreg_sdio_notify(); ++ chip_up = 1; ++ break; ++ } ++ AP6210_ERR("failed to power up wifi chip, retry again (%d left) **\n\n", ++ retry+1); ++ dhd_bus_unreg_sdio_notify(); ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++ wl_android_wifictrl_func_del(); ++#endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ ++ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF); ++ } while (retry-- > 0); ++ ++ if (!chip_up) { ++ AP6210_ERR("failed to power up wifi chip, max retry reached, exits **\n\n"); ++ return -ENODEV; ++ } ++#else ++ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_ON); ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++ if (wl_android_wifictrl_func_add() < 0) ++ goto fail_1; ++#endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ ++ ++#endif ++ ++#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ sema_init(&dhd_registration_sem, 0); ++#endif ++ ++ ++ error = dhd_bus_register(); ++ ++ if (!error) ++ AP6210_DEBUG("%s\n", dhd_version); ++ else { ++ AP6210_ERR("%s: sdio_register_driver failed\n", __FUNCTION__); ++ goto fail_1; ++ } ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ /* ++ * Wait till MMC sdio_register_driver callback called and made driver attach. ++ * It's needed to make sync up exit from dhd insmod and ++ * Kernel MMC sdio device callback registration ++ */ ++ if ((down_timeout(&dhd_registration_sem, ++ msecs_to_jiffies(DHD_REGISTRATION_TIMEOUT)) != 0) || ++ (dhd_registration_check != TRUE)) { ++ error = -ENODEV; ++ AP6210_ERR("%s: sdio_register_driver timeout or error \n", __FUNCTION__); ++ goto fail_2; ++ } ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++#if defined(WL_CFG80211) ++ wl_android_post_init(); ++#endif /* defined(WL_CFG80211) */ ++ ++ return error; ++ ++#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++fail_2: ++ dhd_bus_unregister(); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ ++fail_1: ++ ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++ wl_android_wifictrl_func_del(); ++#endif ++ ++ /* Call customer gpio to turn off power with WL_REG_ON signal */ ++ dhd_customer_gpio_wlan_ctrl(WLAN_POWER_OFF); ++ ++ return error; ++} ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) ++late_initcall(dhd_module_init); ++#else ++module_init(dhd_module_init); ++#endif ++ ++module_exit(dhd_module_cleanup); ++ ++/* ++ * OS specific functions required to implement DHD driver in OS independent way ++ */ ++int ++dhd_os_proto_block(dhd_pub_t *pub) ++{ ++ dhd_info_t * dhd = (dhd_info_t *)(pub->info); ++ ++ if (dhd) { ++ down(&dhd->proto_sem); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++int ++dhd_os_proto_unblock(dhd_pub_t *pub) ++{ ++ dhd_info_t * dhd = (dhd_info_t *)(pub->info); ++ ++ if (dhd) { ++ up(&dhd->proto_sem); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++unsigned int ++dhd_os_get_ioctl_resp_timeout(void) ++{ ++ return ((unsigned int)dhd_ioctl_timeout_msec); ++} ++ ++void ++dhd_os_set_ioctl_resp_timeout(unsigned int timeout_msec) ++{ ++ dhd_ioctl_timeout_msec = (int)timeout_msec; ++} ++ ++int ++dhd_os_ioctl_resp_wait(dhd_pub_t *pub, uint *condition, bool *pending) ++{ ++ dhd_info_t * dhd = (dhd_info_t *)(pub->info); ++ int timeout; ++ ++ /* Convert timeout in millsecond to jiffies */ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ timeout = msecs_to_jiffies(dhd_ioctl_timeout_msec); ++#else ++ timeout = dhd_ioctl_timeout_msec * HZ / 1000; ++#endif ++ ++ timeout = wait_event_timeout(dhd->ioctl_resp_wait, (*condition), timeout); ++ return timeout; ++} ++ ++int ++dhd_os_ioctl_resp_wake(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ ++ if (waitqueue_active(&dhd->ioctl_resp_wait)) { ++ wake_up(&dhd->ioctl_resp_wait); ++ } ++ ++ return 0; ++} ++ ++void ++dhd_os_wd_timer(void *bus, uint wdtick) ++{ ++ dhd_pub_t *pub = bus; ++ dhd_info_t *dhd = (dhd_info_t *)pub->info; ++ unsigned long flags; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (!dhd) ++ return; ++ if (wdtick) ++ DHD_OS_WD_WAKE_LOCK(pub); ++ ++ flags = dhd_os_spin_lock(pub); ++ ++ /* don't start the wd until fw is loaded */ ++ if (pub->busstate == DHD_BUS_DOWN) { ++ dhd_os_spin_unlock(pub, flags); ++ DHD_OS_WD_WAKE_UNLOCK(pub); ++ return; ++ } ++ ++ /* totally stop the timer */ ++ if (!wdtick && dhd->wd_timer_valid == TRUE) { ++ dhd->wd_timer_valid = FALSE; ++ dhd_os_spin_unlock(pub, flags); ++#ifdef DHDTHREAD ++ del_timer_sync(&dhd->timer); ++#else ++ del_timer(&dhd->timer); ++#endif /* DHDTHREAD */ ++ /* Unlock when timer deleted */ ++ DHD_OS_WD_WAKE_UNLOCK(pub); ++ return; ++ } ++ ++ if (wdtick) { ++ dhd_watchdog_ms = (uint)wdtick; ++ /* Re arm the timer, at last watchdog period */ ++ mod_timer(&dhd->timer, jiffies + msecs_to_jiffies(dhd_watchdog_ms)); ++ dhd->wd_timer_valid = TRUE; ++ } ++ dhd_os_spin_unlock(pub, flags); ++} ++ ++void * ++dhd_os_open_image(char *filename) ++{ ++ struct file *fp; ++ ++ fp = filp_open(filename, O_RDONLY, 0); ++ /* ++ * 2.6.11 (FC4) supports filp_open() but later revs don't? ++ * Alternative: ++ * fp = open_namei(AT_FDCWD, filename, O_RD, 0); ++ * ??? ++ */ ++ if (IS_ERR(fp)) ++ fp = NULL; ++ ++ return fp; ++} ++ ++int ++dhd_os_get_image_block(char *buf, int len, void *image) ++{ ++ struct file *fp = (struct file *)image; ++ int rdlen; ++ ++ if (!image) ++ return 0; ++ ++ rdlen = kernel_read(fp, fp->f_pos, buf, len); ++ if (rdlen > 0) ++ fp->f_pos += rdlen; ++ ++ return rdlen; ++} ++ ++void ++dhd_os_close_image(void *image) ++{ ++ if (image) ++ filp_close((struct file *)image, NULL); ++} ++ ++ ++void ++dhd_os_sdlock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd; ++ ++ dhd = (dhd_info_t *)(pub->info); ++ ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ down(&dhd->sdsem); ++ else ++#endif /* DHDTHREAD */ ++ spin_lock_bh(&dhd->sdlock); ++} ++ ++void ++dhd_os_sdunlock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd; ++ ++ dhd = (dhd_info_t *)(pub->info); ++ ++#ifdef DHDTHREAD ++ if (dhd->threads_only) ++ up(&dhd->sdsem); ++ else ++#endif /* DHDTHREAD */ ++ spin_unlock_bh(&dhd->sdlock); ++} ++ ++void ++dhd_os_sdlock_txq(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd; ++ ++ dhd = (dhd_info_t *)(pub->info); ++ spin_lock_bh(&dhd->txqlock); ++} ++ ++void ++dhd_os_sdunlock_txq(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd; ++ ++ dhd = (dhd_info_t *)(pub->info); ++ spin_unlock_bh(&dhd->txqlock); ++} ++ ++void ++dhd_os_sdlock_rxq(dhd_pub_t *pub) ++{ ++} ++ ++void ++dhd_os_sdunlock_rxq(dhd_pub_t *pub) ++{ ++} ++ ++void ++dhd_os_sdtxlock(dhd_pub_t *pub) ++{ ++ dhd_os_sdlock(pub); ++} ++ ++void ++dhd_os_sdtxunlock(dhd_pub_t *pub) ++{ ++ dhd_os_sdunlock(pub); ++} ++ ++#if defined(CONFIG_DHD_USE_STATIC_BUF) ++uint8* dhd_os_prealloc(void *osh, int section, uint size) ++{ ++ return (uint8*)wl_android_prealloc(section, size); ++} ++ ++void dhd_os_prefree(void *osh, void *addr, uint size) ++{ ++} ++#endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ ++ ++#if defined(CONFIG_WIRELESS_EXT) ++struct iw_statistics * ++dhd_get_wireless_stats(struct net_device *dev) ++{ ++ int res = 0; ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ if (!dhd->pub.up) { ++ return NULL; ++ } ++ ++ res = wl_iw_get_wireless_stats(dev, &dhd->iw.wstats); ++ ++ if (res == 0) ++ return &dhd->iw.wstats; ++ else ++ return NULL; ++} ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++static int ++dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, ++ wl_event_msg_t *event, void **data) ++{ ++ int bcmerror = 0; ++ ASSERT(dhd != NULL); ++ ++ bcmerror = wl_host_event(&dhd->pub, ifidx, pktdata, event, data); ++ if (bcmerror != BCME_OK) ++ return (bcmerror); ++ ++#if defined(CONFIG_WIRELESS_EXT) ++ if (event->bsscfgidx == 0) { ++ /* ++ * Wireless ext is on primary interface only ++ */ ++ ++ ASSERT(dhd->iflist[*ifidx] != NULL); ++ ASSERT(dhd->iflist[*ifidx]->net != NULL); ++ ++ if (dhd->iflist[*ifidx]->net) { ++ wl_iw_event(dhd->iflist[*ifidx]->net, event, *data); ++ } ++ } ++#endif /* defined(CONFIG_WIRELESS_EXT) */ ++ ++#ifdef WL_CFG80211 ++ if ((ntoh32(event->event_type) == WLC_E_IF) && ++ (((dhd_if_event_t *)*data)->action == WLC_E_IF_ADD)) ++ /* If ADD_IF has been called directly by wl utility then we ++ * should not report this. In case if ADD_IF was called from ++ * CFG stack, then too this event need not be reported back ++ */ ++ return (BCME_OK); ++ if ((wl_cfg80211_is_progress_ifchange() || ++ wl_cfg80211_is_progress_ifadd()) && (*ifidx != 0)) { ++ /* ++ * If IF_ADD/CHANGE operation is going on, ++ * discard any event received on the virtual I/F ++ */ ++ return (BCME_OK); ++ } ++ ++ ASSERT(dhd->iflist[*ifidx] != NULL); ++ ASSERT(dhd->iflist[*ifidx]->net != NULL); ++ if (dhd->iflist[*ifidx]->event2cfg80211 && dhd->iflist[*ifidx]->net) { ++ wl_cfg80211_event(dhd->iflist[*ifidx]->net, event, *data); ++ } ++#endif /* defined(WL_CFG80211) */ ++ ++ return (bcmerror); ++} ++ ++/* send up locally generated event */ ++void ++dhd_sendup_event(dhd_pub_t *dhdp, wl_event_msg_t *event, void *data) ++{ ++ switch (ntoh32(event->event_type)) { ++#ifdef WLBTAMP ++ /* Send up locally generated AMP HCI Events */ ++ case WLC_E_BTA_HCI_EVENT: { ++ struct sk_buff *p, *skb; ++ bcm_event_t *msg; ++ wl_event_msg_t *p_bcm_event; ++ char *ptr; ++ uint32 len; ++ uint32 pktlen; ++ dhd_if_t *ifp; ++ dhd_info_t *dhd; ++ uchar *eth; ++ int ifidx; ++ ++ len = ntoh32(event->datalen); ++ pktlen = sizeof(bcm_event_t) + len + 2; ++ dhd = dhdp->info; ++ ifidx = dhd_ifname2idx(dhd, event->ifname); ++ ++ if ((p = PKTGET(dhdp->osh, pktlen, FALSE))) { ++ ASSERT(ISALIGNED((uintptr)PKTDATA(dhdp->osh, p), sizeof(uint32))); ++ ++ msg = (bcm_event_t *) PKTDATA(dhdp->osh, p); ++ ++ bcopy(&dhdp->mac, &msg->eth.ether_dhost, ETHER_ADDR_LEN); ++ bcopy(&dhdp->mac, &msg->eth.ether_shost, ETHER_ADDR_LEN); ++ ETHER_TOGGLE_LOCALADDR(&msg->eth.ether_shost); ++ ++ msg->eth.ether_type = hton16(ETHER_TYPE_BRCM); ++ ++ /* BCM Vendor specific header... */ ++ msg->bcm_hdr.subtype = hton16(BCMILCP_SUBTYPE_VENDOR_LONG); ++ msg->bcm_hdr.version = BCMILCP_BCM_SUBTYPEHDR_VERSION; ++ bcopy(BRCM_OUI, &msg->bcm_hdr.oui[0], DOT11_OUI_LEN); ++ ++ /* vendor spec header length + pvt data length (private indication ++ * hdr + actual message itself) ++ */ ++ msg->bcm_hdr.length = hton16(BCMILCP_BCM_SUBTYPEHDR_MINLENGTH + ++ BCM_MSG_LEN + sizeof(wl_event_msg_t) + (uint16)len); ++ msg->bcm_hdr.usr_subtype = hton16(BCMILCP_BCM_SUBTYPE_EVENT); ++ ++ PKTSETLEN(dhdp->osh, p, (sizeof(bcm_event_t) + len + 2)); ++ ++ /* copy wl_event_msg_t into sk_buf */ ++ ++ /* pointer to wl_event_msg_t in sk_buf */ ++ p_bcm_event = &msg->event; ++ bcopy(event, p_bcm_event, sizeof(wl_event_msg_t)); ++ ++ /* copy hci event into sk_buf */ ++ bcopy(data, (p_bcm_event + 1), len); ++ ++ msg->bcm_hdr.length = hton16(sizeof(wl_event_msg_t) + ++ ntoh16(msg->bcm_hdr.length)); ++ PKTSETLEN(dhdp->osh, p, (sizeof(bcm_event_t) + len + 2)); ++ ++ ptr = (char *)(msg + 1); ++ /* Last 2 bytes of the message are 0x00 0x00 to signal that there ++ * are no ethertypes which are following this ++ */ ++ ptr[len+0] = 0x00; ++ ptr[len+1] = 0x00; ++ ++ skb = PKTTONATIVE(dhdp->osh, p); ++ eth = skb->data; ++ len = skb->len; ++ ++ ifp = dhd->iflist[ifidx]; ++ if (ifp == NULL) ++ ifp = dhd->iflist[0]; ++ ++ ASSERT(ifp); ++ skb->dev = ifp->net; ++ skb->protocol = eth_type_trans(skb, skb->dev); ++ ++ skb->data = eth; ++ skb->len = len; ++ ++ /* Strip header, count, deliver upward */ ++ skb_pull(skb, ETH_HLEN); ++ ++ /* Send the packet */ ++ if (in_interrupt()) { ++ netif_rx(skb); ++ } else { ++ netif_rx_ni(skb); ++ } ++ } ++ else { ++ /* Could not allocate a sk_buf */ ++ AP6210_ERR("%s: unable to alloc sk_buf", __FUNCTION__); ++ } ++ break; ++ } /* case WLC_E_BTA_HCI_EVENT */ ++#endif /* WLBTAMP */ ++ ++ default: ++ break; ++ } ++} ++ ++void dhd_wait_for_event(dhd_pub_t *dhd, bool *lockvar) ++{ ++#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++ struct dhd_info *dhdinfo = dhd->info; ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ int timeout = msecs_to_jiffies(IOCTL_RESP_TIMEOUT); ++#else ++ int timeout = (IOCTL_RESP_TIMEOUT / 1000) * HZ; ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ ++ dhd_os_sdunlock(dhd); ++ wait_event_timeout(dhdinfo->ctrl_wait, (*lockvar == FALSE), timeout); ++ dhd_os_sdlock(dhd); ++#endif ++ return; ++} ++ ++void dhd_wait_event_wakeup(dhd_pub_t *dhd) ++{ ++#if 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++ struct dhd_info *dhdinfo = dhd->info; ++ if (waitqueue_active(&dhdinfo->ctrl_wait)) ++ wake_up(&dhdinfo->ctrl_wait); ++#endif ++ return; ++} ++ ++int ++dhd_dev_reset(struct net_device *dev, uint8 flag) ++{ ++ int ret; ++ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ if (flag == TRUE) { ++ /* Issue wl down command before resetting the chip */ ++ if (dhd_wl_ioctl_cmd(&dhd->pub, WLC_DOWN, NULL, 0, TRUE, 0) < 0) { ++ AP6210_DEBUG("%s: wl down failed\n", __FUNCTION__); ++ } ++ } ++ ++ ret = dhd_bus_devreset(&dhd->pub, flag); ++ if (ret) { ++ AP6210_ERR("%s: dhd_bus_devreset: %d\n", __FUNCTION__, ret); ++ return ret; ++ } ++ ++ return ret; ++} ++ ++int net_os_set_suspend_disable(struct net_device *dev, int val) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) { ++ ret = dhd->pub.suspend_disable_flag; ++ dhd->pub.suspend_disable_flag = val; ++ } ++ return ret; ++} ++ ++int net_os_set_suspend(struct net_device *dev, int val, int force) ++{ ++ int ret = 0; ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ if (dhd) { ++#if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) ++ ret = dhd_set_suspend(val, &dhd->pub); ++#else ++ ret = dhd_suspend_resume_helper(dhd, val, force); ++#endif ++#ifdef WL_CFG80211 ++ wl_cfg80211_update_power_mode(dev); ++#endif ++ } ++ return ret; ++} ++ ++int net_os_set_suspend_bcn_li_dtim(struct net_device *dev, int val) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ if (dhd) ++ dhd->pub.suspend_bcn_li_dtim = val; ++ ++ return 0; ++} ++ ++#ifdef PKT_FILTER_SUPPORT ++int net_os_rxfilter_add_remove(struct net_device *dev, int add_remove, int num) ++{ ++#ifndef GAN_LITE_NAT_KEEPALIVE_FILTER ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ char *filterp = NULL; ++ int ret = 0; ++ ++ if (!dhd || (num == DHD_UNICAST_FILTER_NUM) || ++ (num == DHD_MDNS_FILTER_NUM)) ++ return ret; ++ if (num >= dhd->pub.pktfilter_count) ++ return -EINVAL; ++ if (add_remove) { ++ switch (num) { ++ case DHD_BROADCAST_FILTER_NUM: ++ filterp = "101 0 0 0 0xFFFFFFFFFFFF 0xFFFFFFFFFFFF"; ++ break; ++ case DHD_MULTICAST4_FILTER_NUM: ++ filterp = "102 0 0 0 0xFFFFFF 0x01005E"; ++ break; ++ case DHD_MULTICAST6_FILTER_NUM: ++ filterp = "103 0 0 0 0xFFFF 0x3333"; ++ break; ++ default: ++ return -EINVAL; ++ } ++ } ++ dhd->pub.pktfilter[num] = filterp; ++ dhd_pktfilter_offload_set(&dhd->pub, dhd->pub.pktfilter[num]); ++ return ret; ++#else ++ return 0; ++#endif /* GAN_LITE_NAT_KEEPALIVE_FILTER */ ++} ++ ++int dhd_os_enable_packet_filter(dhd_pub_t *dhdp, int val) ++{ ++ int ret = 0; ++ ++ /* Packet filtering is set only if we still in early-suspend and ++ * we need either to turn it ON or turn it OFF ++ * We can always turn it OFF in case of early-suspend, but we turn it ++ * back ON only if suspend_disable_flag was not set ++ */ ++ if (dhdp && dhdp->up) { ++ if (dhdp->in_suspend) { ++ if (!val || (val && !dhdp->suspend_disable_flag)) ++ dhd_enable_packet_filter(val, dhdp); ++ } ++ } ++ return ret; ++} ++ ++/* function to enable/disable packet for Network device */ ++int net_os_enable_packet_filter(struct net_device *dev, int val) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ return dhd_os_enable_packet_filter(&dhd->pub, val); ++} ++#endif /* PKT_FILTER_SUPPORT */ ++ ++int ++dhd_dev_init_ioctl(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ return dhd_preinit_ioctls(&dhd->pub); ++} ++ ++#ifdef PNO_SUPPORT ++/* Linux wrapper to call common dhd_pno_clean */ ++int ++dhd_dev_pno_reset(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ return (dhd_pno_clean(&dhd->pub)); ++} ++ ++ ++/* Linux wrapper to call common dhd_pno_enable */ ++int ++dhd_dev_pno_enable(struct net_device *dev, int pfn_enabled) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ return (dhd_pno_enable(&dhd->pub, pfn_enabled)); ++} ++ ++ ++/* Linux wrapper to call common dhd_pno_set */ ++int ++dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local, int nssid, ++ ushort scan_fr, int pno_repeat, int pno_freq_expo_max) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ return (dhd_pno_set(&dhd->pub, ssids_local, nssid, scan_fr, pno_repeat, pno_freq_expo_max)); ++} ++ ++/* Linux wrapper to get pno status */ ++int ++dhd_dev_get_pno_status(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ return (dhd_pno_get_status(&dhd->pub)); ++} ++ ++#endif /* PNO_SUPPORT */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (1) ++static void dhd_hang_process(struct work_struct *work) ++{ ++ dhd_info_t *dhd; ++ struct net_device *dev; ++ ++ dhd = (dhd_info_t *)container_of(work, dhd_info_t, work_hang); ++ dev = dhd->iflist[0]->net; ++ ++ if (dev) { ++ rtnl_lock(); ++ dev_close(dev); ++ rtnl_unlock(); ++#if defined(WL_WIRELESS_EXT) ++ wl_iw_send_priv_event(dev, "HANG"); ++#endif ++#if defined(WL_CFG80211) ++ wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); ++#endif ++ } ++} ++ ++int dhd_os_send_hang_message(dhd_pub_t *dhdp) ++{ ++ int ret = 0; ++ if (dhdp) { ++ if (!dhdp->hang_was_sent) { ++ dhdp->hang_was_sent = 1; ++ schedule_work(&dhdp->info->work_hang); ++ } ++ } ++ return ret; ++} ++ ++int net_os_send_hang_message(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ ret = dhd_os_send_hang_message(&dhd->pub); ++#else ++ ret = wl_cfg80211_hang(dev, WLAN_REASON_UNSPECIFIED); ++#endif ++ return ret; ++} ++#endif /* (OEM_ANDROID) */ ++ ++void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ ++ if (dhd && dhd->pub.up) { ++ memcpy(&dhd->pub.dhd_cspec, cspec, sizeof(wl_country_t)); ++#ifdef WL_CFG80211 ++ wl_update_wiphybands(NULL, true); ++#endif ++ } ++} ++ ++void dhd_bus_band_set(struct net_device *dev, uint band) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ if (dhd && dhd->pub.up) { ++#ifdef WL_CFG80211 ++ wl_update_wiphybands(NULL, true); ++#endif ++ } ++} ++ ++void dhd_net_if_lock(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ dhd_net_if_lock_local(dhd); ++} ++ ++void dhd_net_if_unlock(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ dhd_net_if_unlock_local(dhd); ++} ++ ++static void dhd_net_if_lock_local(dhd_info_t *dhd) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ if (dhd) ++ mutex_lock(&dhd->dhd_net_if_mutex); ++#endif ++} ++ ++static void dhd_net_if_unlock_local(dhd_info_t *dhd) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ if (dhd) ++ mutex_unlock(&dhd->dhd_net_if_mutex); ++#endif ++} ++ ++static void dhd_suspend_lock(dhd_pub_t *pub) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ if (dhd) ++ mutex_lock(&dhd->dhd_suspend_mutex); ++#endif ++} ++ ++static void dhd_suspend_unlock(dhd_pub_t *pub) ++{ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) && 1 ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ if (dhd) ++ mutex_unlock(&dhd->dhd_suspend_mutex); ++#endif ++} ++ ++unsigned long dhd_os_spin_lock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags = 0; ++ ++ if (dhd) ++ spin_lock_irqsave(&dhd->dhd_lock, flags); ++ ++ return flags; ++} ++ ++void dhd_os_spin_unlock(dhd_pub_t *pub, unsigned long flags) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ ++ if (dhd) ++ spin_unlock_irqrestore(&dhd->dhd_lock, flags); ++} ++ ++static int ++dhd_get_pend_8021x_cnt(dhd_info_t *dhd) ++{ ++ return (atomic_read(&dhd->pend_8021x_cnt)); ++} ++ ++#define MAX_WAIT_FOR_8021X_TX 25 ++ ++int ++dhd_wait_pend8021x(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int timeout = msecs_to_jiffies(10); ++ int ntimes = MAX_WAIT_FOR_8021X_TX; ++ int pend = dhd_get_pend_8021x_cnt(dhd); ++ ++ while (ntimes && pend) { ++ if (pend) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(timeout); ++ set_current_state(TASK_RUNNING); ++ ntimes--; ++ } ++ pend = dhd_get_pend_8021x_cnt(dhd); ++ } ++ if (ntimes == 0) ++ AP6210_ERR("%s: TIMEOUT\n", __FUNCTION__); ++ return pend; ++} ++ ++#ifdef DHD_DEBUG ++int ++write_to_file(dhd_pub_t *dhd, uint8 *buf, int size) ++{ ++ int ret = 0; ++ struct file *fp; ++ mm_segment_t old_fs; ++ loff_t pos = 0; ++ ++ /* change to KERNEL_DS address limit */ ++ old_fs = get_fs(); ++ set_fs(KERNEL_DS); ++ ++ /* open file to write */ ++ fp = filp_open("/tmp/mem_dump", O_WRONLY|O_CREAT, 0640); ++ if (!fp) { ++ AP6210_ERR("%s: open file error\n", __FUNCTION__); ++ ret = -1; ++ goto exit; ++ } ++ ++ /* Write buf to file */ ++ fp->f_op->write(fp, buf, size, &pos); ++ ++exit: ++ /* free buf before return */ ++ MFREE(dhd->osh, buf, size); ++ /* close file before return */ ++ if (fp) ++ filp_close(fp, current->files); ++ /* restore previous address limit */ ++ set_fs(old_fs); ++ ++ return ret; ++} ++#endif /* DHD_DEBUG */ ++ ++int dhd_os_wake_lock_timeout(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ int ret = 0; ++ ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++ ret = dhd->wakelock_rx_timeout_enable > dhd->wakelock_ctrl_timeout_enable ? ++ dhd->wakelock_rx_timeout_enable : dhd->wakelock_ctrl_timeout_enable; ++#ifdef CONFIG_HAS_WAKELOCK ++ if (dhd->wakelock_rx_timeout_enable) ++ wake_lock_timeout(dhd->wl_rxwake, ++ msecs_to_jiffies(dhd->wakelock_rx_timeout_enable)); ++ if (dhd->wakelock_ctrl_timeout_enable) ++ wake_lock_timeout(dhd->wl_ctrlwake, ++ msecs_to_jiffies(dhd->wakelock_ctrl_timeout_enable)); ++#endif ++ dhd->wakelock_rx_timeout_enable = 0; ++ dhd->wakelock_ctrl_timeout_enable = 0; ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return ret; ++} ++ ++int net_os_wake_lock_timeout(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) ++ ret = dhd_os_wake_lock_timeout(&dhd->pub); ++ return ret; ++} ++ ++int dhd_os_wake_lock_rx_timeout_enable(dhd_pub_t *pub, int val) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++ if (val > dhd->wakelock_rx_timeout_enable) ++ dhd->wakelock_rx_timeout_enable = val; ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return 0; ++} ++ ++int dhd_os_wake_lock_ctrl_timeout_enable(dhd_pub_t *pub, int val) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++ if (val > dhd->wakelock_ctrl_timeout_enable) ++ dhd->wakelock_ctrl_timeout_enable = val; ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return 0; ++} ++ ++int net_os_wake_lock_rx_timeout_enable(struct net_device *dev, int val) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) ++ ret = dhd_os_wake_lock_rx_timeout_enable(&dhd->pub, val); ++ return ret; ++} ++ ++int net_os_wake_lock_ctrl_timeout_enable(struct net_device *dev, int val) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) ++ ret = dhd_os_wake_lock_ctrl_timeout_enable(&dhd->pub, val); ++ return ret; ++} ++ ++int dhd_os_wake_lock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ int ret = 0; ++ ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++#ifdef CONFIG_HAS_WAKELOCK ++ if (!dhd->wakelock_counter) ++ wake_lock(dhd->wl_wifi); ++#endif ++ dhd->wakelock_counter++; ++ ret = dhd->wakelock_counter; ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return ret; ++} ++ ++int net_os_wake_lock(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) ++ ret = dhd_os_wake_lock(&dhd->pub); ++ return ret; ++} ++ ++int dhd_os_wake_unlock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ int ret = 0; ++ ++ dhd_os_wake_lock_timeout(pub); ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++ if (dhd->wakelock_counter) { ++ dhd->wakelock_counter--; ++#ifdef CONFIG_HAS_WAKELOCK ++ if (!dhd->wakelock_counter) ++ wake_unlock(dhd->wl_wifi); ++#endif ++ ret = dhd->wakelock_counter; ++ } ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return ret; ++} ++ ++int dhd_os_check_wakelock(void *dhdp) ++{ ++#ifdef CONFIG_HAS_WAKELOCK ++ dhd_pub_t *pub = (dhd_pub_t *)dhdp; ++ dhd_info_t *dhd; ++ ++ if (!pub) ++ return 0; ++ dhd = (dhd_info_t *)(pub->info); ++ ++ /* Indicate to the SD Host to avoid going to suspend if internal locks are up */ ++ if (dhd && (wake_lock_active(dhd->wl_wifi) || ++ (wake_lock_active(dhd->wl_wdwake)))) ++ return 1; ++#endif ++ return 0; ++} ++ ++int net_os_wake_unlock(struct net_device *dev) ++{ ++ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); ++ int ret = 0; ++ ++ if (dhd) ++ ret = dhd_os_wake_unlock(&dhd->pub); ++ return ret; ++} ++ ++int dhd_os_wd_wake_lock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ int ret = 0; ++ ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++#ifdef CONFIG_HAS_WAKELOCK ++ /* if wakelock_wd_counter was never used : lock it at once */ ++ if (!dhd->wakelock_wd_counter) { ++ if (dhd->wl_wdwake) ++ wake_lock(dhd->wl_wdwake); ++ else { ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ return 0; ++ } ++ } ++#endif ++ dhd->wakelock_wd_counter++; ++ ret = dhd->wakelock_wd_counter; ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return ret; ++} ++ ++int dhd_os_wd_wake_unlock(dhd_pub_t *pub) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(pub->info); ++ unsigned long flags; ++ int ret = 0; ++ ++ if (dhd) { ++ spin_lock_irqsave(&dhd->wakelock_spinlock, flags); ++ if (dhd->wakelock_wd_counter) { ++ dhd->wakelock_wd_counter = 0; ++#ifdef CONFIG_HAS_WAKELOCK ++ wake_unlock(dhd->wl_wdwake); ++#endif ++ } ++ spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); ++ } ++ return ret; ++} ++ ++int dhd_os_check_if_up(void *dhdp) ++{ ++ dhd_pub_t *pub = (dhd_pub_t *)dhdp; ++ ++ if (!pub) ++ return 0; ++ return pub->up; ++} ++ ++/* function to collect firmware, chip id and chip version info */ ++void dhd_set_version_info(dhd_pub_t *dhdp, char *fw) ++{ ++ int i; ++ ++ i = snprintf(info_string, sizeof(info_string), "Driver: %s\n Firmware: %s ", EPI_VERSION_STR, fw); ++ ++ if (!dhdp) ++ return; ++ ++ i = snprintf(&info_string[i], sizeof(info_string) - i, ++ "\n Chip: %x Rev %x Pkg %x", dhd_bus_chip_id(dhdp), ++ dhd_bus_chiprev_id(dhdp), dhd_bus_chippkg_id(dhdp)); ++ AP6210_ERR("Chip: %x Rev %x Pkg %x", dhd_bus_chip_id(dhdp), dhd_bus_chiprev_id(dhdp), dhd_bus_chippkg_id(dhdp)); ++} ++ ++int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd) ++{ ++ int ifidx; ++ int ret = 0; ++ dhd_info_t *dhd = NULL; ++ ++ if (!net || !netdev_priv(net)) { ++ AP6210_ERR("%s invalid parameter\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ dhd = *(dhd_info_t **)netdev_priv(net); ++ ifidx = dhd_net2idx(dhd, net); ++ if (ifidx == DHD_BAD_IF) { ++ AP6210_ERR("%s bad ifidx\n", __FUNCTION__); ++ return -ENODEV; ++ } ++ ++ DHD_OS_WAKE_LOCK(&dhd->pub); ++ ret = dhd_wl_ioctl(&dhd->pub, ifidx, ioc, ioc->buf, ioc->len); ++ dhd_check_hang(net, &dhd->pub, ret); ++ DHD_OS_WAKE_UNLOCK(&dhd->pub); ++ ++ return ret; ++} ++ ++bool dhd_os_check_hang(dhd_pub_t *dhdp, int ifidx, int ret) ++{ ++ struct net_device *net; ++ ++ net = dhd_idx2net(dhdp, ifidx); ++ return dhd_check_hang(net, dhdp, ret); ++} ++ ++ ++#ifdef PROP_TXSTATUS ++extern int dhd_wlfc_interface_entry_update(void* state, ewlfc_mac_entry_action_t action, uint8 ifid, ++ uint8 iftype, uint8* ea); ++extern int dhd_wlfc_FIFOcreditmap_update(void* state, uint8* credits); ++ ++int dhd_wlfc_interface_event(struct dhd_info *dhd, ++ ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) ++{ ++ int status; ++ ++ dhd_os_wlfc_block(&dhd->pub); ++ if (dhd->pub.wlfc_state == NULL) { ++ dhd_os_wlfc_unblock(&dhd->pub); ++ return BCME_OK; ++ } ++ ++ status = dhd_wlfc_interface_entry_update(dhd->pub.wlfc_state, action, ifid, iftype, ea); ++ dhd_os_wlfc_unblock(&dhd->pub); ++ return status; ++} ++ ++int dhd_wlfc_FIFOcreditmap_event(struct dhd_info *dhd, uint8* event_data) ++{ ++ int status; ++ ++ dhd_os_wlfc_block(&dhd->pub); ++ if (dhd->pub.wlfc_state == NULL) { ++ dhd_os_wlfc_unblock(&dhd->pub); ++ return BCME_OK; ++ } ++ ++ status = dhd_wlfc_FIFOcreditmap_update(dhd->pub.wlfc_state, event_data); ++ dhd_os_wlfc_unblock(&dhd->pub); ++ return status; ++} ++ ++int dhd_wlfc_event(struct dhd_info *dhd) ++{ ++ int status; ++ ++ dhd_os_wlfc_block(&dhd->pub); ++ status = dhd_wlfc_enable(&dhd->pub); ++ dhd_os_wlfc_unblock(&dhd->pub); ++ return status; ++} ++#endif /* PROP_TXSTATUS */ ++ ++#ifdef BCMDBGFS ++ ++#include ++ ++extern uint32 dhd_readregl(void *bp, uint32 addr); ++extern uint32 dhd_writeregl(void *bp, uint32 addr, uint32 data); ++ ++typedef struct dhd_dbgfs { ++ struct dentry *debugfs_dir; ++ struct dentry *debugfs_mem; ++ dhd_pub_t *dhdp; ++ uint32 size; ++} dhd_dbgfs_t; ++ ++dhd_dbgfs_t g_dbgfs; ++ ++static int ++dhd_dbg_state_open(struct inode *inode, struct file *file) ++{ ++ file->private_data = inode->i_private; ++ return 0; ++} ++ ++static ssize_t ++dhd_dbg_state_read(struct file *file, char __user *ubuf, ++ size_t count, loff_t *ppos) ++{ ++ ssize_t rval; ++ uint32 tmp; ++ loff_t pos = *ppos; ++ size_t ret; ++ ++ if (pos < 0) ++ return -EINVAL; ++ if (pos >= g_dbgfs.size || !count) ++ return 0; ++ if (count > g_dbgfs.size - pos) ++ count = g_dbgfs.size - pos; ++ ++ /* Basically enforce aligned 4 byte reads. It's up to the user to work out the details */ ++ tmp = dhd_readregl(g_dbgfs.dhdp->bus, file->f_pos & (~3)); ++ ++ ret = copy_to_user(ubuf, &tmp, 4); ++ if (ret == count) ++ return -EFAULT; ++ ++ count -= ret; ++ *ppos = pos + count; ++ rval = count; ++ ++ return rval; ++} ++ ++ ++static ssize_t ++dhd_debugfs_write(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos) ++{ ++ loff_t pos = *ppos; ++ size_t ret; ++ uint32 buf; ++ ++ if (pos < 0) ++ return -EINVAL; ++ if (pos >= g_dbgfs.size || !count) ++ return 0; ++ if (count > g_dbgfs.size - pos) ++ count = g_dbgfs.size - pos; ++ ++ ret = copy_from_user(&buf, ubuf, sizeof(uint32)); ++ if (ret == count) ++ return -EFAULT; ++ ++ /* Basically enforce aligned 4 byte writes. It's up to the user to work out the details */ ++ dhd_writeregl(g_dbgfs.dhdp->bus, file->f_pos & (~3), buf); ++ ++ return count; ++} ++ ++ ++loff_t ++dhd_debugfs_lseek(struct file *file, loff_t off, int whence) ++{ ++ loff_t pos = -1; ++ ++ switch (whence) { ++ case 0: ++ pos = off; ++ break; ++ case 1: ++ pos = file->f_pos + off; ++ break; ++ case 2: ++ pos = g_dbgfs.size - off; ++ } ++ return (pos < 0 || pos > g_dbgfs.size) ? -EINVAL : (file->f_pos = pos); ++} ++ ++static const struct file_operations dhd_dbg_state_ops = { ++ .read = dhd_dbg_state_read, ++ .write = dhd_debugfs_write, ++ .open = dhd_dbg_state_open, ++ .llseek = dhd_debugfs_lseek ++}; ++ ++static void dhd_dbg_create(void) ++{ ++ if (g_dbgfs.debugfs_dir) { ++ g_dbgfs.debugfs_mem = debugfs_create_file("mem", 0644, g_dbgfs.debugfs_dir, ++ NULL, &dhd_dbg_state_ops); ++ } ++} ++ ++void dhd_dbg_init(dhd_pub_t *dhdp) ++{ ++ int err; ++ ++ g_dbgfs.dhdp = dhdp; ++ g_dbgfs.size = 0x20000000; /* Allow access to various cores regs */ ++ ++ g_dbgfs.debugfs_dir = debugfs_create_dir("dhd", 0); ++ if (IS_ERR(g_dbgfs.debugfs_dir)) { ++ err = PTR_ERR(g_dbgfs.debugfs_dir); ++ g_dbgfs.debugfs_dir = NULL; ++ return; ++ } ++ ++ dhd_dbg_create(); ++ ++ return; ++} ++ ++void dhd_dbg_remove(void) ++{ ++ debugfs_remove(g_dbgfs.debugfs_mem); ++ debugfs_remove(g_dbgfs.debugfs_dir); ++ ++ bzero((unsigned char *) &g_dbgfs, sizeof(g_dbgfs)); ++ ++} ++#endif /* ifdef BCMDBGFS */ ++ ++#ifdef WLMEDIA_HTSF ++ ++static ++void dhd_htsf_addtxts(dhd_pub_t *dhdp, void *pktbuf) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)(dhdp->info); ++ struct sk_buff *skb; ++ uint32 htsf = 0; ++ uint16 dport = 0, oldmagic = 0xACAC; ++ char *p1; ++ htsfts_t ts; ++ ++ /* timestamp packet */ ++ ++ p1 = (char*) PKTDATA(dhdp->osh, pktbuf); ++ ++ if (PKTLEN(dhdp->osh, pktbuf) > HTSF_MINLEN) { ++/* memcpy(&proto, p1+26, 4); */ ++ memcpy(&dport, p1+40, 2); ++/* proto = ((ntoh32(proto))>> 16) & 0xFF; */ ++ dport = ntoh16(dport); ++ } ++ ++ /* timestamp only if icmp or udb iperf with port 5555 */ ++/* if (proto == 17 && dport == tsport) { */ ++ if (dport >= tsport && dport <= tsport + 20) { ++ ++ skb = (struct sk_buff *) pktbuf; ++ ++ htsf = dhd_get_htsf(dhd, 0); ++ memset(skb->data + 44, 0, 2); /* clear checksum */ ++ memcpy(skb->data+82, &oldmagic, 2); ++ memcpy(skb->data+84, &htsf, 4); ++ ++ memset(&ts, 0, sizeof(htsfts_t)); ++ ts.magic = HTSFMAGIC; ++ ts.prio = PKTPRIO(pktbuf); ++ ts.seqnum = htsf_seqnum++; ++ ts.c10 = get_cycles(); ++ ts.t10 = htsf; ++ ts.endmagic = HTSFENDMAGIC; ++ ++ memcpy(skb->data + HTSF_HOSTOFFSET, &ts, sizeof(ts)); ++ } ++} ++ ++static void dhd_dump_htsfhisto(histo_t *his, char *s) ++{ ++ int pktcnt = 0, curval = 0, i; ++ for (i = 0; i < (NUMBIN-2); i++) { ++ curval += 500; ++ AP6210_DUMP("%d ", his->bin[i]); ++ pktcnt += his->bin[i]; ++ } ++ AP6210_DUMP(" max: %d TotPkt: %d neg: %d [%s]\n", his->bin[NUMBIN-2], pktcnt, ++ his->bin[NUMBIN-1], s); ++} ++ ++static ++void sorttobin(int value, histo_t *histo) ++{ ++ int i, binval = 0; ++ ++ if (value < 0) { ++ histo->bin[NUMBIN-1]++; ++ return; ++ } ++ if (value > histo->bin[NUMBIN-2]) /* store the max value */ ++ histo->bin[NUMBIN-2] = value; ++ ++ for (i = 0; i < (NUMBIN-2); i++) { ++ binval += 500; /* 500m s bins */ ++ if (value <= binval) { ++ histo->bin[i]++; ++ return; ++ } ++ } ++ histo->bin[NUMBIN-3]++; ++} ++ ++static ++void dhd_htsf_addrxts(dhd_pub_t *dhdp, void *pktbuf) ++{ ++ dhd_info_t *dhd = (dhd_info_t *)dhdp->info; ++ struct sk_buff *skb; ++ char *p1; ++ uint16 old_magic; ++ int d1, d2, d3, end2end; ++ htsfts_t *htsf_ts; ++ uint32 htsf; ++ ++ skb = PKTTONATIVE(dhdp->osh, pktbuf); ++ p1 = (char*)PKTDATA(dhdp->osh, pktbuf); ++ ++ if (PKTLEN(osh, pktbuf) > HTSF_MINLEN) { ++ memcpy(&old_magic, p1+78, 2); ++ htsf_ts = (htsfts_t*) (p1 + HTSF_HOSTOFFSET - 4); ++ } ++ else ++ return; ++ ++ if (htsf_ts->magic == HTSFMAGIC) { ++ htsf_ts->tE0 = dhd_get_htsf(dhd, 0); ++ htsf_ts->cE0 = get_cycles(); ++ } ++ ++ if (old_magic == 0xACAC) { ++ ++ tspktcnt++; ++ htsf = dhd_get_htsf(dhd, 0); ++ memcpy(skb->data+92, &htsf, sizeof(uint32)); ++ ++ memcpy(&ts[tsidx].t1, skb->data+80, 16); ++ ++ d1 = ts[tsidx].t2 - ts[tsidx].t1; ++ d2 = ts[tsidx].t3 - ts[tsidx].t2; ++ d3 = ts[tsidx].t4 - ts[tsidx].t3; ++ end2end = ts[tsidx].t4 - ts[tsidx].t1; ++ ++ sorttobin(d1, &vi_d1); ++ sorttobin(d2, &vi_d2); ++ sorttobin(d3, &vi_d3); ++ sorttobin(end2end, &vi_d4); ++ ++ if (end2end > 0 && end2end > maxdelay) { ++ maxdelay = end2end; ++ maxdelaypktno = tspktcnt; ++ memcpy(&maxdelayts, &ts[tsidx], 16); ++ } ++ if (++tsidx >= TSMAX) ++ tsidx = 0; ++ } ++} ++ ++uint32 dhd_get_htsf(dhd_info_t *dhd, int ifidx) ++{ ++ uint32 htsf = 0, cur_cycle, delta, delta_us; ++ uint32 factor, baseval, baseval2; ++ cycles_t t; ++ ++ t = get_cycles(); ++ cur_cycle = t; ++ ++ if (cur_cycle > dhd->htsf.last_cycle) ++ delta = cur_cycle - dhd->htsf.last_cycle; ++ else { ++ delta = cur_cycle + (0xFFFFFFFF - dhd->htsf.last_cycle); ++ } ++ ++ delta = delta >> 4; ++ ++ if (dhd->htsf.coef) { ++ /* times ten to get the first digit */ ++ factor = (dhd->htsf.coef*10 + dhd->htsf.coefdec1); ++ baseval = (delta*10)/factor; ++ baseval2 = (delta*10)/(factor+1); ++ delta_us = (baseval - (((baseval - baseval2) * dhd->htsf.coefdec2)) / 10); ++ htsf = (delta_us << 4) + dhd->htsf.last_tsf + HTSF_BUS_DELAY; ++ } ++ else { ++ AP6210_ERR("-------dhd->htsf.coef = 0 -------\n"); ++ } ++ ++ return htsf; ++} ++ ++static void dhd_dump_latency(void) ++{ ++ int i, max = 0; ++ int d1, d2, d3, d4, d5; ++ ++ AP6210_DEBUG("T1 T2 T3 T4 d1 d2 t4-t1 i \n"); ++ for (i = 0; i < TSMAX; i++) { ++ d1 = ts[i].t2 - ts[i].t1; ++ d2 = ts[i].t3 - ts[i].t2; ++ d3 = ts[i].t4 - ts[i].t3; ++ d4 = ts[i].t4 - ts[i].t1; ++ d5 = ts[max].t4-ts[max].t1; ++ if (d4 > d5 && d4 > 0) { ++ max = i; ++ } ++ AP6210_DUMP("%08X %08X %08X %08X \t%d %d %d %d i=%d\n", ++ ts[i].t1, ts[i].t2, ts[i].t3, ts[i].t4, ++ d1, d2, d3, d4, i); ++ } ++ ++ AP6210_DEBUG("current idx = %d \n", tsidx); ++ ++ AP6210_DEBUG("Highest latency %d pkt no.%d total=%d\n", maxdelay, maxdelaypktno, tspktcnt); ++ AP6210_DEBUG("%08X %08X %08X %08X \t%d %d %d %d\n", ++ maxdelayts.t1, maxdelayts.t2, maxdelayts.t3, maxdelayts.t4, ++ maxdelayts.t2 - maxdelayts.t1, ++ maxdelayts.t3 - maxdelayts.t2, ++ maxdelayts.t4 - maxdelayts.t3, ++ maxdelayts.t4 - maxdelayts.t1); ++} ++ ++ ++static int ++dhd_ioctl_htsf_get(dhd_info_t *dhd, int ifidx) ++{ ++ wl_ioctl_t ioc; ++ char buf[32]; ++ int ret; ++ uint32 s1, s2; ++ ++ struct tsf { ++ uint32 low; ++ uint32 high; ++ } tsf_buf; ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ memset(&tsf_buf, 0, sizeof(tsf_buf)); ++ ++ ioc.cmd = WLC_GET_VAR; ++ ioc.buf = buf; ++ ioc.len = (uint)sizeof(buf); ++ ioc.set = FALSE; ++ ++ strncpy(buf, "tsf", sizeof(buf) - 1); ++ buf[sizeof(buf) - 1] = '\0'; ++ s1 = dhd_get_htsf(dhd, 0); ++ if ((ret = dhd_wl_ioctl(&dhd->pub, ifidx, &ioc, ioc.buf, ioc.len)) < 0) { ++ if (ret == -EIO) { ++ AP6210_ERR("%s: tsf is not supported by device\n", ++ dhd_ifname(&dhd->pub, ifidx)); ++ return -EOPNOTSUPP; ++ } ++ return ret; ++ } ++ s2 = dhd_get_htsf(dhd, 0); ++ ++ memcpy(&tsf_buf, buf, sizeof(tsf_buf)); ++ AP6210_DEBUG("TSF_h=%04X lo=%08X Calc:htsf=%08X, coef=%d.%d%d delta=%d ", ++ tsf_buf.high, tsf_buf.low, s2, dhd->htsf.coef, dhd->htsf.coefdec1, ++ dhd->htsf.coefdec2, s2-tsf_buf.low); ++ AP6210_DEBUG("lasttsf=%08X lastcycle=%08X\n", dhd->htsf.last_tsf, dhd->htsf.last_cycle); ++ return 0; ++} ++ ++void htsf_update(dhd_info_t *dhd, void *data) ++{ ++ static ulong cur_cycle = 0, prev_cycle = 0; ++ uint32 htsf, tsf_delta = 0; ++ uint32 hfactor = 0, cyc_delta, dec1 = 0, dec2, dec3, tmp; ++ ulong b, a; ++ cycles_t t; ++ ++ /* cycles_t in inlcude/mips/timex.h */ ++ ++ t = get_cycles(); ++ ++ prev_cycle = cur_cycle; ++ cur_cycle = t; ++ ++ if (cur_cycle > prev_cycle) ++ cyc_delta = cur_cycle - prev_cycle; ++ else { ++ b = cur_cycle; ++ a = prev_cycle; ++ cyc_delta = cur_cycle + (0xFFFFFFFF - prev_cycle); ++ } ++ ++ if (data == NULL) ++ AP6210_DEBUG(" tsf update ata point er is null \n"); ++ ++ memcpy(&prev_tsf, &cur_tsf, sizeof(tsf_t)); ++ memcpy(&cur_tsf, data, sizeof(tsf_t)); ++ ++ if (cur_tsf.low == 0) { ++ AP6210_DEBUG(" ---- 0 TSF, do not update, return\n"); ++ return; ++ } ++ ++ if (cur_tsf.low > prev_tsf.low) ++ tsf_delta = (cur_tsf.low - prev_tsf.low); ++ else { ++ AP6210_DEBUG(" ---- tsf low is smaller cur_tsf= %08X, prev_tsf=%08X, \n", ++ cur_tsf.low, prev_tsf.low); ++ if (cur_tsf.high > prev_tsf.high) { ++ tsf_delta = cur_tsf.low + (0xFFFFFFFF - prev_tsf.low); ++ AP6210_DEBUG(" ---- Wrap around tsf coutner adjusted TSF=%08X\n", tsf_delta); ++ } ++ else ++ return; /* do not update */ ++ } ++ ++ if (tsf_delta) { ++ hfactor = cyc_delta / tsf_delta; ++ tmp = (cyc_delta - (hfactor * tsf_delta))*10; ++ dec1 = tmp/tsf_delta; ++ dec2 = ((tmp - dec1*tsf_delta)*10) / tsf_delta; ++ tmp = (tmp - (dec1*tsf_delta))*10; ++ dec3 = ((tmp - dec2*tsf_delta)*10) / tsf_delta; ++ ++ if (dec3 > 4) { ++ if (dec2 == 9) { ++ dec2 = 0; ++ if (dec1 == 9) { ++ dec1 = 0; ++ hfactor++; ++ } ++ else { ++ dec1++; ++ } ++ } ++ else ++ dec2++; ++ } ++ } ++ ++ if (hfactor) { ++ htsf = ((cyc_delta * 10) / (hfactor*10+dec1)) + prev_tsf.low; ++ dhd->htsf.coef = hfactor; ++ dhd->htsf.last_cycle = cur_cycle; ++ dhd->htsf.last_tsf = cur_tsf.low; ++ dhd->htsf.coefdec1 = dec1; ++ dhd->htsf.coefdec2 = dec2; ++ } ++ else { ++ htsf = prev_tsf.low; ++ } ++} ++ ++#endif /* WLMEDIA_HTSF */ +diff --git a/drivers/net/wireless/ap6210/dhd_linux_sched.c b/drivers/net/wireless/ap6210/dhd_linux_sched.c +new file mode 100644 +index 0000000..290caf7 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_linux_sched.c +@@ -0,0 +1,39 @@ ++/* ++ * Expose some of the kernel scheduler routines ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_linux_sched.c 291086 2011-10-21 01:17:24Z $ ++ */ ++#include ++#include ++#include ++#include ++#include ++ ++int setScheduler(struct task_struct *p, int policy, struct sched_param *param) ++{ ++ int rc = 0; ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++ rc = sched_setscheduler(p, policy, param); ++#endif /* LinuxVer */ ++ return rc; ++} +diff --git a/drivers/net/wireless/ap6210/dhd_pno.c b/drivers/net/wireless/ap6210/dhd_pno.c +new file mode 100644 +index 0000000..317a063 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_pno.c +@@ -0,0 +1,1838 @@ ++/* ++ * Broadcom Dongle Host Driver (DHD) ++ * Prefered Network Offload and Wi-Fi Location Service(WLS) code. ++ * ++ * Copyright (C) 1999-2013, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_pno.c 420056 2013-08-24 00:53:12Z $ ++ */ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#ifdef __BIG_ENDIAN ++#include ++#define htod32(i) (bcmswap32(i)) ++#define htod16(i) (bcmswap16(i)) ++#define dtoh32(i) (bcmswap32(i)) ++#define dtoh16(i) (bcmswap16(i)) ++#define htodchanspec(i) htod16(i) ++#define dtohchanspec(i) dtoh16(i) ++#else ++#define htod32(i) i ++#define htod16(i) i ++#define dtoh32(i) i ++#define dtoh16(i) i ++#define htodchanspec(i) i ++#define dtohchanspec(i) i ++#endif /* IL_BIGENDINA */ ++ ++#define NULL_CHECK(p, s, err) \ ++ do { \ ++ if (!(p)) { \ ++ printf("NULL POINTER (%s) : %s\n", __FUNCTION__, (s)); \ ++ err = BCME_ERROR; \ ++ return err; \ ++ } \ ++ } while (0) ++#define PNO_GET_PNOSTATE(dhd) ((dhd_pno_status_info_t *)dhd->pno_state) ++#define PNO_BESTNET_LEN 1024 ++#define PNO_ON 1 ++#define PNO_OFF 0 ++#define CHANNEL_2G_MAX 14 ++#define MAX_NODE_CNT 5 ++#define WLS_SUPPORTED(pno_state) (pno_state->wls_supported == TRUE) ++#define TIME_DIFF(timestamp1, timestamp2) (abs((uint32)(timestamp1/1000) \ ++ - (uint32)(timestamp2/1000))) ++ ++#define ENTRY_OVERHEAD strlen("bssid=\nssid=\nfreq=\nlevel=\nage=\ndist=\ndistSd=\n====") ++#define TIME_MIN_DIFF 5 ++static inline bool ++is_dfs(uint16 channel) ++{ ++ if (channel >= 52 && channel <= 64) /* class 2 */ ++ return TRUE; ++ else if (channel >= 100 && channel <= 140) /* class 4 */ ++ return TRUE; ++ else ++ return FALSE; ++} ++static int ++_dhd_pno_clean(dhd_pub_t *dhd) ++{ ++ int pfn = 0; ++ int err; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ /* Disable PNO */ ++ err = dhd_iovar(dhd, 0, "pfn", (char *)&pfn, sizeof(pfn), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfn(error : %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ _pno_state->pno_status = DHD_PNO_DISABLED; ++ err = dhd_iovar(dhd, 0, "pfnclear", NULL, 0, 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfnclear(error : %d)\n", ++ __FUNCTION__, err); ++ } ++exit: ++ return err; ++} ++ ++static int ++_dhd_pno_suspend(dhd_pub_t *dhd) ++{ ++ int err; ++ int suspend = 1; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ err = dhd_iovar(dhd, 0, "pfn_suspend", (char *)&suspend, sizeof(suspend), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to suspend pfn(error :%d)\n", __FUNCTION__, err); ++ goto exit; ++ ++ } ++ _pno_state->pno_status = DHD_PNO_SUSPEND; ++exit: ++ return err; ++} ++static int ++_dhd_pno_enable(dhd_pub_t *dhd, int enable) ++{ ++ int err = BCME_OK; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ ++ if (enable & 0xfffe) { ++ AP6210_ERR("%s invalid value\n", __FUNCTION__); ++ err = BCME_BADARG; ++ goto exit; ++ } ++ if (!dhd_support_sta_mode(dhd)) { ++ AP6210_ERR("PNO is not allowed for non-STA mode"); ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ if (enable) { ++ if ((_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) && ++ dhd_is_associated(dhd, NULL, NULL)) { ++ AP6210_ERR("%s Legacy PNO mode cannot be enabled " ++ "in assoc mode , ignore it\n", __FUNCTION__); ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ } ++ /* Enable/Disable PNO */ ++ err = dhd_iovar(dhd, 0, "pfn", (char *)&enable, sizeof(enable), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfn_set\n", __FUNCTION__); ++ goto exit; ++ } ++ _pno_state->pno_status = (enable)? ++ DHD_PNO_ENABLED : DHD_PNO_DISABLED; ++ if (!enable) ++ _pno_state->pno_mode = DHD_PNO_NONE_MODE; ++ ++ AP6210_DEBUG("%s set pno as %s\n", ++ __FUNCTION__, enable ? "Enable" : "Disable"); ++exit: ++ return err; ++} ++ ++static int ++_dhd_pno_set(dhd_pub_t *dhd, const dhd_pno_params_t *pno_params, dhd_pno_mode_t mode) ++{ ++ int err = BCME_OK; ++ wl_pfn_param_t pfn_param; ++ dhd_pno_params_t *_params; ++ dhd_pno_status_info_t *_pno_state; ++ bool combined_scan = FALSE; ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ ++ memset(&pfn_param, 0, sizeof(pfn_param)); ++ ++ /* set pfn parameters */ ++ pfn_param.version = htod32(PFN_VERSION); ++ pfn_param.flags = ((PFN_LIST_ORDER << SORT_CRITERIA_BIT) | ++ (ENABLE << IMMEDIATE_SCAN_BIT) | (ENABLE << REPORT_SEPERATELY_BIT)); ++ if (mode == DHD_PNO_LEGACY_MODE) { ++ /* check and set extra pno params */ ++ if ((pno_params->params_legacy.pno_repeat != 0) || ++ (pno_params->params_legacy.pno_freq_expo_max != 0)) { ++ pfn_param.flags |= htod16(ENABLE << ENABLE_ADAPTSCAN_BIT); ++ pfn_param.repeat = (uchar) (pno_params->params_legacy.pno_repeat); ++ pfn_param.exp = (uchar) (pno_params->params_legacy.pno_freq_expo_max); ++ } ++ /* set up pno scan fr */ ++ if (pno_params->params_legacy.scan_fr != 0) ++ pfn_param.scan_freq = htod32(pno_params->params_legacy.scan_fr); ++ if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { ++ AP6210_DEBUG("will enable combined scan with BATCHIG SCAN MODE\n"); ++ mode |= DHD_PNO_BATCH_MODE; ++ combined_scan = TRUE; ++ } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { ++ AP6210_DEBUG("will enable combined scan with HOTLIST SCAN MODE\n"); ++ mode |= DHD_PNO_HOTLIST_MODE; ++ combined_scan = TRUE; ++ } ++ } ++ if (mode & (DHD_PNO_BATCH_MODE | DHD_PNO_HOTLIST_MODE)) { ++ /* Scan frequency of 30 sec */ ++ pfn_param.scan_freq = htod32(30); ++ /* slow adapt scan is off by default */ ++ pfn_param.slow_freq = htod32(0); ++ /* RSSI margin of 30 dBm */ ++ pfn_param.rssi_margin = htod16(30); ++ /* Network timeout 60 sec */ ++ pfn_param.lost_network_timeout = htod32(60); ++ /* best n = 2 by default */ ++ pfn_param.bestn = DEFAULT_BESTN; ++ /* mscan m=0 by default, so not record best networks by default */ ++ pfn_param.mscan = DEFAULT_MSCAN; ++ /* default repeat = 10 */ ++ pfn_param.repeat = DEFAULT_REPEAT; ++ /* by default, maximum scan interval = 2^2 ++ * scan_freq when adaptive scan is turned on ++ */ ++ pfn_param.exp = DEFAULT_EXP; ++ if (mode == DHD_PNO_BATCH_MODE) { ++ /* In case of BATCH SCAN */ ++ if (pno_params->params_batch.bestn) ++ pfn_param.bestn = pno_params->params_batch.bestn; ++ if (pno_params->params_batch.scan_fr) ++ pfn_param.scan_freq = htod32(pno_params->params_batch.scan_fr); ++ if (pno_params->params_batch.mscan) ++ pfn_param.mscan = pno_params->params_batch.mscan; ++ /* enable broadcast scan */ ++ pfn_param.flags |= (ENABLE << ENABLE_BD_SCAN_BIT); ++ } else if (mode == DHD_PNO_HOTLIST_MODE) { ++ /* In case of HOTLIST SCAN */ ++ if (pno_params->params_hotlist.scan_fr) ++ pfn_param.scan_freq = htod32(pno_params->params_hotlist.scan_fr); ++ pfn_param.bestn = 0; ++ pfn_param.repeat = 0; ++ /* enable broadcast scan */ ++ pfn_param.flags |= (ENABLE << ENABLE_BD_SCAN_BIT); ++ } ++ if (combined_scan) { ++ /* Disable Adaptive Scan */ ++ pfn_param.flags &= ~(htod16(ENABLE << ENABLE_ADAPTSCAN_BIT)); ++ pfn_param.flags |= (ENABLE << ENABLE_BD_SCAN_BIT); ++ pfn_param.repeat = 0; ++ pfn_param.exp = 0; ++ if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { ++ /* In case of Legacy PNO + BATCH SCAN */ ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); ++ if (_params->params_batch.bestn) ++ pfn_param.bestn = _params->params_batch.bestn; ++ if (_params->params_batch.scan_fr) ++ pfn_param.scan_freq = htod32(_params->params_batch.scan_fr); ++ if (_params->params_batch.mscan) ++ pfn_param.mscan = _params->params_batch.mscan; ++ } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { ++ /* In case of Legacy PNO + HOTLIST SCAN */ ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); ++ if (_params->params_hotlist.scan_fr) ++ pfn_param.scan_freq = htod32(_params->params_hotlist.scan_fr); ++ pfn_param.bestn = 0; ++ pfn_param.repeat = 0; ++ } ++ } ++ } ++ if (pfn_param.scan_freq < htod32(PNO_SCAN_MIN_FW_SEC) || ++ pfn_param.scan_freq > htod32(PNO_SCAN_MAX_FW_SEC)) { ++ AP6210_ERR("%s pno freq(%d sec) is not valid \n", ++ __FUNCTION__, PNO_SCAN_MIN_FW_SEC); ++ err = BCME_BADARG; ++ goto exit; ++ } ++ if (mode == DHD_PNO_BATCH_MODE) { ++ int _tmp = pfn_param.bestn; ++ /* set bestn to calculate the max mscan which firmware supports */ ++ err = dhd_iovar(dhd, 0, "pfnmem", (char *)&_tmp, sizeof(_tmp), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to set pfnmscan\n", __FUNCTION__); ++ goto exit; ++ } ++ /* get max mscan which the firmware supports */ ++ err = dhd_iovar(dhd, 0, "pfnmem", (char *)&_tmp, sizeof(_tmp), 0); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to get pfnmscan\n", __FUNCTION__); ++ goto exit; ++ } ++ AP6210_DEBUG(" returned mscan : %d, set bestn : %d\n", _tmp, pfn_param.bestn); ++ pfn_param.mscan = MIN(pfn_param.mscan, _tmp); ++ } ++ err = dhd_iovar(dhd, 0, "pfn_set", (char *)&pfn_param, sizeof(pfn_param), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfn_set\n", __FUNCTION__); ++ goto exit; ++ } ++ /* need to return mscan if this is for batch scan instead of err */ ++ err = (mode == DHD_PNO_BATCH_MODE)? pfn_param.mscan : err; ++exit: ++ return err; ++} ++static int ++_dhd_pno_add_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssids_list, int nssid) ++{ ++ int err = BCME_OK; ++ int i = 0; ++ wl_pfn_t pfn_element; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ if (nssid) { ++ NULL_CHECK(ssids_list, "ssid list is NULL", err); ++ } ++ memset(&pfn_element, 0, sizeof(pfn_element)); ++ { ++ int j; ++ for (j = 0; j < nssid; j++) { ++ AP6210_DEBUG("%d: scan for %s size = %d\n", j, ++ ssids_list[j].SSID, ssids_list[j].SSID_len); ++ } ++ } ++ /* Check for broadcast ssid */ ++ for (i = 0; i < nssid; i++) { ++ if (!ssids_list[i].SSID_len) { ++ AP6210_ERR("%d: Broadcast SSID is ilegal for PNO setting\n", i); ++ err = BCME_ERROR; ++ goto exit; ++ } ++ } ++ /* set all pfn ssid */ ++ for (i = 0; i < nssid; i++) { ++ pfn_element.infra = htod32(DOT11_BSSTYPE_INFRASTRUCTURE); ++ pfn_element.auth = (DOT11_OPEN_SYSTEM); ++ pfn_element.wpa_auth = htod32(WPA_AUTH_PFN_ANY); ++ pfn_element.wsec = htod32(0); ++ pfn_element.infra = htod32(1); ++ pfn_element.flags = htod32(ENABLE << WL_PFN_HIDDEN_BIT); ++ memcpy((char *)pfn_element.ssid.SSID, ssids_list[i].SSID, ++ ssids_list[i].SSID_len); ++ pfn_element.ssid.SSID_len = ssids_list[i].SSID_len; ++ err = dhd_iovar(dhd, 0, "pfn_add", (char *)&pfn_element, ++ sizeof(pfn_element), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfn_add\n", __FUNCTION__); ++ goto exit; ++ } ++ } ++exit: ++ return err; ++} ++/* qsort compare function */ ++static int ++_dhd_pno_cmpfunc(const void *a, const void *b) ++{ ++ return (*(uint16*)a - *(uint16*)b); ++} ++static int ++_dhd_pno_chan_merge(uint16 *d_chan_list, int *nchan, ++ uint16 *chan_list1, int nchan1, uint16 *chan_list2, int nchan2) ++{ ++ int err = BCME_OK; ++ int i = 0, j = 0, k = 0; ++ uint16 tmp; ++ NULL_CHECK(d_chan_list, "d_chan_list is NULL", err); ++ NULL_CHECK(nchan, "nchan is NULL", err); ++ NULL_CHECK(chan_list1, "chan_list1 is NULL", err); ++ NULL_CHECK(chan_list2, "chan_list2 is NULL", err); ++ /* chan_list1 and chan_list2 should be sorted at first */ ++ while (i < nchan1 && j < nchan2) { ++ tmp = chan_list1[i] < chan_list2[j]? ++ chan_list1[i++] : chan_list2[j++]; ++ for (; i < nchan1 && chan_list1[i] == tmp; i++); ++ for (; j < nchan2 && chan_list2[j] == tmp; j++); ++ d_chan_list[k++] = tmp; ++ } ++ ++ while (i < nchan1) { ++ tmp = chan_list1[i++]; ++ for (; i < nchan1 && chan_list1[i] == tmp; i++); ++ d_chan_list[k++] = tmp; ++ } ++ ++ while (j < nchan2) { ++ tmp = chan_list2[j++]; ++ for (; j < nchan2 && chan_list2[j] == tmp; j++); ++ d_chan_list[k++] = tmp; ++ ++ } ++ *nchan = k; ++ return err; ++} ++static int ++_dhd_pno_get_channels(dhd_pub_t *dhd, uint16 *d_chan_list, ++ int *nchan, uint8 band, bool skip_dfs) ++{ ++ int err = BCME_OK; ++ int i, j; ++ uint32 chan_buf[WL_NUMCHANNELS + 1]; ++ wl_uint32_list_t *list; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ if (*nchan) { ++ NULL_CHECK(d_chan_list, "d_chan_list is NULL", err); ++ } ++ list = (wl_uint32_list_t *) (void *)chan_buf; ++ list->count = htod32(WL_NUMCHANNELS); ++ err = dhd_wl_ioctl_cmd(dhd, WLC_GET_VALID_CHANNELS, chan_buf, sizeof(chan_buf), FALSE, 0); ++ if (err < 0) { ++ AP6210_ERR("failed to get channel list (err: %d)\n", err); ++ goto exit; ++ } ++ for (i = 0, j = 0; i < dtoh32(list->count) && i < *nchan; i++) { ++ if (band == WLC_BAND_2G) { ++ if (dtoh32(list->element[i]) > CHANNEL_2G_MAX) ++ continue; ++ } else if (band == WLC_BAND_5G) { ++ if (dtoh32(list->element[i]) <= CHANNEL_2G_MAX) ++ continue; ++ if (skip_dfs && is_dfs(dtoh32(list->element[i]))) ++ continue; ++ ++ } else { /* All channels */ ++ if (skip_dfs && is_dfs(dtoh32(list->element[i]))) ++ continue; ++ } ++ d_chan_list[j++] = dtoh32(list->element[i]); ++ } ++ *nchan = j; ++exit: ++ return err; ++} ++static int ++_dhd_pno_convert_format(dhd_pub_t *dhd, struct dhd_pno_batch_params *params_batch, ++ char *buf, int nbufsize) ++{ ++ int err = BCME_OK; ++ int bytes_written = 0, nreadsize = 0; ++ int t_delta = 0; ++ int nleftsize = nbufsize; ++ uint8 cnt = 0; ++ char *bp = buf; ++ char eabuf[ETHER_ADDR_STR_LEN]; ++#ifdef PNO_DEBUG ++ char *_base_bp; ++ char msg[150]; ++#endif ++ dhd_pno_bestnet_entry_t *iter, *next; ++ dhd_pno_scan_results_t *siter, *snext; ++ dhd_pno_best_header_t *phead, *pprev; ++ NULL_CHECK(params_batch, "params_batch is NULL", err); ++ if (nbufsize > 0) ++ NULL_CHECK(buf, "buf is NULL", err); ++ /* initialize the buffer */ ++ memset(buf, 0, nbufsize); ++ AP6210_DEBUG("%s enter \n", __FUNCTION__); ++ /* # of scans */ ++ if (!params_batch->get_batch.batch_started) { ++ bp += nreadsize = sprintf(bp, "scancount=%d\n", ++ params_batch->get_batch.expired_tot_scan_cnt); ++ nleftsize -= nreadsize; ++ params_batch->get_batch.batch_started = TRUE; ++ } ++ AP6210_DEBUG("%s scancount %d\n", __FUNCTION__, params_batch->get_batch.expired_tot_scan_cnt); ++ /* preestimate scan count until which scan result this report is going to end */ ++ list_for_each_entry_safe(siter, snext, ++ ¶ms_batch->get_batch.expired_scan_results_list, list) { ++ phead = siter->bestnetheader; ++ while (phead != NULL) { ++ /* if left_size is less than bestheader total size , stop this */ ++ if (nleftsize <= ++ (phead->tot_size + phead->tot_cnt * ENTRY_OVERHEAD)) ++ goto exit; ++ /* increase scan count */ ++ cnt++; ++ /* # best of each scan */ ++ AP6210_DEBUG("\n", cnt - 1, phead->tot_cnt); ++ /* attribute of the scan */ ++ if (phead->reason & PNO_STATUS_ABORT_MASK) { ++ bp += nreadsize = sprintf(bp, "trunc\n"); ++ nleftsize -= nreadsize; ++ } ++ list_for_each_entry_safe(iter, next, ++ &phead->entry_list, list) { ++ t_delta = jiffies_to_msecs(jiffies - iter->recorded_time); ++#ifdef PNO_DEBUG ++ _base_bp = bp; ++ memset(msg, 0, sizeof(msg)); ++#endif ++ /* BSSID info */ ++ bp += nreadsize = sprintf(bp, "bssid=%s\n", ++ bcm_ether_ntoa((const struct ether_addr *)&iter->BSSID, eabuf)); ++ nleftsize -= nreadsize; ++ /* SSID */ ++ bp += nreadsize = sprintf(bp, "ssid=%s\n", iter->SSID); ++ nleftsize -= nreadsize; ++ /* channel */ ++ bp += nreadsize = sprintf(bp, "freq=%d\n", ++ wf_channel2mhz(iter->channel, ++ iter->channel <= CH_MAX_2G_CHANNEL? ++ WF_CHAN_FACTOR_2_4_G : WF_CHAN_FACTOR_5_G)); ++ nleftsize -= nreadsize; ++ /* RSSI */ ++ bp += nreadsize = sprintf(bp, "level=%d\n", iter->RSSI); ++ nleftsize -= nreadsize; ++ /* add the time consumed in Driver to the timestamp of firmware */ ++ iter->timestamp += t_delta; ++ bp += nreadsize = sprintf(bp, "age=%d\n", iter->timestamp); ++ nleftsize -= nreadsize; ++ /* RTT0 */ ++ bp += nreadsize = sprintf(bp, "dist=%d\n", ++ (iter->rtt0 == 0)? -1 : iter->rtt0); ++ nleftsize -= nreadsize; ++ /* RTT1 */ ++ bp += nreadsize = sprintf(bp, "distSd=%d\n", ++ (iter->rtt0 == 0)? -1 : iter->rtt1); ++ nleftsize -= nreadsize; ++ bp += nreadsize = sprintf(bp, "%s", AP_END_MARKER); ++ nleftsize -= nreadsize; ++ list_del(&iter->list); ++ MFREE(dhd->osh, iter, BESTNET_ENTRY_SIZE); ++#ifdef PNO_DEBUG ++ memcpy(msg, _base_bp, bp - _base_bp); ++ AP6210_DEBUG("Entry : \n%s", msg); ++#endif ++ } ++ bp += nreadsize = sprintf(bp, "%s", SCAN_END_MARKER); ++ AP6210_DEBUG("%s", SCAN_END_MARKER); ++ nleftsize -= nreadsize; ++ pprev = phead; ++ /* reset the header */ ++ siter->bestnetheader = phead = phead->next; ++ MFREE(dhd->osh, pprev, BEST_HEADER_SIZE); ++ ++ siter->cnt_header--; ++ } ++ if (phead == NULL) { ++ /* we store all entry in this scan , so it is ok to delete */ ++ list_del(&siter->list); ++ MFREE(dhd->osh, siter, SCAN_RESULTS_SIZE); ++ } ++ } ++exit: ++ if (cnt < params_batch->get_batch.expired_tot_scan_cnt) { ++ AP6210_ERR("Buffer size is small to save all batch entry," ++ " cnt : %d (remained_scan_cnt): %d\n", ++ cnt, params_batch->get_batch.expired_tot_scan_cnt - cnt); ++ } ++ params_batch->get_batch.expired_tot_scan_cnt -= cnt; ++ /* set FALSE only if the link list is empty after returning the data */ ++ if (list_empty(¶ms_batch->get_batch.expired_scan_results_list)) { ++ params_batch->get_batch.batch_started = FALSE; ++ bp += sprintf(bp, "%s", RESULTS_END_MARKER); ++ AP6210_DEBUG("%s", RESULTS_END_MARKER); ++ AP6210_DEBUG("%s : Getting the batching data is complete\n", __FUNCTION__); ++ } ++ /* return used memory in buffer */ ++ bytes_written = (int32)(bp - buf); ++ return bytes_written; ++} ++static int ++_dhd_pno_clear_all_batch_results(dhd_pub_t *dhd, struct list_head *head, bool only_last) ++{ ++ int err = BCME_OK; ++ int removed_scan_cnt = 0; ++ dhd_pno_scan_results_t *siter, *snext; ++ dhd_pno_best_header_t *phead, *pprev; ++ dhd_pno_bestnet_entry_t *iter, *next; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(head, "head is NULL", err); ++ NULL_CHECK(head->next, "head->next is NULL", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ list_for_each_entry_safe(siter, snext, ++ head, list) { ++ if (only_last) { ++ /* in case that we need to delete only last one */ ++ if (!list_is_last(&siter->list, head)) { ++ /* skip if the one is not last */ ++ continue; ++ } ++ } ++ /* delete all data belong if the one is last */ ++ phead = siter->bestnetheader; ++ while (phead != NULL) { ++ removed_scan_cnt++; ++ list_for_each_entry_safe(iter, next, ++ &phead->entry_list, list) { ++ list_del(&iter->list); ++ MFREE(dhd->osh, iter, BESTNET_ENTRY_SIZE); ++ } ++ pprev = phead; ++ phead = phead->next; ++ MFREE(dhd->osh, pprev, BEST_HEADER_SIZE); ++ } ++ if (phead == NULL) { ++ /* it is ok to delete top node */ ++ list_del(&siter->list); ++ MFREE(dhd->osh, siter, SCAN_RESULTS_SIZE); ++ } ++ } ++ return removed_scan_cnt; ++} ++ ++static int ++_dhd_pno_cfg(dhd_pub_t *dhd, uint16 *channel_list, int nchan) ++{ ++ int err = BCME_OK; ++ int i = 0; ++ wl_pfn_cfg_t pfncfg_param; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ if (nchan) { ++ NULL_CHECK(channel_list, "nchan is NULL", err); ++ } ++ AP6210_DEBUG("%s enter : nchan : %d\n", __FUNCTION__, nchan); ++ memset(&pfncfg_param, 0, sizeof(wl_pfn_cfg_t)); ++ /* Setup default values */ ++ pfncfg_param.reporttype = htod32(WL_PFN_REPORT_ALLNET); ++ pfncfg_param.channel_num = htod32(0); ++ ++ for (i = 0; i < nchan && nchan < WL_NUMCHANNELS; i++) ++ pfncfg_param.channel_list[i] = channel_list[i]; ++ ++ pfncfg_param.channel_num = htod32(nchan); ++ err = dhd_iovar(dhd, 0, "pfn_cfg", (char *)&pfncfg_param, sizeof(pfncfg_param), 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfn_cfg\n", __FUNCTION__); ++ goto exit; ++ } ++exit: ++ return err; ++} ++static int ++_dhd_pno_reinitialize_prof(dhd_pub_t *dhd, dhd_pno_params_t *params, dhd_pno_mode_t mode) ++{ ++ int err = BCME_OK; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL\n", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL\n", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ mutex_lock(&_pno_state->pno_mutex); ++ switch (mode) { ++ case DHD_PNO_LEGACY_MODE: { ++ struct dhd_pno_ssid *iter, *next; ++ if (params->params_legacy.nssid > 0) { ++ list_for_each_entry_safe(iter, next, ++ ¶ms->params_legacy.ssid_list, list) { ++ list_del(&iter->list); ++ kfree(iter); ++ } ++ } ++ params->params_legacy.scan_fr = 0; ++ params->params_legacy.pno_freq_expo_max = 0; ++ params->params_legacy.pno_repeat = 0; ++ params->params_legacy.nchan = 0; ++ memset(params->params_legacy.chan_list, 0, ++ sizeof(params->params_legacy.chan_list)); ++ break; ++ } ++ case DHD_PNO_BATCH_MODE: { ++ params->params_batch.scan_fr = 0; ++ params->params_batch.mscan = 0; ++ params->params_batch.nchan = 0; ++ params->params_batch.rtt = 0; ++ params->params_batch.bestn = 0; ++ params->params_batch.nchan = 0; ++ params->params_batch.band = WLC_BAND_AUTO; ++ memset(params->params_batch.chan_list, 0, ++ sizeof(params->params_batch.chan_list)); ++ params->params_batch.get_batch.batch_started = FALSE; ++ params->params_batch.get_batch.buf = NULL; ++ params->params_batch.get_batch.bufsize = 0; ++ params->params_batch.get_batch.reason = 0; ++ _dhd_pno_clear_all_batch_results(dhd, ++ ¶ms->params_batch.get_batch.scan_results_list, FALSE); ++ _dhd_pno_clear_all_batch_results(dhd, ++ ¶ms->params_batch.get_batch.expired_scan_results_list, FALSE); ++ params->params_batch.get_batch.tot_scan_cnt = 0; ++ params->params_batch.get_batch.expired_tot_scan_cnt = 0; ++ params->params_batch.get_batch.top_node_cnt = 0; ++ INIT_LIST_HEAD(¶ms->params_batch.get_batch.scan_results_list); ++ INIT_LIST_HEAD(¶ms->params_batch.get_batch.expired_scan_results_list); ++ break; ++ } ++ case DHD_PNO_HOTLIST_MODE: { ++ struct dhd_pno_bssid *iter, *next; ++ if (params->params_hotlist.nbssid > 0) { ++ list_for_each_entry_safe(iter, next, ++ ¶ms->params_hotlist.bssid_list, list) { ++ list_del(&iter->list); ++ kfree(iter); ++ } ++ } ++ params->params_hotlist.scan_fr = 0; ++ params->params_hotlist.nbssid = 0; ++ params->params_hotlist.nchan = 0; ++ params->params_batch.band = WLC_BAND_AUTO; ++ memset(params->params_hotlist.chan_list, 0, ++ sizeof(params->params_hotlist.chan_list)); ++ break; ++ } ++ default: ++ AP6210_ERR("%s : unknown mode : %d\n", __FUNCTION__, mode); ++ break; ++ } ++ mutex_unlock(&_pno_state->pno_mutex); ++ return err; ++} ++static int ++_dhd_pno_add_bssid(dhd_pub_t *dhd, wl_pfn_bssid_t *p_pfn_bssid, int nbssid) ++{ ++ int err = BCME_OK; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ if (nbssid) { ++ NULL_CHECK(p_pfn_bssid, "bssid list is NULL", err); ++ } ++ err = dhd_iovar(dhd, 0, "pfn_add_bssid", (char *)&p_pfn_bssid, ++ sizeof(wl_pfn_bssid_t) * nbssid, 1); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to execute pfn_cfg\n", __FUNCTION__); ++ goto exit; ++ } ++exit: ++ return err; ++} ++int ++dhd_pno_stop_for_ssid(dhd_pub_t *dhd) ++{ ++ int err = BCME_OK; ++ uint32 mode = 0; ++ dhd_pno_status_info_t *_pno_state; ++ dhd_pno_params_t *_params; ++ wl_pfn_bssid_t *p_pfn_bssid; ++ NULL_CHECK(dhd, "dev is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ if (!(_pno_state->pno_mode & DHD_PNO_LEGACY_MODE)) { ++ AP6210_ERR("%s : LEGACY PNO MODE is not enabled\n", __FUNCTION__); ++ goto exit; ++ } ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ /* restart Batch mode if the batch mode is on */ ++ if (_pno_state->pno_mode & (DHD_PNO_BATCH_MODE | DHD_PNO_HOTLIST_MODE)) { ++ /* retrieve the batching data from firmware into host */ ++ dhd_pno_get_for_batch(dhd, NULL, 0, PNO_STATUS_DISABLE); ++ /* save current pno_mode before calling dhd_pno_clean */ ++ mode = _pno_state->pno_mode; ++ _dhd_pno_clean(dhd); ++ /* restore previous pno_mode */ ++ _pno_state->pno_mode = mode; ++ if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); ++ /* restart BATCH SCAN */ ++ err = dhd_pno_set_for_batch(dhd, &_params->params_batch); ++ if (err < 0) { ++ _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; ++ AP6210_ERR("%s : failed to restart batch scan(err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { ++ /* restart HOTLIST SCAN */ ++ struct dhd_pno_bssid *iter, *next; ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); ++ p_pfn_bssid = kzalloc(sizeof(wl_pfn_bssid_t) * ++ _params->params_hotlist.nbssid, GFP_KERNEL); ++ if (p_pfn_bssid == NULL) { ++ AP6210_ERR("%s : failed to allocate wl_pfn_bssid_t array" ++ " (count: %d)", ++ __FUNCTION__, _params->params_hotlist.nbssid); ++ err = BCME_ERROR; ++ _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; ++ goto exit; ++ } ++ /* convert dhd_pno_bssid to wl_pfn_bssid */ ++ list_for_each_entry_safe(iter, next, ++ &_params->params_hotlist.bssid_list, list) { ++ memcpy(&p_pfn_bssid->macaddr, ++ &iter->macaddr, ETHER_ADDR_LEN); ++ p_pfn_bssid->flags = iter->flags; ++ p_pfn_bssid++; ++ } ++ err = dhd_pno_set_for_hotlist(dhd, p_pfn_bssid, &_params->params_hotlist); ++ if (err < 0) { ++ _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; ++ AP6210_ERR("%s : failed to restart hotlist scan(err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ } else { ++ err = _dhd_pno_clean(dhd); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_clean (err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++exit: ++ return err; ++} ++ ++int ++dhd_pno_enable(dhd_pub_t *dhd, int enable) ++{ ++ int err = BCME_OK; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ return (_dhd_pno_enable(dhd, enable)); ++} ++ ++int ++dhd_pno_set_for_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssid_list, int nssid, ++ uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan) ++{ ++ struct dhd_pno_ssid *_pno_ssid; ++ dhd_pno_params_t *_params; ++ dhd_pno_params_t *_params2; ++ dhd_pno_status_info_t *_pno_state; ++ uint16 _chan_list[WL_NUMCHANNELS]; ++ int32 tot_nchan = 0; ++ int err = BCME_OK; ++ int i; ++ int mode = 0; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ ++ if (!dhd_support_sta_mode(dhd)) { ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ AP6210_DEBUG("%s enter : scan_fr :%d, pno_repeat :%d," ++ "pno_freq_expo_max: %d, nchan :%d\n", __FUNCTION__, ++ scan_fr, pno_repeat, pno_freq_expo_max, nchan); ++ ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); ++ if (!(_pno_state->pno_mode & DHD_PNO_LEGACY_MODE)) { ++ _pno_state->pno_mode |= DHD_PNO_LEGACY_MODE; ++ err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_LEGACY_MODE); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to reinitialize profile (err %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ memset(_chan_list, 0, sizeof(_chan_list)); ++ tot_nchan = nchan; ++ if (tot_nchan > 0 && channel_list) { ++ for (i = 0; i < nchan; i++) ++ _params->params_legacy.chan_list[i] = _chan_list[i] = channel_list[i]; ++ } ++ if (_pno_state->pno_mode & (DHD_PNO_BATCH_MODE | DHD_PNO_HOTLIST_MODE)) { ++ AP6210_DEBUG("BATCH SCAN is on progress in firmware\n"); ++ /* retrieve the batching data from firmware into host */ ++ dhd_pno_get_for_batch(dhd, NULL, 0, PNO_STATUS_DISABLE); ++ /* store current pno_mode before disabling pno */ ++ mode = _pno_state->pno_mode; ++ err = _dhd_pno_enable(dhd, PNO_OFF); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to disable PNO\n", __FUNCTION__); ++ goto exit; ++ } ++ /* restore the previous mode */ ++ _pno_state->pno_mode = mode; ++ /* use superset of channel list between two mode */ ++ if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { ++ _params2 = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); ++ if (_params2->params_batch.nchan > 0 && nchan > 0) { ++ err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, ++ &_params2->params_batch.chan_list[0], ++ _params2->params_batch.nchan, ++ &channel_list[0], nchan); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to merge channel list" ++ " between legacy and batch\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ } else { ++ AP6210_DEBUG("superset channel will use" ++ " all channels in firmware\n"); ++ } ++ } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { ++ _params2 = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); ++ if (_params2->params_hotlist.nchan > 0 && nchan > 0) { ++ err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, ++ &_params2->params_hotlist.chan_list[0], ++ _params2->params_hotlist.nchan, ++ &channel_list[0], nchan); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to merge channel list" ++ " between legacy and hotlist\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ } ++ } ++ } ++ _params->params_legacy.scan_fr = scan_fr; ++ _params->params_legacy.pno_repeat = pno_repeat; ++ _params->params_legacy.pno_freq_expo_max = pno_freq_expo_max; ++ _params->params_legacy.nchan = nchan; ++ _params->params_legacy.nssid = nssid; ++ INIT_LIST_HEAD(&_params->params_legacy.ssid_list); ++ if ((err = _dhd_pno_set(dhd, _params, DHD_PNO_LEGACY_MODE)) < 0) { ++ AP6210_ERR("failed to set call pno_set (err %d) in firmware\n", err); ++ goto exit; ++ } ++ if ((err = _dhd_pno_add_ssid(dhd, ssid_list, nssid)) < 0) { ++ AP6210_ERR("failed to add ssid list (err %d) in firmware\n", err); ++ goto exit; ++ } ++ for (i = 0; i < nssid; i++) { ++ _pno_ssid = kzalloc(sizeof(struct dhd_pno_ssid), GFP_KERNEL); ++ if (_pno_ssid == NULL) { ++ AP6210_ERR("%s : failed to allocate struct dhd_pno_ssid\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ _pno_ssid->SSID_len = ssid_list[i].SSID_len; ++ memcpy(_pno_ssid->SSID, ssid_list[i].SSID, _pno_ssid->SSID_len); ++ list_add_tail(&_pno_ssid->list, &_params->params_legacy.ssid_list); ++ ++ } ++ if (tot_nchan > 0) { ++ if ((err = _dhd_pno_cfg(dhd, _chan_list, tot_nchan)) < 0) { ++ AP6210_ERR("%s : failed to set call pno_cfg (err %d) in firmware\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ if (_pno_state->pno_status == DHD_PNO_DISABLED) { ++ if ((err = _dhd_pno_enable(dhd, PNO_ON)) < 0) ++ AP6210_ERR("%s : failed to enable PNO\n", __FUNCTION__); ++ } ++exit: ++ /* clear mode in case of error */ ++ if (err < 0) ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ return err; ++} ++int ++dhd_pno_set_for_batch(dhd_pub_t *dhd, struct dhd_pno_batch_params *batch_params) ++{ ++ int err = BCME_OK; ++ uint16 _chan_list[WL_NUMCHANNELS]; ++ int rem_nchan = 0, tot_nchan = 0; ++ int mode = 0, mscan = 0; ++ int i = 0; ++ dhd_pno_params_t *_params; ++ dhd_pno_params_t *_params2; ++ dhd_pno_status_info_t *_pno_state; ++ wlc_ssid_t *p_ssid_list = NULL; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ NULL_CHECK(batch_params, "batch_params is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ if (!dhd_support_sta_mode(dhd)) { ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; ++ if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { ++ _pno_state->pno_mode |= DHD_PNO_BATCH_MODE; ++ err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_BATCH_MODE); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_reinitialize_prof\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ } ++ _params->params_batch.scan_fr = batch_params->scan_fr; ++ _params->params_batch.bestn = batch_params->bestn; ++ _params->params_batch.mscan = (batch_params->mscan)? ++ batch_params->mscan : DEFAULT_BATCH_MSCAN; ++ _params->params_batch.nchan = batch_params->nchan; ++ memcpy(_params->params_batch.chan_list, batch_params->chan_list, ++ sizeof(_params->params_batch.chan_list)); ++ ++ memset(_chan_list, 0, sizeof(_chan_list)); ++ ++ rem_nchan = ARRAYSIZE(batch_params->chan_list) - batch_params->nchan; ++ if (batch_params->band == WLC_BAND_2G || batch_params->band == WLC_BAND_5G) { ++ /* get a valid channel list based on band B or A */ ++ err = _dhd_pno_get_channels(dhd, ++ &_params->params_batch.chan_list[batch_params->nchan], ++ &rem_nchan, batch_params->band, FALSE); ++ if (err < 0) { ++ AP6210_ERR("%s: failed to get valid channel list(band : %d)\n", ++ __FUNCTION__, batch_params->band); ++ goto exit; ++ } ++ /* now we need to update nchan because rem_chan has valid channel count */ ++ _params->params_batch.nchan += rem_nchan; ++ /* need to sort channel list */ ++ sort(_params->params_batch.chan_list, _params->params_batch.nchan, ++ sizeof(_params->params_batch.chan_list[0]), _dhd_pno_cmpfunc, NULL); ++ } ++#ifdef PNO_DEBUG ++{ ++ AP6210_DEBUG("Channel list : "); ++ for (i = 0; i < _params->params_batch.nchan; i++) { ++ AP6210_DEBUG("%d ", _params->params_batch.chan_list[i]); ++ } ++ AP6210_DEBUG("\n"); ++} ++#endif ++ if (_params->params_batch.nchan) { ++ /* copy the channel list into local array */ ++ memcpy(_chan_list, _params->params_batch.chan_list, sizeof(_chan_list)); ++ tot_nchan = _params->params_batch.nchan; ++ } ++ if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { ++ struct dhd_pno_ssid *iter, *next; ++ AP6210_DEBUG("PNO SSID is on progress in firmware\n"); ++ /* store current pno_mode before disabling pno */ ++ mode = _pno_state->pno_mode; ++ err = _dhd_pno_enable(dhd, PNO_OFF); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to disable PNO\n", __FUNCTION__); ++ goto exit; ++ } ++ /* restore the previous mode */ ++ _pno_state->pno_mode = mode; ++ /* Use the superset for channelist between two mode */ ++ _params2 = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); ++ if (_params2->params_legacy.nchan > 0 && _params->params_batch.nchan > 0) { ++ err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, ++ &_params2->params_legacy.chan_list[0], ++ _params2->params_legacy.nchan, ++ &_params->params_batch.chan_list[0], _params->params_batch.nchan); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to merge channel list" ++ " between legacy and batch\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ } else { ++ AP6210_DEBUG("superset channel will use all channels in firmware\n"); ++ } ++ p_ssid_list = kzalloc(sizeof(wlc_ssid_t) * ++ _params2->params_legacy.nssid, GFP_KERNEL); ++ if (p_ssid_list == NULL) { ++ AP6210_ERR("%s : failed to allocate wlc_ssid_t array (count: %d)", ++ __FUNCTION__, _params2->params_legacy.nssid); ++ err = BCME_ERROR; ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ goto exit; ++ } ++ i = 0; ++ /* convert dhd_pno_ssid to dhd_pno_ssid */ ++ list_for_each_entry_safe(iter, next, &_params2->params_legacy.ssid_list, list) { ++ p_ssid_list[i].SSID_len = iter->SSID_len; ++ memcpy(p_ssid_list->SSID, iter->SSID, p_ssid_list[i].SSID_len); ++ i++; ++ } ++ if ((err = _dhd_pno_add_ssid(dhd, p_ssid_list, ++ _params2->params_legacy.nssid)) < 0) { ++ AP6210_ERR("failed to add ssid list (err %d) in firmware\n", err); ++ goto exit; ++ } ++ } ++ if ((err = _dhd_pno_set(dhd, _params, DHD_PNO_BATCH_MODE)) < 0) { ++ AP6210_ERR("%s : failed to set call pno_set (err %d) in firmware\n", ++ __FUNCTION__, err); ++ goto exit; ++ } else { ++ /* we need to return mscan */ ++ mscan = err; ++ } ++ if (tot_nchan > 0) { ++ if ((err = _dhd_pno_cfg(dhd, _chan_list, tot_nchan)) < 0) { ++ AP6210_ERR("%s : failed to set call pno_cfg (err %d) in firmware\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ if (_pno_state->pno_status == DHD_PNO_DISABLED) { ++ if ((err = _dhd_pno_enable(dhd, PNO_ON)) < 0) ++ AP6210_ERR("%s : failed to enable PNO\n", __FUNCTION__); ++ } ++exit: ++ /* clear mode in case of error */ ++ if (err < 0) ++ _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; ++ else { ++ /* return #max scan firmware can do */ ++ err = mscan; ++ } ++ if (p_ssid_list) ++ kfree(p_ssid_list); ++ return err; ++} ++ ++static int ++_dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason) ++{ ++ int err = BCME_OK; ++ int i, j; ++ uint32 timestamp = 0; ++ dhd_pno_params_t *_params = NULL; ++ dhd_pno_status_info_t *_pno_state = NULL; ++ wl_pfn_lscanresults_t *plbestnet = NULL; ++ wl_pfn_lnet_info_t *plnetinfo; ++ dhd_pno_bestnet_entry_t *pbestnet_entry; ++ dhd_pno_best_header_t *pbestnetheader = NULL; ++ dhd_pno_scan_results_t *pscan_results = NULL, *siter, *snext; ++ bool allocate_header = FALSE; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ if (!dhd_support_sta_mode(dhd)) { ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { ++ AP6210_ERR("%s: Batching SCAN mode is not enabled\n", __FUNCTION__); ++ goto exit; ++ } ++ mutex_lock(&_pno_state->pno_mutex); ++ _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; ++ if (buf && bufsize) { ++ if (!list_empty(&_params->params_batch.get_batch.expired_scan_results_list)) { ++ /* need to check whether we have cashed data or not */ ++ AP6210_DEBUG("%s: have cashed batching data in Driver\n", ++ __FUNCTION__); ++ /* convert to results format */ ++ goto convert_format; ++ } else { ++ /* this is a first try to get batching results */ ++ if (!list_empty(&_params->params_batch.get_batch.scan_results_list)) { ++ /* move the scan_results_list to expired_scan_results_lists */ ++ list_for_each_entry_safe(siter, snext, ++ &_params->params_batch.get_batch.scan_results_list, list) { ++ list_move_tail(&siter->list, ++ &_params->params_batch.get_batch.expired_scan_results_list); ++ } ++ _params->params_batch.get_batch.top_node_cnt = 0; ++ _params->params_batch.get_batch.expired_tot_scan_cnt = ++ _params->params_batch.get_batch.tot_scan_cnt; ++ _params->params_batch.get_batch.tot_scan_cnt = 0; ++ goto convert_format; ++ } ++ } ++ } ++ /* create dhd_pno_scan_results_t whenever we got event WLC_E_PFN_BEST_BATCHING */ ++ pscan_results = (dhd_pno_scan_results_t *)MALLOC(dhd->osh, SCAN_RESULTS_SIZE); ++ if (pscan_results == NULL) { ++ err = BCME_NOMEM; ++ AP6210_ERR("failed to allocate dhd_pno_scan_results_t\n"); ++ goto exit; ++ } ++ pscan_results->bestnetheader = NULL; ++ pscan_results->cnt_header = 0; ++ /* add the element into list unless total node cnt is less than MAX_NODE_ CNT */ ++ if (_params->params_batch.get_batch.top_node_cnt < MAX_NODE_CNT) { ++ list_add(&pscan_results->list, &_params->params_batch.get_batch.scan_results_list); ++ _params->params_batch.get_batch.top_node_cnt++; ++ } else { ++ int _removed_scan_cnt; ++ /* remove oldest one and add new one */ ++ AP6210_DEBUG("%s : Remove oldest node and add new one\n", __FUNCTION__); ++ _removed_scan_cnt = _dhd_pno_clear_all_batch_results(dhd, ++ &_params->params_batch.get_batch.scan_results_list, TRUE); ++ _params->params_batch.get_batch.tot_scan_cnt -= _removed_scan_cnt; ++ list_add(&pscan_results->list, &_params->params_batch.get_batch.scan_results_list); ++ ++ } ++ plbestnet = (wl_pfn_lscanresults_t *)MALLOC(dhd->osh, PNO_BESTNET_LEN); ++ NULL_CHECK(plbestnet, "failed to allocate buffer for bestnet", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ memset(plbestnet, 0, PNO_BESTNET_LEN); ++ while (plbestnet->status != PFN_COMPLETE) { ++ memset(plbestnet, 0, PNO_BESTNET_LEN); ++ err = dhd_iovar(dhd, 0, "pfnlbest", (char *)plbestnet, PNO_BESTNET_LEN, 0); ++ if (err < 0) { ++ if (err == BCME_EPERM) { ++ AP6210_ERR("we cannot get the batching data " ++ "during scanning in firmware, try again\n,"); ++ msleep(500); ++ continue; ++ } else { ++ AP6210_ERR("%s : failed to execute pfnlbest (err :%d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ AP6210_DEBUG("ver %d, status : %d, count %d\n", plbestnet->version, ++ plbestnet->status, plbestnet->count); ++ if (plbestnet->version != PFN_SCANRESULT_VERSION) { ++ err = BCME_VERSION; ++ AP6210_ERR("bestnet version(%d) is mismatch with Driver version(%d)\n", ++ plbestnet->version, PFN_SCANRESULT_VERSION); ++ goto exit; ++ } ++ plnetinfo = plbestnet->netinfo; ++ for (i = 0; i < plbestnet->count; i++) { ++ pbestnet_entry = (dhd_pno_bestnet_entry_t *) ++ MALLOC(dhd->osh, BESTNET_ENTRY_SIZE); ++ if (pbestnet_entry == NULL) { ++ err = BCME_NOMEM; ++ AP6210_ERR("failed to allocate dhd_pno_bestnet_entry\n"); ++ goto exit; ++ } ++ pbestnet_entry->recorded_time = jiffies; /* record the current time */ ++ /* create header for the first entry */ ++ allocate_header = (i == 0)? TRUE : FALSE; ++ /* check whether the new generation is started or not */ ++ if (timestamp && (TIME_DIFF(timestamp, plnetinfo->timestamp) ++ > TIME_MIN_DIFF)) ++ allocate_header = TRUE; ++ timestamp = plnetinfo->timestamp; ++ if (allocate_header) { ++ pbestnetheader = (dhd_pno_best_header_t *) ++ MALLOC(dhd->osh, BEST_HEADER_SIZE); ++ if (pbestnetheader == NULL) { ++ err = BCME_NOMEM; ++ if (pbestnet_entry) ++ MFREE(dhd->osh, pbestnet_entry, ++ BESTNET_ENTRY_SIZE); ++ AP6210_ERR("failed to allocate dhd_pno_bestnet_entry\n"); ++ goto exit; ++ } ++ /* increase total cnt of bestnet header */ ++ pscan_results->cnt_header++; ++ /* need to record the reason to call dhd_pno_get_for_bach */ ++ if (reason) ++ pbestnetheader->reason = (ENABLE << reason); ++ memset(pbestnetheader, 0, BEST_HEADER_SIZE); ++ /* initialize the head of linked list */ ++ INIT_LIST_HEAD(&(pbestnetheader->entry_list)); ++ /* link the pbestnet heaer into existed list */ ++ if (pscan_results->bestnetheader == NULL) ++ /* In case of header */ ++ pscan_results->bestnetheader = pbestnetheader; ++ else { ++ dhd_pno_best_header_t *head = pscan_results->bestnetheader; ++ pscan_results->bestnetheader = pbestnetheader; ++ pbestnetheader->next = head; ++ } ++ } ++ /* fills the best network info */ ++ pbestnet_entry->channel = plnetinfo->pfnsubnet.channel; ++ pbestnet_entry->RSSI = plnetinfo->RSSI; ++ if (plnetinfo->flags & PFN_PARTIAL_SCAN_MASK) { ++ /* if RSSI is positive value, we assume that ++ * this scan is aborted by other scan ++ */ ++ AP6210_DEBUG("This scan is aborted\n"); ++ pbestnetheader->reason = (ENABLE << PNO_STATUS_ABORT); ++ } ++ pbestnet_entry->rtt0 = plnetinfo->rtt0; ++ pbestnet_entry->rtt1 = plnetinfo->rtt1; ++ pbestnet_entry->timestamp = plnetinfo->timestamp; ++ pbestnet_entry->SSID_len = plnetinfo->pfnsubnet.SSID_len; ++ memcpy(pbestnet_entry->SSID, plnetinfo->pfnsubnet.SSID, ++ pbestnet_entry->SSID_len); ++ memcpy(&pbestnet_entry->BSSID, &plnetinfo->pfnsubnet.BSSID, ETHER_ADDR_LEN); ++ /* add the element into list */ ++ list_add_tail(&pbestnet_entry->list, &pbestnetheader->entry_list); ++ /* increase best entry count */ ++ pbestnetheader->tot_cnt++; ++ pbestnetheader->tot_size += BESTNET_ENTRY_SIZE; ++ AP6210_DEBUG("Header %d\n", pscan_results->cnt_header - 1); ++ AP6210_DEBUG("\tSSID : "); ++ for (j = 0; j < plnetinfo->pfnsubnet.SSID_len; j++) ++ AP6210_DEBUG("%c", plnetinfo->pfnsubnet.SSID[j]); ++ AP6210_DEBUG("\n"); ++ AP6210_DEBUG("\tBSSID: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ plnetinfo->pfnsubnet.BSSID.octet[0], ++ plnetinfo->pfnsubnet.BSSID.octet[1], ++ plnetinfo->pfnsubnet.BSSID.octet[2], ++ plnetinfo->pfnsubnet.BSSID.octet[3], ++ plnetinfo->pfnsubnet.BSSID.octet[4], ++ plnetinfo->pfnsubnet.BSSID.octet[5]); ++ AP6210_DEBUG("\tchannel: %d, RSSI: %d, timestamp: %d ms\n", ++ plnetinfo->pfnsubnet.channel, ++ plnetinfo->RSSI, plnetinfo->timestamp); ++ AP6210_DEBUG("\tRTT0 : %d, RTT1: %d\n", plnetinfo->rtt0, plnetinfo->rtt1); ++ plnetinfo++; ++ } ++ } ++ /* increase total scan count using current scan count */ ++ _params->params_batch.get_batch.tot_scan_cnt += pscan_results->cnt_header; ++ ++ if (buf && bufsize) { ++ /* This is a first try to get batching results */ ++ if (!list_empty(&_params->params_batch.get_batch.scan_results_list)) { ++ /* move the scan_results_list to expired_scan_results_lists */ ++ list_for_each_entry_safe(siter, snext, ++ &_params->params_batch.get_batch.scan_results_list, list) { ++ list_move_tail(&siter->list, ++ &_params->params_batch.get_batch.expired_scan_results_list); ++ } ++ /* reset gloval values after moving to expired list */ ++ _params->params_batch.get_batch.top_node_cnt = 0; ++ _params->params_batch.get_batch.expired_tot_scan_cnt = ++ _params->params_batch.get_batch.tot_scan_cnt; ++ _params->params_batch.get_batch.tot_scan_cnt = 0; ++ } ++convert_format: ++ err = _dhd_pno_convert_format(dhd, &_params->params_batch, buf, bufsize); ++ if (err < 0) { ++ AP6210_ERR("failed to convert the data into upper layer format\n"); ++ goto exit; ++ } ++ } ++exit: ++ if (plbestnet) ++ MFREE(dhd->osh, plbestnet, PNO_BESTNET_LEN); ++ _params->params_batch.get_batch.buf = NULL; ++ _params->params_batch.get_batch.bufsize = 0; ++ mutex_unlock(&_pno_state->pno_mutex); ++ complete(&_pno_state->get_batch_done); ++ return err; ++} ++static void ++_dhd_pno_get_batch_handler(struct work_struct *work) ++{ ++ dhd_pno_status_info_t *_pno_state; ++ dhd_pub_t *dhd; ++ struct dhd_pno_batch_params *params_batch; ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ _pno_state = container_of(work, struct dhd_pno_status_info, work); ++ dhd = _pno_state->dhd; ++ if (dhd == NULL) { ++ AP6210_ERR("%s : dhd is NULL\n", __FUNCTION__); ++ return; ++ } ++ params_batch = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS].params_batch; ++ _dhd_pno_get_for_batch(dhd, params_batch->get_batch.buf, ++ params_batch->get_batch.bufsize, params_batch->get_batch.reason); ++ ++} ++ ++int ++dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason) ++{ ++ int err = BCME_OK; ++ dhd_pno_status_info_t *_pno_state; ++ struct dhd_pno_batch_params *params_batch; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ if (!dhd_support_sta_mode(dhd)) { ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ params_batch = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS].params_batch; ++ if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { ++ AP6210_ERR("%s: Batching SCAN mode is not enabled\n", __FUNCTION__); ++ goto exit; ++ } ++ params_batch->get_batch.buf = buf; ++ params_batch->get_batch.bufsize = bufsize; ++ params_batch->get_batch.reason = reason; ++ schedule_work(&_pno_state->work); ++ wait_for_completion(&_pno_state->get_batch_done); ++exit: ++ return err; ++} ++ ++int ++dhd_pno_stop_for_batch(dhd_pub_t *dhd) ++{ ++ int err = BCME_OK; ++ int mode = 0; ++ int i = 0; ++ dhd_pno_status_info_t *_pno_state; ++ dhd_pno_params_t *_params; ++ wl_pfn_bssid_t *p_pfn_bssid; ++ wlc_ssid_t *p_ssid_list = NULL; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ if (!dhd_support_sta_mode(dhd)) { ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", ++ __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ if (!(_pno_state->pno_mode & DHD_PNO_BATCH_MODE)) { ++ AP6210_ERR("%s : PNO BATCH MODE is not enabled\n", __FUNCTION__); ++ goto exit; ++ } ++ _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; ++ if (_pno_state->pno_mode & (DHD_PNO_LEGACY_MODE | DHD_PNO_HOTLIST_MODE)) { ++ mode = _pno_state->pno_mode; ++ _dhd_pno_clean(dhd); ++ _pno_state->pno_mode = mode; ++ /* restart Legacy PNO if the Legacy PNO is on */ ++ if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { ++ struct dhd_pno_legacy_params *_params_legacy; ++ struct dhd_pno_ssid *iter, *next; ++ _params_legacy = ++ &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS].params_legacy); ++ p_ssid_list = kzalloc(sizeof(wlc_ssid_t) * ++ _params_legacy->nssid, GFP_KERNEL); ++ if (p_ssid_list == NULL) { ++ AP6210_ERR("%s : failed to allocate wlc_ssid_t array (count: %d)", ++ __FUNCTION__, _params_legacy->nssid); ++ err = BCME_ERROR; ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ goto exit; ++ } ++ i = 0; ++ /* convert dhd_pno_ssid to dhd_pno_ssid */ ++ list_for_each_entry_safe(iter, next, &_params_legacy->ssid_list, list) { ++ p_ssid_list[i].SSID_len = iter->SSID_len; ++ memcpy(p_ssid_list[i].SSID, iter->SSID, p_ssid_list[i].SSID_len); ++ i++; ++ } ++ err = dhd_pno_set_for_ssid(dhd, p_ssid_list, _params_legacy->nssid, ++ _params_legacy->scan_fr, _params_legacy->pno_repeat, ++ _params_legacy->pno_freq_expo_max, _params_legacy->chan_list, ++ _params_legacy->nchan); ++ if (err < 0) { ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ AP6210_ERR("%s : failed to restart legacy PNO scan(err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } else if (_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE) { ++ struct dhd_pno_bssid *iter, *next; ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]); ++ p_pfn_bssid = kzalloc(sizeof(wl_pfn_bssid_t) * ++ _params->params_hotlist.nbssid, GFP_KERNEL); ++ if (p_pfn_bssid == NULL) { ++ AP6210_ERR("%s : failed to allocate wl_pfn_bssid_t array" ++ " (count: %d)", ++ __FUNCTION__, _params->params_hotlist.nbssid); ++ err = BCME_ERROR; ++ _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; ++ goto exit; ++ } ++ i = 0; ++ /* convert dhd_pno_bssid to wl_pfn_bssid */ ++ list_for_each_entry_safe(iter, next, ++ &_params->params_hotlist.bssid_list, list) { ++ memcpy(&p_pfn_bssid[i].macaddr, &iter->macaddr, ETHER_ADDR_LEN); ++ p_pfn_bssid[i].flags = iter->flags; ++ i++; ++ } ++ err = dhd_pno_set_for_hotlist(dhd, p_pfn_bssid, &_params->params_hotlist); ++ if (err < 0) { ++ _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; ++ AP6210_ERR("%s : failed to restart hotlist scan(err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ } else { ++ err = _dhd_pno_clean(dhd); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_clean (err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++exit: ++ _params = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]; ++ _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_BATCH_MODE); ++ if (p_ssid_list) ++ kfree(p_ssid_list); ++ return err; ++} ++ ++int ++dhd_pno_set_for_hotlist(dhd_pub_t *dhd, wl_pfn_bssid_t *p_pfn_bssid, ++ struct dhd_pno_hotlist_params *hotlist_params) ++{ ++ int err = BCME_OK; ++ int i; ++ uint16 _chan_list[WL_NUMCHANNELS]; ++ int rem_nchan = 0; ++ int tot_nchan = 0; ++ int mode = 0; ++ dhd_pno_params_t *_params; ++ dhd_pno_params_t *_params2; ++ struct dhd_pno_bssid *_pno_bssid; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ NULL_CHECK(hotlist_params, "hotlist_params is NULL", err); ++ NULL_CHECK(p_pfn_bssid, "p_pfn_bssid is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ ++ if (!dhd_support_sta_mode(dhd)) { ++ err = BCME_BADOPTION; ++ goto exit; ++ } ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ _params = &_pno_state->pno_params_arr[INDEX_OF_HOTLIST_PARAMS]; ++ if (!(_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE)) { ++ _pno_state->pno_mode |= DHD_PNO_HOTLIST_MODE; ++ err = _dhd_pno_reinitialize_prof(dhd, _params, DHD_PNO_HOTLIST_MODE); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_reinitialize_prof\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ } ++ _params->params_batch.nchan = hotlist_params->nchan; ++ _params->params_batch.scan_fr = hotlist_params->scan_fr; ++ if (hotlist_params->nchan) ++ memcpy(_params->params_hotlist.chan_list, hotlist_params->chan_list, ++ sizeof(_params->params_hotlist.chan_list)); ++ memset(_chan_list, 0, sizeof(_chan_list)); ++ ++ rem_nchan = ARRAYSIZE(hotlist_params->chan_list) - hotlist_params->nchan; ++ if (hotlist_params->band == WLC_BAND_2G || hotlist_params->band == WLC_BAND_5G) { ++ /* get a valid channel list based on band B or A */ ++ err = _dhd_pno_get_channels(dhd, ++ &_params->params_hotlist.chan_list[hotlist_params->nchan], ++ &rem_nchan, hotlist_params->band, FALSE); ++ if (err < 0) { ++ AP6210_ERR("%s: failed to get valid channel list(band : %d)\n", ++ __FUNCTION__, hotlist_params->band); ++ goto exit; ++ } ++ /* now we need to update nchan because rem_chan has valid channel count */ ++ _params->params_hotlist.nchan += rem_nchan; ++ /* need to sort channel list */ ++ sort(_params->params_hotlist.chan_list, _params->params_hotlist.nchan, ++ sizeof(_params->params_hotlist.chan_list[0]), _dhd_pno_cmpfunc, NULL); ++ } ++#ifdef PNO_DEBUG ++{ ++ int i; ++ AP6210_DEBUG("Channel list : "); ++ for (i = 0; i < _params->params_batch.nchan; i++) { ++ AP6210_DEBUG("%d ", _params->params_batch.chan_list[i]); ++ } ++ AP6210_DEBUG("\n"); ++} ++#endif ++ if (_params->params_hotlist.nchan) { ++ /* copy the channel list into local array */ ++ memcpy(_chan_list, _params->params_hotlist.chan_list, ++ sizeof(_chan_list)); ++ tot_nchan = _params->params_hotlist.nchan; ++ } ++ if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { ++ AP6210_DEBUG("PNO SSID is on progress in firmware\n"); ++ /* store current pno_mode before disabling pno */ ++ mode = _pno_state->pno_mode; ++ err = _dhd_pno_enable(dhd, PNO_OFF); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to disable PNO\n", __FUNCTION__); ++ goto exit; ++ } ++ /* restore the previous mode */ ++ _pno_state->pno_mode = mode; ++ /* Use the superset for channelist between two mode */ ++ _params2 = &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS]); ++ if (_params2->params_legacy.nchan > 0 && ++ _params->params_hotlist.nchan > 0) { ++ err = _dhd_pno_chan_merge(_chan_list, &tot_nchan, ++ &_params2->params_legacy.chan_list[0], ++ _params2->params_legacy.nchan, ++ &_params->params_hotlist.chan_list[0], ++ _params->params_hotlist.nchan); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to merge channel list" ++ "between legacy and hotlist\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ } ++ ++ } ++ ++ INIT_LIST_HEAD(&(_params->params_hotlist.bssid_list)); ++ ++ err = _dhd_pno_add_bssid(dhd, p_pfn_bssid, hotlist_params->nbssid); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_add_bssid(err :%d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ if ((err = _dhd_pno_set(dhd, _params, DHD_PNO_HOTLIST_MODE)) < 0) { ++ AP6210_ERR("%s : failed to set call pno_set (err %d) in firmware\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ if (tot_nchan > 0) { ++ if ((err = _dhd_pno_cfg(dhd, _chan_list, tot_nchan)) < 0) { ++ AP6210_ERR("%s : failed to set call pno_cfg (err %d) in firmware\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ for (i = 0; i < hotlist_params->nbssid; i++) { ++ _pno_bssid = kzalloc(sizeof(struct dhd_pno_bssid), GFP_KERNEL); ++ NULL_CHECK(_pno_bssid, "_pfn_bssid is NULL", err); ++ memcpy(&_pno_bssid->macaddr, &p_pfn_bssid[i].macaddr, ETHER_ADDR_LEN); ++ _pno_bssid->flags = p_pfn_bssid[i].flags; ++ list_add_tail(&_pno_bssid->list, &_params->params_hotlist.bssid_list); ++ } ++ _params->params_hotlist.nbssid = hotlist_params->nbssid; ++ if (_pno_state->pno_status == DHD_PNO_DISABLED) { ++ if ((err = _dhd_pno_enable(dhd, PNO_ON)) < 0) ++ AP6210_ERR("%s : failed to enable PNO\n", __FUNCTION__); ++ } ++exit: ++ /* clear mode in case of error */ ++ if (err < 0) ++ _pno_state->pno_mode &= ~DHD_PNO_HOTLIST_MODE; ++ return err; ++} ++ ++int ++dhd_pno_stop_for_hotlist(dhd_pub_t *dhd) ++{ ++ int err = BCME_OK; ++ uint32 mode = 0; ++ dhd_pno_status_info_t *_pno_state; ++ dhd_pno_params_t *_params; ++ wlc_ssid_t *p_ssid_list; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", ++ __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ ++ if (!(_pno_state->pno_mode & DHD_PNO_HOTLIST_MODE)) { ++ AP6210_ERR("%s : Hotlist MODE is not enabled\n", ++ __FUNCTION__); ++ goto exit; ++ } ++ _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; ++ ++ if (_pno_state->pno_mode & (DHD_PNO_LEGACY_MODE | DHD_PNO_BATCH_MODE)) { ++ /* retrieve the batching data from firmware into host */ ++ dhd_pno_get_for_batch(dhd, NULL, 0, PNO_STATUS_DISABLE); ++ /* save current pno_mode before calling dhd_pno_clean */ ++ mode = _pno_state->pno_mode; ++ err = _dhd_pno_clean(dhd); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_clean (err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ /* restore previos pno mode */ ++ _pno_state->pno_mode = mode; ++ if (_pno_state->pno_mode & DHD_PNO_LEGACY_MODE) { ++ /* restart Legacy PNO Scan */ ++ struct dhd_pno_legacy_params *_params_legacy; ++ struct dhd_pno_ssid *iter, *next; ++ _params_legacy = ++ &(_pno_state->pno_params_arr[INDEX_OF_LEGACY_PARAMS].params_legacy); ++ p_ssid_list = ++ kzalloc(sizeof(wlc_ssid_t) * _params_legacy->nssid, GFP_KERNEL); ++ if (p_ssid_list == NULL) { ++ AP6210_ERR("%s : failed to allocate wlc_ssid_t array (count: %d)", ++ __FUNCTION__, _params_legacy->nssid); ++ err = BCME_ERROR; ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ goto exit; ++ } ++ /* convert dhd_pno_ssid to dhd_pno_ssid */ ++ list_for_each_entry_safe(iter, next, &_params_legacy->ssid_list, list) { ++ p_ssid_list->SSID_len = iter->SSID_len; ++ memcpy(p_ssid_list->SSID, iter->SSID, p_ssid_list->SSID_len); ++ p_ssid_list++; ++ } ++ err = dhd_pno_set_for_ssid(dhd, p_ssid_list, _params_legacy->nssid, ++ _params_legacy->scan_fr, _params_legacy->pno_repeat, ++ _params_legacy->pno_freq_expo_max, _params_legacy->chan_list, ++ _params_legacy->nchan); ++ if (err < 0) { ++ _pno_state->pno_mode &= ~DHD_PNO_LEGACY_MODE; ++ AP6210_ERR("%s : failed to restart legacy PNO scan(err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } else if (_pno_state->pno_mode & DHD_PNO_BATCH_MODE) { ++ /* restart Batching Scan */ ++ _params = &(_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS]); ++ /* restart BATCH SCAN */ ++ err = dhd_pno_set_for_batch(dhd, &_params->params_batch); ++ if (err < 0) { ++ _pno_state->pno_mode &= ~DHD_PNO_BATCH_MODE; ++ AP6210_ERR("%s : failed to restart batch scan(err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++ } else { ++ err = _dhd_pno_clean(dhd); ++ if (err < 0) { ++ AP6210_ERR("%s : failed to call _dhd_pno_clean (err: %d)\n", ++ __FUNCTION__, err); ++ goto exit; ++ } ++ } ++exit: ++ return err; ++} ++ ++int ++dhd_pno_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data) ++{ ++ int err = BCME_OK; ++ uint status, event_type, flags, datalen; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ NULL_CHECK(dhd->pno_state, "pno_state is NULL", err); ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ if (!WLS_SUPPORTED(_pno_state)) { ++ AP6210_ERR("%s : wifi location service is not supported\n", __FUNCTION__); ++ err = BCME_UNSUPPORTED; ++ goto exit; ++ } ++ event_type = ntoh32(event->event_type); ++ flags = ntoh16(event->flags); ++ status = ntoh32(event->status); ++ datalen = ntoh32(event->datalen); ++ AP6210_DEBUG("%s enter : event_type :%d\n", __FUNCTION__, event_type); ++ switch (event_type) { ++ case WLC_E_PFN_BSSID_NET_FOUND: ++ case WLC_E_PFN_BSSID_NET_LOST: ++ /* XXX : how can we inform this to framework ? */ ++ /* TODO : need to implement event logic using generic netlink */ ++ break; ++ case WLC_E_PFN_BEST_BATCHING: ++ { ++ struct dhd_pno_batch_params *params_batch; ++ params_batch = &_pno_state->pno_params_arr[INDEX_OF_BATCH_PARAMS].params_batch; ++ AP6210_DEBUG("%s : WLC_E_PFN_BEST_BATCHING\n", __FUNCTION__); ++ params_batch->get_batch.buf = NULL; ++ params_batch->get_batch.bufsize = 0; ++ params_batch->get_batch.reason = PNO_STATUS_EVENT; ++ schedule_work(&_pno_state->work); ++ break; ++ } ++ default: ++ AP6210_ERR("unknown event : %d\n", event_type); ++ } ++exit: ++ return err; ++} ++ ++int dhd_pno_init(dhd_pub_t *dhd) ++{ ++ int err = BCME_OK; ++ dhd_pno_status_info_t *_pno_state; ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ UNUSED_PARAMETER(_dhd_pno_suspend); ++ if (dhd->pno_state) ++ goto exit; ++ dhd->pno_state = MALLOC(dhd->osh, sizeof(dhd_pno_status_info_t)); ++ memset(dhd->pno_state, 0, sizeof(dhd_pno_status_info_t)); ++ NULL_CHECK(dhd, "failed to create dhd_pno_state", err); ++ /* need to check whether current firmware support batching and hotlist scan */ ++ _pno_state = PNO_GET_PNOSTATE(dhd); ++ _pno_state->wls_supported = TRUE; ++ _pno_state->dhd = dhd; ++ mutex_init(&_pno_state->pno_mutex); ++ INIT_WORK(&_pno_state->work, _dhd_pno_get_batch_handler); ++ init_completion(&_pno_state->get_batch_done); ++ err = dhd_iovar(dhd, 0, "pfnlbest", NULL, 0, 0); ++ if (err == BCME_UNSUPPORTED) { ++ _pno_state->wls_supported = FALSE; ++ AP6210_DEBUG("Current firmware doesn't support" ++ " Android Location Service\n"); ++ } ++exit: ++ return err; ++} ++int dhd_pno_deinit(dhd_pub_t *dhd) ++{ ++ int err = BCME_OK; ++ dhd_pno_status_info_t *_pno_state = PNO_GET_PNOSTATE(dhd); ++ NULL_CHECK(dhd, "dhd is NULL", err); ++ AP6210_DEBUG("%s enter\n", __FUNCTION__); ++ cancel_work_sync(&_pno_state->work); ++ if (dhd->pno_state) ++ MFREE(dhd->osh, dhd->pno_state, sizeof(dhd_pno_status_info_t)); ++ dhd->pno_state = NULL; ++ return err; ++} +diff --git a/drivers/net/wireless/ap6210/dhd_pno.h b/drivers/net/wireless/ap6210/dhd_pno.h +new file mode 100644 +index 0000000..1e02db1 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_pno.h +@@ -0,0 +1,249 @@ ++/* ++ * Header file of Broadcom Dongle Host Driver (DHD) ++ * Prefered Network Offload code and Wi-Fi Location Service(WLS) code. ++ * Copyright (C) 1999-2013, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_pno.h 419969 2013-08-23 18:54:36Z $ ++ */ ++ ++#ifndef __DHD_PNO_H__ ++#define __DHD_PNO_H__ ++ ++#define PNO_TLV_PREFIX 'S' ++#define PNO_TLV_VERSION '1' ++#define PNO_TLV_SUBTYPE_LEGACY_PNO '2' ++#define PNO_TLV_RESERVED '0' ++ ++#define PNO_BATCHING_SET "SET" ++#define PNO_BATCHING_GET "GET" ++#define PNO_BATCHING_STOP "STOP" ++ ++#define PNO_PARAMS_DELIMETER " " ++#define PNO_PARAM_CHANNEL_DELIMETER "," ++#define PNO_PARAM_VALUE_DELLIMETER '=' ++#define PNO_PARAM_SCANFREQ "SCANFREQ" ++#define PNO_PARAM_BESTN "BESTN" ++#define PNO_PARAM_MSCAN "MSCAN" ++#define PNO_PARAM_CHANNEL "CHANNEL" ++#define PNO_PARAM_RTT "RTT" ++ ++#define PNO_TLV_TYPE_SSID_IE 'S' ++#define PNO_TLV_TYPE_TIME 'T' ++#define PNO_TLV_FREQ_REPEAT 'R' ++#define PNO_TLV_FREQ_EXPO_MAX 'M' ++ ++#define MAXNUM_SSID_PER_ADD 16 ++#define MAXNUM_PNO_PARAMS 2 ++#define PNO_TLV_COMMON_LENGTH 1 ++#define DEFAULT_BATCH_MSCAN 16 ++ ++#define RESULTS_END_MARKER "----\n" ++#define SCAN_END_MARKER "####\n" ++#define AP_END_MARKER "====\n" ++ ++enum scan_status { ++ /* SCAN ABORT by other scan */ ++ PNO_STATUS_ABORT, ++ /* RTT is presence or not */ ++ PNO_STATUS_RTT_PRESENCE, ++ /* Disable PNO by Driver */ ++ PNO_STATUS_DISABLE, ++ /* NORMAL BATCHING GET */ ++ PNO_STATUS_NORMAL, ++ /* WLC_E_PFN_BEST_BATCHING */ ++ PNO_STATUS_EVENT, ++ PNO_STATUS_MAX ++}; ++#define PNO_STATUS_ABORT_MASK 0x0001 ++#define PNO_STATUS_RTT_MASK 0x0002 ++#define PNO_STATUS_DISABLE_MASK 0x0004 ++#define PNO_STATUS_OOM_MASK 0x0010 ++ ++enum index_mode { ++ INDEX_OF_LEGACY_PARAMS, ++ INDEX_OF_BATCH_PARAMS, ++ INDEX_OF_HOTLIST_PARAMS, ++ INDEX_MODE_MAX ++}; ++enum dhd_pno_status { ++ DHD_PNO_DISABLED, ++ DHD_PNO_ENABLED, ++ DHD_PNO_SUSPEND ++}; ++typedef struct cmd_tlv { ++ char prefix; ++ char version; ++ char subtype; ++ char reserved; ++} cmd_tlv_t; ++typedef enum dhd_pno_mode { ++ /* Wi-Fi Legacy PNO Mode */ ++ DHD_PNO_NONE_MODE = 0, ++ DHD_PNO_LEGACY_MODE = (1 << (0)), ++ /* Wi-Fi Android BATCH SCAN Mode */ ++ DHD_PNO_BATCH_MODE = (1 << (1)), ++ /* Wi-Fi Android Hotlist SCAN Mode */ ++ DHD_PNO_HOTLIST_MODE = (1 << (2)) ++} dhd_pno_mode_t; ++struct dhd_pno_ssid { ++ uint32 SSID_len; ++ uchar SSID[DOT11_MAX_SSID_LEN]; ++ struct list_head list; ++}; ++struct dhd_pno_bssid { ++ struct ether_addr macaddr; ++ /* Bit4: suppress_lost, Bit3: suppress_found */ ++ uint16 flags; ++ struct list_head list; ++}; ++typedef struct dhd_pno_bestnet_entry { ++ struct ether_addr BSSID; ++ uint8 SSID_len; ++ uint8 SSID[DOT11_MAX_SSID_LEN]; ++ int8 RSSI; ++ uint8 channel; ++ uint32 timestamp; ++ uint16 rtt0; /* distance_cm based on RTT */ ++ uint16 rtt1; /* distance_cm based on sample standard deviation */ ++ unsigned long recorded_time; ++ struct list_head list; ++} dhd_pno_bestnet_entry_t; ++#define BESTNET_ENTRY_SIZE (sizeof(dhd_pno_bestnet_entry_t)) ++ ++typedef struct dhd_pno_bestnet_header { ++ struct dhd_pno_bestnet_header *next; ++ uint8 reason; ++ uint32 tot_cnt; ++ uint32 tot_size; ++ struct list_head entry_list; ++} dhd_pno_best_header_t; ++#define BEST_HEADER_SIZE (sizeof(dhd_pno_best_header_t)) ++ ++typedef struct dhd_pno_scan_results { ++ dhd_pno_best_header_t *bestnetheader; ++ uint8 cnt_header; ++ struct list_head list; ++} dhd_pno_scan_results_t; ++#define SCAN_RESULTS_SIZE (sizeof(dhd_pno_scan_results_t)) ++ ++struct dhd_pno_get_batch_info { ++ /* info related to get batch */ ++ char *buf; ++ bool batch_started; ++ uint32 tot_scan_cnt; ++ uint32 expired_tot_scan_cnt; ++ uint32 top_node_cnt; ++ uint32 bufsize; ++ int reason; ++ struct list_head scan_results_list; ++ struct list_head expired_scan_results_list; ++}; ++struct dhd_pno_legacy_params { ++ uint16 scan_fr; ++ uint16 chan_list[WL_NUMCHANNELS]; ++ uint16 nchan; ++ int pno_repeat; ++ int pno_freq_expo_max; ++ int nssid; ++ struct list_head ssid_list; ++}; ++struct dhd_pno_batch_params { ++ int32 scan_fr; ++ uint8 bestn; ++ uint8 mscan; ++ uint8 band; ++ uint16 chan_list[WL_NUMCHANNELS]; ++ uint16 nchan; ++ uint16 rtt; ++ struct dhd_pno_get_batch_info get_batch; ++}; ++struct dhd_pno_hotlist_params { ++ uint8 band; ++ int32 scan_fr; ++ uint16 chan_list[WL_NUMCHANNELS]; ++ uint16 nchan; ++ uint16 nbssid; ++ struct list_head bssid_list; ++}; ++typedef union dhd_pno_params { ++ struct dhd_pno_legacy_params params_legacy; ++ struct dhd_pno_batch_params params_batch; ++ struct dhd_pno_hotlist_params params_hotlist; ++} dhd_pno_params_t; ++typedef struct dhd_pno_status_info { ++ dhd_pub_t *dhd; ++ struct work_struct work; ++ struct mutex pno_mutex; ++ struct completion get_batch_done; ++ bool wls_supported; /* wifi location service supported or not */ ++ enum dhd_pno_status pno_status; ++ enum dhd_pno_mode pno_mode; ++ dhd_pno_params_t pno_params_arr[INDEX_MODE_MAX]; ++ struct list_head head_list; ++} dhd_pno_status_info_t; ++ ++/* wrapper functions */ ++extern int ++dhd_dev_pno_enable(struct net_device *dev, int enable); ++ ++extern int ++dhd_dev_pno_stop_for_ssid(struct net_device *dev); ++ ++extern int ++dhd_dev_pno_set_for_ssid(struct net_device *dev, wlc_ssid_t* ssids_local, int nssid, ++ uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan); ++ ++extern int ++dhd_dev_pno_set_for_batch(struct net_device *dev, ++ struct dhd_pno_batch_params *batch_params); ++ ++extern int ++dhd_dev_pno_get_for_batch(struct net_device *dev, char *buf, int bufsize); ++ ++extern int ++dhd_dev_pno_stop_for_batch(struct net_device *dev); ++ ++extern int ++dhd_dev_pno_set_for_hotlist(struct net_device *dev, wl_pfn_bssid_t *p_pfn_bssid, ++ struct dhd_pno_hotlist_params *hotlist_params); ++ ++/* dhd pno fuctions */ ++extern int dhd_pno_stop_for_ssid(dhd_pub_t *dhd); ++extern int dhd_pno_enable(dhd_pub_t *dhd, int enable); ++extern int dhd_pno_set_for_ssid(dhd_pub_t *dhd, wlc_ssid_t* ssid_list, int nssid, ++ uint16 scan_fr, int pno_repeat, int pno_freq_expo_max, uint16 *channel_list, int nchan); ++ ++extern int dhd_pno_set_for_batch(dhd_pub_t *dhd, struct dhd_pno_batch_params *batch_params); ++ ++extern int dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason); ++ ++ ++extern int dhd_pno_stop_for_batch(dhd_pub_t *dhd); ++ ++extern int dhd_pno_set_for_hotlist(dhd_pub_t *dhd, wl_pfn_bssid_t *p_pfn_bssid, ++ struct dhd_pno_hotlist_params *hotlist_params); ++ ++extern int dhd_pno_stop_for_hotlist(dhd_pub_t *dhd); ++ ++extern int dhd_pno_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event, void *event_data); ++extern int dhd_pno_init(dhd_pub_t *dhd); ++extern int dhd_pno_deinit(dhd_pub_t *dhd); ++#endif /* __DHD_PNO_H__ */ +diff --git a/drivers/net/wireless/ap6210/dhd_proto.h b/drivers/net/wireless/ap6210/dhd_proto.h +new file mode 100644 +index 0000000..09d5468 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_proto.h +@@ -0,0 +1,113 @@ ++/* ++ * Header file describing the internal (inter-module) DHD interfaces. ++ * ++ * Provides type definitions and function prototypes used to link the ++ * DHD OS, bus, and protocol modules. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_proto.h 343390 2012-07-06 22:34:19Z $ ++ */ ++ ++#ifndef _dhd_proto_h_ ++#define _dhd_proto_h_ ++ ++#include ++#include ++ ++#ifndef IOCTL_RESP_TIMEOUT ++#define IOCTL_RESP_TIMEOUT 2000 /* In milli second default value for Production FW */ ++#endif /* IOCTL_RESP_TIMEOUT */ ++ ++/* ++ * Exported from the dhd protocol module (dhd_cdc, dhd_rndis) ++ */ ++ ++/* Linkage, sets prot link and updates hdrlen in pub */ ++extern int dhd_prot_attach(dhd_pub_t *dhdp); ++ ++/* Unlink, frees allocated protocol memory (including dhd_prot) */ ++extern void dhd_prot_detach(dhd_pub_t *dhdp); ++ ++/* Initialize protocol: sync w/dongle state. ++ * Sets dongle media info (iswl, drv_version, mac address). ++ */ ++extern int dhd_prot_init(dhd_pub_t *dhdp); ++ ++/* Stop protocol: sync w/dongle state. */ ++extern void dhd_prot_stop(dhd_pub_t *dhdp); ++#ifdef PROP_TXSTATUS ++extern int dhd_wlfc_init(dhd_pub_t *dhd); ++extern void dhd_wlfc_deinit(dhd_pub_t *dhd); ++#endif /* PROP_TXSTATUS */ ++ ++/* Add any protocol-specific data header. ++ * Caller must reserve prot_hdrlen prepend space. ++ */ ++extern void dhd_prot_hdrpush(dhd_pub_t *, int ifidx, void *txp); ++ ++/* Remove any protocol-specific data header. */ ++extern int dhd_prot_hdrpull(dhd_pub_t *, int *ifidx, void *rxp, uchar *buf, uint *len); ++ ++/* Use protocol to issue ioctl to dongle */ ++extern int dhd_prot_ioctl(dhd_pub_t *dhd, int ifidx, wl_ioctl_t * ioc, void * buf, int len); ++ ++/* Handles a protocol control response asynchronously */ ++extern int dhd_prot_ctl_complete(dhd_pub_t *dhd); ++ ++/* Check for and handle local prot-specific iovar commands */ ++extern int dhd_prot_iovar_op(dhd_pub_t *dhdp, const char *name, ++ void *params, int plen, void *arg, int len, bool set); ++ ++/* Add prot dump output to a buffer */ ++extern void dhd_prot_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf); ++ ++/* Update local copy of dongle statistics */ ++extern void dhd_prot_dstats(dhd_pub_t *dhdp); ++ ++extern int dhd_ioctl(dhd_pub_t * dhd_pub, dhd_ioctl_t *ioc, void * buf, uint buflen); ++ ++extern int dhd_preinit_ioctls(dhd_pub_t *dhd); ++ ++#ifdef PROP_TXSTATUS ++extern int dhd_wlfc_enque_sendq(void* state, int prec, void* p); ++extern int dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx); ++extern void dhd_wlfc_cleanup(dhd_pub_t *dhd); ++#endif /* PROP_TXSTATUS */ ++ ++extern int dhd_process_pkt_reorder_info(dhd_pub_t *dhd, uchar *reorder_info_buf, ++ uint reorder_info_len, void **pkt, uint32 *free_buf_count); ++ ++ ++/******************************** ++ * For version-string expansion * ++ */ ++#if defined(BDC) ++#define DHD_PROTOCOL "bdc" ++#elif defined(CDC) ++#define DHD_PROTOCOL "cdc" ++#elif defined(RNDIS) ++#define DHD_PROTOCOL "rndis" ++#else ++#define DHD_PROTOCOL "unknown" ++#endif /* proto */ ++ ++#endif /* _dhd_proto_h_ */ +diff --git a/drivers/net/wireless/ap6210/dhd_sdio.c b/drivers/net/wireless/ap6210/dhd_sdio.c +new file mode 100644 +index 0000000..786f287 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_sdio.c +@@ -0,0 +1,7856 @@ ++/* ++ * DHD Bus Module for SDIO ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_sdio.c 373330 2012-12-07 04:46:17Z $ ++ */ ++ ++#include ++#include ++#include ++ ++#ifdef BCMEMBEDIMAGE ++#include BCMEMBEDIMAGE ++#endif /* BCMEMBEDIMAGE */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#if defined(DHD_DEBUG) ++#include ++#include ++#endif /* defined(DHD_DEBUG) */ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#ifndef DHDSDIO_MEM_DUMP_FNAME ++#define DHDSDIO_MEM_DUMP_FNAME "mem_dump" ++#endif ++ ++#define QLEN 256 /* bulk rx and tx queue lengths */ ++#define FCHI (QLEN - 10) ++#define FCLOW (FCHI / 2) ++#define PRIOMASK 7 ++ ++#define TXRETRIES 2 /* # of retries for tx frames */ ++ ++#define DHD_RXBOUND 50 /* Default for max rx frames in one scheduling */ ++ ++#define DHD_TXBOUND 20 /* Default for max tx frames in one scheduling */ ++ ++#define DHD_TXMINMAX 1 /* Max tx frames if rx still pending */ ++ ++#define MEMBLOCK 2048 /* Block size used for downloading of dongle image */ ++#define MAX_NVRAMBUF_SIZE 4096 /* max nvram buf size */ ++#define MAX_DATA_BUF (32 * 1024) /* Must be large enough to hold biggest possible glom */ ++ ++#ifndef DHD_FIRSTREAD ++#define DHD_FIRSTREAD 32 ++#endif ++#if !ISPOWEROF2(DHD_FIRSTREAD) ++#error DHD_FIRSTREAD is not a power of 2! ++#endif ++ ++#ifdef BCMSDIOH_TXGLOM ++/* Total length of TX frame header for dongle protocol */ ++#define SDPCM_HDRLEN (SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN + SDPCM_SWHEADER_LEN) ++/* Total length of RX frame for dongle protocol */ ++#else ++/* Total length of TX frame header for dongle protocol */ ++#define SDPCM_HDRLEN (SDPCM_FRAMETAG_LEN + SDPCM_SWHEADER_LEN) ++#endif ++ ++#define SDPCM_HDRLEN_RX (SDPCM_FRAMETAG_LEN + SDPCM_SWHEADER_LEN) ++ ++#ifdef SDTEST ++#define SDPCM_RESERVE (SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + DHD_SDALIGN) ++#else ++#define SDPCM_RESERVE (SDPCM_HDRLEN + DHD_SDALIGN) ++#endif ++ ++/* Space for header read, limit for data packets */ ++#ifndef MAX_HDR_READ ++#define MAX_HDR_READ 32 ++#endif ++#if !ISPOWEROF2(MAX_HDR_READ) ++#error MAX_HDR_READ is not a power of 2! ++#endif ++ ++#define MAX_RX_DATASZ 2048 ++ ++/* Maximum milliseconds to wait for F2 to come up */ ++#define DHD_WAIT_F2RDY 3000 ++ ++/* Bump up limit on waiting for HT to account for first startup; ++ * if the image is doing a CRC calculation before programming the PMU ++ * for HT availability, it could take a couple hundred ms more, so ++ * max out at a 1 second (1000000us). ++ */ ++#if (PMU_MAX_TRANSITION_DLY <= 1000000) ++#undef PMU_MAX_TRANSITION_DLY ++#define PMU_MAX_TRANSITION_DLY 1000000 ++#endif ++ ++/* Value for ChipClockCSR during initial setup */ ++#define DHD_INIT_CLKCTL1 (SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ) ++#define DHD_INIT_CLKCTL2 (SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP) ++ ++/* Flags for SDH calls */ ++#define F2SYNC (SDIO_REQ_4BYTE | SDIO_REQ_FIXED) ++ ++/* Packet free applicable unconditionally for sdio and sdspi. Conditional if ++ * bufpool was present for gspi bus. ++ */ ++#define PKTFREE2() if ((bus->bus != SPI_BUS) || bus->usebufpool) \ ++ PKTFREE(bus->dhd->osh, pkt, FALSE); ++DHD_SPINWAIT_SLEEP_INIT(sdioh_spinwait_sleep); ++#if defined(OOB_INTR_ONLY) ++extern void bcmsdh_set_irq(int flag); ++#endif ++#ifdef PROP_TXSTATUS ++extern void dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success, bool wlfc_locked); ++extern void dhd_wlfc_trigger_pktcommit(dhd_pub_t *dhd); ++#endif ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) ++DEFINE_MUTEX(_dhd_sdio_mutex_lock_); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ ++ ++#ifdef DHD_DEBUG ++/* Device console log buffer state */ ++#define CONSOLE_LINE_MAX 192 ++#define CONSOLE_BUFFER_MAX 2024 ++typedef struct dhd_console { ++ uint count; /* Poll interval msec counter */ ++ uint log_addr; /* Log struct address (fixed) */ ++ hndrte_log_t log; /* Log struct (host copy) */ ++ uint bufsize; /* Size of log buffer */ ++ uint8 *buf; /* Log buffer (host copy) */ ++ uint last; /* Last buffer read index */ ++} dhd_console_t; ++#endif /* DHD_DEBUG */ ++ ++#define REMAP_ENAB(bus) ((bus)->remap) ++#define REMAP_ISADDR(bus, a) (((a) >= ((bus)->orig_ramsize)) && ((a) < ((bus)->ramsize))) ++#define KSO_ENAB(bus) ((bus)->kso) ++#define SR_ENAB(bus) ((bus)->_srenab) ++#define SLPAUTO_ENAB(bus) ((SR_ENAB(bus)) && ((bus)->_slpauto)) ++#define MIN_RSRC_ADDR (SI_ENUM_BASE + 0x618) ++#define MIN_RSRC_SR 0x3 ++#define CORE_CAPEXT_ADDR (SI_ENUM_BASE + 0x64c) ++#define CORE_CAPEXT_SR_SUPPORTED_MASK (1 << 1) ++#define RCTL_MACPHY_DISABLE_MASK (1 << 26) ++#define RCTL_LOGIC_DISABLE_MASK (1 << 27) ++ ++#define OOB_WAKEUP_ENAB(bus) ((bus)->_oobwakeup) ++#define GPIO_DEV_SRSTATE 16 /* Host gpio17 mapped to device gpio0 SR state */ ++#define GPIO_DEV_SRSTATE_TIMEOUT 320000 /* 320ms */ ++#define GPIO_DEV_WAKEUP 17 /* Host gpio17 mapped to device gpio1 wakeup */ ++#define CC_CHIPCTRL2_GPIO1_WAKEUP (1 << 0) ++ ++#define CC_PMUCC3 (0x3) ++/* Private data for SDIO bus interaction */ ++typedef struct dhd_bus { ++ dhd_pub_t *dhd; ++ ++ bcmsdh_info_t *sdh; /* Handle for BCMSDH calls */ ++ si_t *sih; /* Handle for SI calls */ ++ char *vars; /* Variables (from CIS and/or other) */ ++ uint varsz; /* Size of variables buffer */ ++ uint32 sbaddr; /* Current SB window pointer (-1, invalid) */ ++ ++ sdpcmd_regs_t *regs; /* Registers for SDIO core */ ++ uint sdpcmrev; /* SDIO core revision */ ++ uint armrev; /* CPU core revision */ ++ uint ramrev; /* SOCRAM core revision */ ++ uint32 ramsize; /* Size of RAM in SOCRAM (bytes) */ ++ uint32 orig_ramsize; /* Size of RAM in SOCRAM (bytes) */ ++ uint32 srmemsize; /* Size of SRMEM */ ++ ++ uint32 bus; /* gSPI or SDIO bus */ ++ uint32 hostintmask; /* Copy of Host Interrupt Mask */ ++ uint32 intstatus; /* Intstatus bits (events) pending */ ++ bool dpc_sched; /* Indicates DPC schedule (intrpt rcvd) */ ++ bool fcstate; /* State of dongle flow-control */ ++ ++ uint16 cl_devid; /* cached devid for dhdsdio_probe_attach() */ ++ char *fw_path; /* module_param: path to firmware image */ ++ char *nv_path; /* module_param: path to nvram vars file */ ++ const char *nvram_params; /* user specified nvram params. */ ++ ++ uint blocksize; /* Block size of SDIO transfers */ ++ uint roundup; /* Max roundup limit */ ++ ++ struct pktq txq; /* Queue length used for flow-control */ ++ uint8 flowcontrol; /* per prio flow control bitmask */ ++ uint8 tx_seq; /* Transmit sequence number (next) */ ++ uint8 tx_max; /* Maximum transmit sequence allowed */ ++ ++ uint8 hdrbuf[MAX_HDR_READ + DHD_SDALIGN]; ++ uint8 *rxhdr; /* Header of current rx frame (in hdrbuf) */ ++ uint16 nextlen; /* Next Read Len from last header */ ++ uint8 rx_seq; /* Receive sequence number (expected) */ ++ bool rxskip; /* Skip receive (awaiting NAK ACK) */ ++ ++ void *glomd; /* Packet containing glomming descriptor */ ++ void *glom; /* Packet chain for glommed superframe */ ++ uint glomerr; /* Glom packet read errors */ ++ ++ uint8 *rxbuf; /* Buffer for receiving control packets */ ++ uint rxblen; /* Allocated length of rxbuf */ ++ uint8 *rxctl; /* Aligned pointer into rxbuf */ ++ uint8 *databuf; /* Buffer for receiving big glom packet */ ++ uint8 *dataptr; /* Aligned pointer into databuf */ ++ uint rxlen; /* Length of valid data in buffer */ ++ ++ uint8 sdpcm_ver; /* Bus protocol reported by dongle */ ++ ++ bool intr; /* Use interrupts */ ++ bool poll; /* Use polling */ ++ bool ipend; /* Device interrupt is pending */ ++ bool intdis; /* Interrupts disabled by isr */ ++ uint intrcount; /* Count of device interrupt callbacks */ ++ uint lastintrs; /* Count as of last watchdog timer */ ++ uint spurious; /* Count of spurious interrupts */ ++ uint pollrate; /* Ticks between device polls */ ++ uint polltick; /* Tick counter */ ++ uint pollcnt; /* Count of active polls */ ++ ++#ifdef DHD_DEBUG ++ dhd_console_t console; /* Console output polling support */ ++ uint console_addr; /* Console address from shared struct */ ++#endif /* DHD_DEBUG */ ++ ++ uint regfails; /* Count of R_REG/W_REG failures */ ++ ++ uint clkstate; /* State of sd and backplane clock(s) */ ++ bool activity; /* Activity flag for clock down */ ++ int32 idletime; /* Control for activity timeout */ ++ int32 idlecount; /* Activity timeout counter */ ++ int32 idleclock; /* How to set bus driver when idle */ ++ int32 sd_divisor; /* Speed control to bus driver */ ++ int32 sd_mode; /* Mode control to bus driver */ ++ int32 sd_rxchain; /* If bcmsdh api accepts PKT chains */ ++ bool use_rxchain; /* If dhd should use PKT chains */ ++ bool sleeping; /* Is SDIO bus sleeping? */ ++ uint rxflow_mode; /* Rx flow control mode */ ++ bool rxflow; /* Is rx flow control on */ ++ uint prev_rxlim_hit; /* Is prev rx limit exceeded (per dpc schedule) */ ++ bool alp_only; /* Don't use HT clock (ALP only) */ ++ /* Field to decide if rx of control frames happen in rxbuf or lb-pool */ ++ bool usebufpool; ++ ++#ifdef SDTEST ++ /* external loopback */ ++ bool ext_loop; ++ uint8 loopid; ++ ++ /* pktgen configuration */ ++ uint pktgen_freq; /* Ticks between bursts */ ++ uint pktgen_count; /* Packets to send each burst */ ++ uint pktgen_print; /* Bursts between count displays */ ++ uint pktgen_total; /* Stop after this many */ ++ uint pktgen_minlen; /* Minimum packet data len */ ++ uint pktgen_maxlen; /* Maximum packet data len */ ++ uint pktgen_mode; /* Configured mode: tx, rx, or echo */ ++ uint pktgen_stop; /* Number of tx failures causing stop */ ++ ++ /* active pktgen fields */ ++ uint pktgen_tick; /* Tick counter for bursts */ ++ uint pktgen_ptick; /* Burst counter for printing */ ++ uint pktgen_sent; /* Number of test packets generated */ ++ uint pktgen_rcvd; /* Number of test packets received */ ++ uint pktgen_prev_time; /* Time at which previous stats where printed */ ++ uint pktgen_prev_sent; /* Number of test packets generated when ++ * previous stats were printed ++ */ ++ uint pktgen_prev_rcvd; /* Number of test packets received when ++ * previous stats were printed ++ */ ++ uint pktgen_fail; /* Number of failed send attempts */ ++ uint16 pktgen_len; /* Length of next packet to send */ ++#define PKTGEN_RCV_IDLE (0) ++#define PKTGEN_RCV_ONGOING (1) ++ uint16 pktgen_rcv_state; /* receive state */ ++ uint pktgen_rcvd_rcvsession; /* test pkts rcvd per rcv session. */ ++#endif /* SDTEST */ ++ ++ /* Some additional counters */ ++ uint tx_sderrs; /* Count of tx attempts with sd errors */ ++ uint fcqueued; /* Tx packets that got queued */ ++ uint rxrtx; /* Count of rtx requests (NAK to dongle) */ ++ uint rx_toolong; /* Receive frames too long to receive */ ++ uint rxc_errors; /* SDIO errors when reading control frames */ ++ uint rx_hdrfail; /* SDIO errors on header reads */ ++ uint rx_badhdr; /* Bad received headers (roosync?) */ ++ uint rx_badseq; /* Mismatched rx sequence number */ ++ uint fc_rcvd; /* Number of flow-control events received */ ++ uint fc_xoff; /* Number which turned on flow-control */ ++ uint fc_xon; /* Number which turned off flow-control */ ++ uint rxglomfail; /* Failed deglom attempts */ ++ uint rxglomframes; /* Number of glom frames (superframes) */ ++ uint rxglompkts; /* Number of packets from glom frames */ ++ uint f2rxhdrs; /* Number of header reads */ ++ uint f2rxdata; /* Number of frame data reads */ ++ uint f2txdata; /* Number of f2 frame writes */ ++ uint f1regdata; /* Number of f1 register accesses */ ++ ++ uint8 *ctrl_frame_buf; ++ uint32 ctrl_frame_len; ++ bool ctrl_frame_stat; ++ uint32 rxint_mode; /* rx interrupt mode */ ++ bool remap; /* Contiguous 1MB RAM: 512K socram + 512K devram ++ * Available with socram rev 16 ++ * Remap region not DMA-able ++ */ ++ bool kso; ++ bool _slpauto; ++ bool _oobwakeup; ++ bool _srenab; ++ bool readframes; ++ bool reqbussleep; ++ uint32 resetinstr; ++ uint32 dongle_ram_base; ++#ifdef BCMSDIOH_TXGLOM ++ void *glom_pkt_arr[SDPCM_MAXGLOM_SIZE]; /* Array of pkts for glomming */ ++ uint16 glom_cnt; /* Number of pkts in the glom array */ ++ uint16 glom_total_len; /* Total length of pkts in glom array */ ++ bool glom_enable; /* Flag to indicate whether tx glom is enabled/disabled */ ++ uint8 glom_mode; /* Glom mode - 0-copy mode, 1 - Multi-descriptor mode */ ++ uint32 glomsize; /* Glom size limitation */ ++#endif ++} dhd_bus_t; ++ ++/* clkstate */ ++#define CLK_NONE 0 ++#define CLK_SDONLY 1 ++#define CLK_PENDING 2 /* Not used yet */ ++#define CLK_AVAIL 3 ++ ++#define DHD_NOPMU(dhd) (FALSE) ++ ++#ifdef DHD_DEBUG ++static int qcount[NUMPRIO]; ++static int tx_packets[NUMPRIO]; ++#endif /* DHD_DEBUG */ ++ ++/* Deferred transmit */ ++const uint dhd_deferred_tx = 1; ++ ++extern uint dhd_watchdog_ms; ++extern void dhd_os_wd_timer(void *bus, uint wdtick); ++ ++/* Tx/Rx bounds */ ++uint dhd_txbound; ++uint dhd_rxbound; ++uint dhd_txminmax = DHD_TXMINMAX; ++ ++/* override the RAM size if possible */ ++#define DONGLE_MIN_MEMSIZE (128 *1024) ++int dhd_dongle_memsize; ++ ++static bool dhd_doflow; ++static bool dhd_alignctl; ++ ++static bool sd1idle; ++ ++static bool retrydata; ++#define RETRYCHAN(chan) (((chan) == SDPCM_EVENT_CHANNEL) || retrydata) ++ ++#if defined(SDIO_CRC_ERROR_FIX) ++static uint watermark = 48; ++static uint mesbusyctrl = 80; ++#else ++static const uint watermark = 8; ++static const uint mesbusyctrl = 0; ++#endif ++static const uint firstread = DHD_FIRSTREAD; ++ ++#define HDATLEN (firstread - (SDPCM_HDRLEN)) ++ ++/* Retry count for register access failures */ ++static const uint retry_limit = 2; ++ ++/* Force even SD lengths (some host controllers mess up on odd bytes) */ ++static bool forcealign; ++ ++#define FW_TYPE_STA 0 ++#define FW_TYPE_APSTA 1 ++#define FW_TYPE_P2P 2 ++#define FW_TYPE_MFG 3 ++#define FW_TYPE_G 0 ++#define FW_TYPE_AG 1 ++ ++const static char *bcm40183b2_fw_name[] = { ++ "fw_bcm40183b2.bin", ++ "fw_bcm40183b2_apsta.bin", ++ "fw_bcm40183b2_p2p.bin", ++ "fw_bcm40183b2_mfg.bin" ++}; ++ ++const static char *bcm40183b2ag_fw_name[] = { ++ "fw_bcm40183b2_ag.bin", ++ "fw_bcm40183b2_ag_apsta.bin", ++ "fw_bcm40183b2_ag_p2p.bin", ++ "fw_bcm40183b2_ag_mfg.bin" ++}; ++ ++const static char *bcm40181a0_fw_name[] = { ++ "fw_bcm40181a0.bin", ++ "fw_bcm40181a0_apsta.bin", ++ "fw_bcm40181a0_p2p.bin", ++ "fw_bcm40181a0_mfg.bin" ++}; ++ ++const static char *bcm40181a2_fw_name[] = { ++ "fw_bcm40181a2.bin", ++ "fw_bcm40181a2_apsta.bin", ++ "fw_bcm40181a2_p2p.bin", ++ "fw_bcm40181a2_mfg.bin" ++}; ++ ++const static char *bcm43341b0ag_fw_name[] = { ++ "fw_bcm43341b0_ag.bin", ++ "fw_bcm43341b0_ag_apsta.bin", ++ "fw_bcm43341b0_ag_p2p.bin", ++ "fw_bcm43341b0_ag_mfg.bin" ++}; ++ ++const static char *bcm43241b4ag_fw_name[] = { ++ "fw_bcm43241b4_ag.bin", ++ "fw_bcm43241b4_ag_apsta.bin", ++ "fw_bcm43241b4_ag_p2p.bin", ++ "fw_bcm43241b4_ag_mfg.bin" ++}; ++ ++#define BCM4330B2_CHIP_REV 4 ++#define BCM43362A0_CHIP_REV 0 ++#define BCM43362A2_CHIP_REV 1 ++#define BCM43341B0_CHIP_REV 2 ++#define BCM43241B4_CHIP_REV 5 ++ ++#define ALIGNMENT 4 ++ ++#if defined(OOB_INTR_ONLY) && defined(HW_OOB) ++extern void bcmsdh_enable_hw_oob_intr(void *sdh, bool enable); ++#endif ++ ++#if defined(OOB_INTR_ONLY) && defined(SDIO_ISR_THREAD) ++#error OOB_INTR_ONLY is NOT working with SDIO_ISR_THREAD ++#endif /* defined(OOB_INTR_ONLY) && defined(SDIO_ISR_THREAD) */ ++#define PKTALIGN(osh, p, len, align) \ ++ do { \ ++ uint datalign; \ ++ datalign = (uintptr)PKTDATA((osh), (p)); \ ++ datalign = ROUNDUP(datalign, (align)) - datalign; \ ++ ASSERT(datalign < (align)); \ ++ ASSERT(PKTLEN((osh), (p)) >= ((len) + datalign)); \ ++ if (datalign) \ ++ PKTPULL((osh), (p), datalign); \ ++ PKTSETLEN((osh), (p), (len)); \ ++ } while (0) ++ ++/* Limit on rounding up frames */ ++static const uint max_roundup = 512; ++ ++/* Try doing readahead */ ++static bool dhd_readahead; ++ ++ ++/* To check if there's window offered */ ++#define DATAOK(bus) \ ++ (((uint8)(bus->tx_max - bus->tx_seq) > 1) && \ ++ (((uint8)(bus->tx_max - bus->tx_seq) & 0x80) == 0)) ++ ++/* To check if there's window offered for ctrl frame */ ++#define TXCTLOK(bus) \ ++ (((uint8)(bus->tx_max - bus->tx_seq) != 0) && \ ++ (((uint8)(bus->tx_max - bus->tx_seq) & 0x80) == 0)) ++ ++/* Number of pkts available in dongle for data RX */ ++#define DATABUFCNT(bus) \ ++ ((uint8)(bus->tx_max - bus->tx_seq) - 1) ++ ++/* Macros to get register read/write status */ ++/* NOTE: these assume a local dhdsdio_bus_t *bus! */ ++#define R_SDREG(regvar, regaddr, retryvar) \ ++do { \ ++ retryvar = 0; \ ++ do { \ ++ regvar = R_REG(bus->dhd->osh, regaddr); \ ++ } while (bcmsdh_regfail(bus->sdh) && (++retryvar <= retry_limit)); \ ++ if (retryvar) { \ ++ bus->regfails += (retryvar-1); \ ++ if (retryvar > retry_limit) { \ ++ AP6210_ERR("%s: FAILED" #regvar "READ, LINE %d\n", \ ++ __FUNCTION__, __LINE__); \ ++ regvar = 0; \ ++ } \ ++ } \ ++} while (0) ++ ++#define W_SDREG(regval, regaddr, retryvar) \ ++do { \ ++ retryvar = 0; \ ++ do { \ ++ W_REG(bus->dhd->osh, regaddr, regval); \ ++ } while (bcmsdh_regfail(bus->sdh) && (++retryvar <= retry_limit)); \ ++ if (retryvar) { \ ++ bus->regfails += (retryvar-1); \ ++ if (retryvar > retry_limit) \ ++ AP6210_ERR("%s: FAILED REGISTER WRITE, LINE %d\n", \ ++ __FUNCTION__, __LINE__); \ ++ } \ ++} while (0) ++ ++#define BUS_WAKE(bus) \ ++ do { \ ++ bus->idlecount = 0; \ ++ if ((bus)->sleeping) \ ++ dhdsdio_bussleep((bus), FALSE); \ ++ } while (0); ++ ++/* ++ * pktavail interrupts from dongle to host can be managed in 3 different ways ++ * whenever there is a packet available in dongle to transmit to host. ++ * ++ * Mode 0: Dongle writes the software host mailbox and host is interrupted. ++ * Mode 1: (sdiod core rev >= 4) ++ * Device sets a new bit in the intstatus whenever there is a packet ++ * available in fifo. Host can't clear this specific status bit until all the ++ * packets are read from the FIFO. No need to ack dongle intstatus. ++ * Mode 2: (sdiod core rev >= 4) ++ * Device sets a bit in the intstatus, and host acks this by writing ++ * one to this bit. Dongle won't generate anymore packet interrupts ++ * until host reads all the packets from the dongle and reads a zero to ++ * figure that there are no more packets. No need to disable host ints. ++ * Need to ack the intstatus. ++ */ ++ ++#define SDIO_DEVICE_HMB_RXINT 0 /* default old way */ ++#define SDIO_DEVICE_RXDATAINT_MODE_0 1 /* from sdiod rev 4 */ ++#define SDIO_DEVICE_RXDATAINT_MODE_1 2 /* from sdiod rev 4 */ ++ ++ ++#define FRAME_AVAIL_MASK(bus) \ ++ ((bus->rxint_mode == SDIO_DEVICE_HMB_RXINT) ? I_HMB_FRAME_IND : I_XMTDATA_AVAIL) ++ ++#define DHD_BUS SDIO_BUS ++ ++#define PKT_AVAILABLE(bus, intstatus) ((intstatus) & (FRAME_AVAIL_MASK(bus))) ++ ++#define HOSTINTMASK (I_HMB_SW_MASK | I_CHIPACTIVE) ++ ++#define GSPI_PR55150_BAILOUT ++ ++#ifdef SDTEST ++static void dhdsdio_testrcv(dhd_bus_t *bus, void *pkt, uint seq); ++static void dhdsdio_sdtest_set(dhd_bus_t *bus, uint count); ++#endif ++ ++#ifdef DHD_DEBUG ++static int dhdsdio_checkdied(dhd_bus_t *bus, char *data, uint size); ++static int dhd_serialconsole(dhd_bus_t *bus, bool get, bool enable, int *bcmerror); ++#endif /* DHD_DEBUG */ ++ ++static int dhdsdio_devcap_set(dhd_bus_t *bus, uint8 cap); ++static int dhdsdio_download_state(dhd_bus_t *bus, bool enter); ++ ++static void dhdsdio_release(dhd_bus_t *bus, osl_t *osh); ++static void dhdsdio_release_malloc(dhd_bus_t *bus, osl_t *osh); ++static void dhdsdio_disconnect(void *ptr); ++static bool dhdsdio_chipmatch(uint16 chipid); ++static bool dhdsdio_probe_attach(dhd_bus_t *bus, osl_t *osh, void *sdh, ++ void * regsva, uint16 devid); ++static bool dhdsdio_probe_malloc(dhd_bus_t *bus, osl_t *osh, void *sdh); ++static bool dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh); ++static void dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, bool dongle_isolation, ++ bool reset_flag); ++ ++static void dhd_dongle_setmemsize(struct dhd_bus *bus, int mem_size); ++static int dhd_bcmsdh_recv_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, ++ uint8 *buf, uint nbytes, ++ void *pkt, bcmsdh_cmplt_fn_t complete, void *handle); ++static int dhd_bcmsdh_send_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, ++ uint8 *buf, uint nbytes, ++ void *pkt, bcmsdh_cmplt_fn_t complete, void *handle); ++#ifdef BCMSDIOH_TXGLOM ++static void dhd_bcmsdh_glom_post(dhd_bus_t *bus, uint8 *frame, uint len); ++static void dhd_bcmsdh_glom_clear(dhd_bus_t *bus); ++#endif ++ ++static bool dhdsdio_download_firmware(dhd_bus_t *bus, osl_t *osh, void *sdh); ++static int _dhdsdio_download_firmware(dhd_bus_t *bus); ++ ++static int dhdsdio_download_code_file(dhd_bus_t *bus, char *image_path); ++static int dhdsdio_download_nvram(dhd_bus_t *bus); ++#ifdef BCMEMBEDIMAGE ++static int dhdsdio_download_code_array(dhd_bus_t *bus); ++#endif ++static int dhdsdio_bussleep(dhd_bus_t *bus, bool sleep); ++static int dhdsdio_clkctl(dhd_bus_t *bus, uint target, bool pendok); ++static uint8 dhdsdio_sleepcsr_get(dhd_bus_t *bus); ++ ++#ifdef WLMEDIA_HTSF ++#include ++extern uint32 dhd_get_htsf(void *dhd, int ifidx); ++#endif /* WLMEDIA_HTSF */ ++ ++static void ++dhd_dongle_setmemsize(struct dhd_bus *bus, int mem_size) ++{ ++ int32 min_size = DONGLE_MIN_MEMSIZE; ++ /* Restrict the memsize to user specified limit */ ++ AP6210_DEBUG("user: Restrict the dongle ram size to %d, min accepted %d\n", ++ dhd_dongle_memsize, min_size); ++ if ((dhd_dongle_memsize > min_size) && ++ (dhd_dongle_memsize < (int32)bus->orig_ramsize)) ++ bus->ramsize = dhd_dongle_memsize; ++} ++ ++static int ++dhdsdio_set_siaddr_window(dhd_bus_t *bus, uint32 address) ++{ ++ int err = 0; ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW, ++ (address >> 8) & SBSDIO_SBADDRLOW_MASK, &err); ++ if (!err) ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRMID, ++ (address >> 16) & SBSDIO_SBADDRMID_MASK, &err); ++ if (!err) ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRHIGH, ++ (address >> 24) & SBSDIO_SBADDRHIGH_MASK, &err); ++ return err; ++} ++ ++ ++#ifdef USE_OOB_GPIO1 ++static int ++dhdsdio_oobwakeup_init(dhd_bus_t *bus) ++{ ++ uint32 val, addr, data; ++ ++ bcmsdh_gpioouten(bus->sdh, GPIO_DEV_WAKEUP); ++ ++ addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); ++ data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); ++ ++ /* Set device for gpio1 wakeup */ ++ bcmsdh_reg_write(bus->sdh, addr, 4, 2); ++ val = bcmsdh_reg_read(bus->sdh, data, 4); ++ val |= CC_CHIPCTRL2_GPIO1_WAKEUP; ++ bcmsdh_reg_write(bus->sdh, data, 4, val); ++ ++ bus->_oobwakeup = TRUE; ++ ++ return 0; ++} ++#endif /* USE_OOB_GPIO1 */ ++ ++/* ++ * Query if FW is in SR mode ++ */ ++static bool ++dhdsdio_sr_cap(dhd_bus_t *bus) ++{ ++ bool cap = FALSE; ++ uint32 min = 0, core_capext, addr, data; ++ if (bus->sih->chip == BCM4324_CHIP_ID) { ++ addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); ++ data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); ++ bcmsdh_reg_write(bus->sdh, addr, 4, 3); ++ core_capext = bcmsdh_reg_read(bus->sdh, data, 4); ++ } else if (bus->sih->chip == BCM4330_CHIP_ID || bus->sih->chip == BCM43362_CHIP_ID) { ++ core_capext = FALSE; ++ } else if (bus->sih->chip == BCM4335_CHIP_ID) { ++ core_capext = TRUE; ++ } else { ++ core_capext = bcmsdh_reg_read(bus->sdh, CORE_CAPEXT_ADDR, 4); ++ core_capext = (core_capext & CORE_CAPEXT_SR_SUPPORTED_MASK); ++ } ++ if (!(core_capext)) ++ return FALSE; ++ ++ if (bus->sih->chip == BCM4324_CHIP_ID) { ++ /* FIX: Should change to query SR control register instead */ ++ min = bcmsdh_reg_read(bus->sdh, MIN_RSRC_ADDR, 4); ++ if (min == MIN_RSRC_SR) ++ cap = TRUE; ++ } else if (bus->sih->chip == BCM4335_CHIP_ID) { ++ uint32 enabval = 0; ++ addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); ++ data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); ++ bcmsdh_reg_write(bus->sdh, addr, 4, CC_PMUCC3); ++ enabval = bcmsdh_reg_read(bus->sdh, data, 4); ++ ++ if (enabval) ++ cap = TRUE; ++ } else { ++ data = bcmsdh_reg_read(bus->sdh, ++ SI_ENUM_BASE + OFFSETOF(chipcregs_t, retention_ctl), 4); ++ if ((data & (RCTL_MACPHY_DISABLE_MASK | RCTL_LOGIC_DISABLE_MASK)) == 0) ++ cap = TRUE; ++ } ++ ++ return cap; ++} ++ ++static int ++dhdsdio_srwar_init(dhd_bus_t *bus) ++{ ++ ++ bcmsdh_gpio_init(bus->sdh); ++ ++#ifdef USE_OOB_GPIO1 ++ dhdsdio_oobwakeup_init(bus); ++#endif ++ ++ ++ return 0; ++} ++ ++static int ++dhdsdio_sr_init(dhd_bus_t *bus) ++{ ++ uint8 val; ++ int err = 0; ++ ++ if ((bus->sih->chip == BCM4334_CHIP_ID) && (bus->sih->chiprev == 2)) ++ dhdsdio_srwar_init(bus); ++ ++ val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_WAKEUPCTRL, NULL); ++ val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT; ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_WAKEUPCTRL, ++ 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT, &err); ++ val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_WAKEUPCTRL, NULL); ++ ++ /* Add CMD14 Support */ ++ dhdsdio_devcap_set(bus, ++ (SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT | SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT)); ++ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, SBSDIO_FORCE_HT, &err); ++ ++ bus->_slpauto = dhd_slpauto ? TRUE : FALSE; ++ ++ bus->_srenab = TRUE; ++ ++ return 0; ++} ++ ++/* ++ * FIX: Be sure KSO bit is enabled ++ * Currently, it's defaulting to 0 which should be 1. ++ */ ++static int ++dhdsdio_clk_kso_init(dhd_bus_t *bus) ++{ ++ uint8 val; ++ int err = 0; ++ ++ /* set flag */ ++ bus->kso = TRUE; ++ ++ /* ++ * Enable KeepSdioOn (KSO) bit for normal operation ++ * Default is 0 (4334A0) so set it. Fixed in B0. ++ */ ++ val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, NULL); ++ if (!(val & SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) { ++ val |= (SBSDIO_FUNC1_SLEEPCSR_KSO_EN << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, val, &err); ++ if (err) ++ AP6210_ERR("%s: SBSDIO_FUNC1_SLEEPCSR err: 0x%x\n", __FUNCTION__, err); ++ } ++ ++ return 0; ++} ++ ++#define KSO_DBG(x) ++#define MAX_KSO_ATTEMPTS 64 ++static int ++dhdsdio_clk_kso_enab(dhd_bus_t *bus, bool on) ++{ ++ uint8 wr_val = 0, rd_val, cmp_val, bmask; ++ int err = 0; ++ int try_cnt = 0; ++ ++ KSO_DBG(("%s> op:%s\n", __FUNCTION__, (on ? "KSO_SET" : "KSO_CLR"))); ++ ++ wr_val |= (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); ++ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err); ++ ++ if (on) { ++ cmp_val = SBSDIO_FUNC1_SLEEPCSR_KSO_MASK | SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK; ++ bmask = cmp_val; ++ ++ msleep(3); ++ ++ } else { ++ /* Put device to sleep, turn off KSO */ ++ cmp_val = 0; ++ bmask = SBSDIO_FUNC1_SLEEPCSR_KSO_MASK; ++ } ++ ++ do { ++ rd_val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, &err); ++ if (((rd_val & bmask) == cmp_val) && !err) ++ break; ++ ++ KSO_DBG(("%s> KSO wr/rd retry:%d, ERR:%x \n", __FUNCTION__, try_cnt, err)); ++ OSL_DELAY(50); ++ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err); ++ ++ } while (try_cnt++ < MAX_KSO_ATTEMPTS); ++ ++ ++ if (try_cnt > 1) { ++ KSO_DBG(("%s> op:%s, try_cnt:%d, rd_val:%x, ERR:%x \n", ++ __FUNCTION__, (on ? "KSO_SET" : "KSO_CLR"), try_cnt, rd_val, err)); ++ } ++ ++ if (try_cnt > MAX_KSO_ATTEMPTS) { ++ AP6210_ERR("%s> op:%s, ERROR: try_cnt:%d, rd_val:%x, ERR:%x \n", ++ __FUNCTION__, (on ? "KSO_SET" : "KSO_CLR"), try_cnt, rd_val, err); ++ } ++ return err; ++} ++ ++static int ++dhdsdio_clk_kso_iovar(dhd_bus_t *bus, bool on) ++{ ++ int err = 0; ++ ++ if (on == FALSE) { ++ ++ BUS_WAKE(bus); ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ AP6210_DEBUG("%s: KSO disable clk: 0x%x\n", __FUNCTION__, ++ bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, &err)); ++ dhdsdio_clk_kso_enab(bus, FALSE); ++ } else { ++ AP6210_DEBUG("%s: KSO enable\n", __FUNCTION__); ++ ++ /* Make sure we have SD bus access */ ++ if (bus->clkstate == CLK_NONE) { ++ AP6210_DEBUG("%s: Request SD clk\n", __FUNCTION__); ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++ } ++ ++ /* Double-write to be safe in case transition of AOS */ ++ dhdsdio_clk_kso_enab(bus, TRUE); ++ dhdsdio_clk_kso_enab(bus, TRUE); ++ OSL_DELAY(4000); ++ ++ /* Wait for device ready during transition to wake-up */ ++ SPINWAIT(((dhdsdio_sleepcsr_get(bus)) != ++ (SBSDIO_FUNC1_SLEEPCSR_KSO_MASK | ++ SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK)), ++ (10000)); ++ ++ AP6210_DEBUG("%s: sleepcsr: 0x%x\n", __FUNCTION__, ++ dhdsdio_sleepcsr_get(bus)); ++ } ++ ++ bus->kso = on; ++ BCM_REFERENCE(err); ++ ++ return 0; ++} ++ ++static uint8 ++dhdsdio_sleepcsr_get(dhd_bus_t *bus) ++{ ++ int err = 0; ++ uint8 val = 0; ++ ++ val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SLEEPCSR, &err); ++ if (err) ++ AP6210_DEBUG("Failed to read SLEEPCSR: %d\n", err); ++ ++ return val; ++} ++ ++uint8 ++dhdsdio_devcap_get(dhd_bus_t *bus) ++{ ++ return bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_BRCM_CARDCAP, NULL); ++} ++ ++static int ++dhdsdio_devcap_set(dhd_bus_t *bus, uint8 cap) ++{ ++ int err = 0; ++ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_BRCM_CARDCAP, cap, &err); ++ if (err) ++ AP6210_ERR("%s: devcap set err: 0x%x\n", __FUNCTION__, err); ++ ++ return 0; ++} ++ ++static int ++dhdsdio_clk_devsleep_iovar(dhd_bus_t *bus, bool on) ++{ ++ int err = 0, retry; ++ uint8 val; ++ ++ retry = 0; ++ if (on == TRUE) { ++ /* Enter Sleep */ ++ ++ /* Be sure we request clk before going to sleep ++ * so we can wake-up with clk request already set ++ * else device can go back to sleep immediately ++ */ ++ if (!SLPAUTO_ENAB(bus)) ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ else { ++ val = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); ++ if ((val & SBSDIO_CSR_MASK) == 0) { ++ AP6210_DEBUG("%s: No clock before enter sleep:0x%x\n", ++ __FUNCTION__, val); ++ ++ /* Reset clock request */ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, ++ SBSDIO_ALP_AVAIL_REQ, &err); ++ AP6210_DEBUG("%s: clock before sleep:0x%x\n", __FUNCTION__, ++ bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, &err)); ++ } ++ } ++ ++ AP6210_DEBUG("%s: clk before sleep: 0x%x\n", __FUNCTION__, ++ bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, &err)); ++#ifdef USE_CMD14 ++ err = bcmsdh_sleep(bus->sdh, TRUE); ++#else ++ err = dhdsdio_clk_kso_enab(bus, FALSE); ++ if (OOB_WAKEUP_ENAB(bus)) ++ err = bcmsdh_gpioout(bus->sdh, GPIO_DEV_WAKEUP, FALSE); /* GPIO_1 is off */ ++#endif ++ } else { ++ /* Exit Sleep */ ++ /* Make sure we have SD bus access */ ++ if (bus->clkstate == CLK_NONE) { ++ AP6210_DEBUG("%s: Request SD clk\n", __FUNCTION__); ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++ } ++ ++ if ((bus->sih->chip == BCM4334_CHIP_ID) && (bus->sih->chiprev == 2)) { ++ SPINWAIT((bcmsdh_gpioin(bus->sdh, GPIO_DEV_SRSTATE) != TRUE), ++ GPIO_DEV_SRSTATE_TIMEOUT); ++ ++ if (bcmsdh_gpioin(bus->sdh, GPIO_DEV_SRSTATE) == FALSE) { ++ AP6210_ERR("ERROR: GPIO_DEV_SRSTATE still low!\n"); ++ } ++ } ++#ifdef USE_CMD14 ++ err = bcmsdh_sleep(bus->sdh, FALSE); ++ if (SLPAUTO_ENAB(bus) && (err != 0)) { ++ OSL_DELAY(10000); ++ AP6210_DEBUG("%s: Resync device sleep\n", __FUNCTION__); ++ ++ /* Toggle sleep to resync with host and device */ ++ err = bcmsdh_sleep(bus->sdh, TRUE); ++ OSL_DELAY(10000); ++ err = bcmsdh_sleep(bus->sdh, FALSE); ++ ++ if (err) { ++ OSL_DELAY(10000); ++ AP6210_ERR("%s: CMD14 exit failed again!\n", __FUNCTION__); ++ ++ /* Toggle sleep to resync with host and device */ ++ err = bcmsdh_sleep(bus->sdh, TRUE); ++ OSL_DELAY(10000); ++ err = bcmsdh_sleep(bus->sdh, FALSE); ++ if (err) { ++ AP6210_ERR("%s: CMD14 exit failed twice!\n", __FUNCTION__); ++ AP6210_ERR("%s: FATAL: Device non-response!\n", ++ __FUNCTION__); ++ err = 0; ++ } ++ } ++ } ++#else ++ if (OOB_WAKEUP_ENAB(bus)) ++ err = bcmsdh_gpioout(bus->sdh, GPIO_DEV_WAKEUP, TRUE); /* GPIO_1 is on */ ++ ++ do { ++ err = dhdsdio_clk_kso_enab(bus, TRUE); ++ if (err) ++ OSL_DELAY(10000); ++ } while ((err != 0) && (++retry < 3)); ++ ++ if (err != 0) { ++ AP6210_ERR("ERROR: kso set failed retry: %d\n", retry); ++ err = 0; /* continue anyway */ ++ } ++#endif /* !USE_CMD14 */ ++ ++ if (err == 0) { ++ uint8 csr; ++ ++ /* Wait for device ready during transition to wake-up */ ++ SPINWAIT((((csr = dhdsdio_sleepcsr_get(bus)) & ++ SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK) != ++ (SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK)), (20000)); ++ ++ AP6210_DEBUG("%s: ExitSleep sleepcsr: 0x%x\n", __FUNCTION__, csr); ++ ++ if (!(csr & SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK)) { ++ AP6210_ERR("%s:ERROR: ExitSleep device NOT Ready! 0x%x\n", ++ __FUNCTION__, csr); ++ err = BCME_NODEVICE; ++ } ++ ++ SPINWAIT((((csr = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, &err)) & SBSDIO_HT_AVAIL) != ++ (SBSDIO_HT_AVAIL)), (10000)); ++ ++ } ++ } ++ ++ /* Update if successful */ ++ if (err == 0) ++ bus->kso = on ? FALSE : TRUE; ++ else { ++ AP6210_ERR("%s: Sleep request failed: on:%d err:%d\n", __FUNCTION__, on, err); ++ if (!on && retry > 2) ++ bus->kso = TRUE; ++ } ++ ++ return err; ++} ++ ++/* Turn backplane clock on or off */ ++static int ++dhdsdio_htclk(dhd_bus_t *bus, bool on, bool pendok) ++{ ++#define HT_AVAIL_ERROR_MAX 10 ++ static int ht_avail_error = 0; ++ int err; ++ uint8 clkctl, clkreq, devctl; ++ bcmsdh_info_t *sdh; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++#if defined(OOB_INTR_ONLY) ++ pendok = FALSE; ++#endif ++ clkctl = 0; ++ sdh = bus->sdh; ++ ++ ++ if (!KSO_ENAB(bus)) ++ return BCME_OK; ++ ++ if (SLPAUTO_ENAB(bus)) { ++ bus->clkstate = (on ? CLK_AVAIL : CLK_SDONLY); ++ return BCME_OK; ++ } ++ ++ if (on) { ++ /* Request HT Avail */ ++ clkreq = bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ; ++ ++ ++ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, clkreq, &err); ++ if (err) { ++ ht_avail_error++; ++ if (ht_avail_error < HT_AVAIL_ERROR_MAX) { ++ AP6210_ERR("%s: HT Avail request error: %d\n", __FUNCTION__, err); ++ } ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++ else if (ht_avail_error == HT_AVAIL_ERROR_MAX) { ++ dhd_os_send_hang_message(bus->dhd); ++ } ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) */ ++ return BCME_ERROR; ++ } else { ++ ht_avail_error = 0; ++ } ++ ++ if (pendok && ++ ((bus->sih->buscoretype == PCMCIA_CORE_ID) && (bus->sih->buscorerev == 9))) { ++ uint32 dummy, retries; ++ R_SDREG(dummy, &bus->regs->clockctlstatus, retries); ++ BCM_REFERENCE(dummy); ++ } ++ ++ /* Check current status */ ++ clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); ++ if (err) { ++ AP6210_ERR("%s: HT Avail read error: %d\n", __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ ++ /* Go to pending and await interrupt if appropriate */ ++ if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) { ++ /* Allow only clock-available interrupt */ ++ devctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); ++ if (err) { ++ AP6210_ERR("%s: Devctl access error setting CA: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ ++ devctl |= SBSDIO_DEVCTL_CA_INT_ONLY; ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, devctl, &err); ++ AP6210_DEBUG("CLKCTL: set PENDING\n"); ++ bus->clkstate = CLK_PENDING; ++ return BCME_OK; ++ } else if (bus->clkstate == CLK_PENDING) { ++ /* Cancel CA-only interrupt filter */ ++ devctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); ++ devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, devctl, &err); ++ } ++ ++ /* Otherwise, wait here (polling) for HT Avail */ ++ if (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { ++ SPINWAIT_SLEEP(sdioh_spinwait_sleep, ++ ((clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, &err)), ++ !SBSDIO_CLKAV(clkctl, bus->alp_only)), PMU_MAX_TRANSITION_DLY); ++ } ++ if (err) { ++ AP6210_ERR("%s: HT Avail request error: %d\n", __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ if (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { ++ AP6210_ERR("%s: HT Avail timeout (%d): clkctl 0x%02x\n", ++ __FUNCTION__, PMU_MAX_TRANSITION_DLY, clkctl); ++ return BCME_ERROR; ++ } ++ ++ /* Mark clock available */ ++ bus->clkstate = CLK_AVAIL; ++ AP6210_DEBUG("CLKCTL: turned ON\n"); ++ ++#if defined(DHD_DEBUG) ++ if (bus->alp_only == TRUE) { ++#if !defined(BCMLXSDMMC) ++ if (!SBSDIO_ALPONLY(clkctl)) { ++ AP6210_ERR("%s: HT Clock, when ALP Only\n", __FUNCTION__); ++ } ++#endif /* !defined(BCMLXSDMMC) */ ++ } else { ++ if (SBSDIO_ALPONLY(clkctl)) { ++ AP6210_ERR("%s: HT Clock should be on.\n", __FUNCTION__); ++ } ++ } ++#endif /* defined (DHD_DEBUG) */ ++ ++ bus->activity = TRUE; ++#ifdef DHD_USE_IDLECOUNT ++ bus->idlecount = 0; ++#endif /* DHD_USE_IDLECOUNT */ ++ } else { ++ clkreq = 0; ++ if (bus->clkstate == CLK_PENDING) { ++ /* Cancel CA-only interrupt filter */ ++ devctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); ++ devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, devctl, &err); ++ } ++ ++ bus->clkstate = CLK_SDONLY; ++ if (!SR_ENAB(bus)) { ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, clkreq, &err); ++ AP6210_DEBUG("CLKCTL: turned OFF\n"); ++ if (err) { ++ AP6210_ERR("%s: Failed access turning clock off: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ } ++ } ++ return BCME_OK; ++} ++ ++/* Change idle/active SD state */ ++static int ++dhdsdio_sdclk(dhd_bus_t *bus, bool on) ++{ ++ int err; ++ int32 iovalue; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (on) { ++ if (bus->idleclock == DHD_IDLE_STOP) { ++ /* Turn on clock and restore mode */ ++ iovalue = 1; ++ err = bcmsdh_iovar_op(bus->sdh, "sd_clock", NULL, 0, ++ &iovalue, sizeof(iovalue), TRUE); ++ if (err) { ++ AP6210_ERR("%s: error enabling sd_clock: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ ++ iovalue = bus->sd_mode; ++ err = bcmsdh_iovar_op(bus->sdh, "sd_mode", NULL, 0, ++ &iovalue, sizeof(iovalue), TRUE); ++ if (err) { ++ AP6210_ERR("%s: error changing sd_mode: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ } else if (bus->idleclock != DHD_IDLE_ACTIVE) { ++ /* Restore clock speed */ ++ iovalue = bus->sd_divisor; ++ err = bcmsdh_iovar_op(bus->sdh, "sd_divisor", NULL, 0, ++ &iovalue, sizeof(iovalue), TRUE); ++ if (err) { ++ AP6210_ERR("%s: error restoring sd_divisor: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ } ++ bus->clkstate = CLK_SDONLY; ++ } else { ++ /* Stop or slow the SD clock itself */ ++ if ((bus->sd_divisor == -1) || (bus->sd_mode == -1)) { ++ AP6210_DEBUG("%s: can't idle clock, divisor %d mode %d\n", ++ __FUNCTION__, bus->sd_divisor, bus->sd_mode); ++ return BCME_ERROR; ++ } ++ if (bus->idleclock == DHD_IDLE_STOP) { ++ if (sd1idle) { ++ /* Change to SD1 mode and turn off clock */ ++ iovalue = 1; ++ err = bcmsdh_iovar_op(bus->sdh, "sd_mode", NULL, 0, ++ &iovalue, sizeof(iovalue), TRUE); ++ if (err) { ++ AP6210_ERR("%s: error changing sd_clock: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ } ++ ++ iovalue = 0; ++ err = bcmsdh_iovar_op(bus->sdh, "sd_clock", NULL, 0, ++ &iovalue, sizeof(iovalue), TRUE); ++ if (err) { ++ AP6210_ERR("%s: error disabling sd_clock: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ } else if (bus->idleclock != DHD_IDLE_ACTIVE) { ++ /* Set divisor to idle value */ ++ iovalue = bus->idleclock; ++ err = bcmsdh_iovar_op(bus->sdh, "sd_divisor", NULL, 0, ++ &iovalue, sizeof(iovalue), TRUE); ++ if (err) { ++ AP6210_ERR("%s: error changing sd_divisor: %d\n", ++ __FUNCTION__, err); ++ return BCME_ERROR; ++ } ++ } ++ bus->clkstate = CLK_NONE; ++ } ++ ++ return BCME_OK; ++} ++ ++/* Transition SD and backplane clock readiness */ ++static int ++dhdsdio_clkctl(dhd_bus_t *bus, uint target, bool pendok) ++{ ++ int ret = BCME_OK; ++#ifdef DHD_DEBUG ++ uint oldstate = bus->clkstate; ++#endif /* DHD_DEBUG */ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ /* Early exit if we're already there */ ++ if (bus->clkstate == target) { ++ if (target == CLK_AVAIL) { ++ dhd_os_wd_timer(bus->dhd, dhd_watchdog_ms); ++ bus->activity = TRUE; ++#ifdef DHD_USE_IDLECOUNT ++ bus->idlecount = 0; ++#endif /* DHD_USE_IDLECOUNT */ ++ } ++ return ret; ++ } ++ ++ switch (target) { ++ case CLK_AVAIL: ++ /* Make sure SD clock is available */ ++ if (bus->clkstate == CLK_NONE) ++ dhdsdio_sdclk(bus, TRUE); ++ /* Now request HT Avail on the backplane */ ++ ret = dhdsdio_htclk(bus, TRUE, pendok); ++ if (ret == BCME_OK) { ++ dhd_os_wd_timer(bus->dhd, dhd_watchdog_ms); ++ bus->activity = TRUE; ++#ifdef DHD_USE_IDLECOUNT ++ bus->idlecount = 0; ++#endif /* DHD_USE_IDLECOUNT */ ++ } ++ break; ++ ++ case CLK_SDONLY: ++ /* Remove HT request, or bring up SD clock */ ++ if (bus->clkstate == CLK_NONE) ++ ret = dhdsdio_sdclk(bus, TRUE); ++ else if (bus->clkstate == CLK_AVAIL) ++ ret = dhdsdio_htclk(bus, FALSE, FALSE); ++ else ++ AP6210_DEBUG("dhdsdio_clkctl: request for %d -> %d\n", ++ bus->clkstate, target); ++ if (ret == BCME_OK) { ++ dhd_os_wd_timer(bus->dhd, dhd_watchdog_ms); ++ } ++ break; ++ ++ case CLK_NONE: ++ /* Make sure to remove HT request */ ++ if (bus->clkstate == CLK_AVAIL) ++ ret = dhdsdio_htclk(bus, FALSE, FALSE); ++ /* Now remove the SD clock */ ++ ret = dhdsdio_sdclk(bus, FALSE); ++#ifdef DHD_DEBUG ++ if (dhd_console_ms == 0) ++#endif /* DHD_DEBUG */ ++ if (bus->poll == 0) ++ dhd_os_wd_timer(bus->dhd, 0); ++ break; ++ } ++#ifdef DHD_DEBUG ++ AP6210_DEBUG("dhdsdio_clkctl: %d -> %d\n", oldstate, bus->clkstate); ++#endif /* DHD_DEBUG */ ++ ++ return ret; ++} ++ ++static int ++dhdsdio_bussleep(dhd_bus_t *bus, bool sleep) ++{ ++ int err = 0; ++ bcmsdh_info_t *sdh = bus->sdh; ++ sdpcmd_regs_t *regs = bus->regs; ++ uint retries = 0; ++ ++ AP6210_DEBUG("dhdsdio_bussleep: request %s (currently %s)\n", ++ (sleep ? "SLEEP" : "WAKE"), ++ (bus->sleeping ? "SLEEP" : "WAKE")); ++ ++ /* Done if we're already in the requested state */ ++ if (sleep == bus->sleeping) ++ return BCME_OK; ++ ++ /* Going to sleep: set the alarm and turn off the lights... */ ++ if (sleep) { ++ /* Don't sleep if something is pending */ ++ if (bus->dpc_sched || bus->rxskip || pktq_len(&bus->txq)) ++ return BCME_BUSY; ++ ++ ++ if (!SLPAUTO_ENAB(bus)) { ++ /* Disable SDIO interrupts (no longer interested) */ ++ bcmsdh_intr_disable(bus->sdh); ++ ++ /* Make sure the controller has the bus up */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ /* Tell device to start using OOB wakeup */ ++ W_SDREG(SMB_USE_OOB, ®s->tosbmailbox, retries); ++ if (retries > retry_limit) ++ AP6210_ERR("CANNOT SIGNAL CHIP, WILL NOT WAKE UP!!\n"); ++ ++ /* Turn off our contribution to the HT clock request */ ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, ++ SBSDIO_FORCE_HW_CLKREQ_OFF, NULL); ++ ++ /* Isolate the bus */ ++ if (bus->sih->chip != BCM4329_CHIP_ID && ++ bus->sih->chip != BCM4319_CHIP_ID) { ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, ++ SBSDIO_DEVCTL_PADS_ISO, NULL); ++ } ++ } else { ++ /* Leave interrupts enabled since device can exit sleep and ++ * interrupt host ++ */ ++ err = dhdsdio_clk_devsleep_iovar(bus, TRUE /* sleep */); ++ } ++ ++ /* Change state */ ++ bus->sleeping = TRUE; ++ ++ } else { ++ /* Waking up: bus power up is ok, set local state */ ++ ++ if (!SLPAUTO_ENAB(bus)) { ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, 0, &err); ++ ++ /* Force pad isolation off if possible (in case power never toggled) */ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, 0, NULL); ++ ++ ++ /* Make sure the controller has the bus up */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ /* Send misc interrupt to indicate OOB not needed */ ++ W_SDREG(0, ®s->tosbmailboxdata, retries); ++ if (retries <= retry_limit) ++ W_SDREG(SMB_DEV_INT, ®s->tosbmailbox, retries); ++ ++ if (retries > retry_limit) ++ AP6210_ERR("CANNOT SIGNAL CHIP TO CLEAR OOB!!\n"); ++ ++ /* Make sure we have SD bus access */ ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++ ++ /* Enable interrupts again */ ++ if (bus->intr && (bus->dhd->busstate == DHD_BUS_DATA)) { ++ bus->intdis = FALSE; ++ bcmsdh_intr_enable(bus->sdh); ++ } ++ } else { ++ err = dhdsdio_clk_devsleep_iovar(bus, FALSE /* wake */); ++ } ++ ++ if (err == 0) { ++ /* Change state */ ++ bus->sleeping = FALSE; ++ } ++ } ++ ++ return err; ++} ++ ++#if defined(OOB_INTR_ONLY) ++void ++dhd_enable_oob_intr(struct dhd_bus *bus, bool enable) ++{ ++#if defined(HW_OOB) ++ bcmsdh_enable_hw_oob_intr(bus->sdh, enable); ++#else ++ sdpcmd_regs_t *regs = bus->regs; ++ uint retries = 0; ++ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ if (enable == TRUE) { ++ ++ /* Tell device to start using OOB wakeup */ ++ W_SDREG(SMB_USE_OOB, ®s->tosbmailbox, retries); ++ if (retries > retry_limit) ++ AP6210_ERR("CANNOT SIGNAL CHIP, WILL NOT WAKE UP!!\n"); ++ ++ } else { ++ /* Send misc interrupt to indicate OOB not needed */ ++ W_SDREG(0, ®s->tosbmailboxdata, retries); ++ if (retries <= retry_limit) ++ W_SDREG(SMB_DEV_INT, ®s->tosbmailbox, retries); ++ } ++ ++ /* Turn off our contribution to the HT clock request */ ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++#endif /* !defined(HW_OOB) */ ++} ++#endif ++ ++/* Writes a HW/SW header into the packet and sends it. */ ++/* Assumes: (a) header space already there, (b) caller holds lock */ ++static int ++dhdsdio_txpkt(dhd_bus_t *bus, void *pkt, uint chan, bool free_pkt, bool queue_only) ++{ ++ int ret; ++ osl_t *osh; ++ uint8 *frame; ++ uint16 len, pad1 = 0; ++ uint32 swheader; ++ uint retries = 0; ++ bcmsdh_info_t *sdh; ++ void *new; ++ int i; ++ int pkt_cnt; ++#ifdef BCMSDIOH_TXGLOM ++ uint8 *frame_tmp; ++#endif ++#ifdef WLMEDIA_HTSF ++ char *p; ++ htsfts_t *htsf_ts; ++#endif ++ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ sdh = bus->sdh; ++ osh = bus->dhd->osh; ++ ++ if (bus->dhd->dongle_reset) { ++ ret = BCME_NOTREADY; ++ goto done; ++ } ++ ++ frame = (uint8*)PKTDATA(osh, pkt); ++ ++#ifdef WLMEDIA_HTSF ++ if (PKTLEN(osh, pkt) >= 100) { ++ p = PKTDATA(osh, pkt); ++ htsf_ts = (htsfts_t*) (p + HTSF_HOSTOFFSET + 12); ++ if (htsf_ts->magic == HTSFMAGIC) { ++ htsf_ts->c20 = get_cycles(); ++ htsf_ts->t20 = dhd_get_htsf(bus->dhd->info, 0); ++ } ++ } ++#endif /* WLMEDIA_HTSF */ ++ ++ /* Add alignment padding, allocate new packet if needed */ ++ if (!((uintptr)frame & 1) && (pad1 = ((uintptr)frame % DHD_SDALIGN))) { ++ if (PKTHEADROOM(osh, pkt) < pad1) { ++ AP6210_ERR("%s: insufficient headroom %d for %d pad1\n", ++ __FUNCTION__, (int)PKTHEADROOM(osh, pkt), pad1); ++ bus->dhd->tx_realloc++; ++ new = PKTGET(osh, (PKTLEN(osh, pkt) + DHD_SDALIGN), TRUE); ++ if (!new) { ++ AP6210_ERR("%s: couldn't allocate new %d-byte packet\n", ++ __FUNCTION__, PKTLEN(osh, pkt) + DHD_SDALIGN); ++ ret = BCME_NOMEM; ++ goto done; ++ } ++ ++ PKTALIGN(osh, new, PKTLEN(osh, pkt), DHD_SDALIGN); ++ bcopy(PKTDATA(osh, pkt), PKTDATA(osh, new), PKTLEN(osh, pkt)); ++ if (free_pkt) ++ PKTFREE(osh, pkt, TRUE); ++ /* free the pkt if canned one is not used */ ++ free_pkt = TRUE; ++ pkt = new; ++ frame = (uint8*)PKTDATA(osh, pkt); ++ ASSERT(((uintptr)frame % DHD_SDALIGN) == 0); ++ pad1 = 0; ++ } else { ++ PKTPUSH(osh, pkt, pad1); ++ frame = (uint8*)PKTDATA(osh, pkt); ++ ++ ASSERT((pad1 + SDPCM_HDRLEN) <= (int) PKTLEN(osh, pkt)); ++ bzero(frame, pad1 + SDPCM_HDRLEN); ++ } ++ } ++ ASSERT(pad1 < DHD_SDALIGN); ++ ++ /* Hardware tag: 2 byte len followed by 2 byte ~len check (all LE) */ ++ len = (uint16)PKTLEN(osh, pkt); ++ *(uint16*)frame = htol16(len); ++ *(((uint16*)frame) + 1) = htol16(~len); ++ ++#ifdef BCMSDIOH_TXGLOM ++ if (bus->glom_enable) { ++ uint32 hwheader1 = 0, hwheader2 = 0, act_len = len; ++ ++ /* Software tag: channel, sequence number, data offset */ ++ swheader = ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | ++ ((bus->tx_seq + bus->glom_cnt) % SDPCM_SEQUENCE_WRAP) | ++ (((pad1 + SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); ++ htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN); ++ htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN + sizeof(swheader)); ++ ++ if (queue_only) { ++ if (forcealign && (len & (ALIGNMENT - 1))) ++ len = ROUNDUP(len, ALIGNMENT); ++ /* Hardware extention tag */ ++ /* 2byte frame length, 1byte-, 1byte frame flag, ++ * 2byte-hdrlength, 2byte padlenght ++ */ ++ hwheader1 = (act_len - SDPCM_FRAMETAG_LEN) | (0 << 24); ++ hwheader2 = (len - act_len) << 16; ++ htol32_ua_store(hwheader1, frame + SDPCM_FRAMETAG_LEN); ++ htol32_ua_store(hwheader2, frame + SDPCM_FRAMETAG_LEN + 4); ++ /* Post the frame pointer to sdio glom array */ ++ dhd_bcmsdh_glom_post(bus, frame, len); ++ /* Save the pkt pointer in bus glom array */ ++ bus->glom_pkt_arr[bus->glom_cnt] = pkt; ++ bus->glom_total_len += len; ++ bus->glom_cnt++; ++ return BCME_OK; ++ } else { ++ /* Raise len to next SDIO block to eliminate tail command */ ++ if (bus->roundup && bus->blocksize && ++ ((bus->glom_total_len + len) > bus->blocksize)) { ++ uint16 pad2 = bus->blocksize - ++ ((bus->glom_total_len + len) % bus->blocksize); ++ if ((pad2 <= bus->roundup) && (pad2 < bus->blocksize)) { ++ len += pad2; ++ } else { ++ } ++ } else if ((bus->glom_total_len + len) % DHD_SDALIGN) { ++ len += DHD_SDALIGN ++ - ((bus->glom_total_len + len) % DHD_SDALIGN); ++ } ++ if (forcealign && (len & (ALIGNMENT - 1))) { ++ len = ROUNDUP(len, ALIGNMENT); ++ } ++ ++ /* Hardware extention tag */ ++ /* 2byte frame length, 1byte-, 1byte frame flag, ++ * 2byte-hdrlength, 2byte padlenght ++ */ ++ hwheader1 = (act_len - SDPCM_FRAMETAG_LEN) | (1 << 24); ++ hwheader2 = (len - act_len) << 16; ++ htol32_ua_store(hwheader1, frame + SDPCM_FRAMETAG_LEN); ++ htol32_ua_store(hwheader2, frame + SDPCM_FRAMETAG_LEN + 4); ++ ++ /* Post the frame pointer to sdio glom array */ ++ dhd_bcmsdh_glom_post(bus, frame, len); ++ /* Save the pkt pointer in bus glom array */ ++ bus->glom_pkt_arr[bus->glom_cnt] = pkt; ++ bus->glom_cnt++; ++ bus->glom_total_len += len; ++ ++ /* Update the total length on the first pkt */ ++ frame_tmp = (uint8*)PKTDATA(osh, bus->glom_pkt_arr[0]); ++ *(uint16*)frame_tmp = htol16(bus->glom_total_len); ++ *(((uint16*)frame_tmp) + 1) = htol16(~bus->glom_total_len); ++ } ++ } else ++#endif /* BCMSDIOH_TXGLOM */ ++ { ++ /* Software tag: channel, sequence number, data offset */ ++ swheader = ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq | ++ (((pad1 + SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); ++ htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN); ++ htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader)); ++ ++#ifdef DHD_DEBUG ++ if (PKTPRIO(pkt) < ARRAYSIZE(tx_packets)) { ++ tx_packets[PKTPRIO(pkt)]++; ++ } ++ if (DHD_BYTES_ON() && ++ (((DHD_CTL_ON() && (chan == SDPCM_CONTROL_CHANNEL)) || ++ (DHD_DATA_ON() && (chan != SDPCM_CONTROL_CHANNEL))))) { ++ prhex("Tx Frame", frame, len); ++ } else if (DHD_HDRS_ON()) { ++ prhex("TxHdr", frame, MIN(len, 16)); ++ } ++#endif ++ ++ /* Raise len to next SDIO block to eliminate tail command */ ++ if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { ++ uint16 pad2 = bus->blocksize - (len % bus->blocksize); ++ if ((pad2 <= bus->roundup) && (pad2 < bus->blocksize)) ++#ifdef NOTUSED ++ if (pad2 <= PKTTAILROOM(osh, pkt)) ++#endif /* NOTUSED */ ++ len += pad2; ++ } else if (len % DHD_SDALIGN) { ++ len += DHD_SDALIGN - (len % DHD_SDALIGN); ++ } ++ ++ /* Some controllers have trouble with odd bytes -- round to even */ ++ if (forcealign && (len & (ALIGNMENT - 1))) { ++#ifdef NOTUSED ++ if (PKTTAILROOM(osh, pkt)) ++#endif ++ len = ROUNDUP(len, ALIGNMENT); ++#ifdef NOTUSED ++ else ++ AP6210_DEBUG("%s: sending unrounded %d-byte packet\n", __FUNCTION__, len); ++#endif ++ } ++ } ++ ++ do { ++ ret = dhd_bcmsdh_send_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, ++ frame, len, pkt, NULL, NULL); ++ bus->f2txdata++; ++ ASSERT(ret != BCME_PENDING); ++ ++ if (ret == BCME_NODEVICE) { ++ AP6210_ERR("%s: Device asleep already\n", __FUNCTION__); ++ } else if (ret < 0) { ++ /* On failure, abort the command and terminate the frame */ ++ AP6210_ERR("%s: sdio error %d, abort command and terminate frame.\n", ++ __FUNCTION__, ret); ++ bus->tx_sderrs++; ++ ++ bcmsdh_abort(sdh, SDIO_FUNC_2); ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_FRAMECTRL, ++ SFC_WF_TERM, NULL); ++ bus->f1regdata++; ++ ++ for (i = 0; i < 3; i++) { ++ uint8 hi, lo; ++ hi = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_WFRAMEBCHI, NULL); ++ lo = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_WFRAMEBCLO, NULL); ++ bus->f1regdata += 2; ++ if ((hi == 0) && (lo == 0)) ++ break; ++ } ++ } ++ if (ret == 0) { ++#ifdef BCMSDIOH_TXGLOM ++ if (bus->glom_enable) { ++ bus->tx_seq = (bus->tx_seq + bus->glom_cnt) % SDPCM_SEQUENCE_WRAP; ++ } else ++#endif ++ { ++ bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; ++ } ++ } ++ } while ((ret < 0) && retrydata && retries++ < TXRETRIES); ++ ++done: ++ ++#ifdef BCMSDIOH_TXGLOM ++ if (bus->glom_enable) { ++ dhd_bcmsdh_glom_clear(bus); ++ pkt_cnt = bus->glom_cnt; ++ } else ++#endif ++ { ++ pkt_cnt = 1; ++ } ++ /* restore pkt buffer pointer before calling tx complete routine */ ++ while (pkt_cnt) { ++#ifdef BCMSDIOH_TXGLOM ++ uint32 doff; ++ if (bus->glom_enable) { ++ pkt = bus->glom_pkt_arr[bus->glom_cnt - pkt_cnt]; ++ frame = (uint8*)PKTDATA(osh, pkt); ++ doff = ltoh32_ua(frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN); ++ doff = (doff & SDPCM_DOFFSET_MASK) >> SDPCM_DOFFSET_SHIFT; ++ PKTPULL(osh, pkt, doff); ++ } else ++#endif ++ { ++ PKTPULL(osh, pkt, SDPCM_HDRLEN + pad1); ++ } ++#ifdef PROP_TXSTATUS ++ if (bus->dhd->wlfc_state) { ++ dhd_os_sdunlock(bus->dhd); ++ dhd_wlfc_txcomplete(bus->dhd, pkt, ret == 0, FALSE); ++ dhd_os_sdlock(bus->dhd); ++ } else { ++#endif /* PROP_TXSTATUS */ ++#ifdef SDTEST ++ if (chan != SDPCM_TEST_CHANNEL) { ++ dhd_txcomplete(bus->dhd, pkt, ret != 0); ++ } ++#else /* SDTEST */ ++ dhd_txcomplete(bus->dhd, pkt, ret != 0); ++#endif /* SDTEST */ ++ if (free_pkt) ++ PKTFREE(osh, pkt, TRUE); ++ ++#ifdef PROP_TXSTATUS ++ } ++#endif ++ pkt_cnt--; ++ } ++ ++#ifdef BCMSDIOH_TXGLOM ++ /* Reset the glom array */ ++ if (bus->glom_enable) { ++ bus->glom_cnt = 0; ++ bus->glom_total_len = 0; ++ } ++#endif ++ return ret; ++} ++ ++int ++dhd_bus_txdata(struct dhd_bus *bus, void *pkt, bool wlfc_locked) ++{ ++ int ret = BCME_ERROR; ++ osl_t *osh; ++ uint datalen, prec; ++#ifdef DHD_TX_DUMP ++ uint8 *dump_data; ++ uint16 protocol; ++#ifdef DHD_TX_FULL_DUMP ++ int i; ++#endif /* DHD_TX_FULL_DUMP */ ++#endif /* DHD_TX_DUMP */ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ osh = bus->dhd->osh; ++ datalen = PKTLEN(osh, pkt); ++ ++#ifdef SDTEST ++ /* Push the test header if doing loopback */ ++ if (bus->ext_loop) { ++ uint8* data; ++ PKTPUSH(osh, pkt, SDPCM_TEST_HDRLEN); ++ data = PKTDATA(osh, pkt); ++ *data++ = SDPCM_TEST_ECHOREQ; ++ *data++ = (uint8)bus->loopid++; ++ *data++ = (datalen >> 0); ++ *data++ = (datalen >> 8); ++ datalen += SDPCM_TEST_HDRLEN; ++ } ++#endif /* SDTEST */ ++ ++#ifdef DHD_TX_DUMP ++ dump_data = PKTDATA(osh, pkt); ++ dump_data += 4; /* skip 4 bytes header */ ++ protocol = (dump_data[12] << 8) | dump_data[13]; ++#ifdef DHD_TX_FULL_DUMP ++ AP6210_DEBUG("TX DUMP\n"); ++ ++ for (i = 0; i < (datalen - 4); i++) { ++ DHD_CONT("%02X ", dump_data[i]); ++ if ((i & 15) == 15) ++ DHD_CONT("\n"); ++ } ++ AP6210_DEBUG("\n"); ++ ++#endif /* DHD_TX_FULL_DUMP */ ++ if (protocol == ETHER_TYPE_802_1X) { ++ AP6210_DEBUG("ETHER_TYPE_802_1X: ver %d, type %d, replay %d\n", ++ dump_data[14], dump_data[15], dump_data[30]); ++ } ++#endif /* DHD_TX_DUMP */ ++ ++ /* Add space for the header */ ++ PKTPUSH(osh, pkt, SDPCM_HDRLEN); ++ ASSERT(ISALIGNED((uintptr)PKTDATA(osh, pkt), 2)); ++ ++ prec = PRIO2PREC((PKTPRIO(pkt) & PRIOMASK)); ++#ifndef DHDTHREAD ++ /* Lock: we're about to use shared data/code (and SDIO) */ ++ dhd_os_sdlock(bus->dhd); ++#endif /* DHDTHREAD */ ++ ++ /* Check for existing queue, current flow-control, pending event, or pending clock */ ++ if (dhd_deferred_tx || bus->fcstate || pktq_len(&bus->txq) || bus->dpc_sched || ++ (!DATAOK(bus)) || (bus->flowcontrol & NBITVAL(prec)) || ++ (bus->clkstate != CLK_AVAIL)) { ++ AP6210_DEBUG("%s: deferring pktq len %d\n", __FUNCTION__, ++ pktq_len(&bus->txq)); ++ bus->fcqueued++; ++ ++ /* Priority based enq */ ++ dhd_os_sdlock_txq(bus->dhd); ++ if (dhd_prec_enq(bus->dhd, &bus->txq, pkt, prec) == FALSE) { ++ PKTPULL(osh, pkt, SDPCM_HDRLEN); ++#ifndef DHDTHREAD ++ /* Need to also release txqlock before releasing sdlock. ++ * This thread still has txqlock and releases sdlock. ++ * Deadlock happens when dpc() grabs sdlock first then ++ * attempts to grab txqlock. ++ */ ++ dhd_os_sdunlock_txq(bus->dhd); ++ dhd_os_sdunlock(bus->dhd); ++#endif ++#ifdef PROP_TXSTATUS ++ if (bus->dhd->wlfc_state) ++ dhd_wlfc_txcomplete(bus->dhd, pkt, FALSE, wlfc_locked); ++ else ++#endif ++ dhd_txcomplete(bus->dhd, pkt, FALSE); ++#ifndef DHDTHREAD ++ dhd_os_sdlock(bus->dhd); ++ dhd_os_sdlock_txq(bus->dhd); ++#endif ++#ifdef PROP_TXSTATUS ++ /* let the caller decide whether to free the packet */ ++ if (!bus->dhd->wlfc_state) ++#endif ++ PKTFREE(osh, pkt, TRUE); ++ ret = BCME_NORESOURCE; ++ } ++ else ++ ret = BCME_OK; ++ dhd_os_sdunlock_txq(bus->dhd); ++ ++ if ((pktq_len(&bus->txq) >= FCHI) && dhd_doflow) ++ dhd_txflowcontrol(bus->dhd, ALL_INTERFACES, ON); ++ ++#ifdef DHD_DEBUG ++ if (pktq_plen(&bus->txq, prec) > qcount[prec]) ++ qcount[prec] = pktq_plen(&bus->txq, prec); ++#endif ++ /* Schedule DPC if needed to send queued packet(s) */ ++ if (dhd_deferred_tx && !bus->dpc_sched) { ++ bus->dpc_sched = TRUE; ++ dhd_sched_dpc(bus->dhd); ++ } ++ } else { ++#ifdef DHDTHREAD ++ /* Lock: we're about to use shared data/code (and SDIO) */ ++ dhd_os_sdlock(bus->dhd); ++#endif /* DHDTHREAD */ ++ ++ /* Otherwise, send it now */ ++ BUS_WAKE(bus); ++ /* Make sure back plane ht clk is on, no pending allowed */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, TRUE); ++#ifndef SDTEST ++ ret = dhdsdio_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, TRUE, FALSE); ++#else ++ ret = dhdsdio_txpkt(bus, pkt, ++ (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), TRUE, FALSE); ++#endif ++ if (ret) ++ bus->dhd->tx_errors++; ++ else ++ bus->dhd->dstats.tx_bytes += datalen; ++ ++ if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { ++ bus->activity = FALSE; ++ dhdsdio_clkctl(bus, CLK_NONE, TRUE); ++ } ++ ++#ifdef DHDTHREAD ++ dhd_os_sdunlock(bus->dhd); ++#endif /* DHDTHREAD */ ++ } ++ ++#ifndef DHDTHREAD ++ dhd_os_sdunlock(bus->dhd); ++#endif /* DHDTHREAD */ ++ ++ return ret; ++} ++ ++static uint ++dhdsdio_sendfromq(dhd_bus_t *bus, uint maxframes) ++{ ++ void *pkt; ++ uint32 intstatus = 0; ++ uint retries = 0; ++ int ret = 0, prec_out; ++ uint cnt = 0; ++ uint datalen; ++ uint8 tx_prec_map; ++#ifdef BCMSDIOH_TXGLOM ++ uint i; ++ uint8 glom_cnt; ++#endif ++ ++ dhd_pub_t *dhd = bus->dhd; ++ sdpcmd_regs_t *regs = bus->regs; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (!KSO_ENAB(bus)) { ++ AP6210_DEBUG("%s: Device asleep\n", __FUNCTION__); ++ return BCME_NODEVICE; ++ } ++ ++ tx_prec_map = ~bus->flowcontrol; ++ ++ /* Send frames until the limit or some other event */ ++ for (cnt = 0; (cnt < maxframes) && DATAOK(bus); cnt++) { ++#ifdef BCMSDIOH_TXGLOM ++ if (bus->glom_enable) { ++ glom_cnt = MIN(DATABUFCNT(bus), bus->glomsize); ++ glom_cnt = MIN(glom_cnt, pktq_mlen(&bus->txq, tx_prec_map)); ++ glom_cnt = MIN(glom_cnt, maxframes-cnt); ++ ++ /* Limiting the size to 2pkts in case of copy */ ++ if (bus->glom_mode == SDPCM_TXGLOM_CPY) ++ glom_cnt = MIN(glom_cnt, 5); ++ ++ if (glom_cnt == 0) ++ break; ++ datalen = 0; ++ for (i = 0; i < glom_cnt; i++) { ++ dhd_os_sdlock_txq(bus->dhd); ++ if ((pkt = pktq_mdeq(&bus->txq, tx_prec_map, &prec_out)) == NULL) { ++ /* This case should not happen */ ++ AP6210_DEBUG("No pkts in the queue for glomming\n"); ++ dhd_os_sdunlock_txq(bus->dhd); ++ break; ++ } ++ dhd_os_sdunlock_txq(bus->dhd); ++ ++ datalen += (PKTLEN(bus->dhd->osh, pkt) - SDPCM_HDRLEN); ++#ifndef SDTEST ++ ret = dhdsdio_txpkt(bus, ++ pkt, ++ SDPCM_DATA_CHANNEL, ++ TRUE, ++ (i == (glom_cnt-1))? FALSE: TRUE); ++#else ++ ret = dhdsdio_txpkt(bus, ++ pkt, ++ (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), ++ TRUE, ++ (i == (glom_cnt-1))? FALSE: TRUE); ++#endif ++ } ++ cnt += i-1; ++ } else ++#endif /* BCMSDIOH_TXGLOM */ ++ { ++ dhd_os_sdlock_txq(bus->dhd); ++ if ((pkt = pktq_mdeq(&bus->txq, tx_prec_map, &prec_out)) == NULL) { ++ dhd_os_sdunlock_txq(bus->dhd); ++ break; ++ } ++ dhd_os_sdunlock_txq(bus->dhd); ++ datalen = PKTLEN(bus->dhd->osh, pkt) - SDPCM_HDRLEN; ++ ++#ifndef SDTEST ++ ret = dhdsdio_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, TRUE, FALSE); ++#else ++ ret = dhdsdio_txpkt(bus, ++ pkt, ++ (bus->ext_loop ? SDPCM_TEST_CHANNEL : SDPCM_DATA_CHANNEL), ++ TRUE, ++ FALSE); ++#endif ++ } ++ ++ if (ret) ++ bus->dhd->tx_errors++; ++ else ++ bus->dhd->dstats.tx_bytes += datalen; ++ ++ /* In poll mode, need to check for other events */ ++ if (!bus->intr && cnt) ++ { ++ /* Check device status, signal pending interrupt */ ++ R_SDREG(intstatus, ®s->intstatus, retries); ++ bus->f2txdata++; ++ if (bcmsdh_regfail(bus->sdh)) ++ break; ++ if (intstatus & bus->hostintmask) ++ bus->ipend = TRUE; ++ } ++ } ++ ++ /* Deflow-control stack if needed */ ++ if (dhd_doflow && dhd->up && (dhd->busstate == DHD_BUS_DATA) && ++ dhd->txoff && (pktq_len(&bus->txq) < FCLOW)) ++ dhd_txflowcontrol(dhd, ALL_INTERFACES, OFF); ++ ++ return cnt; ++} ++ ++int ++dhd_bus_txctl(struct dhd_bus *bus, uchar *msg, uint msglen) ++{ ++ uint8 *frame; ++ uint16 len; ++ uint32 swheader; ++ uint retries = 0; ++ bcmsdh_info_t *sdh = bus->sdh; ++ uint8 doff = 0; ++ int ret = -1; ++ int i; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus->dhd->dongle_reset) ++ return -EIO; ++ ++ /* Back the pointer to make a room for bus header */ ++ frame = msg - SDPCM_HDRLEN; ++ len = (msglen += SDPCM_HDRLEN); ++ ++ /* Add alignment padding (optional for ctl frames) */ ++ if (dhd_alignctl) { ++ if ((doff = ((uintptr)frame % DHD_SDALIGN))) { ++ frame -= doff; ++ len += doff; ++ msglen += doff; ++ bzero(frame, doff + SDPCM_HDRLEN); ++ } ++ ASSERT(doff < DHD_SDALIGN); ++ } ++ doff += SDPCM_HDRLEN; ++ ++ /* Round send length to next SDIO block */ ++ if (bus->roundup && bus->blocksize && (len > bus->blocksize)) { ++ uint16 pad = bus->blocksize - (len % bus->blocksize); ++ if ((pad <= bus->roundup) && (pad < bus->blocksize)) ++ len += pad; ++ } else if (len % DHD_SDALIGN) { ++ len += DHD_SDALIGN - (len % DHD_SDALIGN); ++ } ++ ++ /* Satisfy length-alignment requirements */ ++ if (forcealign && (len & (ALIGNMENT - 1))) ++ len = ROUNDUP(len, ALIGNMENT); ++ ++ ASSERT(ISALIGNED((uintptr)frame, 2)); ++ ++ ++ /* Need to lock here to protect txseq and SDIO tx calls */ ++ dhd_os_sdlock(bus->dhd); ++ ++ BUS_WAKE(bus); ++ ++ /* Make sure backplane clock is on */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ /* Hardware tag: 2 byte len followed by 2 byte ~len check (all LE) */ ++ *(uint16*)frame = htol16((uint16)msglen); ++ *(((uint16*)frame) + 1) = htol16(~msglen); ++ ++#ifdef BCMSDIOH_TXGLOM ++ if (bus->glom_enable) { ++ uint32 hwheader1, hwheader2; ++ /* Software tag: channel, sequence number, data offset */ ++ swheader = ((SDPCM_CONTROL_CHANNEL << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) ++ | bus->tx_seq ++ | ((doff << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); ++ htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN + SDPCM_HWEXT_LEN); ++ htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN ++ + SDPCM_HWEXT_LEN + sizeof(swheader)); ++ ++ hwheader1 = (msglen - SDPCM_FRAMETAG_LEN) | (1 << 24); ++ hwheader2 = (len - (msglen)) << 16; ++ htol32_ua_store(hwheader1, frame + SDPCM_FRAMETAG_LEN); ++ htol32_ua_store(hwheader2, frame + SDPCM_FRAMETAG_LEN + 4); ++ ++ *(uint16*)frame = htol16(len); ++ *(((uint16*)frame) + 1) = htol16(~(len)); ++ } else ++#endif /* BCMSDIOH_TXGLOM */ ++ { ++ /* Software tag: channel, sequence number, data offset */ ++ swheader = ((SDPCM_CONTROL_CHANNEL << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) ++ | bus->tx_seq | ((doff << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK); ++ htol32_ua_store(swheader, frame + SDPCM_FRAMETAG_LEN); ++ htol32_ua_store(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader)); ++ } ++ if (!TXCTLOK(bus)) { ++ AP6210_DEBUG("%s: No bus credit bus->tx_max %d, bus->tx_seq %d\n", ++ __FUNCTION__, bus->tx_max, bus->tx_seq); ++ bus->ctrl_frame_stat = TRUE; ++ /* Send from dpc */ ++ bus->ctrl_frame_buf = frame; ++ bus->ctrl_frame_len = len; ++ ++ if (!bus->dpc_sched) { ++ bus->dpc_sched = TRUE; ++ dhd_sched_dpc(bus->dhd); ++ } ++ if (bus->ctrl_frame_stat) { ++ dhd_wait_for_event(bus->dhd, &bus->ctrl_frame_stat); ++ } ++ ++ if (bus->ctrl_frame_stat == FALSE) { ++ AP6210_DEBUG("%s: ctrl_frame_stat == FALSE\n", __FUNCTION__); ++ ret = 0; ++ } else { ++ bus->dhd->txcnt_timeout++; ++ if (!bus->dhd->hang_was_sent) { ++ AP6210_DEBUG("%s: ctrl_frame_stat == TRUE txcnt_timeout=%d\n", ++ __FUNCTION__, bus->dhd->txcnt_timeout); ++ } ++ ret = -1; ++ bus->ctrl_frame_stat = FALSE; ++ goto done; ++ } ++ } ++ ++ bus->dhd->txcnt_timeout = 0; ++ ++ if (ret == -1) { ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() && DHD_CTL_ON()) { ++ prhex("Tx Frame", frame, len); ++ } else if (DHD_HDRS_ON()) { ++ prhex("TxHdr", frame, MIN(len, 16)); ++ } ++#endif ++ ++ do { ++ ret = dhd_bcmsdh_send_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, ++ frame, len, NULL, NULL, NULL); ++ ASSERT(ret != BCME_PENDING); ++ ++ if (ret == BCME_NODEVICE) { ++ AP6210_DEBUG("%s: Device asleep already\n", __FUNCTION__); ++ } else if (ret < 0) { ++ /* On failure, abort the command and terminate the frame */ ++ AP6210_DEBUG("%s: sdio error %d, abort command and terminate frame.\n", ++ __FUNCTION__, ret); ++ bus->tx_sderrs++; ++ ++ bcmsdh_abort(sdh, SDIO_FUNC_2); ++ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_FRAMECTRL, ++ SFC_WF_TERM, NULL); ++ bus->f1regdata++; ++ ++ for (i = 0; i < 3; i++) { ++ uint8 hi, lo; ++ hi = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_WFRAMEBCHI, NULL); ++ lo = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_WFRAMEBCLO, NULL); ++ bus->f1regdata += 2; ++ if ((hi == 0) && (lo == 0)) ++ break; ++ } ++ } ++ if (ret == 0) { ++ bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; ++ } ++ } while ((ret < 0) && retries++ < TXRETRIES); ++ } ++ ++done: ++ if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { ++ bus->activity = FALSE; ++ dhdsdio_clkctl(bus, CLK_NONE, TRUE); ++ } ++ ++ dhd_os_sdunlock(bus->dhd); ++ ++ if (ret) ++ bus->dhd->tx_ctlerrs++; ++ else ++ bus->dhd->tx_ctlpkts++; ++ ++ if (bus->dhd->txcnt_timeout >= MAX_CNTL_TIMEOUT) ++ return -ETIMEDOUT; ++ ++ return ret ? -EIO : 0; ++} ++ ++int ++dhd_bus_rxctl(struct dhd_bus *bus, uchar *msg, uint msglen) ++{ ++ int timeleft; ++ uint rxlen = 0; ++ bool pending; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus->dhd->dongle_reset) ++ return -EIO; ++ ++ /* Wait until control frame is available */ ++ timeleft = dhd_os_ioctl_resp_wait(bus->dhd, &bus->rxlen, &pending); ++ ++ dhd_os_sdlock(bus->dhd); ++ rxlen = bus->rxlen; ++ bcopy(bus->rxctl, msg, MIN(msglen, rxlen)); ++ bus->rxlen = 0; ++ dhd_os_sdunlock(bus->dhd); ++ ++ if (rxlen) { ++ AP6210_DEBUG("%s: resumed on rxctl frame, got %d expected %d\n", ++ __FUNCTION__, rxlen, msglen); ++ } else if (timeleft == 0) { ++#ifdef DHD_DEBUG ++ uint32 status, retry = 0; ++ R_SDREG(status, &bus->regs->intstatus, retry); ++ AP6210_DEBUG("%s: resumed on timeout, INT status=0x%08X\n", ++ __FUNCTION__, status); ++#else ++ AP6210_DEBUG("%s: resumed on timeout\n", __FUNCTION__); ++#endif /* DHD_DEBUG */ ++#ifdef DHD_DEBUG ++ dhd_os_sdlock(bus->dhd); ++ dhdsdio_checkdied(bus, NULL, 0); ++ dhd_os_sdunlock(bus->dhd); ++#endif /* DHD_DEBUG */ ++ } else if (pending == TRUE) { ++ /* signal pending */ ++ AP6210_DEBUG("%s: signal pending\n", __FUNCTION__); ++ return -EINTR; ++ } else { ++ AP6210_DEBUG("%s: resumed for unknown reason?\n", __FUNCTION__); ++#ifdef DHD_DEBUG ++ dhd_os_sdlock(bus->dhd); ++ dhdsdio_checkdied(bus, NULL, 0); ++ dhd_os_sdunlock(bus->dhd); ++#endif /* DHD_DEBUG */ ++ } ++ if (timeleft == 0) { ++ bus->dhd->rxcnt_timeout++; ++ AP6210_DEBUG("%s: rxcnt_timeout=%d\n", __FUNCTION__, bus->dhd->rxcnt_timeout); ++ } ++ else ++ bus->dhd->rxcnt_timeout = 0; ++ ++ if (rxlen) ++ bus->dhd->rx_ctlpkts++; ++ else ++ bus->dhd->rx_ctlerrs++; ++ ++ if (bus->dhd->rxcnt_timeout >= MAX_CNTL_TIMEOUT) ++ return -ETIMEDOUT; ++ ++ if (bus->dhd->dongle_trap_occured) ++ return -EREMOTEIO; ++ ++ return rxlen ? (int)rxlen : -EIO; ++} ++ ++/* IOVar table */ ++enum { ++ IOV_INTR = 1, ++ IOV_POLLRATE, ++ IOV_SDREG, ++ IOV_SBREG, ++ IOV_SDCIS, ++ IOV_MEMBYTES, ++ IOV_MEMSIZE, ++#ifdef DHD_DEBUG ++ IOV_CHECKDIED, ++ IOV_SERIALCONS, ++#endif /* DHD_DEBUG */ ++ IOV_SET_DOWNLOAD_STATE, ++ IOV_SOCRAM_STATE, ++ IOV_FORCEEVEN, ++ IOV_SDIOD_DRIVE, ++ IOV_READAHEAD, ++ IOV_SDRXCHAIN, ++ IOV_ALIGNCTL, ++ IOV_SDALIGN, ++ IOV_DEVRESET, ++ IOV_CPU, ++#if defined(SDIO_CRC_ERROR_FIX) ++ IOV_WATERMARK, ++ IOV_MESBUSYCTRL, ++#endif /* SDIO_CRC_ERROR_FIX */ ++#ifdef SDTEST ++ IOV_PKTGEN, ++ IOV_EXTLOOP, ++#endif /* SDTEST */ ++ IOV_SPROM, ++ IOV_TXBOUND, ++ IOV_RXBOUND, ++ IOV_TXMINMAX, ++ IOV_IDLETIME, ++ IOV_IDLECLOCK, ++ IOV_SD1IDLE, ++ IOV_SLEEP, ++ IOV_DONGLEISOLATION, ++ IOV_KSO, ++ IOV_DEVSLEEP, ++ IOV_DEVCAP, ++ IOV_VARS, ++#ifdef SOFTAP ++ IOV_FWPATH, ++#endif ++ IOV_TXGLOMSIZE, ++ IOV_TXGLOMMODE ++}; ++ ++const bcm_iovar_t dhdsdio_iovars[] = { ++ {"intr", IOV_INTR, 0, IOVT_BOOL, 0 }, ++ {"sleep", IOV_SLEEP, 0, IOVT_BOOL, 0 }, ++ {"pollrate", IOV_POLLRATE, 0, IOVT_UINT32, 0 }, ++ {"idletime", IOV_IDLETIME, 0, IOVT_INT32, 0 }, ++ {"idleclock", IOV_IDLECLOCK, 0, IOVT_INT32, 0 }, ++ {"sd1idle", IOV_SD1IDLE, 0, IOVT_BOOL, 0 }, ++ {"membytes", IOV_MEMBYTES, 0, IOVT_BUFFER, 2 * sizeof(int) }, ++ {"memsize", IOV_MEMSIZE, 0, IOVT_UINT32, 0 }, ++ {"dwnldstate", IOV_SET_DOWNLOAD_STATE, 0, IOVT_BOOL, 0 }, ++ {"socram_state", IOV_SOCRAM_STATE, 0, IOVT_BOOL, 0 }, ++ {"vars", IOV_VARS, 0, IOVT_BUFFER, 0 }, ++ {"sdiod_drive", IOV_SDIOD_DRIVE, 0, IOVT_UINT32, 0 }, ++ {"readahead", IOV_READAHEAD, 0, IOVT_BOOL, 0 }, ++ {"sdrxchain", IOV_SDRXCHAIN, 0, IOVT_BOOL, 0 }, ++ {"alignctl", IOV_ALIGNCTL, 0, IOVT_BOOL, 0 }, ++ {"sdalign", IOV_SDALIGN, 0, IOVT_BOOL, 0 }, ++ {"devreset", IOV_DEVRESET, 0, IOVT_BOOL, 0 }, ++#ifdef DHD_DEBUG ++ {"sdreg", IOV_SDREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, ++ {"sbreg", IOV_SBREG, 0, IOVT_BUFFER, sizeof(sdreg_t) }, ++ {"sd_cis", IOV_SDCIS, 0, IOVT_BUFFER, DHD_IOCTL_MAXLEN }, ++ {"forcealign", IOV_FORCEEVEN, 0, IOVT_BOOL, 0 }, ++ {"txbound", IOV_TXBOUND, 0, IOVT_UINT32, 0 }, ++ {"rxbound", IOV_RXBOUND, 0, IOVT_UINT32, 0 }, ++ {"txminmax", IOV_TXMINMAX, 0, IOVT_UINT32, 0 }, ++ {"cpu", IOV_CPU, 0, IOVT_BOOL, 0 }, ++#ifdef DHD_DEBUG ++ {"checkdied", IOV_CHECKDIED, 0, IOVT_BUFFER, 0 }, ++ {"serial", IOV_SERIALCONS, 0, IOVT_UINT32, 0 }, ++#endif /* DHD_DEBUG */ ++#endif /* DHD_DEBUG */ ++#ifdef SDTEST ++ {"extloop", IOV_EXTLOOP, 0, IOVT_BOOL, 0 }, ++ {"pktgen", IOV_PKTGEN, 0, IOVT_BUFFER, sizeof(dhd_pktgen_t) }, ++#endif /* SDTEST */ ++#if defined(SDIO_CRC_ERROR_FIX) ++ {"watermark", IOV_WATERMARK, 0, IOVT_UINT32, 0 }, ++ {"mesbusyctrl", IOV_MESBUSYCTRL, 0, IOVT_UINT32, 0 }, ++#endif /* SDIO_CRC_ERROR_FIX */ ++ {"devcap", IOV_DEVCAP, 0, IOVT_UINT32, 0 }, ++ {"dngl_isolation", IOV_DONGLEISOLATION, 0, IOVT_UINT32, 0 }, ++ {"kso", IOV_KSO, 0, IOVT_UINT32, 0 }, ++ {"devsleep", IOV_DEVSLEEP, 0, IOVT_UINT32, 0 }, ++#ifdef SOFTAP ++ {"fwpath", IOV_FWPATH, 0, IOVT_BUFFER, 0 }, ++#endif ++ {"txglomsize", IOV_TXGLOMSIZE, 0, IOVT_UINT32, 0 }, ++ {"txglommode", IOV_TXGLOMMODE, 0, IOVT_UINT32, 0 }, ++ {NULL, 0, 0, 0, 0 } ++}; ++ ++static void ++dhd_dump_pct(struct bcmstrbuf *strbuf, char *desc, uint num, uint div) ++{ ++ uint q1, q2; ++ ++ if (!div) { ++ bcm_bprintf(strbuf, "%s N/A", desc); ++ } else { ++ q1 = num / div; ++ q2 = (100 * (num - (q1 * div))) / div; ++ bcm_bprintf(strbuf, "%s %d.%02d", desc, q1, q2); ++ } ++} ++ ++void ++dhd_bus_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ ++ bcm_bprintf(strbuf, "Bus SDIO structure:\n"); ++ bcm_bprintf(strbuf, "hostintmask 0x%08x intstatus 0x%08x sdpcm_ver %d\n", ++ bus->hostintmask, bus->intstatus, bus->sdpcm_ver); ++ bcm_bprintf(strbuf, "fcstate %d qlen %d tx_seq %d, max %d, rxskip %d rxlen %d rx_seq %d\n", ++ bus->fcstate, pktq_len(&bus->txq), bus->tx_seq, bus->tx_max, bus->rxskip, ++ bus->rxlen, bus->rx_seq); ++ bcm_bprintf(strbuf, "intr %d intrcount %d lastintrs %d spurious %d\n", ++ bus->intr, bus->intrcount, bus->lastintrs, bus->spurious); ++ bcm_bprintf(strbuf, "pollrate %d pollcnt %d regfails %d\n", ++ bus->pollrate, bus->pollcnt, bus->regfails); ++ ++ bcm_bprintf(strbuf, "\nAdditional counters:\n"); ++ bcm_bprintf(strbuf, "tx_sderrs %d fcqueued %d rxrtx %d rx_toolong %d rxc_errors %d\n", ++ bus->tx_sderrs, bus->fcqueued, bus->rxrtx, bus->rx_toolong, ++ bus->rxc_errors); ++ bcm_bprintf(strbuf, "rx_hdrfail %d badhdr %d badseq %d\n", ++ bus->rx_hdrfail, bus->rx_badhdr, bus->rx_badseq); ++ bcm_bprintf(strbuf, "fc_rcvd %d, fc_xoff %d, fc_xon %d\n", ++ bus->fc_rcvd, bus->fc_xoff, bus->fc_xon); ++ bcm_bprintf(strbuf, "rxglomfail %d, rxglomframes %d, rxglompkts %d\n", ++ bus->rxglomfail, bus->rxglomframes, bus->rxglompkts); ++ bcm_bprintf(strbuf, "f2rx (hdrs/data) %d (%d/%d), f2tx %d f1regs %d\n", ++ (bus->f2rxhdrs + bus->f2rxdata), bus->f2rxhdrs, bus->f2rxdata, ++ bus->f2txdata, bus->f1regdata); ++ { ++ dhd_dump_pct(strbuf, "\nRx: pkts/f2rd", bus->dhd->rx_packets, ++ (bus->f2rxhdrs + bus->f2rxdata)); ++ dhd_dump_pct(strbuf, ", pkts/f1sd", bus->dhd->rx_packets, bus->f1regdata); ++ dhd_dump_pct(strbuf, ", pkts/sd", bus->dhd->rx_packets, ++ (bus->f2rxhdrs + bus->f2rxdata + bus->f1regdata)); ++ dhd_dump_pct(strbuf, ", pkts/int", bus->dhd->rx_packets, bus->intrcount); ++ bcm_bprintf(strbuf, "\n"); ++ ++ dhd_dump_pct(strbuf, "Rx: glom pct", (100 * bus->rxglompkts), ++ bus->dhd->rx_packets); ++ dhd_dump_pct(strbuf, ", pkts/glom", bus->rxglompkts, bus->rxglomframes); ++ bcm_bprintf(strbuf, "\n"); ++ ++ dhd_dump_pct(strbuf, "Tx: pkts/f2wr", bus->dhd->tx_packets, bus->f2txdata); ++ dhd_dump_pct(strbuf, ", pkts/f1sd", bus->dhd->tx_packets, bus->f1regdata); ++ dhd_dump_pct(strbuf, ", pkts/sd", bus->dhd->tx_packets, ++ (bus->f2txdata + bus->f1regdata)); ++ dhd_dump_pct(strbuf, ", pkts/int", bus->dhd->tx_packets, bus->intrcount); ++ bcm_bprintf(strbuf, "\n"); ++ ++ dhd_dump_pct(strbuf, "Total: pkts/f2rw", ++ (bus->dhd->tx_packets + bus->dhd->rx_packets), ++ (bus->f2txdata + bus->f2rxhdrs + bus->f2rxdata)); ++ dhd_dump_pct(strbuf, ", pkts/f1sd", ++ (bus->dhd->tx_packets + bus->dhd->rx_packets), bus->f1regdata); ++ dhd_dump_pct(strbuf, ", pkts/sd", ++ (bus->dhd->tx_packets + bus->dhd->rx_packets), ++ (bus->f2txdata + bus->f2rxhdrs + bus->f2rxdata + bus->f1regdata)); ++ dhd_dump_pct(strbuf, ", pkts/int", ++ (bus->dhd->tx_packets + bus->dhd->rx_packets), bus->intrcount); ++ bcm_bprintf(strbuf, "\n\n"); ++ } ++ ++#ifdef SDTEST ++ if (bus->pktgen_count) { ++ bcm_bprintf(strbuf, "pktgen config and count:\n"); ++ bcm_bprintf(strbuf, "freq %d count %d print %d total %d min %d len %d\n", ++ bus->pktgen_freq, bus->pktgen_count, bus->pktgen_print, ++ bus->pktgen_total, bus->pktgen_minlen, bus->pktgen_maxlen); ++ bcm_bprintf(strbuf, "send attempts %d rcvd %d fail %d\n", ++ bus->pktgen_sent, bus->pktgen_rcvd, bus->pktgen_fail); ++ } ++#endif /* SDTEST */ ++#ifdef DHD_DEBUG ++ bcm_bprintf(strbuf, "dpc_sched %d host interrupt%spending\n", ++ bus->dpc_sched, (bcmsdh_intr_pending(bus->sdh) ? " " : " not ")); ++ bcm_bprintf(strbuf, "blocksize %d roundup %d\n", bus->blocksize, bus->roundup); ++#endif /* DHD_DEBUG */ ++ bcm_bprintf(strbuf, "clkstate %d activity %d idletime %d idlecount %d sleeping %d\n", ++ bus->clkstate, bus->activity, bus->idletime, bus->idlecount, bus->sleeping); ++} ++ ++void ++dhd_bus_clearcounts(dhd_pub_t *dhdp) ++{ ++ dhd_bus_t *bus = (dhd_bus_t *)dhdp->bus; ++ ++ bus->intrcount = bus->lastintrs = bus->spurious = bus->regfails = 0; ++ bus->rxrtx = bus->rx_toolong = bus->rxc_errors = 0; ++ bus->rx_hdrfail = bus->rx_badhdr = bus->rx_badseq = 0; ++ bus->tx_sderrs = bus->fc_rcvd = bus->fc_xoff = bus->fc_xon = 0; ++ bus->rxglomfail = bus->rxglomframes = bus->rxglompkts = 0; ++ bus->f2rxhdrs = bus->f2rxdata = bus->f2txdata = bus->f1regdata = 0; ++} ++ ++#ifdef SDTEST ++static int ++dhdsdio_pktgen_get(dhd_bus_t *bus, uint8 *arg) ++{ ++ dhd_pktgen_t pktgen; ++ ++ pktgen.version = DHD_PKTGEN_VERSION; ++ pktgen.freq = bus->pktgen_freq; ++ pktgen.count = bus->pktgen_count; ++ pktgen.print = bus->pktgen_print; ++ pktgen.total = bus->pktgen_total; ++ pktgen.minlen = bus->pktgen_minlen; ++ pktgen.maxlen = bus->pktgen_maxlen; ++ pktgen.numsent = bus->pktgen_sent; ++ pktgen.numrcvd = bus->pktgen_rcvd; ++ pktgen.numfail = bus->pktgen_fail; ++ pktgen.mode = bus->pktgen_mode; ++ pktgen.stop = bus->pktgen_stop; ++ ++ bcopy(&pktgen, arg, sizeof(pktgen)); ++ ++ return 0; ++} ++ ++static int ++dhdsdio_pktgen_set(dhd_bus_t *bus, uint8 *arg) ++{ ++ dhd_pktgen_t pktgen; ++ uint oldcnt, oldmode; ++ ++ bcopy(arg, &pktgen, sizeof(pktgen)); ++ if (pktgen.version != DHD_PKTGEN_VERSION) ++ return BCME_BADARG; ++ ++ oldcnt = bus->pktgen_count; ++ oldmode = bus->pktgen_mode; ++ ++ bus->pktgen_freq = pktgen.freq; ++ bus->pktgen_count = pktgen.count; ++ bus->pktgen_print = pktgen.print; ++ bus->pktgen_total = pktgen.total; ++ bus->pktgen_minlen = pktgen.minlen; ++ bus->pktgen_maxlen = pktgen.maxlen; ++ bus->pktgen_mode = pktgen.mode; ++ bus->pktgen_stop = pktgen.stop; ++ ++ bus->pktgen_tick = bus->pktgen_ptick = 0; ++ bus->pktgen_prev_time = jiffies; ++ bus->pktgen_len = MAX(bus->pktgen_len, bus->pktgen_minlen); ++ bus->pktgen_len = MIN(bus->pktgen_len, bus->pktgen_maxlen); ++ ++ /* Clear counts for a new pktgen (mode change, or was stopped) */ ++ if (bus->pktgen_count && (!oldcnt || oldmode != bus->pktgen_mode)) { ++ bus->pktgen_sent = bus->pktgen_prev_sent = bus->pktgen_rcvd = 0; ++ bus->pktgen_prev_rcvd = bus->pktgen_fail = 0; ++ } ++ ++ return 0; ++} ++#endif /* SDTEST */ ++ ++static void ++dhdsdio_devram_remap(dhd_bus_t *bus, bool val) ++{ ++ uint8 enable, protect, remap; ++ ++ si_socdevram(bus->sih, FALSE, &enable, &protect, &remap); ++ remap = val ? TRUE : FALSE; ++ si_socdevram(bus->sih, TRUE, &enable, &protect, &remap); ++} ++ ++static int ++dhdsdio_membytes(dhd_bus_t *bus, bool write, uint32 address, uint8 *data, uint size) ++{ ++ int bcmerror = 0; ++ uint32 sdaddr; ++ uint dsize; ++ ++ /* In remap mode, adjust address beyond socram and redirect ++ * to devram at SOCDEVRAM_BP_ADDR since remap address > orig_ramsize ++ * is not backplane accessible ++ */ ++ if (REMAP_ENAB(bus) && REMAP_ISADDR(bus, address)) { ++ address -= bus->orig_ramsize; ++ address += SOCDEVRAM_BP_ADDR; ++ } ++ ++ /* Determine initial transfer parameters */ ++ sdaddr = address & SBSDIO_SB_OFT_ADDR_MASK; ++ if ((sdaddr + size) & SBSDIO_SBWINDOW_MASK) ++ dsize = (SBSDIO_SB_OFT_ADDR_LIMIT - sdaddr); ++ else ++ dsize = size; ++ ++ /* Set the backplane window to include the start address */ ++ if ((bcmerror = dhdsdio_set_siaddr_window(bus, address))) { ++ AP6210_ERR("%s: window change failed\n", __FUNCTION__); ++ goto xfer_done; ++ } ++ ++ /* Do the transfer(s) */ ++ while (size) { ++ AP6210_DEBUG("%s: %s %d bytes at offset 0x%08x in window 0x%08x\n", ++ __FUNCTION__, (write ? "write" : "read"), dsize, sdaddr, ++ (address & SBSDIO_SBWINDOW_MASK)); ++ if ((bcmerror = bcmsdh_rwdata(bus->sdh, write, sdaddr, data, dsize))) { ++ AP6210_ERR("%s: membytes transfer failed\n", __FUNCTION__); ++ break; ++ } ++ ++ /* Adjust for next transfer (if any) */ ++ if ((size -= dsize)) { ++ data += dsize; ++ address += dsize; ++ if ((bcmerror = dhdsdio_set_siaddr_window(bus, address))) { ++ AP6210_ERR("%s: window change failed\n", __FUNCTION__); ++ break; ++ } ++ sdaddr = 0; ++ dsize = MIN(SBSDIO_SB_OFT_ADDR_LIMIT, size); ++ } ++ ++ } ++ ++xfer_done: ++ /* Return the window to backplane enumeration space for core access */ ++ if (dhdsdio_set_siaddr_window(bus, bcmsdh_cur_sbwad(bus->sdh))) { ++ AP6210_ERR("%s: FAILED to set window back to 0x%x\n", __FUNCTION__, ++ bcmsdh_cur_sbwad(bus->sdh)); ++ } ++ ++ return bcmerror; ++} ++ ++#ifdef DHD_DEBUG ++static int ++dhdsdio_readshared(dhd_bus_t *bus, sdpcm_shared_t *sh) ++{ ++ uint32 addr; ++ int rv, i; ++ uint32 shaddr = 0; ++ ++ shaddr = bus->dongle_ram_base + bus->ramsize - 4; ++ i = 0; ++ do { ++ /* Read last word in memory to determine address of sdpcm_shared structure */ ++ if ((rv = dhdsdio_membytes(bus, FALSE, shaddr, (uint8 *)&addr, 4)) < 0) ++ return rv; ++ ++ addr = ltoh32(addr); ++ ++ AP6210_DEBUG("sdpcm_shared address 0x%08X\n", addr); ++ ++ /* ++ * Check if addr is valid. ++ * NVRAM length at the end of memory should have been overwritten. ++ */ ++ if (addr == 0 || ((~addr >> 16) & 0xffff) == (addr & 0xffff)) { ++ if ((bus->srmemsize > 0) && (i++ == 0)) { ++ shaddr -= bus->srmemsize; ++ } else { ++ AP6210_ERR("%s: address (0x%08x) of sdpcm_shared invalid\n", ++ __FUNCTION__, addr); ++ return BCME_ERROR; ++ } ++ } else ++ break; ++ } while (i < 2); ++ ++ /* Read hndrte_shared structure */ ++ if ((rv = dhdsdio_membytes(bus, FALSE, addr, (uint8 *)sh, sizeof(sdpcm_shared_t))) < 0) ++ return rv; ++ ++ /* Endianness */ ++ sh->flags = ltoh32(sh->flags); ++ sh->trap_addr = ltoh32(sh->trap_addr); ++ sh->assert_exp_addr = ltoh32(sh->assert_exp_addr); ++ sh->assert_file_addr = ltoh32(sh->assert_file_addr); ++ sh->assert_line = ltoh32(sh->assert_line); ++ sh->console_addr = ltoh32(sh->console_addr); ++ sh->msgtrace_addr = ltoh32(sh->msgtrace_addr); ++ ++ if ((sh->flags & SDPCM_SHARED_VERSION_MASK) == 3 && SDPCM_SHARED_VERSION == 1) ++ return BCME_OK; ++ ++ if ((sh->flags & SDPCM_SHARED_VERSION_MASK) != SDPCM_SHARED_VERSION) { ++ AP6210_ERR("%s: sdpcm_shared version %d in dhd " ++ "is different than sdpcm_shared version %d in dongle\n", ++ __FUNCTION__, SDPCM_SHARED_VERSION, ++ sh->flags & SDPCM_SHARED_VERSION_MASK); ++ return BCME_ERROR; ++ } ++ ++ return BCME_OK; ++} ++ ++#define CONSOLE_LINE_MAX 192 ++ ++static int ++dhdsdio_readconsole(dhd_bus_t *bus) ++{ ++ dhd_console_t *c = &bus->console; ++ uint8 line[CONSOLE_LINE_MAX], ch; ++ uint32 n, idx, addr; ++ int rv; ++ ++ /* Don't do anything until FWREADY updates console address */ ++ if (bus->console_addr == 0) ++ return 0; ++ ++ if (!KSO_ENAB(bus)) ++ return 0; ++ ++ /* Read console log struct */ ++ addr = bus->console_addr + OFFSETOF(hndrte_cons_t, log); ++ if ((rv = dhdsdio_membytes(bus, FALSE, addr, (uint8 *)&c->log, sizeof(c->log))) < 0) ++ return rv; ++ ++ /* Allocate console buffer (one time only) */ ++ if (c->buf == NULL) { ++ c->bufsize = ltoh32(c->log.buf_size); ++ if ((c->buf = MALLOC(bus->dhd->osh, c->bufsize)) == NULL) ++ return BCME_NOMEM; ++ } ++ ++ idx = ltoh32(c->log.idx); ++ ++ /* Protect against corrupt value */ ++ if (idx > c->bufsize) ++ return BCME_ERROR; ++ ++ /* Skip reading the console buffer if the index pointer has not moved */ ++ if (idx == c->last) ++ return BCME_OK; ++ ++ /* Read the console buffer */ ++ addr = ltoh32(c->log.buf); ++ if ((rv = dhdsdio_membytes(bus, FALSE, addr, c->buf, c->bufsize)) < 0) ++ return rv; ++ ++ while (c->last != idx) { ++ for (n = 0; n < CONSOLE_LINE_MAX - 2; n++) { ++ if (c->last == idx) { ++ /* This would output a partial line. Instead, back up ++ * the buffer pointer and output this line next time around. ++ */ ++ if (c->last >= n) ++ c->last -= n; ++ else ++ c->last = c->bufsize - n; ++ goto break2; ++ } ++ ch = c->buf[c->last]; ++ c->last = (c->last + 1) % c->bufsize; ++ if (ch == '\n') ++ break; ++ line[n] = ch; ++ } ++ ++ if (n > 0) { ++ if (line[n - 1] == '\r') ++ n--; ++ line[n] = 0; ++ AP6210_DEBUG("CONSOLE: %s\n", line); ++ } ++ } ++break2: ++ ++ return BCME_OK; ++} ++ ++static int ++dhdsdio_checkdied(dhd_bus_t *bus, char *data, uint size) ++{ ++ int bcmerror = 0; ++ uint msize = 512; ++ char *mbuffer = NULL; ++ char *console_buffer = NULL; ++ uint maxstrlen = 256; ++ char *str = NULL; ++ trap_t tr; ++ sdpcm_shared_t sdpcm_shared; ++ struct bcmstrbuf strbuf; ++ uint32 console_ptr, console_size, console_index; ++ uint8 line[CONSOLE_LINE_MAX], ch; ++ uint32 n, i, addr; ++ int rv; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (data == NULL) { ++ /* ++ * Called after a rx ctrl timeout. "data" is NULL. ++ * allocate memory to trace the trap or assert. ++ */ ++ size = msize; ++ mbuffer = data = MALLOC(bus->dhd->osh, msize); ++ if (mbuffer == NULL) { ++ AP6210_ERR("%s: MALLOC(%d) failed \n", __FUNCTION__, msize); ++ bcmerror = BCME_NOMEM; ++ goto done; ++ } ++ } ++ ++ if ((str = MALLOC(bus->dhd->osh, maxstrlen)) == NULL) { ++ AP6210_ERR("%s: MALLOC(%d) failed \n", __FUNCTION__, maxstrlen); ++ bcmerror = BCME_NOMEM; ++ goto done; ++ } ++ ++ if ((bcmerror = dhdsdio_readshared(bus, &sdpcm_shared)) < 0) ++ goto done; ++ ++ bcm_binit(&strbuf, data, size); ++ ++ bcm_bprintf(&strbuf, "msgtrace address : 0x%08X\nconsole address : 0x%08X\n", ++ sdpcm_shared.msgtrace_addr, sdpcm_shared.console_addr); ++ ++ if ((sdpcm_shared.flags & SDPCM_SHARED_ASSERT_BUILT) == 0) { ++ /* NOTE: Misspelled assert is intentional - DO NOT FIX. ++ * (Avoids conflict with real asserts for programmatic parsing of output.) ++ */ ++ bcm_bprintf(&strbuf, "Assrt not built in dongle\n"); ++ } ++ ++ if ((sdpcm_shared.flags & (SDPCM_SHARED_ASSERT|SDPCM_SHARED_TRAP)) == 0) { ++ /* NOTE: Misspelled assert is intentional - DO NOT FIX. ++ * (Avoids conflict with real asserts for programmatic parsing of output.) ++ */ ++ bcm_bprintf(&strbuf, "No trap%s in dongle", ++ (sdpcm_shared.flags & SDPCM_SHARED_ASSERT_BUILT) ++ ?"/assrt" :""); ++ } else { ++ if (sdpcm_shared.flags & SDPCM_SHARED_ASSERT) { ++ /* Download assert */ ++ bcm_bprintf(&strbuf, "Dongle assert"); ++ if (sdpcm_shared.assert_exp_addr != 0) { ++ str[0] = '\0'; ++ if ((bcmerror = dhdsdio_membytes(bus, FALSE, ++ sdpcm_shared.assert_exp_addr, ++ (uint8 *)str, maxstrlen)) < 0) ++ goto done; ++ ++ str[maxstrlen - 1] = '\0'; ++ bcm_bprintf(&strbuf, " expr \"%s\"", str); ++ } ++ ++ if (sdpcm_shared.assert_file_addr != 0) { ++ str[0] = '\0'; ++ if ((bcmerror = dhdsdio_membytes(bus, FALSE, ++ sdpcm_shared.assert_file_addr, ++ (uint8 *)str, maxstrlen)) < 0) ++ goto done; ++ ++ str[maxstrlen - 1] = '\0'; ++ bcm_bprintf(&strbuf, " file \"%s\"", str); ++ } ++ ++ bcm_bprintf(&strbuf, " line %d ", sdpcm_shared.assert_line); ++ } ++ ++ if (sdpcm_shared.flags & SDPCM_SHARED_TRAP) { ++ bus->dhd->dongle_trap_occured = TRUE; ++ if ((bcmerror = dhdsdio_membytes(bus, FALSE, ++ sdpcm_shared.trap_addr, ++ (uint8*)&tr, sizeof(trap_t))) < 0) ++ goto done; ++ ++ bcm_bprintf(&strbuf, ++ "Dongle trap type 0x%x @ epc 0x%x, cpsr 0x%x, spsr 0x%x, sp 0x%x," ++ "lp 0x%x, rpc 0x%x Trap offset 0x%x, " ++ "r0 0x%x, r1 0x%x, r2 0x%x, r3 0x%x, " ++ "r4 0x%x, r5 0x%x, r6 0x%x, r7 0x%x\n\n", ++ ltoh32(tr.type), ltoh32(tr.epc), ltoh32(tr.cpsr), ltoh32(tr.spsr), ++ ltoh32(tr.r13), ltoh32(tr.r14), ltoh32(tr.pc), ++ ltoh32(sdpcm_shared.trap_addr), ++ ltoh32(tr.r0), ltoh32(tr.r1), ltoh32(tr.r2), ltoh32(tr.r3), ++ ltoh32(tr.r4), ltoh32(tr.r5), ltoh32(tr.r6), ltoh32(tr.r7)); ++ ++ addr = sdpcm_shared.console_addr + OFFSETOF(hndrte_cons_t, log); ++ if ((rv = dhdsdio_membytes(bus, FALSE, addr, ++ (uint8 *)&console_ptr, sizeof(console_ptr))) < 0) ++ goto printbuf; ++ ++ addr = sdpcm_shared.console_addr + OFFSETOF(hndrte_cons_t, log.buf_size); ++ if ((rv = dhdsdio_membytes(bus, FALSE, addr, ++ (uint8 *)&console_size, sizeof(console_size))) < 0) ++ goto printbuf; ++ ++ addr = sdpcm_shared.console_addr + OFFSETOF(hndrte_cons_t, log.idx); ++ if ((rv = dhdsdio_membytes(bus, FALSE, addr, ++ (uint8 *)&console_index, sizeof(console_index))) < 0) ++ goto printbuf; ++ ++ console_ptr = ltoh32(console_ptr); ++ console_size = ltoh32(console_size); ++ console_index = ltoh32(console_index); ++ ++ if (console_size > CONSOLE_BUFFER_MAX || ++ !(console_buffer = MALLOC(bus->dhd->osh, console_size))) ++ goto printbuf; ++ ++ if ((rv = dhdsdio_membytes(bus, FALSE, console_ptr, ++ (uint8 *)console_buffer, console_size)) < 0) ++ goto printbuf; ++ ++ for (i = 0, n = 0; i < console_size; i += n + 1) { ++ for (n = 0; n < CONSOLE_LINE_MAX - 2; n++) { ++ ch = console_buffer[(console_index + i + n) % console_size]; ++ if (ch == '\n') ++ break; ++ line[n] = ch; ++ } ++ ++ ++ if (n > 0) { ++ if (line[n - 1] == '\r') ++ n--; ++ line[n] = 0; ++ /* Don't use DHD_ERROR macro since we print ++ * a lot of information quickly. The macro ++ * will truncate a lot of the printfs ++ */ ++ ++ if (dhd_msg_level & DHD_ERROR_VAL) ++ AP6210_DEBUG("CONSOLE: %s\n", line); ++ } ++ } ++ } ++ } ++ ++printbuf: ++ if (sdpcm_shared.flags & (SDPCM_SHARED_ASSERT | SDPCM_SHARED_TRAP)) { ++ AP6210_DEBUG("%s: %s\n", __FUNCTION__, strbuf.origbuf); ++ } ++ ++ ++done: ++ if (mbuffer) ++ MFREE(bus->dhd->osh, mbuffer, msize); ++ if (str) ++ MFREE(bus->dhd->osh, str, maxstrlen); ++ if (console_buffer) ++ MFREE(bus->dhd->osh, console_buffer, console_size); ++ ++ return bcmerror; ++} ++#endif /* #ifdef DHD_DEBUG */ ++ ++ ++int ++dhdsdio_downloadvars(dhd_bus_t *bus, void *arg, int len) ++{ ++ int bcmerror = BCME_OK; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ /* Basic sanity checks */ ++ if (bus->dhd->up) { ++ bcmerror = BCME_NOTDOWN; ++ goto err; ++ } ++ if (!len) { ++ bcmerror = BCME_BUFTOOSHORT; ++ goto err; ++ } ++ ++ /* Free the old ones and replace with passed variables */ ++ if (bus->vars) ++ MFREE(bus->dhd->osh, bus->vars, bus->varsz); ++ ++ bus->vars = MALLOC(bus->dhd->osh, len); ++ bus->varsz = bus->vars ? len : 0; ++ if (bus->vars == NULL) { ++ bcmerror = BCME_NOMEM; ++ goto err; ++ } ++ ++ /* Copy the passed variables, which should include the terminating double-null */ ++ bcopy(arg, bus->vars, bus->varsz); ++err: ++ return bcmerror; ++} ++ ++#ifdef DHD_DEBUG ++ ++#define CC_PLL_CHIPCTRL_SERIAL_ENAB (1 << 24) ++#define CC_CHIPCTRL_JTAG_SEL (1 << 3) ++#define CC_CHIPCTRL_GPIO_SEL (0x3) ++#define CC_PLL_CHIPCTRL_SERIAL_ENAB_4334 (1 << 28) ++ ++static int ++dhd_serialconsole(dhd_bus_t *bus, bool set, bool enable, int *bcmerror) ++{ ++ int int_val; ++ uint32 addr, data, uart_enab = 0; ++ uint32 jtag_sel = CC_CHIPCTRL_JTAG_SEL; ++ uint32 gpio_sel = CC_CHIPCTRL_GPIO_SEL; ++ ++ addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_addr); ++ data = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol_data); ++ *bcmerror = 0; ++ ++ bcmsdh_reg_write(bus->sdh, addr, 4, 1); ++ if (bcmsdh_regfail(bus->sdh)) { ++ *bcmerror = BCME_SDIO_ERROR; ++ return -1; ++ } ++ int_val = bcmsdh_reg_read(bus->sdh, data, 4); ++ if (bcmsdh_regfail(bus->sdh)) { ++ *bcmerror = BCME_SDIO_ERROR; ++ return -1; ++ } ++ if (bus->sih->chip == BCM4330_CHIP_ID) { ++ uart_enab = CC_PLL_CHIPCTRL_SERIAL_ENAB; ++ } ++ else if (bus->sih->chip == BCM4334_CHIP_ID || ++ bus->sih->chip == BCM43341_CHIP_ID) { ++ if (enable) { ++ /* Moved to PMU chipcontrol 1 from 4330 */ ++ int_val &= ~gpio_sel; ++ int_val |= jtag_sel; ++ } else { ++ int_val |= gpio_sel; ++ int_val &= ~jtag_sel; ++ } ++ uart_enab = CC_PLL_CHIPCTRL_SERIAL_ENAB_4334; ++ } ++ ++ if (!set) ++ return (int_val & uart_enab); ++ if (enable) ++ int_val |= uart_enab; ++ else ++ int_val &= ~uart_enab; ++ bcmsdh_reg_write(bus->sdh, data, 4, int_val); ++ if (bcmsdh_regfail(bus->sdh)) { ++ *bcmerror = BCME_SDIO_ERROR; ++ return -1; ++ } ++ if (bus->sih->chip == BCM4330_CHIP_ID) { ++ uint32 chipcontrol; ++ addr = SI_ENUM_BASE + OFFSETOF(chipcregs_t, chipcontrol); ++ chipcontrol = bcmsdh_reg_read(bus->sdh, addr, 4); ++ chipcontrol &= ~jtag_sel; ++ if (enable) { ++ chipcontrol |= jtag_sel; ++ chipcontrol &= ~gpio_sel; ++ } ++ bcmsdh_reg_write(bus->sdh, addr, 4, chipcontrol); ++ } ++ ++ return (int_val & uart_enab); ++} ++#endif ++ ++static int ++dhdsdio_doiovar(dhd_bus_t *bus, const bcm_iovar_t *vi, uint32 actionid, const char *name, ++ void *params, int plen, void *arg, int len, int val_size) ++{ ++ int bcmerror = 0; ++ int32 int_val = 0; ++ bool bool_val = 0; ++ ++ AP6210_DEBUG("%s: Enter, action %d name %s params %p plen %d arg %p len %d val_size %d\n", ++ __FUNCTION__, actionid, name, params, plen, arg, len, val_size); ++ ++ if ((bcmerror = bcm_iovar_lencheck(vi, arg, len, IOV_ISSET(actionid))) != 0) ++ goto exit; ++ ++ if (plen >= (int)sizeof(int_val)) ++ bcopy(params, &int_val, sizeof(int_val)); ++ ++ bool_val = (int_val != 0) ? TRUE : FALSE; ++ ++ ++ /* Some ioctls use the bus */ ++ dhd_os_sdlock(bus->dhd); ++ ++ /* Check if dongle is in reset. If so, only allow DEVRESET iovars */ ++ if (bus->dhd->dongle_reset && !(actionid == IOV_SVAL(IOV_DEVRESET) || ++ actionid == IOV_GVAL(IOV_DEVRESET))) { ++ bcmerror = BCME_NOTREADY; ++ goto exit; ++ } ++ ++ /* ++ * Special handling for keepSdioOn: New SDIO Wake-up Mechanism ++ */ ++ if ((vi->varid == IOV_KSO) && (IOV_ISSET(actionid))) { ++ dhdsdio_clk_kso_iovar(bus, bool_val); ++ goto exit; ++ } else if ((vi->varid == IOV_DEVSLEEP) && (IOV_ISSET(actionid))) { ++ { ++ dhdsdio_clk_devsleep_iovar(bus, bool_val); ++ if (!SLPAUTO_ENAB(bus) && (bool_val == FALSE) && (bus->ipend)) { ++ AP6210_DEBUG("INT pending in devsleep 1, dpc_sched: %d\n", ++ bus->dpc_sched); ++ if (!bus->dpc_sched) { ++ bus->dpc_sched = TRUE; ++ dhd_sched_dpc(bus->dhd); ++ } ++ } ++ } ++ goto exit; ++ } ++ ++ /* Handle sleep stuff before any clock mucking */ ++ if (vi->varid == IOV_SLEEP) { ++ if (IOV_ISSET(actionid)) { ++ bcmerror = dhdsdio_bussleep(bus, bool_val); ++ } else { ++ int_val = (int32)bus->sleeping; ++ bcopy(&int_val, arg, val_size); ++ } ++ goto exit; ++ } ++ ++ /* Request clock to allow SDIO accesses */ ++ if (!bus->dhd->dongle_reset) { ++ BUS_WAKE(bus); ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ } ++ ++ switch (actionid) { ++ case IOV_GVAL(IOV_INTR): ++ int_val = (int32)bus->intr; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_INTR): ++ bus->intr = bool_val; ++ bus->intdis = FALSE; ++ if (bus->dhd->up) { ++ if (bus->intr) { ++ AP6210_DEBUG("%s: enable SDIO device interrupts\n", __FUNCTION__); ++ bcmsdh_intr_enable(bus->sdh); ++ } else { ++ AP6210_DEBUG("%s: disable SDIO interrupts\n", __FUNCTION__); ++ bcmsdh_intr_disable(bus->sdh); ++ } ++ } ++ break; ++ ++ case IOV_GVAL(IOV_POLLRATE): ++ int_val = (int32)bus->pollrate; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_POLLRATE): ++ bus->pollrate = (uint)int_val; ++ bus->poll = (bus->pollrate != 0); ++ break; ++ ++ case IOV_GVAL(IOV_IDLETIME): ++ int_val = bus->idletime; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_IDLETIME): ++ if ((int_val < 0) && (int_val != DHD_IDLE_IMMEDIATE)) { ++ bcmerror = BCME_BADARG; ++ } else { ++ bus->idletime = int_val; ++ } ++ break; ++ ++ case IOV_GVAL(IOV_IDLECLOCK): ++ int_val = (int32)bus->idleclock; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_IDLECLOCK): ++ bus->idleclock = int_val; ++ break; ++ ++ case IOV_GVAL(IOV_SD1IDLE): ++ int_val = (int32)sd1idle; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_SD1IDLE): ++ sd1idle = bool_val; ++ break; ++ ++ ++ case IOV_SVAL(IOV_MEMBYTES): ++ case IOV_GVAL(IOV_MEMBYTES): ++ { ++ uint32 address; ++ uint size, dsize; ++ uint8 *data; ++ ++ bool set = (actionid == IOV_SVAL(IOV_MEMBYTES)); ++ ++ ASSERT(plen >= 2*sizeof(int)); ++ ++ address = (uint32)int_val; ++ bcopy((char *)params + sizeof(int_val), &int_val, sizeof(int_val)); ++ size = (uint)int_val; ++ ++ /* Do some validation */ ++ dsize = set ? plen - (2 * sizeof(int)) : len; ++ if (dsize < size) { ++ AP6210_ERR("%s: error on %s membytes, addr 0x%08x size %d dsize %d\n", ++ __FUNCTION__, (set ? "set" : "get"), address, size, dsize); ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ ++ AP6210_DEBUG("%s: Request to %s %d bytes at address 0x%08x\n", __FUNCTION__, ++ (set ? "write" : "read"), size, address); ++ ++ /* If we know about SOCRAM, check for a fit */ ++ if ((bus->orig_ramsize) && ++ ((address > bus->orig_ramsize) || (address + size > bus->orig_ramsize))) ++ { ++ uint8 enable, protect, remap; ++ si_socdevram(bus->sih, FALSE, &enable, &protect, &remap); ++ if (!enable || protect) { ++ AP6210_ERR("%s: ramsize 0x%08x doesn't have %d bytes at 0x%08x\n", ++ __FUNCTION__, bus->orig_ramsize, size, address); ++ AP6210_DEBUG("%s: socram enable %d, protect %d\n", ++ __FUNCTION__, enable, protect); ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ ++ if (!REMAP_ENAB(bus) && (address >= SOCDEVRAM_ARM_ADDR)) { ++ uint32 devramsize = si_socdevram_size(bus->sih); ++ if ((address < SOCDEVRAM_ARM_ADDR) || ++ (address + size > (SOCDEVRAM_ARM_ADDR + devramsize))) { ++ AP6210_ERR("%s: bad address 0x%08x, size 0x%08x\n", ++ __FUNCTION__, address, size); ++ AP6210_DEBUG("%s: socram range 0x%08x,size 0x%08x\n", ++ __FUNCTION__, SOCDEVRAM_ARM_ADDR, devramsize); ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ /* move it such that address is real now */ ++ address -= SOCDEVRAM_ARM_ADDR; ++ address += SOCDEVRAM_BP_ADDR; ++ AP6210_DEBUG("%s: Request to %s %d bytes @ Mapped address 0x%08x\n", ++ __FUNCTION__, (set ? "write" : "read"), size, address); ++ } else if (REMAP_ENAB(bus) && REMAP_ISADDR(bus, address) && remap) { ++ /* Can not access remap region while devram remap bit is set ++ * ROM content would be returned in this case ++ */ ++ AP6210_ERR("%s: Need to disable remap for address 0x%08x\n", ++ __FUNCTION__, address); ++ bcmerror = BCME_ERROR; ++ break; ++ } ++ } ++ ++ /* Generate the actual data pointer */ ++ data = set ? (uint8*)params + 2 * sizeof(int): (uint8*)arg; ++ ++ /* Call to do the transfer */ ++ bcmerror = dhdsdio_membytes(bus, set, address, data, size); ++ ++ break; ++ } ++ ++ case IOV_GVAL(IOV_MEMSIZE): ++ int_val = (int32)bus->ramsize; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_GVAL(IOV_SDIOD_DRIVE): ++ int_val = (int32)dhd_sdiod_drive_strength; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_SDIOD_DRIVE): ++ dhd_sdiod_drive_strength = int_val; ++ si_sdiod_drive_strength_init(bus->sih, bus->dhd->osh, dhd_sdiod_drive_strength); ++ break; ++ ++ case IOV_SVAL(IOV_SET_DOWNLOAD_STATE): ++ bcmerror = dhdsdio_download_state(bus, bool_val); ++ break; ++ ++ case IOV_SVAL(IOV_SOCRAM_STATE): ++ bcmerror = dhdsdio_download_state(bus, bool_val); ++ break; ++ ++ case IOV_SVAL(IOV_VARS): ++ bcmerror = dhdsdio_downloadvars(bus, arg, len); ++ break; ++ ++ case IOV_GVAL(IOV_READAHEAD): ++ int_val = (int32)dhd_readahead; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_READAHEAD): ++ if (bool_val && !dhd_readahead) ++ bus->nextlen = 0; ++ dhd_readahead = bool_val; ++ break; ++ ++ case IOV_GVAL(IOV_SDRXCHAIN): ++ int_val = (int32)bus->use_rxchain; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_SDRXCHAIN): ++ if (bool_val && !bus->sd_rxchain) ++ bcmerror = BCME_UNSUPPORTED; ++ else ++ bus->use_rxchain = bool_val; ++ break; ++ case IOV_GVAL(IOV_ALIGNCTL): ++ int_val = (int32)dhd_alignctl; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_ALIGNCTL): ++ dhd_alignctl = bool_val; ++ break; ++ ++ case IOV_GVAL(IOV_SDALIGN): ++ int_val = DHD_SDALIGN; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++#ifdef DHD_DEBUG ++ case IOV_GVAL(IOV_VARS): ++ if (bus->varsz < (uint)len) ++ bcopy(bus->vars, arg, bus->varsz); ++ else ++ bcmerror = BCME_BUFTOOSHORT; ++ break; ++#endif /* DHD_DEBUG */ ++ ++#ifdef DHD_DEBUG ++ case IOV_GVAL(IOV_SDREG): ++ { ++ sdreg_t *sd_ptr; ++ uint32 addr, size; ++ ++ sd_ptr = (sdreg_t *)params; ++ ++ addr = (uintptr)bus->regs + sd_ptr->offset; ++ size = sd_ptr->func; ++ int_val = (int32)bcmsdh_reg_read(bus->sdh, addr, size); ++ if (bcmsdh_regfail(bus->sdh)) ++ bcmerror = BCME_SDIO_ERROR; ++ bcopy(&int_val, arg, sizeof(int32)); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_SDREG): ++ { ++ sdreg_t *sd_ptr; ++ uint32 addr, size; ++ ++ sd_ptr = (sdreg_t *)params; ++ ++ addr = (uintptr)bus->regs + sd_ptr->offset; ++ size = sd_ptr->func; ++ bcmsdh_reg_write(bus->sdh, addr, size, sd_ptr->value); ++ if (bcmsdh_regfail(bus->sdh)) ++ bcmerror = BCME_SDIO_ERROR; ++ break; ++ } ++ ++ /* Same as above, but offset is not backplane (not SDIO core) */ ++ case IOV_GVAL(IOV_SBREG): ++ { ++ sdreg_t sdreg; ++ uint32 addr, size; ++ ++ bcopy(params, &sdreg, sizeof(sdreg)); ++ ++ addr = SI_ENUM_BASE + sdreg.offset; ++ size = sdreg.func; ++ int_val = (int32)bcmsdh_reg_read(bus->sdh, addr, size); ++ if (bcmsdh_regfail(bus->sdh)) ++ bcmerror = BCME_SDIO_ERROR; ++ bcopy(&int_val, arg, sizeof(int32)); ++ break; ++ } ++ ++ case IOV_SVAL(IOV_SBREG): ++ { ++ sdreg_t sdreg; ++ uint32 addr, size; ++ ++ bcopy(params, &sdreg, sizeof(sdreg)); ++ ++ addr = SI_ENUM_BASE + sdreg.offset; ++ size = sdreg.func; ++ bcmsdh_reg_write(bus->sdh, addr, size, sdreg.value); ++ if (bcmsdh_regfail(bus->sdh)) ++ bcmerror = BCME_SDIO_ERROR; ++ break; ++ } ++ ++ case IOV_GVAL(IOV_SDCIS): ++ { ++ *(char *)arg = 0; ++ ++ bcmstrcat(arg, "\nFunc 0\n"); ++ bcmsdh_cis_read(bus->sdh, 0x10, (uint8 *)arg + strlen(arg), SBSDIO_CIS_SIZE_LIMIT); ++ bcmstrcat(arg, "\nFunc 1\n"); ++ bcmsdh_cis_read(bus->sdh, 0x11, (uint8 *)arg + strlen(arg), SBSDIO_CIS_SIZE_LIMIT); ++ bcmstrcat(arg, "\nFunc 2\n"); ++ bcmsdh_cis_read(bus->sdh, 0x12, (uint8 *)arg + strlen(arg), SBSDIO_CIS_SIZE_LIMIT); ++ break; ++ } ++ ++ case IOV_GVAL(IOV_FORCEEVEN): ++ int_val = (int32)forcealign; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_FORCEEVEN): ++ forcealign = bool_val; ++ break; ++ ++ case IOV_GVAL(IOV_TXBOUND): ++ int_val = (int32)dhd_txbound; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_TXBOUND): ++ dhd_txbound = (uint)int_val; ++ break; ++ ++ case IOV_GVAL(IOV_RXBOUND): ++ int_val = (int32)dhd_rxbound; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_RXBOUND): ++ dhd_rxbound = (uint)int_val; ++ break; ++ ++ case IOV_GVAL(IOV_TXMINMAX): ++ int_val = (int32)dhd_txminmax; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_TXMINMAX): ++ dhd_txminmax = (uint)int_val; ++ break; ++ ++ case IOV_GVAL(IOV_SERIALCONS): ++ int_val = dhd_serialconsole(bus, FALSE, 0, &bcmerror); ++ if (bcmerror != 0) ++ break; ++ ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_SERIALCONS): ++ dhd_serialconsole(bus, TRUE, bool_val, &bcmerror); ++ break; ++ ++ ++ ++#endif /* DHD_DEBUG */ ++ ++ ++#ifdef SDTEST ++ case IOV_GVAL(IOV_EXTLOOP): ++ int_val = (int32)bus->ext_loop; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_EXTLOOP): ++ bus->ext_loop = bool_val; ++ break; ++ ++ case IOV_GVAL(IOV_PKTGEN): ++ bcmerror = dhdsdio_pktgen_get(bus, arg); ++ break; ++ ++ case IOV_SVAL(IOV_PKTGEN): ++ bcmerror = dhdsdio_pktgen_set(bus, arg); ++ break; ++#endif /* SDTEST */ ++ ++#if defined(SDIO_CRC_ERROR_FIX) ++ case IOV_GVAL(IOV_WATERMARK): ++ int_val = (int32)watermark; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_WATERMARK): ++ watermark = (uint)int_val; ++ watermark = (watermark > SBSDIO_WATERMARK_MASK) ? SBSDIO_WATERMARK_MASK : watermark; ++ AP6210_DEBUG("Setting watermark as 0x%x.\n", watermark); ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, NULL); ++ break; ++ ++ case IOV_GVAL(IOV_MESBUSYCTRL): ++ int_val = (int32)mesbusyctrl; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_MESBUSYCTRL): ++ mesbusyctrl = (uint)int_val; ++ mesbusyctrl = (mesbusyctrl > SBSDIO_MESBUSYCTRL_MASK) ++ ? SBSDIO_MESBUSYCTRL_MASK : mesbusyctrl; ++ AP6210_DEBUG("Setting mesbusyctrl as 0x%x.\n", mesbusyctrl); ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, ++ ((uint8)mesbusyctrl | 0x80), NULL); ++ break; ++#endif /* SDIO_CRC_ERROR_FIX */ ++ ++ case IOV_GVAL(IOV_DONGLEISOLATION): ++ int_val = bus->dhd->dongle_isolation; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_DONGLEISOLATION): ++ bus->dhd->dongle_isolation = bool_val; ++ break; ++ ++ case IOV_SVAL(IOV_DEVRESET): ++ AP6210_DEBUG("%s: Called set IOV_DEVRESET=%d dongle_reset=%d busstate=%d\n", ++ __FUNCTION__, bool_val, bus->dhd->dongle_reset, ++ bus->dhd->busstate); ++ ++ ASSERT(bus->dhd->osh); ++ /* ASSERT(bus->cl_devid); */ ++ ++ dhd_bus_devreset(bus->dhd, (uint8)bool_val); ++ ++ break; ++#ifdef SOFTAP ++ case IOV_GVAL(IOV_FWPATH): ++ { ++ uint32 fw_path_len; ++ ++ fw_path_len = strlen(bus->fw_path); ++ AP6210_DEBUG("[softap] get fwpath, l=%d\n", len); ++ ++ if (fw_path_len > len-1) { ++ bcmerror = BCME_BUFTOOSHORT; ++ break; ++ } ++ ++ if (fw_path_len) { ++ bcopy(bus->fw_path, arg, fw_path_len); ++ ((uchar*)arg)[fw_path_len] = 0; ++ } ++ break; ++ } ++ ++ case IOV_SVAL(IOV_FWPATH): ++ AP6210_DEBUG("[softap] set fwpath, idx=%d\n", int_val); ++ ++ switch (int_val) { ++ case 1: ++ bus->fw_path = fw_path; /* ordinary one */ ++ break; ++ case 2: ++ bus->fw_path = fw_path2; ++ break; ++ default: ++ bcmerror = BCME_BADARG; ++ break; ++ } ++ ++ AP6210_DEBUG("[softap] new fw path: %s\n", (bus->fw_path[0] ? bus->fw_path : "NULL")); ++ break; ++ ++#endif /* SOFTAP */ ++ case IOV_GVAL(IOV_DEVRESET): ++ AP6210_DEBUG("%s: Called get IOV_DEVRESET\n", __FUNCTION__); ++ ++ /* Get its status */ ++ int_val = (bool) bus->dhd->dongle_reset; ++ bcopy(&int_val, arg, val_size); ++ ++ break; ++ ++ case IOV_GVAL(IOV_KSO): ++ int_val = dhdsdio_sleepcsr_get(bus); ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_GVAL(IOV_DEVCAP): ++ int_val = dhdsdio_devcap_get(bus); ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_DEVCAP): ++ dhdsdio_devcap_set(bus, (uint8) int_val); ++ break; ++ ++#ifdef BCMSDIOH_TXGLOM ++ case IOV_GVAL(IOV_TXGLOMSIZE): ++ int_val = (int32)bus->glomsize; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_TXGLOMSIZE): ++ if (int_val > SDPCM_MAXGLOM_SIZE) { ++ bcmerror = BCME_ERROR; ++ } else { ++ bus->glomsize = (uint)int_val; ++ } ++ break; ++ case IOV_GVAL(IOV_TXGLOMMODE): ++ int_val = (int32)bus->glom_mode; ++ bcopy(&int_val, arg, val_size); ++ break; ++ ++ case IOV_SVAL(IOV_TXGLOMMODE): ++ if ((int_val != SDPCM_TXGLOM_CPY) && (int_val != SDPCM_TXGLOM_MDESC)) { ++ bcmerror = BCME_RANGE; ++ } else { ++ if ((bus->glom_mode = bcmsdh_set_mode(bus->sdh, (uint)int_val)) != int_val) ++ bcmerror = BCME_ERROR; ++ } ++ break; ++#endif /* BCMSDIOH_TXGLOM */ ++ default: ++ bcmerror = BCME_UNSUPPORTED; ++ break; ++ } ++ ++exit: ++ if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { ++ bus->activity = FALSE; ++ dhdsdio_clkctl(bus, CLK_NONE, TRUE); ++ } ++ ++ dhd_os_sdunlock(bus->dhd); ++ ++ return bcmerror; ++} ++ ++static int ++dhdsdio_write_vars(dhd_bus_t *bus) ++{ ++ int bcmerror = 0; ++ uint32 varsize, phys_size; ++ uint32 varaddr; ++ uint8 *vbuffer; ++ uint32 varsizew; ++#ifdef DHD_DEBUG ++ uint8 *nvram_ularray; ++#endif /* DHD_DEBUG */ ++ ++ /* Even if there are no vars are to be written, we still need to set the ramsize. */ ++ varsize = bus->varsz ? ROUNDUP(bus->varsz, 4) : 0; ++ varaddr = (bus->ramsize - 4) - varsize; ++ ++ varaddr += bus->dongle_ram_base; ++ ++ if (bus->vars) { ++ if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev == 7)) { ++ if (((varaddr & 0x3C) == 0x3C) && (varsize > 4)) { ++ AP6210_DEBUG("PR85623WAR in place\n"); ++ varsize += 4; ++ varaddr -= 4; ++ } ++ } ++ ++ vbuffer = (uint8 *)MALLOC(bus->dhd->osh, varsize); ++ if (!vbuffer) ++ return BCME_NOMEM; ++ ++ bzero(vbuffer, varsize); ++ bcopy(bus->vars, vbuffer, bus->varsz); ++ ++ /* Write the vars list */ ++ bcmerror = dhdsdio_membytes(bus, TRUE, varaddr, vbuffer, varsize); ++#ifdef DHD_DEBUG ++ /* Verify NVRAM bytes */ ++ AP6210_DEBUG("Compare NVRAM dl & ul; varsize=%d\n", varsize); ++ nvram_ularray = (uint8*)MALLOC(bus->dhd->osh, varsize); ++ if (!nvram_ularray) ++ return BCME_NOMEM; ++ ++ /* Upload image to verify downloaded contents. */ ++ memset(nvram_ularray, 0xaa, varsize); ++ ++ /* Read the vars list to temp buffer for comparison */ ++ bcmerror = dhdsdio_membytes(bus, FALSE, varaddr, nvram_ularray, varsize); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on reading %d nvram bytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, varsize, varaddr); ++ } ++ /* Compare the org NVRAM with the one read from RAM */ ++ if (memcmp(vbuffer, nvram_ularray, varsize)) { ++ AP6210_ERR("%s: Downloaded NVRAM image is corrupted.\n", __FUNCTION__); ++ } else ++ AP6210_DEBUG("%s: Download, Upload and compare of NVRAM succeeded.\n", ++ __FUNCTION__); ++ ++ MFREE(bus->dhd->osh, nvram_ularray, varsize); ++#endif /* DHD_DEBUG */ ++ ++ MFREE(bus->dhd->osh, vbuffer, varsize); ++ } ++ ++ phys_size = REMAP_ENAB(bus) ? bus->ramsize : bus->orig_ramsize; ++ ++ phys_size += bus->dongle_ram_base; ++ ++ /* adjust to the user specified RAM */ ++ AP6210_DEBUG("Physical memory size: %d, usable memory size: %d\n", ++ phys_size, bus->ramsize); ++ AP6210_DEBUG("Vars are at %d, orig varsize is %d\n", ++ varaddr, varsize); ++ varsize = ((phys_size - 4) - varaddr); ++ ++ /* ++ * Determine the length token: ++ * Varsize, converted to words, in lower 16-bits, checksum in upper 16-bits. ++ */ ++ if (bcmerror) { ++ varsizew = 0; ++ } else { ++ varsizew = varsize / 4; ++ varsizew = (~varsizew << 16) | (varsizew & 0x0000FFFF); ++ varsizew = htol32(varsizew); ++ } ++ ++ AP6210_DEBUG("New varsize is %d, length token=0x%08x\n", varsize, varsizew); ++ ++ /* Write the length token to the last word */ ++ bcmerror = dhdsdio_membytes(bus, TRUE, (phys_size - 4), ++ (uint8*)&varsizew, 4); ++ ++ return bcmerror; ++} ++ ++static int ++dhdsdio_download_state(dhd_bus_t *bus, bool enter) ++{ ++ uint retries; ++ int bcmerror = 0; ++ int foundcr4 = 0; ++ ++ /* To enter download state, disable ARM and reset SOCRAM. ++ * To exit download state, simply reset ARM (default is RAM boot). ++ */ ++ if (enter) { ++ bus->alp_only = TRUE; ++ ++ if (!(si_setcore(bus->sih, ARM7S_CORE_ID, 0)) && ++ !(si_setcore(bus->sih, ARMCM3_CORE_ID, 0))) { ++ if (si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { ++ foundcr4 = 1; ++ } else { ++ AP6210_ERR("%s: Failed to find ARM core!\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ } ++ ++ if (!foundcr4) { ++ si_core_disable(bus->sih, 0); ++ if (bcmsdh_regfail(bus->sdh)) { ++ bcmerror = BCME_SDIO_ERROR; ++ goto fail; ++ } ++ ++ if (!(si_setcore(bus->sih, SOCRAM_CORE_ID, 0))) { ++ AP6210_ERR("%s: Failed to find SOCRAM core!\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ ++ si_core_reset(bus->sih, 0, 0); ++ if (bcmsdh_regfail(bus->sdh)) { ++ AP6210_ERR("%s: Failure trying reset SOCRAM core?\n", __FUNCTION__); ++ bcmerror = BCME_SDIO_ERROR; ++ goto fail; ++ } ++ ++ /* Disable remap for download */ ++ if (REMAP_ENAB(bus) && si_socdevram_remap_isenb(bus->sih)) ++ dhdsdio_devram_remap(bus, FALSE); ++ ++ /* Clear the top bit of memory */ ++ if (bus->ramsize) { ++ uint32 zeros = 0; ++ if (dhdsdio_membytes(bus, TRUE, bus->ramsize - 4, (uint8*)&zeros, 4) < 0) { ++ bcmerror = BCME_SDIO_ERROR; ++ goto fail; ++ } ++ } ++ } else { ++ /* For CR4, ++ * Halt ARM ++ * Remove ARM reset ++ * Read RAM base address [0x18_0000] ++ * [next] Download firmware ++ * [done at else] Populate the reset vector ++ * [done at else] Remove ARM halt ++ */ ++ /* Halt ARM & remove reset */ ++ si_core_reset(bus->sih, SICF_CPUHALT, SICF_CPUHALT); ++ } ++ } else { ++ if (!si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { ++ if (!(si_setcore(bus->sih, SOCRAM_CORE_ID, 0))) { ++ AP6210_ERR("%s: Failed to find SOCRAM core!\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ ++ if (!si_iscoreup(bus->sih)) { ++ AP6210_ERR("%s: SOCRAM core is down after reset?\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ ++ if ((bcmerror = dhdsdio_write_vars(bus))) { ++ AP6210_ERR("%s: could not write vars to RAM\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ /* Enable remap before ARM reset but after vars. ++ * No backplane access in remap mode ++ */ ++ if (REMAP_ENAB(bus) && !si_socdevram_remap_isenb(bus->sih)) ++ dhdsdio_devram_remap(bus, TRUE); ++ ++ if (!si_setcore(bus->sih, PCMCIA_CORE_ID, 0) && ++ !si_setcore(bus->sih, SDIOD_CORE_ID, 0)) { ++ AP6210_ERR("%s: Can't change back to SDIO core?\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ W_SDREG(0xFFFFFFFF, &bus->regs->intstatus, retries); ++ ++ ++ if (!(si_setcore(bus->sih, ARM7S_CORE_ID, 0)) && ++ !(si_setcore(bus->sih, ARMCM3_CORE_ID, 0))) { ++ AP6210_ERR("%s: Failed to find ARM core!\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ } else { ++ /* cr4 has no socram, but tcm's */ ++ /* write vars */ ++ if ((bcmerror = dhdsdio_write_vars(bus))) { ++ AP6210_ERR("%s: could not write vars to RAM\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ if (!si_setcore(bus->sih, PCMCIA_CORE_ID, 0) && ++ !si_setcore(bus->sih, SDIOD_CORE_ID, 0)) { ++ AP6210_ERR("%s: Can't change back to SDIO core?\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ W_SDREG(0xFFFFFFFF, &bus->regs->intstatus, retries); ++ ++ /* switch back to arm core again */ ++ if (!(si_setcore(bus->sih, ARMCR4_CORE_ID, 0))) { ++ AP6210_ERR("%s: Failed to find ARM CR4 core!\n", __FUNCTION__); ++ bcmerror = BCME_ERROR; ++ goto fail; ++ } ++ /* write address 0 with reset instruction */ ++ bcmerror = dhdsdio_membytes(bus, TRUE, 0, ++ (uint8 *)&bus->resetinstr, sizeof(bus->resetinstr)); ++ ++ /* now remove reset and halt and continue to run CR4 */ ++ } ++ ++ si_core_reset(bus->sih, 0, 0); ++ if (bcmsdh_regfail(bus->sdh)) { ++ AP6210_ERR("%s: Failure trying to reset ARM core?\n", __FUNCTION__); ++ bcmerror = BCME_SDIO_ERROR; ++ goto fail; ++ } ++ ++ /* Allow HT Clock now that the ARM is running. */ ++ bus->alp_only = FALSE; ++ ++ bus->dhd->busstate = DHD_BUS_LOAD; ++ } ++ ++fail: ++ /* Always return to SDIOD core */ ++ if (!si_setcore(bus->sih, PCMCIA_CORE_ID, 0)) ++ si_setcore(bus->sih, SDIOD_CORE_ID, 0); ++ ++ return bcmerror; ++} ++ ++int ++dhd_bus_iovar_op(dhd_pub_t *dhdp, const char *name, ++ void *params, int plen, void *arg, int len, bool set) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ const bcm_iovar_t *vi = NULL; ++ int bcmerror = 0; ++ int val_size; ++ uint32 actionid; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ASSERT(name); ++ ASSERT(len >= 0); ++ ++ /* Get MUST have return space */ ++ ASSERT(set || (arg && len)); ++ ++ /* Set does NOT take qualifiers */ ++ ASSERT(!set || (!params && !plen)); ++ ++ /* Look up var locally; if not found pass to host driver */ ++ if ((vi = bcm_iovar_lookup(dhdsdio_iovars, name)) == NULL) { ++ dhd_os_sdlock(bus->dhd); ++ ++ BUS_WAKE(bus); ++ ++ /* Turn on clock in case SD command needs backplane */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ bcmerror = bcmsdh_iovar_op(bus->sdh, name, params, plen, arg, len, set); ++ ++ /* Check for bus configuration changes of interest */ ++ ++ /* If it was divisor change, read the new one */ ++ if (set && strcmp(name, "sd_divisor") == 0) { ++ if (bcmsdh_iovar_op(bus->sdh, "sd_divisor", NULL, 0, ++ &bus->sd_divisor, sizeof(int32), FALSE) != BCME_OK) { ++ bus->sd_divisor = -1; ++ AP6210_ERR("%s: fail on %s get\n", __FUNCTION__, name); ++ } else { ++ AP6210_DEBUG("%s: noted %s update, value now %d\n", ++ __FUNCTION__, name, bus->sd_divisor); ++ } ++ } ++ /* If it was a mode change, read the new one */ ++ if (set && strcmp(name, "sd_mode") == 0) { ++ if (bcmsdh_iovar_op(bus->sdh, "sd_mode", NULL, 0, ++ &bus->sd_mode, sizeof(int32), FALSE) != BCME_OK) { ++ bus->sd_mode = -1; ++ AP6210_ERR("%s: fail on %s get\n", __FUNCTION__, name); ++ } else { ++ AP6210_DEBUG("%s: noted %s update, value now %d\n", ++ __FUNCTION__, name, bus->sd_mode); ++ } ++ } ++ /* Similar check for blocksize change */ ++ if (set && strcmp(name, "sd_blocksize") == 0) { ++ int32 fnum = 2; ++ if (bcmsdh_iovar_op(bus->sdh, "sd_blocksize", &fnum, sizeof(int32), ++ &bus->blocksize, sizeof(int32), FALSE) != BCME_OK) { ++ bus->blocksize = 0; ++ AP6210_ERR("%s: fail on %s get\n", __FUNCTION__, "sd_blocksize"); ++ } else { ++ AP6210_DEBUG("%s: noted %s update, value now %d\n", ++ __FUNCTION__, "sd_blocksize", bus->blocksize); ++ } ++ } ++ bus->roundup = MIN(max_roundup, bus->blocksize); ++ ++ if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { ++ bus->activity = FALSE; ++ dhdsdio_clkctl(bus, CLK_NONE, TRUE); ++ } ++ ++ dhd_os_sdunlock(bus->dhd); ++ goto exit; ++ } ++ ++ AP6210_DEBUG("%s: %s %s, len %d plen %d\n", __FUNCTION__, ++ name, (set ? "set" : "get"), len, plen); ++ ++ /* set up 'params' pointer in case this is a set command so that ++ * the convenience int and bool code can be common to set and get ++ */ ++ if (params == NULL) { ++ params = arg; ++ plen = len; ++ } ++ ++ if (vi->type == IOVT_VOID) ++ val_size = 0; ++ else if (vi->type == IOVT_BUFFER) ++ val_size = len; ++ else ++ /* all other types are integer sized */ ++ val_size = sizeof(int); ++ ++ actionid = set ? IOV_SVAL(vi->varid) : IOV_GVAL(vi->varid); ++ bcmerror = dhdsdio_doiovar(bus, vi, actionid, name, params, plen, arg, len, val_size); ++ ++exit: ++ return bcmerror; ++} ++ ++void ++dhd_bus_stop(struct dhd_bus *bus, bool enforce_mutex) ++{ ++ osl_t *osh; ++ uint32 local_hostintmask; ++ uint8 saveclk, dat; ++ uint retries; ++ int err; ++ if (!bus->dhd) ++ return; ++ ++ osh = bus->dhd->osh; ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ bcmsdh_waitlockfree(NULL); ++ ++ if (enforce_mutex) ++ dhd_os_sdlock(bus->dhd); ++ ++ if ((bus->dhd->busstate == DHD_BUS_DOWN) || bus->dhd->hang_was_sent) { ++ /* if Firmware already hangs disbale any interrupt */ ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ bus->hostintmask = 0; ++ bcmsdh_intr_disable(bus->sdh); ++ } else { ++ BUS_WAKE(bus); ++ ++ if (KSO_ENAB(bus)) { ++ /* Mask the interrupt */ ++ dat = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, NULL); ++ dat &= ~(INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN); ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_INTEN, dat, NULL); ++ } ++ ++ /* Change our idea of bus state */ ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ ++ if (KSO_ENAB(bus)) { ++ ++ /* Enable clock for device interrupts */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ /* Disable and clear interrupts at the chip level also */ ++ W_SDREG(0, &bus->regs->hostintmask, retries); ++ local_hostintmask = bus->hostintmask; ++ bus->hostintmask = 0; ++ ++ /* Force clocks on backplane to be sure F2 interrupt propagates */ ++ saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); ++ if (!err) { ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, ++ (saveclk | SBSDIO_FORCE_HT), &err); ++ } ++ if (err) { ++ AP6210_ERR("%s: Failed to force clock for F2: err %d\n", __FUNCTION__, err); ++ } ++ ++ /* Turn off the bus (F2), free any pending packets */ ++ AP6210_DEBUG("%s: disable SDIO interrupts\n", __FUNCTION__); ++ bcmsdh_intr_disable(bus->sdh); ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); ++ ++ /* Clear any pending interrupts now that F2 is disabled */ ++ W_SDREG(local_hostintmask, &bus->regs->intstatus, retries); ++ } ++ ++ /* Turn off the backplane clock (only) */ ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++ } ++ ++ /* Clear the data packet queues */ ++ pktq_flush(osh, &bus->txq, TRUE, NULL, 0); ++ ++ /* Clear any held glomming stuff */ ++ if (bus->glomd) ++ PKTFREE(osh, bus->glomd, FALSE); ++ ++ if (bus->glom) ++ PKTFREE(osh, bus->glom, FALSE); ++ ++ bus->glom = bus->glomd = NULL; ++ ++ /* Clear rx control and wake any waiters */ ++ bus->rxlen = 0; ++ dhd_os_ioctl_resp_wake(bus->dhd); ++ ++ /* Reset some F2 state stuff */ ++ bus->rxskip = FALSE; ++ bus->tx_seq = bus->rx_seq = 0; ++ ++ if (enforce_mutex) ++ dhd_os_sdunlock(bus->dhd); ++} ++ ++#ifdef BCMSDIOH_TXGLOM ++void ++dhd_txglom_enable(dhd_pub_t *dhdp, bool enable) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ ++ char buf[256]; ++ uint32 rxglom; ++ int32 ret; ++ ++ if (enable) { ++ rxglom = 1; ++ memset(buf, 0, sizeof(buf)); ++ bcm_mkiovar("bus:rxglom", ++ (void *)&rxglom, ++ 4, buf, sizeof(buf)); ++ ret = dhd_wl_ioctl_cmd(dhdp, ++ WLC_SET_VAR, buf, ++ sizeof(buf), TRUE, 0); ++ if (!(ret < 0)) { ++ bus->glom_enable = TRUE; ++ } ++ } else { ++ bus->glom_enable = FALSE; ++ } ++} ++#endif /* BCMSDIOH_TXGLOM */ ++ ++int ++dhd_bus_init(dhd_pub_t *dhdp, bool enforce_mutex) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ dhd_timeout_t tmo; ++ uint retries = 0; ++ uint8 ready, enable; ++ int err, ret = 0; ++ uint8 saveclk; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ ASSERT(bus->dhd); ++ if (!bus->dhd) ++ return 0; ++ ++ if (enforce_mutex) ++ dhd_os_sdlock(bus->dhd); ++ ++ /* Make sure backplane clock is on, needed to generate F2 interrupt */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ if (bus->clkstate != CLK_AVAIL) { ++ AP6210_ERR("%s: clock state is wrong. state = %d\n", __FUNCTION__, bus->clkstate); ++ ret = -1; ++ goto exit; ++ } ++ ++ ++ /* Force clocks on backplane to be sure F2 interrupt propagates */ ++ saveclk = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); ++ if (!err) { ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, ++ (saveclk | SBSDIO_FORCE_HT), &err); ++ } ++ if (err) { ++ AP6210_ERR("%s: Failed to force clock for F2: err %d\n", __FUNCTION__, err); ++ ret = -1; ++ goto exit; ++ } ++ ++ /* Enable function 2 (frame transfers) */ ++ W_SDREG((SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT), ++ &bus->regs->tosbmailboxdata, retries); ++ enable = (SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2); ++ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, enable, NULL); ++ ++ /* Give the dongle some time to do its thing and set IOR2 */ ++ dhd_timeout_start(&tmo, DHD_WAIT_F2RDY * 1000); ++ ++ ready = 0; ++ while (ready != enable && !dhd_timeout_expired(&tmo)) ++ ready = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IORDY, NULL); ++ ++ AP6210_DEBUG("%s: enable 0x%02x, ready 0x%02x (waited %uus)\n", ++ __FUNCTION__, enable, ready, tmo.elapsed); ++ ++ ++ /* If F2 successfully enabled, set core and enable interrupts */ ++ if (ready == enable) { ++ /* Make sure we're talking to the core. */ ++ if (!(bus->regs = si_setcore(bus->sih, PCMCIA_CORE_ID, 0))) ++ bus->regs = si_setcore(bus->sih, SDIOD_CORE_ID, 0); ++ ASSERT(bus->regs != NULL); ++ ++ /* Set up the interrupt mask and enable interrupts */ ++ bus->hostintmask = HOSTINTMASK; ++ /* corerev 4 could use the newer interrupt logic to detect the frames */ ++ if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev == 4) && ++ (bus->rxint_mode != SDIO_DEVICE_HMB_RXINT)) { ++ bus->hostintmask &= ~I_HMB_FRAME_IND; ++ bus->hostintmask |= I_XMTDATA_AVAIL; ++ } ++ W_SDREG(bus->hostintmask, &bus->regs->hostintmask, retries); ++#ifdef SDIO_CRC_ERROR_FIX ++ if (bus->blocksize < 512) { ++ mesbusyctrl = watermark = bus->blocksize / 4; ++ } ++#endif /* SDIO_CRC_ERROR_FIX */ ++ ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_WATERMARK, (uint8)watermark, &err); ++#ifdef SDIO_CRC_ERROR_FIX ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_FUNC1_MESBUSYCTRL, ++ (uint8)mesbusyctrl|0x80, &err); ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, ++ SBSDIO_DEVCTL_EN_F2_BLK_WATERMARK, NULL); ++#endif /* SDIO_CRC_ERROR_FIX */ ++ ++ /* Set bus state according to enable result */ ++ dhdp->busstate = DHD_BUS_DATA; ++ ++ /* bcmsdh_intr_unmask(bus->sdh); */ ++ ++ bus->intdis = FALSE; ++ if (bus->intr) { ++ AP6210_DEBUG("%s: enable SDIO device interrupts\n", __FUNCTION__); ++ bcmsdh_intr_enable(bus->sdh); ++ } else { ++ AP6210_DEBUG("%s: disable SDIO interrupts\n", __FUNCTION__); ++ bcmsdh_intr_disable(bus->sdh); ++ } ++ ++ } ++ ++ ++ else { ++ /* Disable F2 again */ ++ enable = SDIO_FUNC_ENABLE_1; ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, enable, NULL); ++ } ++ ++ if (dhdsdio_sr_cap(bus)) ++ dhdsdio_sr_init(bus); ++ else ++ bcmsdh_cfg_write(bus->sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, saveclk, &err); ++ ++ /* If we didn't come up, turn off backplane clock */ ++ if (dhdp->busstate != DHD_BUS_DATA) ++ dhdsdio_clkctl(bus, CLK_NONE, FALSE); ++ ++exit: ++ if (enforce_mutex) ++ dhd_os_sdunlock(bus->dhd); ++ ++ return ret; ++} ++ ++static void ++dhdsdio_rxfail(dhd_bus_t *bus, bool abort, bool rtx) ++{ ++ bcmsdh_info_t *sdh = bus->sdh; ++ sdpcmd_regs_t *regs = bus->regs; ++ uint retries = 0; ++ uint16 lastrbc; ++ uint8 hi, lo; ++ int err; ++ ++ AP6210_ERR("%s: %sterminate frame%s\n", __FUNCTION__, ++ (abort ? "abort command, " : ""), (rtx ? ", send NAK" : "")); ++ ++ if (!KSO_ENAB(bus)) { ++ AP6210_ERR("%s: Device asleep\n", __FUNCTION__); ++ return; ++ } ++ ++ if (abort) { ++ bcmsdh_abort(sdh, SDIO_FUNC_2); ++ } ++ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_FRAMECTRL, SFC_RF_TERM, &err); ++ bus->f1regdata++; ++ ++ /* Wait until the packet has been flushed (device/FIFO stable) */ ++ for (lastrbc = retries = 0xffff; retries > 0; retries--) { ++ hi = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_RFRAMEBCHI, NULL); ++ lo = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_RFRAMEBCLO, NULL); ++ bus->f1regdata += 2; ++ ++ if ((hi == 0) && (lo == 0)) ++ break; ++ ++ if ((hi > (lastrbc >> 8)) && (lo > (lastrbc & 0x00ff))) { ++ AP6210_DEBUG("%s: count growing: last 0x%04x now 0x%04x\n", ++ __FUNCTION__, lastrbc, ((hi << 8) + lo)); ++ } ++ lastrbc = (hi << 8) + lo; ++ } ++ ++ if (!retries) { ++ AP6210_ERR("%s: count never zeroed: last 0x%04x\n", __FUNCTION__, lastrbc); ++ } else { ++ AP6210_DEBUG("%s: flush took %d iterations\n", __FUNCTION__, (0xffff - retries)); ++ } ++ ++ if (rtx) { ++ bus->rxrtx++; ++ W_SDREG(SMB_NAK, ®s->tosbmailbox, retries); ++ bus->f1regdata++; ++ if (retries <= retry_limit) { ++ bus->rxskip = TRUE; ++ } ++ } ++ ++ /* Clear partial in any case */ ++ bus->nextlen = 0; ++ ++ /* If we can't reach the device, signal failure */ ++ if (err || bcmsdh_regfail(sdh)) ++ bus->dhd->busstate = DHD_BUS_DOWN; ++} ++ ++static void ++dhdsdio_read_control(dhd_bus_t *bus, uint8 *hdr, uint len, uint doff) ++{ ++ bcmsdh_info_t *sdh = bus->sdh; ++ uint rdlen, pad; ++ ++ int sdret; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ /* Control data already received in aligned rxctl */ ++ if ((bus->bus == SPI_BUS) && (!bus->usebufpool)) ++ goto gotpkt; ++ ++ ASSERT(bus->rxbuf); ++ /* Set rxctl for frame (w/optional alignment) */ ++ bus->rxctl = bus->rxbuf; ++ if (dhd_alignctl) { ++ bus->rxctl += firstread; ++ if ((pad = ((uintptr)bus->rxctl % DHD_SDALIGN))) ++ bus->rxctl += (DHD_SDALIGN - pad); ++ bus->rxctl -= firstread; ++ } ++ ASSERT(bus->rxctl >= bus->rxbuf); ++ ++ /* Copy the already-read portion over */ ++ bcopy(hdr, bus->rxctl, firstread); ++ if (len <= firstread) ++ goto gotpkt; ++ ++ /* Copy the full data pkt in gSPI case and process ioctl. */ ++ if (bus->bus == SPI_BUS) { ++ bcopy(hdr, bus->rxctl, len); ++ goto gotpkt; ++ } ++ ++ /* Raise rdlen to next SDIO block to avoid tail command */ ++ rdlen = len - firstread; ++ if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) { ++ pad = bus->blocksize - (rdlen % bus->blocksize); ++ if ((pad <= bus->roundup) && (pad < bus->blocksize) && ++ ((len + pad) < bus->dhd->maxctl)) ++ rdlen += pad; ++ } else if (rdlen % DHD_SDALIGN) { ++ rdlen += DHD_SDALIGN - (rdlen % DHD_SDALIGN); ++ } ++ ++ /* Satisfy length-alignment requirements */ ++ if (forcealign && (rdlen & (ALIGNMENT - 1))) ++ rdlen = ROUNDUP(rdlen, ALIGNMENT); ++ ++ /* Drop if the read is too big or it exceeds our maximum */ ++ if ((rdlen + firstread) > bus->dhd->maxctl) { ++ AP6210_ERR("%s: %d-byte control read exceeds %d-byte buffer\n", ++ __FUNCTION__, rdlen, bus->dhd->maxctl); ++ bus->dhd->rx_errors++; ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ goto done; ++ } ++ ++ if ((len - doff) > bus->dhd->maxctl) { ++ AP6210_ERR("%s: %d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n", ++ __FUNCTION__, len, (len - doff), bus->dhd->maxctl); ++ bus->dhd->rx_errors++; bus->rx_toolong++; ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ goto done; ++ } ++ ++ ++ /* Read remainder of frame body into the rxctl buffer */ ++ sdret = dhd_bcmsdh_recv_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, ++ (bus->rxctl + firstread), rdlen, NULL, NULL, NULL); ++ bus->f2rxdata++; ++ ASSERT(sdret != BCME_PENDING); ++ ++ /* Control frame failures need retransmission */ ++ if (sdret < 0) { ++ AP6210_ERR("%s: read %d control bytes failed: %d\n", __FUNCTION__, rdlen, sdret); ++ bus->rxc_errors++; /* dhd.rx_ctlerrs is higher level */ ++ dhdsdio_rxfail(bus, TRUE, TRUE); ++ goto done; ++ } ++ ++gotpkt: ++ ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() && DHD_CTL_ON()) { ++ prhex("RxCtrl", bus->rxctl, len); ++ } ++#endif ++ ++ /* Point to valid data and indicate its length */ ++ bus->rxctl += doff; ++ bus->rxlen = len - doff; ++ ++done: ++ /* Awake any waiters */ ++ dhd_os_ioctl_resp_wake(bus->dhd); ++} ++ ++static uint8 ++dhdsdio_rxglom(dhd_bus_t *bus, uint8 rxseq) ++{ ++ uint16 dlen, totlen; ++ uint8 *dptr, num = 0; ++ ++ uint16 sublen, check; ++ void *pfirst, *plast, *pnext; ++ void * list_tail[DHD_MAX_IFS] = { NULL }; ++ void * list_head[DHD_MAX_IFS] = { NULL }; ++ uint8 idx; ++ osl_t *osh = bus->dhd->osh; ++ ++ int errcode; ++ uint8 chan, seq, doff, sfdoff; ++ uint8 txmax; ++ uchar reorder_info_buf[WLHOST_REORDERDATA_TOTLEN]; ++ uint reorder_info_len; ++ ++ int ifidx = 0; ++ bool usechain = bus->use_rxchain; ++ ++ /* If packets, issue read(s) and send up packet chain */ ++ /* Return sequence numbers consumed? */ ++ ++ AP6210_DEBUG("dhdsdio_rxglom: start: glomd %p glom %p\n", bus->glomd, bus->glom); ++ ++ /* If there's a descriptor, generate the packet chain */ ++ if (bus->glomd) { ++ dhd_os_sdlock_rxq(bus->dhd); ++ ++ pfirst = plast = pnext = NULL; ++ dlen = (uint16)PKTLEN(osh, bus->glomd); ++ dptr = PKTDATA(osh, bus->glomd); ++ if (!dlen || (dlen & 1)) { ++ AP6210_ERR("%s: bad glomd len (%d), ignore descriptor\n", ++ __FUNCTION__, dlen); ++ dlen = 0; ++ } ++ ++ for (totlen = num = 0; dlen; num++) { ++ /* Get (and move past) next length */ ++ sublen = ltoh16_ua(dptr); ++ dlen -= sizeof(uint16); ++ dptr += sizeof(uint16); ++ if ((sublen < SDPCM_HDRLEN_RX) || ++ ((num == 0) && (sublen < (2 * SDPCM_HDRLEN_RX)))) { ++ AP6210_ERR("%s: descriptor len %d bad: %d\n", ++ __FUNCTION__, num, sublen); ++ pnext = NULL; ++ break; ++ } ++ if (sublen % DHD_SDALIGN) { ++ AP6210_ERR("%s: sublen %d not a multiple of %d\n", ++ __FUNCTION__, sublen, DHD_SDALIGN); ++ usechain = FALSE; ++ } ++ totlen += sublen; ++ ++ /* For last frame, adjust read len so total is a block multiple */ ++ if (!dlen) { ++ sublen += (ROUNDUP(totlen, bus->blocksize) - totlen); ++ totlen = ROUNDUP(totlen, bus->blocksize); ++ } ++ ++ /* Allocate/chain packet for next subframe */ ++ if ((pnext = PKTGET(osh, sublen + DHD_SDALIGN, FALSE)) == NULL) { ++ AP6210_ERR("%s: PKTGET failed, num %d len %d\n", ++ __FUNCTION__, num, sublen); ++ break; ++ } ++ ASSERT(!PKTLINK(pnext)); ++ if (!pfirst) { ++ ASSERT(!plast); ++ pfirst = plast = pnext; ++ } else { ++ ASSERT(plast); ++ PKTSETNEXT(osh, plast, pnext); ++ plast = pnext; ++ } ++ ++ /* Adhere to start alignment requirements */ ++ PKTALIGN(osh, pnext, sublen, DHD_SDALIGN); ++ } ++ ++ /* If all allocations succeeded, save packet chain in bus structure */ ++ if (pnext) { ++ AP6210_DEBUG("%s: allocated %d-byte packet chain for %d subframes\n", ++ __FUNCTION__, totlen, num); ++ if (DHD_GLOM_ON() && bus->nextlen) { ++ if (totlen != bus->nextlen) { ++ AP6210_DEBUG("%s: glomdesc mismatch: nextlen %d glomdesc %d " ++ "rxseq %d\n", __FUNCTION__, bus->nextlen, ++ totlen, rxseq); ++ } ++ } ++ bus->glom = pfirst; ++ pfirst = pnext = NULL; ++ } else { ++ if (pfirst) ++ PKTFREE(osh, pfirst, FALSE); ++ bus->glom = NULL; ++ num = 0; ++ } ++ ++ /* Done with descriptor packet */ ++ PKTFREE(osh, bus->glomd, FALSE); ++ bus->glomd = NULL; ++ bus->nextlen = 0; ++ ++ dhd_os_sdunlock_rxq(bus->dhd); ++ } ++ ++ /* Ok -- either we just generated a packet chain, or had one from before */ ++ if (bus->glom) { ++ if (DHD_GLOM_ON()) { ++ AP6210_DEBUG("%s: attempt superframe read, packet chain:\n", __FUNCTION__); ++ for (pnext = bus->glom; pnext; pnext = PKTNEXT(osh, pnext)) { ++ AP6210_DEBUG(" %p: %p len 0x%04x (%d)\n", ++ pnext, (uint8*)PKTDATA(osh, pnext), ++ PKTLEN(osh, pnext), PKTLEN(osh, pnext)); ++ } ++ } ++ ++ pfirst = bus->glom; ++ dlen = (uint16)pkttotlen(osh, pfirst); ++ ++ /* Do an SDIO read for the superframe. Configurable iovar to ++ * read directly into the chained packet, or allocate a large ++ * packet and and copy into the chain. ++ */ ++ if (usechain) { ++ errcode = dhd_bcmsdh_recv_buf(bus, ++ bcmsdh_cur_sbwad(bus->sdh), SDIO_FUNC_2, ++ F2SYNC, (uint8*)PKTDATA(osh, pfirst), ++ dlen, pfirst, NULL, NULL); ++ } else if (bus->dataptr) { ++ errcode = dhd_bcmsdh_recv_buf(bus, ++ bcmsdh_cur_sbwad(bus->sdh), SDIO_FUNC_2, ++ F2SYNC, bus->dataptr, ++ dlen, NULL, NULL, NULL); ++ sublen = (uint16)pktfrombuf(osh, pfirst, 0, dlen, bus->dataptr); ++ if (sublen != dlen) { ++ AP6210_ERR("%s: FAILED TO COPY, dlen %d sublen %d\n", ++ __FUNCTION__, dlen, sublen); ++ errcode = -1; ++ } ++ pnext = NULL; ++ } else { ++ AP6210_ERR("COULDN'T ALLOC %d-BYTE GLOM, FORCE FAILURE\n", dlen); ++ errcode = -1; ++ } ++ bus->f2rxdata++; ++ ASSERT(errcode != BCME_PENDING); ++ ++ /* On failure, kill the superframe, allow a couple retries */ ++ if (errcode < 0) { ++ AP6210_ERR("%s: glom read of %d bytes failed: %d\n", ++ __FUNCTION__, dlen, errcode); ++ bus->dhd->rx_errors++; ++ ++ if (bus->glomerr++ < 3) { ++ dhdsdio_rxfail(bus, TRUE, TRUE); ++ } else { ++ bus->glomerr = 0; ++ dhdsdio_rxfail(bus, TRUE, FALSE); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE(osh, bus->glom, FALSE); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ bus->rxglomfail++; ++ bus->glom = NULL; ++ } ++ return 0; ++ } ++ ++#ifdef DHD_DEBUG ++ if (DHD_GLOM_ON()) { ++ prhex("SUPERFRAME", PKTDATA(osh, pfirst), ++ MIN(PKTLEN(osh, pfirst), 48)); ++ } ++#endif ++ ++ ++ /* Validate the superframe header */ ++ dptr = (uint8 *)PKTDATA(osh, pfirst); ++ sublen = ltoh16_ua(dptr); ++ check = ltoh16_ua(dptr + sizeof(uint16)); ++ ++ chan = SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]); ++ seq = SDPCM_PACKET_SEQUENCE(&dptr[SDPCM_FRAMETAG_LEN]); ++ bus->nextlen = dptr[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET]; ++ if ((bus->nextlen << 4) > MAX_RX_DATASZ) { ++ AP6210_DEBUG("%s: got frame w/nextlen too large (%d) seq %d\n", ++ __FUNCTION__, bus->nextlen, seq); ++ bus->nextlen = 0; ++ } ++ doff = SDPCM_DOFFSET_VALUE(&dptr[SDPCM_FRAMETAG_LEN]); ++ txmax = SDPCM_WINDOW_VALUE(&dptr[SDPCM_FRAMETAG_LEN]); ++ ++ errcode = 0; ++ if ((uint16)~(sublen^check)) { ++ AP6210_ERR("%s (superframe): HW hdr error: len/check 0x%04x/0x%04x\n", ++ __FUNCTION__, sublen, check); ++ errcode = -1; ++ } else if (ROUNDUP(sublen, bus->blocksize) != dlen) { ++ AP6210_ERR("%s (superframe): len 0x%04x, rounded 0x%04x, expect 0x%04x\n", ++ __FUNCTION__, sublen, ROUNDUP(sublen, bus->blocksize), dlen); ++ errcode = -1; ++ } else if (SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]) != SDPCM_GLOM_CHANNEL) { ++ AP6210_ERR("%s (superframe): bad channel %d\n", __FUNCTION__, ++ SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN])); ++ errcode = -1; ++ } else if (SDPCM_GLOMDESC(&dptr[SDPCM_FRAMETAG_LEN])) { ++ AP6210_ERR("%s (superframe): got second descriptor?\n", __FUNCTION__); ++ errcode = -1; ++ } else if ((doff < SDPCM_HDRLEN_RX) || ++ (doff > (PKTLEN(osh, pfirst) - SDPCM_HDRLEN_RX))) { ++ AP6210_ERR("%s (superframe): Bad data offset %d: HW %d pkt %d min %d\n", ++ __FUNCTION__, doff, sublen, PKTLEN(osh, pfirst), ++ SDPCM_HDRLEN_RX); ++ errcode = -1; ++ } ++ ++ /* Check sequence number of superframe SW header */ ++ if (rxseq != seq) { ++ AP6210_DEBUG("%s: (superframe) rx_seq %d, expected %d\n", ++ __FUNCTION__, seq, rxseq); ++ bus->rx_badseq++; ++ rxseq = seq; ++ } ++ ++ /* Check window for sanity */ ++ if ((uint8)(txmax - bus->tx_seq) > 0x40) { ++ AP6210_ERR("%s: got unlikely tx max %d with tx_seq %d\n", ++ __FUNCTION__, txmax, bus->tx_seq); ++ txmax = bus->tx_max; ++ } ++ bus->tx_max = txmax; ++ ++ /* Remove superframe header, remember offset */ ++ PKTPULL(osh, pfirst, doff); ++ sfdoff = doff; ++ ++ /* Validate all the subframe headers */ ++ for (num = 0, pnext = pfirst; pnext && !errcode; ++ num++, pnext = PKTNEXT(osh, pnext)) { ++ dptr = (uint8 *)PKTDATA(osh, pnext); ++ dlen = (uint16)PKTLEN(osh, pnext); ++ sublen = ltoh16_ua(dptr); ++ check = ltoh16_ua(dptr + sizeof(uint16)); ++ chan = SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]); ++ doff = SDPCM_DOFFSET_VALUE(&dptr[SDPCM_FRAMETAG_LEN]); ++#ifdef DHD_DEBUG ++ if (DHD_GLOM_ON()) { ++ prhex("subframe", dptr, 32); ++ } ++#endif ++ ++ if ((uint16)~(sublen^check)) { ++ AP6210_ERR("%s (subframe %d): HW hdr error: " ++ "len/check 0x%04x/0x%04x\n", ++ __FUNCTION__, num, sublen, check); ++ errcode = -1; ++ } else if ((sublen > dlen) || (sublen < SDPCM_HDRLEN_RX)) { ++ AP6210_ERR("%s (subframe %d): length mismatch: " ++ "len 0x%04x, expect 0x%04x\n", ++ __FUNCTION__, num, sublen, dlen); ++ errcode = -1; ++ } else if ((chan != SDPCM_DATA_CHANNEL) && ++ (chan != SDPCM_EVENT_CHANNEL)) { ++ AP6210_ERR("%s (subframe %d): bad channel %d\n", ++ __FUNCTION__, num, chan); ++ errcode = -1; ++ } else if ((doff < SDPCM_HDRLEN_RX) || (doff > sublen)) { ++ AP6210_ERR("%s (subframe %d): Bad data offset %d: HW %d min %d\n", ++ __FUNCTION__, num, doff, sublen, SDPCM_HDRLEN_RX); ++ errcode = -1; ++ } ++ } ++ ++ if (errcode) { ++ /* Terminate frame on error, request a couple retries */ ++ if (bus->glomerr++ < 3) { ++ /* Restore superframe header space */ ++ PKTPUSH(osh, pfirst, sfdoff); ++ dhdsdio_rxfail(bus, TRUE, TRUE); ++ } else { ++ bus->glomerr = 0; ++ dhdsdio_rxfail(bus, TRUE, FALSE); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE(osh, bus->glom, FALSE); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ bus->rxglomfail++; ++ bus->glom = NULL; ++ } ++ bus->nextlen = 0; ++ return 0; ++ } ++ ++ /* Basic SD framing looks ok - process each packet (header) */ ++ bus->glom = NULL; ++ plast = NULL; ++ ++ dhd_os_sdlock_rxq(bus->dhd); ++ for (num = 0; pfirst; rxseq++, pfirst = pnext) { ++ pnext = PKTNEXT(osh, pfirst); ++ PKTSETNEXT(osh, pfirst, NULL); ++ ++ dptr = (uint8 *)PKTDATA(osh, pfirst); ++ sublen = ltoh16_ua(dptr); ++ chan = SDPCM_PACKET_CHANNEL(&dptr[SDPCM_FRAMETAG_LEN]); ++ seq = SDPCM_PACKET_SEQUENCE(&dptr[SDPCM_FRAMETAG_LEN]); ++ doff = SDPCM_DOFFSET_VALUE(&dptr[SDPCM_FRAMETAG_LEN]); ++ ++ AP6210_DEBUG("%s: Get subframe %d, %p(%p/%d), sublen %d chan %d seq %d\n", ++ __FUNCTION__, num, pfirst, PKTDATA(osh, pfirst), ++ PKTLEN(osh, pfirst), sublen, chan, seq); ++ ++ ASSERT((chan == SDPCM_DATA_CHANNEL) || (chan == SDPCM_EVENT_CHANNEL)); ++ ++ if (rxseq != seq) { ++ AP6210_DEBUG("%s: rx_seq %d, expected %d\n", ++ __FUNCTION__, seq, rxseq); ++ bus->rx_badseq++; ++ rxseq = seq; ++ } ++ ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() && DHD_DATA_ON()) { ++ prhex("Rx Subframe Data", dptr, dlen); ++ } ++#endif ++ ++ PKTSETLEN(osh, pfirst, sublen); ++ PKTPULL(osh, pfirst, doff); ++ ++ reorder_info_len = sizeof(reorder_info_buf); ++ ++ if (PKTLEN(osh, pfirst) == 0) { ++ PKTFREE(bus->dhd->osh, pfirst, FALSE); ++ continue; ++ } else if (dhd_prot_hdrpull(bus->dhd, &ifidx, pfirst, reorder_info_buf, ++ &reorder_info_len) != 0) { ++ AP6210_ERR("%s: rx protocol error\n", __FUNCTION__); ++ bus->dhd->rx_errors++; ++ PKTFREE(osh, pfirst, FALSE); ++ continue; ++ } ++ if (reorder_info_len) { ++ uint32 free_buf_count; ++ void *ppfirst; ++ ++ ppfirst = pfirst; ++ /* Reordering info from the firmware */ ++ dhd_process_pkt_reorder_info(bus->dhd, reorder_info_buf, ++ reorder_info_len, &ppfirst, &free_buf_count); ++ ++ if (free_buf_count == 0) { ++ continue; ++ } ++ else { ++ void *temp; ++ ++ /* go to the end of the chain and attach the pnext there */ ++ temp = ppfirst; ++ while (PKTNEXT(osh, temp) != NULL) { ++ temp = PKTNEXT(osh, temp); ++ } ++ pfirst = temp; ++ if (list_tail[ifidx] == NULL) { ++ list_head[ifidx] = ppfirst; ++ list_tail[ifidx] = pfirst; ++ } ++ else { ++ PKTSETNEXT(osh, list_tail[ifidx], ppfirst); ++ list_tail[ifidx] = pfirst; ++ } ++ } ++ ++ num += (uint8)free_buf_count; ++ } ++ else { ++ /* this packet will go up, link back into chain and count it */ ++ ++ if (list_tail[ifidx] == NULL) { ++ list_head[ifidx] = list_tail[ifidx] = pfirst; ++ } ++ else { ++ PKTSETNEXT(osh, list_tail[ifidx], pfirst); ++ list_tail[ifidx] = pfirst; ++ } ++ num++; ++ } ++#ifdef DHD_DEBUG ++ if (DHD_GLOM_ON()) { ++ AP6210_DEBUG("%s subframe %d to stack, %p(%p/%d) nxt/lnk %p/%p\n", ++ __FUNCTION__, num, pfirst, ++ PKTDATA(osh, pfirst), PKTLEN(osh, pfirst), ++ PKTNEXT(osh, pfirst), PKTLINK(pfirst)); ++ prhex("", (uint8 *)PKTDATA(osh, pfirst), ++ MIN(PKTLEN(osh, pfirst), 32)); ++ } ++#endif /* DHD_DEBUG */ ++ } ++ dhd_os_sdunlock_rxq(bus->dhd); ++ ++ for (idx = 0; idx < DHD_MAX_IFS; idx++) { ++ if (list_head[idx]) { ++ void *temp; ++ uint8 cnt = 0; ++ temp = list_head[idx]; ++ do { ++ temp = PKTNEXT(osh, temp); ++ cnt++; ++ } while (temp); ++ if (cnt) { ++ dhd_os_sdunlock(bus->dhd); ++ dhd_rx_frame(bus->dhd, idx, list_head[idx], cnt, 0); ++ dhd_os_sdlock(bus->dhd); ++ } ++ } ++ } ++ bus->rxglomframes++; ++ bus->rxglompkts += num; ++ } ++ return num; ++} ++ ++ ++/* Return TRUE if there may be more frames to read */ ++static uint ++dhdsdio_readframes(dhd_bus_t *bus, uint maxframes, bool *finished) ++{ ++ osl_t *osh = bus->dhd->osh; ++ bcmsdh_info_t *sdh = bus->sdh; ++ ++ uint16 len, check; /* Extracted hardware header fields */ ++ uint8 chan, seq, doff; /* Extracted software header fields */ ++ uint8 fcbits; /* Extracted fcbits from software header */ ++ uint8 delta; ++ ++ void *pkt; /* Packet for event or data frames */ ++ uint16 pad; /* Number of pad bytes to read */ ++ uint16 rdlen; /* Total number of bytes to read */ ++ uint8 rxseq; /* Next sequence number to expect */ ++ uint rxleft = 0; /* Remaining number of frames allowed */ ++ int sdret; /* Return code from bcmsdh calls */ ++ uint8 txmax; /* Maximum tx sequence offered */ ++ bool len_consistent; /* Result of comparing readahead len and len from hw-hdr */ ++ uint8 *rxbuf; ++ int ifidx = 0; ++ uint rxcount = 0; /* Total frames read */ ++ uchar reorder_info_buf[WLHOST_REORDERDATA_TOTLEN]; ++ uint reorder_info_len; ++ uint pkt_count; ++ ++#if defined(DHD_DEBUG) || defined(SDTEST) ++ bool sdtest = FALSE; /* To limit message spew from test mode */ ++#endif ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ bus->readframes = TRUE; ++ ++ if (!KSO_ENAB(bus)) { ++ AP6210_DEBUG("%s: KSO off\n", __FUNCTION__); ++ bus->readframes = FALSE; ++ return 0; ++ } ++ ++ ASSERT(maxframes); ++ ++#ifdef SDTEST ++ /* Allow pktgen to override maxframes */ ++ if (bus->pktgen_count && (bus->pktgen_mode == DHD_PKTGEN_RECV)) { ++ maxframes = bus->pktgen_count; ++ sdtest = TRUE; ++ } ++#endif ++ ++ /* Not finished unless we encounter no more frames indication */ ++ *finished = FALSE; ++ ++ ++ for (rxseq = bus->rx_seq, rxleft = maxframes; ++ !bus->rxskip && rxleft && bus->dhd->busstate != DHD_BUS_DOWN; ++ rxseq++, rxleft--) { ++ ++#ifdef DHDTHREAD ++ /* terence: fix got unlikely tx max for 43362a0*/ ++ if (bus->sih->chip!=BCM43362_CHIP_ID && bus->sih->chiprev!=BCM43362A0_CHIP_REV) { ++ /* tx more to improve rx performance */ ++ if ((bus->clkstate == CLK_AVAIL) && !bus->fcstate && ++ pktq_mlen(&bus->txq, ~bus->flowcontrol) && DATAOK(bus)) { ++ dhdsdio_sendfromq(bus, dhd_txbound); ++ } ++ } ++#endif /* DHDTHREAD */ ++ ++ /* Handle glomming separately */ ++ if (bus->glom || bus->glomd) { ++ uint8 cnt; ++ AP6210_DEBUG("%s: calling rxglom: glomd %p, glom %p\n", ++ __FUNCTION__, bus->glomd, bus->glom); ++ cnt = dhdsdio_rxglom(bus, rxseq); ++ AP6210_DEBUG("%s: rxglom returned %d\n", __FUNCTION__, cnt); ++ rxseq += cnt - 1; ++ rxleft = (rxleft > cnt) ? (rxleft - cnt) : 1; ++ continue; ++ } ++ ++ /* Try doing single read if we can */ ++ if (dhd_readahead && bus->nextlen) { ++ uint16 nextlen = bus->nextlen; ++ bus->nextlen = 0; ++ ++ if (bus->bus == SPI_BUS) { ++ rdlen = len = nextlen; ++ } ++ else { ++ rdlen = len = nextlen << 4; ++ ++ /* Pad read to blocksize for efficiency */ ++ if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) { ++ pad = bus->blocksize - (rdlen % bus->blocksize); ++ if ((pad <= bus->roundup) && (pad < bus->blocksize) && ++ ((rdlen + pad + firstread) < MAX_RX_DATASZ)) ++ rdlen += pad; ++ } else if (rdlen % DHD_SDALIGN) { ++ rdlen += DHD_SDALIGN - (rdlen % DHD_SDALIGN); ++ } ++ } ++ ++ /* We use bus->rxctl buffer in WinXP for initial control pkt receives. ++ * Later we use buffer-poll for data as well as control packets. ++ * This is required because dhd receives full frame in gSPI unlike SDIO. ++ * After the frame is received we have to distinguish whether it is data ++ * or non-data frame. ++ */ ++ /* Allocate a packet buffer */ ++ dhd_os_sdlock_rxq(bus->dhd); ++ if (!(pkt = PKTGET(osh, rdlen + DHD_SDALIGN, FALSE))) { ++ if (bus->bus == SPI_BUS) { ++ bus->usebufpool = FALSE; ++ bus->rxctl = bus->rxbuf; ++ if (dhd_alignctl) { ++ bus->rxctl += firstread; ++ if ((pad = ((uintptr)bus->rxctl % DHD_SDALIGN))) ++ bus->rxctl += (DHD_SDALIGN - pad); ++ bus->rxctl -= firstread; ++ } ++ ASSERT(bus->rxctl >= bus->rxbuf); ++ rxbuf = bus->rxctl; ++ /* Read the entire frame */ ++ sdret = dhd_bcmsdh_recv_buf(bus, ++ bcmsdh_cur_sbwad(sdh), ++ SDIO_FUNC_2, ++ F2SYNC, rxbuf, rdlen, ++ NULL, NULL, NULL); ++ bus->f2rxdata++; ++ ASSERT(sdret != BCME_PENDING); ++ ++ ++ /* Control frame failures need retransmission */ ++ if (sdret < 0) { ++ AP6210_ERR("%s: read %d control bytes failed: %d\n", ++ __FUNCTION__, rdlen, sdret); ++ /* dhd.rx_ctlerrs is higher level */ ++ bus->rxc_errors++; ++ dhd_os_sdunlock_rxq(bus->dhd); ++ dhdsdio_rxfail(bus, TRUE, ++ (bus->bus == SPI_BUS) ? FALSE : TRUE); ++ continue; ++ } ++ } else { ++ /* Give up on data, request rtx of events */ ++ AP6210_ERR("%s (nextlen): PKTGET failed: len %d rdlen %d " ++ "expected rxseq %d\n", ++ __FUNCTION__, len, rdlen, rxseq); ++ /* Just go try again w/normal header read */ ++ dhd_os_sdunlock_rxq(bus->dhd); ++ continue; ++ } ++ } else { ++ if (bus->bus == SPI_BUS) ++ bus->usebufpool = TRUE; ++ ++ ASSERT(!PKTLINK(pkt)); ++ PKTALIGN(osh, pkt, rdlen, DHD_SDALIGN); ++ rxbuf = (uint8 *)PKTDATA(osh, pkt); ++ /* Read the entire frame */ ++ sdret = dhd_bcmsdh_recv_buf(bus, bcmsdh_cur_sbwad(sdh), ++ SDIO_FUNC_2, ++ F2SYNC, rxbuf, rdlen, ++ pkt, NULL, NULL); ++ bus->f2rxdata++; ++ ASSERT(sdret != BCME_PENDING); ++ ++ if (sdret < 0) { ++ AP6210_ERR("%s (nextlen): read %d bytes failed: %d\n", ++ __FUNCTION__, rdlen, sdret); ++ PKTFREE(bus->dhd->osh, pkt, FALSE); ++ bus->dhd->rx_errors++; ++ dhd_os_sdunlock_rxq(bus->dhd); ++ /* Force retry w/normal header read. Don't attempt NAK for ++ * gSPI ++ */ ++ dhdsdio_rxfail(bus, TRUE, ++ (bus->bus == SPI_BUS) ? FALSE : TRUE); ++ continue; ++ } ++ } ++ dhd_os_sdunlock_rxq(bus->dhd); ++ ++ /* Now check the header */ ++ bcopy(rxbuf, bus->rxhdr, SDPCM_HDRLEN_RX); ++ ++ /* Extract hardware header fields */ ++ len = ltoh16_ua(bus->rxhdr); ++ check = ltoh16_ua(bus->rxhdr + sizeof(uint16)); ++ ++ /* All zeros means readahead info was bad */ ++ if (!(len|check)) { ++ AP6210_DEBUG("%s (nextlen): read zeros in HW header???\n", ++ __FUNCTION__); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE2(); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ GSPI_PR55150_BAILOUT; ++ continue; ++ } ++ ++ /* Validate check bytes */ ++ if ((uint16)~(len^check)) { ++ AP6210_ERR("%s (nextlen): HW hdr error: nextlen/len/check" ++ " 0x%04x/0x%04x/0x%04x\n", __FUNCTION__, nextlen, ++ len, check); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE2(); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ bus->rx_badhdr++; ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ GSPI_PR55150_BAILOUT; ++ continue; ++ } ++ ++ /* Validate frame length */ ++ if (len < SDPCM_HDRLEN_RX) { ++ AP6210_ERR("%s (nextlen): HW hdr length invalid: %d\n", ++ __FUNCTION__, len); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE2(); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ GSPI_PR55150_BAILOUT; ++ continue; ++ } ++ ++ /* Check for consistency with readahead info */ ++ len_consistent = (nextlen != (ROUNDUP(len, 16) >> 4)); ++ if (len_consistent) { ++ /* Mismatch, force retry w/normal header (may be >4K) */ ++ AP6210_ERR("%s (nextlen): mismatch, nextlen %d len %d rnd %d; " ++ "expected rxseq %d\n", ++ __FUNCTION__, nextlen, len, ROUNDUP(len, 16), rxseq); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE2(); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ dhdsdio_rxfail(bus, TRUE, (bus->bus == SPI_BUS) ? FALSE : TRUE); ++ GSPI_PR55150_BAILOUT; ++ continue; ++ } ++ ++ ++ /* Extract software header fields */ ++ chan = SDPCM_PACKET_CHANNEL(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ seq = SDPCM_PACKET_SEQUENCE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ doff = SDPCM_DOFFSET_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ txmax = SDPCM_WINDOW_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ ++ bus->nextlen = ++ bus->rxhdr[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET]; ++ if ((bus->nextlen << 4) > MAX_RX_DATASZ) { ++ AP6210_DEBUG("%s (nextlen): got frame w/nextlen too large" ++ " (%d), seq %d\n", __FUNCTION__, bus->nextlen, ++ seq); ++ bus->nextlen = 0; ++ } ++ ++ bus->dhd->rx_readahead_cnt ++; ++ /* Handle Flow Control */ ++ fcbits = SDPCM_FCMASK_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ ++ delta = 0; ++ if (~bus->flowcontrol & fcbits) { ++ bus->fc_xoff++; ++ delta = 1; ++ } ++ if (bus->flowcontrol & ~fcbits) { ++ bus->fc_xon++; ++ delta = 1; ++ } ++ ++ if (delta) { ++ bus->fc_rcvd++; ++ bus->flowcontrol = fcbits; ++ } ++ ++ /* Check and update sequence number */ ++ if (rxseq != seq) { ++ AP6210_DEBUG("%s (nextlen): rx_seq %d, expected %d\n", ++ __FUNCTION__, seq, rxseq); ++ bus->rx_badseq++; ++ rxseq = seq; ++ } ++ ++ /* Check window for sanity */ ++ if ((uint8)(txmax - bus->tx_seq) > 0x40) { ++ AP6210_ERR("%s: got unlikely tx max %d with tx_seq %d\n", ++ __FUNCTION__, txmax, bus->tx_seq); ++ txmax = bus->tx_max; ++ } ++ bus->tx_max = txmax; ++ ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() && DHD_DATA_ON()) { ++ prhex("Rx Data", rxbuf, len); ++ } else if (DHD_HDRS_ON()) { ++ prhex("RxHdr", bus->rxhdr, SDPCM_HDRLEN_RX); ++ } ++#endif ++ ++ if (chan == SDPCM_CONTROL_CHANNEL) { ++ if (bus->bus == SPI_BUS) { ++ dhdsdio_read_control(bus, rxbuf, len, doff); ++ if (bus->usebufpool) { ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE(bus->dhd->osh, pkt, FALSE); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ } ++ continue; ++ } else { ++ AP6210_ERR("%s (nextlen): readahead on control" ++ " packet %d?\n", __FUNCTION__, seq); ++ /* Force retry w/normal header read */ ++ bus->nextlen = 0; ++ dhdsdio_rxfail(bus, FALSE, TRUE); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE2(); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ continue; ++ } ++ } ++ ++ if ((bus->bus == SPI_BUS) && !bus->usebufpool) { ++ AP6210_ERR("Received %d bytes on %d channel. Running out of " ++ "rx pktbuf's or not yet malloced.\n", len, chan); ++ continue; ++ } ++ ++ /* Validate data offset */ ++ if ((doff < SDPCM_HDRLEN_RX) || (doff > len)) { ++ AP6210_ERR("%s (nextlen): bad data offset %d: HW len %d min %d\n", ++ __FUNCTION__, doff, len, SDPCM_HDRLEN_RX); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE2(); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ ASSERT(0); ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ continue; ++ } ++ ++ /* All done with this one -- now deliver the packet */ ++ goto deliver; ++ } ++ /* gSPI frames should not be handled in fractions */ ++ if (bus->bus == SPI_BUS) { ++ break; ++ } ++ ++ /* Read frame header (hardware and software) */ ++ sdret = dhd_bcmsdh_recv_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, ++ bus->rxhdr, firstread, NULL, NULL, NULL); ++ bus->f2rxhdrs++; ++ ASSERT(sdret != BCME_PENDING); ++ ++ if (sdret < 0) { ++ AP6210_ERR("%s: RXHEADER FAILED: %d\n", __FUNCTION__, sdret); ++ bus->rx_hdrfail++; ++ dhdsdio_rxfail(bus, TRUE, TRUE); ++ continue; ++ } ++ ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() || DHD_HDRS_ON()) { ++ prhex("RxHdr", bus->rxhdr, SDPCM_HDRLEN_RX); ++ } ++#endif ++ ++ /* Extract hardware header fields */ ++ len = ltoh16_ua(bus->rxhdr); ++ check = ltoh16_ua(bus->rxhdr + sizeof(uint16)); ++ ++ /* All zeros means no more frames */ ++ if (!(len|check)) { ++ *finished = TRUE; ++ break; ++ } ++ ++ /* Validate check bytes */ ++ if ((uint16)~(len^check)) { ++ AP6210_ERR("%s: HW hdr error: len/check 0x%04x/0x%04x\n", ++ __FUNCTION__, len, check); ++ bus->rx_badhdr++; ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ continue; ++ } ++ ++ /* Validate frame length */ ++ if (len < SDPCM_HDRLEN_RX) { ++ AP6210_ERR("%s: HW hdr length invalid: %d\n", __FUNCTION__, len); ++ continue; ++ } ++ ++ /* Extract software header fields */ ++ chan = SDPCM_PACKET_CHANNEL(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ seq = SDPCM_PACKET_SEQUENCE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ doff = SDPCM_DOFFSET_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ txmax = SDPCM_WINDOW_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ ++ /* Validate data offset */ ++ if ((doff < SDPCM_HDRLEN_RX) || (doff > len)) { ++ AP6210_ERR("%s: Bad data offset %d: HW len %d, min %d seq %d\n", ++ __FUNCTION__, doff, len, SDPCM_HDRLEN_RX, seq); ++ bus->rx_badhdr++; ++ ASSERT(0); ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ continue; ++ } ++ ++ /* Save the readahead length if there is one */ ++ bus->nextlen = bus->rxhdr[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET]; ++ if ((bus->nextlen << 4) > MAX_RX_DATASZ) { ++ AP6210_DEBUG("%s (nextlen): got frame w/nextlen too large (%d), seq %d\n", ++ __FUNCTION__, bus->nextlen, seq); ++ bus->nextlen = 0; ++ } ++ ++ /* Handle Flow Control */ ++ fcbits = SDPCM_FCMASK_VALUE(&bus->rxhdr[SDPCM_FRAMETAG_LEN]); ++ ++ delta = 0; ++ if (~bus->flowcontrol & fcbits) { ++ bus->fc_xoff++; ++ delta = 1; ++ } ++ if (bus->flowcontrol & ~fcbits) { ++ bus->fc_xon++; ++ delta = 1; ++ } ++ ++ if (delta) { ++ bus->fc_rcvd++; ++ bus->flowcontrol = fcbits; ++ } ++ ++ /* Check and update sequence number */ ++ if (rxseq != seq) { ++ AP6210_DEBUG("%s: rx_seq %d, expected %d\n", __FUNCTION__, seq, rxseq); ++ bus->rx_badseq++; ++ rxseq = seq; ++ } ++ ++ /* Check window for sanity */ ++ if ((uint8)(txmax - bus->tx_seq) > 0x40) { ++ AP6210_ERR("%s: got unlikely tx max %d with tx_seq %d\n", ++ __FUNCTION__, txmax, bus->tx_seq); ++ txmax = bus->tx_max; ++ } ++ bus->tx_max = txmax; ++ ++ /* Call a separate function for control frames */ ++ if (chan == SDPCM_CONTROL_CHANNEL) { ++ dhdsdio_read_control(bus, bus->rxhdr, len, doff); ++ continue; ++ } ++ ++ ASSERT((chan == SDPCM_DATA_CHANNEL) || (chan == SDPCM_EVENT_CHANNEL) || ++ (chan == SDPCM_TEST_CHANNEL) || (chan == SDPCM_GLOM_CHANNEL)); ++ ++ /* Length to read */ ++ rdlen = (len > firstread) ? (len - firstread) : 0; ++ ++ /* May pad read to blocksize for efficiency */ ++ if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) { ++ pad = bus->blocksize - (rdlen % bus->blocksize); ++ if ((pad <= bus->roundup) && (pad < bus->blocksize) && ++ ((rdlen + pad + firstread) < MAX_RX_DATASZ)) ++ rdlen += pad; ++ } else if (rdlen % DHD_SDALIGN) { ++ rdlen += DHD_SDALIGN - (rdlen % DHD_SDALIGN); ++ } ++ ++ /* Satisfy length-alignment requirements */ ++ if (forcealign && (rdlen & (ALIGNMENT - 1))) ++ rdlen = ROUNDUP(rdlen, ALIGNMENT); ++ ++ if ((rdlen + firstread) > MAX_RX_DATASZ) { ++ /* Too long -- skip this frame */ ++ AP6210_ERR("%s: too long: len %d rdlen %d\n", __FUNCTION__, len, rdlen); ++ bus->dhd->rx_errors++; bus->rx_toolong++; ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ continue; ++ } ++ ++ dhd_os_sdlock_rxq(bus->dhd); ++ if (!(pkt = PKTGET(osh, (rdlen + firstread + DHD_SDALIGN), FALSE))) { ++ /* Give up on data, request rtx of events */ ++ AP6210_ERR("%s: PKTGET failed: rdlen %d chan %d\n", ++ __FUNCTION__, rdlen, chan); ++ bus->dhd->rx_dropped++; ++ dhd_os_sdunlock_rxq(bus->dhd); ++ dhdsdio_rxfail(bus, FALSE, RETRYCHAN(chan)); ++ continue; ++ } ++ dhd_os_sdunlock_rxq(bus->dhd); ++ ++ ASSERT(!PKTLINK(pkt)); ++ ++ /* Leave room for what we already read, and align remainder */ ++ ASSERT(firstread < (PKTLEN(osh, pkt))); ++ PKTPULL(osh, pkt, firstread); ++ PKTALIGN(osh, pkt, rdlen, DHD_SDALIGN); ++ ++ /* Read the remaining frame data */ ++ sdret = dhd_bcmsdh_recv_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, ++ ((uint8 *)PKTDATA(osh, pkt)), rdlen, pkt, NULL, NULL); ++ bus->f2rxdata++; ++ ASSERT(sdret != BCME_PENDING); ++ ++ if (sdret < 0) { ++ AP6210_ERR("%s: read %d %s bytes failed: %d\n", __FUNCTION__, rdlen, ++ ((chan == SDPCM_EVENT_CHANNEL) ? "event" : ++ ((chan == SDPCM_DATA_CHANNEL) ? "data" : "test")), sdret); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE(bus->dhd->osh, pkt, FALSE); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ bus->dhd->rx_errors++; ++ dhdsdio_rxfail(bus, TRUE, RETRYCHAN(chan)); ++ continue; ++ } ++ ++ /* Copy the already-read portion */ ++ PKTPUSH(osh, pkt, firstread); ++ bcopy(bus->rxhdr, PKTDATA(osh, pkt), firstread); ++ ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() && DHD_DATA_ON()) { ++ prhex("Rx Data", PKTDATA(osh, pkt), len); ++ } ++#endif ++ ++deliver: ++ /* Save superframe descriptor and allocate packet frame */ ++ if (chan == SDPCM_GLOM_CHANNEL) { ++ if (SDPCM_GLOMDESC(&bus->rxhdr[SDPCM_FRAMETAG_LEN])) { ++ AP6210_DEBUG("%s: got glom descriptor, %d bytes:\n", ++ __FUNCTION__, len); ++#ifdef DHD_DEBUG ++ if (DHD_GLOM_ON()) { ++ prhex("Glom Data", PKTDATA(osh, pkt), len); ++ } ++#endif ++ PKTSETLEN(osh, pkt, len); ++ ASSERT(doff == SDPCM_HDRLEN_RX); ++ PKTPULL(osh, pkt, SDPCM_HDRLEN_RX); ++ bus->glomd = pkt; ++ } else { ++ AP6210_ERR("%s: glom superframe w/o descriptor!\n", __FUNCTION__); ++ dhdsdio_rxfail(bus, FALSE, FALSE); ++ } ++ continue; ++ } ++ ++ /* Fill in packet len and prio, deliver upward */ ++ PKTSETLEN(osh, pkt, len); ++ PKTPULL(osh, pkt, doff); ++ ++#ifdef SDTEST ++ /* Test channel packets are processed separately */ ++ if (chan == SDPCM_TEST_CHANNEL) { ++ dhdsdio_testrcv(bus, pkt, seq); ++ continue; ++ } ++#endif /* SDTEST */ ++ ++ if (PKTLEN(osh, pkt) == 0) { ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE(bus->dhd->osh, pkt, FALSE); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ continue; ++ } else if (dhd_prot_hdrpull(bus->dhd, &ifidx, pkt, reorder_info_buf, ++ &reorder_info_len) != 0) { ++ AP6210_ERR("%s: rx protocol error\n", __FUNCTION__); ++ dhd_os_sdlock_rxq(bus->dhd); ++ PKTFREE(bus->dhd->osh, pkt, FALSE); ++ dhd_os_sdunlock_rxq(bus->dhd); ++ bus->dhd->rx_errors++; ++ continue; ++ } ++ if (reorder_info_len) { ++ /* Reordering info from the firmware */ ++ dhd_process_pkt_reorder_info(bus->dhd, reorder_info_buf, reorder_info_len, ++ &pkt, &pkt_count); ++ if (pkt_count == 0) ++ continue; ++ } ++ else ++ pkt_count = 1; ++ ++ ++ /* Unlock during rx call */ ++ dhd_os_sdunlock(bus->dhd); ++ dhd_rx_frame(bus->dhd, ifidx, pkt, pkt_count, chan); ++ dhd_os_sdlock(bus->dhd); ++ } ++ rxcount = maxframes - rxleft; ++#ifdef DHD_DEBUG ++ /* Message if we hit the limit */ ++ if (!rxleft && !sdtest) ++ AP6210_DEBUG("%s: hit rx limit of %d frames\n", __FUNCTION__, maxframes); ++ else ++#endif /* DHD_DEBUG */ ++ AP6210_DEBUG("%s: processed %d frames\n", __FUNCTION__, rxcount); ++ /* Back off rxseq if awaiting rtx, update rx_seq */ ++ if (bus->rxskip) ++ rxseq--; ++ bus->rx_seq = rxseq; ++ ++ if (bus->reqbussleep) ++ { ++ dhdsdio_bussleep(bus, TRUE); ++ bus->reqbussleep = FALSE; ++ } ++ bus->readframes = FALSE; ++ ++ return rxcount; ++} ++ ++static uint32 ++dhdsdio_hostmail(dhd_bus_t *bus) ++{ ++ sdpcmd_regs_t *regs = bus->regs; ++ uint32 intstatus = 0; ++ uint32 hmb_data; ++ uint8 fcbits; ++ uint retries = 0; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ /* Read mailbox data and ack that we did so */ ++ R_SDREG(hmb_data, ®s->tohostmailboxdata, retries); ++ if (retries <= retry_limit) ++ W_SDREG(SMB_INT_ACK, ®s->tosbmailbox, retries); ++ bus->f1regdata += 2; ++ ++ /* Dongle recomposed rx frames, accept them again */ ++ if (hmb_data & HMB_DATA_NAKHANDLED) { ++ AP6210_DEBUG("Dongle reports NAK handled, expect rtx of %d\n", bus->rx_seq); ++ if (!bus->rxskip) { ++ AP6210_ERR("%s: unexpected NAKHANDLED!\n", __FUNCTION__); ++ } ++ bus->rxskip = FALSE; ++ intstatus |= FRAME_AVAIL_MASK(bus); ++ } ++ ++ /* ++ * DEVREADY does not occur with gSPI. ++ */ ++ if (hmb_data & (HMB_DATA_DEVREADY | HMB_DATA_FWREADY)) { ++ bus->sdpcm_ver = (hmb_data & HMB_DATA_VERSION_MASK) >> HMB_DATA_VERSION_SHIFT; ++ if (bus->sdpcm_ver != SDPCM_PROT_VERSION) ++ AP6210_ERR("Version mismatch, dongle reports %d, expecting %d\n", ++ bus->sdpcm_ver, SDPCM_PROT_VERSION); ++ else ++ AP6210_ERR("Dongle ready, protocol version %d\n", bus->sdpcm_ver); ++ /* make sure for the SDIO_DEVICE_RXDATAINT_MODE_1 corecontrol is proper */ ++ if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev >= 4) && ++ (bus->rxint_mode == SDIO_DEVICE_RXDATAINT_MODE_1)) { ++ uint32 val; ++ ++ val = R_REG(bus->dhd->osh, &bus->regs->corecontrol); ++ val &= ~CC_XMTDATAAVAIL_MODE; ++ val |= CC_XMTDATAAVAIL_CTRL; ++ W_REG(bus->dhd->osh, &bus->regs->corecontrol, val); ++ ++ val = R_REG(bus->dhd->osh, &bus->regs->corecontrol); ++ } ++ ++#ifdef DHD_DEBUG ++ /* Retrieve console state address now that firmware should have updated it */ ++ { ++ sdpcm_shared_t shared; ++ if (dhdsdio_readshared(bus, &shared) == 0) ++ bus->console_addr = shared.console_addr; ++ } ++#endif /* DHD_DEBUG */ ++ } ++ ++ /* ++ * Flow Control has been moved into the RX headers and this out of band ++ * method isn't used any more. Leave this here for possibly remaining backward ++ * compatible with older dongles ++ */ ++ if (hmb_data & HMB_DATA_FC) { ++ fcbits = (hmb_data & HMB_DATA_FCDATA_MASK) >> HMB_DATA_FCDATA_SHIFT; ++ ++ if (fcbits & ~bus->flowcontrol) ++ bus->fc_xoff++; ++ if (bus->flowcontrol & ~fcbits) ++ bus->fc_xon++; ++ ++ bus->fc_rcvd++; ++ bus->flowcontrol = fcbits; ++ } ++ ++#ifdef DHD_DEBUG ++ /* At least print a message if FW halted */ ++ if (hmb_data & HMB_DATA_FWHALT) { ++ AP6210_ERR("INTERNAL ERROR: FIRMWARE HALTED : set BUS DOWN\n"); ++ dhdsdio_checkdied(bus, NULL, 0); ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ } ++#endif /* DHD_DEBUG */ ++ ++ /* Shouldn't be any others */ ++ if (hmb_data & ~(HMB_DATA_DEVREADY | ++ HMB_DATA_FWHALT | ++ HMB_DATA_NAKHANDLED | ++ HMB_DATA_FC | ++ HMB_DATA_FWREADY | ++ HMB_DATA_FCDATA_MASK | ++ HMB_DATA_VERSION_MASK)) { ++ AP6210_ERR("Unknown mailbox data content: 0x%02x\n", hmb_data); ++ } ++ ++ return intstatus; ++} ++ ++static bool ++dhdsdio_dpc(dhd_bus_t *bus) ++{ ++ bcmsdh_info_t *sdh = bus->sdh; ++ sdpcmd_regs_t *regs = bus->regs; ++ uint32 intstatus, newstatus = 0; ++ uint retries = 0; ++ uint rxlimit = dhd_rxbound; /* Rx frames to read before resched */ ++ uint txlimit = dhd_txbound; /* Tx frames to send before resched */ ++ uint framecnt = 0; /* Temporary counter of tx/rx frames */ ++ bool rxdone = TRUE; /* Flag for no more read data */ ++ bool resched = FALSE; /* Flag indicating resched wanted */ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus->dhd->busstate == DHD_BUS_DOWN) { ++ AP6210_ERR("%s: Bus down, ret\n", __FUNCTION__); ++ bus->intstatus = 0; ++ return 0; ++ } ++ ++ /* Start with leftover status bits */ ++ intstatus = bus->intstatus; ++ ++ dhd_os_sdlock(bus->dhd); ++ ++ if (!SLPAUTO_ENAB(bus) && !KSO_ENAB(bus)) { ++ AP6210_ERR("%s: Device asleep\n", __FUNCTION__); ++ goto exit; ++ } ++ ++ /* If waiting for HTAVAIL, check status */ ++ if (!SLPAUTO_ENAB(bus) && (bus->clkstate == CLK_PENDING)) { ++ int err; ++ uint8 clkctl, devctl = 0; ++ ++#ifdef DHD_DEBUG ++ /* Check for inconsistent device control */ ++ devctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); ++ if (err) { ++ AP6210_ERR("%s: error reading DEVCTL: %d\n", __FUNCTION__, err); ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ } else { ++ ASSERT(devctl & SBSDIO_DEVCTL_CA_INT_ONLY); ++ } ++#endif /* DHD_DEBUG */ ++ ++ /* Read CSR, if clock on switch to AVAIL, else ignore */ ++ clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); ++ if (err) { ++ AP6210_ERR("%s: error reading CSR: %d\n", __FUNCTION__, err); ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ } ++ ++ AP6210_DEBUG("DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n", devctl, clkctl); ++ ++ if (SBSDIO_HTAV(clkctl)) { ++ devctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, &err); ++ if (err) { ++ AP6210_ERR("%s: error reading DEVCTL: %d\n", ++ __FUNCTION__, err); ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ } ++ devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_DEVICE_CTL, devctl, &err); ++ if (err) { ++ AP6210_ERR("%s: error writing DEVCTL: %d\n", ++ __FUNCTION__, err); ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ } ++ bus->clkstate = CLK_AVAIL; ++ } else { ++ goto clkwait; ++ } ++ } ++ ++ BUS_WAKE(bus); ++ ++ /* Make sure backplane clock is on */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, TRUE); ++ if (bus->clkstate != CLK_AVAIL) ++ goto clkwait; ++ ++ /* Pending interrupt indicates new device status */ ++ if (bus->ipend) { ++ bus->ipend = FALSE; ++ R_SDREG(newstatus, ®s->intstatus, retries); ++ bus->f1regdata++; ++ if (bcmsdh_regfail(bus->sdh)) ++ newstatus = 0; ++ newstatus &= bus->hostintmask; ++ bus->fcstate = !!(newstatus & I_HMB_FC_STATE); ++ if (newstatus) { ++ bus->f1regdata++; ++ if ((bus->rxint_mode == SDIO_DEVICE_RXDATAINT_MODE_0) && ++ (newstatus == I_XMTDATA_AVAIL)) { ++ } ++ else ++ W_SDREG(newstatus, ®s->intstatus, retries); ++ } ++ } ++ ++ /* Merge new bits with previous */ ++ intstatus |= newstatus; ++ bus->intstatus = 0; ++ ++ /* Handle flow-control change: read new state in case our ack ++ * crossed another change interrupt. If change still set, assume ++ * FC ON for safety, let next loop through do the debounce. ++ */ ++ if (intstatus & I_HMB_FC_CHANGE) { ++ intstatus &= ~I_HMB_FC_CHANGE; ++ W_SDREG(I_HMB_FC_CHANGE, ®s->intstatus, retries); ++ R_SDREG(newstatus, ®s->intstatus, retries); ++ bus->f1regdata += 2; ++ bus->fcstate = !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE)); ++ intstatus |= (newstatus & bus->hostintmask); ++ } ++ ++ /* Just being here means nothing more to do for chipactive */ ++ if (intstatus & I_CHIPACTIVE) { ++ /* ASSERT(bus->clkstate == CLK_AVAIL); */ ++ intstatus &= ~I_CHIPACTIVE; ++ } ++ ++ /* Handle host mailbox indication */ ++ if (intstatus & I_HMB_HOST_INT) { ++ intstatus &= ~I_HMB_HOST_INT; ++ intstatus |= dhdsdio_hostmail(bus); ++ } ++ ++ /* Generally don't ask for these, can get CRC errors... */ ++ if (intstatus & I_WR_OOSYNC) { ++ AP6210_DEBUG("Dongle reports WR_OOSYNC\n"); ++ intstatus &= ~I_WR_OOSYNC; ++ } ++ ++ if (intstatus & I_RD_OOSYNC) { ++ AP6210_DEBUG("Dongle reports RD_OOSYNC\n"); ++ intstatus &= ~I_RD_OOSYNC; ++ } ++ ++ if (intstatus & I_SBINT) { ++ AP6210_DEBUG("Dongle reports SBINT\n"); ++ intstatus &= ~I_SBINT; ++ } ++ ++ /* Would be active due to wake-wlan in gSPI */ ++ if (intstatus & I_CHIPACTIVE) { ++ AP6210_DEBUG("Dongle reports CHIPACTIVE\n"); ++ intstatus &= ~I_CHIPACTIVE; ++ } ++ ++ /* Ignore frame indications if rxskip is set */ ++ if (bus->rxskip) { ++ intstatus &= ~FRAME_AVAIL_MASK(bus); ++ } ++ ++ /* On frame indication, read available frames */ ++ if (PKT_AVAILABLE(bus, intstatus)) { ++ framecnt = dhdsdio_readframes(bus, rxlimit, &rxdone); ++ if (rxdone || bus->rxskip) ++ intstatus &= ~FRAME_AVAIL_MASK(bus); ++ rxlimit -= MIN(framecnt, rxlimit); ++ } ++ ++ /* Keep still-pending events for next scheduling */ ++ bus->intstatus = intstatus; ++ ++clkwait: ++ /* Re-enable interrupts to detect new device events (mailbox, rx frame) ++ * or clock availability. (Allows tx loop to check ipend if desired.) ++ * (Unless register access seems hosed, as we may not be able to ACK...) ++ */ ++ if (bus->intr && bus->intdis && !bcmsdh_regfail(sdh)) { ++ AP6210_DEBUG("%s: enable SDIO interrupts, rxdone %d framecnt %d\n", ++ __FUNCTION__, rxdone, framecnt); ++ bus->intdis = FALSE; ++#if defined(OOB_INTR_ONLY) ++ bcmsdh_oob_intr_set(1); ++#endif /* defined(OOB_INTR_ONLY) */ ++ bcmsdh_intr_enable(sdh); ++ } ++ ++#if defined(OOB_INTR_ONLY) && !defined(HW_OOB) ++ /* In case of SW-OOB(using edge trigger), ++ * Check interrupt status in the dongle again after enable irq on the host. ++ * and rechedule dpc if interrupt is pended in the dongle. ++ * There is a chance to miss OOB interrupt while irq is disabled on the host. ++ * No need to do this with HW-OOB(level trigger) ++ */ ++ R_SDREG(newstatus, ®s->intstatus, retries); ++ if (bcmsdh_regfail(bus->sdh)) ++ newstatus = 0; ++ if (newstatus & bus->hostintmask) { ++ bus->ipend = TRUE; ++ resched = TRUE; ++ } ++#endif /* defined(OOB_INTR_ONLY) && !defined(HW_OOB) */ ++#ifdef PROP_TXSTATUS ++ dhd_wlfc_trigger_pktcommit(bus->dhd); ++#endif ++ if (TXCTLOK(bus) && bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL)) { ++ int ret, i; ++ ++ uint8* frame_seq = bus->ctrl_frame_buf + SDPCM_FRAMETAG_LEN; ++ ++ if (*frame_seq != bus->tx_seq) { ++ AP6210_DEBUG("%s IOCTL frame seq lag detected!" ++ " frm_seq:%d != bus->tx_seq:%d, corrected\n", ++ __FUNCTION__, *frame_seq, bus->tx_seq); ++ *frame_seq = bus->tx_seq; ++ } ++ ++ ret = dhd_bcmsdh_send_buf(bus, bcmsdh_cur_sbwad(sdh), SDIO_FUNC_2, F2SYNC, ++ (uint8 *)bus->ctrl_frame_buf, (uint32)bus->ctrl_frame_len, ++ NULL, NULL, NULL); ++ ASSERT(ret != BCME_PENDING); ++ if (ret == BCME_NODEVICE) { ++ AP6210_ERR("%s: Device asleep already\n", __FUNCTION__); ++ } else if (ret < 0) { ++ /* On failure, abort the command and terminate the frame */ ++ AP6210_DEBUG("%s: sdio error %d, abort command and terminate frame.\n", ++ __FUNCTION__, ret); ++ bus->tx_sderrs++; ++ ++ bcmsdh_abort(sdh, SDIO_FUNC_2); ++ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_FRAMECTRL, ++ SFC_WF_TERM, NULL); ++ bus->f1regdata++; ++ ++ for (i = 0; i < 3; i++) { ++ uint8 hi, lo; ++ hi = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_WFRAMEBCHI, NULL); ++ lo = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_WFRAMEBCLO, NULL); ++ bus->f1regdata += 2; ++ if ((hi == 0) && (lo == 0)) ++ break; ++ } ++ } ++ if (ret == 0) { ++ bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP; ++ } ++ ++ bus->ctrl_frame_stat = FALSE; ++ dhd_wait_event_wakeup(bus->dhd); ++ } ++ /* Send queued frames (limit 1 if rx may still be pending) */ ++ else if ((bus->clkstate == CLK_AVAIL) && !bus->fcstate && ++ pktq_mlen(&bus->txq, ~bus->flowcontrol) && txlimit && DATAOK(bus)) { ++ framecnt = rxdone ? txlimit : MIN(txlimit, dhd_txminmax); ++ framecnt = dhdsdio_sendfromq(bus, framecnt); ++ txlimit -= framecnt; ++ } ++ /* Resched the DPC if ctrl cmd is pending on bus credit */ ++ if (bus->ctrl_frame_stat) ++ resched = TRUE; ++ ++ /* Resched if events or tx frames are pending, else await next interrupt */ ++ /* On failed register access, all bets are off: no resched or interrupts */ ++ if ((bus->dhd->busstate == DHD_BUS_DOWN) || bcmsdh_regfail(sdh)) { ++ if ((bus->sih && bus->sih->buscorerev >= 12) && !(dhdsdio_sleepcsr_get(bus) & ++ SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) { ++ /* Bus failed because of KSO */ ++ AP6210_ERR("%s: Bus failed due to KSO\n", __FUNCTION__); ++ bus->kso = FALSE; ++ } else { ++ AP6210_ERR("%s: failed backplane access over SDIO, halting operation\n", ++ __FUNCTION__); ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ bus->intstatus = 0; ++ } ++ } else if (bus->clkstate == CLK_PENDING) { ++ /* Awaiting I_CHIPACTIVE; don't resched */ ++ } else if (bus->intstatus || bus->ipend || ++ (!bus->fcstate && pktq_mlen(&bus->txq, ~bus->flowcontrol) && DATAOK(bus)) || ++ PKT_AVAILABLE(bus, bus->intstatus)) { /* Read multiple frames */ ++ resched = TRUE; ++ } ++ ++ bus->dpc_sched = resched; ++ ++ /* If we're done for now, turn off clock request. */ ++ if ((bus->idletime == DHD_IDLE_IMMEDIATE) && (bus->clkstate != CLK_PENDING)) { ++ bus->activity = FALSE; ++ dhdsdio_clkctl(bus, CLK_NONE, FALSE); ++ } ++ ++exit: ++ dhd_os_sdunlock(bus->dhd); ++ return resched; ++} ++ ++bool ++dhd_bus_dpc(struct dhd_bus *bus) ++{ ++ bool resched; ++ ++ /* Call the DPC directly. */ ++ AP6210_DEBUG("Calling dhdsdio_dpc() from %s\n", __FUNCTION__); ++ resched = dhdsdio_dpc(bus); ++ ++ return resched; ++} ++ ++void ++dhdsdio_isr(void *arg) ++{ ++ dhd_bus_t *bus = (dhd_bus_t*)arg; ++ bcmsdh_info_t *sdh; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (!bus) { ++ AP6210_ERR("%s : bus is null pointer , exit \n", __FUNCTION__); ++ return; ++ } ++ sdh = bus->sdh; ++ ++ if (bus->dhd->busstate == DHD_BUS_DOWN) { ++ AP6210_ERR("%s : bus is down. we have nothing to do\n", __FUNCTION__); ++ return; ++ } ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ /* Count the interrupt call */ ++ bus->intrcount++; ++ bus->ipend = TRUE; ++ ++ /* Shouldn't get this interrupt if we're sleeping? */ ++ if (!SLPAUTO_ENAB(bus)) { ++ if (bus->sleeping) { ++ AP6210_ERR("INTERRUPT WHILE SLEEPING??\n"); ++ return; ++ } else if (!KSO_ENAB(bus)) { ++ AP6210_ERR("ISR in devsleep 1\n"); ++ } ++ } ++ ++ /* Disable additional interrupts (is this needed now)? */ ++ if (bus->intr) { ++ AP6210_DEBUG("%s: disable SDIO interrupts\n", __FUNCTION__); ++ } else { ++ AP6210_ERR("dhdsdio_isr() w/o interrupt configured!\n"); ++ } ++ ++ bcmsdh_intr_disable(sdh); ++ bus->intdis = TRUE; ++ ++#if defined(SDIO_ISR_THREAD) ++ AP6210_DEBUG("Calling dhdsdio_dpc() from %s\n", __FUNCTION__); ++ DHD_OS_WAKE_LOCK(bus->dhd); ++ while (dhdsdio_dpc(bus)); ++ DHD_OS_WAKE_UNLOCK(bus->dhd); ++#else ++ bus->dpc_sched = TRUE; ++ dhd_sched_dpc(bus->dhd); ++#endif ++ ++} ++ ++#ifdef SDTEST ++static void ++dhdsdio_pktgen_init(dhd_bus_t *bus) ++{ ++ /* Default to specified length, or full range */ ++ if (dhd_pktgen_len) { ++ bus->pktgen_maxlen = MIN(dhd_pktgen_len, MAX_PKTGEN_LEN); ++ bus->pktgen_minlen = bus->pktgen_maxlen; ++ } else { ++ bus->pktgen_maxlen = MAX_PKTGEN_LEN; ++ bus->pktgen_minlen = 0; ++ } ++ bus->pktgen_len = (uint16)bus->pktgen_minlen; ++ ++ /* Default to per-watchdog burst with 10s print time */ ++ bus->pktgen_freq = 1; ++ bus->pktgen_print = dhd_watchdog_ms ? (10000/dhd_watchdog_ms):0; ++ bus->pktgen_count = (dhd_pktgen * dhd_watchdog_ms + 999) / 1000; ++ ++ /* Default to echo mode */ ++ bus->pktgen_mode = DHD_PKTGEN_ECHO; ++ bus->pktgen_stop = 1; ++} ++ ++static void ++dhdsdio_pktgen(dhd_bus_t *bus) ++{ ++ void *pkt; ++ uint8 *data; ++ uint pktcount; ++ uint fillbyte; ++ osl_t *osh = bus->dhd->osh; ++ uint16 len; ++ ulong time_lapse; ++ uint sent_pkts; ++ uint rcvd_pkts; ++ ++ /* Display current count if appropriate */ ++ if (bus->pktgen_print && (++bus->pktgen_ptick >= bus->pktgen_print)) { ++ bus->pktgen_ptick = 0; ++ AP6210_DEBUG("%s: send attempts %d, rcvd %d, errors %d\n", ++ __FUNCTION__, bus->pktgen_sent, bus->pktgen_rcvd, bus->pktgen_fail); ++ ++ /* Print throughput stats only for constant length packet runs */ ++ if (bus->pktgen_minlen == bus->pktgen_maxlen) { ++ time_lapse = jiffies - bus->pktgen_prev_time; ++ bus->pktgen_prev_time = jiffies; ++ sent_pkts = bus->pktgen_sent - bus->pktgen_prev_sent; ++ bus->pktgen_prev_sent = bus->pktgen_sent; ++ rcvd_pkts = bus->pktgen_rcvd - bus->pktgen_prev_rcvd; ++ bus->pktgen_prev_rcvd = bus->pktgen_rcvd; ++ ++ AP6210_DEBUG("%s: Tx Throughput %d kbps, Rx Throughput %d kbps\n", ++ __FUNCTION__, ++ (sent_pkts * bus->pktgen_len / jiffies_to_msecs(time_lapse)) * 8, ++ (rcvd_pkts * bus->pktgen_len / jiffies_to_msecs(time_lapse)) * 8); ++ } ++ } ++ ++ /* For recv mode, just make sure dongle has started sending */ ++ if (bus->pktgen_mode == DHD_PKTGEN_RECV) { ++ if (bus->pktgen_rcv_state == PKTGEN_RCV_IDLE) { ++ bus->pktgen_rcv_state = PKTGEN_RCV_ONGOING; ++ dhdsdio_sdtest_set(bus, bus->pktgen_total); ++ } ++ return; ++ } ++ ++ /* Otherwise, generate or request the specified number of packets */ ++ for (pktcount = 0; pktcount < bus->pktgen_count; pktcount++) { ++ /* Stop if total has been reached */ ++ if (bus->pktgen_total && (bus->pktgen_sent >= bus->pktgen_total)) { ++ bus->pktgen_count = 0; ++ break; ++ } ++ ++ /* Allocate an appropriate-sized packet */ ++ if (bus->pktgen_mode == DHD_PKTGEN_RXBURST) { ++ len = SDPCM_TEST_PKT_CNT_FLD_LEN; ++ } else { ++ len = bus->pktgen_len; ++ } ++ if (!(pkt = PKTGET(osh, (len + SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + DHD_SDALIGN), ++ TRUE))) {; ++ AP6210_ERR("%s: PKTGET failed!\n", __FUNCTION__); ++ break; ++ } ++ PKTALIGN(osh, pkt, (len + SDPCM_HDRLEN + SDPCM_TEST_HDRLEN), DHD_SDALIGN); ++ data = (uint8*)PKTDATA(osh, pkt) + SDPCM_HDRLEN; ++ ++ /* Write test header cmd and extra based on mode */ ++ switch (bus->pktgen_mode) { ++ case DHD_PKTGEN_ECHO: ++ *data++ = SDPCM_TEST_ECHOREQ; ++ *data++ = (uint8)bus->pktgen_sent; ++ break; ++ ++ case DHD_PKTGEN_SEND: ++ *data++ = SDPCM_TEST_DISCARD; ++ *data++ = (uint8)bus->pktgen_sent; ++ break; ++ ++ case DHD_PKTGEN_RXBURST: ++ *data++ = SDPCM_TEST_BURST; ++ *data++ = (uint8)bus->pktgen_count; /* Just for backward compatability */ ++ break; ++ ++ default: ++ AP6210_ERR("Unrecognized pktgen mode %d\n", bus->pktgen_mode); ++ PKTFREE(osh, pkt, TRUE); ++ bus->pktgen_count = 0; ++ return; ++ } ++ ++ /* Write test header length field */ ++ *data++ = (bus->pktgen_len >> 0); ++ *data++ = (bus->pktgen_len >> 8); ++ ++ /* Write frame count in a 4 byte field adjucent to SDPCM test header for ++ * burst mode ++ */ ++ if (bus->pktgen_mode == DHD_PKTGEN_RXBURST) { ++ *data++ = (uint8)(bus->pktgen_count >> 0); ++ *data++ = (uint8)(bus->pktgen_count >> 8); ++ *data++ = (uint8)(bus->pktgen_count >> 16); ++ *data++ = (uint8)(bus->pktgen_count >> 24); ++ } else { ++ ++ /* Then fill in the remainder -- N/A for burst */ ++ for (fillbyte = 0; fillbyte < len; fillbyte++) ++ *data++ = SDPCM_TEST_FILL(fillbyte, (uint8)bus->pktgen_sent); ++ } ++ ++#ifdef DHD_DEBUG ++ if (DHD_BYTES_ON() && DHD_DATA_ON()) { ++ data = (uint8*)PKTDATA(osh, pkt) + SDPCM_HDRLEN; ++ prhex("dhdsdio_pktgen: Tx Data", data, PKTLEN(osh, pkt) - SDPCM_HDRLEN); ++ } ++#endif ++ ++ /* Send it */ ++ if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE)) { ++ bus->pktgen_fail++; ++ if (bus->pktgen_stop && bus->pktgen_stop == bus->pktgen_fail) ++ bus->pktgen_count = 0; ++ } ++ bus->pktgen_sent++; ++ ++ /* Bump length if not fixed, wrap at max */ ++ if (++bus->pktgen_len > bus->pktgen_maxlen) ++ bus->pktgen_len = (uint16)bus->pktgen_minlen; ++ ++ /* Special case for burst mode: just send one request! */ ++ if (bus->pktgen_mode == DHD_PKTGEN_RXBURST) ++ break; ++ } ++} ++ ++static void ++dhdsdio_sdtest_set(dhd_bus_t *bus, uint count) ++{ ++ void *pkt; ++ uint8 *data; ++ osl_t *osh = bus->dhd->osh; ++ ++ /* Allocate the packet */ ++ if (!(pkt = PKTGET(osh, SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + ++ SDPCM_TEST_PKT_CNT_FLD_LEN + DHD_SDALIGN, TRUE))) { ++ AP6210_ERR("%s: PKTGET failed!\n", __FUNCTION__); ++ return; ++ } ++ PKTALIGN(osh, pkt, (SDPCM_HDRLEN + SDPCM_TEST_HDRLEN + ++ SDPCM_TEST_PKT_CNT_FLD_LEN), DHD_SDALIGN); ++ data = (uint8*)PKTDATA(osh, pkt) + SDPCM_HDRLEN; ++ ++ /* Fill in the test header */ ++ *data++ = SDPCM_TEST_SEND; ++ *data++ = (count > 0)?TRUE:FALSE; ++ *data++ = (bus->pktgen_maxlen >> 0); ++ *data++ = (bus->pktgen_maxlen >> 8); ++ *data++ = (uint8)(count >> 0); ++ *data++ = (uint8)(count >> 8); ++ *data++ = (uint8)(count >> 16); ++ *data++ = (uint8)(count >> 24); ++ ++ /* Send it */ ++ if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE)) ++ bus->pktgen_fail++; ++} ++ ++ ++static void ++dhdsdio_testrcv(dhd_bus_t *bus, void *pkt, uint seq) ++{ ++ osl_t *osh = bus->dhd->osh; ++ uint8 *data; ++ uint pktlen; ++ ++ uint8 cmd; ++ uint8 extra; ++ uint16 len; ++ uint16 offset; ++ ++ /* Check for min length */ ++ if ((pktlen = PKTLEN(osh, pkt)) < SDPCM_TEST_HDRLEN) { ++ AP6210_ERR("dhdsdio_restrcv: toss runt frame, pktlen %d\n", pktlen); ++ PKTFREE(osh, pkt, FALSE); ++ return; ++ } ++ ++ /* Extract header fields */ ++ data = PKTDATA(osh, pkt); ++ cmd = *data++; ++ extra = *data++; ++ len = *data++; len += *data++ << 8; ++ AP6210_DEBUG("%s:cmd:%d, xtra:%d,len:%d\n", __FUNCTION__, cmd, extra, len); ++ /* Check length for relevant commands */ ++ if (cmd == SDPCM_TEST_DISCARD || cmd == SDPCM_TEST_ECHOREQ || cmd == SDPCM_TEST_ECHORSP) { ++ if (pktlen != len + SDPCM_TEST_HDRLEN) { ++ AP6210_ERR("dhdsdio_testrcv: frame length mismatch, pktlen %d seq %d" ++ " cmd %d extra %d len %d\n", pktlen, seq, cmd, extra, len); ++ PKTFREE(osh, pkt, FALSE); ++ return; ++ } ++ } ++ ++ /* Process as per command */ ++ switch (cmd) { ++ case SDPCM_TEST_ECHOREQ: ++ /* Rx->Tx turnaround ok (even on NDIS w/current implementation) */ ++ *(uint8 *)(PKTDATA(osh, pkt)) = SDPCM_TEST_ECHORSP; ++ if (dhdsdio_txpkt(bus, pkt, SDPCM_TEST_CHANNEL, TRUE, FALSE) == 0) { ++ bus->pktgen_sent++; ++ } else { ++ bus->pktgen_fail++; ++ PKTFREE(osh, pkt, FALSE); ++ } ++ bus->pktgen_rcvd++; ++ break; ++ ++ case SDPCM_TEST_ECHORSP: ++ if (bus->ext_loop) { ++ PKTFREE(osh, pkt, FALSE); ++ bus->pktgen_rcvd++; ++ break; ++ } ++ ++ for (offset = 0; offset < len; offset++, data++) { ++ if (*data != SDPCM_TEST_FILL(offset, extra)) { ++ AP6210_ERR("dhdsdio_testrcv: echo data mismatch: " ++ "offset %d (len %d) expect 0x%02x rcvd 0x%02x\n", ++ offset, len, SDPCM_TEST_FILL(offset, extra), *data); ++ break; ++ } ++ } ++ PKTFREE(osh, pkt, FALSE); ++ bus->pktgen_rcvd++; ++ break; ++ ++ case SDPCM_TEST_DISCARD: ++ { ++ int i = 0; ++ uint8 *prn = data; ++ uint8 testval = extra; ++ for (i = 0; i < len; i++) { ++ if (*prn != testval) { ++ AP6210_ERR("DIErr@Pkt#:%d,Ix:%d, expected:0x%x, got:0x%x\n", ++ i, bus->pktgen_rcvd_rcvsession, testval, *prn); ++ prn++; testval++; ++ } ++ } ++ } ++ PKTFREE(osh, pkt, FALSE); ++ bus->pktgen_rcvd++; ++ break; ++ ++ case SDPCM_TEST_BURST: ++ case SDPCM_TEST_SEND: ++ default: ++ AP6210_DEBUG("dhdsdio_testrcv: unsupported or unknown command, pktlen %d seq %d" ++ " cmd %d extra %d len %d\n", pktlen, seq, cmd, extra, len); ++ PKTFREE(osh, pkt, FALSE); ++ break; ++ } ++ ++ /* For recv mode, stop at limit (and tell dongle to stop sending) */ ++ if (bus->pktgen_mode == DHD_PKTGEN_RECV) { ++ if (bus->pktgen_rcv_state != PKTGEN_RCV_IDLE) { ++ bus->pktgen_rcvd_rcvsession++; ++ ++ if (bus->pktgen_total && ++ (bus->pktgen_rcvd_rcvsession >= bus->pktgen_total)) { ++ bus->pktgen_count = 0; ++ AP6210_ERR("Pktgen:rcv test complete!\n"); ++ bus->pktgen_rcv_state = PKTGEN_RCV_IDLE; ++ dhdsdio_sdtest_set(bus, FALSE); ++ bus->pktgen_rcvd_rcvsession = 0; ++ } ++ } ++ } ++} ++#endif /* SDTEST */ ++ ++extern void ++dhd_disable_intr(dhd_pub_t *dhdp) ++{ ++ dhd_bus_t *bus; ++ bus = dhdp->bus; ++ bcmsdh_intr_disable(bus->sdh); ++} ++ ++extern bool ++dhd_bus_watchdog(dhd_pub_t *dhdp) ++{ ++ dhd_bus_t *bus; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ bus = dhdp->bus; ++ ++ if (bus->dhd->dongle_reset) ++ return FALSE; ++ ++ /* Ignore the timer if simulating bus down */ ++ if (!SLPAUTO_ENAB(bus) && bus->sleeping) ++ return FALSE; ++ ++ if (dhdp->busstate == DHD_BUS_DOWN) ++ return FALSE; ++ ++ /* Poll period: check device if appropriate. */ ++ if (!SLPAUTO_ENAB(bus) && (bus->poll && (++bus->polltick >= bus->pollrate))) { ++ uint32 intstatus = 0; ++ ++ /* Reset poll tick */ ++ bus->polltick = 0; ++ ++ /* Check device if no interrupts */ ++ if (!bus->intr || (bus->intrcount == bus->lastintrs)) { ++ ++ if (!bus->dpc_sched) { ++ uint8 devpend; ++ devpend = bcmsdh_cfg_read(bus->sdh, SDIO_FUNC_0, ++ SDIOD_CCCR_INTPEND, NULL); ++ intstatus = devpend & (INTR_STATUS_FUNC1 | INTR_STATUS_FUNC2); ++ } ++ ++ /* If there is something, make like the ISR and schedule the DPC */ ++ if (intstatus) { ++ bus->pollcnt++; ++ bus->ipend = TRUE; ++ if (bus->intr) { ++ bcmsdh_intr_disable(bus->sdh); ++ } ++ bus->dpc_sched = TRUE; ++ dhd_sched_dpc(bus->dhd); ++ ++ } ++ } ++ ++ /* Update interrupt tracking */ ++ bus->lastintrs = bus->intrcount; ++ } ++ ++#ifdef DHD_DEBUG ++ /* Poll for console output periodically */ ++ if (dhdp->busstate == DHD_BUS_DATA && dhd_console_ms != 0) { ++ bus->console.count += dhd_watchdog_ms; ++ if (bus->console.count >= dhd_console_ms) { ++ bus->console.count -= dhd_console_ms; ++ /* Make sure backplane clock is on */ ++ if (SLPAUTO_ENAB(bus)) ++ dhdsdio_bussleep(bus, FALSE); ++ else ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ if (dhdsdio_readconsole(bus) < 0) ++ dhd_console_ms = 0; /* On error, stop trying */ ++ } ++ } ++#endif /* DHD_DEBUG */ ++ ++#ifdef SDTEST ++ /* Generate packets if configured */ ++ if (bus->pktgen_count && (++bus->pktgen_tick >= bus->pktgen_freq)) { ++ /* Make sure backplane clock is on */ ++ if (SLPAUTO_ENAB(bus)) ++ dhdsdio_bussleep(bus, FALSE); ++ else ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ bus->pktgen_tick = 0; ++ dhdsdio_pktgen(bus); ++ } ++#endif ++ ++ /* On idle timeout clear activity flag and/or turn off clock */ ++#ifdef DHD_USE_IDLECOUNT ++ if (bus->activity) ++ bus->activity = FALSE; ++ else { ++ bus->idlecount++; ++ ++ if (bus->idlecount >= bus->idletime) { ++ AP6210_DEBUG("%s: DHD Idle state!!\n", __FUNCTION__); ++ ++ if (SLPAUTO_ENAB(bus)) { ++ if (dhdsdio_bussleep(bus, TRUE) != BCME_BUSY) ++ dhd_os_wd_timer(bus->dhd, 0); ++ } else ++ dhdsdio_clkctl(bus, CLK_NONE, FALSE); ++ ++ bus->idlecount = 0; ++ } ++ } ++#else ++ if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) { ++ if (++bus->idlecount > bus->idletime) { ++ bus->idlecount = 0; ++ if (bus->activity) { ++ bus->activity = FALSE; ++ if (SLPAUTO_ENAB(bus)) { ++ if (!bus->readframes) ++ dhdsdio_bussleep(bus, TRUE); ++ else ++ bus->reqbussleep = TRUE; ++ } ++ else ++ dhdsdio_clkctl(bus, CLK_NONE, FALSE); ++ } ++ } ++ } ++#endif /* DHD_USE_IDLECOUNT */ ++ ++ return bus->ipend; ++} ++ ++#ifdef DHD_DEBUG ++extern int ++dhd_bus_console_in(dhd_pub_t *dhdp, uchar *msg, uint msglen) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ uint32 addr, val; ++ int rv; ++ void *pkt; ++ ++ /* Address could be zero if CONSOLE := 0 in dongle Makefile */ ++ if (bus->console_addr == 0) ++ return BCME_UNSUPPORTED; ++ ++ /* Exclusive bus access */ ++ dhd_os_sdlock(bus->dhd); ++ ++ /* Don't allow input if dongle is in reset */ ++ if (bus->dhd->dongle_reset) { ++ dhd_os_sdunlock(bus->dhd); ++ return BCME_NOTREADY; ++ } ++ ++ /* Request clock to allow SDIO accesses */ ++ BUS_WAKE(bus); ++ /* No pend allowed since txpkt is called later, ht clk has to be on */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ /* Zero cbuf_index */ ++ addr = bus->console_addr + OFFSETOF(hndrte_cons_t, cbuf_idx); ++ val = htol32(0); ++ if ((rv = dhdsdio_membytes(bus, TRUE, addr, (uint8 *)&val, sizeof(val))) < 0) ++ goto done; ++ ++ /* Write message into cbuf */ ++ addr = bus->console_addr + OFFSETOF(hndrte_cons_t, cbuf); ++ if ((rv = dhdsdio_membytes(bus, TRUE, addr, (uint8 *)msg, msglen)) < 0) ++ goto done; ++ ++ /* Write length into vcons_in */ ++ addr = bus->console_addr + OFFSETOF(hndrte_cons_t, vcons_in); ++ val = htol32(msglen); ++ if ((rv = dhdsdio_membytes(bus, TRUE, addr, (uint8 *)&val, sizeof(val))) < 0) ++ goto done; ++ ++ /* Bump dongle by sending an empty packet on the event channel. ++ * sdpcm_sendup (RX) checks for virtual console input. ++ */ ++ if ((pkt = PKTGET(bus->dhd->osh, 4 + SDPCM_RESERVE, TRUE)) != NULL) ++ dhdsdio_txpkt(bus, pkt, SDPCM_EVENT_CHANNEL, TRUE, FALSE); ++ ++done: ++ if ((bus->idletime == DHD_IDLE_IMMEDIATE) && !bus->dpc_sched) { ++ bus->activity = FALSE; ++ dhdsdio_clkctl(bus, CLK_NONE, TRUE); ++ } ++ ++ dhd_os_sdunlock(bus->dhd); ++ ++ return rv; ++} ++#endif /* DHD_DEBUG */ ++ ++#ifdef DHD_DEBUG ++static void ++dhd_dump_cis(uint fn, uint8 *cis) ++{ ++ uint byte, tag, tdata; ++ AP6210_DEBUG("Function %d CIS:\n", fn); ++ ++ for (tdata = byte = 0; byte < SBSDIO_CIS_SIZE_LIMIT; byte++) { ++ if ((byte % 16) == 0) ++ AP6210_DUMP(" "); ++ AP6210_DUMP("%02x ", cis[byte]); ++ if ((byte % 16) == 15) ++ AP6210_DUMP("\n"); ++ if (!tdata--) { ++ tag = cis[byte]; ++ if (tag == 0xff) ++ break; ++ else if (!tag) ++ tdata = 0; ++ else if ((byte + 1) < SBSDIO_CIS_SIZE_LIMIT) ++ tdata = cis[byte + 1] + 1; ++ else ++ AP6210_DUMP("]"); ++ } ++ } ++ if ((byte % 16) != 15) ++ AP6210_DUMP("\n"); ++} ++#endif /* DHD_DEBUG */ ++ ++static bool ++dhdsdio_chipmatch(uint16 chipid) ++{ ++ if (chipid == BCM4325_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4329_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4315_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4319_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4336_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4330_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM43237_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM43362_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4314_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4334_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM43341_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM43239_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4324_CHIP_ID) ++ return TRUE; ++ if (chipid == BCM4335_CHIP_ID) ++ return TRUE; ++ return FALSE; ++} ++ ++static void * ++dhdsdio_probe(uint16 venid, uint16 devid, uint16 bus_no, uint16 slot, ++ uint16 func, uint bustype, void *regsva, osl_t * osh, void *sdh) ++{ ++ int ret; ++ dhd_bus_t *bus; ++#ifdef GET_CUSTOM_MAC_ENABLE ++ struct ether_addr ea_addr; ++#endif /* GET_CUSTOM_MAC_ENABLE */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) ++ ++ if (mutex_is_locked(&_dhd_sdio_mutex_lock_) == 0) { ++ AP6210_DEBUG("%s : no mutex held. set lock\n", __FUNCTION__); ++ } ++ else { ++ AP6210_DEBUG("%s : mutex is locked!. wait for unlocking\n", __FUNCTION__); ++ } ++ mutex_lock(&_dhd_sdio_mutex_lock_); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ ++ ++ /* Init global variables at run-time, not as part of the declaration. ++ * This is required to support init/de-init of the driver. Initialization ++ * of globals as part of the declaration results in non-deterministic ++ * behavior since the value of the globals may be different on the ++ * first time that the driver is initialized vs subsequent initializations. ++ */ ++ dhd_txbound = DHD_TXBOUND; ++ dhd_rxbound = DHD_RXBOUND; ++ dhd_alignctl = TRUE; ++ sd1idle = TRUE; ++ dhd_readahead = TRUE; ++ retrydata = FALSE; ++ dhd_doflow = FALSE; ++ dhd_dongle_memsize = 0; ++ dhd_txminmax = DHD_TXMINMAX; ++ ++ forcealign = TRUE; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ AP6210_DEBUG("%s: venid 0x%04x devid 0x%04x\n", __FUNCTION__, venid, devid); ++ ++ /* We make assumptions about address window mappings */ ++ ASSERT((uintptr)regsva == SI_ENUM_BASE); ++ ++ /* BCMSDH passes venid and devid based on CIS parsing -- but low-power start ++ * means early parse could fail, so here we should get either an ID ++ * we recognize OR (-1) indicating we must request power first. ++ */ ++ /* Check the Vendor ID */ ++ switch (venid) { ++ case 0x0000: ++ case VENDOR_BROADCOM: ++ break; ++ default: ++ AP6210_ERR("%s: unknown vendor: 0x%04x\n", ++ __FUNCTION__, venid); ++ goto forcereturn; ++ } ++ ++ /* Check the Device ID and make sure it's one that we support */ ++ switch (devid) { ++ case BCM4325_D11DUAL_ID: /* 4325 802.11a/g id */ ++ case BCM4325_D11G_ID: /* 4325 802.11g 2.4Ghz band id */ ++ case BCM4325_D11A_ID: /* 4325 802.11a 5Ghz band id */ ++ AP6210_DEBUG("%s: found 4325 Dongle\n", __FUNCTION__); ++ break; ++ case BCM4329_D11N_ID: /* 4329 802.11n dualband device */ ++ case BCM4329_D11N2G_ID: /* 4329 802.11n 2.4G device */ ++ case BCM4329_D11N5G_ID: /* 4329 802.11n 5G device */ ++ case 0x4329: ++ AP6210_DEBUG("%s: found 4329 Dongle\n", __FUNCTION__); ++ break; ++ case BCM4315_D11DUAL_ID: /* 4315 802.11a/g id */ ++ case BCM4315_D11G_ID: /* 4315 802.11g id */ ++ case BCM4315_D11A_ID: /* 4315 802.11a id */ ++ AP6210_DEBUG("%s: found 4315 Dongle\n", __FUNCTION__); ++ break; ++ case BCM4319_D11N_ID: /* 4319 802.11n id */ ++ case BCM4319_D11N2G_ID: /* 4319 802.11n2g id */ ++ case BCM4319_D11N5G_ID: /* 4319 802.11n5g id */ ++ AP6210_DEBUG("%s: found 4319 Dongle\n", __FUNCTION__); ++ break; ++ case 0: ++ AP6210_DEBUG("%s: allow device id 0, will check chip internals\n", ++ __FUNCTION__); ++ break; ++ ++ default: ++ AP6210_ERR("%s: skipping 0x%04x/0x%04x, not a dongle\n", ++ __FUNCTION__, venid, devid); ++ goto forcereturn; ++ } ++ ++ if (osh == NULL) { ++ /* Ask the OS interface part for an OSL handle */ ++ if (!(osh = dhd_osl_attach(sdh, DHD_BUS))) { ++ AP6210_ERR("%s: osl_attach failed!\n", __FUNCTION__); ++ goto forcereturn; ++ } ++ } ++ ++ /* Allocate private bus interface state */ ++ if (!(bus = MALLOC(osh, sizeof(dhd_bus_t)))) { ++ AP6210_ERR("%s: MALLOC of dhd_bus_t failed\n", __FUNCTION__); ++ goto fail; ++ } ++ bzero(bus, sizeof(dhd_bus_t)); ++ bus->sdh = sdh; ++ bus->cl_devid = (uint16)devid; ++ bus->bus = DHD_BUS; ++ bus->tx_seq = SDPCM_SEQUENCE_WRAP - 1; ++ bus->usebufpool = FALSE; /* Use bufpool if allocated, else use locally malloced rxbuf */ ++ ++ /* attach the common module */ ++ dhd_common_init(osh); ++ ++ /* attempt to attach to the dongle */ ++ if (!(dhdsdio_probe_attach(bus, osh, sdh, regsva, devid))) { ++ AP6210_ERR("%s: dhdsdio_probe_attach failed\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ /* Attach to the dhd/OS/network interface */ ++ if (!(bus->dhd = dhd_attach(osh, bus, SDPCM_RESERVE))) { ++ AP6210_ERR("%s: dhd_attach failed\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ /* Allocate buffers */ ++ if (!(dhdsdio_probe_malloc(bus, osh, sdh))) { ++ AP6210_ERR("%s: dhdsdio_probe_malloc failed\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ if (!(dhdsdio_probe_init(bus, osh, sdh))) { ++ AP6210_ERR("%s: dhdsdio_probe_init failed\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ if (bus->intr) { ++ /* Register interrupt callback, but mask it (not operational yet). */ ++ AP6210_DEBUG("%s: disable SDIO interrupts (not interested yet)\n", __FUNCTION__); ++ bcmsdh_intr_disable(sdh); ++ if ((ret = bcmsdh_intr_reg(sdh, dhdsdio_isr, bus)) != 0) { ++ AP6210_ERR("%s: FAILED: bcmsdh_intr_reg returned %d\n", ++ __FUNCTION__, ret); ++ goto fail; ++ } ++ AP6210_DEBUG("%s: registered SDIO interrupt function ok\n", __FUNCTION__); ++ } else { ++ AP6210_DEBUG("%s: SDIO interrupt function is NOT registered due to polling mode\n", ++ __FUNCTION__); ++ } ++ ++ AP6210_DEBUG("%s: completed!!\n", __FUNCTION__); ++ ++#ifdef GET_CUSTOM_MAC_ENABLE ++ /* Read MAC address from external customer place */ ++ memset(&ea_addr, 0, sizeof(ea_addr)); ++ ret = dhd_custom_get_mac_address(ea_addr.octet); ++ if (!ret) { ++ memcpy(bus->dhd->mac.octet, (void *)&ea_addr, ETHER_ADDR_LEN); ++ } ++#endif /* GET_CUSTOM_MAC_ENABLE */ ++ ++ /* if firmware path present try to download and bring up bus */ ++ if (dhd_download_fw_on_driverload) { ++ if ((ret = dhd_bus_start(bus->dhd)) != 0) { ++ AP6210_ERR("%s: dhd_bus_start failed\n", __FUNCTION__); ++ goto fail; ++ } ++ } ++ /* Ok, have the per-port tell the stack we're open for business */ ++ if (dhd_net_attach(bus->dhd, 0) != 0) { ++ AP6210_ERR("%s: Net attach failed!!\n", __FUNCTION__); ++ goto fail; ++ } ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) ++ mutex_unlock(&_dhd_sdio_mutex_lock_); ++ AP6210_DEBUG("%s : the lock is released.\n", __FUNCTION__); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ ++ return bus; ++ ++fail: ++ dhdsdio_release(bus, osh); ++ ++forcereturn: ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) ++ mutex_unlock(&_dhd_sdio_mutex_lock_); ++ AP6210_DEBUG("%s : the lock is released.\n", __FUNCTION__); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++ ++ return NULL; ++} ++ ++static bool ++dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva, ++ uint16 devid) ++{ ++ int err = 0; ++ uint8 clkctl = 0; ++ ++ bus->alp_only = TRUE; ++ bus->sih = NULL; ++ ++ /* Return the window to backplane enumeration space for core access */ ++ if (dhdsdio_set_siaddr_window(bus, SI_ENUM_BASE)) { ++ AP6210_ERR("%s: FAILED to return to SI_ENUM_BASE\n", __FUNCTION__); ++ } ++ ++#ifdef DHD_DEBUG ++ AP6210_DEBUG("F1 signature read @0x18000000=0x%4x\n", ++ bcmsdh_reg_read(bus->sdh, SI_ENUM_BASE, 4)); ++ ++#endif /* DHD_DEBUG */ ++ ++ ++ /* Force PLL off until si_attach() programs PLL control regs */ ++ ++ ++ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, DHD_INIT_CLKCTL1, &err); ++ if (!err) ++ clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, &err); ++ ++ if (err || ((clkctl & ~SBSDIO_AVBITS) != DHD_INIT_CLKCTL1)) { ++ AP6210_ERR("dhdsdio_probe: ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n", ++ err, DHD_INIT_CLKCTL1, clkctl); ++ goto fail; ++ } ++ ++#ifdef DHD_DEBUG ++ if (DHD_INFO_ON()) { ++ uint fn, numfn; ++ uint8 *cis[SDIOD_MAX_IOFUNCS]; ++ int err = 0; ++ ++ numfn = bcmsdh_query_iofnum(sdh); ++ ASSERT(numfn <= SDIOD_MAX_IOFUNCS); ++ ++ /* Make sure ALP is available before trying to read CIS */ ++ SPINWAIT(((clkctl = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, NULL)), ++ !SBSDIO_ALPAV(clkctl)), PMU_MAX_TRANSITION_DLY); ++ ++ /* Now request ALP be put on the bus */ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, ++ DHD_INIT_CLKCTL2, &err); ++ OSL_DELAY(65); ++ ++ for (fn = 0; fn <= numfn; fn++) { ++ if (!(cis[fn] = MALLOC(osh, SBSDIO_CIS_SIZE_LIMIT))) { ++ AP6210_DEBUG("dhdsdio_probe: fn %d cis malloc failed\n", fn); ++ break; ++ } ++ bzero(cis[fn], SBSDIO_CIS_SIZE_LIMIT); ++ ++ if ((err = bcmsdh_cis_read(sdh, fn, cis[fn], SBSDIO_CIS_SIZE_LIMIT))) { ++ AP6210_DEBUG("dhdsdio_probe: fn %d cis read err %d\n", fn, err); ++ MFREE(osh, cis[fn], SBSDIO_CIS_SIZE_LIMIT); ++ break; ++ } ++ dhd_dump_cis(fn, cis[fn]); ++ } ++ ++ while (fn-- > 0) { ++ ASSERT(cis[fn]); ++ MFREE(osh, cis[fn], SBSDIO_CIS_SIZE_LIMIT); ++ } ++ ++ if (err) { ++ AP6210_ERR("dhdsdio_probe: failure reading or parsing CIS\n"); ++ goto fail; ++ } ++ } ++#endif /* DHD_DEBUG */ ++ ++ /* si_attach() will provide an SI handle and scan the backplane */ ++ if (!(bus->sih = si_attach((uint)devid, osh, regsva, DHD_BUS, sdh, ++ &bus->vars, &bus->varsz))) { ++ AP6210_ERR("%s: si_attach failed!\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ bcmsdh_chipinfo(sdh, bus->sih->chip, bus->sih->chiprev); ++ ++ if (!dhdsdio_chipmatch((uint16)bus->sih->chip)) { ++ AP6210_ERR("%s: unsupported chip: 0x%04x\n", ++ __FUNCTION__, bus->sih->chip); ++ goto fail; ++ } ++ ++ if (bus->sih->buscorerev >= 12) ++ dhdsdio_clk_kso_init(bus); ++ else ++ bus->kso = TRUE; ++ ++ if (CST4330_CHIPMODE_SDIOD(bus->sih->chipst)) { ++ } ++ ++ si_sdiod_drive_strength_init(bus->sih, osh, dhd_sdiod_drive_strength); ++ ++ ++ /* Get info on the ARM and SOCRAM cores... */ ++ if (!DHD_NOPMU(bus)) { ++ if ((si_setcore(bus->sih, ARM7S_CORE_ID, 0)) || ++ (si_setcore(bus->sih, ARMCM3_CORE_ID, 0)) || ++ (si_setcore(bus->sih, ARMCR4_CORE_ID, 0))) { ++ bus->armrev = si_corerev(bus->sih); ++ } else { ++ AP6210_ERR("%s: failed to find ARM core!\n", __FUNCTION__); ++ goto fail; ++ } ++ ++ if (!si_setcore(bus->sih, ARMCR4_CORE_ID, 0)) { ++ if (!(bus->orig_ramsize = si_socram_size(bus->sih))) { ++ AP6210_ERR("%s: failed to find SOCRAM memory!\n", __FUNCTION__); ++ goto fail; ++ } ++ } else { ++ /* cr4 has a different way to find the RAM size from TCM's */ ++ if (!(bus->orig_ramsize = si_tcm_size(bus->sih))) { ++ AP6210_ERR("%s: failed to find CR4-TCM memory!\n", __FUNCTION__); ++ goto fail; ++ } ++ /* also populate base address */ ++ bus->dongle_ram_base = CR4_RAM_BASE; ++ } ++ bus->ramsize = bus->orig_ramsize; ++ if (dhd_dongle_memsize) ++ dhd_dongle_setmemsize(bus, dhd_dongle_memsize); ++ ++ AP6210_DEBUG("DHD: dongle ram size is set to %d(orig %d)\n", ++ bus->ramsize, bus->orig_ramsize); ++ ++ bus->srmemsize = si_socram_srmem_size(bus->sih); ++ } ++ ++ /* ...but normally deal with the SDPCMDEV core */ ++ if (!(bus->regs = si_setcore(bus->sih, PCMCIA_CORE_ID, 0)) && ++ !(bus->regs = si_setcore(bus->sih, SDIOD_CORE_ID, 0))) { ++ AP6210_ERR("%s: failed to find SDIODEV core!\n", __FUNCTION__); ++ goto fail; ++ } ++ bus->sdpcmrev = si_corerev(bus->sih); ++ ++ /* Set core control so an SDIO reset does a backplane reset */ ++ OR_REG(osh, &bus->regs->corecontrol, CC_BPRESEN); ++ bus->rxint_mode = SDIO_DEVICE_HMB_RXINT; ++ ++ if ((bus->sih->buscoretype == SDIOD_CORE_ID) && (bus->sdpcmrev >= 4) && ++ (bus->rxint_mode == SDIO_DEVICE_RXDATAINT_MODE_1)) ++ { ++ uint32 val; ++ ++ val = R_REG(osh, &bus->regs->corecontrol); ++ val &= ~CC_XMTDATAAVAIL_MODE; ++ val |= CC_XMTDATAAVAIL_CTRL; ++ W_REG(osh, &bus->regs->corecontrol, val); ++ } ++ ++ ++ pktq_init(&bus->txq, (PRIOMASK + 1), QLEN); ++ ++ /* Locate an appropriately-aligned portion of hdrbuf */ ++ bus->rxhdr = (uint8 *)ROUNDUP((uintptr)&bus->hdrbuf[0], DHD_SDALIGN); ++ ++ /* Set the poll and/or interrupt flags */ ++ bus->intr = (bool)dhd_intr; ++ if ((bus->poll = (bool)dhd_poll)) ++ bus->pollrate = 1; ++ ++#ifdef BCMSDIOH_TXGLOM ++ /* Setting default Glom mode */ ++ bus->glom_mode = SDPCM_TXGLOM_CPY; ++ /* Setting default Glom size */ ++ bus->glomsize = SDPCM_DEFGLOM_SIZE; ++#endif ++ ++ return TRUE; ++ ++fail: ++ if (bus->sih != NULL) { ++ si_detach(bus->sih); ++ bus->sih = NULL; ++ } ++ return FALSE; ++} ++ ++static bool ++dhdsdio_probe_malloc(dhd_bus_t *bus, osl_t *osh, void *sdh) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus->dhd->maxctl) { ++ bus->rxblen = ROUNDUP((bus->dhd->maxctl + SDPCM_HDRLEN), ALIGNMENT) + DHD_SDALIGN; ++ if (!(bus->rxbuf = DHD_OS_PREALLOC(osh, DHD_PREALLOC_RXBUF, bus->rxblen))) { ++ AP6210_ERR("%s: MALLOC of %d-byte rxbuf failed\n", ++ __FUNCTION__, bus->rxblen); ++ goto fail; ++ } ++ } ++ /* Allocate buffer to receive glomed packet */ ++ if (!(bus->databuf = DHD_OS_PREALLOC(osh, DHD_PREALLOC_DATABUF, MAX_DATA_BUF))) { ++ AP6210_ERR("%s: MALLOC of %d-byte databuf failed\n", ++ __FUNCTION__, MAX_DATA_BUF); ++ /* release rxbuf which was already located as above */ ++ if (!bus->rxblen) ++ DHD_OS_PREFREE(osh, bus->rxbuf, bus->rxblen); ++ goto fail; ++ } ++ ++ /* Align the buffer */ ++ if ((uintptr)bus->databuf % DHD_SDALIGN) ++ bus->dataptr = bus->databuf + (DHD_SDALIGN - ((uintptr)bus->databuf % DHD_SDALIGN)); ++ else ++ bus->dataptr = bus->databuf; ++ ++ return TRUE; ++ ++fail: ++ return FALSE; ++} ++ ++static bool ++dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh) ++{ ++ int32 fnum; ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++#ifdef SDTEST ++ dhdsdio_pktgen_init(bus); ++#endif /* SDTEST */ ++ ++ /* Disable F2 to clear any intermediate frame state on the dongle */ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_0, SDIOD_CCCR_IOEN, SDIO_FUNC_ENABLE_1, NULL); ++ ++ bus->dhd->busstate = DHD_BUS_DOWN; ++ bus->sleeping = FALSE; ++ bus->rxflow = FALSE; ++ bus->prev_rxlim_hit = 0; ++ ++ /* Done with backplane-dependent accesses, can drop clock... */ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL); ++ ++ /* ...and initialize clock/power states */ ++ bus->clkstate = CLK_SDONLY; ++ bus->idletime = (int32)dhd_idletime; ++ bus->idleclock = DHD_IDLE_ACTIVE; ++ ++ /* Query the SD clock speed */ ++ if (bcmsdh_iovar_op(sdh, "sd_divisor", NULL, 0, ++ &bus->sd_divisor, sizeof(int32), FALSE) != BCME_OK) { ++ AP6210_ERR("%s: fail on %s get\n", __FUNCTION__, "sd_divisor"); ++ bus->sd_divisor = -1; ++ } else { ++ AP6210_DEBUG("%s: Initial value for %s is %d\n", ++ __FUNCTION__, "sd_divisor", bus->sd_divisor); ++ } ++ ++ /* Query the SD bus mode */ ++ if (bcmsdh_iovar_op(sdh, "sd_mode", NULL, 0, ++ &bus->sd_mode, sizeof(int32), FALSE) != BCME_OK) { ++ AP6210_ERR("%s: fail on %s get\n", __FUNCTION__, "sd_mode"); ++ bus->sd_mode = -1; ++ } else { ++ AP6210_DEBUG("%s: Initial value for %s is %d\n", ++ __FUNCTION__, "sd_mode", bus->sd_mode); ++ } ++ ++ /* Query the F2 block size, set roundup accordingly */ ++ fnum = 2; ++ if (bcmsdh_iovar_op(sdh, "sd_blocksize", &fnum, sizeof(int32), ++ &bus->blocksize, sizeof(int32), FALSE) != BCME_OK) { ++ bus->blocksize = 0; ++ AP6210_ERR("%s: fail on %s get\n", __FUNCTION__, "sd_blocksize"); ++ } else { ++ AP6210_DEBUG("%s: Initial value for %s is %d\n", ++ __FUNCTION__, "sd_blocksize", bus->blocksize); ++ } ++ bus->roundup = MIN(max_roundup, bus->blocksize); ++ ++ /* Query if bus module supports packet chaining, default to use if supported */ ++ if (bcmsdh_iovar_op(sdh, "sd_rxchain", NULL, 0, ++ &bus->sd_rxchain, sizeof(int32), FALSE) != BCME_OK) { ++ bus->sd_rxchain = FALSE; ++ } else { ++ AP6210_DEBUG("%s: bus module (through bcmsdh API) %s chaining\n", ++ __FUNCTION__, (bus->sd_rxchain ? "supports" : "does not support")); ++ } ++ bus->use_rxchain = (bool)bus->sd_rxchain; ++ ++ return TRUE; ++} ++ ++void ++dhd_bus_select_firmware_name_by_chip(struct dhd_bus *bus, char *dst, char *src) ++{ ++ int fw_type, ag_type; ++ static uint chip, chiprev, first=1; ++ int i; ++ ++ if (first) { ++ chip = bus->sih->chip; ++ chiprev = bus->sih->chiprev; ++ first = 0; ++ } ++ if (src[0] == '\0') { ++#ifdef CONFIG_AP6210_FW_PATH ++ bcm_strncpy_s(src, sizeof(fw_path), CONFIG_AP6210_FW_PATH, MOD_PARAM_PATHLEN-1); ++ if (src[0] == '\0') ++#endif ++ { ++ AP6210_DEBUG("src firmware path is null\n"); ++ return; ++ } ++ } ++ ++ strcpy(dst, src); ++#ifndef FW_PATH_AUTO_SELECT ++ return; ++#endif ++ ++ /* find out the last '/' */ ++ i = strlen(dst); ++ while (i>0){ ++ if (dst[i] == '/') break; ++ i--; ++ } ++#ifdef BAND_AG ++ ag_type = FW_TYPE_AG; ++#else ++ ag_type = strstr(&dst[i], "_ag") ? FW_TYPE_AG : FW_TYPE_G; ++#endif ++ fw_type = (strstr(&dst[i], "_mfg") ? ++ FW_TYPE_MFG : (strstr(&dst[i], "_apsta") ? ++ FW_TYPE_APSTA : (strstr(&dst[i], "_p2p") ? ++ FW_TYPE_P2P : FW_TYPE_STA))); ++ ++ ++ switch (chip) { ++ case BCM4330_CHIP_ID: ++ if (ag_type == FW_TYPE_G) { ++ if (chiprev == BCM4330B2_CHIP_REV) ++ strcpy(&dst[i+1], bcm40183b2_fw_name[fw_type]); ++ break; ++ } else { ++ if (chiprev == BCM4330B2_CHIP_REV) ++ strcpy(&dst[i+1], bcm40183b2ag_fw_name[fw_type]); ++ break; ++ } ++ case BCM43362_CHIP_ID: ++ if (chiprev == BCM43362A0_CHIP_REV) ++ strcpy(&dst[i+1], bcm40181a0_fw_name[fw_type]); ++ else ++ strcpy(&dst[i+1], bcm40181a2_fw_name[fw_type]); ++ break; ++ case BCM43341_CHIP_ID: ++ if (chiprev == BCM43341B0_CHIP_REV) ++ strcpy(&dst[i+1], bcm43341b0ag_fw_name[fw_type]); ++ break; ++ case BCM4324_CHIP_ID: ++ if (chiprev == BCM43241B4_CHIP_REV) ++ strcpy(&dst[i+1], bcm43241b4ag_fw_name[fw_type]); ++ break; ++ } ++ ++ AP6210_DEBUG("%s: firmware_path=%s\n", __FUNCTION__, dst); ++} ++ ++bool ++dhd_bus_download_firmware(struct dhd_bus *bus, osl_t *osh, ++ char *pfw_path, char *pnv_path) ++{ ++ bool ret; ++ bus->fw_path = pfw_path; ++ bus->nv_path = pnv_path; ++ ++ ret = dhdsdio_download_firmware(bus, osh, bus->sdh); ++ ++ ++ return ret; ++} ++ ++static bool ++dhdsdio_download_firmware(struct dhd_bus *bus, osl_t *osh, void *sdh) ++{ ++ bool ret; ++ ++ DHD_OS_WAKE_LOCK(bus->dhd); ++ ++ /* Download the firmware */ ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ ++ AP6210_ERR("Final fw_path=%s\n", bus->fw_path); ++ AP6210_ERR("Final nv_path=%s\n", bus->nv_path); ++ ret = _dhdsdio_download_firmware(bus) == 0; ++ ++ dhdsdio_clkctl(bus, CLK_SDONLY, FALSE); ++ ++ DHD_OS_WAKE_UNLOCK(bus->dhd); ++ return ret; ++} ++ ++/* Detach and free everything */ ++static void ++dhdsdio_release(dhd_bus_t *bus, osl_t *osh) ++{ ++ bool dongle_isolation = FALSE; ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus) { ++ ASSERT(osh); ++ ++ if (bus->dhd) { ++ dongle_isolation = bus->dhd->dongle_isolation; ++ dhd_detach(bus->dhd); ++ } ++ ++ /* De-register interrupt handler */ ++ bcmsdh_intr_disable(bus->sdh); ++ bcmsdh_intr_dereg(bus->sdh); ++ ++ if (bus->dhd) { ++ dhdsdio_release_dongle(bus, osh, dongle_isolation, TRUE); ++ dhd_free(bus->dhd); ++ bus->dhd = NULL; ++ } ++ ++ dhdsdio_release_malloc(bus, osh); ++ ++#ifdef DHD_DEBUG ++ if (bus->console.buf != NULL) ++ MFREE(osh, bus->console.buf, bus->console.bufsize); ++#endif ++ ++ MFREE(osh, bus, sizeof(dhd_bus_t)); ++ } ++ ++ if (osh) ++ dhd_osl_detach(osh); ++ ++ AP6210_DEBUG("%s: Disconnected\n", __FUNCTION__); ++} ++ ++static void ++dhdsdio_release_malloc(dhd_bus_t *bus, osl_t *osh) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus->dhd && bus->dhd->dongle_reset) ++ return; ++ ++ if (bus->rxbuf) { ++#ifndef CONFIG_DHD_USE_STATIC_BUF ++ MFREE(osh, bus->rxbuf, bus->rxblen); ++#endif ++ bus->rxctl = bus->rxbuf = NULL; ++ bus->rxlen = 0; ++ } ++ ++ if (bus->databuf) { ++#ifndef CONFIG_DHD_USE_STATIC_BUF ++ MFREE(osh, bus->databuf, MAX_DATA_BUF); ++#endif ++ bus->databuf = NULL; ++ } ++ ++ if (bus->vars && bus->varsz) { ++ MFREE(osh, bus->vars, bus->varsz); ++ bus->vars = NULL; ++ } ++ ++} ++ ++ ++static void ++dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, bool dongle_isolation, bool reset_flag) ++{ ++ AP6210_DEBUG("%s: Enter bus->dhd %p bus->dhd->dongle_reset %d \n", __FUNCTION__, ++ bus->dhd, bus->dhd->dongle_reset); ++ ++ if ((bus->dhd && bus->dhd->dongle_reset) && reset_flag) ++ return; ++ ++ if (bus->sih) { ++#if !defined(BCMLXSDMMC) ++ if (bus->dhd) { ++ dhdsdio_clkctl(bus, CLK_AVAIL, FALSE); ++ } ++ if (KSO_ENAB(bus) && (dongle_isolation == FALSE)) ++ si_watchdog(bus->sih, 4); ++#endif /* !defined(BCMLXSDMMC) */ ++ if (bus->dhd) { ++ dhdsdio_clkctl(bus, CLK_NONE, FALSE); ++ } ++ si_detach(bus->sih); ++ bus->sih = NULL; ++ if (bus->vars && bus->varsz) ++ MFREE(osh, bus->vars, bus->varsz); ++ bus->vars = NULL; ++ } ++ ++ AP6210_DEBUG("%s: Disconnected\n", __FUNCTION__); ++} ++ ++static void ++dhdsdio_disconnect(void *ptr) ++{ ++ dhd_bus_t *bus = (dhd_bus_t *)ptr; ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) ++ ++ if (mutex_is_locked(&_dhd_sdio_mutex_lock_) == 0) { ++ AP6210_DEBUG("%s : no mutex held. set lock\n", __FUNCTION__); ++ } ++ else { ++ AP6210_DEBUG("%s : mutex is locked!. wait for unlocking\n", __FUNCTION__); ++ } ++ mutex_lock(&_dhd_sdio_mutex_lock_); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ ++ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ if (bus) { ++ ASSERT(bus->dhd); ++ dhdsdio_release(bus, bus->dhd->osh); ++ } ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) ++ mutex_unlock(&_dhd_sdio_mutex_lock_); ++ AP6210_ERR("%s : the lock is released.\n", __FUNCTION__); ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)) */ ++ ++ AP6210_DEBUG("%s: Disconnected\n", __FUNCTION__); ++} ++ ++ ++/* Register/Unregister functions are called by the main DHD entry ++ * point (e.g. module insertion) to link with the bus driver, in ++ * order to look for or await the device. ++ */ ++ ++static bcmsdh_driver_t dhd_sdio = { ++ dhdsdio_probe, ++ dhdsdio_disconnect ++}; ++ ++int ++dhd_bus_register(void) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ return bcmsdh_register(&dhd_sdio); ++} ++ ++void ++dhd_bus_unregister(void) ++{ ++ AP6210_DEBUG("%s: Enter\n", __FUNCTION__); ++ ++ bcmsdh_unregister(); ++} ++ ++#if defined(BCMLXSDMMC) ++/* Register a dummy SDIO client driver in order to be notified of new SDIO device */ ++int dhd_bus_reg_sdio_notify(void* semaphore) ++{ ++ return bcmsdh_reg_sdio_notify(semaphore); ++} ++ ++void dhd_bus_unreg_sdio_notify(void) ++{ ++ bcmsdh_unreg_sdio_notify(); ++} ++#endif /* defined(BCMLXSDMMC) */ ++ ++#ifdef BCMEMBEDIMAGE ++static int ++dhdsdio_download_code_array(struct dhd_bus *bus) ++{ ++ int bcmerror = -1; ++ int offset = 0; ++ unsigned char *ularray = NULL; ++ ++ AP6210_ERR("%s: download embedded firmware...\n", __FUNCTION__); ++ ++ /* Download image */ ++ while ((offset + MEMBLOCK) < sizeof(dlarray)) { ++ bcmerror = dhdsdio_membytes(bus, TRUE, offset, ++ (uint8 *) (dlarray + offset), MEMBLOCK); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on writing %d membytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, MEMBLOCK, offset); ++ goto err; ++ } ++ ++ offset += MEMBLOCK; ++ } ++ ++ if (offset < sizeof(dlarray)) { ++ bcmerror = dhdsdio_membytes(bus, TRUE, offset, ++ (uint8 *) (dlarray + offset), sizeof(dlarray) - offset); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on writing %d membytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, sizeof(dlarray) - offset, offset); ++ goto err; ++ } ++ } ++ ++#ifdef DHD_DEBUG ++ /* Upload and compare the downloaded code */ ++ { ++ ularray = MALLOC(bus->dhd->osh, bus->ramsize); ++ /* Upload image to verify downloaded contents. */ ++ offset = 0; ++ memset(ularray, 0xaa, bus->ramsize); ++ while ((offset + MEMBLOCK) < sizeof(dlarray)) { ++ bcmerror = dhdsdio_membytes(bus, FALSE, offset, ularray + offset, MEMBLOCK); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on reading %d membytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, MEMBLOCK, offset); ++ goto err; ++ } ++ ++ offset += MEMBLOCK; ++ } ++ ++ if (offset < sizeof(dlarray)) { ++ bcmerror = dhdsdio_membytes(bus, FALSE, offset, ++ ularray + offset, sizeof(dlarray) - offset); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on reading %d membytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, sizeof(dlarray) - offset, offset); ++ goto err; ++ } ++ } ++ ++ if (memcmp(dlarray, ularray, sizeof(dlarray))) { ++ AP6210_ERR("%s: Downloaded image is corrupted (%s, %s, %s).\n", ++ __FUNCTION__, dlimagename, dlimagever, dlimagedate); ++ goto err; ++ } else ++ AP6210_ERR("%s: Download, Upload and compare succeeded (%s, %s, %s).\n", ++ __FUNCTION__, dlimagename, dlimagever, dlimagedate); ++ ++ } ++#endif /* DHD_DEBUG */ ++ ++err: ++ if (ularray) ++ MFREE(bus->dhd->osh, ularray, bus->ramsize); ++ return bcmerror; ++} ++#endif /* BCMEMBEDIMAGE */ ++ ++static int ++dhdsdio_download_code_file(struct dhd_bus *bus, char *pfw_path) ++{ ++ int bcmerror = -1; ++ int offset = 0; ++ int len; ++ void *image = NULL; ++ uint8 *memblock = NULL, *memptr; ++ uint8 *memptr_tmp = NULL; // terence: check downloaded firmware is correct ++ ++ AP6210_ERR("download firmware %s\n", pfw_path); ++ ++ image = dhd_os_open_image(pfw_path); ++ if (image == NULL) ++ goto err; ++ ++ memptr = memblock = MALLOC(bus->dhd->osh, MEMBLOCK + DHD_SDALIGN); ++ if (memblock == NULL) { ++ AP6210_ERR("%s: Failed to allocate memory %d bytes\n", __FUNCTION__, MEMBLOCK); ++ goto err; ++ } ++ if (dhd_msg_level & DHD_TRACE_VAL) { ++ memptr_tmp = MALLOC(bus->dhd->osh, MEMBLOCK + DHD_SDALIGN); ++ if (memptr_tmp == NULL) { ++ AP6210_ERR("%s: Failed to allocate memory %d bytes\n", __FUNCTION__, MEMBLOCK); ++ goto err; ++ } ++ } ++ if ((uint32)(uintptr)memblock % DHD_SDALIGN) ++ memptr += (DHD_SDALIGN - ((uint32)(uintptr)memblock % DHD_SDALIGN)); ++ ++ /* Download image */ ++ while ((len = dhd_os_get_image_block((char*)memptr, MEMBLOCK, image))) { ++ if (len < 0) { ++ AP6210_ERR("%s: dhd_os_get_image_block failed (%d)\n", __FUNCTION__, len); ++ bcmerror = BCME_ERROR; ++ goto err; ++ } ++ bcmerror = dhdsdio_membytes(bus, TRUE, offset, memptr, len); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on writing %d membytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, MEMBLOCK, offset); ++ goto err; ++ } ++ ++ if (dhd_msg_level & DHD_TRACE_VAL) { ++ bcmerror = dhdsdio_membytes(bus, FALSE, offset, memptr_tmp, len); ++ if (bcmerror) { ++ AP6210_ERR("%s: error %d on reading %d membytes at 0x%08x\n", ++ __FUNCTION__, bcmerror, MEMBLOCK, offset); ++ goto err; ++ } ++ if (memcmp(memptr_tmp, memptr, len)) { ++ AP6210_ERR("%s: Downloaded image is corrupted.\n", __FUNCTION__); ++ goto err; ++ } else ++ AP6210_ERR("%s: Download, Upload and compare succeeded.\n", __FUNCTION__); ++ } ++ offset += MEMBLOCK; ++ } ++ ++err: ++ if (memblock) ++ MFREE(bus->dhd->osh, memblock, MEMBLOCK + DHD_SDALIGN); ++ if (dhd_msg_level & DHD_TRACE_VAL) { ++ if (memptr_tmp) ++ MFREE(bus->dhd->osh, memptr_tmp, MEMBLOCK + DHD_SDALIGN); ++ } ++ ++ if (image) ++ dhd_os_close_image(image); ++ ++ return bcmerror; ++} ++ ++/* ++ EXAMPLE: nvram_array ++ nvram_arry format: ++ name=value ++ Use carriage return at the end of each assignment, and an empty string with ++ carriage return at the end of array. ++ ++ For example: ++ unsigned char nvram_array[] = {"name1=value1\n", "name2=value2\n", "\n"}; ++ Hex values start with 0x, and mac addr format: xx:xx:xx:xx:xx:xx. ++ ++ Search "EXAMPLE: nvram_array" to see how the array is activated. ++*/ ++ ++void ++dhd_bus_set_nvram_params(struct dhd_bus * bus, const char *nvram_params) ++{ ++ bus->nvram_params = nvram_params; ++} ++ ++static int ++dhdsdio_download_nvram(struct dhd_bus *bus) ++{ ++ int bcmerror = -1; ++ uint len; ++ void * image = NULL; ++ char * memblock = NULL; ++ char *bufp; ++ char *pnv_path; ++ bool nvram_file_exists; ++ ++ pnv_path = bus->nv_path; ++ ++ nvram_file_exists = ((pnv_path != NULL) && (pnv_path[0] != '\0')); ++ if (!nvram_file_exists && (bus->nvram_params == NULL)) ++ return (0); ++ ++ if (nvram_file_exists) { ++ image = dhd_os_open_image(pnv_path); ++ if (image == NULL) ++ goto err; ++ } ++ ++ memblock = MALLOC(bus->dhd->osh, MAX_NVRAMBUF_SIZE); ++ if (memblock == NULL) { ++ AP6210_ERR("%s: Failed to allocate memory %d bytes\n", ++ __FUNCTION__, MAX_NVRAMBUF_SIZE); ++ goto err; ++ } ++ ++ /* Download variables */ ++ if (nvram_file_exists) { ++ len = dhd_os_get_image_block(memblock, MAX_NVRAMBUF_SIZE, image); ++ } ++ else { ++ len = strlen(bus->nvram_params); ++ ASSERT(len <= MAX_NVRAMBUF_SIZE); ++ memcpy(memblock, bus->nvram_params, len); ++ } ++ if (len > 0 && len < MAX_NVRAMBUF_SIZE) { ++ bufp = (char *)memblock; ++ bufp[len] = 0; ++ len = process_nvram_vars(bufp, len); ++ if (len % 4) { ++ len += 4 - (len % 4); ++ } ++ bufp += len; ++ *bufp++ = 0; ++ if (len) ++ bcmerror = dhdsdio_downloadvars(bus, memblock, len + 1); ++ if (bcmerror) { ++ AP6210_ERR("%s: error downloading vars: %d\n", ++ __FUNCTION__, bcmerror); ++ } ++ } ++ else { ++ AP6210_ERR("%s: error reading nvram file: %d\n", ++ __FUNCTION__, len); ++ bcmerror = BCME_SDIO_ERROR; ++ } ++ ++err: ++ if (memblock) ++ MFREE(bus->dhd->osh, memblock, MAX_NVRAMBUF_SIZE); ++ ++ if (image) ++ dhd_os_close_image(image); ++ ++ return bcmerror; ++} ++ ++static int ++_dhdsdio_download_firmware(struct dhd_bus *bus) ++{ ++ int bcmerror = -1; ++ ++ bool embed = FALSE; /* download embedded firmware */ ++ bool dlok = FALSE; /* download firmware succeeded */ ++ ++ /* Out immediately if no image to download */ ++ if ((bus->fw_path == NULL) || (bus->fw_path[0] == '\0')) { ++#ifdef BCMEMBEDIMAGE ++ embed = TRUE; ++#else ++ return 0; ++#endif ++ } ++ ++ /* Keep arm in reset */ ++ if (dhdsdio_download_state(bus, TRUE)) { ++ AP6210_ERR("%s: error placing ARM core in reset\n", __FUNCTION__); ++ goto err; ++ } ++ ++ /* External image takes precedence if specified */ ++ if ((bus->fw_path != NULL) && (bus->fw_path[0] != '\0')) { ++ if (dhdsdio_download_code_file(bus, bus->fw_path)) { ++ AP6210_ERR("%s: dongle image file download failed\n", __FUNCTION__); ++#ifdef BCMEMBEDIMAGE ++ embed = TRUE; ++#else ++ goto err; ++#endif ++ } ++ else { ++ embed = FALSE; ++ dlok = TRUE; ++ } ++ } ++#ifdef BCMEMBEDIMAGE ++ if (embed) { ++ if (dhdsdio_download_code_array(bus)) { ++ AP6210_ERR("%s: dongle image array download failed\n", __FUNCTION__); ++ goto err; ++ } ++ else { ++ dlok = TRUE; ++ } ++ } ++#else ++ BCM_REFERENCE(embed); ++#endif ++ if (!dlok) { ++ AP6210_ERR("%s: dongle image download failed\n", __FUNCTION__); ++ goto err; ++ } ++ ++ /* EXAMPLE: nvram_array */ ++ /* If a valid nvram_arry is specified as above, it can be passed down to dongle */ ++ /* dhd_bus_set_nvram_params(bus, (char *)&nvram_array); */ ++ ++ /* External nvram takes precedence if specified */ ++ if (dhdsdio_download_nvram(bus)) { ++ AP6210_ERR("%s: dongle nvram file download failed\n", __FUNCTION__); ++ goto err; ++ } ++ ++ /* Take arm out of reset */ ++ if (dhdsdio_download_state(bus, FALSE)) { ++ AP6210_ERR("%s: error getting out of ARM core reset\n", __FUNCTION__); ++ goto err; ++ } ++ ++ bcmerror = 0; ++ ++err: ++ return bcmerror; ++} ++ ++static int ++dhd_bcmsdh_recv_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, uint8 *buf, uint nbytes, ++ void *pkt, bcmsdh_cmplt_fn_t complete, void *handle) ++{ ++ int status; ++ ++ if (!KSO_ENAB(bus)) { ++ AP6210_ERR("%s: Device asleep\n", __FUNCTION__); ++ return BCME_NODEVICE; ++ } ++ ++ status = bcmsdh_recv_buf(bus->sdh, addr, fn, flags, buf, nbytes, pkt, complete, handle); ++ ++ return status; ++} ++ ++static int ++dhd_bcmsdh_send_buf(dhd_bus_t *bus, uint32 addr, uint fn, uint flags, uint8 *buf, uint nbytes, ++ void *pkt, bcmsdh_cmplt_fn_t complete, void *handle) ++{ ++ if (!KSO_ENAB(bus)) { ++ AP6210_ERR("%s: Device asleep\n", __FUNCTION__); ++ return BCME_NODEVICE; ++ } ++ ++ return (bcmsdh_send_buf(bus->sdh, addr, fn, flags, buf, nbytes, pkt, complete, handle)); ++} ++ ++#ifdef BCMSDIOH_TXGLOM ++static void ++dhd_bcmsdh_glom_post(dhd_bus_t *bus, uint8 *frame, uint len) ++{ ++ bcmsdh_glom_post(bus->sdh, frame, len); ++} ++ ++static void ++dhd_bcmsdh_glom_clear(dhd_bus_t *bus) ++{ ++ bcmsdh_glom_clear(bus->sdh); ++} ++#endif ++ ++uint ++dhd_bus_chip(struct dhd_bus *bus) ++{ ++ ASSERT(bus->sih != NULL); ++ return bus->sih->chip; ++} ++ ++void * ++dhd_bus_pub(struct dhd_bus *bus) ++{ ++ return bus->dhd; ++} ++ ++void * ++dhd_bus_txq(struct dhd_bus *bus) ++{ ++ return &bus->txq; ++} ++ ++uint ++dhd_bus_hdrlen(struct dhd_bus *bus) ++{ ++ return SDPCM_HDRLEN; ++} ++ ++int ++dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag) ++{ ++ int bcmerror = 0; ++ dhd_bus_t *bus; ++ ++ bus = dhdp->bus; ++ ++ if (flag == TRUE) { ++ if (!bus->dhd->dongle_reset) { ++ dhd_os_sdlock(dhdp); ++ dhd_os_wd_timer(dhdp, 0); ++#if !defined(IGNORE_ETH0_DOWN) ++ /* Force flow control as protection when stop come before ifconfig_down */ ++ dhd_txflowcontrol(bus->dhd, ALL_INTERFACES, ON); ++#endif /* !defined(IGNORE_ETH0_DOWN) */ ++ /* Expect app to have torn down any connection before calling */ ++ /* Stop the bus, disable F2 */ ++ dhd_bus_stop(bus, FALSE); ++ ++#if defined(OOB_INTR_ONLY) ++ /* Clean up any pending IRQ */ ++ bcmsdh_set_irq(FALSE); ++#endif ++ ++ /* Clean tx/rx buffer pointers, detach from the dongle */ ++ dhdsdio_release_dongle(bus, bus->dhd->osh, TRUE, TRUE); ++ ++ bus->dhd->dongle_reset = TRUE; ++ bus->dhd->up = FALSE; ++#ifdef BCMSDIOH_TXGLOM ++ dhd_txglom_enable(dhdp, FALSE); ++#endif ++ dhd_os_sdunlock(dhdp); ++ ++ AP6210_ERR("%s: WLAN OFF DONE\n", __FUNCTION__); ++ /* App can now remove power from device */ ++ } else ++ bcmerror = BCME_SDIO_ERROR; ++ } else { ++ /* App must have restored power to device before calling */ ++ ++ AP6210_ERR("%s: WLAN ON\n", __FUNCTION__); ++ ++ if (bus->dhd->dongle_reset) { ++ /* Turn on WLAN */ ++#ifdef DHDTHREAD ++ dhd_os_sdlock(dhdp); ++#endif /* DHDTHREAD */ ++ /* Reset SD client */ ++ bcmsdh_reset(bus->sdh); ++ ++ /* Attempt to re-attach & download */ ++ if (dhdsdio_probe_attach(bus, bus->dhd->osh, bus->sdh, ++ (uint32 *)SI_ENUM_BASE, ++ bus->cl_devid)) { ++ /* Attempt to download binary to the dongle */ ++ COPY_FW_PATH_BY_CHIP(bus, fw_path, firmware_path); // terence ++ if (dhdsdio_probe_init(bus, bus->dhd->osh, bus->sdh) && ++ dhdsdio_download_firmware(bus, bus->dhd->osh, bus->sdh)) { ++ ++ /* Re-init bus, enable F2 transfer */ ++ bcmerror = dhd_bus_init((dhd_pub_t *) bus->dhd, FALSE); ++ if (bcmerror == BCME_OK) { ++#if defined(OOB_INTR_ONLY) ++ bcmsdh_set_irq(TRUE); ++ dhd_enable_oob_intr(bus, TRUE); ++#endif ++ ++ bus->dhd->dongle_reset = FALSE; ++ bus->dhd->up = TRUE; ++ ++#if !defined(IGNORE_ETH0_DOWN) ++ /* Restore flow control */ ++ dhd_txflowcontrol(bus->dhd, ALL_INTERFACES, OFF); ++#endif ++ dhd_os_wd_timer(dhdp, dhd_watchdog_ms); ++#ifdef BCMSDIOH_TXGLOM ++ if ((dhdp->busstate == DHD_BUS_DATA) && ++ bcmsdh_glom_enabled()) { ++ dhd_txglom_enable(dhdp, TRUE); ++ } ++#endif /* BCMSDIOH_TXGLOM */ ++ AP6210_ERR("%s: WLAN ON DONE\n", __FUNCTION__); ++ } else { ++ dhd_bus_stop(bus, FALSE); ++ dhdsdio_release_dongle(bus, bus->dhd->osh, ++ TRUE, FALSE); ++ } ++ } else ++ bcmerror = BCME_SDIO_ERROR; ++ } else ++ bcmerror = BCME_SDIO_ERROR; ++ ++#ifdef DHDTHREAD ++ dhd_os_sdunlock(dhdp); ++#endif /* DHDTHREAD */ ++ } else { ++ bcmerror = BCME_SDIO_ERROR; ++ AP6210_DEBUG("%s called when dongle is not in reset\n", ++ __FUNCTION__); ++ AP6210_DEBUG("Will call dhd_bus_start instead\n"); ++ sdioh_start(NULL, 1); ++#if defined(HW_OOB) ++ bcmsdh_config_hw_oob_intr(bus->sdh, bus->sih->chip); // terence 20120615: fix for OOB initial issue ++#endif ++ COPY_FW_PATH_BY_CHIP(bus, fw_path, firmware_path); ++ if ((bcmerror = dhd_bus_start(dhdp)) != 0) ++ AP6210_ERR("%s: dhd_bus_start fail with %d\n", ++ __FUNCTION__, bcmerror); ++ } ++ } ++ return bcmerror; ++} ++ ++/* Get Chip ID version */ ++uint dhd_bus_chip_id(dhd_pub_t *dhdp) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ ++ return bus->sih->chip; ++} ++ ++/* Get Chip Rev ID version */ ++uint dhd_bus_chiprev_id(dhd_pub_t *dhdp) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ ++ return bus->sih->chiprev; ++} ++ ++/* Get Chip Pkg ID version */ ++uint dhd_bus_chippkg_id(dhd_pub_t *dhdp) ++{ ++ dhd_bus_t *bus = dhdp->bus; ++ ++ return bus->sih->chippkg; ++} ++ ++int ++dhd_bus_membytes(dhd_pub_t *dhdp, bool set, uint32 address, uint8 *data, uint size) ++{ ++ dhd_bus_t *bus; ++ ++ bus = dhdp->bus; ++ return dhdsdio_membytes(bus, set, address, data, size); ++} +diff --git a/drivers/net/wireless/ap6210/dhd_wlfc.c b/drivers/net/wireless/ap6210/dhd_wlfc.c +new file mode 100644 +index 0000000..93b4ca3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_wlfc.c +@@ -0,0 +1,2441 @@ ++/* ++ * DHD PROP_TXSTATUS Module. ++ * ++ * Copyright (C) 1999-2013, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_wlfc.c 412994 2013-07-17 12:38:03Z $ ++ * ++ */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#ifdef PROP_TXSTATUS ++#include ++#include ++#endif ++ ++ ++ ++ ++#define BUS_RETRIES 1 /* # of retries before aborting a bus tx operation */ ++ ++#ifdef PROP_TXSTATUS ++typedef struct dhd_wlfc_commit_info { ++ uint8 needs_hdr; ++ uint8 ac_fifo_credit_spent; ++ ewlfc_packet_state_t pkt_type; ++ wlfc_mac_descriptor_t* mac_entry; ++ void* p; ++} dhd_wlfc_commit_info_t; ++#endif /* PROP_TXSTATUS */ ++ ++ ++#ifdef PROP_TXSTATUS ++ ++#define DHD_WLFC_QMON_COMPLETE(entry) ++ ++void ++dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf) ++{ ++ int i; ++ uint8* ea; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhdp->wlfc_state; ++ wlfc_hanger_t* h; ++ wlfc_mac_descriptor_t* mac_table; ++ wlfc_mac_descriptor_t* interfaces; ++ char* iftypes[] = {"STA", "AP", "WDS", "p2pGO", "p2pCL"}; ++ ++ if (wlfc == NULL) { ++ bcm_bprintf(strbuf, "wlfc not initialized yet\n"); ++ return; ++ } ++ h = (wlfc_hanger_t*)wlfc->hanger; ++ if (h == NULL) { ++ bcm_bprintf(strbuf, "wlfc-hanger not initialized yet\n"); ++ } ++ ++ mac_table = wlfc->destination_entries.nodes; ++ interfaces = wlfc->destination_entries.interfaces; ++ bcm_bprintf(strbuf, "---- wlfc stats ----\n"); ++ if (h) { ++ bcm_bprintf(strbuf, "wlfc hanger (pushed,popped,f_push," ++ "f_pop,f_slot, pending) = (%d,%d,%d,%d,%d,%d)\n", ++ h->pushed, ++ h->popped, ++ h->failed_to_push, ++ h->failed_to_pop, ++ h->failed_slotfind, ++ (h->pushed - h->popped)); ++ } ++ ++ bcm_bprintf(strbuf, "wlfc fail(tlv,credit_rqst,mac_update,psmode_update), " ++ "(dq_full,rollback_fail) = (%d,%d,%d,%d), (%d,%d)\n", ++ wlfc->stats.tlv_parse_failed, ++ wlfc->stats.credit_request_failed, ++ wlfc->stats.mac_update_failed, ++ wlfc->stats.psmode_update_failed, ++ wlfc->stats.delayq_full_error, ++ wlfc->stats.rollback_failed); ++ ++ bcm_bprintf(strbuf, "PKTS (credit,sent) " ++ "(AC0[%d,%d],AC1[%d,%d],AC2[%d,%d],AC3[%d,%d],BC_MC[%d,%d])\n", ++ wlfc->FIFO_credit[0], wlfc->stats.send_pkts[0], ++ wlfc->FIFO_credit[1], wlfc->stats.send_pkts[1], ++ wlfc->FIFO_credit[2], wlfc->stats.send_pkts[2], ++ wlfc->FIFO_credit[3], wlfc->stats.send_pkts[3], ++ wlfc->FIFO_credit[4], wlfc->stats.send_pkts[4]); ++ ++ bcm_bprintf(strbuf, "\n"); ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ if (interfaces[i].occupied) { ++ char* iftype_desc; ++ ++ if (interfaces[i].iftype > WLC_E_IF_ROLE_P2P_CLIENT) ++ iftype_desc = "hostif_flow_state[i] == OFF) ++ ? " OFF":" ON")); ++ ++ bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ(len,state,credit)" ++ "= (%d,%s,%d)\n", ++ i, ++ interfaces[i].psq.len, ++ ((interfaces[i].state == ++ WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), ++ interfaces[i].requested_credit); ++ ++ bcm_bprintf(strbuf, "INTERFACE[%d].DELAYQ" ++ "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " ++ "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", ++ i, ++ interfaces[i].psq.q[0].len, ++ interfaces[i].psq.q[1].len, ++ interfaces[i].psq.q[2].len, ++ interfaces[i].psq.q[3].len, ++ interfaces[i].psq.q[4].len, ++ interfaces[i].psq.q[5].len, ++ interfaces[i].psq.q[6].len, ++ interfaces[i].psq.q[7].len); ++ } ++ } ++ ++ bcm_bprintf(strbuf, "\n"); ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (mac_table[i].occupied) { ++ ea = mac_table[i].ea; ++ bcm_bprintf(strbuf, "MAC_table[%d].ea = " ++ "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d \n", i, ++ ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], ++ mac_table[i].interface_id); ++ ++ bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ(len,state,credit)" ++ "= (%d,%s,%d)\n", ++ i, ++ mac_table[i].psq.len, ++ ((mac_table[i].state == ++ WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), ++ mac_table[i].requested_credit); ++#ifdef PROP_TXSTATUS_DEBUG ++ bcm_bprintf(strbuf, "MAC_table[%d]: (opened, closed) = (%d, %d)\n", ++ i, mac_table[i].opened_ct, mac_table[i].closed_ct); ++#endif ++ bcm_bprintf(strbuf, "MAC_table[%d].DELAYQ" ++ "(sup,ac0),(sup,ac1),(sup,ac2),(sup,ac3) = " ++ "(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", ++ i, ++ mac_table[i].psq.q[0].len, ++ mac_table[i].psq.q[1].len, ++ mac_table[i].psq.q[2].len, ++ mac_table[i].psq.q[3].len, ++ mac_table[i].psq.q[4].len, ++ mac_table[i].psq.q[5].len, ++ mac_table[i].psq.q[6].len, ++ mac_table[i].psq.q[7].len); ++ } ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ int avg; ++ int moving_avg = 0; ++ int moving_samples; ++ ++ if (wlfc->stats.latency_sample_count) { ++ moving_samples = sizeof(wlfc->stats.deltas)/sizeof(uint32); ++ ++ for (i = 0; i < moving_samples; i++) ++ moving_avg += wlfc->stats.deltas[i]; ++ moving_avg /= moving_samples; ++ ++ avg = (100 * wlfc->stats.total_status_latency) / ++ wlfc->stats.latency_sample_count; ++ bcm_bprintf(strbuf, "txstatus latency (average, last, moving[%d]) = " ++ "(%d.%d, %03d, %03d)\n", ++ moving_samples, avg/100, (avg - (avg/100)*100), ++ wlfc->stats.latency_most_recent, ++ moving_avg); ++ } ++ } ++ ++ bcm_bprintf(strbuf, "wlfc- fifo[0-5] credit stats: sent = (%d,%d,%d,%d,%d,%d), " ++ "back = (%d,%d,%d,%d,%d,%d)\n", ++ wlfc->stats.fifo_credits_sent[0], ++ wlfc->stats.fifo_credits_sent[1], ++ wlfc->stats.fifo_credits_sent[2], ++ wlfc->stats.fifo_credits_sent[3], ++ wlfc->stats.fifo_credits_sent[4], ++ wlfc->stats.fifo_credits_sent[5], ++ ++ wlfc->stats.fifo_credits_back[0], ++ wlfc->stats.fifo_credits_back[1], ++ wlfc->stats.fifo_credits_back[2], ++ wlfc->stats.fifo_credits_back[3], ++ wlfc->stats.fifo_credits_back[4], ++ wlfc->stats.fifo_credits_back[5]); ++ { ++ uint32 fifo_cr_sent = 0; ++ uint32 fifo_cr_acked = 0; ++ uint32 request_cr_sent = 0; ++ uint32 request_cr_ack = 0; ++ uint32 bc_mc_cr_ack = 0; ++ ++ for (i = 0; i < sizeof(wlfc->stats.fifo_credits_sent)/sizeof(uint32); i++) { ++ fifo_cr_sent += wlfc->stats.fifo_credits_sent[i]; ++ } ++ ++ for (i = 0; i < sizeof(wlfc->stats.fifo_credits_back)/sizeof(uint32); i++) { ++ fifo_cr_acked += wlfc->stats.fifo_credits_back[i]; ++ } ++ ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (wlfc->destination_entries.nodes[i].occupied) { ++ request_cr_sent += ++ wlfc->destination_entries.nodes[i].dstncredit_sent_packets; ++ } ++ } ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ if (wlfc->destination_entries.interfaces[i].occupied) { ++ request_cr_sent += ++ wlfc->destination_entries.interfaces[i].dstncredit_sent_packets; ++ } ++ } ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (wlfc->destination_entries.nodes[i].occupied) { ++ request_cr_ack += ++ wlfc->destination_entries.nodes[i].dstncredit_acks; ++ } ++ } ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ if (wlfc->destination_entries.interfaces[i].occupied) { ++ request_cr_ack += ++ wlfc->destination_entries.interfaces[i].dstncredit_acks; ++ } ++ } ++ bcm_bprintf(strbuf, "wlfc- (sent, status) => pq(%d,%d), vq(%d,%d)," ++ "other:%d, bc_mc:%d, signal-only, (sent,freed): (%d,%d)", ++ fifo_cr_sent, fifo_cr_acked, ++ request_cr_sent, request_cr_ack, ++ wlfc->destination_entries.other.dstncredit_acks, ++ bc_mc_cr_ack, ++ wlfc->stats.signal_only_pkts_sent, wlfc->stats.signal_only_pkts_freed); ++ } ++#endif /* PROP_TXSTATUS_DEBUG */ ++ bcm_bprintf(strbuf, "\n"); ++ bcm_bprintf(strbuf, "wlfc- pkt((in,2bus,txstats,hdrpull),(dropped,hdr_only,wlc_tossed)" ++ "(freed,free_err,rollback)) = " ++ "((%d,%d,%d,%d),(%d,%d,%d),(%d,%d,%d))\n", ++ wlfc->stats.pktin, ++ wlfc->stats.pkt2bus, ++ wlfc->stats.txstatus_in, ++ wlfc->stats.dhd_hdrpulls, ++ ++ wlfc->stats.pktdropped, ++ wlfc->stats.wlfc_header_only_pkt, ++ wlfc->stats.wlc_tossed_pkts, ++ ++ wlfc->stats.pkt_freed, ++ wlfc->stats.pkt_free_err, wlfc->stats.rollback); ++ ++ bcm_bprintf(strbuf, "wlfc- suppress((d11,wlc,err),enq(d11,wl,hq,mac?),retx(d11,wlc,hq)) = " ++ "((%d,%d,%d),(%d,%d,%d,%d),(%d,%d,%d))\n", ++ ++ wlfc->stats.d11_suppress, ++ wlfc->stats.wl_suppress, ++ wlfc->stats.bad_suppress, ++ ++ wlfc->stats.psq_d11sup_enq, ++ wlfc->stats.psq_wlsup_enq, ++ wlfc->stats.psq_hostq_enq, ++ wlfc->stats.mac_handle_notfound, ++ ++ wlfc->stats.psq_d11sup_retx, ++ wlfc->stats.psq_wlsup_retx, ++ wlfc->stats.psq_hostq_retx); ++ bcm_bprintf(strbuf, "wlfc- generic error: %d", wlfc->stats.generic_error); ++ ++ return; ++} ++ ++/* Create a place to store all packet pointers submitted to the firmware until ++ a status comes back, suppress or otherwise. ++ ++ hang-er: noun, a contrivance on which things are hung, as a hook. ++*/ ++static void* ++dhd_wlfc_hanger_create(osl_t *osh, int max_items) ++{ ++ int i; ++ wlfc_hanger_t* hanger; ++ ++ /* allow only up to a specific size for now */ ++ ASSERT(max_items == WLFC_HANGER_MAXITEMS); ++ ++ if ((hanger = (wlfc_hanger_t*)MALLOC(osh, WLFC_HANGER_SIZE(max_items))) == NULL) ++ return NULL; ++ ++ memset(hanger, 0, WLFC_HANGER_SIZE(max_items)); ++ hanger->max_items = max_items; ++ ++ for (i = 0; i < hanger->max_items; i++) { ++ hanger->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ return hanger; ++} ++ ++static int ++dhd_wlfc_hanger_delete(osl_t *osh, void* hanger) ++{ ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ if (h) { ++ MFREE(osh, h, WLFC_HANGER_SIZE(h->max_items)); ++ return BCME_OK; ++ } ++ return BCME_BADARG; ++} ++ ++static uint16 ++dhd_wlfc_hanger_get_free_slot(void* hanger) ++{ ++ uint32 i; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ if (h) { ++ i = h->slot_pos + 1; ++ if (i == h->max_items) { ++ i = 0; ++ } ++ while (i != h->slot_pos) { ++ if (h->items[i].state == WLFC_HANGER_ITEM_STATE_FREE) { ++ h->slot_pos = i; ++ return (uint16)i; ++ } ++ i++; ++ if (i == h->max_items) ++ i = 0; ++ } ++ h->failed_slotfind++; ++ } ++ return WLFC_HANGER_MAXITEMS; ++} ++ ++static int ++dhd_wlfc_hanger_get_genbit(void* hanger, void* pkt, uint32 slot_id, int* gen) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ *gen = 0xff; ++ ++ /* this packet was not pushed at the time it went to the firmware */ ++ if (slot_id == WLFC_HANGER_MAXITEMS) ++ return BCME_NOTFOUND; ++ ++ if (h) { ++ if ((h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) || ++ (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED)) { ++ *gen = h->items[slot_id].gen; ++ } ++ else { ++ rc = BCME_NOTFOUND; ++ } ++ } ++ else ++ rc = BCME_BADARG; ++ return rc; ++} ++ ++static int ++dhd_wlfc_hanger_pushpkt(void* hanger, void* pkt, uint32 slot_id) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ if (h && (slot_id < WLFC_HANGER_MAXITEMS)) { ++ if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_FREE) { ++ h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE; ++ h->items[slot_id].pkt = pkt; ++ h->items[slot_id].identifier = slot_id; ++ h->pushed++; ++ } ++ else { ++ h->failed_to_push++; ++ rc = BCME_NOTFOUND; ++ } ++ } ++ else ++ rc = BCME_BADARG; ++ return rc; ++} ++ ++static int ++dhd_wlfc_hanger_poppkt(void* hanger, uint32 slot_id, void** pktout, int remove_from_hanger) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ /* this packet was not pushed at the time it went to the firmware */ ++ if (slot_id == WLFC_HANGER_MAXITEMS) ++ return BCME_NOTFOUND; ++ ++ if (h) { ++ if (h->items[slot_id].state != WLFC_HANGER_ITEM_STATE_FREE) { ++ *pktout = h->items[slot_id].pkt; ++ if (remove_from_hanger) { ++ h->items[slot_id].state = ++ WLFC_HANGER_ITEM_STATE_FREE; ++ h->items[slot_id].pkt = NULL; ++ h->items[slot_id].identifier = 0; ++ h->items[slot_id].gen = 0xff; ++ h->popped++; ++ } ++ } ++ else { ++ h->failed_to_pop++; ++ rc = BCME_NOTFOUND; ++ } ++ } ++ else ++ rc = BCME_BADARG; ++ return rc; ++} ++ ++static int ++dhd_wlfc_hanger_mark_suppressed(void* hanger, uint32 slot_id, uint8 gen) ++{ ++ int rc = BCME_OK; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)hanger; ++ ++ /* this packet was not pushed at the time it went to the firmware */ ++ if (slot_id == WLFC_HANGER_MAXITEMS) ++ return BCME_NOTFOUND; ++ if (h) { ++ h->items[slot_id].gen = gen; ++ if (h->items[slot_id].state == WLFC_HANGER_ITEM_STATE_INUSE) { ++ h->items[slot_id].state = WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED; ++ } ++ else ++ rc = BCME_BADARG; ++ } ++ else ++ rc = BCME_BADARG; ++ ++ return rc; ++} ++ ++static int ++_dhd_wlfc_pushheader(athost_wl_status_info_t* ctx, void* p, bool tim_signal, ++ uint8 tim_bmp, uint8 mac_handle, uint32 htodtag) ++{ ++ uint32 wl_pktinfo = 0; ++ uint8* wlh; ++ uint8 dataOffset; ++ uint8 fillers; ++ uint8 tim_signal_len = 0; ++ ++ struct bdc_header *h; ++ ++ if (tim_signal) { ++ tim_signal_len = 1 + 1 + WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; ++ } ++ ++ /* +2 is for Type[1] and Len[1] in TLV, plus TIM signal */ ++ dataOffset = WLFC_CTL_VALUE_LEN_PKTTAG + 2 + tim_signal_len; ++ fillers = ROUNDUP(dataOffset, 4) - dataOffset; ++ dataOffset += fillers; ++ ++ PKTPUSH(ctx->osh, p, dataOffset); ++ wlh = (uint8*) PKTDATA(ctx->osh, p); ++ ++ wl_pktinfo = htol32(htodtag); ++ ++ wlh[0] = WLFC_CTL_TYPE_PKTTAG; ++ wlh[1] = WLFC_CTL_VALUE_LEN_PKTTAG; ++ memcpy(&wlh[2], &wl_pktinfo, sizeof(uint32)); ++ ++ if (tim_signal_len) { ++ wlh[dataOffset - fillers - tim_signal_len ] = ++ WLFC_CTL_TYPE_PENDING_TRAFFIC_BMP; ++ wlh[dataOffset - fillers - tim_signal_len + 1] = ++ WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP; ++ wlh[dataOffset - fillers - tim_signal_len + 2] = mac_handle; ++ wlh[dataOffset - fillers - tim_signal_len + 3] = tim_bmp; ++ } ++ if (fillers) ++ memset(&wlh[dataOffset - fillers], WLFC_CTL_TYPE_FILLER, fillers); ++ ++ PKTPUSH(ctx->osh, p, BDC_HEADER_LEN); ++ h = (struct bdc_header *)PKTDATA(ctx->osh, p); ++ h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); ++ if (PKTSUMNEEDED(p)) ++ h->flags |= BDC_FLAG_SUM_NEEDED; ++ ++ ++ h->priority = (PKTPRIO(p) & BDC_PRIORITY_MASK); ++ h->flags2 = 0; ++ h->dataOffset = dataOffset >> 2; ++ BDC_SET_IF_IDX(h, DHD_PKTTAG_IF(PKTTAG(p))); ++ return BCME_OK; ++} ++ ++static int ++_dhd_wlfc_pullheader(athost_wl_status_info_t* ctx, void* pktbuf) ++{ ++ struct bdc_header *h; ++ ++ if (PKTLEN(ctx->osh, pktbuf) < BDC_HEADER_LEN) { ++ AP6210_DEBUG("%s: rx data too short (%d < %d)\n", __FUNCTION__, ++ PKTLEN(ctx->osh, pktbuf), BDC_HEADER_LEN); ++ return BCME_ERROR; ++ } ++ h = (struct bdc_header *)PKTDATA(ctx->osh, pktbuf); ++ ++ /* pull BDC header */ ++ PKTPULL(ctx->osh, pktbuf, BDC_HEADER_LEN); ++ ++ if (PKTLEN(ctx->osh, pktbuf) < (h->dataOffset << 2)) { ++ AP6210_DEBUG("%s: rx data too short (%d < %d)\n", __FUNCTION__, ++ PKTLEN(ctx->osh, pktbuf), (h->dataOffset << 2)); ++ return BCME_ERROR; ++ } ++ ++ /* pull wl-header */ ++ PKTPULL(ctx->osh, pktbuf, (h->dataOffset << 2)); ++ return BCME_OK; ++} ++ ++static wlfc_mac_descriptor_t* ++_dhd_wlfc_find_table_entry(athost_wl_status_info_t* ctx, void* p) ++{ ++ int i; ++ wlfc_mac_descriptor_t* table = ctx->destination_entries.nodes; ++ uint8 ifid = DHD_PKTTAG_IF(PKTTAG(p)); ++ uint8* dstn = DHD_PKTTAG_DSTN(PKTTAG(p)); ++ wlfc_mac_descriptor_t* entry = NULL; ++ int iftype = ctx->destination_entries.interfaces[ifid].iftype; ++ ++ /* Multicast destination and P2P clients get the interface entry. ++ * STA gets the interface entry if there is no exact match. For ++ * example, TDLS destinations have their own entry. ++ */ ++ if ((iftype == WLC_E_IF_ROLE_STA || ETHER_ISMULTI(dstn) || ++ iftype == WLC_E_IF_ROLE_P2P_CLIENT) && ++ (ctx->destination_entries.interfaces[ifid].occupied)) { ++ entry = &ctx->destination_entries.interfaces[ifid]; ++ } ++ ++ if (entry != NULL && ETHER_ISMULTI(dstn)) ++ return entry; ++ ++ for (i = 0; i < WLFC_MAC_DESC_TABLE_SIZE; i++) { ++ if (table[i].occupied) { ++ if (table[i].interface_id == ifid) { ++ if (!memcmp(table[i].ea, dstn, ETHER_ADDR_LEN)) { ++ entry = &table[i]; ++ break; ++ } ++ } ++ } ++ } ++ ++ return entry != NULL ? entry : &ctx->destination_entries.other; ++} ++ ++static int ++_dhd_wlfc_rollback_packet_toq(athost_wl_status_info_t* ctx, ++ void* p, ewlfc_packet_state_t pkt_type, uint32 hslot) ++{ ++ /* ++ put the packet back to the head of queue ++ ++ - suppressed packet goes back to suppress sub-queue ++ - pull out the header, if new or delayed packet ++ ++ Note: hslot is used only when header removal is done. ++ */ ++ wlfc_mac_descriptor_t* entry; ++ void* pktout; ++ int rc = BCME_OK; ++ int prec; ++ ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ prec = DHD_PKTTAG_FIFO(PKTTAG(p)); ++ if (entry != NULL) { ++ if (pkt_type == eWLFC_PKTTYPE_SUPPRESSED) { ++ /* wl-header is saved for suppressed packets */ ++ if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, ((prec << 1) + 1), p) == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ } ++ else { ++ /* remove header first */ ++ rc = _dhd_wlfc_pullheader(ctx, p); ++ if (rc != BCME_OK) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ /* free the hanger slot */ ++ dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); ++ PKTFREE(ctx->osh, p, TRUE); ++ ctx->stats.rollback_failed++; ++ return BCME_ERROR; ++ } ++ ++ if (pkt_type == eWLFC_PKTTYPE_DELAYED) { ++ /* delay-q packets are going to delay-q */ ++ if (WLFC_PKTQ_PENQ_HEAD(&entry->psq, (prec << 1), p) == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ } ++ ++ /* free the hanger slot */ ++ dhd_wlfc_hanger_poppkt(ctx->hanger, hslot, &pktout, 1); ++ ++ /* decrement sequence count */ ++ WLFC_DECR_SEQCOUNT(entry, prec); ++ } ++ /* ++ if this packet did not count against FIFO credit, it must have ++ taken a requested_credit from the firmware (for pspoll etc.) ++ */ ++ if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { ++ entry->requested_credit++; ++ } ++ } ++ else { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ rc = BCME_ERROR; ++ } ++ if (rc != BCME_OK) ++ ctx->stats.rollback_failed++; ++ else ++ ctx->stats.rollback++; ++ ++ return rc; ++} ++ ++static void ++_dhd_wlfc_flow_control_check(athost_wl_status_info_t* ctx, struct pktq* pq, uint8 if_id) ++{ ++ dhd_pub_t *dhdp; ++ ++ ASSERT(ctx); ++ ++ dhdp = (dhd_pub_t *)ctx->dhdp; ++ ++ if (dhdp && dhdp->skip_fc && dhdp->skip_fc()) ++ return; ++ ++ if ((pq->len <= WLFC_FLOWCONTROL_LOWATER) && (ctx->hostif_flow_state[if_id] == ON)) { ++ /* start traffic */ ++ ctx->hostif_flow_state[if_id] = OFF; ++ /* ++ AP6210_DEBUG("qlen:%02d, if:%02d, ->OFF, start traffic %s()\n", ++ pq->len, if_id, __FUNCTION__); ++ */ ++ AP6210_DEBUG("F"); ++ ++ dhd_txflowcontrol(ctx->dhdp, if_id, OFF); ++ ++ ctx->toggle_host_if = 0; ++ } ++ if ((pq->len >= WLFC_FLOWCONTROL_HIWATER) && (ctx->hostif_flow_state[if_id] == OFF)) { ++ /* stop traffic */ ++ ctx->hostif_flow_state[if_id] = ON; ++ /* ++ AP6210_DEBUG("qlen:%02d, if:%02d, ->ON, stop traffic %s()\n", ++ pq->len, if_id, __FUNCTION__); ++ */ ++ AP6210_DEBUG("N"); ++ ++ dhd_txflowcontrol(ctx->dhdp, if_id, ON); ++ ++ ctx->host_ifidx = if_id; ++ ctx->toggle_host_if = 1; ++ } ++ ++ return; ++} ++ ++static int ++_dhd_wlfc_send_signalonly_packet(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, ++ uint8 ta_bmp) ++{ ++ int rc = BCME_OK; ++ void* p = NULL; ++ int dummylen = ((dhd_pub_t *)ctx->dhdp)->hdrlen+ 12; ++ ++ /* allocate a dummy packet */ ++ p = PKTGET(ctx->osh, dummylen, TRUE); ++ if (p) { ++ PKTPULL(ctx->osh, p, dummylen); ++ DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), 0); ++ _dhd_wlfc_pushheader(ctx, p, TRUE, ta_bmp, entry->mac_handle, 0); ++ DHD_PKTTAG_SETSIGNALONLY(PKTTAG(p), 1); ++#ifdef PROP_TXSTATUS_DEBUG ++ ctx->stats.signal_only_pkts_sent++; ++#endif ++ rc = dhd_bus_txdata(((dhd_pub_t *)ctx->dhdp)->bus, p); ++ if (rc != BCME_OK) { ++ PKTFREE(ctx->osh, p, TRUE); ++ } ++ } ++ else { ++ AP6210_ERR("%s: couldn't allocate new %d-byte packet\n", ++ __FUNCTION__, dummylen); ++ rc = BCME_NOMEM; ++ } ++ return rc; ++} ++ ++/* Return TRUE if traffic availability changed */ ++static bool ++_dhd_wlfc_traffic_pending_check(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, ++ int prec) ++{ ++ bool rc = FALSE; ++ ++ if (entry->state == WLFC_STATE_CLOSE) { ++ if ((pktq_plen(&entry->psq, (prec << 1)) == 0) && ++ (pktq_plen(&entry->psq, ((prec << 1) + 1)) == 0)) { ++ ++ if (entry->traffic_pending_bmp & NBITVAL(prec)) { ++ rc = TRUE; ++ entry->traffic_pending_bmp = ++ entry->traffic_pending_bmp & ~ NBITVAL(prec); ++ } ++ } ++ else { ++ if (!(entry->traffic_pending_bmp & NBITVAL(prec))) { ++ rc = TRUE; ++ entry->traffic_pending_bmp = ++ entry->traffic_pending_bmp | NBITVAL(prec); ++ } ++ } ++ } ++ if (rc) { ++ /* request a TIM update to firmware at the next piggyback opportunity */ ++ if (entry->traffic_lastreported_bmp != entry->traffic_pending_bmp) { ++ entry->send_tim_signal = 1; ++ _dhd_wlfc_send_signalonly_packet(ctx, entry, entry->traffic_pending_bmp); ++ entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; ++ entry->send_tim_signal = 0; ++ } ++ else { ++ rc = FALSE; ++ } ++ } ++ return rc; ++} ++ ++static int ++_dhd_wlfc_enque_suppressed(athost_wl_status_info_t* ctx, int prec, void* p) ++{ ++ wlfc_mac_descriptor_t* entry; ++ ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ if (entry == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_NOTFOUND; ++ } ++ /* ++ - suppressed packets go to sub_queue[2*prec + 1] AND ++ - delayed packets go to sub_queue[2*prec + 0] to ensure ++ order of delivery. ++ */ ++ if (WLFC_PKTQ_PENQ(&entry->psq, ((prec << 1) + 1), p) == NULL) { ++ ctx->stats.delayq_full_error++; ++ /* AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); */ ++ AP6210_DEBUG("s"); ++ return BCME_ERROR; ++ } ++ /* A packet has been pushed, update traffic availability bitmap, if applicable */ ++ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); ++ _dhd_wlfc_flow_control_check(ctx, &entry->psq, DHD_PKTTAG_IF(PKTTAG(p))); ++ return BCME_OK; ++} ++ ++static int ++_dhd_wlfc_pretx_pktprocess(athost_wl_status_info_t* ctx, ++ wlfc_mac_descriptor_t* entry, void* p, int header_needed, uint32* slot) ++{ ++ int rc = BCME_OK; ++ int hslot = WLFC_HANGER_MAXITEMS; ++ bool send_tim_update = FALSE; ++ uint32 htod = 0; ++ uint8 free_ctr; ++ ++ *slot = hslot; ++ ++ if (entry == NULL) { ++ entry = _dhd_wlfc_find_table_entry(ctx, p); ++ } ++ ++ if (entry == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_ERROR; ++ } ++ if (entry->send_tim_signal) { ++ send_tim_update = TRUE; ++ entry->send_tim_signal = 0; ++ entry->traffic_lastreported_bmp = entry->traffic_pending_bmp; ++ } ++ if (header_needed) { ++ hslot = dhd_wlfc_hanger_get_free_slot(ctx->hanger); ++ free_ctr = WLFC_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); ++ DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); ++ WLFC_PKTFLAG_SET_GENERATION(htod, entry->generation); ++ entry->transit_count++; ++ } ++ else { ++ hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ } ++ WLFC_PKTID_HSLOT_SET(htod, hslot); ++ WLFC_PKTID_FREERUNCTR_SET(htod, free_ctr); ++ DHD_PKTTAG_SETPKTDIR(PKTTAG(p), 1); ++ WL_TXSTATUS_SET_FLAGS(htod, WLFC_PKTFLAG_PKTFROMHOST); ++ WL_TXSTATUS_SET_FIFO(htod, DHD_PKTTAG_FIFO(PKTTAG(p))); ++ ++ ++ if (!DHD_PKTTAG_CREDITCHECK(PKTTAG(p))) { ++ /* ++ Indicate that this packet is being sent in response to an ++ explicit request from the firmware side. ++ */ ++ WLFC_PKTFLAG_SET_PKTREQUESTED(htod); ++ } ++ else { ++ WLFC_PKTFLAG_CLR_PKTREQUESTED(htod); ++ } ++ if (header_needed) { ++ rc = _dhd_wlfc_pushheader(ctx, p, send_tim_update, ++ entry->traffic_lastreported_bmp, entry->mac_handle, htod); ++ if (rc == BCME_OK) { ++ DHD_PKTTAG_SET_H2DTAG(PKTTAG(p), htod); ++ /* ++ a new header was created for this packet. ++ push to hanger slot and scrub q. Since bus ++ send succeeded, increment seq number as well. ++ */ ++ rc = dhd_wlfc_hanger_pushpkt(ctx->hanger, p, hslot); ++ if (rc == BCME_OK) { ++ /* increment free running sequence count */ ++ WLFC_INCR_SEQCOUNT(entry, DHD_PKTTAG_FIFO(PKTTAG(p))); ++#ifdef PROP_TXSTATUS_DEBUG ++ ((wlfc_hanger_t*)(ctx->hanger))->items[hslot].push_time = ++ OSL_SYSUPTIME(); ++#endif ++ } ++ else { ++ AP6210_DEBUG("%s() hanger_pushpkt() failed, rc: %d\n", ++ __FUNCTION__, rc); ++ } ++ } ++ } ++ else { ++ int gen; ++ ++ /* remove old header */ ++ rc = _dhd_wlfc_pullheader(ctx, p); ++ if (rc == BCME_OK) { ++ hslot = WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ dhd_wlfc_hanger_get_genbit(ctx->hanger, p, hslot, &gen); ++ ++ WLFC_PKTFLAG_SET_GENERATION(htod, gen); ++ free_ctr = WLFC_PKTID_FREERUNCTR_GET(DHD_PKTTAG_H2DTAG(PKTTAG(p))); ++ /* push new header */ ++ _dhd_wlfc_pushheader(ctx, p, send_tim_update, ++ entry->traffic_lastreported_bmp, entry->mac_handle, htod); ++ } ++ } ++ *slot = hslot; ++ return rc; ++} ++ ++static int ++_dhd_wlfc_is_destination_closed(athost_wl_status_info_t* ctx, ++ wlfc_mac_descriptor_t* entry, int prec) ++{ ++ if (ctx->destination_entries.interfaces[entry->interface_id].iftype == ++ WLC_E_IF_ROLE_P2P_GO) { ++ /* - destination interface is of type p2p GO. ++ For a p2pGO interface, if the destination is OPEN but the interface is ++ CLOSEd, do not send traffic. But if the dstn is CLOSEd while there is ++ destination-specific-credit left send packets. This is because the ++ firmware storing the destination-specific-requested packet in queue. ++ */ ++ if ((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && ++ (entry->requested_packet == 0)) ++ return 1; ++ } ++ /* AP, p2p_go -> unicast desc entry, STA/p2p_cl -> interface desc. entry */ ++ if (((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && ++ (entry->requested_packet == 0)) || ++ (!(entry->ac_bitmap & (1 << prec)))) ++ return 1; ++ ++ return 0; ++} ++ ++static void* ++_dhd_wlfc_deque_delayedq(athost_wl_status_info_t* ctx, ++ int prec, uint8* ac_credit_spent, uint8* needs_hdr, wlfc_mac_descriptor_t** entry_out) ++{ ++ wlfc_mac_descriptor_t* entry; ++ wlfc_mac_descriptor_t* table; ++ uint8 token_pos; ++ int total_entries; ++ void* p = NULL; ++ int pout; ++ int i; ++ ++ *entry_out = NULL; ++ token_pos = ctx->token_pos[prec]; ++ /* most cases a packet will count against FIFO credit */ ++ *ac_credit_spent = 1; ++ *needs_hdr = 1; ++ ++ /* search all entries, include nodes as well as interfaces */ ++ table = (wlfc_mac_descriptor_t*)&ctx->destination_entries; ++ total_entries = sizeof(ctx->destination_entries)/sizeof(wlfc_mac_descriptor_t); ++ ++ for (i = 0; i < total_entries; i++) { ++ entry = &table[(token_pos + i) % total_entries]; ++ if (entry->occupied && !entry->deleting) { ++ if (!_dhd_wlfc_is_destination_closed(ctx, entry, prec)) { ++ p = pktq_mdeq(&entry->psq, ++ /* higher precedence will be picked up first, ++ * i.e. suppressed packets before delayed ones ++ */ ++ NBITVAL((prec << 1) + 1), &pout); ++ *needs_hdr = 0; ++ ++ if (p == NULL) { ++ if (entry->suppressed == TRUE) { ++ if ((entry->suppr_transit_count <= ++ entry->suppress_count)) { ++ entry->suppressed = FALSE; ++ } else { ++ return NULL; ++ } ++ } ++ /* De-Q from delay Q */ ++ p = pktq_mdeq(&entry->psq, ++ NBITVAL((prec << 1)), ++ &pout); ++ *needs_hdr = 1; ++ } ++ ++ if (p != NULL) { ++ /* did the packet come from suppress sub-queue? */ ++ if (entry->requested_credit > 0) { ++ entry->requested_credit--; ++#ifdef PROP_TXSTATUS_DEBUG ++ entry->dstncredit_sent_packets++; ++#endif ++ /* ++ if the packet was pulled out while destination is in ++ closed state but had a non-zero packets requested, ++ then this should not count against the FIFO credit. ++ That is due to the fact that the firmware will ++ most likely hold onto this packet until a suitable ++ time later to push it to the appropriate AC FIFO. ++ */ ++ if (entry->state == WLFC_STATE_CLOSE) ++ *ac_credit_spent = 0; ++ } ++ else if (entry->requested_packet > 0) { ++ entry->requested_packet--; ++ DHD_PKTTAG_SETONETIMEPKTRQST(PKTTAG(p)); ++ if (entry->state == WLFC_STATE_CLOSE) ++ *ac_credit_spent = 0; ++ } ++ /* move token to ensure fair round-robin */ ++ ctx->token_pos[prec] = ++ (token_pos + i + 1) % total_entries; ++ *entry_out = entry; ++ _dhd_wlfc_flow_control_check(ctx, &entry->psq, ++ DHD_PKTTAG_IF(PKTTAG(p))); ++ /* ++ A packet has been picked up, update traffic ++ availability bitmap, if applicable ++ */ ++ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); ++ return p; ++ } ++ } ++ } ++ } ++ return NULL; ++} ++ ++void * ++_dhd_wlfc_pktq_peek_tail(struct pktq *pq, int *prec_out) ++{ ++ int prec; ++ ++ ASSERT(pq); ++ ++ if (pq->len == 0) ++ return NULL; ++ ++ for (prec = 0; prec < pq->hi_prec; prec++) ++ /* only pick packets from dealyed-q */ ++ if (((prec & 1) == 0) && pq->q[prec].head) ++ break; ++ ++ if (prec_out) ++ *prec_out = prec; ++ ++ return (pq->q[prec].tail); ++} ++ ++bool ++_dhd_wlfc_prec_enq_with_drop(dhd_pub_t *dhdp, struct pktq *pq, void *pkt, int prec) ++{ ++ void *p = NULL; ++ int eprec = -1; /* precedence to evict from */ ++ ++ ASSERT(dhdp && pq && pkt); ++ ASSERT(prec >= 0 && prec < pq->num_prec); ++ ++ /* Fast case, precedence queue is not full and we are also not ++ * exceeding total queue length ++ */ ++ if (!pktq_pfull(pq, prec) && !pktq_full(pq)) { ++ pktq_penq(pq, prec, pkt); ++ return TRUE; ++ } ++ ++ /* Determine precedence from which to evict packet, if any */ ++ if (pktq_pfull(pq, prec)) ++ eprec = prec; ++ else if (pktq_full(pq)) { ++ p = _dhd_wlfc_pktq_peek_tail(pq, &eprec); ++ if (!p) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return FALSE; ++ } ++ if ((eprec > prec) || (eprec < 0)) { ++ if (!pktq_pempty(pq, prec)) { ++ eprec = prec; ++ } else { ++ return FALSE; ++ } ++ } ++ } ++ ++ /* Evict if needed */ ++ if (eprec >= 0) { ++ /* Detect queueing to unconfigured precedence */ ++ ASSERT(!pktq_pempty(pq, eprec)); ++ /* Evict all fragmented frames */ ++ dhd_prec_drop_pkts(dhdp->osh, pq, eprec); ++ } ++ ++ /* Enqueue */ ++ p = pktq_penq(pq, prec, pkt); ++ if (!p) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++static int ++_dhd_wlfc_enque_delayq(athost_wl_status_info_t* ctx, void* pktbuf, int prec) ++{ ++ wlfc_mac_descriptor_t* entry; ++ ++ if (pktbuf != NULL) { ++ entry = _dhd_wlfc_find_table_entry(ctx, pktbuf); ++ ++ if (entry == NULL) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_ERROR; ++ } ++ ++ /* ++ - suppressed packets go to sub_queue[2*prec + 1] AND ++ - delayed packets go to sub_queue[2*prec + 0] to ensure ++ order of delivery. ++ */ ++ if (_dhd_wlfc_prec_enq_with_drop(ctx->dhdp, &entry->psq, pktbuf, (prec << 1)) ++ == FALSE) { ++ AP6210_DEBUG("D"); ++ /* dhd_txcomplete(ctx->dhdp, pktbuf, FALSE); */ ++ PKTFREE(ctx->osh, pktbuf, TRUE); ++ ctx->stats.delayq_full_error++; ++ return BCME_ERROR; ++ } ++ ++ /* ++ A packet has been pushed, update traffic availability bitmap, ++ if applicable ++ */ ++ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); ++ ++ } ++ return BCME_OK; ++} ++ ++bool ifpkt_fn(void* p, int ifid) ++{ ++ return (ifid == DHD_PKTTAG_IF(PKTTAG(p))); ++} ++ ++static int ++_dhd_wlfc_mac_entry_update(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, ++ ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) ++{ ++ int rc = BCME_OK; ++ ++ if (action == eWLFC_MAC_ENTRY_ACTION_ADD) { ++ entry->occupied = 1; ++ entry->state = WLFC_STATE_OPEN; ++ entry->requested_credit = 0; ++ entry->interface_id = ifid; ++ entry->iftype = iftype; ++ entry->ac_bitmap = 0xff; /* update this when handling APSD */ ++ /* for an interface entry we may not care about the MAC address */ ++ if (ea != NULL) ++ memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); ++ pktq_init(&entry->psq, WLFC_PSQ_PREC_COUNT, WLFC_PSQ_LEN); ++ } ++ else if (action == eWLFC_MAC_ENTRY_ACTION_UPDATE) { ++ entry->occupied = 1; ++ entry->state = WLFC_STATE_OPEN; ++ entry->requested_credit = 0; ++ entry->interface_id = ifid; ++ entry->iftype = iftype; ++ entry->ac_bitmap = 0xff; /* update this when handling APSD */ ++ /* for an interface entry we may not care about the MAC address */ ++ if (ea != NULL) ++ memcpy(&entry->ea[0], ea, ETHER_ADDR_LEN); ++ } ++ else if (action == eWLFC_MAC_ENTRY_ACTION_DEL) { ++ /* When the entry is deleted, the packets that are queued in the entry must be ++ cleanup. The cleanup action should be before the occupied is set as 0. The ++ flag deleting is set to avoid de-queue action when these queues are being ++ cleanup ++ */ ++ entry->deleting = 1; ++ dhd_wlfc_cleanup(ctx->dhdp, ifpkt_fn, ifid); ++ _dhd_wlfc_flow_control_check(ctx, &entry->psq, ifid); ++ entry->deleting = 0; ++ ++ entry->occupied = 0; ++ entry->suppressed = 0; ++ entry->state = WLFC_STATE_CLOSE; ++ entry->requested_credit = 0; ++ entry->transit_count = 0; ++ entry->suppr_transit_count = 0; ++ entry->suppress_count = 0; ++ memset(&entry->ea[0], 0, ETHER_ADDR_LEN); ++ ++ /* enable after packets are queued-deqeued properly. ++ pktq_flush(dhd->osh, &entry->psq, FALSE, NULL, 0); ++ */ ++ } ++ return rc; ++} ++ ++int ++_dhd_wlfc_borrow_credit(athost_wl_status_info_t* ctx, uint8 available_credit_map, int borrower_ac) ++{ ++ int lender_ac; ++ int rc = BCME_ERROR; ++ ++ if (ctx == NULL || available_credit_map == 0) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_BADARG; ++ } ++ ++ /* Borrow from lowest priority available AC (including BC/MC credits) */ ++ for (lender_ac = 0; lender_ac <= AC_COUNT; lender_ac++) { ++ if ((available_credit_map && (1 << lender_ac)) && ++ (ctx->FIFO_credit[lender_ac] > 0)) { ++ ctx->credits_borrowed[borrower_ac][lender_ac]++; ++ ctx->FIFO_credit[lender_ac]--; ++ rc = BCME_OK; ++ break; ++ } ++ } ++ ++ return rc; ++} ++ ++int ++dhd_wlfc_interface_entry_update(void* state, ++ ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea) ++{ ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ wlfc_mac_descriptor_t* entry; ++ int ret; ++ ++ if (ifid >= WLFC_MAX_IFNUM) ++ return BCME_BADARG; ++ ++ entry = &ctx->destination_entries.interfaces[ifid]; ++ ret = _dhd_wlfc_mac_entry_update(ctx, entry, action, ifid, iftype, ea); ++ return ret; ++} ++ ++int ++dhd_wlfc_FIFOcreditmap_update(void* state, uint8* credits) ++{ ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ ++ /* update the AC FIFO credit map */ ++ ctx->FIFO_credit[0] = credits[0]; ++ ctx->FIFO_credit[1] = credits[1]; ++ ctx->FIFO_credit[2] = credits[2]; ++ ctx->FIFO_credit[3] = credits[3]; ++ /* credit for bc/mc packets */ ++ ctx->FIFO_credit[4] = credits[4]; ++ /* credit for ATIM FIFO is not used yet. */ ++ ctx->FIFO_credit[5] = 0; ++ return BCME_OK; ++} ++ ++int ++_dhd_wlfc_handle_packet_commit(athost_wl_status_info_t* ctx, int ac, ++ dhd_wlfc_commit_info_t *commit_info, f_commitpkt_t fcommit, void* commit_ctx) ++{ ++ uint32 hslot; ++ int rc; ++ ++ /* ++ if ac_fifo_credit_spent = 0 ++ ++ This packet will not count against the FIFO credit. ++ To ensure the txstatus corresponding to this packet ++ does not provide an implied credit (default behavior) ++ mark the packet accordingly. ++ ++ if ac_fifo_credit_spent = 1 ++ ++ This is a normal packet and it counts against the FIFO ++ credit count. ++ */ ++ DHD_PKTTAG_SETCREDITCHECK(PKTTAG(commit_info->p), commit_info->ac_fifo_credit_spent); ++ rc = _dhd_wlfc_pretx_pktprocess(ctx, commit_info->mac_entry, commit_info->p, ++ commit_info->needs_hdr, &hslot); ++ ++ if (rc == BCME_OK) ++ rc = fcommit(commit_ctx, commit_info->p); ++ else ++ ctx->stats.generic_error++; ++ ++ if (rc == BCME_OK) { ++ ctx->stats.pkt2bus++; ++ if (commit_info->ac_fifo_credit_spent) { ++ ctx->stats.send_pkts[ac]++; ++ WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac); ++ } ++ } else if (rc == BCME_NORESOURCE) ++ rc = BCME_ERROR; ++ else { ++ /* ++ bus commit has failed, rollback. ++ - remove wl-header for a delayed packet ++ - save wl-header header for suppressed packets ++ */ ++ rc = _dhd_wlfc_rollback_packet_toq(ctx, commit_info->p, ++ (commit_info->pkt_type), hslot); ++ ++ rc = BCME_ERROR; ++ } ++ ++ return rc; ++} ++ ++int ++dhd_wlfc_commit_packets(void* state, f_commitpkt_t fcommit, void* commit_ctx, void *pktbuf) ++{ ++ int ac; ++ int credit; ++ int rc; ++ dhd_wlfc_commit_info_t commit_info; ++ athost_wl_status_info_t* ctx = (athost_wl_status_info_t*)state; ++ int credit_count = 0; ++ int bus_retry_count = 0; ++ uint8 ac_available = 0; /* Bitmask for 4 ACs + BC/MC */ ++ ++ if ((state == NULL) || ++ (fcommit == NULL)) { ++ AP6210_DEBUG("Error: %s():%d\n", __FUNCTION__, __LINE__); ++ return BCME_BADARG; ++ } ++ ++ memset(&commit_info, 0, sizeof(commit_info)); ++ ++ /* ++ Commit packets for regular AC traffic. Higher priority first. ++ First, use up FIFO credits available to each AC. Based on distribution ++ and credits left, borrow from other ACs as applicable ++ ++ -NOTE: ++ If the bus between the host and firmware is overwhelmed by the ++ traffic from host, it is possible that higher priority traffic ++ starves the lower priority queue. If that occurs often, we may ++ have to employ weighted round-robin or ucode scheme to avoid ++ low priority packet starvation. ++ */ ++ ++ if (pktbuf) { ++ ac = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); ++ if (ETHER_ISMULTI(DHD_PKTTAG_DSTN(PKTTAG(pktbuf)))) { ++ ASSERT(ac == AC_COUNT); ++ commit_info.needs_hdr = 1; ++ commit_info.mac_entry = NULL; ++ commit_info.pkt_type = eWLFC_PKTTYPE_NEW; ++ commit_info.p = pktbuf; ++ if (ctx->FIFO_credit[ac]) { ++ rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, ++ fcommit, commit_ctx); ++ ++ /* Bus commits may fail (e.g. flow control); abort after retries */ ++ if (rc == BCME_OK) { ++ if (commit_info.ac_fifo_credit_spent) { ++ (void) _dhd_wlfc_borrow_credit(ctx, ++ ac_available, ac); ++ credit_count--; ++ } ++ } else { ++ bus_retry_count++; ++ if (bus_retry_count >= BUS_RETRIES) { ++ AP6210_ERR(" %s: bus error %d\n", ++ __FUNCTION__, rc); ++ return rc; ++ } ++ } ++ } ++ } ++ else { ++ /* en-queue the packets to respective queue. */ ++ rc = _dhd_wlfc_enque_delayq(ctx, pktbuf, ac); ++ } ++ } ++ ++ for (ac = AC_COUNT; ac >= 0; ac--) { ++ ++ bool bQueueIdle = TRUE; ++ ++ /* packets from delayQ with less priority are fresh and they'd need header and ++ * have no MAC entry ++ */ ++ commit_info.needs_hdr = 1; ++ commit_info.mac_entry = NULL; ++ commit_info.pkt_type = eWLFC_PKTTYPE_NEW; ++ ++ for (credit = 0; credit < ctx->FIFO_credit[ac];) { ++ commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, ++ &(commit_info.ac_fifo_credit_spent), ++ &(commit_info.needs_hdr), ++ &(commit_info.mac_entry)); ++ ++ if (commit_info.p == NULL) ++ break; ++ ++ bQueueIdle = FALSE; ++ ++ commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : ++ eWLFC_PKTTYPE_SUPPRESSED; ++ ++ rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, ++ fcommit, commit_ctx); ++ ++ /* Bus commits may fail (e.g. flow control); abort after retries */ ++ if (rc == BCME_OK) { ++ if (commit_info.ac_fifo_credit_spent) { ++ credit++; ++ } ++ } ++ else { ++ bus_retry_count++; ++ if (bus_retry_count >= BUS_RETRIES) { ++ AP6210_ERR("%s: bus error %d\n", __FUNCTION__, rc); ++ ctx->FIFO_credit[ac] -= credit; ++ return rc; ++ } ++ } ++ } ++ ++ ctx->FIFO_credit[ac] -= credit; ++ ++ ++ /* If no pkts can be dequed, the credit can be borrowed */ ++ if (bQueueIdle) { ++ ac_available |= (1 << ac); ++ credit_count += ctx->FIFO_credit[ac]; ++ } ++ } ++ ++ /* We borrow only for AC_BE and only if no other traffic seen for DEFER_PERIOD ++ ++ Note that (ac_available & WLFC_AC_BE_TRAFFIC_ONLY) is done to: ++ a) ignore BC/MC for deferring borrow ++ b) ignore AC_BE being available along with other ACs ++ (this should happen only for pure BC/MC traffic) ++ ++ i.e. AC_VI, AC_VO, AC_BK all MUST be available (i.e. no traffic) and ++ we do not care if AC_BE and BC/MC are available or not ++ */ ++ if ((ac_available & WLFC_AC_BE_TRAFFIC_ONLY) == WLFC_AC_BE_TRAFFIC_ONLY) { ++ ++ if (ctx->allow_credit_borrow) { ++ ac = 1; /* Set ac to AC_BE and borrow credits */ ++ } ++ else { ++ int delta; ++ int curr_t = OSL_SYSUPTIME(); ++ ++ if (curr_t > ctx->borrow_defer_timestamp) ++ delta = curr_t - ctx->borrow_defer_timestamp; ++ else ++ delta = 0xffffffff + curr_t - ctx->borrow_defer_timestamp; ++ ++ if (delta >= WLFC_BORROW_DEFER_PERIOD_MS) { ++ /* Reset borrow but defer to next iteration (defensive borrowing) */ ++ ctx->allow_credit_borrow = TRUE; ++ ctx->borrow_defer_timestamp = 0; ++ } ++ return BCME_OK; ++ } ++ } ++ else { ++ /* If we have multiple AC traffic, turn off borrowing, mark time and bail out */ ++ ctx->allow_credit_borrow = FALSE; ++ ctx->borrow_defer_timestamp = OSL_SYSUPTIME(); ++ return BCME_OK; ++ } ++ ++ /* At this point, borrow all credits only for "ac" (which should be set above to AC_BE) ++ Generically use "ac" only in case we extend to all ACs in future ++ */ ++ for (; (credit_count > 0);) { ++ ++ commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, ++ &(commit_info.ac_fifo_credit_spent), ++ &(commit_info.needs_hdr), ++ &(commit_info.mac_entry)); ++ if (commit_info.p == NULL) ++ break; ++ ++ commit_info.pkt_type = (commit_info.needs_hdr) ? eWLFC_PKTTYPE_DELAYED : ++ eWLFC_PKTTYPE_SUPPRESSED; ++ ++ rc = _dhd_wlfc_handle_packet_commit(ctx, ac, &commit_info, ++ fcommit, commit_ctx); ++ ++ /* Bus commits may fail (e.g. flow control); abort after retries */ ++ if (rc == BCME_OK) { ++ if (commit_info.ac_fifo_credit_spent) { ++ (void) _dhd_wlfc_borrow_credit(ctx, ac_available, ac); ++ credit_count--; ++ } ++ } ++ else { ++ bus_retry_count++; ++ if (bus_retry_count >= BUS_RETRIES) { ++ AP6210_ERR("%s: bus error %d\n", __FUNCTION__, rc); ++ return rc; ++ } ++ } ++ } ++ return BCME_OK; ++} ++ ++static uint8 ++dhd_wlfc_find_mac_desc_id_from_mac(dhd_pub_t *dhdp, uint8* ea) ++{ ++ wlfc_mac_descriptor_t* table = ++ ((athost_wl_status_info_t*)dhdp->wlfc_state)->destination_entries.nodes; ++ uint8 table_index; ++ ++ if (ea != NULL) { ++ for (table_index = 0; table_index < WLFC_MAC_DESC_TABLE_SIZE; table_index++) { ++ if ((memcmp(ea, &table[table_index].ea[0], ETHER_ADDR_LEN) == 0) && ++ table[table_index].occupied) ++ return table_index; ++ } ++ } ++ return WLFC_MAC_DESC_ID_INVALID; ++} ++ ++void ++dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success) ++{ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ void* p; ++ int fifo_id; ++ ++ if (DHD_PKTTAG_SIGNALONLY(PKTTAG(txp))) { ++#ifdef PROP_TXSTATUS_DEBUG ++ wlfc->stats.signal_only_pkts_freed++; ++#endif ++ /* is this a signal-only packet? */ ++ if (success) ++ PKTFREE(wlfc->osh, txp, TRUE); ++ return; ++ } ++ if (!success) { ++ AP6210_DEBUG("At: %s():%d, bus_complete() failure for %p, htod_tag:0x%08x\n", ++ __FUNCTION__, __LINE__, txp, DHD_PKTTAG_H2DTAG(PKTTAG(txp))); ++ dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(DHD_PKTTAG_H2DTAG ++ (PKTTAG(txp))), &p, 1); ++ ++ /* indicate failure and free the packet */ ++ dhd_txcomplete(dhd, txp, FALSE); ++ ++ /* return the credit, if necessary */ ++ if (DHD_PKTTAG_CREDITCHECK(PKTTAG(txp))) { ++ int lender, credit_returned = 0; /* Note that borrower is fifo_id */ ++ ++ fifo_id = DHD_PKTTAG_FIFO(PKTTAG(txp)); ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; lender >= 0; lender--) { ++ if (wlfc->credits_borrowed[fifo_id][lender] > 0) { ++ wlfc->FIFO_credit[lender]++; ++ wlfc->credits_borrowed[fifo_id][lender]--; ++ credit_returned = 1; ++ break; ++ } ++ } ++ ++ if (!credit_returned) { ++ wlfc->FIFO_credit[fifo_id]++; ++ } ++ } ++ ++ PKTFREE(wlfc->osh, txp, TRUE); ++ } ++ return; ++} ++ ++static int ++dhd_wlfc_compressed_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info, uint8 len) ++{ ++ uint8 status_flag; ++ uint32 status; ++ int ret; ++ int remove_from_hanger = 1; ++ void* pktbuf; ++ uint8 fifo_id; ++ uint8 count = 0; ++ uint32 status_g; ++ uint32 hslot, hcnt; ++ wlfc_mac_descriptor_t* entry = NULL; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ ++ memcpy(&status, pkt_info, sizeof(uint32)); ++ status_flag = WL_TXSTATUS_GET_FLAGS(status); ++ status_g = status & 0xff000000; ++ hslot = (status & 0x00ffff00) >> 8; ++ hcnt = status & 0xff; ++ len = pkt_info[4]; ++ ++ wlfc->stats.txstatus_in++; ++ ++ if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { ++ wlfc->stats.pkt_freed++; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { ++ wlfc->stats.d11_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { ++ wlfc->stats.wl_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { ++ wlfc->stats.wlc_tossed_pkts++; ++ } ++ while (count < len) { ++ status = (status_g << 24) | (hslot << 8) | (hcnt); ++ count++; ++ hslot++; ++ hcnt++; ++ ++ ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); ++ if (ret != BCME_OK) { ++ /* do something */ ++ continue; ++ } ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ ++ if (!remove_from_hanger) { ++ /* this packet was suppressed */ ++ if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { ++ entry->suppressed = TRUE; ++ entry->suppress_count = pktq_mlen(&entry->psq, ++ NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); ++ entry->suppr_transit_count = entry->transit_count; ++ } ++ entry->generation = WLFC_PKTID_GEN(status); ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ uint32 new_t = OSL_SYSUPTIME(); ++ uint32 old_t; ++ uint32 delta; ++ old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ ++ WLFC_PKTID_HSLOT_GET(status)].push_time; ++ ++ ++ wlfc->stats.latency_sample_count++; ++ if (new_t > old_t) ++ delta = new_t - old_t; ++ else ++ delta = 0xffffffff + new_t - old_t; ++ wlfc->stats.total_status_latency += delta; ++ wlfc->stats.latency_most_recent = delta; ++ ++ wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; ++ if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) ++ wlfc->stats.idx_delta = 0; ++ } ++#endif /* PROP_TXSTATUS_DEBUG */ ++ ++ fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); ++ ++ /* pick up the implicit credit from this packet */ ++ if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { ++ if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { ++ ++ int lender, credit_returned = 0; /* Note that borrower is fifo_id */ ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; lender >= 0; lender--) { ++ if (wlfc->credits_borrowed[fifo_id][lender] > 0) { ++ wlfc->FIFO_credit[lender]++; ++ wlfc->credits_borrowed[fifo_id][lender]--; ++ credit_returned = 1; ++ break; ++ } ++ } ++ ++ if (!credit_returned) { ++ wlfc->FIFO_credit[fifo_id]++; ++ } ++ } ++ } ++ else { ++ /* ++ if this packet did not count against FIFO credit, it must have ++ taken a requested_credit from the destination entry (for pspoll etc.) ++ */ ++ if (!entry) { ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ } ++ if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) ++ entry->requested_credit++; ++#ifdef PROP_TXSTATUS_DEBUG ++ entry->dstncredit_acks++; ++#endif ++ } ++ if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || ++ (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { ++ ++ ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); ++ if (ret != BCME_OK) { ++ /* delay q is full, drop this packet */ ++ dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), ++ &pktbuf, 1); ++ ++ /* indicate failure and free the packet */ ++ dhd_txcomplete(dhd, pktbuf, FALSE); ++ entry->transit_count--; ++ DHD_WLFC_QMON_COMPLETE(entry); ++ /* packet is transmitted Successfully by dongle ++ * after first suppress. ++ */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } else { ++ /* Mark suppressed to avoid a double free during wlfc cleanup */ ++ ++ dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); ++ entry->suppress_count++; ++ } ++ } ++ else { ++ dhd_txcomplete(dhd, pktbuf, TRUE); ++ entry->transit_count--; ++ DHD_WLFC_QMON_COMPLETE(entry); ++ ++ /* This packet is transmitted Successfully by dongle ++ * even after first suppress. ++ */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ /* free the packet */ ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } ++ } ++ return BCME_OK; ++} ++ ++/* Handle discard or suppress indication */ ++static int ++dhd_wlfc_txstatus_update(dhd_pub_t *dhd, uint8* pkt_info) ++{ ++ uint8 status_flag; ++ uint32 status; ++ int ret; ++ int remove_from_hanger = 1; ++ void* pktbuf; ++ uint8 fifo_id; ++ wlfc_mac_descriptor_t* entry = NULL; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ ++ memcpy(&status, pkt_info, sizeof(uint32)); ++ status_flag = WL_TXSTATUS_GET_FLAGS(status); ++ wlfc->stats.txstatus_in++; ++ ++ if (status_flag == WLFC_CTL_PKTFLAG_DISCARD) { ++ wlfc->stats.pkt_freed++; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) { ++ wlfc->stats.d11_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS) { ++ wlfc->stats.wl_suppress++; ++ remove_from_hanger = 0; ++ } ++ ++ else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { ++ wlfc->stats.wlc_tossed_pkts++; ++ } ++ ++ ret = dhd_wlfc_hanger_poppkt(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), &pktbuf, remove_from_hanger); ++ if (ret != BCME_OK) { ++ /* do something */ ++ return ret; ++ } ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ ++ if (!remove_from_hanger) { ++ /* this packet was suppressed */ ++ if (!entry->suppressed || entry->generation != WLFC_PKTID_GEN(status)) { ++ entry->suppressed = TRUE; ++ entry->suppress_count = pktq_mlen(&entry->psq, ++ NBITVAL((WL_TXSTATUS_GET_FIFO(status) << 1) + 1)); ++ entry->suppr_transit_count = entry->transit_count; ++ } ++ entry->generation = WLFC_PKTID_GEN(status); ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ uint32 new_t = OSL_SYSUPTIME(); ++ uint32 old_t; ++ uint32 delta; ++ old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[ ++ WLFC_PKTID_HSLOT_GET(status)].push_time; ++ ++ ++ wlfc->stats.latency_sample_count++; ++ if (new_t > old_t) ++ delta = new_t - old_t; ++ else ++ delta = 0xffffffff + new_t - old_t; ++ wlfc->stats.total_status_latency += delta; ++ wlfc->stats.latency_most_recent = delta; ++ ++ wlfc->stats.deltas[wlfc->stats.idx_delta++] = delta; ++ if (wlfc->stats.idx_delta == sizeof(wlfc->stats.deltas)/sizeof(uint32)) ++ wlfc->stats.idx_delta = 0; ++ } ++#endif /* PROP_TXSTATUS_DEBUG */ ++ ++ fifo_id = DHD_PKTTAG_FIFO(PKTTAG(pktbuf)); ++ ++ /* pick up the implicit credit from this packet */ ++ if (DHD_PKTTAG_CREDITCHECK(PKTTAG(pktbuf))) { ++ if (wlfc->proptxstatus_mode == WLFC_FCMODE_IMPLIED_CREDIT) { ++ ++ int lender, credit_returned = 0; /* Note that borrower is fifo_id */ ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; lender >= 0; lender--) { ++ if (wlfc->credits_borrowed[fifo_id][lender] > 0) { ++ wlfc->FIFO_credit[lender]++; ++ wlfc->credits_borrowed[fifo_id][lender]--; ++ credit_returned = 1; ++ break; ++ } ++ } ++ ++ if (!credit_returned) { ++ wlfc->FIFO_credit[fifo_id]++; ++ } ++ } ++ } ++ else { ++ /* ++ if this packet did not count against FIFO credit, it must have ++ taken a requested_credit from the destination entry (for pspoll etc.) ++ */ ++ if (!entry) { ++ ++ entry = _dhd_wlfc_find_table_entry(wlfc, pktbuf); ++ } ++ if (!DHD_PKTTAG_ONETIMEPKTRQST(PKTTAG(pktbuf))) ++ entry->requested_credit++; ++#ifdef PROP_TXSTATUS_DEBUG ++ entry->dstncredit_acks++; ++#endif ++ } ++ if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || ++ (status_flag == WLFC_CTL_PKTFLAG_WLSUPPRESS)) { ++ ++ ret = _dhd_wlfc_enque_suppressed(wlfc, fifo_id, pktbuf); ++ if (ret != BCME_OK) { ++ /* delay q is full, drop this packet */ ++ dhd_wlfc_hanger_poppkt(wlfc->hanger, WLFC_PKTID_HSLOT_GET(status), ++ &pktbuf, 1); ++ ++ /* indicate failure and free the packet */ ++ dhd_txcomplete(dhd, pktbuf, FALSE); ++ entry->transit_count--; ++ DHD_WLFC_QMON_COMPLETE(entry); ++ /* This packet is transmitted Successfully by ++ * dongle even after first suppress. ++ */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } else { ++ /* Mark suppressed to avoid a double free during wlfc cleanup */ ++ ++ dhd_wlfc_hanger_mark_suppressed(wlfc->hanger, ++ WLFC_PKTID_HSLOT_GET(status), WLFC_PKTID_GEN(status)); ++ entry->suppress_count++; ++ } ++ } ++ else { ++ dhd_txcomplete(dhd, pktbuf, TRUE); ++ entry->transit_count--; ++ DHD_WLFC_QMON_COMPLETE(entry); ++ ++ /* This packet is transmitted Successfully by dongle even after first suppress. */ ++ if (entry->suppressed) { ++ entry->suppr_transit_count--; ++ } ++ /* free the packet */ ++ PKTFREE(wlfc->osh, pktbuf, TRUE); ++ } ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_fifocreditback_indicate(dhd_pub_t *dhd, uint8* credits) ++{ ++ int i; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ for (i = 0; i < WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK; i++) { ++#ifdef PROP_TXSTATUS_DEBUG ++ wlfc->stats.fifo_credits_back[i] += credits[i]; ++#endif ++ /* update FIFO credits */ ++ if (wlfc->proptxstatus_mode == WLFC_FCMODE_EXPLICIT_CREDIT) ++ { ++ int lender; /* Note that borrower is i */ ++ ++ /* Return credits to highest priority lender first */ ++ for (lender = AC_COUNT; (lender >= 0) && (credits[i] > 0); lender--) { ++ if (wlfc->credits_borrowed[i][lender] > 0) { ++ if (credits[i] >= wlfc->credits_borrowed[i][lender]) { ++ credits[i] -= wlfc->credits_borrowed[i][lender]; ++ wlfc->FIFO_credit[lender] += ++ wlfc->credits_borrowed[i][lender]; ++ wlfc->credits_borrowed[i][lender] = 0; ++ } ++ else { ++ wlfc->credits_borrowed[i][lender] -= credits[i]; ++ wlfc->FIFO_credit[lender] += credits[i]; ++ credits[i] = 0; ++ } ++ } ++ } ++ ++ /* If we have more credits left over, these must belong to the AC */ ++ if (credits[i] > 0) { ++ wlfc->FIFO_credit[i] += credits[i]; ++ } ++ } ++ } ++ ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_dbg_senum_check(dhd_pub_t *dhd, uint8 *value) ++{ ++ uint32 timestamp; ++ ++ (void)dhd; ++ ++ bcopy(&value[2], ×tamp, sizeof(uint32)); ++ AP6210_DEBUG("RXPKT: SEQ: %d, timestamp %d\n", value[1], timestamp); ++ return BCME_OK; ++} ++ ++ ++static int ++dhd_wlfc_rssi_indicate(dhd_pub_t *dhd, uint8* rssi) ++{ ++ (void)dhd; ++ (void)rssi; ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_mac_table_update(dhd_pub_t *dhd, uint8* value, uint8 type) ++{ ++ int rc; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ uint8 existing_index; ++ uint8 table_index; ++ uint8 ifid; ++ uint8* ea; ++ ++ AP6210_DEBUG("%s(), mac [%02x:%02x:%02x:%02x:%02x:%02x],%s,idx:%d,id:0x%02x\n", ++ __FUNCTION__, value[2], value[3], value[4], value[5], value[6], value[7], ++ ((type == WLFC_CTL_TYPE_MACDESC_ADD) ? "ADD":"DEL"), ++ WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]), value[0]); ++ ++ table = wlfc->destination_entries.nodes; ++ table_index = WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]); ++ ifid = value[1]; ++ ea = &value[2]; ++ ++ if (type == WLFC_CTL_TYPE_MACDESC_ADD) { ++ existing_index = dhd_wlfc_find_mac_desc_id_from_mac(dhd, &value[2]); ++ if (existing_index == WLFC_MAC_DESC_ID_INVALID) { ++ /* this MAC entry does not exist, create one */ ++ if (!table[table_index].occupied) { ++ table[table_index].mac_handle = value[0]; ++ rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], ++ eWLFC_MAC_ENTRY_ACTION_ADD, ifid, ++ wlfc->destination_entries.interfaces[ifid].iftype, ++ ea); ++ } ++ else { ++ /* the space should have been empty, but it's not */ ++ wlfc->stats.mac_update_failed++; ++ } ++ } ++ else { ++ /* ++ there is an existing entry, move it to new index ++ if necessary. ++ */ ++ if (existing_index != table_index) { ++ /* if we already have an entry, free the old one */ ++ table[existing_index].occupied = 0; ++ table[existing_index].state = WLFC_STATE_CLOSE; ++ table[existing_index].requested_credit = 0; ++ table[existing_index].interface_id = 0; ++ /* enable after packets are queued-deqeued properly. ++ pktq_flush(dhd->osh, &table[existing_index].psq, FALSE, NULL, 0); ++ */ ++ } ++ } ++ } ++ if (type == WLFC_CTL_TYPE_MACDESC_DEL) { ++ if (table[table_index].occupied) { ++ rc = _dhd_wlfc_mac_entry_update(wlfc, &table[table_index], ++ eWLFC_MAC_ENTRY_ACTION_DEL, ifid, ++ wlfc->destination_entries.interfaces[ifid].iftype, ++ ea); ++ } ++ else { ++ /* the space should have been occupied, but it's not */ ++ wlfc->stats.mac_update_failed++; ++ } ++ } ++ BCM_REFERENCE(rc); ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_psmode_update(dhd_pub_t *dhd, uint8* value, uint8 type) ++{ ++ /* Handle PS on/off indication */ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_mac_descriptor_t* desc; ++ uint8 mac_handle = value[0]; ++ int i; ++ ++ table = wlfc->destination_entries.nodes; ++ desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; ++ if (desc->occupied) { ++ /* a fresh PS mode should wipe old ps credits? */ ++ desc->requested_credit = 0; ++ if (type == WLFC_CTL_TYPE_MAC_OPEN) { ++ desc->state = WLFC_STATE_OPEN; ++ DHD_WLFC_CTRINC_MAC_OPEN(desc); ++ } ++ else { ++ desc->state = WLFC_STATE_CLOSE; ++ DHD_WLFC_CTRINC_MAC_CLOSE(desc); ++ /* ++ Indicate to firmware if there is any traffic pending. ++ */ ++ for (i = AC_BE; i < AC_COUNT; i++) { ++ _dhd_wlfc_traffic_pending_check(wlfc, desc, i); ++ } ++ } ++ } ++ else { ++ wlfc->stats.psmode_update_failed++; ++ } ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_interface_update(dhd_pub_t *dhd, uint8* value, uint8 type) ++{ ++ /* Handle PS on/off indication */ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ uint8 if_id = value[0]; ++ ++ if (if_id < WLFC_MAX_IFNUM) { ++ table = wlfc->destination_entries.interfaces; ++ if (table[if_id].occupied) { ++ if (type == WLFC_CTL_TYPE_INTERFACE_OPEN) { ++ table[if_id].state = WLFC_STATE_OPEN; ++ /* AP6210_DEBUG("INTERFACE[%d] OPEN\n", if_id); */ ++ } ++ else { ++ table[if_id].state = WLFC_STATE_CLOSE; ++ /* AP6210_DEBUG("INTERFACE[%d] CLOSE\n", if_id); */ ++ } ++ return BCME_OK; ++ } ++ } ++ wlfc->stats.interface_update_failed++; ++ ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_credit_request(dhd_pub_t *dhd, uint8* value) ++{ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_mac_descriptor_t* desc; ++ uint8 mac_handle; ++ uint8 credit; ++ ++ table = wlfc->destination_entries.nodes; ++ mac_handle = value[1]; ++ credit = value[0]; ++ ++ desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; ++ if (desc->occupied) { ++ desc->requested_credit = credit; ++ ++ desc->ac_bitmap = value[2]; ++ } ++ else { ++ wlfc->stats.credit_request_failed++; ++ } ++ return BCME_OK; ++} ++ ++static int ++dhd_wlfc_packet_request(dhd_pub_t *dhd, uint8* value) ++{ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_mac_descriptor_t* desc; ++ uint8 mac_handle; ++ uint8 packet_count; ++ ++ table = wlfc->destination_entries.nodes; ++ mac_handle = value[1]; ++ packet_count = value[0]; ++ ++ desc = &table[WLFC_MAC_DESC_GET_LOOKUP_INDEX(mac_handle)]; ++ if (desc->occupied) { ++ desc->requested_packet = packet_count; ++ ++ desc->ac_bitmap = value[2]; ++ } ++ else { ++ wlfc->stats.packet_request_failed++; ++ } ++ return BCME_OK; ++} ++ ++static void ++dhd_wlfc_reorderinfo_indicate(uint8 *val, uint8 len, uchar *info_buf, uint *info_len) ++{ ++ if (info_len) { ++ if (info_buf) { ++ bcopy(val, info_buf, len); ++ *info_len = len; ++ } ++ else ++ *info_len = 0; ++ } ++} ++ ++int ++dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len, uchar *reorder_info_buf, ++ uint *reorder_info_len) ++{ ++ uint8 type, len; ++ uint8* value; ++ uint8* tmpbuf; ++ uint16 remainder = tlv_hdr_len; ++ uint16 processed = 0; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ tmpbuf = (uint8*)PKTDATA(dhd->osh, pktbuf); ++ if (remainder) { ++ while ((processed < (WLFC_MAX_PENDING_DATALEN * 2)) && (remainder > 0)) { ++ type = tmpbuf[processed]; ++ if (type == WLFC_CTL_TYPE_FILLER) { ++ remainder -= 1; ++ processed += 1; ++ continue; ++ } ++ ++ len = tmpbuf[processed + 1]; ++ value = &tmpbuf[processed + 2]; ++ ++ if (remainder < (2 + len)) ++ break; ++ ++ remainder -= 2 + len; ++ processed += 2 + len; ++ if (type == WLFC_CTL_TYPE_TXSTATUS) ++ dhd_wlfc_txstatus_update(dhd, value); ++ if (type == WLFC_CTL_TYPE_COMP_TXSTATUS) ++ dhd_wlfc_compressed_txstatus_update(dhd, value, len); ++ ++ else if (type == WLFC_CTL_TYPE_HOST_REORDER_RXPKTS) ++ dhd_wlfc_reorderinfo_indicate(value, len, reorder_info_buf, ++ reorder_info_len); ++ else if (type == WLFC_CTL_TYPE_FIFO_CREDITBACK) ++ dhd_wlfc_fifocreditback_indicate(dhd, value); ++ ++ else if (type == WLFC_CTL_TYPE_RSSI) ++ dhd_wlfc_rssi_indicate(dhd, value); ++ ++ else if (type == WLFC_CTL_TYPE_MAC_REQUEST_CREDIT) ++ dhd_wlfc_credit_request(dhd, value); ++ ++ else if (type == WLFC_CTL_TYPE_MAC_REQUEST_PACKET) ++ dhd_wlfc_packet_request(dhd, value); ++ ++ else if ((type == WLFC_CTL_TYPE_MAC_OPEN) || ++ (type == WLFC_CTL_TYPE_MAC_CLOSE)) ++ dhd_wlfc_psmode_update(dhd, value, type); ++ ++ else if ((type == WLFC_CTL_TYPE_MACDESC_ADD) || ++ (type == WLFC_CTL_TYPE_MACDESC_DEL)) ++ dhd_wlfc_mac_table_update(dhd, value, type); ++ ++ else if (type == WLFC_CTL_TYPE_TRANS_ID) ++ dhd_wlfc_dbg_senum_check(dhd, value); ++ ++ else if ((type == WLFC_CTL_TYPE_INTERFACE_OPEN) || ++ (type == WLFC_CTL_TYPE_INTERFACE_CLOSE)) { ++ dhd_wlfc_interface_update(dhd, value, type); ++ } ++ } ++ if (remainder != 0) { ++ /* trouble..., something is not right */ ++ wlfc->stats.tlv_parse_failed++; ++ } ++ } ++ return BCME_OK; ++} ++ ++int ++dhd_wlfc_init(dhd_pub_t *dhd) ++{ ++ char iovbuf[12]; /* Room for "tlv" + '\0' + parameter */ ++ /* enable all signals & indicate host proptxstatus logic is active */ ++ uint32 tlv = dhd->wlfc_enabled? ++ WLFC_FLAGS_RSSI_SIGNALS | ++ WLFC_FLAGS_XONXOFF_SIGNALS | ++ WLFC_FLAGS_CREDIT_STATUS_SIGNALS | ++ WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | ++ WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; ++ /* WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | WLFC_FLAGS_HOST_RXRERODER_ACTIVE : 0; */ ++ ++ ++ /* ++ try to enable/disable signaling by sending "tlv" iovar. if that fails, ++ fallback to no flow control? Print a message for now. ++ */ ++ ++ /* enable proptxtstatus signaling by default */ ++ bcm_mkiovar("tlv", (char *)&tlv, 4, iovbuf, sizeof(iovbuf)); ++ if (dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0) < 0) { ++ AP6210_ERR("dhd_wlfc_init(): failed to enable/disable bdcv2 tlv signaling\n"); ++ } ++ else { ++ /* ++ Leaving the message for now, it should be removed after a while; once ++ the tlv situation is stable. ++ */ ++ AP6210_ERR("dhd_wlfc_init(): successfully %s bdcv2 tlv signaling, %d\n", ++ dhd->wlfc_enabled?"enabled":"disabled", tlv); ++ } ++ return BCME_OK; ++} ++ ++int ++dhd_wlfc_enable(dhd_pub_t *dhd) ++{ ++ int i; ++ athost_wl_status_info_t* wlfc; ++ ++ if (!dhd->wlfc_enabled || dhd->wlfc_state) ++ return BCME_OK; ++ ++ /* allocate space to track txstatus propagated from firmware */ ++ dhd->wlfc_state = MALLOC(dhd->osh, sizeof(athost_wl_status_info_t)); ++ if (dhd->wlfc_state == NULL) ++ return BCME_NOMEM; ++ ++ /* initialize state space */ ++ wlfc = (athost_wl_status_info_t*)dhd->wlfc_state; ++ memset(wlfc, 0, sizeof(athost_wl_status_info_t)); ++ ++ /* remember osh & dhdp */ ++ wlfc->osh = dhd->osh; ++ wlfc->dhdp = dhd; ++ ++ wlfc->hanger = ++ dhd_wlfc_hanger_create(dhd->osh, WLFC_HANGER_MAXITEMS); ++ if (wlfc->hanger == NULL) { ++ MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); ++ dhd->wlfc_state = NULL; ++ AP6210_ERR("Failed to malloc dhd->wlfc_state\n"); ++ return BCME_NOMEM; ++ } ++ ++ /* initialize all interfaces to accept traffic */ ++ for (i = 0; i < WLFC_MAX_IFNUM; i++) { ++ wlfc->hostif_flow_state[i] = OFF; ++ } ++ ++ wlfc->destination_entries.other.state = WLFC_STATE_OPEN; ++ /* bc/mc FIFO is always open [credit aside], i.e. b[5] */ ++ wlfc->destination_entries.other.ac_bitmap = 0x1f; ++ wlfc->destination_entries.other.interface_id = 0; ++ ++ wlfc->proptxstatus_mode = WLFC_FCMODE_EXPLICIT_CREDIT; ++ ++ wlfc->allow_credit_borrow = TRUE; ++ wlfc->borrow_defer_timestamp = 0; ++ ++ return BCME_OK; ++} ++ ++/* release all packet resources */ ++void ++dhd_wlfc_cleanup(dhd_pub_t *dhd, ifpkt_cb_t fn, int arg) ++{ ++ int i; ++ int total_entries; ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ wlfc_mac_descriptor_t* table; ++ wlfc_hanger_t* h; ++ int prec; ++ void *pkt = NULL; ++ struct pktq *txq = NULL; ++ if (dhd->wlfc_state == NULL) ++ return; ++ /* flush bus->txq */ ++ txq = dhd_bus_txq(dhd->bus); ++ /* any in the hanger? */ ++ h = (wlfc_hanger_t*)wlfc->hanger; ++ total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); ++ /* search all entries, include nodes as well as interfaces */ ++ table = (wlfc_mac_descriptor_t*)&wlfc->destination_entries; ++ ++ for (i = 0; i < total_entries; i++) { ++ if (table[i].occupied && (fn == NULL || (arg == table[i].interface_id))) { ++ if (table[i].psq.len) { ++ AP6210_DEBUG("%s(): DELAYQ[%d].len = %d\n", ++ __FUNCTION__, i, table[i].psq.len); ++ /* release packets held in DELAYQ */ ++ pktq_flush(wlfc->osh, &table[i].psq, TRUE, fn, arg); ++ } ++ if (fn == NULL) ++ table[i].occupied = 0; ++ } ++ } ++ for (prec = 0; prec < txq->num_prec; prec++) { ++ pkt = pktq_pdeq_with_fn(txq, prec, fn, arg); ++ while (pkt) { ++ for (i = 0; i < h->max_items; i++) { ++ if (pkt == h->items[i].pkt) { ++ if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { ++ PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } else if (h->items[i].state == ++ WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { ++ /* These are already freed from the psq */ ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ break; ++ } ++ } ++ pkt = pktq_pdeq(txq, prec); ++ } ++ } ++ /* flush remained pkt in hanger queue, not in bus->txq */ ++ for (i = 0; i < h->max_items; i++) { ++ if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE) { ++ if (fn == NULL || (*fn)(h->items[i].pkt, arg)) { ++ PKTFREE(wlfc->osh, h->items[i].pkt, TRUE); ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ } else if (h->items[i].state == WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED) { ++ if (fn == NULL || (*fn)(h->items[i].pkt, arg)) { ++ /* These are freed from the psq so no need to free again */ ++ h->items[i].state = WLFC_HANGER_ITEM_STATE_FREE; ++ } ++ } ++ } ++ return; ++} ++ ++void ++dhd_wlfc_deinit(dhd_pub_t *dhd) ++{ ++ /* cleanup all psq related resources */ ++ athost_wl_status_info_t* wlfc = (athost_wl_status_info_t*) ++ dhd->wlfc_state; ++ ++ dhd_os_wlfc_block(dhd); ++ if (dhd->wlfc_state == NULL) { ++ dhd_os_wlfc_unblock(dhd); ++ return; ++ } ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ { ++ int i; ++ wlfc_hanger_t* h = (wlfc_hanger_t*)wlfc->hanger; ++ for (i = 0; i < h->max_items; i++) { ++ if (h->items[i].state != WLFC_HANGER_ITEM_STATE_FREE) { ++ AP6210_DEBUG("%s() pkt[%d] = 0x%p, FIFO_credit_used:%d\n", ++ __FUNCTION__, i, h->items[i].pkt, ++ DHD_PKTTAG_CREDITCHECK(PKTTAG(h->items[i].pkt))); ++ } ++ } ++ } ++#endif ++ /* delete hanger */ ++ dhd_wlfc_hanger_delete(dhd->osh, wlfc->hanger); ++ ++ /* free top structure */ ++ MFREE(dhd->osh, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); ++ dhd->wlfc_state = NULL; ++ dhd_os_wlfc_unblock(dhd); ++ ++ return; ++} ++#endif /* PROP_TXSTATUS */ +diff --git a/drivers/net/wireless/ap6210/dhd_wlfc.h b/drivers/net/wireless/ap6210/dhd_wlfc.h +new file mode 100644 +index 0000000..42b350c +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dhd_wlfc.h +@@ -0,0 +1,288 @@ ++/* ++* Copyright (C) 1999-2012, Broadcom Corporation ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2 (the "GPL"), ++* available at http://www.broadcom.com/licenses/GPLv2.php, with the ++* following added to such license: ++* ++* As a special exception, the copyright holders of this software give you ++* permission to link this software with independent modules, and to copy and ++* distribute the resulting executable under terms of your choice, provided that ++* you also meet, for each linked independent module, the terms and conditions of ++* the license of that module. An independent module is a module which is not ++* derived from this software. The special exception does not apply to any ++* modifications of the software. ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a license ++* other than the GPL, without Broadcom's express prior written consent. ++* $Id: dhd_wlfc.h 361006 2012-10-05 07:45:51Z $ ++* ++*/ ++#ifndef __wlfc_host_driver_definitions_h__ ++#define __wlfc_host_driver_definitions_h__ ++ ++/* 16 bits will provide an absolute max of 65536 slots */ ++#define WLFC_HANGER_MAXITEMS 1024 ++ ++#define WLFC_HANGER_ITEM_STATE_FREE 1 ++#define WLFC_HANGER_ITEM_STATE_INUSE 2 ++#define WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED 3 ++#define WLFC_PKTID_HSLOT_MASK 0xffff /* allow 16 bits only */ ++#define WLFC_PKTID_HSLOT_SHIFT 8 ++ ++/* x -> TXSTATUS TAG to/from firmware */ ++#define WLFC_PKTID_HSLOT_GET(x) \ ++ (((x) >> WLFC_PKTID_HSLOT_SHIFT) & WLFC_PKTID_HSLOT_MASK) ++#define WLFC_PKTID_HSLOT_SET(var, slot) \ ++ ((var) = ((var) & ~(WLFC_PKTID_HSLOT_MASK << WLFC_PKTID_HSLOT_SHIFT)) | \ ++ (((slot) & WLFC_PKTID_HSLOT_MASK) << WLFC_PKTID_HSLOT_SHIFT)) ++ ++#define WLFC_PKTID_FREERUNCTR_MASK 0xff ++ ++#define WLFC_PKTID_FREERUNCTR_GET(x) ((x) & WLFC_PKTID_FREERUNCTR_MASK) ++#define WLFC_PKTID_FREERUNCTR_SET(var, ctr) \ ++ ((var) = (((var) & ~WLFC_PKTID_FREERUNCTR_MASK) | \ ++ (((ctr) & WLFC_PKTID_FREERUNCTR_MASK)))) ++ ++#define WLFC_PKTQ_PENQ(pq, prec, p) ((pktq_full((pq)) || pktq_pfull((pq), (prec)))? \ ++ NULL : pktq_penq((pq), (prec), (p))) ++#define WLFC_PKTQ_PENQ_HEAD(pq, prec, p) ((pktq_full((pq)) || pktq_pfull((pq), (prec))) ? \ ++ NULL : pktq_penq_head((pq), (prec), (p))) ++ ++typedef enum ewlfc_packet_state { ++ eWLFC_PKTTYPE_NEW, ++ eWLFC_PKTTYPE_DELAYED, ++ eWLFC_PKTTYPE_SUPPRESSED, ++ eWLFC_PKTTYPE_MAX ++} ewlfc_packet_state_t; ++ ++typedef enum ewlfc_mac_entry_action { ++ eWLFC_MAC_ENTRY_ACTION_ADD, ++ eWLFC_MAC_ENTRY_ACTION_DEL, ++ eWLFC_MAC_ENTRY_ACTION_UPDATE, ++ eWLFC_MAC_ENTRY_ACTION_MAX ++} ewlfc_mac_entry_action_t; ++ ++typedef struct wlfc_hanger_item { ++ uint8 state; ++ uint8 gen; ++ uint8 pad[2]; ++ uint32 identifier; ++ void* pkt; ++#ifdef PROP_TXSTATUS_DEBUG ++ uint32 push_time; ++#endif ++} wlfc_hanger_item_t; ++ ++typedef struct wlfc_hanger { ++ int max_items; ++ uint32 pushed; ++ uint32 popped; ++ uint32 failed_to_push; ++ uint32 failed_to_pop; ++ uint32 failed_slotfind; ++ wlfc_hanger_item_t items[1]; ++ uint32 slot_pos; ++} wlfc_hanger_t; ++ ++#define WLFC_HANGER_SIZE(n) ((sizeof(wlfc_hanger_t) - \ ++ sizeof(wlfc_hanger_item_t)) + ((n)*sizeof(wlfc_hanger_item_t))) ++ ++#define WLFC_STATE_OPEN 1 ++#define WLFC_STATE_CLOSE 2 ++ ++#define WLFC_PSQ_PREC_COUNT ((AC_COUNT + 1) * 2) /* 2 for each AC traffic and bc/mc */ ++ ++#define WLFC_PSQ_LEN 2048 ++ ++#define WLFC_SENDQ_LEN 256 ++ ++ ++#define WLFC_FLOWCONTROL_HIWATER (2048 - 256) ++#define WLFC_FLOWCONTROL_LOWATER 256 ++ ++ ++typedef struct wlfc_mac_descriptor { ++ uint8 occupied; ++ uint8 interface_id; ++ uint8 iftype; ++ uint8 state; ++ uint8 ac_bitmap; /* for APSD */ ++ uint8 requested_credit; ++ uint8 requested_packet; ++ uint8 ea[ETHER_ADDR_LEN]; ++ /* ++ maintain (MAC,AC) based seq count for ++ packets going to the device. As well as bc/mc. ++ */ ++ uint8 seq[AC_COUNT + 1]; ++ uint8 generation; ++ struct pktq psq; ++ /* The AC pending bitmap that was reported to the fw at last change */ ++ uint8 traffic_lastreported_bmp; ++ /* The new AC pending bitmap */ ++ uint8 traffic_pending_bmp; ++ /* 1= send on next opportunity */ ++ uint8 send_tim_signal; ++ uint8 mac_handle; ++ uint transit_count; ++ uint suppr_transit_count; ++ uint suppress_count; ++ uint8 suppressed; ++ ++#ifdef PROP_TXSTATUS_DEBUG ++ uint32 dstncredit_sent_packets; ++ uint32 dstncredit_acks; ++ uint32 opened_ct; ++ uint32 closed_ct; ++#endif ++} wlfc_mac_descriptor_t; ++ ++#define WLFC_DECR_SEQCOUNT(entry, prec) do { if (entry->seq[(prec)] == 0) {\ ++ entry->seq[prec] = 0xff; } else entry->seq[prec]--;} while (0) ++ ++#define WLFC_INCR_SEQCOUNT(entry, prec) entry->seq[(prec)]++ ++#define WLFC_SEQCOUNT(entry, prec) entry->seq[(prec)] ++ ++typedef struct athost_wl_stat_counters { ++ uint32 pktin; ++ uint32 pkt2bus; ++ uint32 pktdropped; ++ uint32 tlv_parse_failed; ++ uint32 rollback; ++ uint32 rollback_failed; ++ uint32 sendq_full_error; ++ uint32 delayq_full_error; ++ uint32 credit_request_failed; ++ uint32 packet_request_failed; ++ uint32 mac_update_failed; ++ uint32 psmode_update_failed; ++ uint32 interface_update_failed; ++ uint32 wlfc_header_only_pkt; ++ uint32 txstatus_in; ++ uint32 d11_suppress; ++ uint32 wl_suppress; ++ uint32 bad_suppress; ++ uint32 pkt_freed; ++ uint32 pkt_free_err; ++ uint32 psq_wlsup_retx; ++ uint32 psq_wlsup_enq; ++ uint32 psq_d11sup_retx; ++ uint32 psq_d11sup_enq; ++ uint32 psq_hostq_retx; ++ uint32 psq_hostq_enq; ++ uint32 mac_handle_notfound; ++ uint32 wlc_tossed_pkts; ++ uint32 dhd_hdrpulls; ++ uint32 generic_error; ++ /* an extra one for bc/mc traffic */ ++ uint32 sendq_pkts[AC_COUNT + 1]; ++#ifdef PROP_TXSTATUS_DEBUG ++ /* all pkt2bus -> txstatus latency accumulated */ ++ uint32 latency_sample_count; ++ uint32 total_status_latency; ++ uint32 latency_most_recent; ++ int idx_delta; ++ uint32 deltas[10]; ++ uint32 fifo_credits_sent[6]; ++ uint32 fifo_credits_back[6]; ++ uint32 dropped_qfull[6]; ++ uint32 signal_only_pkts_sent; ++ uint32 signal_only_pkts_freed; ++#endif ++} athost_wl_stat_counters_t; ++ ++#ifdef PROP_TXSTATUS_DEBUG ++#define WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac) do { \ ++ (ctx)->stats.fifo_credits_sent[(ac)]++;} while (0) ++#define WLFC_HOST_FIFO_CREDIT_INC_BACKCTRS(ctx, ac) do { \ ++ (ctx)->stats.fifo_credits_back[(ac)]++;} while (0) ++#define WLFC_HOST_FIFO_DROPPEDCTR_INC(ctx, ac) do { \ ++ (ctx)->stats.dropped_qfull[(ac)]++;} while (0) ++#else ++#define WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac) do {} while (0) ++#define WLFC_HOST_FIFO_CREDIT_INC_BACKCTRS(ctx, ac) do {} while (0) ++#define WLFC_HOST_FIFO_DROPPEDCTR_INC(ctx, ac) do {} while (0) ++#endif ++ ++#define WLFC_FCMODE_NONE 0 ++#define WLFC_FCMODE_IMPLIED_CREDIT 1 ++#define WLFC_FCMODE_EXPLICIT_CREDIT 2 ++ ++/* How long to defer borrowing in milliseconds */ ++#define WLFC_BORROW_DEFER_PERIOD_MS 100 ++ ++/* Mask to represent available ACs (note: BC/MC is ignored */ ++#define WLFC_AC_MASK 0xF ++ ++/* Mask to check for only on-going AC_BE traffic */ ++#define WLFC_AC_BE_TRAFFIC_ONLY 0xD ++ ++typedef struct athost_wl_status_info { ++ uint8 last_seqid_to_wlc; ++ ++ /* OSL handle */ ++ osl_t* osh; ++ /* dhd pub */ ++ void* dhdp; ++ ++ /* stats */ ++ athost_wl_stat_counters_t stats; ++ ++ /* the additional ones are for bc/mc and ATIM FIFO */ ++ int FIFO_credit[AC_COUNT + 2]; ++ ++ /* Credit borrow counts for each FIFO from each of the other FIFOs */ ++ int credits_borrowed[AC_COUNT + 2][AC_COUNT + 2]; ++ ++ struct pktq SENDQ; ++ ++ /* packet hanger and MAC->handle lookup table */ ++ void* hanger; ++ struct { ++ /* table for individual nodes */ ++ wlfc_mac_descriptor_t nodes[WLFC_MAC_DESC_TABLE_SIZE]; ++ /* table for interfaces */ ++ wlfc_mac_descriptor_t interfaces[WLFC_MAX_IFNUM]; ++ /* OS may send packets to unknown (unassociated) destinations */ ++ /* A place holder for bc/mc and packets to unknown destinations */ ++ wlfc_mac_descriptor_t other; ++ } destination_entries; ++ /* token position for different priority packets */ ++ uint8 token_pos[AC_COUNT+1]; ++ /* ON/OFF state for flow control to the host network interface */ ++ uint8 hostif_flow_state[WLFC_MAX_IFNUM]; ++ uint8 host_ifidx; ++ /* to flow control an OS interface */ ++ uint8 toggle_host_if; ++ ++ /* ++ Mode in which the dhd flow control shall operate. Must be set before ++ traffic starts to the device. ++ 0 - Do not do any proptxtstatus flow control ++ 1 - Use implied credit from a packet status ++ 2 - Use explicit credit ++ */ ++ uint8 proptxstatus_mode; ++ ++ /* To borrow credits */ ++ uint8 allow_credit_borrow; ++ ++ /* Timestamp to compute how long to defer borrowing for */ ++ uint32 borrow_defer_timestamp; ++ ++ bool wlfc_locked; ++} athost_wl_status_info_t; ++ ++int dhd_wlfc_enable(dhd_pub_t *dhd); ++int dhd_wlfc_interface_event(struct dhd_info *, ++ ewlfc_mac_entry_action_t action, uint8 ifid, uint8 iftype, uint8* ea); ++int dhd_wlfc_FIFOcreditmap_event(struct dhd_info *dhd, uint8* event_data); ++int dhd_wlfc_event(struct dhd_info *dhd); ++int dhd_os_wlfc_block(dhd_pub_t *pub); ++int dhd_os_wlfc_unblock(dhd_pub_t *pub); ++ ++#endif /* __wlfc_host_driver_definitions_h__ */ +diff --git a/drivers/net/wireless/ap6210/dngl_stats.h b/drivers/net/wireless/ap6210/dngl_stats.h +new file mode 100644 +index 0000000..5e5a2e2 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dngl_stats.h +@@ -0,0 +1,43 @@ ++/* ++ * Common stats definitions for clients of dongle ++ * ports ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dngl_stats.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _dngl_stats_h_ ++#define _dngl_stats_h_ ++ ++typedef struct { ++ unsigned long rx_packets; /* total packets received */ ++ unsigned long tx_packets; /* total packets transmitted */ ++ unsigned long rx_bytes; /* total bytes received */ ++ unsigned long tx_bytes; /* total bytes transmitted */ ++ unsigned long rx_errors; /* bad packets received */ ++ unsigned long tx_errors; /* packet transmit problems */ ++ unsigned long rx_dropped; /* packets dropped by dongle */ ++ unsigned long tx_dropped; /* packets dropped by dongle */ ++ unsigned long multicast; /* multicast packets received */ ++} dngl_stats_t; ++ ++#endif /* _dngl_stats_h_ */ +diff --git a/drivers/net/wireless/ap6210/dngl_wlhdr.h b/drivers/net/wireless/ap6210/dngl_wlhdr.h +new file mode 100644 +index 0000000..0e37df6 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/dngl_wlhdr.h +@@ -0,0 +1,40 @@ ++/* ++ * Dongle WL Header definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dngl_wlhdr.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _dngl_wlhdr_h_ ++#define _dngl_wlhdr_h_ ++ ++typedef struct wl_header { ++ uint8 type; /* Header type */ ++ uint8 version; /* Header version */ ++ int8 rssi; /* RSSI */ ++ uint8 pad; /* Unused */ ++} wl_header_t; ++ ++#define WL_HEADER_LEN sizeof(wl_header_t) ++#define WL_HEADER_TYPE 0 ++#define WL_HEADER_VER 1 ++#endif /* _dngl_wlhdr_h_ */ +diff --git a/drivers/net/wireless/ap6210/hndpmu.c b/drivers/net/wireless/ap6210/hndpmu.c +new file mode 100644 +index 0000000..e639015 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/hndpmu.c +@@ -0,0 +1,208 @@ ++/* ++ * Misc utility routines for accessing PMU corerev specific features ++ * of the SiliconBackplane-based Broadcom chips. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: hndpmu.c 354194 2012-08-30 08:39:03Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define PMU_ERROR(args) ++ ++#define PMU_MSG(args) ++ ++/* To check in verbose debugging messages not intended ++ * to be on except on private builds. ++ */ ++#define PMU_NONE(args) ++ ++ ++/* SDIO Pad drive strength to select value mappings. ++ * The last strength value in each table must be 0 (the tri-state value). ++ */ ++typedef struct { ++ uint8 strength; /* Pad Drive Strength in mA */ ++ uint8 sel; /* Chip-specific select value */ ++} sdiod_drive_str_t; ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 1 */ ++static const sdiod_drive_str_t sdiod_drive_strength_tab1[] = { ++ {4, 0x2}, ++ {2, 0x3}, ++ {1, 0x0}, ++ {0, 0x0} }; ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 2, 3 */ ++static const sdiod_drive_str_t sdiod_drive_strength_tab2[] = { ++ {12, 0x7}, ++ {10, 0x6}, ++ {8, 0x5}, ++ {6, 0x4}, ++ {4, 0x2}, ++ {2, 0x1}, ++ {0, 0x0} }; ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 8 (1.8V) */ ++static const sdiod_drive_str_t sdiod_drive_strength_tab3[] = { ++ {32, 0x7}, ++ {26, 0x6}, ++ {22, 0x5}, ++ {16, 0x4}, ++ {12, 0x3}, ++ {8, 0x2}, ++ {4, 0x1}, ++ {0, 0x0} }; ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 11 (1.8v) */ ++static const sdiod_drive_str_t sdiod_drive_strength_tab4_1v8[] = { ++ {32, 0x6}, ++ {26, 0x7}, ++ {22, 0x4}, ++ {16, 0x5}, ++ {12, 0x2}, ++ {8, 0x3}, ++ {4, 0x0}, ++ {0, 0x1} }; ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 11 (1.2v) */ ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 11 (2.5v) */ ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 13 (1.8v) */ ++static const sdiod_drive_str_t sdiod_drive_strength_tab5_1v8[] = { ++ {6, 0x7}, ++ {5, 0x6}, ++ {4, 0x5}, ++ {3, 0x4}, ++ {2, 0x2}, ++ {1, 0x1}, ++ {0, 0x0} }; ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 13 (3.3v) */ ++ ++/* SDIO Drive Strength to sel value table for PMU Rev 17 (1.8v) */ ++static const sdiod_drive_str_t sdiod_drive_strength_tab6_1v8[] = { ++ {3, 0x3}, ++ {2, 0x2}, ++ {1, 0x1}, ++ {0, 0x0} }; ++ ++#define SDIOD_DRVSTR_KEY(chip, pmu) (((chip) << 16) | (pmu)) ++ ++void ++si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength) ++{ ++ chipcregs_t *cc; ++ uint origidx, intr_val = 0; ++ sdiod_drive_str_t *str_tab = NULL; ++ uint32 str_mask = 0; ++ uint32 str_shift = 0; ++ ++ if (!(sih->cccaps & CC_CAP_PMU)) { ++ return; ++ } ++ ++ /* Remember original core before switch to chipc */ ++ cc = (chipcregs_t *) si_switch_core(sih, CC_CORE_ID, &origidx, &intr_val); ++ ++ switch (SDIOD_DRVSTR_KEY(sih->chip, sih->pmurev)) { ++ case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 1): ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab1; ++ str_mask = 0x30000000; ++ str_shift = 28; ++ break; ++ case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 2): ++ case SDIOD_DRVSTR_KEY(BCM4325_CHIP_ID, 3): ++ case SDIOD_DRVSTR_KEY(BCM4315_CHIP_ID, 4): ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab2; ++ str_mask = 0x00003800; ++ str_shift = 11; ++ break; ++ case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 8): ++ case SDIOD_DRVSTR_KEY(BCM4336_CHIP_ID, 11): ++ if (sih->pmurev == 8) { ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab3; ++ } ++ else if (sih->pmurev == 11) { ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8; ++ } ++ str_mask = 0x00003800; ++ str_shift = 11; ++ break; ++ case SDIOD_DRVSTR_KEY(BCM4330_CHIP_ID, 12): ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab4_1v8; ++ str_mask = 0x00003800; ++ str_shift = 11; ++ break; ++ case SDIOD_DRVSTR_KEY(BCM43362_CHIP_ID, 13): ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab5_1v8; ++ str_mask = 0x00003800; ++ str_shift = 11; ++ break; ++ case SDIOD_DRVSTR_KEY(BCM4334_CHIP_ID, 17): ++ str_tab = (sdiod_drive_str_t *)&sdiod_drive_strength_tab6_1v8; ++ str_mask = 0x00001800; ++ str_shift = 11; ++ break; ++ default: ++ PMU_MSG(("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n", ++ bcm_chipname(sih->chip, chn, 8), sih->chiprev, sih->pmurev)); ++ ++ break; ++ } ++ ++ if (str_tab != NULL && cc != NULL) { ++ uint32 cc_data_temp; ++ int i; ++ ++ /* Pick the lowest available drive strength equal or greater than the ++ * requested strength. Drive strength of 0 requests tri-state. ++ */ ++ for (i = 0; drivestrength < str_tab[i].strength; i++) ++ ; ++ ++ if (i > 0 && drivestrength > str_tab[i].strength) ++ i--; ++ ++ W_REG(osh, &cc->chipcontrol_addr, 1); ++ cc_data_temp = R_REG(osh, &cc->chipcontrol_data); ++ cc_data_temp &= ~str_mask; ++ cc_data_temp |= str_tab[i].sel << str_shift; ++ W_REG(osh, &cc->chipcontrol_data, cc_data_temp); ++ ++ PMU_MSG(("SDIO: %dmA drive strength requested; set to %dmA\n", ++ drivestrength, str_tab[i].strength)); ++ } ++ ++ /* Return to original core */ ++ si_restore_core(sih, origidx, intr_val); ++} +diff --git a/drivers/net/wireless/ap6210/include/Makefile b/drivers/net/wireless/ap6210/include/Makefile +new file mode 100644 +index 0000000..8483b54 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/Makefile +@@ -0,0 +1,54 @@ ++#!/bin/bash ++# ++# This script serves following purpose: ++# ++# 1. It generates native version information by querying ++# automerger maintained database to see where src/include ++# came from ++# 2. For select components, as listed in compvers.sh ++# it generates component version files ++# ++# Copyright 2005, Broadcom, Inc. ++# ++# $Id: Makefile 241686 2011-02-19 00:22:45Z prakashd $ ++# ++ ++SRCBASE := .. ++ ++TARGETS := epivers.h ++ ++ifdef VERBOSE ++export VERBOSE ++endif ++ ++all release: epivers compvers ++ ++# Generate epivers.h for native branch version ++epivers: ++ bash epivers.sh ++ ++# Generate epivers.h for native branch version ++compvers: ++ @if [ -s "compvers.sh" ]; then \ ++ echo "Generating component versions, if any"; \ ++ bash compvers.sh; \ ++ else \ ++ echo "Skipping component version generation"; \ ++ fi ++ ++# Generate epivers.h for native branch version ++clean_compvers: ++ @if [ -s "compvers.sh" ]; then \ ++ echo "bash compvers.sh clean"; \ ++ bash compvers.sh clean; \ ++ else \ ++ echo "Skipping component version clean"; \ ++ fi ++ ++clean: ++ rm -f $(TARGETS) *.prev ++ ++clean_all: clean clean_compvers ++ ++.PHONY: all release clean epivers compvers clean_compvers ++ +diff --git a/drivers/net/wireless/ap6210/include/aidmp.h b/drivers/net/wireless/ap6210/include/aidmp.h +new file mode 100644 +index 0000000..d557079 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/aidmp.h +@@ -0,0 +1,375 @@ ++/* ++ * Broadcom AMBA Interconnect definitions. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: aidmp.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _AIDMP_H ++#define _AIDMP_H ++ ++/* Manufacturer Ids */ ++#define MFGID_ARM 0x43b ++#define MFGID_BRCM 0x4bf ++#define MFGID_MIPS 0x4a7 ++ ++/* Component Classes */ ++#define CC_SIM 0 ++#define CC_EROM 1 ++#define CC_CORESIGHT 9 ++#define CC_VERIF 0xb ++#define CC_OPTIMO 0xd ++#define CC_GEN 0xe ++#define CC_PRIMECELL 0xf ++ ++/* Enumeration ROM registers */ ++#define ER_EROMENTRY 0x000 ++#define ER_REMAPCONTROL 0xe00 ++#define ER_REMAPSELECT 0xe04 ++#define ER_MASTERSELECT 0xe10 ++#define ER_ITCR 0xf00 ++#define ER_ITIP 0xf04 ++ ++/* Erom entries */ ++#define ER_TAG 0xe ++#define ER_TAG1 0x6 ++#define ER_VALID 1 ++#define ER_CI 0 ++#define ER_MP 2 ++#define ER_ADD 4 ++#define ER_END 0xe ++#define ER_BAD 0xffffffff ++ ++/* EROM CompIdentA */ ++#define CIA_MFG_MASK 0xfff00000 ++#define CIA_MFG_SHIFT 20 ++#define CIA_CID_MASK 0x000fff00 ++#define CIA_CID_SHIFT 8 ++#define CIA_CCL_MASK 0x000000f0 ++#define CIA_CCL_SHIFT 4 ++ ++/* EROM CompIdentB */ ++#define CIB_REV_MASK 0xff000000 ++#define CIB_REV_SHIFT 24 ++#define CIB_NSW_MASK 0x00f80000 ++#define CIB_NSW_SHIFT 19 ++#define CIB_NMW_MASK 0x0007c000 ++#define CIB_NMW_SHIFT 14 ++#define CIB_NSP_MASK 0x00003e00 ++#define CIB_NSP_SHIFT 9 ++#define CIB_NMP_MASK 0x000001f0 ++#define CIB_NMP_SHIFT 4 ++ ++/* EROM MasterPortDesc */ ++#define MPD_MUI_MASK 0x0000ff00 ++#define MPD_MUI_SHIFT 8 ++#define MPD_MP_MASK 0x000000f0 ++#define MPD_MP_SHIFT 4 ++ ++/* EROM AddrDesc */ ++#define AD_ADDR_MASK 0xfffff000 ++#define AD_SP_MASK 0x00000f00 ++#define AD_SP_SHIFT 8 ++#define AD_ST_MASK 0x000000c0 ++#define AD_ST_SHIFT 6 ++#define AD_ST_SLAVE 0x00000000 ++#define AD_ST_BRIDGE 0x00000040 ++#define AD_ST_SWRAP 0x00000080 ++#define AD_ST_MWRAP 0x000000c0 ++#define AD_SZ_MASK 0x00000030 ++#define AD_SZ_SHIFT 4 ++#define AD_SZ_4K 0x00000000 ++#define AD_SZ_8K 0x00000010 ++#define AD_SZ_16K 0x00000020 ++#define AD_SZ_SZD 0x00000030 ++#define AD_AG32 0x00000008 ++#define AD_ADDR_ALIGN 0x00000fff ++#define AD_SZ_BASE 0x00001000 /* 4KB */ ++ ++/* EROM SizeDesc */ ++#define SD_SZ_MASK 0xfffff000 ++#define SD_SG32 0x00000008 ++#define SD_SZ_ALIGN 0x00000fff ++ ++ ++#ifndef _LANGUAGE_ASSEMBLY ++ ++typedef volatile struct _aidmp { ++ uint32 oobselina30; /* 0x000 */ ++ uint32 oobselina74; /* 0x004 */ ++ uint32 PAD[6]; ++ uint32 oobselinb30; /* 0x020 */ ++ uint32 oobselinb74; /* 0x024 */ ++ uint32 PAD[6]; ++ uint32 oobselinc30; /* 0x040 */ ++ uint32 oobselinc74; /* 0x044 */ ++ uint32 PAD[6]; ++ uint32 oobselind30; /* 0x060 */ ++ uint32 oobselind74; /* 0x064 */ ++ uint32 PAD[38]; ++ uint32 oobselouta30; /* 0x100 */ ++ uint32 oobselouta74; /* 0x104 */ ++ uint32 PAD[6]; ++ uint32 oobseloutb30; /* 0x120 */ ++ uint32 oobseloutb74; /* 0x124 */ ++ uint32 PAD[6]; ++ uint32 oobseloutc30; /* 0x140 */ ++ uint32 oobseloutc74; /* 0x144 */ ++ uint32 PAD[6]; ++ uint32 oobseloutd30; /* 0x160 */ ++ uint32 oobseloutd74; /* 0x164 */ ++ uint32 PAD[38]; ++ uint32 oobsynca; /* 0x200 */ ++ uint32 oobseloutaen; /* 0x204 */ ++ uint32 PAD[6]; ++ uint32 oobsyncb; /* 0x220 */ ++ uint32 oobseloutben; /* 0x224 */ ++ uint32 PAD[6]; ++ uint32 oobsyncc; /* 0x240 */ ++ uint32 oobseloutcen; /* 0x244 */ ++ uint32 PAD[6]; ++ uint32 oobsyncd; /* 0x260 */ ++ uint32 oobseloutden; /* 0x264 */ ++ uint32 PAD[38]; ++ uint32 oobaextwidth; /* 0x300 */ ++ uint32 oobainwidth; /* 0x304 */ ++ uint32 oobaoutwidth; /* 0x308 */ ++ uint32 PAD[5]; ++ uint32 oobbextwidth; /* 0x320 */ ++ uint32 oobbinwidth; /* 0x324 */ ++ uint32 oobboutwidth; /* 0x328 */ ++ uint32 PAD[5]; ++ uint32 oobcextwidth; /* 0x340 */ ++ uint32 oobcinwidth; /* 0x344 */ ++ uint32 oobcoutwidth; /* 0x348 */ ++ uint32 PAD[5]; ++ uint32 oobdextwidth; /* 0x360 */ ++ uint32 oobdinwidth; /* 0x364 */ ++ uint32 oobdoutwidth; /* 0x368 */ ++ uint32 PAD[37]; ++ uint32 ioctrlset; /* 0x400 */ ++ uint32 ioctrlclear; /* 0x404 */ ++ uint32 ioctrl; /* 0x408 */ ++ uint32 PAD[61]; ++ uint32 iostatus; /* 0x500 */ ++ uint32 PAD[127]; ++ uint32 ioctrlwidth; /* 0x700 */ ++ uint32 iostatuswidth; /* 0x704 */ ++ uint32 PAD[62]; ++ uint32 resetctrl; /* 0x800 */ ++ uint32 resetstatus; /* 0x804 */ ++ uint32 resetreadid; /* 0x808 */ ++ uint32 resetwriteid; /* 0x80c */ ++ uint32 PAD[60]; ++ uint32 errlogctrl; /* 0x900 */ ++ uint32 errlogdone; /* 0x904 */ ++ uint32 errlogstatus; /* 0x908 */ ++ uint32 errlogaddrlo; /* 0x90c */ ++ uint32 errlogaddrhi; /* 0x910 */ ++ uint32 errlogid; /* 0x914 */ ++ uint32 errloguser; /* 0x918 */ ++ uint32 errlogflags; /* 0x91c */ ++ uint32 PAD[56]; ++ uint32 intstatus; /* 0xa00 */ ++ uint32 PAD[255]; ++ uint32 config; /* 0xe00 */ ++ uint32 PAD[63]; ++ uint32 itcr; /* 0xf00 */ ++ uint32 PAD[3]; ++ uint32 itipooba; /* 0xf10 */ ++ uint32 itipoobb; /* 0xf14 */ ++ uint32 itipoobc; /* 0xf18 */ ++ uint32 itipoobd; /* 0xf1c */ ++ uint32 PAD[4]; ++ uint32 itipoobaout; /* 0xf30 */ ++ uint32 itipoobbout; /* 0xf34 */ ++ uint32 itipoobcout; /* 0xf38 */ ++ uint32 itipoobdout; /* 0xf3c */ ++ uint32 PAD[4]; ++ uint32 itopooba; /* 0xf50 */ ++ uint32 itopoobb; /* 0xf54 */ ++ uint32 itopoobc; /* 0xf58 */ ++ uint32 itopoobd; /* 0xf5c */ ++ uint32 PAD[4]; ++ uint32 itopoobain; /* 0xf70 */ ++ uint32 itopoobbin; /* 0xf74 */ ++ uint32 itopoobcin; /* 0xf78 */ ++ uint32 itopoobdin; /* 0xf7c */ ++ uint32 PAD[4]; ++ uint32 itopreset; /* 0xf90 */ ++ uint32 PAD[15]; ++ uint32 peripherialid4; /* 0xfd0 */ ++ uint32 peripherialid5; /* 0xfd4 */ ++ uint32 peripherialid6; /* 0xfd8 */ ++ uint32 peripherialid7; /* 0xfdc */ ++ uint32 peripherialid0; /* 0xfe0 */ ++ uint32 peripherialid1; /* 0xfe4 */ ++ uint32 peripherialid2; /* 0xfe8 */ ++ uint32 peripherialid3; /* 0xfec */ ++ uint32 componentid0; /* 0xff0 */ ++ uint32 componentid1; /* 0xff4 */ ++ uint32 componentid2; /* 0xff8 */ ++ uint32 componentid3; /* 0xffc */ ++} aidmp_t; ++ ++#endif /* _LANGUAGE_ASSEMBLY */ ++ ++/* Out-of-band Router registers */ ++#define OOB_BUSCONFIG 0x020 ++#define OOB_STATUSA 0x100 ++#define OOB_STATUSB 0x104 ++#define OOB_STATUSC 0x108 ++#define OOB_STATUSD 0x10c ++#define OOB_ENABLEA0 0x200 ++#define OOB_ENABLEA1 0x204 ++#define OOB_ENABLEA2 0x208 ++#define OOB_ENABLEA3 0x20c ++#define OOB_ENABLEB0 0x280 ++#define OOB_ENABLEB1 0x284 ++#define OOB_ENABLEB2 0x288 ++#define OOB_ENABLEB3 0x28c ++#define OOB_ENABLEC0 0x300 ++#define OOB_ENABLEC1 0x304 ++#define OOB_ENABLEC2 0x308 ++#define OOB_ENABLEC3 0x30c ++#define OOB_ENABLED0 0x380 ++#define OOB_ENABLED1 0x384 ++#define OOB_ENABLED2 0x388 ++#define OOB_ENABLED3 0x38c ++#define OOB_ITCR 0xf00 ++#define OOB_ITIPOOBA 0xf10 ++#define OOB_ITIPOOBB 0xf14 ++#define OOB_ITIPOOBC 0xf18 ++#define OOB_ITIPOOBD 0xf1c ++#define OOB_ITOPOOBA 0xf30 ++#define OOB_ITOPOOBB 0xf34 ++#define OOB_ITOPOOBC 0xf38 ++#define OOB_ITOPOOBD 0xf3c ++ ++/* DMP wrapper registers */ ++#define AI_OOBSELINA30 0x000 ++#define AI_OOBSELINA74 0x004 ++#define AI_OOBSELINB30 0x020 ++#define AI_OOBSELINB74 0x024 ++#define AI_OOBSELINC30 0x040 ++#define AI_OOBSELINC74 0x044 ++#define AI_OOBSELIND30 0x060 ++#define AI_OOBSELIND74 0x064 ++#define AI_OOBSELOUTA30 0x100 ++#define AI_OOBSELOUTA74 0x104 ++#define AI_OOBSELOUTB30 0x120 ++#define AI_OOBSELOUTB74 0x124 ++#define AI_OOBSELOUTC30 0x140 ++#define AI_OOBSELOUTC74 0x144 ++#define AI_OOBSELOUTD30 0x160 ++#define AI_OOBSELOUTD74 0x164 ++#define AI_OOBSYNCA 0x200 ++#define AI_OOBSELOUTAEN 0x204 ++#define AI_OOBSYNCB 0x220 ++#define AI_OOBSELOUTBEN 0x224 ++#define AI_OOBSYNCC 0x240 ++#define AI_OOBSELOUTCEN 0x244 ++#define AI_OOBSYNCD 0x260 ++#define AI_OOBSELOUTDEN 0x264 ++#define AI_OOBAEXTWIDTH 0x300 ++#define AI_OOBAINWIDTH 0x304 ++#define AI_OOBAOUTWIDTH 0x308 ++#define AI_OOBBEXTWIDTH 0x320 ++#define AI_OOBBINWIDTH 0x324 ++#define AI_OOBBOUTWIDTH 0x328 ++#define AI_OOBCEXTWIDTH 0x340 ++#define AI_OOBCINWIDTH 0x344 ++#define AI_OOBCOUTWIDTH 0x348 ++#define AI_OOBDEXTWIDTH 0x360 ++#define AI_OOBDINWIDTH 0x364 ++#define AI_OOBDOUTWIDTH 0x368 ++ ++ ++#define AI_IOCTRLSET 0x400 ++#define AI_IOCTRLCLEAR 0x404 ++#define AI_IOCTRL 0x408 ++#define AI_IOSTATUS 0x500 ++#define AI_RESETCTRL 0x800 ++#define AI_RESETSTATUS 0x804 ++ ++#define AI_IOCTRLWIDTH 0x700 ++#define AI_IOSTATUSWIDTH 0x704 ++ ++#define AI_RESETREADID 0x808 ++#define AI_RESETWRITEID 0x80c ++#define AI_ERRLOGCTRL 0xa00 ++#define AI_ERRLOGDONE 0xa04 ++#define AI_ERRLOGSTATUS 0xa08 ++#define AI_ERRLOGADDRLO 0xa0c ++#define AI_ERRLOGADDRHI 0xa10 ++#define AI_ERRLOGID 0xa14 ++#define AI_ERRLOGUSER 0xa18 ++#define AI_ERRLOGFLAGS 0xa1c ++#define AI_INTSTATUS 0xa00 ++#define AI_CONFIG 0xe00 ++#define AI_ITCR 0xf00 ++#define AI_ITIPOOBA 0xf10 ++#define AI_ITIPOOBB 0xf14 ++#define AI_ITIPOOBC 0xf18 ++#define AI_ITIPOOBD 0xf1c ++#define AI_ITIPOOBAOUT 0xf30 ++#define AI_ITIPOOBBOUT 0xf34 ++#define AI_ITIPOOBCOUT 0xf38 ++#define AI_ITIPOOBDOUT 0xf3c ++#define AI_ITOPOOBA 0xf50 ++#define AI_ITOPOOBB 0xf54 ++#define AI_ITOPOOBC 0xf58 ++#define AI_ITOPOOBD 0xf5c ++#define AI_ITOPOOBAIN 0xf70 ++#define AI_ITOPOOBBIN 0xf74 ++#define AI_ITOPOOBCIN 0xf78 ++#define AI_ITOPOOBDIN 0xf7c ++#define AI_ITOPRESET 0xf90 ++#define AI_PERIPHERIALID4 0xfd0 ++#define AI_PERIPHERIALID5 0xfd4 ++#define AI_PERIPHERIALID6 0xfd8 ++#define AI_PERIPHERIALID7 0xfdc ++#define AI_PERIPHERIALID0 0xfe0 ++#define AI_PERIPHERIALID1 0xfe4 ++#define AI_PERIPHERIALID2 0xfe8 ++#define AI_PERIPHERIALID3 0xfec ++#define AI_COMPONENTID0 0xff0 ++#define AI_COMPONENTID1 0xff4 ++#define AI_COMPONENTID2 0xff8 ++#define AI_COMPONENTID3 0xffc ++ ++/* resetctrl */ ++#define AIRC_RESET 1 ++ ++/* config */ ++#define AICFG_OOB 0x00000020 ++#define AICFG_IOS 0x00000010 ++#define AICFG_IOC 0x00000008 ++#define AICFG_TO 0x00000004 ++#define AICFG_ERRL 0x00000002 ++#define AICFG_RST 0x00000001 ++ ++/* bit defines for AI_OOBSELOUTB74 reg */ ++#define OOB_SEL_OUTEN_B_5 15 ++#define OOB_SEL_OUTEN_B_6 23 ++ ++#endif /* _AIDMP_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcm_cfg.h b/drivers/net/wireless/ap6210/include/bcm_cfg.h +new file mode 100644 +index 0000000..ecff4f4 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcm_cfg.h +@@ -0,0 +1,29 @@ ++/* ++ * BCM common config options ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcm_cfg.h 294399 2011-11-07 03:31:22Z $ ++ */ ++ ++#ifndef _bcm_cfg_h_ ++#define _bcm_cfg_h_ ++#endif /* _bcm_cfg_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcm_mpool_pub.h b/drivers/net/wireless/ap6210/include/bcm_mpool_pub.h +new file mode 100644 +index 0000000..8fe3de7 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcm_mpool_pub.h +@@ -0,0 +1,361 @@ ++/* ++ * Memory pools library, Public interface ++ * ++ * API Overview ++ * ++ * This package provides a memory allocation subsystem based on pools of ++ * homogenous objects. ++ * ++ * Instrumentation is available for reporting memory utilization both ++ * on a per-data-structure basis and system wide. ++ * ++ * There are two main types defined in this API. ++ * ++ * pool manager: A singleton object that acts as a factory for ++ * pool allocators. It also is used for global ++ * instrumentation, such as reporting all blocks ++ * in use across all data structures. The pool manager ++ * creates and provides individual memory pools ++ * upon request to application code. ++ * ++ * memory pool: An object for allocating homogenous memory blocks. ++ * ++ * Global identifiers in this module use the following prefixes: ++ * bcm_mpm_* Memory pool manager ++ * bcm_mp_* Memory pool ++ * ++ * There are two main types of memory pools: ++ * ++ * prealloc: The contiguous memory block of objects can either be supplied ++ * by the client or malloc'ed by the memory manager. The objects are ++ * allocated out of a block of memory and freed back to the block. ++ * ++ * heap: The memory pool allocator uses the heap (malloc/free) for memory. ++ * In this case, the pool allocator is just providing statistics ++ * and instrumentation on top of the heap, without modifying the heap ++ * allocation implementation. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id$ ++ */ ++ ++#ifndef _BCM_MPOOL_PUB_H ++#define _BCM_MPOOL_PUB_H 1 ++ ++#include /* needed for uint16 */ ++ ++ ++/* ++************************************************************************** ++* ++* Type definitions, handles ++* ++************************************************************************** ++*/ ++ ++/* Forward declaration of OSL handle. */ ++struct osl_info; ++ ++/* Forward declaration of string buffer. */ ++struct bcmstrbuf; ++ ++/* ++ * Opaque type definition for the pool manager handle. This object is used for global ++ * memory pool operations such as obtaining a new pool, deleting a pool, iterating and ++ * instrumentation/debugging. ++ */ ++struct bcm_mpm_mgr; ++typedef struct bcm_mpm_mgr *bcm_mpm_mgr_h; ++ ++/* ++ * Opaque type definition for an instance of a pool. This handle is used for allocating ++ * and freeing memory through the pool, as well as management/instrumentation on this ++ * specific pool. ++ */ ++struct bcm_mp_pool; ++typedef struct bcm_mp_pool *bcm_mp_pool_h; ++ ++ ++/* ++ * To make instrumentation more readable, every memory ++ * pool must have a readable name. Pool names are up to ++ * 8 bytes including '\0' termination. (7 printable characters.) ++ */ ++#define BCM_MP_NAMELEN 8 ++ ++ ++/* ++ * Type definition for pool statistics. ++ */ ++typedef struct bcm_mp_stats { ++ char name[BCM_MP_NAMELEN]; /* Name of this pool. */ ++ unsigned int objsz; /* Object size allocated in this pool */ ++ uint16 nobj; /* Total number of objects in this pool */ ++ uint16 num_alloc; /* Number of objects currently allocated */ ++ uint16 high_water; /* Max number of allocated objects. */ ++ uint16 failed_alloc; /* Failed allocations. */ ++} bcm_mp_stats_t; ++ ++ ++/* ++************************************************************************** ++* ++* API Routines on the pool manager. ++* ++************************************************************************** ++*/ ++ ++/* ++ * bcm_mpm_init() - initialize the whole memory pool system. ++ * ++ * Parameters: ++ * osh: INPUT Operating system handle. Needed for heap memory allocation. ++ * max_pools: INPUT Maximum number of mempools supported. ++ * mgr: OUTPUT The handle is written with the new pools manager object/handle. ++ * ++ * Returns: ++ * BCME_OK Object initialized successfully. May be used. ++ * BCME_NOMEM Initialization failed due to no memory. Object must not be used. ++ */ ++int bcm_mpm_init(struct osl_info *osh, int max_pools, bcm_mpm_mgr_h *mgrp); ++ ++ ++/* ++ * bcm_mpm_deinit() - de-initialize the whole memory pool system. ++ * ++ * Parameters: ++ * mgr: INPUT Pointer to pool manager handle. ++ * ++ * Returns: ++ * BCME_OK Memory pool manager successfully de-initialized. ++ * other Indicated error occured during de-initialization. ++ */ ++int bcm_mpm_deinit(bcm_mpm_mgr_h *mgrp); ++ ++/* ++ * bcm_mpm_create_prealloc_pool() - Create a new pool for fixed size objects. The ++ * pool uses a contiguous block of pre-alloced ++ * memory. The memory block may either be provided ++ * by the client or dynamically allocated by the ++ * pool manager. ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pool manager ++ * obj_sz: INPUT Size of objects that will be allocated by the new pool ++ * Must be >= sizeof(void *). ++ * nobj: INPUT Maximum number of concurrently existing objects to support ++ * memstart INPUT Pointer to the memory to use, or NULL to malloc() ++ * memsize INPUT Number of bytes referenced from memstart (for error checking). ++ * Must be 0 if 'memstart' is NULL. ++ * poolname INPUT For instrumentation, the name of the pool ++ * newp: OUTPUT The handle for the new pool, if creation is successful ++ * ++ * Returns: ++ * BCME_OK Pool created ok. ++ * other Pool not created due to indicated error. newpoolp set to NULL. ++ * ++ * ++ */ ++int bcm_mpm_create_prealloc_pool(bcm_mpm_mgr_h mgr, ++ unsigned int obj_sz, ++ int nobj, ++ void *memstart, ++ unsigned int memsize, ++ char poolname[BCM_MP_NAMELEN], ++ bcm_mp_pool_h *newp); ++ ++ ++/* ++ * bcm_mpm_delete_prealloc_pool() - Delete a memory pool. This should only be called after ++ * all memory objects have been freed back to the pool. ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pools manager ++ * pool: INPUT The handle of the pool to delete ++ * ++ * Returns: ++ * BCME_OK Pool deleted ok. ++ * other Pool not deleted due to indicated error. ++ * ++ */ ++int bcm_mpm_delete_prealloc_pool(bcm_mpm_mgr_h mgr, bcm_mp_pool_h *poolp); ++ ++/* ++ * bcm_mpm_create_heap_pool() - Create a new pool for fixed size objects. The memory ++ * pool allocator uses the heap (malloc/free) for memory. ++ * In this case, the pool allocator is just providing ++ * statistics and instrumentation on top of the heap, ++ * without modifying the heap allocation implementation. ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pool manager ++ * obj_sz: INPUT Size of objects that will be allocated by the new pool ++ * poolname INPUT For instrumentation, the name of the pool ++ * newp: OUTPUT The handle for the new pool, if creation is successful ++ * ++ * Returns: ++ * BCME_OK Pool created ok. ++ * other Pool not created due to indicated error. newpoolp set to NULL. ++ * ++ * ++ */ ++int bcm_mpm_create_heap_pool(bcm_mpm_mgr_h mgr, unsigned int obj_sz, ++ char poolname[BCM_MP_NAMELEN], ++ bcm_mp_pool_h *newp); ++ ++ ++/* ++ * bcm_mpm_delete_heap_pool() - Delete a memory pool. This should only be called after ++ * all memory objects have been freed back to the pool. ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pools manager ++ * pool: INPUT The handle of the pool to delete ++ * ++ * Returns: ++ * BCME_OK Pool deleted ok. ++ * other Pool not deleted due to indicated error. ++ * ++ */ ++int bcm_mpm_delete_heap_pool(bcm_mpm_mgr_h mgr, bcm_mp_pool_h *poolp); ++ ++ ++/* ++ * bcm_mpm_stats() - Return stats for all pools ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pools manager ++ * stats: OUTPUT Array of pool statistics. ++ * nentries: MOD Max elements in 'stats' array on INPUT. Actual number ++ * of array elements copied to 'stats' on OUTPUT. ++ * ++ * Returns: ++ * BCME_OK Ok ++ * other Error getting stats. ++ * ++ */ ++int bcm_mpm_stats(bcm_mpm_mgr_h mgr, bcm_mp_stats_t *stats, int *nentries); ++ ++ ++/* ++ * bcm_mpm_dump() - Display statistics on all pools ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pools manager ++ * b: OUTPUT Output buffer. ++ * ++ * Returns: ++ * BCME_OK Ok ++ * other Error during dump. ++ * ++ */ ++int bcm_mpm_dump(bcm_mpm_mgr_h mgr, struct bcmstrbuf *b); ++ ++ ++/* ++ * bcm_mpm_get_obj_size() - The size of memory objects may need to be padded to ++ * compensate for alignment requirements of the objects. ++ * This function provides the padded object size. If clients ++ * pre-allocate a memory slab for a memory pool, the ++ * padded object size should be used by the client to allocate ++ * the memory slab (in order to provide sufficent space for ++ * the maximum number of objects). ++ * ++ * Parameters: ++ * mgr: INPUT The handle to the pools manager. ++ * obj_sz: INPUT Input object size. ++ * padded_obj_sz: OUTPUT Padded object size. ++ * ++ * Returns: ++ * BCME_OK Ok ++ * BCME_BADARG Bad arguments. ++ * ++ */ ++int bcm_mpm_get_obj_size(bcm_mpm_mgr_h mgr, unsigned int obj_sz, unsigned int *padded_obj_sz); ++ ++ ++/* ++*************************************************************************** ++* ++* API Routines on a specific pool. ++* ++*************************************************************************** ++*/ ++ ++ ++/* ++ * bcm_mp_alloc() - Allocate a memory pool object. ++ * ++ * Parameters: ++ * pool: INPUT The handle to the pool. ++ * ++ * Returns: ++ * A pointer to the new object. NULL on error. ++ * ++ */ ++void* bcm_mp_alloc(bcm_mp_pool_h pool); ++ ++/* ++ * bcm_mp_free() - Free a memory pool object. ++ * ++ * Parameters: ++ * pool: INPUT The handle to the pool. ++ * objp: INPUT A pointer to the object to free. ++ * ++ * Returns: ++ * BCME_OK Ok ++ * other Error during free. ++ * ++ */ ++int bcm_mp_free(bcm_mp_pool_h pool, void *objp); ++ ++/* ++ * bcm_mp_stats() - Return stats for this pool ++ * ++ * Parameters: ++ * pool: INPUT The handle to the pool ++ * stats: OUTPUT Pool statistics ++ * ++ * Returns: ++ * BCME_OK Ok ++ * other Error getting statistics. ++ * ++ */ ++int bcm_mp_stats(bcm_mp_pool_h pool, bcm_mp_stats_t *stats); ++ ++ ++/* ++ * bcm_mp_dump() - Dump a pool ++ * ++ * Parameters: ++ * pool: INPUT The handle to the pool ++ * b OUTPUT Output buffer ++ * ++ * Returns: ++ * BCME_OK Ok ++ * other Error during dump. ++ * ++ */ ++int bcm_mp_dump(bcm_mp_pool_h pool, struct bcmstrbuf *b); ++ ++ ++#endif /* _BCM_MPOOL_PUB_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcmcdc.h b/drivers/net/wireless/ap6210/include/bcmcdc.h +new file mode 100644 +index 0000000..a1d1271 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmcdc.h +@@ -0,0 +1,132 @@ ++/* ++ * CDC network driver ioctl/indication encoding ++ * Broadcom 802.11abg Networking Device Driver ++ * ++ * Definitions subject to change without notice. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmcdc.h 318308 2012-03-02 02:23:42Z $ ++ */ ++#ifndef _bcmcdc_h_ ++#define _bcmcdc_h_ ++#include ++ ++typedef struct cdc_ioctl { ++ uint32 cmd; /* ioctl command value */ ++ uint32 len; /* lower 16: output buflen; upper 16: input buflen (excludes header) */ ++ uint32 flags; /* flag defns given below */ ++ uint32 status; /* status code returned from the device */ ++} cdc_ioctl_t; ++ ++/* Max valid buffer size that can be sent to the dongle */ ++#define CDC_MAX_MSG_SIZE ETHER_MAX_LEN ++ ++/* len field is divided into input and output buffer lengths */ ++#define CDCL_IOC_OUTLEN_MASK 0x0000FFFF /* maximum or expected response length, */ ++ /* excluding IOCTL header */ ++#define CDCL_IOC_OUTLEN_SHIFT 0 ++#define CDCL_IOC_INLEN_MASK 0xFFFF0000 /* input buffer length, excluding IOCTL header */ ++#define CDCL_IOC_INLEN_SHIFT 16 ++ ++/* CDC flag definitions */ ++#define CDCF_IOC_ERROR 0x01 /* 0=success, 1=ioctl cmd failed */ ++#define CDCF_IOC_SET 0x02 /* 0=get, 1=set cmd */ ++#define CDCF_IOC_OVL_IDX_MASK 0x3c /* overlay region index mask */ ++#define CDCF_IOC_OVL_RSV 0x40 /* 1=reserve this overlay region */ ++#define CDCF_IOC_OVL 0x80 /* 1=this ioctl corresponds to an overlay */ ++#define CDCF_IOC_ACTION_MASK 0xfe /* SET/GET, OVL_IDX, OVL_RSV, OVL mask */ ++#define CDCF_IOC_ACTION_SHIFT 1 /* SET/GET, OVL_IDX, OVL_RSV, OVL shift */ ++#define CDCF_IOC_IF_MASK 0xF000 /* I/F index */ ++#define CDCF_IOC_IF_SHIFT 12 ++#define CDCF_IOC_ID_MASK 0xFFFF0000 /* used to uniquely id an ioctl req/resp pairing */ ++#define CDCF_IOC_ID_SHIFT 16 /* # of bits of shift for ID Mask */ ++ ++#define CDC_IOC_IF_IDX(flags) (((flags) & CDCF_IOC_IF_MASK) >> CDCF_IOC_IF_SHIFT) ++#define CDC_IOC_ID(flags) (((flags) & CDCF_IOC_ID_MASK) >> CDCF_IOC_ID_SHIFT) ++ ++#define CDC_GET_IF_IDX(hdr) \ ++ ((int)((((hdr)->flags) & CDCF_IOC_IF_MASK) >> CDCF_IOC_IF_SHIFT)) ++#define CDC_SET_IF_IDX(hdr, idx) \ ++ ((hdr)->flags = (((hdr)->flags & ~CDCF_IOC_IF_MASK) | ((idx) << CDCF_IOC_IF_SHIFT))) ++ ++/* ++ * BDC header ++ * ++ * The BDC header is used on data packets to convey priority across USB. ++ */ ++ ++struct bdc_header { ++ uint8 flags; /* Flags */ ++ uint8 priority; /* 802.1d Priority 0:2 bits, 4:7 USB flow control info */ ++ uint8 flags2; ++ uint8 dataOffset; /* Offset from end of BDC header to packet data, in ++ * 4-byte words. Leaves room for optional headers. ++ */ ++}; ++ ++#define BDC_HEADER_LEN 4 ++ ++/* flags field bitmap */ ++#define BDC_FLAG_80211_PKT 0x01 /* Packet is in 802.11 format (dongle -> host) */ ++#define BDC_FLAG_SUM_GOOD 0x04 /* Dongle has verified good RX checksums */ ++#define BDC_FLAG_SUM_NEEDED 0x08 /* Dongle needs to do TX checksums: host->device */ ++#define BDC_FLAG_EVENT_MSG 0x08 /* Payload contains an event msg: device->host */ ++#define BDC_FLAG_VER_MASK 0xf0 /* Protocol version mask */ ++#define BDC_FLAG_VER_SHIFT 4 /* Protocol version shift */ ++ ++/* priority field bitmap */ ++#define BDC_PRIORITY_MASK 0x07 ++#define BDC_PRIORITY_FC_MASK 0xf0 /* flow control info mask */ ++#define BDC_PRIORITY_FC_SHIFT 4 /* flow control info shift */ ++ ++/* flags2 field bitmap */ ++#define BDC_FLAG2_IF_MASK 0x0f /* interface index (host <-> dongle) */ ++#define BDC_FLAG2_IF_SHIFT 0 ++#define BDC_FLAG2_FC_FLAG 0x10 /* flag to indicate if pkt contains */ ++ /* FLOW CONTROL info only */ ++ ++/* version numbers */ ++#define BDC_PROTO_VER_1 1 /* Old Protocol version */ ++#define BDC_PROTO_VER 2 /* Protocol version */ ++ ++/* flags2.if field access macros */ ++#define BDC_GET_IF_IDX(hdr) \ ++ ((int)((((hdr)->flags2) & BDC_FLAG2_IF_MASK) >> BDC_FLAG2_IF_SHIFT)) ++#define BDC_SET_IF_IDX(hdr, idx) \ ++ ((hdr)->flags2 = (((hdr)->flags2 & ~BDC_FLAG2_IF_MASK) | ((idx) << BDC_FLAG2_IF_SHIFT))) ++ ++#define BDC_FLAG2_PAD_MASK 0xf0 ++#define BDC_FLAG_PAD_MASK 0x03 ++#define BDC_FLAG2_PAD_SHIFT 2 ++#define BDC_FLAG_PAD_SHIFT 0 ++#define BDC_FLAG2_PAD_IDX 0x3c ++#define BDC_FLAG_PAD_IDX 0x03 ++#define BDC_GET_PAD_LEN(hdr) \ ++ ((int)(((((hdr)->flags2) & BDC_FLAG2_PAD_MASK) >> BDC_FLAG2_PAD_SHIFT) | \ ++ ((((hdr)->flags) & BDC_FLAG_PAD_MASK) >> BDC_FLAG_PAD_SHIFT))) ++#define BDC_SET_PAD_LEN(hdr, idx) \ ++ ((hdr)->flags2 = (((hdr)->flags2 & ~BDC_FLAG2_PAD_MASK) | \ ++ (((idx) & BDC_FLAG2_PAD_IDX) << BDC_FLAG2_PAD_SHIFT))); \ ++ ((hdr)->flags = (((hdr)->flags & ~BDC_FLAG_PAD_MASK) | \ ++ (((idx) & BDC_FLAG_PAD_IDX) << BDC_FLAG_PAD_SHIFT))) ++ ++#endif /* _bcmcdc_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmdefs.h b/drivers/net/wireless/ap6210/include/bcmdefs.h +new file mode 100644 +index 0000000..00906e3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmdefs.h +@@ -0,0 +1,270 @@ ++/* ++ * Misc system wide definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmdefs.h 316830 2012-02-23 20:29:22Z $ ++ */ ++ ++#ifndef _bcmdefs_h_ ++#define _bcmdefs_h_ ++ ++/* ++ * One doesn't need to include this file explicitly, gets included automatically if ++ * typedefs.h is included. ++ */ ++ ++/* Use BCM_REFERENCE to suppress warnings about intentionally-unused function ++ * arguments or local variables. ++ */ ++#define BCM_REFERENCE(data) ((void)(data)) ++ ++/* Compile-time assert can be used in place of ASSERT if the expression evaluates ++ * to a constant at compile time. ++ */ ++#define STATIC_ASSERT(expr) { \ ++ /* Make sure the expression is constant. */ \ ++ typedef enum { _STATIC_ASSERT_NOT_CONSTANT = (expr) } _static_assert_e; \ ++ /* Make sure the expression is true. */ \ ++ typedef char STATIC_ASSERT_FAIL[(expr) ? 1 : -1]; \ ++} ++ ++/* Reclaiming text and data : ++ * The following macros specify special linker sections that can be reclaimed ++ * after a system is considered 'up'. ++ * BCMATTACHFN is also used for detach functions (it's not worth having a BCMDETACHFN, ++ * as in most cases, the attach function calls the detach function to clean up on error). ++ */ ++ ++#define bcmreclaimed 0 ++#define _data _data ++#define _fn _fn ++#define BCMPREATTACHDATA(_data) _data ++#define BCMPREATTACHFN(_fn) _fn ++#define _data _data ++#define _fn _fn ++#define _fn _fn ++#define BCMNMIATTACHFN(_fn) _fn ++#define BCMNMIATTACHDATA(_data) _data ++#define CONST const ++#ifndef BCMFASTPATH ++#define BCMFASTPATH ++#define BCMFASTPATH_HOST ++#endif /* BCMFASTPATH */ ++ ++ ++/* Put some library data/code into ROM to reduce RAM requirements */ ++#define _data _data ++#define BCMROMDAT_NAME(_data) _data ++#define _fn _fn ++#define _fn _fn ++#define STATIC static ++#define BCMROMDAT_ARYSIZ(data) ARRAYSIZE(data) ++#define BCMROMDAT_SIZEOF(data) sizeof(data) ++#define BCMROMDAT_APATCH(data) ++#define BCMROMDAT_SPATCH(data) ++ ++/* Bus types */ ++#define SI_BUS 0 /* SOC Interconnect */ ++#define PCI_BUS 1 /* PCI target */ ++#define PCMCIA_BUS 2 /* PCMCIA target */ ++#define SDIO_BUS 3 /* SDIO target */ ++#define JTAG_BUS 4 /* JTAG */ ++#define USB_BUS 5 /* USB (does not support R/W REG) */ ++#define SPI_BUS 6 /* gSPI target */ ++#define RPC_BUS 7 /* RPC target */ ++ ++/* Allows size optimization for single-bus image */ ++#ifdef BCMBUSTYPE ++#define BUSTYPE(bus) (BCMBUSTYPE) ++#else ++#define BUSTYPE(bus) (bus) ++#endif ++ ++/* Allows size optimization for single-backplane image */ ++#ifdef BCMCHIPTYPE ++#define CHIPTYPE(bus) (BCMCHIPTYPE) ++#else ++#define CHIPTYPE(bus) (bus) ++#endif ++ ++ ++/* Allows size optimization for SPROM support */ ++#if defined(BCMSPROMBUS) ++#define SPROMBUS (BCMSPROMBUS) ++#elif defined(SI_PCMCIA_SROM) ++#define SPROMBUS (PCMCIA_BUS) ++#else ++#define SPROMBUS (PCI_BUS) ++#endif ++ ++/* Allows size optimization for single-chip image */ ++#ifdef BCMCHIPID ++#define CHIPID(chip) (BCMCHIPID) ++#else ++#define CHIPID(chip) (chip) ++#endif ++ ++#ifdef BCMCHIPREV ++#define CHIPREV(rev) (BCMCHIPREV) ++#else ++#define CHIPREV(rev) (rev) ++#endif ++ ++/* Defines for DMA Address Width - Shared between OSL and HNDDMA */ ++#define DMADDR_MASK_32 0x0 /* Address mask for 32-bits */ ++#define DMADDR_MASK_30 0xc0000000 /* Address mask for 30-bits */ ++#define DMADDR_MASK_0 0xffffffff /* Address mask for 0-bits (hi-part) */ ++ ++#define DMADDRWIDTH_30 30 /* 30-bit addressing capability */ ++#define DMADDRWIDTH_32 32 /* 32-bit addressing capability */ ++#define DMADDRWIDTH_63 63 /* 64-bit addressing capability */ ++#define DMADDRWIDTH_64 64 /* 64-bit addressing capability */ ++ ++#ifdef BCMDMA64OSL ++typedef struct { ++ uint32 loaddr; ++ uint32 hiaddr; ++} dma64addr_t; ++ ++typedef dma64addr_t dmaaddr_t; ++#define PHYSADDRHI(_pa) ((_pa).hiaddr) ++#define PHYSADDRHISET(_pa, _val) \ ++ do { \ ++ (_pa).hiaddr = (_val); \ ++ } while (0) ++#define PHYSADDRLO(_pa) ((_pa).loaddr) ++#define PHYSADDRLOSET(_pa, _val) \ ++ do { \ ++ (_pa).loaddr = (_val); \ ++ } while (0) ++ ++#else ++typedef unsigned long dmaaddr_t; ++#define PHYSADDRHI(_pa) (0) ++#define PHYSADDRHISET(_pa, _val) ++#define PHYSADDRLO(_pa) ((_pa)) ++#define PHYSADDRLOSET(_pa, _val) \ ++ do { \ ++ (_pa) = (_val); \ ++ } while (0) ++#endif /* BCMDMA64OSL */ ++ ++/* One physical DMA segment */ ++typedef struct { ++ dmaaddr_t addr; ++ uint32 length; ++} hnddma_seg_t; ++ ++#define MAX_DMA_SEGS 4 ++ ++ ++typedef struct { ++ void *oshdmah; /* Opaque handle for OSL to store its information */ ++ uint origsize; /* Size of the virtual packet */ ++ uint nsegs; ++ hnddma_seg_t segs[MAX_DMA_SEGS]; ++} hnddma_seg_map_t; ++ ++ ++/* packet headroom necessary to accommodate the largest header in the system, (i.e TXOFF). ++ * By doing, we avoid the need to allocate an extra buffer for the header when bridging to WL. ++ * There is a compile time check in wlc.c which ensure that this value is at least as big ++ * as TXOFF. This value is used in dma_rxfill (hnddma.c). ++ */ ++ ++#if defined(BCM_RPC_NOCOPY) || defined(BCM_RCP_TXNOCOPY) ++/* add 40 bytes to allow for extra RPC header and info */ ++#define BCMEXTRAHDROOM 220 ++#else /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */ ++#define BCMEXTRAHDROOM 172 ++#endif /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */ ++ ++/* Packet alignment for most efficient SDIO (can change based on platform) */ ++#ifndef SDALIGN ++#define SDALIGN 32 ++#endif ++ ++/* Headroom required for dongle-to-host communication. Packets allocated ++ * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should ++ * leave this much room in front for low-level message headers which may ++ * be needed to get across the dongle bus to the host. (These messages ++ * don't go over the network, so room for the full WL header above would ++ * be a waste.). ++*/ ++#define BCMDONGLEHDRSZ 12 ++#define BCMDONGLEPADSZ 16 ++ ++#define BCMDONGLEOVERHEAD (BCMDONGLEHDRSZ + BCMDONGLEPADSZ) ++ ++ ++#if defined(NO_BCMDBG_ASSERT) ++# undef BCMDBG_ASSERT ++# undef BCMASSERT_LOG ++#endif ++ ++#if defined(BCMASSERT_LOG) ++#define BCMASSERT_SUPPORT ++#endif ++ ++/* Macros for doing definition and get/set of bitfields ++ * Usage example, e.g. a three-bit field (bits 4-6): ++ * #define _M BITFIELD_MASK(3) ++ * #define _S 4 ++ * ... ++ * regval = R_REG(osh, ®s->regfoo); ++ * field = GFIELD(regval, ); ++ * regval = SFIELD(regval, , 1); ++ * W_REG(osh, ®s->regfoo, regval); ++ */ ++#define BITFIELD_MASK(width) \ ++ (((unsigned)1 << (width)) - 1) ++#define GFIELD(val, field) \ ++ (((val) >> field ## _S) & field ## _M) ++#define SFIELD(val, field, bits) \ ++ (((val) & (~(field ## _M << field ## _S))) | \ ++ ((unsigned)(bits) << field ## _S)) ++ ++/* define BCMSMALL to remove misc features for memory-constrained environments */ ++#ifdef BCMSMALL ++#undef BCMSPACE ++#define bcmspace FALSE /* if (bcmspace) code is discarded */ ++#else ++#define BCMSPACE ++#define bcmspace TRUE /* if (bcmspace) code is retained */ ++#endif ++ ++/* Max. nvram variable table size */ ++#define MAXSZ_NVRAM_VARS 4096 ++ ++ ++/* Max size for reclaimable NVRAM array */ ++#ifdef DL_NVRAM ++#define NVRAM_ARRAY_MAXSIZE DL_NVRAM ++#else ++#define NVRAM_ARRAY_MAXSIZE MAXSZ_NVRAM_VARS ++#endif /* DL_NVRAM */ ++ ++#ifdef BCMUSBDEV_ENABLED ++extern uint32 gFWID; ++#endif ++ ++#endif /* _bcmdefs_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmdevs.h b/drivers/net/wireless/ap6210/include/bcmdevs.h +new file mode 100644 +index 0000000..c3dd89f +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmdevs.h +@@ -0,0 +1,503 @@ ++/* ++ * Broadcom device-specific manifest constants. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmdevs.h 329854 2012-04-27 01:42:28Z $ ++ */ ++ ++#ifndef _BCMDEVS_H ++#define _BCMDEVS_H ++ ++/* PCI vendor IDs */ ++#define VENDOR_EPIGRAM 0xfeda ++#define VENDOR_BROADCOM 0x14e4 ++#define VENDOR_3COM 0x10b7 ++#define VENDOR_NETGEAR 0x1385 ++#define VENDOR_DIAMOND 0x1092 ++#define VENDOR_INTEL 0x8086 ++#define VENDOR_DELL 0x1028 ++#define VENDOR_HP 0x103c ++#define VENDOR_HP_COMPAQ 0x0e11 ++#define VENDOR_APPLE 0x106b ++#define VENDOR_SI_IMAGE 0x1095 /* Silicon Image, used by Arasan SDIO Host */ ++#define VENDOR_BUFFALO 0x1154 /* Buffalo vendor id */ ++#define VENDOR_TI 0x104c /* Texas Instruments */ ++#define VENDOR_RICOH 0x1180 /* Ricoh */ ++#define VENDOR_JMICRON 0x197b ++ ++ ++/* PCMCIA vendor IDs */ ++#define VENDOR_BROADCOM_PCMCIA 0x02d0 ++ ++/* SDIO vendor IDs */ ++#define VENDOR_BROADCOM_SDIO 0x00BF ++ ++/* DONGLE VID/PIDs */ ++#define BCM_DNGL_VID 0x0a5c ++#define BCM_DNGL_BL_PID_4328 0xbd12 ++#define BCM_DNGL_BL_PID_4322 0xbd13 ++#define BCM_DNGL_BL_PID_4319 0xbd16 ++#define BCM_DNGL_BL_PID_43236 0xbd17 ++#define BCM_DNGL_BL_PID_4332 0xbd18 ++#define BCM_DNGL_BL_PID_4330 0xbd19 ++#define BCM_DNGL_BL_PID_4334 0xbd1a ++#define BCM_DNGL_BL_PID_43239 0xbd1b ++#define BCM_DNGL_BL_PID_4324 0xbd1c ++#define BCM_DNGL_BL_PID_4360 0xbd1d ++ ++#define BCM_DNGL_BDC_PID 0x0bdc ++#define BCM_DNGL_JTAG_PID 0x4a44 ++ ++/* HW USB BLOCK [CPULESS USB] PIDs */ ++#define BCM_HWUSB_PID_43239 43239 ++ ++/* PCI Device IDs */ ++#define BCM4210_DEVICE_ID 0x1072 /* never used */ ++#define BCM4230_DEVICE_ID 0x1086 /* never used */ ++#define BCM4401_ENET_ID 0x170c /* 4401b0 production enet cards */ ++#define BCM3352_DEVICE_ID 0x3352 /* bcm3352 device id */ ++#define BCM3360_DEVICE_ID 0x3360 /* bcm3360 device id */ ++#define BCM4211_DEVICE_ID 0x4211 ++#define BCM4231_DEVICE_ID 0x4231 ++#define BCM4303_D11B_ID 0x4303 /* 4303 802.11b */ ++#define BCM4311_D11G_ID 0x4311 /* 4311 802.11b/g id */ ++#define BCM4311_D11DUAL_ID 0x4312 /* 4311 802.11a/b/g id */ ++#define BCM4311_D11A_ID 0x4313 /* 4311 802.11a id */ ++#define BCM4328_D11DUAL_ID 0x4314 /* 4328/4312 802.11a/g id */ ++#define BCM4328_D11G_ID 0x4315 /* 4328/4312 802.11g id */ ++#define BCM4328_D11A_ID 0x4316 /* 4328/4312 802.11a id */ ++#define BCM4318_D11G_ID 0x4318 /* 4318 802.11b/g id */ ++#define BCM4318_D11DUAL_ID 0x4319 /* 4318 802.11a/b/g id */ ++#define BCM4318_D11A_ID 0x431a /* 4318 802.11a id */ ++#define BCM4325_D11DUAL_ID 0x431b /* 4325 802.11a/g id */ ++#define BCM4325_D11G_ID 0x431c /* 4325 802.11g id */ ++#define BCM4325_D11A_ID 0x431d /* 4325 802.11a id */ ++#define BCM4306_D11G_ID 0x4320 /* 4306 802.11g */ ++#define BCM4306_D11A_ID 0x4321 /* 4306 802.11a */ ++#define BCM4306_UART_ID 0x4322 /* 4306 uart */ ++#define BCM4306_V90_ID 0x4323 /* 4306 v90 codec */ ++#define BCM4306_D11DUAL_ID 0x4324 /* 4306 dual A+B */ ++#define BCM4306_D11G_ID2 0x4325 /* BCM4306_D11G_ID; INF w/loose binding war */ ++#define BCM4321_D11N_ID 0x4328 /* 4321 802.11n dualband id */ ++#define BCM4321_D11N2G_ID 0x4329 /* 4321 802.11n 2.4Ghz band id */ ++#define BCM4321_D11N5G_ID 0x432a /* 4321 802.11n 5Ghz band id */ ++#define BCM4322_D11N_ID 0x432b /* 4322 802.11n dualband device */ ++#define BCM4322_D11N2G_ID 0x432c /* 4322 802.11n 2.4GHz device */ ++#define BCM4322_D11N5G_ID 0x432d /* 4322 802.11n 5GHz device */ ++#define BCM4329_D11N_ID 0x432e /* 4329 802.11n dualband device */ ++#define BCM4329_D11N2G_ID 0x432f /* 4329 802.11n 2.4G device */ ++#define BCM4329_D11N5G_ID 0x4330 /* 4329 802.11n 5G device */ ++#define BCM4315_D11DUAL_ID 0x4334 /* 4315 802.11a/g id */ ++#define BCM4315_D11G_ID 0x4335 /* 4315 802.11g id */ ++#define BCM4315_D11A_ID 0x4336 /* 4315 802.11a id */ ++#define BCM4319_D11N_ID 0x4337 /* 4319 802.11n dualband device */ ++#define BCM4319_D11N2G_ID 0x4338 /* 4319 802.11n 2.4G device */ ++#define BCM4319_D11N5G_ID 0x4339 /* 4319 802.11n 5G device */ ++#define BCM43231_D11N2G_ID 0x4340 /* 43231 802.11n 2.4GHz device */ ++#define BCM43221_D11N2G_ID 0x4341 /* 43221 802.11n 2.4GHz device */ ++#define BCM43222_D11N_ID 0x4350 /* 43222 802.11n dualband device */ ++#define BCM43222_D11N2G_ID 0x4351 /* 43222 802.11n 2.4GHz device */ ++#define BCM43222_D11N5G_ID 0x4352 /* 43222 802.11n 5GHz device */ ++#define BCM43224_D11N_ID 0x4353 /* 43224 802.11n dualband device */ ++#define BCM43224_D11N_ID_VEN1 0x0576 /* Vendor specific 43224 802.11n db device */ ++#define BCM43226_D11N_ID 0x4354 /* 43226 802.11n dualband device */ ++#define BCM43236_D11N_ID 0x4346 /* 43236 802.11n dualband device */ ++#define BCM43236_D11N2G_ID 0x4347 /* 43236 802.11n 2.4GHz device */ ++#define BCM43236_D11N5G_ID 0x4348 /* 43236 802.11n 5GHz device */ ++#define BCM43225_D11N2G_ID 0x4357 /* 43225 802.11n 2.4GHz device */ ++#define BCM43421_D11N_ID 0xA99D /* 43421 802.11n dualband device */ ++#define BCM4313_D11N2G_ID 0x4727 /* 4313 802.11n 2.4G device */ ++#define BCM4330_D11N_ID 0x4360 /* 4330 802.11n dualband device */ ++#define BCM4330_D11N2G_ID 0x4361 /* 4330 802.11n 2.4G device */ ++#define BCM4330_D11N5G_ID 0x4362 /* 4330 802.11n 5G device */ ++#define BCM4336_D11N_ID 0x4343 /* 4336 802.11n 2.4GHz device */ ++#define BCM6362_D11N_ID 0x435f /* 6362 802.11n dualband device */ ++#define BCM4331_D11N_ID 0x4331 /* 4331 802.11n dualband id */ ++#define BCM4331_D11N2G_ID 0x4332 /* 4331 802.11n 2.4Ghz band id */ ++#define BCM4331_D11N5G_ID 0x4333 /* 4331 802.11n 5Ghz band id */ ++#define BCM43237_D11N_ID 0x4355 /* 43237 802.11n dualband device */ ++#define BCM43237_D11N5G_ID 0x4356 /* 43237 802.11n 5GHz device */ ++#define BCM43227_D11N2G_ID 0x4358 /* 43228 802.11n 2.4GHz device */ ++#define BCM43228_D11N_ID 0x4359 /* 43228 802.11n DualBand device */ ++#define BCM43228_D11N5G_ID 0x435a /* 43228 802.11n 5GHz device */ ++#define BCM43362_D11N_ID 0x4363 /* 43362 802.11n 2.4GHz device */ ++#define BCM43239_D11N_ID 0x4370 /* 43239 802.11n dualband device */ ++#define BCM4324_D11N_ID 0x4374 /* 4324 802.11n dualband device */ ++#define BCM43217_D11N2G_ID 0x43a9 /* 43217 802.11n 2.4GHz device */ ++#define BCM43131_D11N2G_ID 0x43aa /* 43131 802.11n 2.4GHz device */ ++#define BCM4314_D11N2G_ID 0x4364 /* 4314 802.11n 2.4G device */ ++#define BCM43142_D11N2G_ID 0x4365 /* 43142 802.11n 2.4G device */ ++#define BCM4334_D11N_ID 0x4380 /* 4334 802.11n dualband device */ ++#define BCM4334_D11N2G_ID 0x4381 /* 4334 802.11n 2.4G device */ ++#define BCM4334_D11N5G_ID 0x4382 /* 4334 802.11n 5G device */ ++#define BCM43341_D11N_ID 0x4386 /* 43341 802.11n dualband device */ ++#define BCM43341_D11N2G_ID 0x4387 /* 43341 802.11n 2.4G device */ ++#define BCM43341_D11N5G_ID 0x4388 /* 43341 802.11n 5G device */ ++#define BCM4360_D11AC_ID 0x43a0 ++#define BCM4360_D11AC2G_ID 0x43a1 ++#define BCM4360_D11AC5G_ID 0x43a2 ++ ++/* PCI Subsystem ID */ ++#define BCM943228HMB_SSID_VEN1 0x0607 ++#define BCM94313HMGBL_SSID_VEN1 0x0608 ++#define BCM94313HMG_SSID_VEN1 0x0609 ++ ++ ++#define BCM4335_D11AC_ID 0x43ae ++#define BCM4335_D11AC2G_ID 0x43af ++#define BCM4335_D11AC5G_ID 0x43b0 ++#define BCM4352_D11AC_ID 0x43b1 /* 4352 802.11ac dualband device */ ++#define BCM4352_D11AC2G_ID 0x43b2 /* 4352 802.11ac 2.4G device */ ++#define BCM4352_D11AC5G_ID 0x43b3 /* 4352 802.11ac 5G device */ ++ ++#define BCMGPRS_UART_ID 0x4333 /* Uart id used by 4306/gprs card */ ++#define BCMGPRS2_UART_ID 0x4344 /* Uart id used by 4306/gprs card */ ++#define FPGA_JTAGM_ID 0x43f0 /* FPGA jtagm device id */ ++#define BCM_JTAGM_ID 0x43f1 /* BCM jtagm device id */ ++#define SDIOH_FPGA_ID 0x43f2 /* sdio host fpga */ ++#define BCM_SDIOH_ID 0x43f3 /* BCM sdio host id */ ++#define SDIOD_FPGA_ID 0x43f4 /* sdio device fpga */ ++#define SPIH_FPGA_ID 0x43f5 /* PCI SPI Host Controller FPGA */ ++#define BCM_SPIH_ID 0x43f6 /* Synopsis SPI Host Controller */ ++#define MIMO_FPGA_ID 0x43f8 /* FPGA mimo minimacphy device id */ ++#define BCM_JTAGM2_ID 0x43f9 /* BCM alternate jtagm device id */ ++#define SDHCI_FPGA_ID 0x43fa /* Standard SDIO Host Controller FPGA */ ++#define BCM4402_ENET_ID 0x4402 /* 4402 enet */ ++#define BCM4402_V90_ID 0x4403 /* 4402 v90 codec */ ++#define BCM4410_DEVICE_ID 0x4410 /* bcm44xx family pci iline */ ++#define BCM4412_DEVICE_ID 0x4412 /* bcm44xx family pci enet */ ++#define BCM4430_DEVICE_ID 0x4430 /* bcm44xx family cardbus iline */ ++#define BCM4432_DEVICE_ID 0x4432 /* bcm44xx family cardbus enet */ ++#define BCM4704_ENET_ID 0x4706 /* 4704 enet (Use 47XX_ENET_ID instead!) */ ++#define BCM4710_DEVICE_ID 0x4710 /* 4710 primary function 0 */ ++#define BCM47XX_AUDIO_ID 0x4711 /* 47xx audio codec */ ++#define BCM47XX_V90_ID 0x4712 /* 47xx v90 codec */ ++#define BCM47XX_ENET_ID 0x4713 /* 47xx enet */ ++#define BCM47XX_EXT_ID 0x4714 /* 47xx external i/f */ ++#define BCM47XX_GMAC_ID 0x4715 /* 47xx Unimac based GbE */ ++#define BCM47XX_USBH_ID 0x4716 /* 47xx usb host */ ++#define BCM47XX_USBD_ID 0x4717 /* 47xx usb device */ ++#define BCM47XX_IPSEC_ID 0x4718 /* 47xx ipsec */ ++#define BCM47XX_ROBO_ID 0x4719 /* 47xx/53xx roboswitch core */ ++#define BCM47XX_USB20H_ID 0x471a /* 47xx usb 2.0 host */ ++#define BCM47XX_USB20D_ID 0x471b /* 47xx usb 2.0 device */ ++#define BCM47XX_ATA100_ID 0x471d /* 47xx parallel ATA */ ++#define BCM47XX_SATAXOR_ID 0x471e /* 47xx serial ATA & XOR DMA */ ++#define BCM47XX_GIGETH_ID 0x471f /* 47xx GbE (5700) */ ++#define BCM4712_MIPS_ID 0x4720 /* 4712 base devid */ ++#define BCM4716_DEVICE_ID 0x4722 /* 4716 base devid */ ++#define BCM47XX_SMBUS_EMU_ID 0x47fe /* 47xx emulated SMBus device */ ++#define BCM47XX_XOR_EMU_ID 0x47ff /* 47xx emulated XOR engine */ ++#define EPI41210_DEVICE_ID 0xa0fa /* bcm4210 */ ++#define EPI41230_DEVICE_ID 0xa10e /* bcm4230 */ ++#define JINVANI_SDIOH_ID 0x4743 /* Jinvani SDIO Gold Host */ ++#define BCM27XX_SDIOH_ID 0x2702 /* BCM27xx Standard SDIO Host */ ++#define PCIXX21_FLASHMEDIA_ID 0x803b /* TI PCI xx21 Standard Host Controller */ ++#define PCIXX21_SDIOH_ID 0x803c /* TI PCI xx21 Standard Host Controller */ ++#define R5C822_SDIOH_ID 0x0822 /* Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host */ ++#define JMICRON_SDIOH_ID 0x2381 /* JMicron Standard SDIO Host Controller */ ++ ++/* Chip IDs */ ++#define BCM4306_CHIP_ID 0x4306 /* 4306 chipcommon chipid */ ++#define BCM4311_CHIP_ID 0x4311 /* 4311 PCIe 802.11a/b/g */ ++#define BCM43111_CHIP_ID 43111 /* 43111 chipcommon chipid (OTP chipid) */ ++#define BCM43112_CHIP_ID 43112 /* 43112 chipcommon chipid (OTP chipid) */ ++#define BCM4312_CHIP_ID 0x4312 /* 4312 chipcommon chipid */ ++#define BCM4313_CHIP_ID 0x4313 /* 4313 chip id */ ++#define BCM43131_CHIP_ID 43131 /* 43131 chip id (OTP chipid) */ ++#define BCM4315_CHIP_ID 0x4315 /* 4315 chip id */ ++#define BCM4318_CHIP_ID 0x4318 /* 4318 chipcommon chipid */ ++#define BCM4319_CHIP_ID 0x4319 /* 4319 chip id */ ++#define BCM4320_CHIP_ID 0x4320 /* 4320 chipcommon chipid */ ++#define BCM4321_CHIP_ID 0x4321 /* 4321 chipcommon chipid */ ++#define BCM43217_CHIP_ID 43217 /* 43217 chip id (OTP chipid) */ ++#define BCM4322_CHIP_ID 0x4322 /* 4322 chipcommon chipid */ ++#define BCM43221_CHIP_ID 43221 /* 43221 chipcommon chipid (OTP chipid) */ ++#define BCM43222_CHIP_ID 43222 /* 43222 chipcommon chipid */ ++#define BCM43224_CHIP_ID 43224 /* 43224 chipcommon chipid */ ++#define BCM43225_CHIP_ID 43225 /* 43225 chipcommon chipid */ ++#define BCM43227_CHIP_ID 43227 /* 43227 chipcommon chipid */ ++#define BCM43228_CHIP_ID 43228 /* 43228 chipcommon chipid */ ++#define BCM43226_CHIP_ID 43226 /* 43226 chipcommon chipid */ ++#define BCM43231_CHIP_ID 43231 /* 43231 chipcommon chipid (OTP chipid) */ ++#define BCM43234_CHIP_ID 43234 /* 43234 chipcommon chipid */ ++#define BCM43235_CHIP_ID 43235 /* 43235 chipcommon chipid */ ++#define BCM43236_CHIP_ID 43236 /* 43236 chipcommon chipid */ ++#define BCM43237_CHIP_ID 43237 /* 43237 chipcommon chipid */ ++#define BCM43238_CHIP_ID 43238 /* 43238 chipcommon chipid */ ++#define BCM43239_CHIP_ID 43239 /* 43239 chipcommon chipid */ ++#define BCM43420_CHIP_ID 43420 /* 43222 chipcommon chipid (OTP, RBBU) */ ++#define BCM43421_CHIP_ID 43421 /* 43224 chipcommon chipid (OTP, RBBU) */ ++#define BCM43428_CHIP_ID 43428 /* 43228 chipcommon chipid (OTP, RBBU) */ ++#define BCM43431_CHIP_ID 43431 /* 4331 chipcommon chipid (OTP, RBBU) */ ++#define BCM43460_CHIP_ID 43460 /* 4360 chipcommon chipid (OTP, RBBU) */ ++#define BCM4325_CHIP_ID 0x4325 /* 4325 chip id */ ++#define BCM4328_CHIP_ID 0x4328 /* 4328 chip id */ ++#define BCM4329_CHIP_ID 0x4329 /* 4329 chipcommon chipid */ ++#define BCM4331_CHIP_ID 0x4331 /* 4331 chipcommon chipid */ ++#define BCM4336_CHIP_ID 0x4336 /* 4336 chipcommon chipid */ ++#define BCM43362_CHIP_ID 43362 /* 43362 chipcommon chipid */ ++#define BCM4330_CHIP_ID 0x4330 /* 4330 chipcommon chipid */ ++#define BCM6362_CHIP_ID 0x6362 /* 6362 chipcommon chipid */ ++#define BCM4314_CHIP_ID 0x4314 /* 4314 chipcommon chipid */ ++#define BCM43142_CHIP_ID 43142 /* 43142 chipcommon chipid */ ++#define BCM4324_CHIP_ID 0x4324 /* 4324 chipcommon chipid */ ++#define BCM43242_CHIP_ID 43242 /* 43242 chipcommon chipid */ ++#define BCM4334_CHIP_ID 0x4334 /* 4334 chipcommon chipid */ ++#define BCM4360_CHIP_ID 0x4360 /* 4360 chipcommon chipid */ ++#define BCM4352_CHIP_ID 0x4352 /* 4352 chipcommon chipid */ ++#define BCM43526_CHIP_ID 0xAA06 ++#define BCM43341_CHIP_ID 43341 /* 43341 chipcommon chipid */ ++#define BCM43342_CHIP_ID 43342 /* 43342 chipcommon chipid */ ++ ++#define BCM4335_CHIP_ID 0x4335 ++ ++#define BCM4342_CHIP_ID 4342 /* 4342 chipcommon chipid (OTP, RBBU) */ ++#define BCM4402_CHIP_ID 0x4402 /* 4402 chipid */ ++#define BCM4704_CHIP_ID 0x4704 /* 4704 chipcommon chipid */ ++#define BCM4706_CHIP_ID 0x5300 /* 4706 chipcommon chipid */ ++#define BCM4710_CHIP_ID 0x4710 /* 4710 chipid */ ++#define BCM4712_CHIP_ID 0x4712 /* 4712 chipcommon chipid */ ++#define BCM4716_CHIP_ID 0x4716 /* 4716 chipcommon chipid */ ++#define BCM47162_CHIP_ID 47162 /* 47162 chipcommon chipid */ ++#define BCM4748_CHIP_ID 0x4748 /* 4716 chipcommon chipid (OTP, RBBU) */ ++#define BCM4749_CHIP_ID 0x4749 /* 5357 chipcommon chipid (OTP, RBBU) */ ++#define BCM4785_CHIP_ID 0x4785 /* 4785 chipcommon chipid */ ++#define BCM5350_CHIP_ID 0x5350 /* 5350 chipcommon chipid */ ++#define BCM5352_CHIP_ID 0x5352 /* 5352 chipcommon chipid */ ++#define BCM5354_CHIP_ID 0x5354 /* 5354 chipcommon chipid */ ++#define BCM5365_CHIP_ID 0x5365 /* 5365 chipcommon chipid */ ++#define BCM5356_CHIP_ID 0x5356 /* 5356 chipcommon chipid */ ++#define BCM5357_CHIP_ID 0x5357 /* 5357 chipcommon chipid */ ++#define BCM53572_CHIP_ID 53572 /* 53572 chipcommon chipid */ ++ ++/* Package IDs */ ++#define BCM4303_PKG_ID 2 /* 4303 package id */ ++#define BCM4309_PKG_ID 1 /* 4309 package id */ ++#define BCM4712LARGE_PKG_ID 0 /* 340pin 4712 package id */ ++#define BCM4712SMALL_PKG_ID 1 /* 200pin 4712 package id */ ++#define BCM4712MID_PKG_ID 2 /* 225pin 4712 package id */ ++#define BCM4328USBD11G_PKG_ID 2 /* 4328 802.11g USB package id */ ++#define BCM4328USBDUAL_PKG_ID 3 /* 4328 802.11a/g USB package id */ ++#define BCM4328SDIOD11G_PKG_ID 4 /* 4328 802.11g SDIO package id */ ++#define BCM4328SDIODUAL_PKG_ID 5 /* 4328 802.11a/g SDIO package id */ ++#define BCM4329_289PIN_PKG_ID 0 /* 4329 289-pin package id */ ++#define BCM4329_182PIN_PKG_ID 1 /* 4329N 182-pin package id */ ++#define BCM5354E_PKG_ID 1 /* 5354E package id */ ++#define BCM4716_PKG_ID 8 /* 4716 package id */ ++#define BCM4717_PKG_ID 9 /* 4717 package id */ ++#define BCM4718_PKG_ID 10 /* 4718 package id */ ++#define BCM5356_PKG_NONMODE 1 /* 5356 package without nmode suppport */ ++#define BCM5358U_PKG_ID 8 /* 5358U package id */ ++#define BCM5358_PKG_ID 9 /* 5358 package id */ ++#define BCM47186_PKG_ID 10 /* 47186 package id */ ++#define BCM5357_PKG_ID 11 /* 5357 package id */ ++#define BCM5356U_PKG_ID 12 /* 5356U package id */ ++#define BCM53572_PKG_ID 8 /* 53572 package id */ ++#define BCM5357C0_PKG_ID 8 /* 5357c0 package id (the same as 53572) */ ++#define BCM47188_PKG_ID 9 /* 47188 package id */ ++#define BCM5358C0_PKG_ID 0xa /* 5358c0 package id */ ++#define BCM5356C0_PKG_ID 0xb /* 5356c0 package id */ ++#define BCM4331TT_PKG_ID 8 /* 4331 12x12 package id */ ++#define BCM4331TN_PKG_ID 9 /* 4331 12x9 package id */ ++#define BCM4331TNA0_PKG_ID 0xb /* 4331 12x9 package id */ ++#define BCM4706L_PKG_ID 1 /* 4706L package id */ ++ ++#define HDLSIM5350_PKG_ID 1 /* HDL simulator package id for a 5350 */ ++#define HDLSIM_PKG_ID 14 /* HDL simulator package id */ ++#define HWSIM_PKG_ID 15 /* Hardware simulator package id */ ++#define BCM43224_FAB_CSM 0x8 /* the chip is manufactured by CSM */ ++#define BCM43224_FAB_SMIC 0xa /* the chip is manufactured by SMIC */ ++#define BCM4336_WLBGA_PKG_ID 0x8 ++#define BCM4330_WLBGA_PKG_ID 0x0 ++#define BCM4314PCIE_ARM_PKG_ID (8 | 0) /* 4314 QFN PCI package id, bit 3 tie high */ ++#define BCM4314SDIO_PKG_ID (8 | 1) /* 4314 QFN SDIO package id */ ++#define BCM4314PCIE_PKG_ID (8 | 2) /* 4314 QFN PCI (ARM-less) package id */ ++#define BCM4314SDIO_ARM_PKG_ID (8 | 3) /* 4314 QFN SDIO (ARM-less) package id */ ++#define BCM4314SDIO_FPBGA_PKG_ID (8 | 4) /* 4314 FpBGA SDIO package id */ ++#define BCM4314DEV_PKG_ID (8 | 6) /* 4314 Developement package id */ ++ ++#define PCIXX21_FLASHMEDIA0_ID 0x8033 /* TI PCI xx21 Standard Host Controller */ ++#define PCIXX21_SDIOH0_ID 0x8034 /* TI PCI xx21 Standard Host Controller */ ++ ++/* boardflags */ ++#define BFL_BTC2WIRE 0x00000001 /* old 2wire Bluetooth coexistence, OBSOLETE */ ++#define BFL_BTCOEX 0x00000001 /* Board supports BTCOEX */ ++#define BFL_PACTRL 0x00000002 /* Board has gpio 9 controlling the PA */ ++#define BFL_AIRLINEMODE 0x00000004 /* Board implements gpio 13 radio disable indication, UNUSED */ ++#define BFL_ADCDIV 0x00000008 /* Board has the rssi ADC divider */ ++#define BFL_RFPLL 0x00000008 /* ACPHY: Changing RFPLL BW to be 150 MHz */ ++#define BFL_ENETROBO 0x00000010 /* Board has robo switch or core */ ++#define BFL_NOPLLDOWN 0x00000020 /* Not ok to power down the chip pll and oscillator */ ++#define BFL_CCKHIPWR 0x00000040 /* Can do high-power CCK transmission */ ++#define BFL_ENETADM 0x00000080 /* Board has ADMtek switch */ ++#define BFL_ENETVLAN 0x00000100 /* Board has VLAN capability */ ++#define BFL_UNUSED 0x00000200 ++#define BFL_NOPCI 0x00000400 /* Board leaves PCI floating */ ++#define BFL_FEM 0x00000800 /* Board supports the Front End Module */ ++#define BFL_EXTLNA 0x00001000 /* Board has an external LNA in 2.4GHz band */ ++#define BFL_HGPA 0x00002000 /* Board has a high gain PA */ ++#define BFL_BTC2WIRE_ALTGPIO 0x00004000 /* Board's BTC 2wire is in the alternate gpios */ ++#define BFL_ALTIQ 0x00008000 /* Alternate I/Q settings */ ++#define BFL_NOPA 0x00010000 /* Board has no PA */ ++#define BFL_RSSIINV 0x00020000 /* Board's RSSI uses positive slope(not TSSI) */ ++#define BFL_PAREF 0x00040000 /* Board uses the PARef LDO */ ++#define BFL_3TSWITCH 0x00080000 /* Board uses a triple throw switch shared with BT */ ++#define BFL_PHASESHIFT 0x00100000 /* Board can support phase shifter */ ++#define BFL_BUCKBOOST 0x00200000 /* Power topology uses BUCKBOOST */ ++#define BFL_FEM_BT 0x00400000 /* Board has FEM and switch to share antenna w/ BT */ ++#define BFL_NOCBUCK 0x00800000 /* Power topology doesn't use CBUCK */ ++#define BFL_CCKFAVOREVM 0x01000000 /* Favor CCK EVM over spectral mask */ ++#define BFL_PALDO 0x02000000 /* Power topology uses PALDO */ ++#define BFL_LNLDO2_2P5 0x04000000 /* Select 2.5V as LNLDO2 output voltage */ ++#define BFL_FASTPWR 0x08000000 ++#define BFL_UCPWRCTL_MININDX 0x08000000 /* Enforce min power index to avoid FEM damage */ ++#define BFL_EXTLNA_5GHz 0x10000000 /* Board has an external LNA in 5GHz band */ ++#define BFL_TRSW_1by2 0x20000000 /* Board has 2 TRSW's in 1by2 designs */ ++#define BFL_LO_TRSW_R_5GHz 0x40000000 /* In 5G do not throw TRSW to T for clipLO gain */ ++#define BFL_ELNA_GAINDEF 0x80000000 /* Backoff InitGain based on elna_2g/5g field ++ * when this flag is set ++ */ ++#define BFL_EXTLNA_TX 0x20000000 /* Temp boardflag to indicate to */ ++ ++/* boardflags2 */ ++#define BFL2_RXBB_INT_REG_DIS 0x00000001 /* Board has an external rxbb regulator */ ++#define BFL2_APLL_WAR 0x00000002 /* Flag to implement alternative A-band PLL settings */ ++#define BFL2_TXPWRCTRL_EN 0x00000004 /* Board permits enabling TX Power Control */ ++#define BFL2_2X4_DIV 0x00000008 /* Board supports the 2X4 diversity switch */ ++#define BFL2_5G_PWRGAIN 0x00000010 /* Board supports 5G band power gain */ ++#define BFL2_PCIEWAR_OVR 0x00000020 /* Board overrides ASPM and Clkreq settings */ ++#define BFL2_CAESERS_BRD 0x00000040 /* Board is Caesers brd (unused by sw) */ ++#define BFL2_BTC3WIRE 0x00000080 /* Board support legacy 3 wire or 4 wire */ ++#define BFL2_BTCLEGACY 0x00000080 /* Board support legacy 3/4 wire, to replace ++ * BFL2_BTC3WIRE ++ */ ++#define BFL2_SKWRKFEM_BRD 0x00000100 /* 4321mcm93 board uses Skyworks FEM */ ++#define BFL2_SPUR_WAR 0x00000200 /* Board has a WAR for clock-harmonic spurs */ ++#define BFL2_GPLL_WAR 0x00000400 /* Flag to narrow G-band PLL loop b/w */ ++#define BFL2_TRISTATE_LED 0x00000800 /* Tri-state the LED */ ++#define BFL2_SINGLEANT_CCK 0x00001000 /* Tx CCK pkts on Ant 0 only */ ++#define BFL2_2G_SPUR_WAR 0x00002000 /* WAR to reduce and avoid clock-harmonic spurs in 2G */ ++#define BFL2_BPHY_ALL_TXCORES 0x00004000 /* Transmit bphy frames using all tx cores */ ++#define BFL2_FCC_BANDEDGE_WAR 0x00008000 /* Activates WAR to improve FCC bandedge performance */ ++#define BFL2_GPLL_WAR2 0x00010000 /* Flag to widen G-band PLL loop b/w */ ++#define BFL2_IPALVLSHIFT_3P3 0x00020000 ++#define BFL2_INTERNDET_TXIQCAL 0x00040000 /* Use internal envelope detector for TX IQCAL */ ++#define BFL2_XTALBUFOUTEN 0x00080000 /* Keep the buffered Xtal output from radio on */ ++ /* Most drivers will turn it off without this flag */ ++ /* to save power. */ ++ ++#define BFL2_ANAPACTRL_2G 0x00100000 /* 2G ext PAs are controlled by analog PA ctrl lines */ ++#define BFL2_ANAPACTRL_5G 0x00200000 /* 5G ext PAs are controlled by analog PA ctrl lines */ ++#define BFL2_ELNACTRL_TRSW_2G 0x00400000 /* AZW4329: 2G gmode_elna_gain controls TR Switch */ ++#define BFL2_BT_SHARE_ANT0 0x00800000 /* share core0 antenna with BT */ ++#define BFL2_TEMPSENSE_HIGHER 0x01000000 /* The tempsense threshold can sustain higher value ++ * than programmed. The exact delta is decided by ++ * driver per chip/boardtype. This can be used ++ * when tempsense qualification happens after shipment ++ */ ++#define BFL2_BTC3WIREONLY 0x02000000 /* standard 3 wire btc only. 4 wire not supported */ ++#define BFL2_PWR_NOMINAL 0x04000000 /* 0: power reduction on, 1: no power reduction */ ++#define BFL2_EXTLNA_PWRSAVE 0x08000000 /* boardflag to enable ucode to apply power save */ ++ /* ucode control of eLNA during Tx */ ++#define BFL2_4313_RADIOREG 0x10000000 ++ /* board rework */ ++#define BFL2_SDR_EN 0x20000000 /* SDR enabled or disabled */ ++ ++/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */ ++#define BOARD_GPIO_BTC3W_IN 0x850 /* bit 4 is RF_ACTIVE, bit 6 is STATUS, bit 11 is PRI */ ++#define BOARD_GPIO_BTC3W_OUT 0x020 /* bit 5 is TX_CONF */ ++#define BOARD_GPIO_BTCMOD_IN 0x010 /* bit 4 is the alternate BT Coexistence Input */ ++#define BOARD_GPIO_BTCMOD_OUT 0x020 /* bit 5 is the alternate BT Coexistence Out */ ++#define BOARD_GPIO_BTC_IN 0x080 /* bit 7 is BT Coexistence Input */ ++#define BOARD_GPIO_BTC_OUT 0x100 /* bit 8 is BT Coexistence Out */ ++#define BOARD_GPIO_PACTRL 0x200 /* bit 9 controls the PA on new 4306 boards */ ++#define BOARD_GPIO_12 0x1000 /* gpio 12 */ ++#define BOARD_GPIO_13 0x2000 /* gpio 13 */ ++#define BOARD_GPIO_BTC4_IN 0x0800 /* gpio 11, coex4, in */ ++#define BOARD_GPIO_BTC4_BT 0x2000 /* gpio 12, coex4, bt active */ ++#define BOARD_GPIO_BTC4_STAT 0x4000 /* gpio 14, coex4, status */ ++#define BOARD_GPIO_BTC4_WLAN 0x8000 /* gpio 15, coex4, wlan active */ ++#define BOARD_GPIO_1_WLAN_PWR 0x02 /* throttle WLAN power on X21 board */ ++#define BOARD_GPIO_3_WLAN_PWR 0x08 /* throttle WLAN power on X28 board */ ++#define BOARD_GPIO_4_WLAN_PWR 0x10 /* throttle WLAN power on X19 board */ ++ ++#define GPIO_BTC4W_OUT_4312 0x010 /* bit 4 is BT_IODISABLE */ ++#define GPIO_BTC4W_OUT_43224 0x020 /* bit 5 is BT_IODISABLE */ ++#define GPIO_BTC4W_OUT_43224_SHARED 0x0e0 /* bit 5 is BT_IODISABLE */ ++#define GPIO_BTC4W_OUT_43225 0x0e0 /* bit 5 BT_IODISABLE, bit 6 SW_BT, bit 7 SW_WL */ ++#define GPIO_BTC4W_OUT_43421 0x020 /* bit 5 is BT_IODISABLE */ ++#define GPIO_BTC4W_OUT_4313 0x060 /* bit 5 SW_BT, bit 6 SW_WL */ ++#define GPIO_BTC4W_OUT_4331_SHARED 0x010 /* GPIO 4 */ ++ ++#define PCI_CFG_GPIO_SCS 0x10 /* PCI config space bit 4 for 4306c0 slow clock source */ ++#define PCI_CFG_GPIO_HWRAD 0x20 /* PCI config space GPIO 13 for hw radio disable */ ++#define PCI_CFG_GPIO_XTAL 0x40 /* PCI config space GPIO 14 for Xtal power-up */ ++#define PCI_CFG_GPIO_PLL 0x80 /* PCI config space GPIO 15 for PLL power-down */ ++ ++/* power control defines */ ++#define PLL_DELAY 150 /* us pll on delay */ ++#define FREF_DELAY 200 /* us fref change delay */ ++#define MIN_SLOW_CLK 32 /* us Slow clock period */ ++#define XTAL_ON_DELAY 1000 /* us crystal power-on delay */ ++ ++ ++/* 43341 Boards */ ++#define BCM943341WLABGS_SSID 0x062d ++ ++/* # of GPIO pins */ ++#define GPIO_NUMPINS 32 ++ ++/* These values are used by dhd host driver. */ ++#define RDL_RAM_BASE_4319 0x60000000 ++#define RDL_RAM_BASE_4329 0x60000000 ++#define RDL_RAM_SIZE_4319 0x48000 ++#define RDL_RAM_SIZE_4329 0x48000 ++#define RDL_RAM_SIZE_43236 0x70000 ++#define RDL_RAM_BASE_43236 0x60000000 ++#define RDL_RAM_SIZE_4328 0x60000 ++#define RDL_RAM_BASE_4328 0x80000000 ++#define RDL_RAM_SIZE_4322 0x60000 ++#define RDL_RAM_BASE_4322 0x60000000 ++ ++/* generic defs for nvram "muxenab" bits */ ++#define MUXENAB_UART 0x00000001 ++#define MUXENAB_GPIO 0x00000002 ++#define MUXENAB_ERCX 0x00000004 /* External Radio BT coex */ ++#define MUXENAB_JTAG 0x00000008 ++#define MUXENAB_HOST_WAKE 0x00000010 /* configure GPIO for SDIO host_wake */ ++#define MUXENAB_I2S_EN 0x00000020 ++#define MUXENAB_I2S_MASTER 0x00000040 ++#define MUXENAB_I2S_FULL 0x00000080 ++#define MUXENAB_SFLASH 0x00000100 ++#define MUXENAB_RFSWCTRL0 0x00000200 ++#define MUXENAB_RFSWCTRL1 0x00000400 ++#define MUXENAB_RFSWCTRL2 0x00000800 ++#define MUXENAB_SECI 0x00001000 ++#define MUXENAB_BT_LEGACY 0x00002000 ++#define MUXENAB_HOST_WAKE1 0x00004000 /* configure alternative GPIO for SDIO host_wake */ ++ ++/* Boot flags */ ++#define FLASH_KERNEL_NFLASH 0x00000001 ++#define FLASH_BOOT_NFLASH 0x00000002 ++ ++#endif /* _BCMDEVS_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcmendian.h b/drivers/net/wireless/ap6210/include/bcmendian.h +new file mode 100644 +index 0000000..0cf9145 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmendian.h +@@ -0,0 +1,299 @@ ++/* ++ * Byte order utilities ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmendian.h 241182 2011-02-17 21:50:03Z $ ++ * ++ * This file by default provides proper behavior on little-endian architectures. ++ * On big-endian architectures, IL_BIGENDIAN should be defined. ++ */ ++ ++#ifndef _BCMENDIAN_H_ ++#define _BCMENDIAN_H_ ++ ++#include ++ ++/* Reverse the bytes in a 16-bit value */ ++#define BCMSWAP16(val) \ ++ ((uint16)((((uint16)(val) & (uint16)0x00ffU) << 8) | \ ++ (((uint16)(val) & (uint16)0xff00U) >> 8))) ++ ++/* Reverse the bytes in a 32-bit value */ ++#define BCMSWAP32(val) \ ++ ((uint32)((((uint32)(val) & (uint32)0x000000ffU) << 24) | \ ++ (((uint32)(val) & (uint32)0x0000ff00U) << 8) | \ ++ (((uint32)(val) & (uint32)0x00ff0000U) >> 8) | \ ++ (((uint32)(val) & (uint32)0xff000000U) >> 24))) ++ ++/* Reverse the two 16-bit halves of a 32-bit value */ ++#define BCMSWAP32BY16(val) \ ++ ((uint32)((((uint32)(val) & (uint32)0x0000ffffU) << 16) | \ ++ (((uint32)(val) & (uint32)0xffff0000U) >> 16))) ++ ++/* Byte swapping macros ++ * Host <=> Network (Big Endian) for 16- and 32-bit values ++ * Host <=> Little-Endian for 16- and 32-bit values ++ */ ++#ifndef hton16 ++#define HTON16(i) BCMSWAP16(i) ++#define hton16(i) bcmswap16(i) ++#define HTON32(i) BCMSWAP32(i) ++#define hton32(i) bcmswap32(i) ++#define NTOH16(i) BCMSWAP16(i) ++#define ntoh16(i) bcmswap16(i) ++#define NTOH32(i) BCMSWAP32(i) ++#define ntoh32(i) bcmswap32(i) ++#define LTOH16(i) (i) ++#define ltoh16(i) (i) ++#define LTOH32(i) (i) ++#define ltoh32(i) (i) ++#define HTOL16(i) (i) ++#define htol16(i) (i) ++#define HTOL32(i) (i) ++#define htol32(i) (i) ++#endif /* hton16 */ ++ ++#define ltoh16_buf(buf, i) ++#define htol16_buf(buf, i) ++ ++/* Unaligned loads and stores in host byte order */ ++#define load32_ua(a) ltoh32_ua(a) ++#define store32_ua(a, v) htol32_ua_store(v, a) ++#define load16_ua(a) ltoh16_ua(a) ++#define store16_ua(a, v) htol16_ua_store(v, a) ++ ++#define _LTOH16_UA(cp) ((cp)[0] | ((cp)[1] << 8)) ++#define _LTOH32_UA(cp) ((cp)[0] | ((cp)[1] << 8) | ((cp)[2] << 16) | ((cp)[3] << 24)) ++#define _NTOH16_UA(cp) (((cp)[0] << 8) | (cp)[1]) ++#define _NTOH32_UA(cp) (((cp)[0] << 24) | ((cp)[1] << 16) | ((cp)[2] << 8) | (cp)[3]) ++ ++#define ltoh_ua(ptr) \ ++ (sizeof(*(ptr)) == sizeof(uint8) ? *(const uint8 *)(ptr) : \ ++ sizeof(*(ptr)) == sizeof(uint16) ? _LTOH16_UA((const uint8 *)(ptr)) : \ ++ sizeof(*(ptr)) == sizeof(uint32) ? _LTOH32_UA((const uint8 *)(ptr)) : \ ++ *(uint8 *)0) ++ ++#define ntoh_ua(ptr) \ ++ (sizeof(*(ptr)) == sizeof(uint8) ? *(const uint8 *)(ptr) : \ ++ sizeof(*(ptr)) == sizeof(uint16) ? _NTOH16_UA((const uint8 *)(ptr)) : \ ++ sizeof(*(ptr)) == sizeof(uint32) ? _NTOH32_UA((const uint8 *)(ptr)) : \ ++ *(uint8 *)0) ++ ++#ifdef __GNUC__ ++ ++/* GNU macro versions avoid referencing the argument multiple times, while also ++ * avoiding the -fno-inline used in ROM builds. ++ */ ++ ++#define bcmswap16(val) ({ \ ++ uint16 _val = (val); \ ++ BCMSWAP16(_val); \ ++}) ++ ++#define bcmswap32(val) ({ \ ++ uint32 _val = (val); \ ++ BCMSWAP32(_val); \ ++}) ++ ++#define bcmswap32by16(val) ({ \ ++ uint32 _val = (val); \ ++ BCMSWAP32BY16(_val); \ ++}) ++ ++#define bcmswap16_buf(buf, len) ({ \ ++ uint16 *_buf = (uint16 *)(buf); \ ++ uint _wds = (len) / 2; \ ++ while (_wds--) { \ ++ *_buf = bcmswap16(*_buf); \ ++ _buf++; \ ++ } \ ++}) ++ ++#define htol16_ua_store(val, bytes) ({ \ ++ uint16 _val = (val); \ ++ uint8 *_bytes = (uint8 *)(bytes); \ ++ _bytes[0] = _val & 0xff; \ ++ _bytes[1] = _val >> 8; \ ++}) ++ ++#define htol32_ua_store(val, bytes) ({ \ ++ uint32 _val = (val); \ ++ uint8 *_bytes = (uint8 *)(bytes); \ ++ _bytes[0] = _val & 0xff; \ ++ _bytes[1] = (_val >> 8) & 0xff; \ ++ _bytes[2] = (_val >> 16) & 0xff; \ ++ _bytes[3] = _val >> 24; \ ++}) ++ ++#define hton16_ua_store(val, bytes) ({ \ ++ uint16 _val = (val); \ ++ uint8 *_bytes = (uint8 *)(bytes); \ ++ _bytes[0] = _val >> 8; \ ++ _bytes[1] = _val & 0xff; \ ++}) ++ ++#define hton32_ua_store(val, bytes) ({ \ ++ uint32 _val = (val); \ ++ uint8 *_bytes = (uint8 *)(bytes); \ ++ _bytes[0] = _val >> 24; \ ++ _bytes[1] = (_val >> 16) & 0xff; \ ++ _bytes[2] = (_val >> 8) & 0xff; \ ++ _bytes[3] = _val & 0xff; \ ++}) ++ ++#define ltoh16_ua(bytes) ({ \ ++ const uint8 *_bytes = (const uint8 *)(bytes); \ ++ _LTOH16_UA(_bytes); \ ++}) ++ ++#define ltoh32_ua(bytes) ({ \ ++ const uint8 *_bytes = (const uint8 *)(bytes); \ ++ _LTOH32_UA(_bytes); \ ++}) ++ ++#define ntoh16_ua(bytes) ({ \ ++ const uint8 *_bytes = (const uint8 *)(bytes); \ ++ _NTOH16_UA(_bytes); \ ++}) ++ ++#define ntoh32_ua(bytes) ({ \ ++ const uint8 *_bytes = (const uint8 *)(bytes); \ ++ _NTOH32_UA(_bytes); \ ++}) ++ ++#else /* !__GNUC__ */ ++ ++/* Inline versions avoid referencing the argument multiple times */ ++static INLINE uint16 ++bcmswap16(uint16 val) ++{ ++ return BCMSWAP16(val); ++} ++ ++static INLINE uint32 ++bcmswap32(uint32 val) ++{ ++ return BCMSWAP32(val); ++} ++ ++static INLINE uint32 ++bcmswap32by16(uint32 val) ++{ ++ return BCMSWAP32BY16(val); ++} ++ ++/* Reverse pairs of bytes in a buffer (not for high-performance use) */ ++/* buf - start of buffer of shorts to swap */ ++/* len - byte length of buffer */ ++static INLINE void ++bcmswap16_buf(uint16 *buf, uint len) ++{ ++ len = len / 2; ++ ++ while (len--) { ++ *buf = bcmswap16(*buf); ++ buf++; ++ } ++} ++ ++/* ++ * Store 16-bit value to unaligned little-endian byte array. ++ */ ++static INLINE void ++htol16_ua_store(uint16 val, uint8 *bytes) ++{ ++ bytes[0] = val & 0xff; ++ bytes[1] = val >> 8; ++} ++ ++/* ++ * Store 32-bit value to unaligned little-endian byte array. ++ */ ++static INLINE void ++htol32_ua_store(uint32 val, uint8 *bytes) ++{ ++ bytes[0] = val & 0xff; ++ bytes[1] = (val >> 8) & 0xff; ++ bytes[2] = (val >> 16) & 0xff; ++ bytes[3] = val >> 24; ++} ++ ++/* ++ * Store 16-bit value to unaligned network-(big-)endian byte array. ++ */ ++static INLINE void ++hton16_ua_store(uint16 val, uint8 *bytes) ++{ ++ bytes[0] = val >> 8; ++ bytes[1] = val & 0xff; ++} ++ ++/* ++ * Store 32-bit value to unaligned network-(big-)endian byte array. ++ */ ++static INLINE void ++hton32_ua_store(uint32 val, uint8 *bytes) ++{ ++ bytes[0] = val >> 24; ++ bytes[1] = (val >> 16) & 0xff; ++ bytes[2] = (val >> 8) & 0xff; ++ bytes[3] = val & 0xff; ++} ++ ++/* ++ * Load 16-bit value from unaligned little-endian byte array. ++ */ ++static INLINE uint16 ++ltoh16_ua(const void *bytes) ++{ ++ return _LTOH16_UA((const uint8 *)bytes); ++} ++ ++/* ++ * Load 32-bit value from unaligned little-endian byte array. ++ */ ++static INLINE uint32 ++ltoh32_ua(const void *bytes) ++{ ++ return _LTOH32_UA((const uint8 *)bytes); ++} ++ ++/* ++ * Load 16-bit value from unaligned big-(network-)endian byte array. ++ */ ++static INLINE uint16 ++ntoh16_ua(const void *bytes) ++{ ++ return _NTOH16_UA((const uint8 *)bytes); ++} ++ ++/* ++ * Load 32-bit value from unaligned big-(network-)endian byte array. ++ */ ++static INLINE uint32 ++ntoh32_ua(const void *bytes) ++{ ++ return _NTOH32_UA((const uint8 *)bytes); ++} ++ ++#endif /* !__GNUC__ */ ++#endif /* !_BCMENDIAN_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmpcispi.h b/drivers/net/wireless/ap6210/include/bcmpcispi.h +new file mode 100644 +index 0000000..44b263c +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmpcispi.h +@@ -0,0 +1,181 @@ ++/* ++ * Broadcom PCI-SPI Host Controller Register Definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmpcispi.h 241182 2011-02-17 21:50:03Z $ ++ */ ++#ifndef _BCM_PCI_SPI_H ++#define _BCM_PCI_SPI_H ++ ++/* cpp contortions to concatenate w/arg prescan */ ++#ifndef PAD ++#define _PADLINE(line) pad ## line ++#define _XSTR(line) _PADLINE(line) ++#define PAD _XSTR(__LINE__) ++#endif /* PAD */ ++ ++ ++typedef volatile struct { ++ uint32 spih_ctrl; /* 0x00 SPI Control Register */ ++ uint32 spih_stat; /* 0x04 SPI Status Register */ ++ uint32 spih_data; /* 0x08 SPI Data Register, 32-bits wide */ ++ uint32 spih_ext; /* 0x0C SPI Extension Register */ ++ uint32 PAD[4]; /* 0x10-0x1F PADDING */ ++ ++ uint32 spih_gpio_ctrl; /* 0x20 SPI GPIO Control Register */ ++ uint32 spih_gpio_data; /* 0x24 SPI GPIO Data Register */ ++ uint32 PAD[6]; /* 0x28-0x3F PADDING */ ++ ++ uint32 spih_int_edge; /* 0x40 SPI Interrupt Edge Register (0=Level, 1=Edge) */ ++ uint32 spih_int_pol; /* 0x44 SPI Interrupt Polarity Register (0=Active Low, */ ++ /* 1=Active High) */ ++ uint32 spih_int_mask; /* 0x48 SPI Interrupt Mask */ ++ uint32 spih_int_status; /* 0x4C SPI Interrupt Status */ ++ uint32 PAD[4]; /* 0x50-0x5F PADDING */ ++ ++ uint32 spih_hex_disp; /* 0x60 SPI 4-digit hex display value */ ++ uint32 spih_current_ma; /* 0x64 SPI SD card current consumption in mA */ ++ uint32 PAD[1]; /* 0x68 PADDING */ ++ uint32 spih_disp_sel; /* 0x6c SPI 4-digit hex display mode select (1=current) */ ++ uint32 PAD[4]; /* 0x70-0x7F PADDING */ ++ uint32 PAD[8]; /* 0x80-0x9F PADDING */ ++ uint32 PAD[8]; /* 0xA0-0xBF PADDING */ ++ uint32 spih_pll_ctrl; /* 0xC0 PLL Control Register */ ++ uint32 spih_pll_status; /* 0xC4 PLL Status Register */ ++ uint32 spih_xtal_freq; /* 0xC8 External Clock Frequency in units of 10000Hz */ ++ uint32 spih_clk_count; /* 0xCC External Clock Count Register */ ++ ++} spih_regs_t; ++ ++typedef volatile struct { ++ uint32 cfg_space[0x40]; /* 0x000-0x0FF PCI Configuration Space (Read Only) */ ++ uint32 P_IMG_CTRL0; /* 0x100 PCI Image0 Control Register */ ++ ++ uint32 P_BA0; /* 0x104 32 R/W PCI Image0 Base Address register */ ++ uint32 P_AM0; /* 0x108 32 R/W PCI Image0 Address Mask register */ ++ uint32 P_TA0; /* 0x10C 32 R/W PCI Image0 Translation Address register */ ++ uint32 P_IMG_CTRL1; /* 0x110 32 R/W PCI Image1 Control register */ ++ uint32 P_BA1; /* 0x114 32 R/W PCI Image1 Base Address register */ ++ uint32 P_AM1; /* 0x118 32 R/W PCI Image1 Address Mask register */ ++ uint32 P_TA1; /* 0x11C 32 R/W PCI Image1 Translation Address register */ ++ uint32 P_IMG_CTRL2; /* 0x120 32 R/W PCI Image2 Control register */ ++ uint32 P_BA2; /* 0x124 32 R/W PCI Image2 Base Address register */ ++ uint32 P_AM2; /* 0x128 32 R/W PCI Image2 Address Mask register */ ++ uint32 P_TA2; /* 0x12C 32 R/W PCI Image2 Translation Address register */ ++ uint32 P_IMG_CTRL3; /* 0x130 32 R/W PCI Image3 Control register */ ++ uint32 P_BA3; /* 0x134 32 R/W PCI Image3 Base Address register */ ++ uint32 P_AM3; /* 0x138 32 R/W PCI Image3 Address Mask register */ ++ uint32 P_TA3; /* 0x13C 32 R/W PCI Image3 Translation Address register */ ++ uint32 P_IMG_CTRL4; /* 0x140 32 R/W PCI Image4 Control register */ ++ uint32 P_BA4; /* 0x144 32 R/W PCI Image4 Base Address register */ ++ uint32 P_AM4; /* 0x148 32 R/W PCI Image4 Address Mask register */ ++ uint32 P_TA4; /* 0x14C 32 R/W PCI Image4 Translation Address register */ ++ uint32 P_IMG_CTRL5; /* 0x150 32 R/W PCI Image5 Control register */ ++ uint32 P_BA5; /* 0x154 32 R/W PCI Image5 Base Address register */ ++ uint32 P_AM5; /* 0x158 32 R/W PCI Image5 Address Mask register */ ++ uint32 P_TA5; /* 0x15C 32 R/W PCI Image5 Translation Address register */ ++ uint32 P_ERR_CS; /* 0x160 32 R/W PCI Error Control and Status register */ ++ uint32 P_ERR_ADDR; /* 0x164 32 R PCI Erroneous Address register */ ++ uint32 P_ERR_DATA; /* 0x168 32 R PCI Erroneous Data register */ ++ ++ uint32 PAD[5]; /* 0x16C-0x17F PADDING */ ++ ++ uint32 WB_CONF_SPC_BAR; /* 0x180 32 R WISHBONE Configuration Space Base Address */ ++ uint32 W_IMG_CTRL1; /* 0x184 32 R/W WISHBONE Image1 Control register */ ++ uint32 W_BA1; /* 0x188 32 R/W WISHBONE Image1 Base Address register */ ++ uint32 W_AM1; /* 0x18C 32 R/W WISHBONE Image1 Address Mask register */ ++ uint32 W_TA1; /* 0x190 32 R/W WISHBONE Image1 Translation Address reg */ ++ uint32 W_IMG_CTRL2; /* 0x194 32 R/W WISHBONE Image2 Control register */ ++ uint32 W_BA2; /* 0x198 32 R/W WISHBONE Image2 Base Address register */ ++ uint32 W_AM2; /* 0x19C 32 R/W WISHBONE Image2 Address Mask register */ ++ uint32 W_TA2; /* 0x1A0 32 R/W WISHBONE Image2 Translation Address reg */ ++ uint32 W_IMG_CTRL3; /* 0x1A4 32 R/W WISHBONE Image3 Control register */ ++ uint32 W_BA3; /* 0x1A8 32 R/W WISHBONE Image3 Base Address register */ ++ uint32 W_AM3; /* 0x1AC 32 R/W WISHBONE Image3 Address Mask register */ ++ uint32 W_TA3; /* 0x1B0 32 R/W WISHBONE Image3 Translation Address reg */ ++ uint32 W_IMG_CTRL4; /* 0x1B4 32 R/W WISHBONE Image4 Control register */ ++ uint32 W_BA4; /* 0x1B8 32 R/W WISHBONE Image4 Base Address register */ ++ uint32 W_AM4; /* 0x1BC 32 R/W WISHBONE Image4 Address Mask register */ ++ uint32 W_TA4; /* 0x1C0 32 R/W WISHBONE Image4 Translation Address reg */ ++ uint32 W_IMG_CTRL5; /* 0x1C4 32 R/W WISHBONE Image5 Control register */ ++ uint32 W_BA5; /* 0x1C8 32 R/W WISHBONE Image5 Base Address register */ ++ uint32 W_AM5; /* 0x1CC 32 R/W WISHBONE Image5 Address Mask register */ ++ uint32 W_TA5; /* 0x1D0 32 R/W WISHBONE Image5 Translation Address reg */ ++ uint32 W_ERR_CS; /* 0x1D4 32 R/W WISHBONE Error Control and Status reg */ ++ uint32 W_ERR_ADDR; /* 0x1D8 32 R WISHBONE Erroneous Address register */ ++ uint32 W_ERR_DATA; /* 0x1DC 32 R WISHBONE Erroneous Data register */ ++ uint32 CNF_ADDR; /* 0x1E0 32 R/W Configuration Cycle register */ ++ uint32 CNF_DATA; /* 0x1E4 32 R/W Configuration Cycle Generation Data reg */ ++ ++ uint32 INT_ACK; /* 0x1E8 32 R Interrupt Acknowledge register */ ++ uint32 ICR; /* 0x1EC 32 R/W Interrupt Control register */ ++ uint32 ISR; /* 0x1F0 32 R/W Interrupt Status register */ ++} spih_pciregs_t; ++ ++/* ++ * PCI Core interrupt enable and status bit definitions. ++ */ ++ ++/* PCI Core ICR Register bit definitions */ ++#define PCI_INT_PROP_EN (1 << 0) /* Interrupt Propagation Enable */ ++#define PCI_WB_ERR_INT_EN (1 << 1) /* Wishbone Error Interrupt Enable */ ++#define PCI_PCI_ERR_INT_EN (1 << 2) /* PCI Error Interrupt Enable */ ++#define PCI_PAR_ERR_INT_EN (1 << 3) /* Parity Error Interrupt Enable */ ++#define PCI_SYS_ERR_INT_EN (1 << 4) /* System Error Interrupt Enable */ ++#define PCI_SOFTWARE_RESET (1U << 31) /* Software reset of the PCI Core. */ ++ ++ ++/* PCI Core ISR Register bit definitions */ ++#define PCI_INT_PROP_ST (1 << 0) /* Interrupt Propagation Status */ ++#define PCI_WB_ERR_INT_ST (1 << 1) /* Wishbone Error Interrupt Status */ ++#define PCI_PCI_ERR_INT_ST (1 << 2) /* PCI Error Interrupt Status */ ++#define PCI_PAR_ERR_INT_ST (1 << 3) /* Parity Error Interrupt Status */ ++#define PCI_SYS_ERR_INT_ST (1 << 4) /* System Error Interrupt Status */ ++ ++ ++/* Registers on the Wishbone bus */ ++#define SPIH_CTLR_INTR (1 << 0) /* SPI Host Controller Core Interrupt */ ++#define SPIH_DEV_INTR (1 << 1) /* SPI Device Interrupt */ ++#define SPIH_WFIFO_INTR (1 << 2) /* SPI Tx FIFO Empty Intr (FPGA Rev >= 8) */ ++ ++/* GPIO Bit definitions */ ++#define SPIH_CS (1 << 0) /* SPI Chip Select (active low) */ ++#define SPIH_SLOT_POWER (1 << 1) /* SD Card Slot Power Enable */ ++#define SPIH_CARD_DETECT (1 << 2) /* SD Card Detect */ ++ ++/* SPI Status Register Bit definitions */ ++#define SPIH_STATE_MASK 0x30 /* SPI Transfer State Machine state mask */ ++#define SPIH_STATE_SHIFT 4 /* SPI Transfer State Machine state shift */ ++#define SPIH_WFFULL (1 << 3) /* SPI Write FIFO Full */ ++#define SPIH_WFEMPTY (1 << 2) /* SPI Write FIFO Empty */ ++#define SPIH_RFFULL (1 << 1) /* SPI Read FIFO Full */ ++#define SPIH_RFEMPTY (1 << 0) /* SPI Read FIFO Empty */ ++ ++#define SPIH_EXT_CLK (1U << 31) /* Use External Clock as PLL Clock source. */ ++ ++#define SPIH_PLL_NO_CLK (1 << 1) /* Set to 1 if the PLL's input clock is lost. */ ++#define SPIH_PLL_LOCKED (1 << 3) /* Set to 1 when the PLL is locked. */ ++ ++/* Spin bit loop bound check */ ++#define SPI_SPIN_BOUND 0xf4240 /* 1 million */ ++ ++#endif /* _BCM_PCI_SPI_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcmperf.h b/drivers/net/wireless/ap6210/include/bcmperf.h +new file mode 100644 +index 0000000..7438307 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmperf.h +@@ -0,0 +1,36 @@ ++/* ++ * Performance counters software interface. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmperf.h 241182 2011-02-17 21:50:03Z $ ++ */ ++/* essai */ ++#ifndef _BCMPERF_H_ ++#define _BCMPERF_H_ ++/* get cache hits and misses */ ++#define BCMPERF_ENABLE_INSTRCOUNT() ++#define BCMPERF_ENABLE_ICACHE_MISS() ++#define BCMPERF_ENABLE_ICACHE_HIT() ++#define BCMPERF_GETICACHE_MISS(x) ((x) = 0) ++#define BCMPERF_GETICACHE_HIT(x) ((x) = 0) ++#define BCMPERF_GETINSTRCOUNT(x) ((x) = 0) ++#endif /* _BCMPERF_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmsdbus.h b/drivers/net/wireless/ap6210/include/bcmsdbus.h +new file mode 100644 +index 0000000..2fa706d +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmsdbus.h +@@ -0,0 +1,152 @@ ++/* ++ * Definitions for API from sdio common code (bcmsdh) to individual ++ * host controller drivers. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdbus.h 347614 2012-07-27 10:24:51Z $ ++ */ ++ ++#ifndef _sdio_api_h_ ++#define _sdio_api_h_ ++ ++ ++#define SDIOH_API_RC_SUCCESS (0x00) ++#define SDIOH_API_RC_FAIL (0x01) ++#define SDIOH_API_SUCCESS(status) (status == 0) ++ ++#define SDIOH_READ 0 /* Read request */ ++#define SDIOH_WRITE 1 /* Write request */ ++ ++#define SDIOH_DATA_FIX 0 /* Fixed addressing */ ++#define SDIOH_DATA_INC 1 /* Incremental addressing */ ++ ++#define SDIOH_CMD_TYPE_NORMAL 0 /* Normal command */ ++#define SDIOH_CMD_TYPE_APPEND 1 /* Append command */ ++#define SDIOH_CMD_TYPE_CUTTHRU 2 /* Cut-through command */ ++ ++#define SDIOH_DATA_PIO 0 /* PIO mode */ ++#define SDIOH_DATA_DMA 1 /* DMA mode */ ++ ++#ifdef BCMSDIOH_TXGLOM ++/* Max number of glommed pkts */ ++#define SDPCM_MAXGLOM_SIZE 10 ++#define SDPCM_DEFGLOM_SIZE 3 ++ ++#define SDPCM_TXGLOM_CPY 0 /* SDIO 2.0 should use copy mode */ ++#define SDPCM_TXGLOM_MDESC 1 /* SDIO 3.0 should use multi-desc mode */ ++#endif ++ ++ ++typedef int SDIOH_API_RC; ++ ++/* SDio Host structure */ ++typedef struct sdioh_info sdioh_info_t; ++ ++/* callback function, taking one arg */ ++typedef void (*sdioh_cb_fn_t)(void *); ++ ++/* attach, return handler on success, NULL if failed. ++ * The handler shall be provided by all subsequent calls. No local cache ++ * cfghdl points to the starting address of pci device mapped memory ++ */ ++extern sdioh_info_t * sdioh_attach(osl_t *osh, void *cfghdl, uint irq); ++extern SDIOH_API_RC sdioh_detach(osl_t *osh, sdioh_info_t *si); ++extern SDIOH_API_RC sdioh_interrupt_register(sdioh_info_t *si, sdioh_cb_fn_t fn, void *argh); ++extern SDIOH_API_RC sdioh_interrupt_deregister(sdioh_info_t *si); ++ ++/* query whether SD interrupt is enabled or not */ ++extern SDIOH_API_RC sdioh_interrupt_query(sdioh_info_t *si, bool *onoff); ++ ++/* enable or disable SD interrupt */ ++extern SDIOH_API_RC sdioh_interrupt_set(sdioh_info_t *si, bool enable_disable); ++ ++#if defined(DHD_DEBUG) ++extern bool sdioh_interrupt_pending(sdioh_info_t *si); ++#endif ++ ++/* read or write one byte using cmd52 */ ++extern SDIOH_API_RC sdioh_request_byte(sdioh_info_t *si, uint rw, uint fnc, uint addr, uint8 *byte); ++ ++/* read or write 2/4 bytes using cmd53 */ ++extern SDIOH_API_RC sdioh_request_word(sdioh_info_t *si, uint cmd_type, uint rw, uint fnc, ++ uint addr, uint32 *word, uint nbyte); ++ ++/* read or write any buffer using cmd53 */ ++extern SDIOH_API_RC sdioh_request_buffer(sdioh_info_t *si, uint pio_dma, uint fix_inc, ++ uint rw, uint fnc_num, uint32 addr, uint regwidth, uint32 buflen, uint8 *buffer, ++ void *pkt); ++ ++#ifdef BCMSDIOH_TXGLOM ++extern void sdioh_glom_post(sdioh_info_t *sd, uint8 *frame, uint len); ++extern void sdioh_glom_clear(sdioh_info_t *sd); ++extern uint sdioh_set_mode(sdioh_info_t *sd, uint mode); ++extern bool sdioh_glom_enabled(void); ++#else ++#define sdioh_glom_post(a, b, c) ++#define sdioh_glom_clear(a) ++#define sdioh_set_mode(a) (0) ++#define sdioh_glom_enabled() (FALSE) ++#endif ++ ++/* get cis data */ ++extern SDIOH_API_RC sdioh_cis_read(sdioh_info_t *si, uint fuc, uint8 *cis, uint32 length); ++ ++extern SDIOH_API_RC sdioh_cfg_read(sdioh_info_t *si, uint fuc, uint32 addr, uint8 *data); ++extern SDIOH_API_RC sdioh_cfg_write(sdioh_info_t *si, uint fuc, uint32 addr, uint8 *data); ++ ++/* query number of io functions */ ++extern uint sdioh_query_iofnum(sdioh_info_t *si); ++ ++/* handle iovars */ ++extern int sdioh_iovar_op(sdioh_info_t *si, const char *name, ++ void *params, int plen, void *arg, int len, bool set); ++ ++/* Issue abort to the specified function and clear controller as needed */ ++extern int sdioh_abort(sdioh_info_t *si, uint fnc); ++ ++/* Start and Stop SDIO without re-enumerating the SD card. */ ++extern int sdioh_start(sdioh_info_t *si, int stage); ++extern int sdioh_stop(sdioh_info_t *si); ++ ++/* Wait system lock free */ ++extern int sdioh_waitlockfree(sdioh_info_t *si); ++ ++/* Reset and re-initialize the device */ ++extern int sdioh_sdio_reset(sdioh_info_t *si); ++ ++/* Helper function */ ++void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh); ++ ++ ++ ++#if defined(BCMSDIOH_STD) ++ #define SDIOH_SLEEP_ENABLED ++#endif ++extern SDIOH_API_RC sdioh_sleep(sdioh_info_t *si, bool enab); ++ ++/* GPIO support */ ++extern SDIOH_API_RC sdioh_gpio_init(sdioh_info_t *sd); ++extern bool sdioh_gpioin(sdioh_info_t *sd, uint32 gpio); ++extern SDIOH_API_RC sdioh_gpioouten(sdioh_info_t *sd, uint32 gpio); ++extern SDIOH_API_RC sdioh_gpioout(sdioh_info_t *sd, uint32 gpio, bool enab); ++ ++#endif /* _sdio_api_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmsdh.h b/drivers/net/wireless/ap6210/include/bcmsdh.h +new file mode 100644 +index 0000000..8e5a563 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmsdh.h +@@ -0,0 +1,247 @@ ++/* ++ * SDIO host client driver interface of Broadcom HNBU ++ * export functions to client drivers ++ * abstract OS and BUS specific details of SDIO ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdh.h 347614 2012-07-27 10:24:51Z $ ++ */ ++ ++/** ++ * @file bcmsdh.h ++ */ ++ ++#ifndef _bcmsdh_h_ ++#define _bcmsdh_h_ ++ ++#define BCMSDH_ERROR_VAL 0x0001 /* Error */ ++#define BCMSDH_INFO_VAL 0x0002 /* Info */ ++extern const uint bcmsdh_msglevel; ++ ++#define BCMSDH_ERROR(x) ++#define BCMSDH_INFO(x) ++ ++#if (defined(BCMSDIOH_STD) || defined(BCMSDIOH_BCM) || defined(BCMSDIOH_SPI)) ++#define BCMSDH_ADAPTER ++#endif /* BCMSDIO && (BCMSDIOH_STD || BCMSDIOH_BCM || BCMSDIOH_SPI) */ ++ ++/* forward declarations */ ++typedef struct bcmsdh_info bcmsdh_info_t; ++typedef void (*bcmsdh_cb_fn_t)(void *); ++ ++/* Attach and build an interface to the underlying SD host driver. ++ * - Allocates resources (structs, arrays, mem, OS handles, etc) needed by bcmsdh. ++ * - Returns the bcmsdh handle and virtual address base for register access. ++ * The returned handle should be used in all subsequent calls, but the bcmsh ++ * implementation may maintain a single "default" handle (e.g. the first or ++ * most recent one) to enable single-instance implementations to pass NULL. ++ */ ++ ++#if 0 && (NDISVER >= 0x0630) && 1 ++extern bcmsdh_info_t *bcmsdh_attach(osl_t *osh, void *cfghdl, ++ void **regsva, uint irq, shared_info_t *sh); ++#else ++extern bcmsdh_info_t *bcmsdh_attach(osl_t *osh, void *cfghdl, void **regsva, uint irq); ++#endif ++ ++/* Detach - freeup resources allocated in attach */ ++extern int bcmsdh_detach(osl_t *osh, void *sdh); ++ ++/* Query if SD device interrupts are enabled */ ++extern bool bcmsdh_intr_query(void *sdh); ++ ++/* Enable/disable SD interrupt */ ++extern int bcmsdh_intr_enable(void *sdh); ++extern int bcmsdh_intr_disable(void *sdh); ++ ++/* Register/deregister device interrupt handler. */ ++extern int bcmsdh_intr_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh); ++extern int bcmsdh_intr_dereg(void *sdh); ++/* Enable/disable SD card interrupt forward */ ++extern void bcmsdh_intr_forward(void *sdh, bool pass); ++ ++#if defined(DHD_DEBUG) ++/* Query pending interrupt status from the host controller */ ++extern bool bcmsdh_intr_pending(void *sdh); ++#endif ++ ++/* Register a callback to be called if and when bcmsdh detects ++ * device removal. No-op in the case of non-removable/hardwired devices. ++ */ ++extern int bcmsdh_devremove_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh); ++ ++/* Access SDIO address space (e.g. CCCR) using CMD52 (single-byte interface). ++ * fn: function number ++ * addr: unmodified SDIO-space address ++ * data: data byte to write ++ * err: pointer to error code (or NULL) ++ */ ++extern uint8 bcmsdh_cfg_read(void *sdh, uint func, uint32 addr, int *err); ++extern void bcmsdh_cfg_write(void *sdh, uint func, uint32 addr, uint8 data, int *err); ++ ++/* Read/Write 4bytes from/to cfg space */ ++extern uint32 bcmsdh_cfg_read_word(void *sdh, uint fnc_num, uint32 addr, int *err); ++extern void bcmsdh_cfg_write_word(void *sdh, uint fnc_num, uint32 addr, uint32 data, int *err); ++ ++/* Read CIS content for specified function. ++ * fn: function whose CIS is being requested (0 is common CIS) ++ * cis: pointer to memory location to place results ++ * length: number of bytes to read ++ * Internally, this routine uses the values from the cis base regs (0x9-0xB) ++ * to form an SDIO-space address to read the data from. ++ */ ++extern int bcmsdh_cis_read(void *sdh, uint func, uint8 *cis, uint length); ++ ++/* Synchronous access to device (client) core registers via CMD53 to F1. ++ * addr: backplane address (i.e. >= regsva from attach) ++ * size: register width in bytes (2 or 4) ++ * data: data for register write ++ */ ++extern uint32 bcmsdh_reg_read(void *sdh, uint32 addr, uint size); ++extern uint32 bcmsdh_reg_write(void *sdh, uint32 addr, uint size, uint32 data); ++ ++/* set sb address window */ ++extern int bcmsdhsdio_set_sbaddr_window(void *sdh, uint32 address, bool force_set); ++ ++/* Indicate if last reg read/write failed */ ++extern bool bcmsdh_regfail(void *sdh); ++ ++/* Buffer transfer to/from device (client) core via cmd53. ++ * fn: function number ++ * addr: backplane address (i.e. >= regsva from attach) ++ * flags: backplane width, address increment, sync/async ++ * buf: pointer to memory data buffer ++ * nbytes: number of bytes to transfer to/from buf ++ * pkt: pointer to packet associated with buf (if any) ++ * complete: callback function for command completion (async only) ++ * handle: handle for completion callback (first arg in callback) ++ * Returns 0 or error code. ++ * NOTE: Async operation is not currently supported. ++ */ ++typedef void (*bcmsdh_cmplt_fn_t)(void *handle, int status, bool sync_waiting); ++extern int bcmsdh_send_buf(void *sdh, uint32 addr, uint fn, uint flags, ++ uint8 *buf, uint nbytes, void *pkt, ++ bcmsdh_cmplt_fn_t complete_fn, void *handle); ++extern int bcmsdh_recv_buf(void *sdh, uint32 addr, uint fn, uint flags, ++ uint8 *buf, uint nbytes, void *pkt, ++ bcmsdh_cmplt_fn_t complete_fn, void *handle); ++ ++extern void bcmsdh_glom_post(void *sdh, uint8 *frame, uint len); ++extern void bcmsdh_glom_clear(void *sdh); ++extern uint bcmsdh_set_mode(void *sdh, uint mode); ++extern bool bcmsdh_glom_enabled(void); ++/* Flags bits */ ++#define SDIO_REQ_4BYTE 0x1 /* Four-byte target (backplane) width (vs. two-byte) */ ++#define SDIO_REQ_FIXED 0x2 /* Fixed address (FIFO) (vs. incrementing address) */ ++#define SDIO_REQ_ASYNC 0x4 /* Async request (vs. sync request) */ ++#define SDIO_BYTE_MODE 0x8 /* Byte mode request(non-block mode) */ ++ ++/* Pending (non-error) return code */ ++#define BCME_PENDING 1 ++ ++/* Read/write to memory block (F1, no FIFO) via CMD53 (sync only). ++ * rw: read or write (0/1) ++ * addr: direct SDIO address ++ * buf: pointer to memory data buffer ++ * nbytes: number of bytes to transfer to/from buf ++ * Returns 0 or error code. ++ */ ++extern int bcmsdh_rwdata(void *sdh, uint rw, uint32 addr, uint8 *buf, uint nbytes); ++ ++/* Issue an abort to the specified function */ ++extern int bcmsdh_abort(void *sdh, uint fn); ++ ++/* Start SDIO Host Controller communication */ ++extern int bcmsdh_start(void *sdh, int stage); ++ ++/* Stop SDIO Host Controller communication */ ++extern int bcmsdh_stop(void *sdh); ++ ++/* Wait system lock free */ ++extern int bcmsdh_waitlockfree(void *sdh); ++ ++/* Returns the "Device ID" of target device on the SDIO bus. */ ++extern int bcmsdh_query_device(void *sdh); ++ ++/* Returns the number of IO functions reported by the device */ ++extern uint bcmsdh_query_iofnum(void *sdh); ++ ++/* Miscellaneous knob tweaker. */ ++extern int bcmsdh_iovar_op(void *sdh, const char *name, ++ void *params, int plen, void *arg, int len, bool set); ++ ++/* Reset and reinitialize the device */ ++extern int bcmsdh_reset(bcmsdh_info_t *sdh); ++ ++/* helper functions */ ++ ++extern void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh); ++ ++/* callback functions */ ++typedef struct { ++ /* attach to device */ ++ void *(*attach)(uint16 vend_id, uint16 dev_id, uint16 bus, uint16 slot, ++ uint16 func, uint bustype, void * regsva, osl_t * osh, ++ void * param); ++ /* detach from device */ ++ void (*detach)(void *ch); ++} bcmsdh_driver_t; ++ ++/* platform specific/high level functions */ ++extern int bcmsdh_register(bcmsdh_driver_t *driver); ++extern void bcmsdh_unregister(void); ++extern bool bcmsdh_chipmatch(uint16 vendor, uint16 device); ++extern void bcmsdh_device_remove(void * sdh); ++ ++extern int bcmsdh_reg_sdio_notify(void* semaphore); ++extern void bcmsdh_unreg_sdio_notify(void); ++ ++extern int bcmsdh_set_drvdata(void * dhdp); ++ ++#if defined(OOB_INTR_ONLY) ++extern int bcmsdh_register_oob_intr(void * dhdp); ++extern void bcmsdh_unregister_oob_intr(void); ++extern void bcmsdh_oob_intr_set(bool enable); ++#endif ++#if defined(HW_OOB) ++void bcmsdh_config_hw_oob_intr(bcmsdh_info_t *sdh, uint chip); ++#endif ++ ++/* Function to pass device-status bits to DHD. */ ++extern uint32 bcmsdh_get_dstatus(void *sdh); ++ ++/* Function to return current window addr */ ++extern uint32 bcmsdh_cur_sbwad(void *sdh); ++ ++/* Function to pass chipid and rev to lower layers for controlling pr's */ ++extern void bcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev); ++ ++ ++extern int bcmsdh_sleep(void *sdh, bool enab); ++ ++/* GPIO support */ ++extern int bcmsdh_gpio_init(void *sd); ++extern bool bcmsdh_gpioin(void *sd, uint32 gpio); ++extern int bcmsdh_gpioouten(void *sd, uint32 gpio); ++extern int bcmsdh_gpioout(void *sd, uint32 gpio, bool enab); ++ ++#endif /* _bcmsdh_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmsdh_sdmmc.h b/drivers/net/wireless/ap6210/include/bcmsdh_sdmmc.h +new file mode 100644 +index 0000000..a169588 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmsdh_sdmmc.h +@@ -0,0 +1,109 @@ ++/* ++ * BCMSDH Function Driver for the native SDIO/MMC driver in the Linux Kernel ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdh_sdmmc.h 366812 2012-11-05 13:49:32Z $ ++ */ ++ ++#ifndef __BCMSDH_SDMMC_H__ ++#define __BCMSDH_SDMMC_H__ ++ ++#define sd_sync_dma(sd, read, nbytes) ++#define sd_init_dma(sd) ++#define sd_ack_intr(sd) ++#define sd_wakeup(sd); ++ ++/* Allocate/init/free per-OS private data */ ++extern int sdioh_sdmmc_osinit(sdioh_info_t *sd); ++extern void sdioh_sdmmc_osfree(sdioh_info_t *sd); ++ ++#define BLOCK_SIZE_4318 64 ++#define BLOCK_SIZE_4328 512 ++ ++/* internal return code */ ++#define SUCCESS 0 ++#define ERROR 1 ++ ++/* private bus modes */ ++#define SDIOH_MODE_SD4 2 ++#define CLIENT_INTR 0x100 /* Get rid of this! */ ++ ++struct sdioh_info { ++ osl_t *osh; /* osh handler */ ++ bool client_intr_enabled; /* interrupt connnected flag */ ++ bool intr_handler_valid; /* client driver interrupt handler valid */ ++ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ ++ void *intr_handler_arg; /* argument to call interrupt handler */ ++ uint16 intmask; /* Current active interrupts */ ++ void *sdos_info; /* Pointer to per-OS private data */ ++ ++ uint irq; /* Client irq */ ++ int intrcount; /* Client interrupts */ ++ ++ bool sd_use_dma; /* DMA on CMD53 */ ++ bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ ++ /* Must be on for sd_multiblock to be effective */ ++ bool use_client_ints; /* If this is false, make sure to restore */ ++ int sd_mode; /* SD1/SD4/SPI */ ++ int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ ++ uint8 num_funcs; /* Supported funcs on client */ ++ uint32 com_cis_ptr; ++ uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; ++ ++#define SDIOH_SDMMC_MAX_SG_ENTRIES 32 ++ struct scatterlist sg_list[SDIOH_SDMMC_MAX_SG_ENTRIES]; ++ bool use_rxchain; ++}; ++ ++/************************************************************ ++ * Internal interfaces: per-port references into bcmsdh_sdmmc.c ++ */ ++ ++/* Global message bits */ ++extern uint sd_msglevel; ++ ++/* OS-independent interrupt handler */ ++extern bool check_client_intr(sdioh_info_t *sd); ++ ++/* Core interrupt enable/disable of device interrupts */ ++extern void sdioh_sdmmc_devintr_on(sdioh_info_t *sd); ++extern void sdioh_sdmmc_devintr_off(sdioh_info_t *sd); ++ ++ ++/************************************************************** ++ * Internal interfaces: bcmsdh_sdmmc.c references to per-port code ++ */ ++ ++/* Register mapping routines */ ++extern uint32 *sdioh_sdmmc_reg_map(osl_t *osh, int32 addr, int size); ++extern void sdioh_sdmmc_reg_unmap(osl_t *osh, int32 addr, int size); ++ ++/* Interrupt (de)registration routines */ ++extern int sdioh_sdmmc_register_irq(sdioh_info_t *sd, uint irq); ++extern void sdioh_sdmmc_free_irq(uint irq, sdioh_info_t *sd); ++ ++typedef struct _BCMSDH_SDMMC_INSTANCE { ++ sdioh_info_t *sd; ++ struct sdio_func *func[SDIOD_MAX_IOFUNCS]; ++} BCMSDH_SDMMC_INSTANCE, *PBCMSDH_SDMMC_INSTANCE; ++ ++#endif /* __BCMSDH_SDMMC_H__ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmsdpcm.h b/drivers/net/wireless/ap6210/include/bcmsdpcm.h +new file mode 100644 +index 0000000..fb2ec3a +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmsdpcm.h +@@ -0,0 +1,281 @@ ++/* ++ * Broadcom SDIO/PCMCIA ++ * Software-specific definitions shared between device and host side ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdpcm.h 362722 2012-10-12 23:55:55Z $ ++ */ ++ ++#ifndef _bcmsdpcm_h_ ++#define _bcmsdpcm_h_ ++ ++/* ++ * Software allocation of To SB Mailbox resources ++ */ ++ ++/* intstatus bits */ ++#define I_SMB_NAK I_SMB_SW0 /* To SB Mailbox Frame NAK */ ++#define I_SMB_INT_ACK I_SMB_SW1 /* To SB Mailbox Host Interrupt ACK */ ++#define I_SMB_USE_OOB I_SMB_SW2 /* To SB Mailbox Use OOB Wakeup */ ++#define I_SMB_DEV_INT I_SMB_SW3 /* To SB Mailbox Miscellaneous Interrupt */ ++ ++#define I_TOSBMAIL (I_SMB_NAK | I_SMB_INT_ACK | I_SMB_USE_OOB | I_SMB_DEV_INT) ++ ++/* tosbmailbox bits corresponding to intstatus bits */ ++#define SMB_NAK (1 << 0) /* To SB Mailbox Frame NAK */ ++#define SMB_INT_ACK (1 << 1) /* To SB Mailbox Host Interrupt ACK */ ++#define SMB_USE_OOB (1 << 2) /* To SB Mailbox Use OOB Wakeup */ ++#define SMB_DEV_INT (1 << 3) /* To SB Mailbox Miscellaneous Interrupt */ ++#define SMB_MASK 0x0000000f /* To SB Mailbox Mask */ ++ ++/* tosbmailboxdata */ ++#define SMB_DATA_VERSION_MASK 0x00ff0000 /* host protocol version (sent with F2 enable) */ ++#define SMB_DATA_VERSION_SHIFT 16 /* host protocol version (sent with F2 enable) */ ++ ++/* ++ * Software allocation of To Host Mailbox resources ++ */ ++ ++/* intstatus bits */ ++#define I_HMB_FC_STATE I_HMB_SW0 /* To Host Mailbox Flow Control State */ ++#define I_HMB_FC_CHANGE I_HMB_SW1 /* To Host Mailbox Flow Control State Changed */ ++#define I_HMB_FRAME_IND I_HMB_SW2 /* To Host Mailbox Frame Indication */ ++#define I_HMB_HOST_INT I_HMB_SW3 /* To Host Mailbox Miscellaneous Interrupt */ ++ ++#define I_TOHOSTMAIL (I_HMB_FC_CHANGE | I_HMB_FRAME_IND | I_HMB_HOST_INT) ++ ++/* tohostmailbox bits corresponding to intstatus bits */ ++#define HMB_FC_ON (1 << 0) /* To Host Mailbox Flow Control State */ ++#define HMB_FC_CHANGE (1 << 1) /* To Host Mailbox Flow Control State Changed */ ++#define HMB_FRAME_IND (1 << 2) /* To Host Mailbox Frame Indication */ ++#define HMB_HOST_INT (1 << 3) /* To Host Mailbox Miscellaneous Interrupt */ ++#define HMB_MASK 0x0000000f /* To Host Mailbox Mask */ ++ ++/* tohostmailboxdata */ ++#define HMB_DATA_NAKHANDLED 0x01 /* we're ready to retransmit NAK'd frame to host */ ++#define HMB_DATA_DEVREADY 0x02 /* we're ready to to talk to host after enable */ ++#define HMB_DATA_FC 0x04 /* per prio flowcontrol update flag to host */ ++#define HMB_DATA_FWREADY 0x08 /* firmware is ready for protocol activity */ ++#define HMB_DATA_FWHALT 0x10 /* firmware has halted operation */ ++ ++#define HMB_DATA_FCDATA_MASK 0xff000000 /* per prio flowcontrol data */ ++#define HMB_DATA_FCDATA_SHIFT 24 /* per prio flowcontrol data */ ++ ++#define HMB_DATA_VERSION_MASK 0x00ff0000 /* device protocol version (with devready) */ ++#define HMB_DATA_VERSION_SHIFT 16 /* device protocol version (with devready) */ ++ ++/* ++ * Software-defined protocol header ++ */ ++ ++/* Current protocol version */ ++#define SDPCM_PROT_VERSION 4 ++ ++/* SW frame header */ ++#define SDPCM_SEQUENCE_MASK 0x000000ff /* Sequence Number Mask */ ++#define SDPCM_PACKET_SEQUENCE(p) (((uint8 *)p)[0] & 0xff) /* p starts w/SW Header */ ++ ++#define SDPCM_CHANNEL_MASK 0x00000f00 /* Channel Number Mask */ ++#define SDPCM_CHANNEL_SHIFT 8 /* Channel Number Shift */ ++#define SDPCM_PACKET_CHANNEL(p) (((uint8 *)p)[1] & 0x0f) /* p starts w/SW Header */ ++ ++#define SDPCM_FLAGS_MASK 0x0000f000 /* Mask of flag bits */ ++#define SDPCM_FLAGS_SHIFT 12 /* Flag bits shift */ ++#define SDPCM_PACKET_FLAGS(p) ((((uint8 *)p)[1] & 0xf0) >> 4) /* p starts w/SW Header */ ++ ++/* Next Read Len: lookahead length of next frame, in 16-byte units (rounded up) */ ++#define SDPCM_NEXTLEN_MASK 0x00ff0000 /* Next Read Len Mask */ ++#define SDPCM_NEXTLEN_SHIFT 16 /* Next Read Len Shift */ ++#define SDPCM_NEXTLEN_VALUE(p) ((((uint8 *)p)[2] & 0xff) << 4) /* p starts w/SW Header */ ++#define SDPCM_NEXTLEN_OFFSET 2 ++ ++/* Data Offset from SOF (HW Tag, SW Tag, Pad) */ ++#define SDPCM_DOFFSET_OFFSET 3 /* Data Offset */ ++#define SDPCM_DOFFSET_VALUE(p) (((uint8 *)p)[SDPCM_DOFFSET_OFFSET] & 0xff) ++#define SDPCM_DOFFSET_MASK 0xff000000 ++#define SDPCM_DOFFSET_SHIFT 24 ++ ++#define SDPCM_FCMASK_OFFSET 4 /* Flow control */ ++#define SDPCM_FCMASK_VALUE(p) (((uint8 *)p)[SDPCM_FCMASK_OFFSET ] & 0xff) ++#define SDPCM_WINDOW_OFFSET 5 /* Credit based fc */ ++#define SDPCM_WINDOW_VALUE(p) (((uint8 *)p)[SDPCM_WINDOW_OFFSET] & 0xff) ++#define SDPCM_VERSION_OFFSET 6 /* Version # */ ++#define SDPCM_VERSION_VALUE(p) (((uint8 *)p)[SDPCM_VERSION_OFFSET] & 0xff) ++#define SDPCM_UNUSED_OFFSET 7 /* Spare */ ++#define SDPCM_UNUSED_VALUE(p) (((uint8 *)p)[SDPCM_UNUSED_OFFSET] & 0xff) ++ ++#define SDPCM_SWHEADER_LEN 8 /* SW header is 64 bits */ ++ ++/* logical channel numbers */ ++#define SDPCM_CONTROL_CHANNEL 0 /* Control Request/Response Channel Id */ ++#define SDPCM_EVENT_CHANNEL 1 /* Asyc Event Indication Channel Id */ ++#define SDPCM_DATA_CHANNEL 2 /* Data Xmit/Recv Channel Id */ ++#define SDPCM_GLOM_CHANNEL 3 /* For coalesced packets (superframes) */ ++#define SDPCM_TEST_CHANNEL 15 /* Reserved for test/debug packets */ ++#define SDPCM_MAX_CHANNEL 15 ++ ++#define SDPCM_SEQUENCE_WRAP 256 /* wrap-around val for eight-bit frame seq number */ ++ ++#define SDPCM_FLAG_RESVD0 0x01 ++#define SDPCM_FLAG_RESVD1 0x02 ++#define SDPCM_FLAG_GSPI_TXENAB 0x04 ++#define SDPCM_FLAG_GLOMDESC 0x08 /* Superframe descriptor mask */ ++ ++/* For GLOM_CHANNEL frames, use a flag to indicate descriptor frame */ ++#define SDPCM_GLOMDESC_FLAG (SDPCM_FLAG_GLOMDESC << SDPCM_FLAGS_SHIFT) ++ ++#define SDPCM_GLOMDESC(p) (((uint8 *)p)[1] & 0x80) ++ ++/* For TEST_CHANNEL packets, define another 4-byte header */ ++#define SDPCM_TEST_HDRLEN 4 /* Generally: Cmd(1), Ext(1), Len(2); ++ * Semantics of Ext byte depend on command. ++ * Len is current or requested frame length, not ++ * including test header; sent little-endian. ++ */ ++#define SDPCM_TEST_PKT_CNT_FLD_LEN 4 /* Packet count filed legth */ ++#define SDPCM_TEST_DISCARD 0x01 /* Receiver discards. Ext is a pattern id. */ ++#define SDPCM_TEST_ECHOREQ 0x02 /* Echo request. Ext is a pattern id. */ ++#define SDPCM_TEST_ECHORSP 0x03 /* Echo response. Ext is a pattern id. */ ++#define SDPCM_TEST_BURST 0x04 /* Receiver to send a burst. Ext is a frame count ++ * (Backward compatabilty) Set frame count in a ++ * 4 byte filed adjacent to the HDR ++ */ ++#define SDPCM_TEST_SEND 0x05 /* Receiver sets send mode. Ext is boolean on/off ++ * Set frame count in a 4 byte filed adjacent to ++ * the HDR ++ */ ++ ++/* Handy macro for filling in datagen packets with a pattern */ ++#define SDPCM_TEST_FILL(byteno, id) ((uint8)(id + byteno)) ++ ++/* ++ * Software counters (first part matches hardware counters) ++ */ ++ ++typedef volatile struct { ++ uint32 cmd52rd; /* Cmd52RdCount, SDIO: cmd52 reads */ ++ uint32 cmd52wr; /* Cmd52WrCount, SDIO: cmd52 writes */ ++ uint32 cmd53rd; /* Cmd53RdCount, SDIO: cmd53 reads */ ++ uint32 cmd53wr; /* Cmd53WrCount, SDIO: cmd53 writes */ ++ uint32 abort; /* AbortCount, SDIO: aborts */ ++ uint32 datacrcerror; /* DataCrcErrorCount, SDIO: frames w/CRC error */ ++ uint32 rdoutofsync; /* RdOutOfSyncCount, SDIO/PCMCIA: Rd Frm out of sync */ ++ uint32 wroutofsync; /* RdOutOfSyncCount, SDIO/PCMCIA: Wr Frm out of sync */ ++ uint32 writebusy; /* WriteBusyCount, SDIO: device asserted "busy" */ ++ uint32 readwait; /* ReadWaitCount, SDIO: no data ready for a read cmd */ ++ uint32 readterm; /* ReadTermCount, SDIO: read frame termination cmds */ ++ uint32 writeterm; /* WriteTermCount, SDIO: write frames termination cmds */ ++ uint32 rxdescuflo; /* receive descriptor underflows */ ++ uint32 rxfifooflo; /* receive fifo overflows */ ++ uint32 txfifouflo; /* transmit fifo underflows */ ++ uint32 runt; /* runt (too short) frames recv'd from bus */ ++ uint32 badlen; /* frame's rxh len does not match its hw tag len */ ++ uint32 badcksum; /* frame's hw tag chksum doesn't agree with len value */ ++ uint32 seqbreak; /* break in sequence # space from one rx frame to the next */ ++ uint32 rxfcrc; /* frame rx header indicates crc error */ ++ uint32 rxfwoos; /* frame rx header indicates write out of sync */ ++ uint32 rxfwft; /* frame rx header indicates write frame termination */ ++ uint32 rxfabort; /* frame rx header indicates frame aborted */ ++ uint32 woosint; /* write out of sync interrupt */ ++ uint32 roosint; /* read out of sync interrupt */ ++ uint32 rftermint; /* read frame terminate interrupt */ ++ uint32 wftermint; /* write frame terminate interrupt */ ++} sdpcmd_cnt_t; ++ ++/* ++ * Register Access Macros ++ */ ++ ++#define SDIODREV_IS(var, val) ((var) == (val)) ++#define SDIODREV_GE(var, val) ((var) >= (val)) ++#define SDIODREV_GT(var, val) ((var) > (val)) ++#define SDIODREV_LT(var, val) ((var) < (val)) ++#define SDIODREV_LE(var, val) ((var) <= (val)) ++ ++#define SDIODDMAREG32(h, dir, chnl) \ ++ ((dir) == DMA_TX ? \ ++ (void *)(uintptr)&((h)->regs->dma.sdiod32.dma32regs[chnl].xmt) : \ ++ (void *)(uintptr)&((h)->regs->dma.sdiod32.dma32regs[chnl].rcv)) ++ ++#define SDIODDMAREG64(h, dir, chnl) \ ++ ((dir) == DMA_TX ? \ ++ (void *)(uintptr)&((h)->regs->dma.sdiod64.dma64regs[chnl].xmt) : \ ++ (void *)(uintptr)&((h)->regs->dma.sdiod64.dma64regs[chnl].rcv)) ++ ++#define SDIODDMAREG(h, dir, chnl) \ ++ (SDIODREV_LT((h)->corerev, 1) ? \ ++ SDIODDMAREG32((h), (dir), (chnl)) : \ ++ SDIODDMAREG64((h), (dir), (chnl))) ++ ++#define PCMDDMAREG(h, dir, chnl) \ ++ ((dir) == DMA_TX ? \ ++ (void *)(uintptr)&((h)->regs->dma.pcm32.dmaregs.xmt) : \ ++ (void *)(uintptr)&((h)->regs->dma.pcm32.dmaregs.rcv)) ++ ++#define SDPCMDMAREG(h, dir, chnl, coreid) \ ++ ((coreid) == SDIOD_CORE_ID ? \ ++ SDIODDMAREG(h, dir, chnl) : \ ++ PCMDDMAREG(h, dir, chnl)) ++ ++#define SDIODFIFOREG(h, corerev) \ ++ (SDIODREV_LT((corerev), 1) ? \ ++ ((dma32diag_t *)(uintptr)&((h)->regs->dma.sdiod32.dmafifo)) : \ ++ ((dma32diag_t *)(uintptr)&((h)->regs->dma.sdiod64.dmafifo))) ++ ++#define PCMDFIFOREG(h) \ ++ ((dma32diag_t *)(uintptr)&((h)->regs->dma.pcm32.dmafifo)) ++ ++#define SDPCMFIFOREG(h, coreid, corerev) \ ++ ((coreid) == SDIOD_CORE_ID ? \ ++ SDIODFIFOREG(h, corerev) : \ ++ PCMDFIFOREG(h)) ++ ++/* ++ * Shared structure between dongle and the host. ++ * The structure contains pointers to trap or assert information. ++ */ ++#define SDPCM_SHARED_VERSION 0x0001 ++#define SDPCM_SHARED_VERSION_MASK 0x00FF ++#define SDPCM_SHARED_ASSERT_BUILT 0x0100 ++#define SDPCM_SHARED_ASSERT 0x0200 ++#define SDPCM_SHARED_TRAP 0x0400 ++#define SDPCM_SHARED_IN_BRPT 0x0800 ++#define SDPCM_SHARED_SET_BRPT 0x1000 ++#define SDPCM_SHARED_PENDING_BRPT 0x2000 ++ ++typedef struct { ++ uint32 flags; ++ uint32 trap_addr; ++ uint32 assert_exp_addr; ++ uint32 assert_file_addr; ++ uint32 assert_line; ++ uint32 console_addr; /* Address of hndrte_cons_t */ ++ uint32 msgtrace_addr; ++ uint32 brpt_addr; ++} sdpcm_shared_t; ++ ++extern sdpcm_shared_t sdpcm_shared; ++ ++/* Function can be used to notify host of FW halt */ ++extern void sdpcmd_fwhalt(void); ++ ++#endif /* _bcmsdpcm_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmsdspi.h b/drivers/net/wireless/ap6210/include/bcmsdspi.h +new file mode 100644 +index 0000000..9a7496b +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmsdspi.h +@@ -0,0 +1,119 @@ ++/* ++ * SD-SPI Protocol Conversion - BCMSDH->SPI Translation Layer ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdspi.h 294363 2011-11-06 23:02:20Z $ ++ */ ++#ifndef _BCM_SD_SPI_H ++#define _BCM_SD_SPI_H ++ ++#define BLOCK_SIZE_4318 64 ++#define BLOCK_SIZE_4328 512 ++ ++/* internal return code */ ++#define SUCCESS 0 ++#undef ERROR ++#define ERROR 1 ++ ++/* private bus modes */ ++#define SDIOH_MODE_SPI 0 ++ ++#define USE_BLOCKMODE 0x2 /* Block mode can be single block or multi */ ++#define USE_MULTIBLOCK 0x4 ++ ++struct sdioh_info { ++ uint cfg_bar; /* pci cfg address for bar */ ++ uint32 caps; /* cached value of capabilities reg */ ++ uint bar0; /* BAR0 for PCI Device */ ++ osl_t *osh; /* osh handler */ ++ void *controller; /* Pointer to SPI Controller's private data struct */ ++ ++ uint lockcount; /* nest count of sdspi_lock() calls */ ++ bool client_intr_enabled; /* interrupt connnected flag */ ++ bool intr_handler_valid; /* client driver interrupt handler valid */ ++ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ ++ void *intr_handler_arg; /* argument to call interrupt handler */ ++ bool initialized; /* card initialized */ ++ uint32 target_dev; /* Target device ID */ ++ uint32 intmask; /* Current active interrupts */ ++ void *sdos_info; /* Pointer to per-OS private data */ ++ ++ uint32 controller_type; /* Host controller type */ ++ uint8 version; /* Host Controller Spec Compliance Version */ ++ uint irq; /* Client irq */ ++ uint32 intrcount; /* Client interrupts */ ++ uint32 local_intrcount; /* Controller interrupts */ ++ bool host_init_done; /* Controller initted */ ++ bool card_init_done; /* Client SDIO interface initted */ ++ bool polled_mode; /* polling for command completion */ ++ ++ bool sd_use_dma; /* DMA on CMD53 */ ++ bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ ++ /* Must be on for sd_multiblock to be effective */ ++ bool use_client_ints; /* If this is false, make sure to restore */ ++ bool got_hcint; /* Host Controller interrupt. */ ++ /* polling hack in wl_linux.c:wl_timer() */ ++ int adapter_slot; /* Maybe dealing with multiple slots/controllers */ ++ int sd_mode; /* SD1/SD4/SPI */ ++ int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ ++ uint32 data_xfer_count; /* Current register transfer size */ ++ uint32 cmd53_wr_data; /* Used to pass CMD53 write data */ ++ uint32 card_response; /* Used to pass back response status byte */ ++ uint32 card_rsp_data; /* Used to pass back response data word */ ++ uint16 card_rca; /* Current Address */ ++ uint8 num_funcs; /* Supported funcs on client */ ++ uint32 com_cis_ptr; ++ uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; ++ void *dma_buf; ++ ulong dma_phys; ++ int r_cnt; /* rx count */ ++ int t_cnt; /* tx_count */ ++}; ++ ++/************************************************************ ++ * Internal interfaces: per-port references into bcmsdspi.c ++ */ ++ ++/* Global message bits */ ++extern uint sd_msglevel; ++ ++/************************************************************** ++ * Internal interfaces: bcmsdspi.c references to per-port code ++ */ ++ ++/* Register mapping routines */ ++extern uint32 *spi_reg_map(osl_t *osh, uintptr addr, int size); ++extern void spi_reg_unmap(osl_t *osh, uintptr addr, int size); ++ ++/* Interrupt (de)registration routines */ ++extern int spi_register_irq(sdioh_info_t *sd, uint irq); ++extern void spi_free_irq(uint irq, sdioh_info_t *sd); ++ ++/* OS-specific interrupt wrappers (atomic interrupt enable/disable) */ ++extern void spi_lock(sdioh_info_t *sd); ++extern void spi_unlock(sdioh_info_t *sd); ++ ++/* Allocate/init/free per-OS private data */ ++extern int spi_osinit(sdioh_info_t *sd); ++extern void spi_osfree(sdioh_info_t *sd); ++ ++#endif /* _BCM_SD_SPI_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcmsdstd.h b/drivers/net/wireless/ap6210/include/bcmsdstd.h +new file mode 100644 +index 0000000..1c854b2 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmsdstd.h +@@ -0,0 +1,248 @@ ++0/* ++ * 'Standard' SDIO HOST CONTROLLER driver ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmsdstd.h 347614 2012-07-27 10:24:51Z $ ++ */ ++#ifndef _BCM_SD_STD_H ++#define _BCM_SD_STD_H ++ ++#define sd_sync_dma(sd, read, nbytes) ++#define sd_init_dma(sd) ++#define sd_ack_intr(sd) ++#define sd_wakeup(sd); ++/* Allocate/init/free per-OS private data */ ++extern int sdstd_osinit(sdioh_info_t *sd); ++extern void sdstd_osfree(sdioh_info_t *sd); ++ ++#define BLOCK_SIZE_4318 64 ++#define BLOCK_SIZE_4328 512 ++ ++/* internal return code */ ++#define SUCCESS 0 ++#define ERROR 1 ++ ++/* private bus modes */ ++#define SDIOH_MODE_SPI 0 ++#define SDIOH_MODE_SD1 1 ++#define SDIOH_MODE_SD4 2 ++ ++#define MAX_SLOTS 6 /* For PCI: Only 6 BAR entries => 6 slots */ ++#define SDIOH_REG_WINSZ 0x100 /* Number of registers in Standard Host Controller */ ++ ++#define SDIOH_TYPE_ARASAN_HDK 1 ++#define SDIOH_TYPE_BCM27XX 2 ++#define SDIOH_TYPE_TI_PCIXX21 4 /* TI PCIxx21 Standard Host Controller */ ++#define SDIOH_TYPE_RICOH_R5C822 5 /* Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter */ ++#define SDIOH_TYPE_JMICRON 6 /* JMicron Standard SDIO Host Controller */ ++ ++/* For linux, allow yielding for dongle */ ++#define BCMSDYIELD ++ ++/* Expected card status value for CMD7 */ ++#define SDIOH_CMD7_EXP_STATUS 0x00001E00 ++ ++#define RETRIES_LARGE 100000 ++#define sdstd_os_yield(sd) do {} while (0) ++#define RETRIES_SMALL 100 ++ ++ ++#define USE_BLOCKMODE 0x2 /* Block mode can be single block or multi */ ++#define USE_MULTIBLOCK 0x4 ++ ++#define USE_FIFO 0x8 /* Fifo vs non-fifo */ ++ ++#define CLIENT_INTR 0x100 /* Get rid of this! */ ++ ++#define HC_INTR_RETUNING 0x1000 ++ ++ ++#ifdef BCMSDIOH_TXGLOM ++/* Setting the MAX limit to 10 */ ++#define SDIOH_MAXGLOM_SIZE 10 ++ ++typedef struct glom_buf { ++ uint32 count; /* Total number of pkts queued */ ++ void *dma_buf_arr[SDIOH_MAXGLOM_SIZE]; /* Frame address */ ++ ulong dma_phys_arr[SDIOH_MAXGLOM_SIZE]; /* DMA_MAPed address of frames */ ++ uint16 nbytes[SDIOH_MAXGLOM_SIZE]; /* Size of each frame */ ++} glom_buf_t; ++#endif ++ ++struct sdioh_info { ++ uint cfg_bar; /* pci cfg address for bar */ ++ uint32 caps; /* cached value of capabilities reg */ ++ uint32 curr_caps; /* max current capabilities reg */ ++ ++ osl_t *osh; /* osh handler */ ++ volatile char *mem_space; /* pci device memory va */ ++ uint lockcount; /* nest count of sdstd_lock() calls */ ++ bool client_intr_enabled; /* interrupt connnected flag */ ++ bool intr_handler_valid; /* client driver interrupt handler valid */ ++ sdioh_cb_fn_t intr_handler; /* registered interrupt handler */ ++ void *intr_handler_arg; /* argument to call interrupt handler */ ++ bool initialized; /* card initialized */ ++ uint target_dev; /* Target device ID */ ++ uint16 intmask; /* Current active interrupts */ ++ void *sdos_info; /* Pointer to per-OS private data */ ++ ++ uint32 controller_type; /* Host controller type */ ++ uint8 version; /* Host Controller Spec Compliance Version */ ++ uint irq; /* Client irq */ ++ int intrcount; /* Client interrupts */ ++ int local_intrcount; /* Controller interrupts */ ++ bool host_init_done; /* Controller initted */ ++ bool card_init_done; /* Client SDIO interface initted */ ++ bool polled_mode; /* polling for command completion */ ++ ++ bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */ ++ /* Must be on for sd_multiblock to be effective */ ++ bool use_client_ints; /* If this is false, make sure to restore */ ++ /* polling hack in wl_linux.c:wl_timer() */ ++ int adapter_slot; /* Maybe dealing with multiple slots/controllers */ ++ int sd_mode; /* SD1/SD4/SPI */ ++ int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */ ++ uint32 data_xfer_count; /* Current transfer */ ++ uint16 card_rca; /* Current Address */ ++ int8 sd_dma_mode; /* DMA Mode (PIO, SDMA, ... ADMA2) on CMD53 */ ++ uint8 num_funcs; /* Supported funcs on client */ ++ uint32 com_cis_ptr; ++ uint32 func_cis_ptr[SDIOD_MAX_IOFUNCS]; ++ void *dma_buf; /* DMA Buffer virtual address */ ++ ulong dma_phys; /* DMA Buffer physical address */ ++ void *adma2_dscr_buf; /* ADMA2 Descriptor Buffer virtual address */ ++ ulong adma2_dscr_phys; /* ADMA2 Descriptor Buffer physical address */ ++ ++ /* adjustments needed to make the dma align properly */ ++ void *dma_start_buf; ++ ulong dma_start_phys; ++ uint alloced_dma_size; ++ void *adma2_dscr_start_buf; ++ ulong adma2_dscr_start_phys; ++ uint alloced_adma2_dscr_size; ++ ++ int r_cnt; /* rx count */ ++ int t_cnt; /* tx_count */ ++ bool got_hcint; /* local interrupt flag */ ++ uint16 last_intrstatus; /* to cache intrstatus */ ++ int host_UHSISupported; /* whether UHSI is supported for HC. */ ++ int card_UHSI_voltage_Supported; /* whether UHSI is supported for ++ * Card in terms of Voltage [1.8 or 3.3]. ++ */ ++ int global_UHSI_Supp; /* type of UHSI support in both host and card. ++ * HOST_SDR_UNSUPP: capabilities not supported/matched ++ * HOST_SDR_12_25: SDR12 and SDR25 supported ++ * HOST_SDR_50_104_DDR: one of SDR50/SDR104 or DDR50 supptd ++ */ ++ volatile int sd3_dat_state; /* data transfer state used for retuning check */ ++ volatile int sd3_tun_state; /* tuning state used for retuning check */ ++ bool sd3_tuning_reqd; /* tuning requirement parameter */ ++ uint32 caps3; /* cached value of 32 MSbits capabilities reg (SDIO 3.0) */ ++#ifdef BCMSDIOH_TXGLOM ++ glom_buf_t glom_info; /* pkt information used for glomming */ ++ uint txglom_mode; /* Txglom mode: 0 - copy, 1 - multi-descriptor */ ++#endif ++}; ++ ++#define DMA_MODE_NONE 0 ++#define DMA_MODE_SDMA 1 ++#define DMA_MODE_ADMA1 2 ++#define DMA_MODE_ADMA2 3 ++#define DMA_MODE_ADMA2_64 4 ++#define DMA_MODE_AUTO -1 ++ ++#define USE_DMA(sd) ((bool)((sd->sd_dma_mode > 0) ? TRUE : FALSE)) ++ ++/* States for Tuning and corr data */ ++#define TUNING_IDLE 0 ++#define TUNING_START 1 ++#define TUNING_START_AFTER_DAT 2 ++#define TUNING_ONGOING 3 ++ ++#define DATA_TRANSFER_IDLE 0 ++#define DATA_TRANSFER_ONGOING 1 ++ ++#define CHECK_TUNING_PRE_DATA 1 ++#define CHECK_TUNING_POST_DATA 2 ++ ++/************************************************************ ++ * Internal interfaces: per-port references into bcmsdstd.c ++ */ ++ ++/* Global message bits */ ++extern uint sd_msglevel; ++ ++/* OS-independent interrupt handler */ ++extern bool check_client_intr(sdioh_info_t *sd); ++ ++/* Core interrupt enable/disable of device interrupts */ ++extern void sdstd_devintr_on(sdioh_info_t *sd); ++extern void sdstd_devintr_off(sdioh_info_t *sd); ++ ++/* Enable/disable interrupts for local controller events */ ++extern void sdstd_intrs_on(sdioh_info_t *sd, uint16 norm, uint16 err); ++extern void sdstd_intrs_off(sdioh_info_t *sd, uint16 norm, uint16 err); ++ ++/* Wait for specified interrupt and error bits to be set */ ++extern void sdstd_spinbits(sdioh_info_t *sd, uint16 norm, uint16 err); ++ ++ ++/************************************************************** ++ * Internal interfaces: bcmsdstd.c references to per-port code ++ */ ++ ++/* Register mapping routines */ ++extern uint32 *sdstd_reg_map(osl_t *osh, int32 addr, int size); ++extern void sdstd_reg_unmap(osl_t *osh, int32 addr, int size); ++ ++/* Interrupt (de)registration routines */ ++extern int sdstd_register_irq(sdioh_info_t *sd, uint irq); ++extern void sdstd_free_irq(uint irq, sdioh_info_t *sd); ++ ++/* OS-specific interrupt wrappers (atomic interrupt enable/disable) */ ++extern void sdstd_lock(sdioh_info_t *sd); ++extern void sdstd_unlock(sdioh_info_t *sd); ++extern void sdstd_waitlockfree(sdioh_info_t *sd); ++ ++/* OS-specific wait-for-interrupt-or-status */ ++extern int sdstd_waitbits(sdioh_info_t *sd, uint16 norm, uint16 err, bool yield, uint16 *bits); ++ ++/* used by bcmsdstd_linux [implemented in sdstd] */ ++extern void sdstd_3_enable_retuning_int(sdioh_info_t *sd); ++extern void sdstd_3_disable_retuning_int(sdioh_info_t *sd); ++extern bool sdstd_3_is_retuning_int_set(sdioh_info_t *sd); ++extern void sdstd_3_check_and_do_tuning(sdioh_info_t *sd, int tuning_param); ++extern bool sdstd_3_check_and_set_retuning(sdioh_info_t *sd); ++extern int sdstd_3_get_tune_state(sdioh_info_t *sd); ++extern int sdstd_3_get_data_state(sdioh_info_t *sd); ++extern void sdstd_3_set_tune_state(sdioh_info_t *sd, int state); ++extern void sdstd_3_set_data_state(sdioh_info_t *sd, int state); ++extern uint8 sdstd_3_get_tuning_exp(sdioh_info_t *sd); ++extern uint32 sdstd_3_get_uhsi_clkmode(sdioh_info_t *sd); ++extern int sdstd_3_clk_tuning(sdioh_info_t *sd, uint32 sd3ClkMode); ++ ++/* used by sdstd [implemented in bcmsdstd_linux/ndis] */ ++extern void sdstd_3_start_tuning(sdioh_info_t *sd); ++extern void sdstd_3_osinit_tuning(sdioh_info_t *sd); ++extern void sdstd_3_osclean_tuning(sdioh_info_t *sd); ++ ++#endif /* _BCM_SD_STD_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcmspi.h b/drivers/net/wireless/ap6210/include/bcmspi.h +new file mode 100644 +index 0000000..e226cb1 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmspi.h +@@ -0,0 +1,40 @@ ++/* ++ * Broadcom SPI Low-Level Hardware Driver API ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmspi.h 241182 2011-02-17 21:50:03Z $ ++ */ ++#ifndef _BCM_SPI_H ++#define _BCM_SPI_H ++ ++extern void spi_devintr_off(sdioh_info_t *sd); ++extern void spi_devintr_on(sdioh_info_t *sd); ++extern bool spi_start_clock(sdioh_info_t *sd, uint16 new_sd_divisor); ++extern bool spi_controller_highspeed_mode(sdioh_info_t *sd, bool hsmode); ++extern bool spi_check_client_intr(sdioh_info_t *sd, int *is_dev_intr); ++extern bool spi_hw_attach(sdioh_info_t *sd); ++extern bool spi_hw_detach(sdioh_info_t *sd); ++extern void spi_sendrecv(sdioh_info_t *sd, uint8 *msg_out, uint8 *msg_in, int msglen); ++extern void spi_spinbits(sdioh_info_t *sd); ++extern void spi_waitbits(sdioh_info_t *sd, bool yield); ++ ++#endif /* _BCM_SPI_H */ +diff --git a/drivers/net/wireless/ap6210/include/bcmutils.h b/drivers/net/wireless/ap6210/include/bcmutils.h +new file mode 100644 +index 0000000..71af3dc +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmutils.h +@@ -0,0 +1,808 @@ ++/* ++ * Misc useful os-independent macros and functions. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmutils.h 354837 2012-09-04 06:58:44Z $ ++ */ ++ ++#ifndef _bcmutils_h_ ++#define _bcmutils_h_ ++ ++#define bcm_strcpy_s(dst, noOfElements, src) strcpy((dst), (src)) ++#define bcm_strncpy_s(dst, noOfElements, src, count) strncpy((dst), (src), (count)) ++#define bcm_strcat_s(dst, noOfElements, src) strcat((dst), (src)) ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef PKTQ_LOG ++#include ++#endif ++ ++/* ctype replacement */ ++#define _BCM_U 0x01 /* upper */ ++#define _BCM_L 0x02 /* lower */ ++#define _BCM_D 0x04 /* digit */ ++#define _BCM_C 0x08 /* cntrl */ ++#define _BCM_P 0x10 /* punct */ ++#define _BCM_S 0x20 /* white space (space/lf/tab) */ ++#define _BCM_X 0x40 /* hex digit */ ++#define _BCM_SP 0x80 /* hard space (0x20) */ ++ ++extern const unsigned char bcm_ctype[]; ++#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)]) ++ ++#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0) ++#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0) ++#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0) ++#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0) ++#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0) ++#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0) ++#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0) ++#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0) ++#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0) ++#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0) ++#define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0) ++#define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c)) ++#define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c)) ++ ++/* Buffer structure for collecting string-formatted data ++* using bcm_bprintf() API. ++* Use bcm_binit() to initialize before use ++*/ ++ ++struct bcmstrbuf { ++ char *buf; /* pointer to current position in origbuf */ ++ unsigned int size; /* current (residual) size in bytes */ ++ char *origbuf; /* unmodified pointer to orignal buffer */ ++ unsigned int origsize; /* unmodified orignal buffer size in bytes */ ++}; ++ ++/* ** driver-only section ** */ ++#ifdef BCMDRIVER ++#include ++ ++#define GPIO_PIN_NOTDEFINED 0x20 /* Pin not defined */ ++ ++/* ++ * Spin at most 'us' microseconds while 'exp' is true. ++ * Caller should explicitly test 'exp' when this completes ++ * and take appropriate error action if 'exp' is still true. ++ */ ++#define SPINWAIT(exp, us) { \ ++ uint countdown = (us) + 9; \ ++ while ((exp) && (countdown >= 10)) {\ ++ OSL_DELAY(10); \ ++ countdown -= 10; \ ++ } \ ++} ++ ++/* osl multi-precedence packet queue */ ++#ifndef PKTQ_LEN_DEFAULT ++#define PKTQ_LEN_DEFAULT 128 /* Max 128 packets */ ++#endif ++#ifndef PKTQ_MAX_PREC ++#define PKTQ_MAX_PREC 16 /* Maximum precedence levels */ ++#endif ++ ++typedef struct pktq_prec { ++ void *head; /* first packet to dequeue */ ++ void *tail; /* last packet to dequeue */ ++ uint16 len; /* number of queued packets */ ++ uint16 max; /* maximum number of queued packets */ ++} pktq_prec_t; ++ ++#ifdef PKTQ_LOG ++typedef struct { ++ uint32 requested; /* packets requested to be stored */ ++ uint32 stored; /* packets stored */ ++ uint32 saved; /* packets saved, ++ because a lowest priority queue has given away one packet ++ */ ++ uint32 selfsaved; /* packets saved, ++ because an older packet from the same queue has been dropped ++ */ ++ uint32 full_dropped; /* packets dropped, ++ because pktq is full with higher precedence packets ++ */ ++ uint32 dropped; /* packets dropped because pktq per that precedence is full */ ++ uint32 sacrificed; /* packets dropped, ++ in order to save one from a queue of a highest priority ++ */ ++ uint32 busy; /* packets droped because of hardware/transmission error */ ++ uint32 retry; /* packets re-sent because they were not received */ ++ uint32 ps_retry; /* packets retried again prior to moving power save mode */ ++ uint32 retry_drop; /* packets finally dropped after retry limit */ ++ uint32 max_avail; /* the high-water mark of the queue capacity for packets - ++ goes to zero as queue fills ++ */ ++ uint32 max_used; /* the high-water mark of the queue utilisation for packets - ++ increases with use ('inverse' of max_avail) ++ */ ++ uint32 queue_capacity; /* the maximum capacity of the queue */ ++} pktq_counters_t; ++#endif /* PKTQ_LOG */ ++ ++ ++#define PKTQ_COMMON \ ++ uint16 num_prec; /* number of precedences in use */ \ ++ uint16 hi_prec; /* rapid dequeue hint (>= highest non-empty prec) */ \ ++ uint16 max; /* total max packets */ \ ++ uint16 len; /* total number of packets */ ++ ++/* multi-priority pkt queue */ ++struct pktq { ++ PKTQ_COMMON ++ /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */ ++ struct pktq_prec q[PKTQ_MAX_PREC]; ++#ifdef PKTQ_LOG ++ pktq_counters_t _prec_cnt[PKTQ_MAX_PREC]; /* Counters per queue */ ++#endif ++}; ++ ++/* simple, non-priority pkt queue */ ++struct spktq { ++ PKTQ_COMMON ++ /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */ ++ struct pktq_prec q[1]; ++}; ++ ++#define PKTQ_PREC_ITER(pq, prec) for (prec = (pq)->num_prec - 1; prec >= 0; prec--) ++ ++/* fn(pkt, arg). return true if pkt belongs to if */ ++typedef bool (*ifpkt_cb_t)(void*, int); ++ ++#ifdef BCMPKTPOOL ++#define POOL_ENAB(pool) ((pool) && (pool)->inited) ++#define SHARED_POOL (pktpool_shared) ++#else /* BCMPKTPOOL */ ++#define POOL_ENAB(bus) 0 ++#define SHARED_POOL ((struct pktpool *)NULL) ++#endif /* BCMPKTPOOL */ ++ ++#ifndef PKTPOOL_LEN_MAX ++#define PKTPOOL_LEN_MAX 40 ++#endif /* PKTPOOL_LEN_MAX */ ++#define PKTPOOL_CB_MAX 3 ++ ++struct pktpool; ++typedef void (*pktpool_cb_t)(struct pktpool *pool, void *arg); ++typedef struct { ++ pktpool_cb_t cb; ++ void *arg; ++} pktpool_cbinfo_t; ++ ++#ifdef BCMDBG_POOL ++/* pkt pool debug states */ ++#define POOL_IDLE 0 ++#define POOL_RXFILL 1 ++#define POOL_RXDH 2 ++#define POOL_RXD11 3 ++#define POOL_TXDH 4 ++#define POOL_TXD11 5 ++#define POOL_AMPDU 6 ++#define POOL_TXENQ 7 ++ ++typedef struct { ++ void *p; ++ uint32 cycles; ++ uint32 dur; ++} pktpool_dbg_t; ++ ++typedef struct { ++ uint8 txdh; /* tx to host */ ++ uint8 txd11; /* tx to d11 */ ++ uint8 enq; /* waiting in q */ ++ uint8 rxdh; /* rx from host */ ++ uint8 rxd11; /* rx from d11 */ ++ uint8 rxfill; /* dma_rxfill */ ++ uint8 idle; /* avail in pool */ ++} pktpool_stats_t; ++#endif /* BCMDBG_POOL */ ++ ++typedef struct pktpool { ++ bool inited; ++ uint16 r; ++ uint16 w; ++ uint16 len; ++ uint16 maxlen; ++ uint16 plen; ++ bool istx; ++ bool empty; ++ uint8 cbtoggle; ++ uint8 cbcnt; ++ uint8 ecbcnt; ++ bool emptycb_disable; ++ pktpool_cbinfo_t *availcb_excl; ++ pktpool_cbinfo_t cbs[PKTPOOL_CB_MAX]; ++ pktpool_cbinfo_t ecbs[PKTPOOL_CB_MAX]; ++ void *q[PKTPOOL_LEN_MAX + 1]; ++ ++#ifdef BCMDBG_POOL ++ uint8 dbg_cbcnt; ++ pktpool_cbinfo_t dbg_cbs[PKTPOOL_CB_MAX]; ++ uint16 dbg_qlen; ++ pktpool_dbg_t dbg_q[PKTPOOL_LEN_MAX + 1]; ++#endif ++} pktpool_t; ++ ++extern pktpool_t *pktpool_shared; ++ ++extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx); ++extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp); ++extern int pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal); ++extern void* pktpool_get(pktpool_t *pktp); ++extern void pktpool_free(pktpool_t *pktp, void *p); ++extern int pktpool_add(pktpool_t *pktp, void *p); ++extern uint16 pktpool_avail(pktpool_t *pktp); ++extern int pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp); ++extern int pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb); ++extern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg); ++extern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg); ++extern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen); ++extern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen); ++extern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable); ++extern bool pktpool_emptycb_disabled(pktpool_t *pktp); ++ ++#define POOLPTR(pp) ((pktpool_t *)(pp)) ++#define pktpool_len(pp) (POOLPTR(pp)->len - 1) ++#define pktpool_plen(pp) (POOLPTR(pp)->plen) ++#define pktpool_maxlen(pp) (POOLPTR(pp)->maxlen) ++ ++#ifdef BCMDBG_POOL ++extern int pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg); ++extern int pktpool_start_trigger(pktpool_t *pktp, void *p); ++extern int pktpool_dbg_dump(pktpool_t *pktp); ++extern int pktpool_dbg_notify(pktpool_t *pktp); ++extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats); ++#endif /* BCMDBG_POOL */ ++ ++/* forward definition of ether_addr structure used by some function prototypes */ ++ ++struct ether_addr; ++ ++extern int ether_isbcast(const void *ea); ++extern int ether_isnulladdr(const void *ea); ++ ++/* operations on a specific precedence in packet queue */ ++ ++#define pktq_psetmax(pq, prec, _max) ((pq)->q[prec].max = (_max)) ++#define pktq_pmax(pq, prec) ((pq)->q[prec].max) ++#define pktq_plen(pq, prec) ((pq)->q[prec].len) ++#define pktq_pavail(pq, prec) ((pq)->q[prec].max - (pq)->q[prec].len) ++#define pktq_pfull(pq, prec) ((pq)->q[prec].len >= (pq)->q[prec].max) ++#define pktq_pempty(pq, prec) ((pq)->q[prec].len == 0) ++ ++#define pktq_ppeek(pq, prec) ((pq)->q[prec].head) ++#define pktq_ppeek_tail(pq, prec) ((pq)->q[prec].tail) ++ ++extern void *pktq_penq(struct pktq *pq, int prec, void *p); ++extern void *pktq_penq_head(struct pktq *pq, int prec, void *p); ++extern void *pktq_pdeq(struct pktq *pq, int prec); ++extern void *pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p); ++extern void *pktq_pdeq_tail(struct pktq *pq, int prec); ++/* Empty the queue at particular precedence level */ ++extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir, ++ ifpkt_cb_t fn, int arg); ++/* Remove a specified packet from its queue */ ++extern bool pktq_pdel(struct pktq *pq, void *p, int prec); ++ ++/* operations on a set of precedences in packet queue */ ++ ++extern int pktq_mlen(struct pktq *pq, uint prec_bmp); ++extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out); ++extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out); ++ ++/* operations on packet queue as a whole */ ++ ++#define pktq_len(pq) ((int)(pq)->len) ++#define pktq_max(pq) ((int)(pq)->max) ++#define pktq_avail(pq) ((int)((pq)->max - (pq)->len)) ++#define pktq_full(pq) ((pq)->len >= (pq)->max) ++#define pktq_empty(pq) ((pq)->len == 0) ++ ++/* operations for single precedence queues */ ++#define pktenq(pq, p) pktq_penq(((struct pktq *)(void *)pq), 0, (p)) ++#define pktenq_head(pq, p) pktq_penq_head(((struct pktq *)(void *)pq), 0, (p)) ++#define pktdeq(pq) pktq_pdeq(((struct pktq *)(void *)pq), 0) ++#define pktdeq_tail(pq) pktq_pdeq_tail(((struct pktq *)(void *)pq), 0) ++#define pktqinit(pq, len) pktq_init(((struct pktq *)(void *)pq), 1, len) ++ ++extern void pktq_init(struct pktq *pq, int num_prec, int max_len); ++extern void pktq_set_max_plen(struct pktq *pq, int prec, int max_len); ++ ++/* prec_out may be NULL if caller is not interested in return value */ ++extern void *pktq_deq(struct pktq *pq, int *prec_out); ++extern void *pktq_deq_tail(struct pktq *pq, int *prec_out); ++extern void *pktq_peek(struct pktq *pq, int *prec_out); ++extern void *pktq_peek_tail(struct pktq *pq, int *prec_out); ++extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg); ++ ++/* externs */ ++/* packet */ ++extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf); ++extern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf); ++extern uint pkttotlen(osl_t *osh, void *p); ++extern void *pktlast(osl_t *osh, void *p); ++extern uint pktsegcnt(osl_t *osh, void *p); ++extern uint pktsegcnt_war(osl_t *osh, void *p); ++extern uint8 *pktoffset(osl_t *osh, void *p, uint offset); ++ ++/* Get priority from a packet and pass it back in scb (or equiv) */ ++#define PKTPRIO_VDSCP 0x100 /* DSCP prio found after VLAN tag */ ++#define PKTPRIO_VLAN 0x200 /* VLAN prio found */ ++#define PKTPRIO_UPD 0x400 /* DSCP used to update VLAN prio */ ++#define PKTPRIO_DSCP 0x800 /* DSCP prio found */ ++ ++extern uint pktsetprio(void *pkt, bool update_vtag); ++ ++/* string */ ++extern int bcm_atoi(const char *s); ++extern ulong bcm_strtoul(const char *cp, char **endp, uint base); ++extern char *bcmstrstr(const char *haystack, const char *needle); ++extern char *bcmstrcat(char *dest, const char *src); ++extern char *bcmstrncat(char *dest, const char *src, uint size); ++extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen); ++char* bcmstrtok(char **string, const char *delimiters, char *tokdelim); ++int bcmstricmp(const char *s1, const char *s2); ++int bcmstrnicmp(const char* s1, const char* s2, int cnt); ++ ++ ++/* ethernet address */ ++extern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf); ++extern int bcm_ether_atoe(const char *p, struct ether_addr *ea); ++ ++/* ip address */ ++struct ipv4_addr; ++extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf); ++ ++/* delay */ ++extern void bcm_mdelay(uint ms); ++/* variable access */ ++#define NVRAM_RECLAIM_CHECK(name) ++ ++extern char *getvar(char *vars, const char *name); ++extern int getintvar(char *vars, const char *name); ++extern int getintvararray(char *vars, const char *name, int index); ++extern int getintvararraysize(char *vars, const char *name); ++extern uint getgpiopin(char *vars, char *pin_name, uint def_pin); ++#define bcm_perf_enable() ++#define bcmstats(fmt) ++#define bcmlog(fmt, a1, a2) ++#define bcmdumplog(buf, size) *buf = '\0' ++#define bcmdumplogent(buf, idx) -1 ++ ++#define bcmtslog(tstamp, fmt, a1, a2) ++#define bcmprinttslogs() ++#define bcmprinttstamp(us) ++#define bcmdumptslog(buf, size) ++ ++extern char *bcm_nvram_vars(uint *length); ++extern int bcm_nvram_cache(void *sih); ++ ++/* Support for sharing code across in-driver iovar implementations. ++ * The intent is that a driver use this structure to map iovar names ++ * to its (private) iovar identifiers, and the lookup function to ++ * find the entry. Macros are provided to map ids and get/set actions ++ * into a single number space for a switch statement. ++ */ ++ ++/* iovar structure */ ++typedef struct bcm_iovar { ++ const char *name; /* name for lookup and display */ ++ uint16 varid; /* id for switch */ ++ uint16 flags; /* driver-specific flag bits */ ++ uint16 type; /* base type of argument */ ++ uint16 minlen; /* min length for buffer vars */ ++} bcm_iovar_t; ++ ++/* varid definitions are per-driver, may use these get/set bits */ ++ ++/* IOVar action bits for id mapping */ ++#define IOV_GET 0 /* Get an iovar */ ++#define IOV_SET 1 /* Set an iovar */ ++ ++/* Varid to actionid mapping */ ++#define IOV_GVAL(id) ((id) * 2) ++#define IOV_SVAL(id) ((id) * 2 + IOV_SET) ++#define IOV_ISSET(actionid) ((actionid & IOV_SET) == IOV_SET) ++#define IOV_ID(actionid) (actionid >> 1) ++ ++/* flags are per-driver based on driver attributes */ ++ ++extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name); ++extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set); ++#if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \ ++ defined(WLMSG_PRPKT) || defined(WLMSG_WSEC) ++extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); ++#endif ++#endif /* BCMDRIVER */ ++ ++/* Base type definitions */ ++#define IOVT_VOID 0 /* no value (implictly set only) */ ++#define IOVT_BOOL 1 /* any value ok (zero/nonzero) */ ++#define IOVT_INT8 2 /* integer values are range-checked */ ++#define IOVT_UINT8 3 /* unsigned int 8 bits */ ++#define IOVT_INT16 4 /* int 16 bits */ ++#define IOVT_UINT16 5 /* unsigned int 16 bits */ ++#define IOVT_INT32 6 /* int 32 bits */ ++#define IOVT_UINT32 7 /* unsigned int 32 bits */ ++#define IOVT_BUFFER 8 /* buffer is size-checked as per minlen */ ++#define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER) ++ ++/* Initializer for IOV type strings */ ++#define BCM_IOV_TYPE_INIT { \ ++ "void", \ ++ "bool", \ ++ "int8", \ ++ "uint8", \ ++ "int16", \ ++ "uint16", \ ++ "int32", \ ++ "uint32", \ ++ "buffer", \ ++ "" } ++ ++#define BCM_IOVT_IS_INT(type) (\ ++ (type == IOVT_BOOL) || \ ++ (type == IOVT_INT8) || \ ++ (type == IOVT_UINT8) || \ ++ (type == IOVT_INT16) || \ ++ (type == IOVT_UINT16) || \ ++ (type == IOVT_INT32) || \ ++ (type == IOVT_UINT32)) ++ ++/* ** driver/apps-shared section ** */ ++ ++#define BCME_STRLEN 64 /* Max string length for BCM errors */ ++#define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST)) ++ ++ ++/* ++ * error codes could be added but the defined ones shouldn't be changed/deleted ++ * these error codes are exposed to the user code ++ * when ever a new error code is added to this list ++ * please update errorstring table with the related error string and ++ * update osl files with os specific errorcode map ++*/ ++ ++#define BCME_OK 0 /* Success */ ++#define BCME_ERROR -1 /* Error generic */ ++#define BCME_BADARG -2 /* Bad Argument */ ++#define BCME_BADOPTION -3 /* Bad option */ ++#define BCME_NOTUP -4 /* Not up */ ++#define BCME_NOTDOWN -5 /* Not down */ ++#define BCME_NOTAP -6 /* Not AP */ ++#define BCME_NOTSTA -7 /* Not STA */ ++#define BCME_BADKEYIDX -8 /* BAD Key Index */ ++#define BCME_RADIOOFF -9 /* Radio Off */ ++#define BCME_NOTBANDLOCKED -10 /* Not band locked */ ++#define BCME_NOCLK -11 /* No Clock */ ++#define BCME_BADRATESET -12 /* BAD Rate valueset */ ++#define BCME_BADBAND -13 /* BAD Band */ ++#define BCME_BUFTOOSHORT -14 /* Buffer too short */ ++#define BCME_BUFTOOLONG -15 /* Buffer too long */ ++#define BCME_BUSY -16 /* Busy */ ++#define BCME_NOTASSOCIATED -17 /* Not Associated */ ++#define BCME_BADSSIDLEN -18 /* Bad SSID len */ ++#define BCME_OUTOFRANGECHAN -19 /* Out of Range Channel */ ++#define BCME_BADCHAN -20 /* Bad Channel */ ++#define BCME_BADADDR -21 /* Bad Address */ ++#define BCME_NORESOURCE -22 /* Not Enough Resources */ ++#define BCME_UNSUPPORTED -23 /* Unsupported */ ++#define BCME_BADLEN -24 /* Bad length */ ++#define BCME_NOTREADY -25 /* Not Ready */ ++#define BCME_EPERM -26 /* Not Permitted */ ++#define BCME_NOMEM -27 /* No Memory */ ++#define BCME_ASSOCIATED -28 /* Associated */ ++#define BCME_RANGE -29 /* Not In Range */ ++#define BCME_NOTFOUND -30 /* Not Found */ ++#define BCME_WME_NOT_ENABLED -31 /* WME Not Enabled */ ++#define BCME_TSPEC_NOTFOUND -32 /* TSPEC Not Found */ ++#define BCME_ACM_NOTSUPPORTED -33 /* ACM Not Supported */ ++#define BCME_NOT_WME_ASSOCIATION -34 /* Not WME Association */ ++#define BCME_SDIO_ERROR -35 /* SDIO Bus Error */ ++#define BCME_DONGLE_DOWN -36 /* Dongle Not Accessible */ ++#define BCME_VERSION -37 /* Incorrect version */ ++#define BCME_TXFAIL -38 /* TX failure */ ++#define BCME_RXFAIL -39 /* RX failure */ ++#define BCME_NODEVICE -40 /* Device not present */ ++#define BCME_NMODE_DISABLED -41 /* NMODE disabled */ ++#define BCME_NONRESIDENT -42 /* access to nonresident overlay */ ++#define BCME_LAST BCME_NONRESIDENT ++ ++/* These are collection of BCME Error strings */ ++#define BCMERRSTRINGTABLE { \ ++ "OK", \ ++ "Undefined error", \ ++ "Bad Argument", \ ++ "Bad Option", \ ++ "Not up", \ ++ "Not down", \ ++ "Not AP", \ ++ "Not STA", \ ++ "Bad Key Index", \ ++ "Radio Off", \ ++ "Not band locked", \ ++ "No clock", \ ++ "Bad Rate valueset", \ ++ "Bad Band", \ ++ "Buffer too short", \ ++ "Buffer too long", \ ++ "Busy", \ ++ "Not Associated", \ ++ "Bad SSID len", \ ++ "Out of Range Channel", \ ++ "Bad Channel", \ ++ "Bad Address", \ ++ "Not Enough Resources", \ ++ "Unsupported", \ ++ "Bad length", \ ++ "Not Ready", \ ++ "Not Permitted", \ ++ "No Memory", \ ++ "Associated", \ ++ "Not In Range", \ ++ "Not Found", \ ++ "WME Not Enabled", \ ++ "TSPEC Not Found", \ ++ "ACM Not Supported", \ ++ "Not WME Association", \ ++ "SDIO Bus Error", \ ++ "Dongle Not Accessible", \ ++ "Incorrect version", \ ++ "TX Failure", \ ++ "RX Failure", \ ++ "Device Not Present", \ ++ "NMODE Disabled", \ ++ "Nonresident overlay access", \ ++} ++ ++#ifndef ABS ++#define ABS(a) (((a) < 0) ? -(a) : (a)) ++#endif /* ABS */ ++ ++#ifndef MIN ++#define MIN(a, b) (((a) < (b)) ? (a) : (b)) ++#endif /* MIN */ ++ ++#ifndef MAX ++#define MAX(a, b) (((a) > (b)) ? (a) : (b)) ++#endif /* MAX */ ++ ++#define CEIL(x, y) (((x) + ((y) - 1)) / (y)) ++#define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) ++#define ISALIGNED(a, x) (((uintptr)(a) & ((x) - 1)) == 0) ++#define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \ ++ & ~((boundary) - 1)) ++#define ALIGN_SIZE(size, boundary) (((size) + (boundary) - 1) \ ++ & ~((boundary) - 1)) ++#define ISPOWEROF2(x) ((((x) - 1) & (x)) == 0) ++#define VALID_MASK(mask) !((mask) & ((mask) + 1)) ++ ++#ifndef OFFSETOF ++#ifdef __ARMCC_VERSION ++/* ++ * The ARM RVCT compiler complains when using OFFSETOF where a constant ++ * expression is expected, such as an initializer for a static object. ++ * offsetof from the runtime library doesn't have that problem. ++ */ ++#include ++#define OFFSETOF(type, member) offsetof(type, member) ++#else ++#define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member) ++#endif /* __ARMCC_VERSION */ ++#endif /* OFFSETOF */ ++ ++#ifndef ARRAYSIZE ++#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0])) ++#endif ++ ++/* Reference a function; used to prevent a static function from being optimized out */ ++extern void *_bcmutils_dummy_fn; ++#define REFERENCE_FUNCTION(f) (_bcmutils_dummy_fn = (void *)(f)) ++ ++/* bit map related macros */ ++#ifndef setbit ++#ifndef NBBY /* the BSD family defines NBBY */ ++#define NBBY 8 /* 8 bits per byte */ ++#endif /* #ifndef NBBY */ ++#define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY)) ++#define clrbit(a, i) (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY))) ++#define isset(a, i) (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) ++#define isclr(a, i) ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0) ++#endif /* setbit */ ++ ++#define NBITS(type) (sizeof(type) * 8) ++#define NBITVAL(nbits) (1 << (nbits)) ++#define MAXBITVAL(nbits) ((1 << (nbits)) - 1) ++#define NBITMASK(nbits) MAXBITVAL(nbits) ++#define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8) ++ ++/* basic mux operation - can be optimized on several architectures */ ++#define MUX(pred, true, false) ((pred) ? (true) : (false)) ++ ++/* modulo inc/dec - assumes x E [0, bound - 1] */ ++#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1) ++#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1) ++ ++/* modulo inc/dec, bound = 2^k */ ++#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1)) ++#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1)) ++ ++/* modulo add/sub - assumes x, y E [0, bound - 1] */ ++#define MODADD(x, y, bound) \ ++ MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y)) ++#define MODSUB(x, y, bound) \ ++ MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y)) ++ ++/* module add/sub, bound = 2^k */ ++#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1)) ++#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1)) ++ ++/* crc defines */ ++#define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */ ++#define CRC8_GOOD_VALUE 0x9f /* Good final CRC8 checksum value */ ++#define CRC16_INIT_VALUE 0xffff /* Initial CRC16 checksum value */ ++#define CRC16_GOOD_VALUE 0xf0b8 /* Good final CRC16 checksum value */ ++#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */ ++#define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum value */ ++ ++/* use for direct output of MAC address in printf etc */ ++#define MACF "%02x:%02x:%02x:%02x:%02x:%02x" ++#define ETHERP_TO_MACF(ea) ((struct ether_addr *) (ea))->octet[0], \ ++ ((struct ether_addr *) (ea))->octet[1], \ ++ ((struct ether_addr *) (ea))->octet[2], \ ++ ((struct ether_addr *) (ea))->octet[3], \ ++ ((struct ether_addr *) (ea))->octet[4], \ ++ ((struct ether_addr *) (ea))->octet[5] ++ ++#define ETHER_TO_MACF(ea) (ea).octet[0], \ ++ (ea).octet[1], \ ++ (ea).octet[2], \ ++ (ea).octet[3], \ ++ (ea).octet[4], \ ++ (ea).octet[5] ++#if !defined(SIMPLE_MAC_PRINT) ++#define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x" ++#define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] ++#else ++#define MACDBG "%02x:%02x:%02x" ++#define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5] ++#endif /* SIMPLE_MAC_PRINT */ ++ ++/* bcm_format_flags() bit description structure */ ++typedef struct bcm_bit_desc { ++ uint32 bit; ++ const char* name; ++} bcm_bit_desc_t; ++ ++/* tag_ID/length/value_buffer tuple */ ++typedef struct bcm_tlv { ++ uint8 id; ++ uint8 len; ++ uint8 data[1]; ++} bcm_tlv_t; ++ ++/* Check that bcm_tlv_t fits into the given buflen */ ++#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len)) ++ ++/* buffer length for ethernet address from bcm_ether_ntoa() */ ++#define ETHER_ADDR_STR_LEN 18 /* 18-bytes of Ethernet address buffer length */ ++ ++/* crypto utility function */ ++/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */ ++static INLINE void ++xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst) ++{ ++ if ( ++#ifdef __i386__ ++ 1 || ++#endif ++ (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) { ++ /* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */ ++ /* x86 supports unaligned. This version runs 6x-9x faster on x86. */ ++ ((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0]; ++ ((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1]; ++ ((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2]; ++ ((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3]; ++ } else { ++ /* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */ ++ int k; ++ for (k = 0; k < 16; k++) ++ dst[k] = src1[k] ^ src2[k]; ++ } ++} ++ ++/* externs */ ++/* crc */ ++extern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc); ++extern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc); ++extern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc); ++ ++/* format/print */ ++#if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \ ++ defined(WLMSG_ASSOC) ++extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len); ++#endif ++ ++#if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \ ++ defined(WLMSG_ASSOC) || defined(WLMEDIA_PEAKRATE) ++extern int bcm_format_hex(char *str, const void *bytes, int len); ++#endif ++ ++extern const char *bcm_crypto_algo_name(uint algo); ++extern char *bcm_chipname(uint chipid, char *buf, uint len); ++extern char *bcm_brev_str(uint32 brev, char *buf); ++extern void printbig(char *buf); ++extern void prhex(const char *msg, uchar *buf, uint len); ++ ++/* IE parsing */ ++extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen); ++extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key); ++extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key); ++ ++/* bcmerror */ ++extern const char *bcmerrorstr(int bcmerror); ++extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key); ++ ++/* multi-bool data type: set of bools, mbool is true if any is set */ ++typedef uint32 mbool; ++#define mboolset(mb, bit) ((mb) |= (bit)) /* set one bool */ ++#define mboolclr(mb, bit) ((mb) &= ~(bit)) /* clear one bool */ ++#define mboolisset(mb, bit) (((mb) & (bit)) != 0) /* TRUE if one bool is set */ ++#define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val))) ++ ++/* generic datastruct to help dump routines */ ++struct fielddesc { ++ const char *nameandfmt; ++ uint32 offset; ++ uint32 len; ++}; ++ ++extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size); ++extern void bcm_bprhex(struct bcmstrbuf *b, const char *msg, bool newline, uint8 *buf, int len); ++ ++extern void bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount); ++extern int bcm_cmp_bytes(const uchar *arg1, const uchar *arg2, uint8 nbytes); ++extern void bcm_print_bytes(const char *name, const uchar *cdata, int len); ++ ++typedef uint32 (*bcmutl_rdreg_rtn)(void *arg0, uint arg1, uint32 offset); ++extern uint bcmdumpfields(bcmutl_rdreg_rtn func_ptr, void *arg0, uint arg1, struct fielddesc *str, ++ char *buf, uint32 bufsize); ++extern uint bcm_bitcount(uint8 *bitmap, uint bytelength); ++ ++extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...); ++ ++/* power conversion */ ++extern uint16 bcm_qdbm_to_mw(uint8 qdbm); ++extern uint8 bcm_mw_to_qdbm(uint16 mw); ++extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len); ++ ++unsigned int process_nvram_vars(char *varbuf, unsigned int len); ++ ++#ifdef __cplusplus ++ } ++#endif ++ ++#endif /* _bcmutils_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmwifi_channels.h b/drivers/net/wireless/ap6210/include/bcmwifi_channels.h +new file mode 100644 +index 0000000..bc57aca +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmwifi_channels.h +@@ -0,0 +1,490 @@ ++/* ++ * Misc utility routines for WL and Apps ++ * This header file housing the define and function prototype use by ++ * both the wl driver, tools & Apps. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmwifi_channels.h 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#ifndef _bcmwifi_channels_h_ ++#define _bcmwifi_channels_h_ ++ ++ ++/* A chanspec holds the channel number, band, bandwidth and control sideband */ ++typedef uint16 chanspec_t; ++ ++/* channel defines */ ++#define CH_UPPER_SB 0x01 ++#define CH_LOWER_SB 0x02 ++#define CH_EWA_VALID 0x04 ++#define CH_80MHZ_APART 16 ++#define CH_40MHZ_APART 8 ++#define CH_20MHZ_APART 4 ++#define CH_10MHZ_APART 2 ++#define CH_5MHZ_APART 1 /* 2G band channels are 5 Mhz apart */ ++#define CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ ++#define MAXCHANNEL 224 /* max # supported channels. The max channel no is 216, ++ * this is that + 1 rounded up to a multiple of NBBY (8). ++ * DO NOT MAKE it > 255: channels are uint8's all over ++ */ ++#define CHSPEC_CTLOVLP(sp1, sp2, sep) ABS(wf_chspec_ctlchan(sp1) - wf_chspec_ctlchan(sp2)) < (sep) ++ ++/* All builds use the new 11ac ratespec/chanspec */ ++#undef D11AC_IOTYPES ++#define D11AC_IOTYPES ++ ++#ifndef D11AC_IOTYPES ++ ++#define WL_CHANSPEC_CHAN_MASK 0x00ff ++#define WL_CHANSPEC_CHAN_SHIFT 0 ++ ++#define WL_CHANSPEC_CTL_SB_MASK 0x0300 ++#define WL_CHANSPEC_CTL_SB_SHIFT 8 ++#define WL_CHANSPEC_CTL_SB_LOWER 0x0100 ++#define WL_CHANSPEC_CTL_SB_UPPER 0x0200 ++#define WL_CHANSPEC_CTL_SB_NONE 0x0300 ++ ++#define WL_CHANSPEC_BW_MASK 0x0C00 ++#define WL_CHANSPEC_BW_SHIFT 10 ++#define WL_CHANSPEC_BW_10 0x0400 ++#define WL_CHANSPEC_BW_20 0x0800 ++#define WL_CHANSPEC_BW_40 0x0C00 ++ ++#define WL_CHANSPEC_BAND_MASK 0xf000 ++#define WL_CHANSPEC_BAND_SHIFT 12 ++#ifdef WL_CHANSPEC_BAND_5G ++#undef WL_CHANSPEC_BAND_5G ++#endif ++#ifdef WL_CHANSPEC_BAND_2G ++#undef WL_CHANSPEC_BAND_2G ++#endif ++#define WL_CHANSPEC_BAND_5G 0x1000 ++#define WL_CHANSPEC_BAND_2G 0x2000 ++#define INVCHANSPEC 255 ++ ++/* channel defines */ ++#define LOWER_20_SB(channel) (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0) ++#define UPPER_20_SB(channel) (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \ ++ ((channel) + CH_10MHZ_APART) : 0) ++#define CHSPEC_WLCBANDUNIT(chspec) (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX) ++#define CH20MHZ_CHSPEC(channel) (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \ ++ WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \ ++ WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G)) ++#define NEXT_20MHZ_CHAN(channel) (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \ ++ ((channel) + CH_20MHZ_APART) : 0) ++#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ ++ ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \ ++ ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \ ++ WL_CHANSPEC_BAND_5G)) ++#define CHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK)) ++#define CHSPEC_BAND(chspec) ((chspec) & WL_CHANSPEC_BAND_MASK) ++ ++/* chanspec stores radio channel & flags to indicate control channel location, i.e. upper/lower */ ++#define CHSPEC_CTL_SB(chspec) ((chspec) & WL_CHANSPEC_CTL_SB_MASK) ++#define CHSPEC_BW(chspec) ((chspec) & WL_CHANSPEC_BW_MASK) ++ ++#ifdef WL11N_20MHZONLY ++ ++#define CHSPEC_IS10(chspec) 0 ++#define CHSPEC_IS20(chspec) 1 ++#ifndef CHSPEC_IS40 ++#define CHSPEC_IS40(chspec) 0 ++#endif ++ ++#else /* !WL11N_20MHZONLY */ ++ ++#define CHSPEC_IS10(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10) ++#define CHSPEC_IS20(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20) ++#ifndef CHSPEC_IS40 ++#define CHSPEC_IS40(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40) ++#endif ++ ++#endif /* !WL11N_20MHZONLY */ ++ ++#define CHSPEC_IS5G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G) ++#define CHSPEC_IS2G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G) ++#define CHSPEC_SB_NONE(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE) ++#define CHSPEC_SB_UPPER(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER) ++#define CHSPEC_SB_LOWER(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER) ++#define CHSPEC_CTL_CHAN(chspec) ((CHSPEC_SB_LOWER(chspec)) ? \ ++ (LOWER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \ ++ (UPPER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK)))) ++#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G) ++ ++#define CHANSPEC_STR_LEN 8 ++ ++#else /* D11AC_IOTYPES */ ++ ++#define WL_CHANSPEC_CHAN_MASK 0x00ff ++#define WL_CHANSPEC_CHAN_SHIFT 0 ++#define WL_CHANSPEC_CHAN1_MASK 0x000f ++#define WL_CHANSPEC_CHAN1_SHIFT 0 ++#define WL_CHANSPEC_CHAN2_MASK 0x00f0 ++#define WL_CHANSPEC_CHAN2_SHIFT 4 ++ ++#define WL_CHANSPEC_CTL_SB_MASK 0x0700 ++#define WL_CHANSPEC_CTL_SB_SHIFT 8 ++#define WL_CHANSPEC_CTL_SB_LLL 0x0000 ++#define WL_CHANSPEC_CTL_SB_LLU 0x0100 ++#define WL_CHANSPEC_CTL_SB_LUL 0x0200 ++#define WL_CHANSPEC_CTL_SB_LUU 0x0300 ++#define WL_CHANSPEC_CTL_SB_ULL 0x0400 ++#define WL_CHANSPEC_CTL_SB_ULU 0x0500 ++#define WL_CHANSPEC_CTL_SB_UUL 0x0600 ++#define WL_CHANSPEC_CTL_SB_UUU 0x0700 ++#define WL_CHANSPEC_CTL_SB_LL WL_CHANSPEC_CTL_SB_LLL ++#define WL_CHANSPEC_CTL_SB_LU WL_CHANSPEC_CTL_SB_LLU ++#define WL_CHANSPEC_CTL_SB_UL WL_CHANSPEC_CTL_SB_LUL ++#define WL_CHANSPEC_CTL_SB_UU WL_CHANSPEC_CTL_SB_LUU ++#define WL_CHANSPEC_CTL_SB_L WL_CHANSPEC_CTL_SB_LLL ++#define WL_CHANSPEC_CTL_SB_U WL_CHANSPEC_CTL_SB_LLU ++#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL ++#define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU ++ ++#define WL_CHANSPEC_BW_MASK 0x3800 ++#define WL_CHANSPEC_BW_SHIFT 11 ++#define WL_CHANSPEC_BW_5 0x0000 ++#define WL_CHANSPEC_BW_10 0x0800 ++#define WL_CHANSPEC_BW_20 0x1000 ++#define WL_CHANSPEC_BW_40 0x1800 ++#define WL_CHANSPEC_BW_80 0x2000 ++#define WL_CHANSPEC_BW_160 0x2800 ++#define WL_CHANSPEC_BW_8080 0x3000 ++ ++#define WL_CHANSPEC_BAND_MASK 0xc000 ++#define WL_CHANSPEC_BAND_SHIFT 14 ++#define WL_CHANSPEC_BAND_2G 0x0000 ++#define WL_CHANSPEC_BAND_3G 0x4000 ++#define WL_CHANSPEC_BAND_4G 0x8000 ++#define WL_CHANSPEC_BAND_5G 0xc000 ++#define INVCHANSPEC 255 ++ ++/* channel defines */ ++#define LOWER_20_SB(channel) (((channel) > CH_10MHZ_APART) ? \ ++ ((channel) - CH_10MHZ_APART) : 0) ++#define UPPER_20_SB(channel) (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \ ++ ((channel) + CH_10MHZ_APART) : 0) ++#define LOWER_40_SB(channel) ((channel) - CH_20MHZ_APART) ++#define UPPER_40_SB(channel) ((channel) + CH_20MHZ_APART) ++#define CHSPEC_WLCBANDUNIT(chspec) (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX) ++#define CH20MHZ_CHSPEC(channel) (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \ ++ (((channel) <= CH_MAX_2G_CHANNEL) ? \ ++ WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G)) ++#define NEXT_20MHZ_CHAN(channel) (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \ ++ ((channel) + CH_20MHZ_APART) : 0) ++#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ ++ ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \ ++ ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \ ++ WL_CHANSPEC_BAND_5G)) ++#define CH80MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ ++ ((channel) | (ctlsb) | \ ++ WL_CHANSPEC_BW_80 | WL_CHANSPEC_BAND_5G) ++#define CH160MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ ++ ((channel) | (ctlsb) | \ ++ WL_CHANSPEC_BW_160 | WL_CHANSPEC_BAND_5G) ++ ++/* simple MACROs to get different fields of chanspec */ ++#define CHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK)) ++#define CHSPEC_CHAN1(chspec) ((chspec) & WL_CHANSPEC_CHAN1_MASK) ++#define CHSPEC_CHAN2(chspec) ((chspec) & WL_CHANSPEC_CHAN2_MASK) ++#define CHSPEC_BAND(chspec) ((chspec) & WL_CHANSPEC_BAND_MASK) ++#define CHSPEC_CTL_SB(chspec) ((chspec) & WL_CHANSPEC_CTL_SB_MASK) ++#define CHSPEC_BW(chspec) ((chspec) & WL_CHANSPEC_BW_MASK) ++ ++#ifdef WL11N_20MHZONLY ++ ++#define CHSPEC_IS10(chspec) 0 ++#define CHSPEC_IS20(chspec) 1 ++#ifndef CHSPEC_IS40 ++#define CHSPEC_IS40(chspec) 0 ++#endif ++#ifndef CHSPEC_IS80 ++#define CHSPEC_IS80(chspec) 0 ++#endif ++#ifndef CHSPEC_IS160 ++#define CHSPEC_IS160(chspec) 0 ++#endif ++#ifndef CHSPEC_IS8080 ++#define CHSPEC_IS8080(chspec) 0 ++#endif ++ ++#else /* !WL11N_20MHZONLY */ ++ ++#define CHSPEC_IS10(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10) ++#define CHSPEC_IS20(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20) ++#ifndef CHSPEC_IS40 ++#define CHSPEC_IS40(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40) ++#endif ++#ifndef CHSPEC_IS80 ++#define CHSPEC_IS80(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_80) ++#endif ++#ifndef CHSPEC_IS160 ++#define CHSPEC_IS160(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_160) ++#endif ++#ifndef CHSPEC_IS8080 ++#define CHSPEC_IS8080(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_8080) ++#endif ++ ++#endif /* !WL11N_20MHZONLY */ ++ ++#define CHSPEC_IS5G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G) ++#define CHSPEC_IS2G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G) ++#define CHSPEC_SB_UPPER(chspec) \ ++ ((((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER) && \ ++ (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)) ++#define CHSPEC_SB_LOWER(chspec) \ ++ ((((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER) && \ ++ (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)) ++#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G) ++ ++/** ++ * Number of chars needed for wf_chspec_ntoa() destination character buffer. ++ */ ++#define CHANSPEC_STR_LEN 20 ++ ++ ++/* Legacy Chanspec defines ++ * These are the defines for the previous format of the chanspec_t ++ */ ++#define WL_LCHANSPEC_CHAN_MASK 0x00ff ++#define WL_LCHANSPEC_CHAN_SHIFT 0 ++ ++#define WL_LCHANSPEC_CTL_SB_MASK 0x0300 ++#define WL_LCHANSPEC_CTL_SB_SHIFT 8 ++#define WL_LCHANSPEC_CTL_SB_LOWER 0x0100 ++#define WL_LCHANSPEC_CTL_SB_UPPER 0x0200 ++#define WL_LCHANSPEC_CTL_SB_NONE 0x0300 ++ ++#define WL_LCHANSPEC_BW_MASK 0x0C00 ++#define WL_LCHANSPEC_BW_SHIFT 10 ++#define WL_LCHANSPEC_BW_10 0x0400 ++#define WL_LCHANSPEC_BW_20 0x0800 ++#define WL_LCHANSPEC_BW_40 0x0C00 ++ ++#define WL_LCHANSPEC_BAND_MASK 0xf000 ++#define WL_LCHANSPEC_BAND_SHIFT 12 ++#define WL_LCHANSPEC_BAND_5G 0x1000 ++#define WL_LCHANSPEC_BAND_2G 0x2000 ++ ++#define LCHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_LCHANSPEC_CHAN_MASK)) ++#define LCHSPEC_BAND(chspec) ((chspec) & WL_LCHANSPEC_BAND_MASK) ++#define LCHSPEC_CTL_SB(chspec) ((chspec) & WL_LCHANSPEC_CTL_SB_MASK) ++#define LCHSPEC_BW(chspec) ((chspec) & WL_LCHANSPEC_BW_MASK) ++#define LCHSPEC_IS10(chspec) (((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_10) ++#define LCHSPEC_IS20(chspec) (((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_20) ++#define LCHSPEC_IS40(chspec) (((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_40) ++#define LCHSPEC_IS5G(chspec) (((chspec) & WL_LCHANSPEC_BAND_MASK) == WL_LCHANSPEC_BAND_5G) ++#define LCHSPEC_IS2G(chspec) (((chspec) & WL_LCHANSPEC_BAND_MASK) == WL_LCHANSPEC_BAND_2G) ++ ++#define LCHSPEC_CREATE(chan, band, bw, sb) ((uint16)((chan) | (sb) | (bw) | (band))) ++ ++#endif /* D11AC_IOTYPES */ ++ ++/* ++ * WF_CHAN_FACTOR_* constants are used to calculate channel frequency ++ * given a channel number. ++ * chan_freq = chan_factor * 500Mhz + chan_number * 5 ++ */ ++ ++/** ++ * Channel Factor for the starting frequence of 2.4 GHz channels. ++ * The value corresponds to 2407 MHz. ++ */ ++#define WF_CHAN_FACTOR_2_4_G 4814 /* 2.4 GHz band, 2407 MHz */ ++ ++/** ++ * Channel Factor for the starting frequence of 5 GHz channels. ++ * The value corresponds to 5000 MHz. ++ */ ++#define WF_CHAN_FACTOR_5_G 10000 /* 5 GHz band, 5000 MHz */ ++ ++/** ++ * Channel Factor for the starting frequence of 4.9 GHz channels. ++ * The value corresponds to 4000 MHz. ++ */ ++#define WF_CHAN_FACTOR_4_G 8000 /* 4.9 GHz band for Japan */ ++ ++/* defined rate in 500kbps */ ++#define WLC_MAXRATE 108 /* in 500kbps units */ ++#define WLC_RATE_1M 2 /* in 500kbps units */ ++#define WLC_RATE_2M 4 /* in 500kbps units */ ++#define WLC_RATE_5M5 11 /* in 500kbps units */ ++#define WLC_RATE_11M 22 /* in 500kbps units */ ++#define WLC_RATE_6M 12 /* in 500kbps units */ ++#define WLC_RATE_9M 18 /* in 500kbps units */ ++#define WLC_RATE_12M 24 /* in 500kbps units */ ++#define WLC_RATE_18M 36 /* in 500kbps units */ ++#define WLC_RATE_24M 48 /* in 500kbps units */ ++#define WLC_RATE_36M 72 /* in 500kbps units */ ++#define WLC_RATE_48M 96 /* in 500kbps units */ ++#define WLC_RATE_54M 108 /* in 500kbps units */ ++ ++#define WLC_2G_25MHZ_OFFSET 5 /* 2.4GHz band channel offset */ ++ ++/** ++ * Convert chanspec to ascii string ++ * ++ * @param chspec chanspec format ++ * @param buf ascii string of chanspec ++ * ++ * @return pointer to buf with room for at least CHANSPEC_STR_LEN bytes ++ * ++ * @see CHANSPEC_STR_LEN ++ */ ++extern char * wf_chspec_ntoa(chanspec_t chspec, char *buf); ++ ++/** ++ * Convert ascii string to chanspec ++ * ++ * @param a pointer to input string ++ * ++ * @return >= 0 if successful or 0 otherwise ++ */ ++extern chanspec_t wf_chspec_aton(const char *a); ++ ++/** ++ * Verify the chanspec fields are valid. ++ * ++ * Verify the chanspec is using a legal set field values, i.e. that the chanspec ++ * specified a band, bw, ctl_sb and channel and that the combination could be ++ * legal given some set of circumstances. ++ * ++ * @param chanspec input chanspec to verify ++ * ++ * @return TRUE if the chanspec is malformed, FALSE if it looks good. ++ */ ++extern bool wf_chspec_malformed(chanspec_t chanspec); ++ ++/** ++ * Verify the chanspec specifies a valid channel according to 802.11. ++ * ++ * @param chanspec input chanspec to verify ++ * ++ * @return TRUE if the chanspec is a valid 802.11 channel ++ */ ++extern bool wf_chspec_valid(chanspec_t chanspec); ++ ++/** ++ * Return the primary (control) channel. ++ * ++ * This function returns the channel number of the primary 20MHz channel. For ++ * 20MHz channels this is just the channel number. For 40MHz or wider channels ++ * it is the primary 20MHz channel specified by the chanspec. ++ * ++ * @param chspec input chanspec ++ * ++ * @return Returns the channel number of the primary 20MHz channel ++ */ ++extern uint8 wf_chspec_ctlchan(chanspec_t chspec); ++ ++/** ++ * Return the primary (control) chanspec. ++ * ++ * This function returns the chanspec of the primary 20MHz channel. For 20MHz ++ * channels this is just the chanspec. For 40MHz or wider channels it is the ++ * chanspec of the primary 20MHZ channel specified by the chanspec. ++ * ++ * @param chspec input chanspec ++ * ++ * @return Returns the chanspec of the primary 20MHz channel ++ */ ++extern chanspec_t wf_chspec_ctlchspec(chanspec_t chspec); ++ ++/** ++ * Return a channel number corresponding to a frequency. ++ * ++ * This function returns the chanspec for the primary 40MHz of an 80MHz channel. ++ * The control sideband specifies the same 20MHz channel that the 80MHz channel is using ++ * as the primary 20MHz channel. ++ */ ++extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec); ++ ++/* ++ * Return the channel number for a given frequency and base frequency. ++ * The returned channel number is relative to the given base frequency. ++ * If the given base frequency is zero, a base frequency of 5 GHz is assumed for ++ * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz. ++ * ++ * Frequency is specified in MHz. ++ * The base frequency is specified as (start_factor * 500 kHz). ++ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for ++ * 2.4 GHz and 5 GHz bands. ++ * ++ * The returned channel will be in the range [1, 14] in the 2.4 GHz band ++ * and [0, 200] otherwise. ++ * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the ++ * frequency is not a 2.4 GHz channel, or if the frequency is not and even ++ * multiple of 5 MHz from the base frequency to the base plus 1 GHz. ++ * ++ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2 ++ * ++ * @param freq frequency in MHz ++ * @param start_factor base frequency in 500 kHz units, e.g. 10000 for 5 GHz ++ * ++ * @return Returns a channel number ++ * ++ * @see WF_CHAN_FACTOR_2_4_G ++ * @see WF_CHAN_FACTOR_5_G ++ */ ++extern int wf_mhz2channel(uint freq, uint start_factor); ++ ++/** ++ * Return the center frequency in MHz of the given channel and base frequency. ++ * ++ * Return the center frequency in MHz of the given channel and base frequency. ++ * The channel number is interpreted relative to the given base frequency. ++ * ++ * The valid channel range is [1, 14] in the 2.4 GHz band and [0, 200] otherwise. ++ * The base frequency is specified as (start_factor * 500 kHz). ++ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for ++ * 2.4 GHz and 5 GHz bands. ++ * The channel range of [1, 14] is only checked for a start_factor of ++ * WF_CHAN_FACTOR_2_4_G (4814). ++ * Odd start_factors produce channels on .5 MHz boundaries, in which case ++ * the answer is rounded down to an integral MHz. ++ * -1 is returned for an out of range channel. ++ * ++ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2 ++ * ++ * @param channel input channel number ++ * @param start_factor base frequency in 500 kHz units, e.g. 10000 for 5 GHz ++ * ++ * @return Returns a frequency in MHz ++ * ++ * @see WF_CHAN_FACTOR_2_4_G ++ * @see WF_CHAN_FACTOR_5_G ++ */ ++extern int wf_channel2mhz(uint channel, uint start_factor); ++ ++/** ++ * Convert ctl chan and bw to chanspec ++ * ++ * @param ctl_ch channel ++ * @param bw bandwidth ++ * ++ * @return > 0 if successful or 0 otherwise ++ * ++ */ ++extern uint16 wf_channel2chspec(uint ctl_ch, uint bw); ++ ++#endif /* _bcmwifi_channels_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/bcmwifi_rates.h b/drivers/net/wireless/ap6210/include/bcmwifi_rates.h +new file mode 100644 +index 0000000..ddc6ab5 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/bcmwifi_rates.h +@@ -0,0 +1,318 @@ ++/* ++ * Indices for 802.11 a/b/g/n/ac 1-3 chain symmetric transmit rates ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmwifi_rates.h 252708 2011-04-12 06:45:56Z $ ++ */ ++ ++#ifndef _bcmwifi_rates_h_ ++#define _bcmwifi_rates_h_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++ ++#define WL_RATESET_SZ_DSSS 4 ++#define WL_RATESET_SZ_OFDM 8 ++#define WL_RATESET_SZ_HT_MCS 8 ++#define WL_RATESET_SZ_VHT_MCS 10 ++ ++#define WL_TX_CHAINS_MAX 3 ++ ++#define WL_RATE_DISABLED (-128) /* Power value corresponding to unsupported rate */ ++ ++/* Transmit channel bandwidths */ ++typedef enum wl_tx_bw { ++ WL_TX_BW_20, ++ WL_TX_BW_40, ++ WL_TX_BW_80, ++ WL_TX_BW_20IN40, ++ WL_TX_BW_20IN80, ++ WL_TX_BW_40IN80, ++ WL_TX_BW_ALL ++} wl_tx_bw_t; ++ ++ ++/* ++ * Transmit modes. ++ * Not all modes are listed here, only those required for disambiguation. e.g. SPEXP is not listed ++ */ ++typedef enum wl_tx_mode { ++ WL_TX_MODE_NONE, ++ WL_TX_MODE_STBC, ++ WL_TX_MODE_CDD, ++ WL_TX_MODE_SDM ++} wl_tx_mode_t; ++ ++ ++/* Number of transmit chains */ ++typedef enum wl_tx_chains { ++ WL_TX_CHAINS_1 = 1, ++ WL_TX_CHAINS_2, ++ WL_TX_CHAINS_3 ++} wl_tx_chains_t; ++ ++ ++/* Number of transmit streams */ ++typedef enum wl_tx_nss { ++ WL_TX_NSS_1 = 1, ++ WL_TX_NSS_2, ++ WL_TX_NSS_3 ++} wl_tx_nss_t; ++ ++ ++typedef enum clm_rates { ++ /************ ++ * 1 chain * ++ ************ ++ */ ++ ++ /* 1 Stream */ ++ WL_RATE_1X1_DSSS_1 = 0, ++ WL_RATE_1X1_DSSS_2 = 1, ++ WL_RATE_1X1_DSSS_5_5 = 2, ++ WL_RATE_1X1_DSSS_11 = 3, ++ ++ WL_RATE_1X1_OFDM_6 = 4, ++ WL_RATE_1X1_OFDM_9 = 5, ++ WL_RATE_1X1_OFDM_12 = 6, ++ WL_RATE_1X1_OFDM_18 = 7, ++ WL_RATE_1X1_OFDM_24 = 8, ++ WL_RATE_1X1_OFDM_36 = 9, ++ WL_RATE_1X1_OFDM_48 = 10, ++ WL_RATE_1X1_OFDM_54 = 11, ++ ++ WL_RATE_1X1_MCS0 = 12, ++ WL_RATE_1X1_MCS1 = 13, ++ WL_RATE_1X1_MCS2 = 14, ++ WL_RATE_1X1_MCS3 = 15, ++ WL_RATE_1X1_MCS4 = 16, ++ WL_RATE_1X1_MCS5 = 17, ++ WL_RATE_1X1_MCS6 = 18, ++ WL_RATE_1X1_MCS7 = 19, ++ ++ WL_RATE_1X1_VHT0SS1 = 12, ++ WL_RATE_1X1_VHT1SS1 = 13, ++ WL_RATE_1X1_VHT2SS1 = 14, ++ WL_RATE_1X1_VHT3SS1 = 15, ++ WL_RATE_1X1_VHT4SS1 = 16, ++ WL_RATE_1X1_VHT5SS1 = 17, ++ WL_RATE_1X1_VHT6SS1 = 18, ++ WL_RATE_1X1_VHT7SS1 = 19, ++ WL_RATE_1X1_VHT8SS1 = 20, ++ WL_RATE_1X1_VHT9SS1 = 21, ++ ++ ++ /************ ++ * 2 chains * ++ ************ ++ */ ++ ++ /* 1 Stream expanded + 1 */ ++ WL_RATE_1X2_DSSS_1 = 22, ++ WL_RATE_1X2_DSSS_2 = 23, ++ WL_RATE_1X2_DSSS_5_5 = 24, ++ WL_RATE_1X2_DSSS_11 = 25, ++ ++ WL_RATE_1X2_CDD_OFDM_6 = 26, ++ WL_RATE_1X2_CDD_OFDM_9 = 27, ++ WL_RATE_1X2_CDD_OFDM_12 = 28, ++ WL_RATE_1X2_CDD_OFDM_18 = 29, ++ WL_RATE_1X2_CDD_OFDM_24 = 30, ++ WL_RATE_1X2_CDD_OFDM_36 = 31, ++ WL_RATE_1X2_CDD_OFDM_48 = 32, ++ WL_RATE_1X2_CDD_OFDM_54 = 33, ++ ++ WL_RATE_1X2_CDD_MCS0 = 34, ++ WL_RATE_1X2_CDD_MCS1 = 35, ++ WL_RATE_1X2_CDD_MCS2 = 36, ++ WL_RATE_1X2_CDD_MCS3 = 37, ++ WL_RATE_1X2_CDD_MCS4 = 38, ++ WL_RATE_1X2_CDD_MCS5 = 39, ++ WL_RATE_1X2_CDD_MCS6 = 40, ++ WL_RATE_1X2_CDD_MCS7 = 41, ++ ++ WL_RATE_1X2_VHT0SS1 = 34, ++ WL_RATE_1X2_VHT1SS1 = 35, ++ WL_RATE_1X2_VHT2SS1 = 36, ++ WL_RATE_1X2_VHT3SS1 = 37, ++ WL_RATE_1X2_VHT4SS1 = 38, ++ WL_RATE_1X2_VHT5SS1 = 39, ++ WL_RATE_1X2_VHT6SS1 = 40, ++ WL_RATE_1X2_VHT7SS1 = 41, ++ WL_RATE_1X2_VHT8SS1 = 42, ++ WL_RATE_1X2_VHT9SS1 = 43, ++ ++ /* 2 Streams */ ++ WL_RATE_2X2_STBC_MCS0 = 44, ++ WL_RATE_2X2_STBC_MCS1 = 45, ++ WL_RATE_2X2_STBC_MCS2 = 46, ++ WL_RATE_2X2_STBC_MCS3 = 47, ++ WL_RATE_2X2_STBC_MCS4 = 48, ++ WL_RATE_2X2_STBC_MCS5 = 49, ++ WL_RATE_2X2_STBC_MCS6 = 50, ++ WL_RATE_2X2_STBC_MCS7 = 51, ++ ++ WL_RATE_2X2_STBC_VHT0SS1 = 44, ++ WL_RATE_2X2_STBC_VHT1SS1 = 45, ++ WL_RATE_2X2_STBC_VHT2SS1 = 46, ++ WL_RATE_2X2_STBC_VHT3SS1 = 47, ++ WL_RATE_2X2_STBC_VHT4SS1 = 48, ++ WL_RATE_2X2_STBC_VHT5SS1 = 49, ++ WL_RATE_2X2_STBC_VHT6SS1 = 50, ++ WL_RATE_2X2_STBC_VHT7SS1 = 51, ++ WL_RATE_2X2_STBC_VHT8SS1 = 52, ++ WL_RATE_2X2_STBC_VHT9SS1 = 53, ++ ++ WL_RATE_2X2_SDM_MCS8 = 54, ++ WL_RATE_2X2_SDM_MCS9 = 55, ++ WL_RATE_2X2_SDM_MCS10 = 56, ++ WL_RATE_2X2_SDM_MCS11 = 57, ++ WL_RATE_2X2_SDM_MCS12 = 58, ++ WL_RATE_2X2_SDM_MCS13 = 59, ++ WL_RATE_2X2_SDM_MCS14 = 60, ++ WL_RATE_2X2_SDM_MCS15 = 61, ++ ++ WL_RATE_2X2_VHT0SS2 = 54, ++ WL_RATE_2X2_VHT1SS2 = 55, ++ WL_RATE_2X2_VHT2SS2 = 56, ++ WL_RATE_2X2_VHT3SS2 = 57, ++ WL_RATE_2X2_VHT4SS2 = 58, ++ WL_RATE_2X2_VHT5SS2 = 59, ++ WL_RATE_2X2_VHT6SS2 = 60, ++ WL_RATE_2X2_VHT7SS2 = 61, ++ WL_RATE_2X2_VHT8SS2 = 62, ++ WL_RATE_2X2_VHT9SS2 = 63, ++ ++ ++ /************ ++ * 3 chains * ++ ************ ++ */ ++ ++ /* 1 Stream expanded + 2 */ ++ WL_RATE_1X3_DSSS_1 = 64, ++ WL_RATE_1X3_DSSS_2 = 65, ++ WL_RATE_1X3_DSSS_5_5 = 66, ++ WL_RATE_1X3_DSSS_11 = 67, ++ ++ WL_RATE_1X3_CDD_OFDM_6 = 68, ++ WL_RATE_1X3_CDD_OFDM_9 = 69, ++ WL_RATE_1X3_CDD_OFDM_12 = 70, ++ WL_RATE_1X3_CDD_OFDM_18 = 71, ++ WL_RATE_1X3_CDD_OFDM_24 = 72, ++ WL_RATE_1X3_CDD_OFDM_36 = 73, ++ WL_RATE_1X3_CDD_OFDM_48 = 74, ++ WL_RATE_1X3_CDD_OFDM_54 = 75, ++ ++ WL_RATE_1X3_CDD_MCS0 = 76, ++ WL_RATE_1X3_CDD_MCS1 = 77, ++ WL_RATE_1X3_CDD_MCS2 = 78, ++ WL_RATE_1X3_CDD_MCS3 = 79, ++ WL_RATE_1X3_CDD_MCS4 = 80, ++ WL_RATE_1X3_CDD_MCS5 = 81, ++ WL_RATE_1X3_CDD_MCS6 = 82, ++ WL_RATE_1X3_CDD_MCS7 = 83, ++ ++ WL_RATE_1X3_VHT0SS1 = 76, ++ WL_RATE_1X3_VHT1SS1 = 77, ++ WL_RATE_1X3_VHT2SS1 = 78, ++ WL_RATE_1X3_VHT3SS1 = 79, ++ WL_RATE_1X3_VHT4SS1 = 80, ++ WL_RATE_1X3_VHT5SS1 = 81, ++ WL_RATE_1X3_VHT6SS1 = 82, ++ WL_RATE_1X3_VHT7SS1 = 83, ++ WL_RATE_1X3_VHT8SS1 = 84, ++ WL_RATE_1X3_VHT9SS1 = 85, ++ ++ /* 2 Streams expanded + 1 */ ++ WL_RATE_2X3_STBC_MCS0 = 86, ++ WL_RATE_2X3_STBC_MCS1 = 87, ++ WL_RATE_2X3_STBC_MCS2 = 88, ++ WL_RATE_2X3_STBC_MCS3 = 89, ++ WL_RATE_2X3_STBC_MCS4 = 90, ++ WL_RATE_2X3_STBC_MCS5 = 91, ++ WL_RATE_2X3_STBC_MCS6 = 92, ++ WL_RATE_2X3_STBC_MCS7 = 93, ++ ++ WL_RATE_2X3_STBC_VHT0SS1 = 86, ++ WL_RATE_2X3_STBC_VHT1SS1 = 87, ++ WL_RATE_2X3_STBC_VHT2SS1 = 88, ++ WL_RATE_2X3_STBC_VHT3SS1 = 89, ++ WL_RATE_2X3_STBC_VHT4SS1 = 90, ++ WL_RATE_2X3_STBC_VHT5SS1 = 91, ++ WL_RATE_2X3_STBC_VHT6SS1 = 92, ++ WL_RATE_2X3_STBC_VHT7SS1 = 93, ++ WL_RATE_2X3_STBC_VHT8SS1 = 94, ++ WL_RATE_2X3_STBC_VHT9SS1 = 95, ++ ++ WL_RATE_2X3_SDM_MCS8 = 96, ++ WL_RATE_2X3_SDM_MCS9 = 97, ++ WL_RATE_2X3_SDM_MCS10 = 98, ++ WL_RATE_2X3_SDM_MCS11 = 99, ++ WL_RATE_2X3_SDM_MCS12 = 100, ++ WL_RATE_2X3_SDM_MCS13 = 101, ++ WL_RATE_2X3_SDM_MCS14 = 102, ++ WL_RATE_2X3_SDM_MCS15 = 103, ++ ++ WL_RATE_2X3_VHT0SS2 = 96, ++ WL_RATE_2X3_VHT1SS2 = 97, ++ WL_RATE_2X3_VHT2SS2 = 98, ++ WL_RATE_2X3_VHT3SS2 = 99, ++ WL_RATE_2X3_VHT4SS2 = 100, ++ WL_RATE_2X3_VHT5SS2 = 101, ++ WL_RATE_2X3_VHT6SS2 = 102, ++ WL_RATE_2X3_VHT7SS2 = 103, ++ WL_RATE_2X3_VHT8SS2 = 104, ++ WL_RATE_2X3_VHT9SS2 = 105, ++ ++ /* 3 Streams */ ++ WL_RATE_3X3_SDM_MCS16 = 106, ++ WL_RATE_3X3_SDM_MCS17 = 107, ++ WL_RATE_3X3_SDM_MCS18 = 108, ++ WL_RATE_3X3_SDM_MCS19 = 109, ++ WL_RATE_3X3_SDM_MCS20 = 110, ++ WL_RATE_3X3_SDM_MCS21 = 111, ++ WL_RATE_3X3_SDM_MCS22 = 112, ++ WL_RATE_3X3_SDM_MCS23 = 113, ++ ++ WL_RATE_3X3_VHT0SS3 = 106, ++ WL_RATE_3X3_VHT1SS3 = 107, ++ WL_RATE_3X3_VHT2SS3 = 108, ++ WL_RATE_3X3_VHT3SS3 = 109, ++ WL_RATE_3X3_VHT4SS3 = 110, ++ WL_RATE_3X3_VHT5SS3 = 111, ++ WL_RATE_3X3_VHT6SS3 = 112, ++ WL_RATE_3X3_VHT7SS3 = 113, ++ WL_RATE_3X3_VHT8SS3 = 114, ++ WL_RATE_3X3_VHT9SS3 = 115, ++ ++ /* Number of rate codes */ ++ WL_NUMRATES = 116 ++} clm_rates_t; ++ ++#ifdef __cplusplus ++} ++#endif /* __cplusplus */ ++ ++#endif /* _bcmwifi_rates_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/dhdioctl.h b/drivers/net/wireless/ap6210/include/dhdioctl.h +new file mode 100644 +index 0000000..6909dc2 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/dhdioctl.h +@@ -0,0 +1,136 @@ ++/* ++ * Definitions for ioctls to access DHD iovars. ++ * Based on wlioctl.h (for Broadcom 802.11abg driver). ++ * (Moves towards generic ioctls for BCM drivers/iovars.) ++ * ++ * Definitions subject to change without notice. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhdioctl.h 354894 2012-09-04 12:34:07Z $ ++ */ ++ ++#ifndef _dhdioctl_h_ ++#define _dhdioctl_h_ ++ ++#include ++ ++ ++/* require default structure packing */ ++#define BWL_DEFAULT_PACKING ++#include ++ ++ ++/* Linux network driver ioctl encoding */ ++typedef struct dhd_ioctl { ++ uint cmd; /* common ioctl definition */ ++ void *buf; /* pointer to user buffer */ ++ uint len; /* length of user buffer */ ++ bool set; /* get or set request (optional) */ ++ uint used; /* bytes read or written (optional) */ ++ uint needed; /* bytes needed (optional) */ ++ uint driver; /* to identify target driver */ ++} dhd_ioctl_t; ++ ++/* Underlying BUS definition */ ++enum { ++ BUS_TYPE_USB = 0, /* for USB dongles */ ++ BUS_TYPE_SDIO /* for SDIO dongles */ ++}; ++ ++/* per-driver magic numbers */ ++#define DHD_IOCTL_MAGIC 0x00444944 ++ ++/* bump this number if you change the ioctl interface */ ++#define DHD_IOCTL_VERSION 1 ++ ++#define DHD_IOCTL_MAXLEN 8192 /* max length ioctl buffer required */ ++#define DHD_IOCTL_SMLEN 256 /* "small" length ioctl buffer required */ ++ ++/* common ioctl definitions */ ++#define DHD_GET_MAGIC 0 ++#define DHD_GET_VERSION 1 ++#define DHD_GET_VAR 2 ++#define DHD_SET_VAR 3 ++ ++/* message levels */ ++#define DHD_ERROR_VAL 0x0001 ++#define DHD_TRACE_VAL 0x0002 ++#define DHD_INFO_VAL 0x0004 ++#define DHD_DATA_VAL 0x0008 ++#define DHD_CTL_VAL 0x0010 ++#define DHD_TIMER_VAL 0x0020 ++#define DHD_HDRS_VAL 0x0040 ++#define DHD_BYTES_VAL 0x0080 ++#define DHD_INTR_VAL 0x0100 ++#define DHD_LOG_VAL 0x0200 ++#define DHD_GLOM_VAL 0x0400 ++#define DHD_EVENT_VAL 0x0800 ++#define DHD_BTA_VAL 0x1000 ++#if 0 && (NDISVER >= 0x0630) && 1 ++#define DHD_SCAN_VAL 0x2000 ++#else ++#define DHD_ISCAN_VAL 0x2000 ++#endif ++#define DHD_ARPOE_VAL 0x4000 ++#define DHD_REORDER_VAL 0x8000 ++#define DHD_IW_VAL 0x10000 ++#define DHD_CFG_VAL 0x20000 ++ ++#ifdef SDTEST ++/* For pktgen iovar */ ++typedef struct dhd_pktgen { ++ uint version; /* To allow structure change tracking */ ++ uint freq; /* Max ticks between tx/rx attempts */ ++ uint count; /* Test packets to send/rcv each attempt */ ++ uint print; /* Print counts every attempts */ ++ uint total; /* Total packets (or bursts) */ ++ uint minlen; /* Minimum length of packets to send */ ++ uint maxlen; /* Maximum length of packets to send */ ++ uint numsent; /* Count of test packets sent */ ++ uint numrcvd; /* Count of test packets received */ ++ uint numfail; /* Count of test send failures */ ++ uint mode; /* Test mode (type of test packets) */ ++ uint stop; /* Stop after this many tx failures */ ++} dhd_pktgen_t; ++ ++/* Version in case structure changes */ ++#define DHD_PKTGEN_VERSION 2 ++ ++/* Type of test packets to use */ ++#define DHD_PKTGEN_ECHO 1 /* Send echo requests */ ++#define DHD_PKTGEN_SEND 2 /* Send discard packets */ ++#define DHD_PKTGEN_RXBURST 3 /* Request dongle send N packets */ ++#define DHD_PKTGEN_RECV 4 /* Continuous rx from continuous tx dongle */ ++#endif /* SDTEST */ ++ ++/* Enter idle immediately (no timeout) */ ++#define DHD_IDLE_IMMEDIATE (-1) ++ ++/* Values for idleclock iovar: other values are the sd_divisor to use when idle */ ++#define DHD_IDLE_ACTIVE 0 /* Do not request any SD clock change when idle */ ++#define DHD_IDLE_STOP (-1) /* Request SD clock be stopped (and use SD1 mode) */ ++ ++ ++/* require default structure packing */ ++#include ++ ++#endif /* _dhdioctl_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/epivers.h b/drivers/net/wireless/ap6210/include/epivers.h +new file mode 100644 +index 0000000..cff9ebd +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/epivers.h +@@ -0,0 +1,56 @@ ++/* ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: epivers.h.in,v 13.33 2010-09-08 22:08:53 csm Exp $ ++ * ++*/ ++ ++#ifndef _epivers_h_ ++#define _epivers_h_ ++ ++#define EPI_MAJOR_VERSION 1 ++ ++#define EPI_MINOR_VERSION 28 ++ ++#define EPI_RC_NUMBER 23 ++ ++#define EPI_INCREMENTAL_NUMBER 0 ++ ++#define EPI_BUILD_NUMBER 0 ++ ++#define EPI_VERSION 1, 28, 23, 0 ++ ++#define EPI_VERSION_NUM 0x011c1700 ++ ++#define EPI_VERSION_DEV 1.28.23 ++ ++/* Driver Version String, ASCII, 32 chars max */ ++#ifdef BCMINTERNAL ++#define EPI_VERSION_STR "1.28.23.3 (r BCMINT)" ++#else ++#ifdef WLTEST ++#define EPI_VERSION_STR "1.28.23.3 (r WLTEST)" ++#else ++#define EPI_VERSION_STR "1.28.23.3 (r)" ++#endif ++#endif /* BCMINTERNAL */ ++ ++#endif /* _epivers_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/hndpmu.h b/drivers/net/wireless/ap6210/include/hndpmu.h +new file mode 100644 +index 0000000..c41def6 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/hndpmu.h +@@ -0,0 +1,36 @@ ++/* ++ * HND SiliconBackplane PMU support. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: hndpmu.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _hndpmu_h_ ++#define _hndpmu_h_ ++ ++ ++extern void si_pmu_otp_power(si_t *sih, osl_t *osh, bool on); ++extern void si_sdiod_drive_strength_init(si_t *sih, osl_t *osh, uint32 drivestrength); ++ ++extern void si_pmu_minresmask_htavail_set(si_t *sih, osl_t *osh, bool set_clear); ++ ++#endif /* _hndpmu_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/hndrte_armtrap.h b/drivers/net/wireless/ap6210/include/hndrte_armtrap.h +new file mode 100644 +index 0000000..90d9799 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/hndrte_armtrap.h +@@ -0,0 +1,88 @@ ++/* ++ * HNDRTE arm trap handling. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: hndrte_armtrap.h 261365 2011-05-24 20:42:23Z $ ++ */ ++ ++#ifndef _hndrte_armtrap_h ++#define _hndrte_armtrap_h ++ ++ ++/* ARM trap handling */ ++ ++/* Trap types defined by ARM (see arminc.h) */ ++ ++/* Trap locations in lo memory */ ++#define TRAP_STRIDE 4 ++#define FIRST_TRAP TR_RST ++#define LAST_TRAP (TR_FIQ * TRAP_STRIDE) ++ ++#if defined(__ARM_ARCH_4T__) ++#define MAX_TRAP_TYPE (TR_FIQ + 1) ++#elif defined(__ARM_ARCH_7M__) ++#define MAX_TRAP_TYPE (TR_ISR + ARMCM3_NUMINTS) ++#endif /* __ARM_ARCH_7M__ */ ++ ++/* The trap structure is defined here as offsets for assembly */ ++#define TR_TYPE 0x00 ++#define TR_EPC 0x04 ++#define TR_CPSR 0x08 ++#define TR_SPSR 0x0c ++#define TR_REGS 0x10 ++#define TR_REG(n) (TR_REGS + (n) * 4) ++#define TR_SP TR_REG(13) ++#define TR_LR TR_REG(14) ++#define TR_PC TR_REG(15) ++ ++#define TRAP_T_SIZE 80 ++ ++#ifndef _LANGUAGE_ASSEMBLY ++ ++#include ++ ++typedef struct _trap_struct { ++ uint32 type; ++ uint32 epc; ++ uint32 cpsr; ++ uint32 spsr; ++ uint32 r0; /* a1 */ ++ uint32 r1; /* a2 */ ++ uint32 r2; /* a3 */ ++ uint32 r3; /* a4 */ ++ uint32 r4; /* v1 */ ++ uint32 r5; /* v2 */ ++ uint32 r6; /* v3 */ ++ uint32 r7; /* v4 */ ++ uint32 r8; /* v5 */ ++ uint32 r9; /* sb/v6 */ ++ uint32 r10; /* sl/v7 */ ++ uint32 r11; /* fp/v8 */ ++ uint32 r12; /* ip */ ++ uint32 r13; /* sp */ ++ uint32 r14; /* lr */ ++ uint32 pc; /* r15 */ ++} trap_t; ++ ++#endif /* !_LANGUAGE_ASSEMBLY */ ++ ++#endif /* _hndrte_armtrap_h */ +diff --git a/drivers/net/wireless/ap6210/include/hndrte_cons.h b/drivers/net/wireless/ap6210/include/hndrte_cons.h +new file mode 100644 +index 0000000..57abbbd +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/hndrte_cons.h +@@ -0,0 +1,67 @@ ++/* ++ * Console support for hndrte. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: hndrte_cons.h 300516 2011-12-04 17:39:44Z $ ++ */ ++#ifndef _HNDRTE_CONS_H ++#define _HNDRTE_CONS_H ++ ++#include ++ ++#define CBUF_LEN (128) ++ ++#define LOG_BUF_LEN 1024 ++ ++typedef struct { ++ uint32 buf; /* Can't be pointer on (64-bit) hosts */ ++ uint buf_size; ++ uint idx; ++ char *_buf_compat; /* redundant pointer for backward compat. */ ++} hndrte_log_t; ++ ++typedef struct { ++ /* Virtual UART ++ * When there is no UART (e.g. Quickturn), the host should write a complete ++ * input line directly into cbuf and then write the length into vcons_in. ++ * This may also be used when there is a real UART (at risk of conflicting with ++ * the real UART). vcons_out is currently unused. ++ */ ++ volatile uint vcons_in; ++ volatile uint vcons_out; ++ ++ /* Output (logging) buffer ++ * Console output is written to a ring buffer log_buf at index log_idx. ++ * The host may read the output when it sees log_idx advance. ++ * Output will be lost if the output wraps around faster than the host polls. ++ */ ++ hndrte_log_t log; ++ ++ /* Console input line buffer ++ * Characters are read one at a time into cbuf until is received, then ++ * the buffer is processed as a command line. Also used for virtual UART. ++ */ ++ uint cbuf_idx; ++ char cbuf[CBUF_LEN]; ++} hndrte_cons_t; ++ ++#endif /* _HNDRTE_CONS_H */ +diff --git a/drivers/net/wireless/ap6210/include/hndsoc.h b/drivers/net/wireless/ap6210/include/hndsoc.h +new file mode 100644 +index 0000000..66640c3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/hndsoc.h +@@ -0,0 +1,235 @@ ++/* ++ * Broadcom HND chip & on-chip-interconnect-related definitions. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: hndsoc.h 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#ifndef _HNDSOC_H ++#define _HNDSOC_H ++ ++/* Include the soci specific files */ ++#include ++#include ++ ++/* ++ * SOC Interconnect Address Map. ++ * All regions may not exist on all chips. ++ */ ++#define SI_SDRAM_BASE 0x00000000 /* Physical SDRAM */ ++#define SI_PCI_MEM 0x08000000 /* Host Mode sb2pcitranslation0 (64 MB) */ ++#define SI_PCI_MEM_SZ (64 * 1024 * 1024) ++#define SI_PCI_CFG 0x0c000000 /* Host Mode sb2pcitranslation1 (64 MB) */ ++#define SI_SDRAM_SWAPPED 0x10000000 /* Byteswapped Physical SDRAM */ ++#define SI_SDRAM_R2 0x80000000 /* Region 2 for sdram (512 MB) */ ++ ++#define SI_ENUM_BASE 0x18000000 /* Enumeration space base */ ++ ++#define SI_WRAP_BASE 0x18100000 /* Wrapper space base */ ++#define SI_CORE_SIZE 0x1000 /* each core gets 4Kbytes for registers */ ++#define SI_MAXCORES 16 /* Max cores (this is arbitrary, for software ++ * convenience and could be changed if we ++ * make any larger chips ++ */ ++ ++#define SI_FASTRAM 0x19000000 /* On-chip RAM on chips that also have DDR */ ++#define SI_FASTRAM_SWAPPED 0x19800000 ++ ++#define SI_FLASH2 0x1c000000 /* Flash Region 2 (region 1 shadowed here) */ ++#define SI_FLASH2_SZ 0x02000000 /* Size of Flash Region 2 */ ++#define SI_ARMCM3_ROM 0x1e000000 /* ARM Cortex-M3 ROM */ ++#define SI_FLASH1 0x1fc00000 /* MIPS Flash Region 1 */ ++#define SI_FLASH1_SZ 0x00400000 /* MIPS Size of Flash Region 1 */ ++#define SI_ARM7S_ROM 0x20000000 /* ARM7TDMI-S ROM */ ++#define SI_ARMCR4_ROM 0x000f0000 /* ARM Cortex-R4 ROM */ ++#define SI_ARMCM3_SRAM2 0x60000000 /* ARM Cortex-M3 SRAM Region 2 */ ++#define SI_ARM7S_SRAM2 0x80000000 /* ARM7TDMI-S SRAM Region 2 */ ++#define SI_ARM_FLASH1 0xffff0000 /* ARM Flash Region 1 */ ++#define SI_ARM_FLASH1_SZ 0x00010000 /* ARM Size of Flash Region 1 */ ++ ++#define SI_PCI_DMA 0x40000000 /* Client Mode sb2pcitranslation2 (1 GB) */ ++#define SI_PCI_DMA2 0x80000000 /* Client Mode sb2pcitranslation2 (1 GB) */ ++#define SI_PCI_DMA_SZ 0x40000000 /* Client Mode sb2pcitranslation2 size in bytes */ ++#define SI_PCIE_DMA_L32 0x00000000 /* PCIE Client Mode sb2pcitranslation2 ++ * (2 ZettaBytes), low 32 bits ++ */ ++#define SI_PCIE_DMA_H32 0x80000000 /* PCIE Client Mode sb2pcitranslation2 ++ * (2 ZettaBytes), high 32 bits ++ */ ++ ++/* core codes */ ++#define NODEV_CORE_ID 0x700 /* Invalid coreid */ ++#define CC_CORE_ID 0x800 /* chipcommon core */ ++#define ILINE20_CORE_ID 0x801 /* iline20 core */ ++#define SRAM_CORE_ID 0x802 /* sram core */ ++#define SDRAM_CORE_ID 0x803 /* sdram core */ ++#define PCI_CORE_ID 0x804 /* pci core */ ++#define MIPS_CORE_ID 0x805 /* mips core */ ++#define ENET_CORE_ID 0x806 /* enet mac core */ ++#define CODEC_CORE_ID 0x807 /* v90 codec core */ ++#define USB_CORE_ID 0x808 /* usb 1.1 host/device core */ ++#define ADSL_CORE_ID 0x809 /* ADSL core */ ++#define ILINE100_CORE_ID 0x80a /* iline100 core */ ++#define IPSEC_CORE_ID 0x80b /* ipsec core */ ++#define UTOPIA_CORE_ID 0x80c /* utopia core */ ++#define PCMCIA_CORE_ID 0x80d /* pcmcia core */ ++#define SOCRAM_CORE_ID 0x80e /* internal memory core */ ++#define MEMC_CORE_ID 0x80f /* memc sdram core */ ++#define OFDM_CORE_ID 0x810 /* OFDM phy core */ ++#define EXTIF_CORE_ID 0x811 /* external interface core */ ++#define D11_CORE_ID 0x812 /* 802.11 MAC core */ ++#define APHY_CORE_ID 0x813 /* 802.11a phy core */ ++#define BPHY_CORE_ID 0x814 /* 802.11b phy core */ ++#define GPHY_CORE_ID 0x815 /* 802.11g phy core */ ++#define MIPS33_CORE_ID 0x816 /* mips3302 core */ ++#define USB11H_CORE_ID 0x817 /* usb 1.1 host core */ ++#define USB11D_CORE_ID 0x818 /* usb 1.1 device core */ ++#define USB20H_CORE_ID 0x819 /* usb 2.0 host core */ ++#define USB20D_CORE_ID 0x81a /* usb 2.0 device core */ ++#define SDIOH_CORE_ID 0x81b /* sdio host core */ ++#define ROBO_CORE_ID 0x81c /* roboswitch core */ ++#define ATA100_CORE_ID 0x81d /* parallel ATA core */ ++#define SATAXOR_CORE_ID 0x81e /* serial ATA & XOR DMA core */ ++#define GIGETH_CORE_ID 0x81f /* gigabit ethernet core */ ++#define PCIE_CORE_ID 0x820 /* pci express core */ ++#define NPHY_CORE_ID 0x821 /* 802.11n 2x2 phy core */ ++#define SRAMC_CORE_ID 0x822 /* SRAM controller core */ ++#define MINIMAC_CORE_ID 0x823 /* MINI MAC/phy core */ ++#define ARM11_CORE_ID 0x824 /* ARM 1176 core */ ++#define ARM7S_CORE_ID 0x825 /* ARM7tdmi-s core */ ++#define LPPHY_CORE_ID 0x826 /* 802.11a/b/g phy core */ ++#define PMU_CORE_ID 0x827 /* PMU core */ ++#define SSNPHY_CORE_ID 0x828 /* 802.11n single-stream phy core */ ++#define SDIOD_CORE_ID 0x829 /* SDIO device core */ ++#define ARMCM3_CORE_ID 0x82a /* ARM Cortex M3 core */ ++#define HTPHY_CORE_ID 0x82b /* 802.11n 4x4 phy core */ ++#define MIPS74K_CORE_ID 0x82c /* mips 74k core */ ++#define GMAC_CORE_ID 0x82d /* Gigabit MAC core */ ++#define DMEMC_CORE_ID 0x82e /* DDR1/2 memory controller core */ ++#define PCIERC_CORE_ID 0x82f /* PCIE Root Complex core */ ++#define OCP_CORE_ID 0x830 /* OCP2OCP bridge core */ ++#define SC_CORE_ID 0x831 /* shared common core */ ++#define AHB_CORE_ID 0x832 /* OCP2AHB bridge core */ ++#define SPIH_CORE_ID 0x833 /* SPI host core */ ++#define I2S_CORE_ID 0x834 /* I2S core */ ++#define DMEMS_CORE_ID 0x835 /* SDR/DDR1 memory controller core */ ++#define DEF_SHIM_COMP 0x837 /* SHIM component in ubus/6362 */ ++ ++#define ACPHY_CORE_ID 0x83b /* Dot11 ACPHY */ ++#define PCIE2_CORE_ID 0x83c /* pci express Gen2 core */ ++#define USB30D_CORE_ID 0x83d /* usb 3.0 device core */ ++#define ARMCR4_CORE_ID 0x83e /* ARM CR4 CPU */ ++#define APB_BRIDGE_CORE_ID 0x135 /* APB bridge core ID */ ++#define AXI_CORE_ID 0x301 /* AXI/GPV core ID */ ++#define EROM_CORE_ID 0x366 /* EROM core ID */ ++#define OOB_ROUTER_CORE_ID 0x367 /* OOB router core ID */ ++#define DEF_AI_COMP 0xfff /* Default component, in ai chips it maps all ++ * unused address ranges ++ */ ++ ++#define CC_4706_CORE_ID 0x500 /* chipcommon core */ ++#define SOCRAM_4706_CORE_ID 0x50e /* internal memory core */ ++#define GMAC_COMMON_4706_CORE_ID 0x5dc /* Gigabit MAC core */ ++#define GMAC_4706_CORE_ID 0x52d /* Gigabit MAC core */ ++#define AMEMC_CORE_ID 0x52e /* DDR1/2 memory controller core */ ++#define ALTA_CORE_ID 0x534 /* I2S core */ ++#define DDR23_PHY_CORE_ID 0x5dd ++ ++#define SI_PCI1_MEM 0x40000000 /* Host Mode sb2pcitranslation0 (64 MB) */ ++#define SI_PCI1_CFG 0x44000000 /* Host Mode sb2pcitranslation1 (64 MB) */ ++#define SI_PCIE1_DMA_H32 0xc0000000 /* PCIE Client Mode sb2pcitranslation2 ++ * (2 ZettaBytes), high 32 bits ++ */ ++#define CC_4706B0_CORE_REV 0x8000001f /* chipcommon core */ ++#define SOCRAM_4706B0_CORE_REV 0x80000005 /* internal memory core */ ++#define GMAC_4706B0_CORE_REV 0x80000000 /* Gigabit MAC core */ ++ ++/* There are TWO constants on all HND chips: SI_ENUM_BASE above, ++ * and chipcommon being the first core: ++ */ ++#define SI_CC_IDX 0 ++ ++/* SOC Interconnect types (aka chip types) */ ++#define SOCI_SB 0 ++#define SOCI_AI 1 ++#define SOCI_UBUS 2 ++ ++/* Common core control flags */ ++#define SICF_BIST_EN 0x8000 ++#define SICF_PME_EN 0x4000 ++#define SICF_CORE_BITS 0x3ffc ++#define SICF_FGC 0x0002 ++#define SICF_CLOCK_EN 0x0001 ++ ++/* Common core status flags */ ++#define SISF_BIST_DONE 0x8000 ++#define SISF_BIST_ERROR 0x4000 ++#define SISF_GATED_CLK 0x2000 ++#define SISF_DMA64 0x1000 ++#define SISF_CORE_BITS 0x0fff ++ ++/* A register that is common to all cores to ++ * communicate w/PMU regarding clock control. ++ */ ++#define SI_CLK_CTL_ST 0x1e0 /* clock control and status */ ++ ++/* clk_ctl_st register */ ++#define CCS_FORCEALP 0x00000001 /* force ALP request */ ++#define CCS_FORCEHT 0x00000002 /* force HT request */ ++#define CCS_FORCEILP 0x00000004 /* force ILP request */ ++#define CCS_ALPAREQ 0x00000008 /* ALP Avail Request */ ++#define CCS_HTAREQ 0x00000010 /* HT Avail Request */ ++#define CCS_FORCEHWREQOFF 0x00000020 /* Force HW Clock Request Off */ ++#define CCS_HQCLKREQ 0x00000040 /* HQ Clock Required */ ++#define CCS_USBCLKREQ 0x00000100 /* USB Clock Req */ ++#define CCS_ERSRC_REQ_MASK 0x00000700 /* external resource requests */ ++#define CCS_ERSRC_REQ_SHIFT 8 ++#define CCS_ALPAVAIL 0x00010000 /* ALP is available */ ++#define CCS_HTAVAIL 0x00020000 /* HT is available */ ++#define CCS_BP_ON_APL 0x00040000 /* RO: Backplane is running on ALP clock */ ++#define CCS_BP_ON_HT 0x00080000 /* RO: Backplane is running on HT clock */ ++#define CCS_ERSRC_STS_MASK 0x07000000 /* external resource status */ ++#define CCS_ERSRC_STS_SHIFT 24 ++ ++#define CCS0_HTAVAIL 0x00010000 /* HT avail in chipc and pcmcia on 4328a0 */ ++#define CCS0_ALPAVAIL 0x00020000 /* ALP avail in chipc and pcmcia on 4328a0 */ ++ ++/* Not really related to SOC Interconnect, but a couple of software ++ * conventions for the use the flash space: ++ */ ++ ++/* Minumum amount of flash we support */ ++#define FLASH_MIN 0x00020000 /* Minimum flash size */ ++ ++/* A boot/binary may have an embedded block that describes its size */ ++#define BISZ_OFFSET 0x3e0 /* At this offset into the binary */ ++#define BISZ_MAGIC 0x4249535a /* Marked with this value: 'BISZ' */ ++#define BISZ_MAGIC_IDX 0 /* Word 0: magic */ ++#define BISZ_TXTST_IDX 1 /* 1: text start */ ++#define BISZ_TXTEND_IDX 2 /* 2: text end */ ++#define BISZ_DATAST_IDX 3 /* 3: data start */ ++#define BISZ_DATAEND_IDX 4 /* 4: data end */ ++#define BISZ_BSSST_IDX 5 /* 5: bss start */ ++#define BISZ_BSSEND_IDX 6 /* 6: bss end */ ++#define BISZ_SIZE 7 /* descriptor size in 32-bit integers */ ++ ++#endif /* _HNDSOC_H */ +diff --git a/drivers/net/wireless/ap6210/include/linux_osl.h b/drivers/net/wireless/ap6210/include/linux_osl.h +new file mode 100644 +index 0000000..ca28f6b +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/linux_osl.h +@@ -0,0 +1,430 @@ ++/* ++ * Linux OS Independent Layer ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: linux_osl.h 354452 2012-08-31 04:59:17Z $ ++ */ ++ ++#ifndef _linux_osl_h_ ++#define _linux_osl_h_ ++ ++#include ++ ++/* Linux Kernel: File Operations: start */ ++extern void * osl_os_open_image(char * filename); ++extern int osl_os_get_image_block(char * buf, int len, void * image); ++extern void osl_os_close_image(void * image); ++extern int osl_os_image_size(void *image); ++/* Linux Kernel: File Operations: end */ ++ ++#ifdef BCMDRIVER ++ ++/* OSL initialization */ ++extern osl_t *osl_attach(void *pdev, uint bustype, bool pkttag); ++extern void osl_detach(osl_t *osh); ++ ++/* Global ASSERT type */ ++extern uint32 g_assert_type; ++ ++/* ASSERT */ ++#if defined(BCMASSERT_LOG) ++ #define ASSERT(exp) \ ++ do { if (!(exp)) osl_assert(#exp, __FILE__, __LINE__); } while (0) ++extern void osl_assert(const char *exp, const char *file, int line); ++#else ++ #ifdef __GNUC__ ++ #define GCC_VERSION \ ++ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) ++ #if GCC_VERSION > 30100 ++ #define ASSERT(exp) do {} while (0) ++ #else ++ /* ASSERT could cause segmentation fault on GCC3.1, use empty instead */ ++ #define ASSERT(exp) ++ #endif /* GCC_VERSION > 30100 */ ++ #endif /* __GNUC__ */ ++#endif ++ ++/* microsecond delay */ ++#define OSL_DELAY(usec) osl_delay(usec) ++extern void osl_delay(uint usec); ++ ++#define OSL_PCMCIA_READ_ATTR(osh, offset, buf, size) \ ++ osl_pcmcia_read_attr((osh), (offset), (buf), (size)) ++#define OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size) \ ++ osl_pcmcia_write_attr((osh), (offset), (buf), (size)) ++extern void osl_pcmcia_read_attr(osl_t *osh, uint offset, void *buf, int size); ++extern void osl_pcmcia_write_attr(osl_t *osh, uint offset, void *buf, int size); ++ ++/* PCI configuration space access macros */ ++#define OSL_PCI_READ_CONFIG(osh, offset, size) \ ++ osl_pci_read_config((osh), (offset), (size)) ++#define OSL_PCI_WRITE_CONFIG(osh, offset, size, val) \ ++ osl_pci_write_config((osh), (offset), (size), (val)) ++extern uint32 osl_pci_read_config(osl_t *osh, uint offset, uint size); ++extern void osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val); ++ ++/* PCI device bus # and slot # */ ++#define OSL_PCI_BUS(osh) osl_pci_bus(osh) ++#define OSL_PCI_SLOT(osh) osl_pci_slot(osh) ++extern uint osl_pci_bus(osl_t *osh); ++extern uint osl_pci_slot(osl_t *osh); ++extern struct pci_dev *osl_pci_device(osl_t *osh); ++ ++/* Pkttag flag should be part of public information */ ++typedef struct { ++ bool pkttag; ++ uint pktalloced; /* Number of allocated packet buffers */ ++ bool mmbus; /* Bus supports memory-mapped register accesses */ ++ pktfree_cb_fn_t tx_fn; /* Callback function for PKTFREE */ ++ void *tx_ctx; /* Context to the callback function */ ++ void *unused[3]; ++} osl_pubinfo_t; ++ ++#define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \ ++ do { \ ++ ((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \ ++ ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \ ++ } while (0) ++ ++ ++/* host/bus architecture-specific byte swap */ ++#define BUS_SWAP32(v) (v) ++ ++ #define MALLOC(osh, size) osl_malloc((osh), (size)) ++ #define MFREE(osh, addr, size) osl_mfree((osh), (addr), (size)) ++ #define MALLOCED(osh) osl_malloced((osh)) ++ extern void *osl_malloc(osl_t *osh, uint size); ++ extern void osl_mfree(osl_t *osh, void *addr, uint size); ++ extern uint osl_malloced(osl_t *osh); ++ ++#define NATIVE_MALLOC(osh, size) kmalloc(size, GFP_ATOMIC) ++#define NATIVE_MFREE(osh, addr, size) kfree(addr) ++ ++#define MALLOC_FAILED(osh) osl_malloc_failed((osh)) ++extern uint osl_malloc_failed(osl_t *osh); ++ ++/* allocate/free shared (dma-able) consistent memory */ ++#define DMA_CONSISTENT_ALIGN osl_dma_consistent_align() ++#define DMA_ALLOC_CONSISTENT(osh, size, align, tot, pap, dmah) \ ++ osl_dma_alloc_consistent((osh), (size), (align), (tot), (pap)) ++#define DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \ ++ osl_dma_free_consistent((osh), (void*)(va), (size), (pa)) ++extern uint osl_dma_consistent_align(void); ++extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align, uint *tot, ulong *pap); ++extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa); ++ ++/* map/unmap direction */ ++#define DMA_TX 1 /* TX direction for DMA */ ++#define DMA_RX 2 /* RX direction for DMA */ ++ ++/* map/unmap shared (dma-able) memory */ ++#define DMA_UNMAP(osh, pa, size, direction, p, dmah) \ ++ osl_dma_unmap((osh), (pa), (size), (direction)) ++extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction); ++extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction); ++ ++/* API for DMA addressing capability */ ++#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0) ++ ++/* register access macros */ ++ #include ++ #define OSL_WRITE_REG(osh, r, v) (bcmsdh_reg_write(NULL, (uintptr)(r), sizeof(*(r)), (v))) ++ #define OSL_READ_REG(osh, r) (bcmsdh_reg_read(NULL, (uintptr)(r), sizeof(*(r)))) ++ ++ #define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \ ++ mmap_op else bus_op ++ #define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \ ++ mmap_op : bus_op ++ ++#define OSL_ERROR(bcmerror) osl_error(bcmerror) ++extern int osl_error(int bcmerror); ++ ++/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */ ++#define PKTBUFSZ 2048 /* largest reasonable packet buffer, driver uses for ethernet MTU */ ++ ++/* ++ * BINOSL selects the slightly slower function-call-based binary compatible osl. ++ * Macros expand to calls to functions defined in linux_osl.c . ++ */ ++#include /* use current 2.4.x calling conventions */ ++#include /* for vsn/printf's */ ++#include /* for mem*, str* */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 29) ++#define OSL_SYSUPTIME() ((uint32)jiffies_to_msecs(jiffies)) ++#else ++#define OSL_SYSUPTIME() ((uint32)jiffies * (1000 / HZ)) ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 29) */ ++#define printf(fmt, args...) pr_info(fmt , ## args) ++#include /* for vsn/printf's */ ++#include /* for mem*, str* */ ++/* bcopy's: Linux kernel doesn't provide these (anymore) */ ++#define bcopy(src, dst, len) memcpy((dst), (src), (len)) ++#define bcmp(b1, b2, len) memcmp((b1), (b2), (len)) ++#define bzero(b, len) memset((b), '\0', (len)) ++ ++/* register access macros */ ++ ++#define R_REG(osh, r) (\ ++ SELECT_BUS_READ(osh, \ ++ ({ \ ++ __typeof(*(r)) __osl_v; \ ++ BCM_REFERENCE(osh); \ ++ switch (sizeof(*(r))) { \ ++ case sizeof(uint8): __osl_v = \ ++ readb((volatile uint8*)(r)); break; \ ++ case sizeof(uint16): __osl_v = \ ++ readw((volatile uint16*)(r)); break; \ ++ case sizeof(uint32): __osl_v = \ ++ readl((volatile uint32*)(r)); break; \ ++ } \ ++ __osl_v; \ ++ }), \ ++ OSL_READ_REG(osh, r)) \ ++) ++ ++#define W_REG(osh, r, v) do { \ ++ BCM_REFERENCE(osh); \ ++ SELECT_BUS_WRITE(osh, \ ++ switch (sizeof(*(r))) { \ ++ case sizeof(uint8): writeb((uint8)(v), (volatile uint8*)(r)); break; \ ++ case sizeof(uint16): writew((uint16)(v), (volatile uint16*)(r)); break; \ ++ case sizeof(uint32): writel((uint32)(v), (volatile uint32*)(r)); break; \ ++ }, \ ++ (OSL_WRITE_REG(osh, r, v))); \ ++ } while (0) ++ ++#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v)) ++#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v)) ++ ++/* bcopy, bcmp, and bzero functions */ ++#define bcopy(src, dst, len) memcpy((dst), (src), (len)) ++#define bcmp(b1, b2, len) memcmp((b1), (b2), (len)) ++#define bzero(b, len) memset((b), '\0', (len)) ++ ++/* uncached/cached virtual address */ ++#define OSL_UNCACHED(va) ((void *)va) ++#define OSL_CACHED(va) ((void *)va) ++ ++#define OSL_PREF_RANGE_LD(va, sz) ++#define OSL_PREF_RANGE_ST(va, sz) ++ ++/* get processor cycle count */ ++#if defined(__i386__) ++#define OSL_GETCYCLES(x) rdtscl((x)) ++#else ++#define OSL_GETCYCLES(x) ((x) = 0) ++#endif ++ ++/* dereference an address that may cause a bus exception */ ++#define BUSPROBE(val, addr) ({ (val) = R_REG(NULL, (addr)); 0; }) ++ ++/* map/unmap physical to virtual I/O */ ++#if !defined(CONFIG_MMC_MSM7X00A) ++#define REG_MAP(pa, size) ioremap_nocache((unsigned long)(pa), (unsigned long)(size)) ++#else ++#define REG_MAP(pa, size) (void *)(0) ++#endif /* !defined(CONFIG_MMC_MSM7X00A */ ++#define REG_UNMAP(va) iounmap((va)) ++ ++/* shared (dma-able) memory access macros */ ++#define R_SM(r) *(r) ++#define W_SM(r, v) (*(r) = (v)) ++#define BZERO_SM(r, len) memset((r), '\0', (len)) ++ ++/* Because the non BINOSL implemenation of the PKT OSL routines are macros (for ++ * performance reasons), we need the Linux headers. ++ */ ++#include /* use current 2.4.x calling conventions */ ++ ++/* packet primitives */ ++#define PKTGET(osh, len, send) osl_pktget((osh), (len)) ++#define PKTDUP(osh, skb) osl_pktdup((osh), (skb)) ++#define PKTLIST_DUMP(osh, buf) ++#define PKTDBG_TRACE(osh, pkt, bit) ++#define PKTFREE(osh, skb, send) osl_pktfree((osh), (skb), (send)) ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++#define PKTGET_STATIC(osh, len, send) osl_pktget_static((osh), (len)) ++#define PKTFREE_STATIC(osh, skb, send) osl_pktfree_static((osh), (skb), (send)) ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++#define PKTDATA(osh, skb) (((struct sk_buff*)(skb))->data) ++#define PKTLEN(osh, skb) (((struct sk_buff*)(skb))->len) ++#define PKTHEADROOM(osh, skb) (PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head)) ++#define PKTTAILROOM(osh, skb) ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail)) ++#define PKTNEXT(osh, skb) (((struct sk_buff*)(skb))->next) ++#define PKTSETNEXT(osh, skb, x) (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x)) ++#define PKTSETLEN(osh, skb, len) __skb_trim((struct sk_buff*)(skb), (len)) ++#define PKTPUSH(osh, skb, bytes) skb_push((struct sk_buff*)(skb), (bytes)) ++#define PKTPULL(osh, skb, bytes) skb_pull((struct sk_buff*)(skb), (bytes)) ++#define PKTTAG(skb) ((void*)(((struct sk_buff*)(skb))->cb)) ++#define PKTALLOCED(osh) ((osl_pubinfo_t *)(osh))->pktalloced ++#define PKTSETPOOL(osh, skb, x, y) do {} while (0) ++#define PKTPOOL(osh, skb) FALSE ++#define PKTSHRINK(osh, m) (m) ++ ++#ifdef CTFPOOL ++#define CTFPOOL_REFILL_THRESH 3 ++typedef struct ctfpool { ++ void *head; ++ spinlock_t lock; ++ uint max_obj; ++ uint curr_obj; ++ uint obj_size; ++ uint refills; ++ uint fast_allocs; ++ uint fast_frees; ++ uint slow_allocs; ++} ctfpool_t; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) ++#define FASTBUF (1 << 16) ++#define CTFBUF (1 << 17) ++#define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= FASTBUF) ++#define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~FASTBUF)) ++#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) |= CTFBUF) ++#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) &= (~CTFBUF)) ++#define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & FASTBUF) ++#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->mac_len) & CTFBUF) ++#define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->mac_len) ++#else ++#define FASTBUF (1 << 0) ++#define CTFBUF (1 << 1) ++#define PKTSETFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= FASTBUF) ++#define PKTCLRFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~FASTBUF)) ++#define PKTSETCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) |= CTFBUF) ++#define PKTCLRCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) &= (~CTFBUF)) ++#define PKTISFAST(osh, skb) ((((struct sk_buff*)(skb))->__unused) & FASTBUF) ++#define PKTISCTF(osh, skb) ((((struct sk_buff*)(skb))->__unused) & CTFBUF) ++#define PKTFAST(osh, skb) (((struct sk_buff*)(skb))->__unused) ++#endif /* 2.6.22 */ ++ ++#define CTFPOOLPTR(osh, skb) (((struct sk_buff*)(skb))->sk) ++#define CTFPOOLHEAD(osh, skb) (((ctfpool_t *)((struct sk_buff*)(skb))->sk)->head) ++ ++extern void *osl_ctfpool_add(osl_t *osh); ++extern void osl_ctfpool_replenish(osl_t *osh, uint thresh); ++extern int32 osl_ctfpool_init(osl_t *osh, uint numobj, uint size); ++extern void osl_ctfpool_cleanup(osl_t *osh); ++extern void osl_ctfpool_stats(osl_t *osh, void *b); ++#endif /* CTFPOOL */ ++ ++ ++#ifdef HNDCTF ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) ++#define SKIPCT (1 << 18) ++#define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len |= SKIPCT) ++#define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len &= (~SKIPCT)) ++#define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->mac_len & SKIPCT) ++#else /* 2.6.22 */ ++#define SKIPCT (1 << 2) ++#define PKTSETSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused |= SKIPCT) ++#define PKTCLRSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused &= (~SKIPCT)) ++#define PKTSKIPCT(osh, skb) (((struct sk_buff*)(skb))->__unused & SKIPCT) ++#endif /* 2.6.22 */ ++#else /* HNDCTF */ ++#define PKTSETSKIPCT(osh, skb) ++#define PKTCLRSKIPCT(osh, skb) ++#define PKTSKIPCT(osh, skb) ++#endif /* HNDCTF */ ++ ++extern void osl_pktfree(osl_t *osh, void *skb, bool send); ++extern void *osl_pktget_static(osl_t *osh, uint len); ++extern void osl_pktfree_static(osl_t *osh, void *skb, bool send); ++ ++extern void *osl_pkt_frmnative(osl_t *osh, void *skb); ++extern void *osl_pktget(osl_t *osh, uint len); ++extern void *osl_pktdup(osl_t *osh, void *skb); ++extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt); ++#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_t *)osh), (struct sk_buff*)(skb)) ++#define PKTTONATIVE(osh, pkt) osl_pkt_tonative((osl_t *)(osh), (pkt)) ++ ++#define PKTLINK(skb) (((struct sk_buff*)(skb))->prev) ++#define PKTSETLINK(skb, x) (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x)) ++#define PKTPRIO(skb) (((struct sk_buff*)(skb))->priority) ++#define PKTSETPRIO(skb, x) (((struct sk_buff*)(skb))->priority = (x)) ++#define PKTSUMNEEDED(skb) (((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW) ++#define PKTSETSUMGOOD(skb, x) (((struct sk_buff*)(skb))->ip_summed = \ ++ ((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE)) ++/* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */ ++#define PKTSHARED(skb) (((struct sk_buff*)(skb))->cloned) ++ ++#define DMA_MAP(osh, va, size, direction, p, dmah) \ ++ osl_dma_map((osh), (va), (size), (direction)) ++ ++#ifdef PKTC ++/* Use 8 bytes of skb tstamp field to store below info */ ++struct chain_node { ++ struct sk_buff *link; ++ unsigned int flags:3, pkts:9, bytes:20; ++}; ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) ++#define CHAIN_NODE(skb) ((struct chain_node*)&(((struct sk_buff*)skb)->tstamp)) ++#else ++#define CHAIN_NODE(skb) ((struct chain_node*)&(((struct sk_buff*)skb)->stamp)) ++#endif ++ ++#define PKTCCNT(skb) (CHAIN_NODE(skb)->pkts) ++#define PKTCLEN(skb) (CHAIN_NODE(skb)->bytes) ++#define PKTCFLAGS(skb) (CHAIN_NODE(skb)->flags) ++#define PKTCSETCNT(skb, c) (CHAIN_NODE(skb)->pkts = (c) & ((1 << 9) - 1)) ++#define PKTCSETLEN(skb, l) (CHAIN_NODE(skb)->bytes = (l) & ((1 << 20) - 1)) ++#define PKTCSETFLAG(skb, fb) (CHAIN_NODE(skb)->flags |= (fb)) ++#define PKTCCLRFLAG(skb, fb) (CHAIN_NODE(skb)->flags &= ~(fb)) ++#define PKTCLINK(skb) (CHAIN_NODE(skb)->link) ++#define PKTSETCLINK(skb, x) (CHAIN_NODE(skb)->link = (struct sk_buff*)(x)) ++#define PKTISCHAINED(skb) (PKTCLINK(skb) != NULL) ++#define FOREACH_CHAINED_PKT(skb, nskb) \ ++ for (; (skb) != NULL; (skb) = (nskb)) \ ++ if ((nskb) = PKTCLINK(skb), PKTSETCLINK((skb), NULL), 1) ++#define PKTCFREE(osh, skb, send) \ ++do { \ ++ void *nskb; \ ++ ASSERT((skb) != NULL); \ ++ FOREACH_CHAINED_PKT((skb), nskb) { \ ++ PKTFREE((osh), (skb), (send)); \ ++ } \ ++} while (0) ++#endif /* PKTC */ ++ ++#else /* ! BCMDRIVER */ ++ ++ ++/* ASSERT */ ++ #define ASSERT(exp) do {} while (0) ++ ++/* MALLOC and MFREE */ ++#define MALLOC(o, l) malloc(l) ++#define MFREE(o, p, l) free(p) ++#include ++ ++/* str* and mem* functions */ ++#include ++ ++/* *printf functions */ ++#include ++ ++/* bcopy, bcmp, and bzero */ ++extern void bcopy(const void *src, void *dst, size_t len); ++extern int bcmp(const void *b1, const void *b2, size_t len); ++extern void bzero(void *b, size_t len); ++#endif /* ! BCMDRIVER */ ++ ++#endif /* _linux_osl_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/linuxver.h b/drivers/net/wireless/ap6210/include/linuxver.h +new file mode 100644 +index 0000000..e01b8f0 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/linuxver.h +@@ -0,0 +1,652 @@ ++/* ++ * Linux-specific abstractions to gain some independence from linux kernel versions. ++ * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: linuxver.h 366812 2012-11-05 13:49:32Z $ ++ */ ++ ++#ifndef _linuxver_h_ ++#define _linuxver_h_ ++ ++#include ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++#include ++#else ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)) ++#include ++#else ++#include ++#endif ++#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) */ ++#include ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)) ++/* __NO_VERSION__ must be defined for all linkables except one in 2.2 */ ++#ifdef __UNDEF_NO_VERSION__ ++#undef __NO_VERSION__ ++#else ++#define __NO_VERSION__ ++#endif ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) ++#define module_param(_name_, _type_, _perm_) MODULE_PARM(_name_, "i") ++#define module_param_string(_name_, _string_, _size_, _perm_) \ ++ MODULE_PARM(_string_, "c" __MODULE_STRING(_size_)) ++#endif ++ ++/* linux/malloc.h is deprecated, use linux/slab.h instead. */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 9)) ++#include ++#else ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++#include ++#else ++#include ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) */ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) ++#undef IP_TOS ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) */ ++#include ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41)) ++#include ++#else ++#include ++#ifndef work_struct ++#define work_struct tq_struct ++#endif ++#ifndef INIT_WORK ++#define INIT_WORK(_work, _func, _data) INIT_TQUEUE((_work), (_func), (_data)) ++#endif ++#ifndef schedule_work ++#define schedule_work(_work) schedule_task((_work)) ++#endif ++#ifndef flush_scheduled_work ++#define flush_scheduled_work() flush_scheduled_tasks() ++#endif ++#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41) */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++#define DAEMONIZE(a) daemonize(a); \ ++ allow_signal(SIGKILL); \ ++ allow_signal(SIGTERM); ++#else /* Linux 2.4 (w/o preemption patch) */ ++#define RAISE_RX_SOFTIRQ() \ ++ cpu_raise_softirq(smp_processor_id(), NET_RX_SOFTIRQ) ++#define DAEMONIZE(a) daemonize(); \ ++ do { if (a) \ ++ strncpy(current->comm, a, MIN(sizeof(current->comm), (strlen(a)))); \ ++ } while (0); ++#endif /* LINUX_VERSION_CODE */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) ++#define MY_INIT_WORK(_work, _func) INIT_WORK(_work, _func) ++#else ++#define MY_INIT_WORK(_work, _func) INIT_WORK(_work, _func, _work) ++#if !(LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 18) && defined(RHEL_MAJOR) && \ ++ (RHEL_MAJOR == 5)) ++/* Exclude RHEL 5 */ ++typedef void (*work_func_t)(void *work); ++#endif ++#endif /* >= 2.6.20 */ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++/* Some distributions have their own 2.6.x compatibility layers */ ++#ifndef IRQ_NONE ++typedef void irqreturn_t; ++#define IRQ_NONE ++#define IRQ_HANDLED ++#define IRQ_RETVAL(x) ++#endif ++#else ++typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) ++#define IRQF_SHARED SA_SHIRQ ++#endif /* < 2.6.18 */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 17) ++#ifdef CONFIG_NET_RADIO ++#define CONFIG_WIRELESS_EXT ++#endif ++#endif /* < 2.6.17 */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 67) ++#define MOD_INC_USE_COUNT ++#define MOD_DEC_USE_COUNT ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 67) */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) ++#include ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) ++#include ++#endif ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) ++#include ++#else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) ++#include ++#endif ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30) */ ++ ++ ++ ++#ifndef __exit ++#define __exit ++#endif ++#ifndef __devexit ++#define __devexit ++#endif ++#ifndef __devinit ++#define __devinit __init ++#endif ++#ifndef __devinitdata ++#define __devinitdata ++#endif ++#ifndef __devexit_p ++#define __devexit_p(x) x ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)) ++ ++#define pci_get_drvdata(dev) (dev)->sysdata ++#define pci_set_drvdata(dev, value) (dev)->sysdata = (value) ++ ++/* ++ * New-style (2.4.x) PCI/hot-pluggable PCI/CardBus registration ++ */ ++ ++struct pci_device_id { ++ unsigned int vendor, device; /* Vendor and device ID or PCI_ANY_ID */ ++ unsigned int subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */ ++ unsigned int class, class_mask; /* (class,subclass,prog-if) triplet */ ++ unsigned long driver_data; /* Data private to the driver */ ++}; ++ ++struct pci_driver { ++ struct list_head node; ++ char *name; ++ const struct pci_device_id *id_table; /* NULL if wants all devices */ ++ int (*probe)(struct pci_dev *dev, ++ const struct pci_device_id *id); /* New device inserted */ ++ void (*remove)(struct pci_dev *dev); /* Device removed (NULL if not a hot-plug ++ * capable driver) ++ */ ++ void (*suspend)(struct pci_dev *dev); /* Device suspended */ ++ void (*resume)(struct pci_dev *dev); /* Device woken up */ ++}; ++ ++#define MODULE_DEVICE_TABLE(type, name) ++#define PCI_ANY_ID (~0) ++ ++/* compatpci.c */ ++#define pci_module_init pci_register_driver ++extern int pci_register_driver(struct pci_driver *drv); ++extern void pci_unregister_driver(struct pci_driver *drv); ++ ++#endif /* PCI registration */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)) ++#define pci_module_init pci_register_driver ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18)) ++#ifdef MODULE ++#define module_init(x) int init_module(void) { return x(); } ++#define module_exit(x) void cleanup_module(void) { x(); } ++#else ++#define module_init(x) __initcall(x); ++#define module_exit(x) __exitcall(x); ++#endif ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18) */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) ++#define WL_USE_NETDEV_OPS ++#else ++#undef WL_USE_NETDEV_OPS ++#endif ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) && defined(CONFIG_RFKILL) ++#define WL_CONFIG_RFKILL ++#else ++#undef WL_CONFIG_RFKILL ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 48)) ++#define list_for_each(pos, head) \ ++ for (pos = (head)->next; pos != (head); pos = pos->next) ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 13)) ++#define pci_resource_start(dev, bar) ((dev)->base_address[(bar)]) ++#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 44)) ++#define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start) ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 23)) ++#define pci_enable_device(dev) do { } while (0) ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14)) ++#define net_device device ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 42)) ++ ++/* ++ * DMA mapping ++ * ++ * See linux/Documentation/DMA-mapping.txt ++ */ ++ ++#ifndef PCI_DMA_TODEVICE ++#define PCI_DMA_TODEVICE 1 ++#define PCI_DMA_FROMDEVICE 2 ++#endif ++ ++typedef u32 dma_addr_t; ++ ++/* Pure 2^n version of get_order */ ++static inline int get_order(unsigned long size) ++{ ++ int order; ++ ++ size = (size-1) >> (PAGE_SHIFT-1); ++ order = -1; ++ do { ++ size >>= 1; ++ order++; ++ } while (size); ++ return order; ++} ++ ++static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, ++ dma_addr_t *dma_handle) ++{ ++ void *ret; ++ int gfp = GFP_ATOMIC | GFP_DMA; ++ ++ ret = (void *)__get_free_pages(gfp, get_order(size)); ++ ++ if (ret != NULL) { ++ memset(ret, 0, size); ++ *dma_handle = virt_to_bus(ret); ++ } ++ return ret; ++} ++static inline void pci_free_consistent(struct pci_dev *hwdev, size_t size, ++ void *vaddr, dma_addr_t dma_handle) ++{ ++ free_pages((unsigned long)vaddr, get_order(size)); ++} ++#define pci_map_single(cookie, address, size, dir) virt_to_bus(address) ++#define pci_unmap_single(cookie, address, size, dir) ++ ++#endif /* DMA mapping */ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 43)) ++ ++#define dev_kfree_skb_any(a) dev_kfree_skb(a) ++#define netif_down(dev) do { (dev)->start = 0; } while (0) ++ ++/* pcmcia-cs provides its own netdevice compatibility layer */ ++#ifndef _COMPAT_NETDEVICE_H ++ ++/* ++ * SoftNet ++ * ++ * For pre-softnet kernels we need to tell the upper layer not to ++ * re-enter start_xmit() while we are in there. However softnet ++ * guarantees not to enter while we are in there so there is no need ++ * to do the netif_stop_queue() dance unless the transmit queue really ++ * gets stuck. This should also improve performance according to tests ++ * done by Aman Singla. ++ */ ++ ++#define dev_kfree_skb_irq(a) dev_kfree_skb(a) ++#define netif_wake_queue(dev) \ ++ do { clear_bit(0, &(dev)->tbusy); mark_bh(NET_BH); } while (0) ++#define netif_stop_queue(dev) set_bit(0, &(dev)->tbusy) ++ ++static inline void netif_start_queue(struct net_device *dev) ++{ ++ dev->tbusy = 0; ++ dev->interrupt = 0; ++ dev->start = 1; ++} ++ ++#define netif_queue_stopped(dev) (dev)->tbusy ++#define netif_running(dev) (dev)->start ++ ++#endif /* _COMPAT_NETDEVICE_H */ ++ ++#define netif_device_attach(dev) netif_start_queue(dev) ++#define netif_device_detach(dev) netif_stop_queue(dev) ++ ++/* 2.4.x renamed bottom halves to tasklets */ ++#define tasklet_struct tq_struct ++static inline void tasklet_schedule(struct tasklet_struct *tasklet) ++{ ++ queue_task(tasklet, &tq_immediate); ++ mark_bh(IMMEDIATE_BH); ++} ++ ++static inline void tasklet_init(struct tasklet_struct *tasklet, ++ void (*func)(unsigned long), ++ unsigned long data) ++{ ++ tasklet->next = NULL; ++ tasklet->sync = 0; ++ tasklet->routine = (void (*)(void *))func; ++ tasklet->data = (void *)data; ++} ++#define tasklet_kill(tasklet) { do {} while (0); } ++ ++/* 2.4.x introduced del_timer_sync() */ ++#define del_timer_sync(timer) del_timer(timer) ++ ++#else ++ ++#define netif_down(dev) ++ ++#endif /* SoftNet */ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 3)) ++ ++/* ++ * Emit code to initialise a tq_struct's routine and data pointers ++ */ ++#define PREPARE_TQUEUE(_tq, _routine, _data) \ ++ do { \ ++ (_tq)->routine = _routine; \ ++ (_tq)->data = _data; \ ++ } while (0) ++ ++/* ++ * Emit code to initialise all of a tq_struct ++ */ ++#define INIT_TQUEUE(_tq, _routine, _data) \ ++ do { \ ++ INIT_LIST_HEAD(&(_tq)->list); \ ++ (_tq)->sync = 0; \ ++ PREPARE_TQUEUE((_tq), (_routine), (_data)); \ ++ } while (0) ++ ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 3) */ ++ ++/* Power management related macro & routines */ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 9) ++#define PCI_SAVE_STATE(a, b) pci_save_state(a) ++#define PCI_RESTORE_STATE(a, b) pci_restore_state(a) ++#else ++#define PCI_SAVE_STATE(a, b) pci_save_state(a, b) ++#define PCI_RESTORE_STATE(a, b) pci_restore_state(a, b) ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 6)) ++static inline int ++pci_save_state(struct pci_dev *dev, u32 *buffer) ++{ ++ int i; ++ if (buffer) { ++ for (i = 0; i < 16; i++) ++ pci_read_config_dword(dev, i * 4, &buffer[i]); ++ } ++ return 0; ++} ++ ++static inline int ++pci_restore_state(struct pci_dev *dev, u32 *buffer) ++{ ++ int i; ++ ++ if (buffer) { ++ for (i = 0; i < 16; i++) ++ pci_write_config_dword(dev, i * 4, buffer[i]); ++ } ++ /* ++ * otherwise, write the context information we know from bootup. ++ * This works around a problem where warm-booting from Windows ++ * combined with a D3(hot)->D0 transition causes PCI config ++ * header data to be forgotten. ++ */ ++ else { ++ for (i = 0; i < 6; i ++) ++ pci_write_config_dword(dev, ++ PCI_BASE_ADDRESS_0 + (i * 4), ++ pci_resource_start(dev, i)); ++ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); ++ } ++ return 0; ++} ++#endif /* PCI power management */ ++ ++/* Old cp0 access macros deprecated in 2.4.19 */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 19)) ++#define read_c0_count() read_32bit_cp0_register(CP0_COUNT) ++#endif ++ ++/* Module refcount handled internally in 2.6.x */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) ++#ifndef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do {} while (0) ++#define OLD_MOD_INC_USE_COUNT MOD_INC_USE_COUNT ++#define OLD_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT ++#else ++#define OLD_MOD_INC_USE_COUNT do {} while (0) ++#define OLD_MOD_DEC_USE_COUNT do {} while (0) ++#endif ++#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) */ ++#ifndef SET_MODULE_OWNER ++#define SET_MODULE_OWNER(dev) do {} while (0) ++#endif ++#ifndef MOD_INC_USE_COUNT ++#define MOD_INC_USE_COUNT do {} while (0) ++#endif ++#ifndef MOD_DEC_USE_COUNT ++#define MOD_DEC_USE_COUNT do {} while (0) ++#endif ++#define OLD_MOD_INC_USE_COUNT MOD_INC_USE_COUNT ++#define OLD_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) */ ++ ++#ifndef SET_NETDEV_DEV ++#define SET_NETDEV_DEV(net, pdev) do {} while (0) ++#endif ++ ++#ifndef HAVE_FREE_NETDEV ++#define free_netdev(dev) kfree(dev) ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++/* struct packet_type redefined in 2.6.x */ ++#define af_packet_priv data ++#endif ++ ++/* suspend args */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) ++#define DRV_SUSPEND_STATE_TYPE pm_message_t ++#else ++#define DRV_SUSPEND_STATE_TYPE uint32 ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) ++#define CHECKSUM_HW CHECKSUM_PARTIAL ++#endif ++ ++typedef struct { ++ void *parent; /* some external entity that the thread supposed to work for */ ++ struct task_struct *p_task; ++ long thr_pid; ++ int prio; /* priority */ ++ struct semaphore sema; ++ int terminated; ++ struct completion completed; ++} tsk_ctl_t; ++ ++ ++/* requires tsk_ctl_t tsk argument, the caller's priv data is passed in owner ptr */ ++/* note this macro assumes there may be only one context waiting on thread's completion */ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++#define SMP_RD_BARRIER_DEPENDS(x) smp_read_barrier_depends(x) ++#else ++#define SMP_RD_BARRIER_DEPENDS(x) smp_rmb(x) ++#endif ++ ++ ++#define PROC_START(thread_func, owner, tsk_ctl, flags) \ ++{ \ ++ sema_init(&((tsk_ctl)->sema), 0); \ ++ init_completion(&((tsk_ctl)->completed)); \ ++ (tsk_ctl)->parent = owner; \ ++ (tsk_ctl)->terminated = FALSE; \ ++ (tsk_ctl)->thr_pid = kernel_thread(thread_func, tsk_ctl, flags); \ ++ if ((tsk_ctl)->thr_pid > 0) \ ++ wait_for_completion(&((tsk_ctl)->completed)); \ ++} ++ ++#ifdef USE_KTHREAD_API ++#define PROC_START2(thread_func, owner, tsk_ctl, flags, name) \ ++{ \ ++ sema_init(&((tsk_ctl)->sema), 0); \ ++ init_completion(&((tsk_ctl)->completed)); \ ++ (tsk_ctl)->parent = owner; \ ++ (tsk_ctl)->terminated = FALSE; \ ++ (tsk_ctl)->p_task = kthread_run(thread_func, tsk_ctl, (char*)name); \ ++ (tsk_ctl)->thr_pid = (tsk_ctl)->p_task->pid; \ ++} ++#endif ++ ++#define PROC_STOP(tsk_ctl) \ ++{ \ ++ (tsk_ctl)->terminated = TRUE; \ ++ smp_wmb(); \ ++ up(&((tsk_ctl)->sema)); \ ++ wait_for_completion(&((tsk_ctl)->completed)); \ ++ (tsk_ctl)->thr_pid = -1; \ ++} ++ ++/* ----------------------- */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) ++#define KILL_PROC(nr, sig) \ ++{ \ ++struct task_struct *tsk; \ ++struct pid *pid; \ ++pid = find_get_pid((pid_t)nr); \ ++tsk = pid_task(pid, PIDTYPE_PID); \ ++if (tsk) send_sig(sig, tsk, 1); \ ++} ++#else ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) && (LINUX_VERSION_CODE <= \ ++ KERNEL_VERSION(2, 6, 30)) ++#define KILL_PROC(pid, sig) \ ++{ \ ++ struct task_struct *tsk; \ ++ tsk = find_task_by_vpid(pid); \ ++ if (tsk) send_sig(sig, tsk, 1); \ ++} ++#else ++#define KILL_PROC(pid, sig) \ ++{ \ ++ kill_proc(pid, sig, 1); \ ++} ++#endif ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++#include ++#include ++#else ++#include ++ ++#define __wait_event_interruptible_timeout(wq, condition, ret) \ ++do { \ ++ wait_queue_t __wait; \ ++ init_waitqueue_entry(&__wait, current); \ ++ \ ++ add_wait_queue(&wq, &__wait); \ ++ for (;;) { \ ++ set_current_state(TASK_INTERRUPTIBLE); \ ++ if (condition) \ ++ break; \ ++ if (!signal_pending(current)) { \ ++ ret = schedule_timeout(ret); \ ++ if (!ret) \ ++ break; \ ++ continue; \ ++ } \ ++ ret = -ERESTARTSYS; \ ++ break; \ ++ } \ ++ current->state = TASK_RUNNING; \ ++ remove_wait_queue(&wq, &__wait); \ ++} while (0) ++ ++#define wait_event_interruptible_timeout(wq, condition, timeout) \ ++({ \ ++ long __ret = timeout; \ ++ if (!(condition)) \ ++ __wait_event_interruptible_timeout(wq, condition, __ret); \ ++ __ret; \ ++}) ++ ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) */ ++ ++/* ++For < 2.6.24, wl creates its own netdev but doesn't ++align the priv area like the genuine alloc_netdev(). ++Since netdev_priv() always gives us the aligned address, it will ++not match our unaligned address for < 2.6.24 ++*/ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) ++#define DEV_PRIV(dev) (dev->priv) ++#else ++#define DEV_PRIV(dev) netdev_priv(dev) ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20) ++#define WL_ISR(i, d, p) wl_isr((i), (d)) ++#else ++#define WL_ISR(i, d, p) wl_isr((i), (d), (p)) ++#endif /* < 2.6.20 */ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) ++#define netdev_priv(dev) dev->priv ++#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) */ ++ ++#endif /* _linuxver_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/miniopt.h b/drivers/net/wireless/ap6210/include/miniopt.h +new file mode 100644 +index 0000000..c1eca68 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/miniopt.h +@@ -0,0 +1,77 @@ ++/* ++ * Command line options parser. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: miniopt.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++ ++#ifndef MINI_OPT_H ++#define MINI_OPT_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* ---- Include Files ---------------------------------------------------- */ ++/* ---- Constants and Types ---------------------------------------------- */ ++ ++#define MINIOPT_MAXKEY 128 /* Max options */ ++typedef struct miniopt { ++ ++ /* These are persistent after miniopt_init() */ ++ const char* name; /* name for prompt in error strings */ ++ const char* flags; /* option chars that take no args */ ++ bool longflags; /* long options may be flags */ ++ bool opt_end; /* at end of options (passed a "--") */ ++ ++ /* These are per-call to miniopt() */ ++ ++ int consumed; /* number of argv entries cosumed in ++ * the most recent call to miniopt() ++ */ ++ bool positional; ++ bool good_int; /* 'val' member is the result of a sucessful ++ * strtol conversion of the option value ++ */ ++ char opt; ++ char key[MINIOPT_MAXKEY]; ++ char* valstr; /* positional param, or value for the option, ++ * or null if the option had ++ * no accompanying value ++ */ ++ uint uval; /* strtol translation of valstr */ ++ int val; /* strtol translation of valstr */ ++} miniopt_t; ++ ++void miniopt_init(miniopt_t *t, const char* name, const char* flags, bool longflags); ++int miniopt(miniopt_t *t, char **argv); ++ ++ ++/* ---- Variable Externs ------------------------------------------------- */ ++/* ---- Function Prototypes ---------------------------------------------- */ ++ ++ ++#ifdef __cplusplus ++ } ++#endif ++ ++#endif /* MINI_OPT_H */ +diff --git a/drivers/net/wireless/ap6210/include/msgtrace.h b/drivers/net/wireless/ap6210/include/msgtrace.h +new file mode 100644 +index 0000000..7c5fd81 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/msgtrace.h +@@ -0,0 +1,74 @@ ++/* ++ * Trace messages sent over HBUS ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: msgtrace.h 281527 2011-09-02 17:12:53Z $ ++ */ ++ ++#ifndef _MSGTRACE_H ++#define _MSGTRACE_H ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++#define MSGTRACE_VERSION 1 ++ ++/* Message trace header */ ++typedef BWL_PRE_PACKED_STRUCT struct msgtrace_hdr { ++ uint8 version; ++ uint8 spare; ++ uint16 len; /* Len of the trace */ ++ uint32 seqnum; /* Sequence number of message. Useful if the messsage has been lost ++ * because of DMA error or a bus reset (ex: SDIO Func2) ++ */ ++ uint32 discarded_bytes; /* Number of discarded bytes because of trace overflow */ ++ uint32 discarded_printf; /* Number of discarded printf because of trace overflow */ ++} BWL_POST_PACKED_STRUCT msgtrace_hdr_t; ++ ++#define MSGTRACE_HDRLEN sizeof(msgtrace_hdr_t) ++ ++/* The hbus driver generates traces when sending a trace message. This causes endless traces. ++ * This flag must be set to TRUE in any hbus traces. The flag is reset in the function msgtrace_put. ++ * This prevents endless traces but generates hasardous lost of traces only in bus device code. ++ * It is recommendat to set this flag in macro SD_TRACE but not in SD_ERROR for avoiding missing ++ * hbus error traces. hbus error trace should not generates endless traces. ++ */ ++extern bool msgtrace_hbus_trace; ++ ++typedef void (*msgtrace_func_send_t)(void *hdl1, void *hdl2, uint8 *hdr, ++ uint16 hdrlen, uint8 *buf, uint16 buflen); ++extern void msgtrace_start(void); ++extern void msgtrace_stop(void); ++extern void msgtrace_sent(void); ++extern void msgtrace_put(char *buf, int count); ++extern void msgtrace_init(void *hdl1, void *hdl2, msgtrace_func_send_t func_send); ++extern bool msgtrace_event_enabled(void); ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _MSGTRACE_H */ +diff --git a/drivers/net/wireless/ap6210/include/osl.h b/drivers/net/wireless/ap6210/include/osl.h +new file mode 100644 +index 0000000..0a11d23 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/osl.h +@@ -0,0 +1,90 @@ ++/* ++ * OS Abstraction Layer ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: osl.h 320905 2012-03-13 15:33:25Z $ ++ */ ++ ++#ifndef _osl_h_ ++#define _osl_h_ ++ ++/* osl handle type forward declaration */ ++typedef struct osl_info osl_t; ++typedef struct osl_dmainfo osldma_t; ++ ++#define OSL_PKTTAG_SZ 32 /* Size of PktTag */ ++ ++/* Drivers use PKTFREESETCB to register a callback function when a packet is freed by OSL */ ++typedef void (*pktfree_cb_fn_t)(void *ctx, void *pkt, unsigned int status); ++ ++/* Drivers use REGOPSSET() to register register read/write funcitons */ ++typedef unsigned int (*osl_rreg_fn_t)(void *ctx, volatile void *reg, unsigned int size); ++typedef void (*osl_wreg_fn_t)(void *ctx, volatile void *reg, unsigned int val, unsigned int size); ++ ++ ++#include ++ ++#ifndef PKTDBG_TRACE ++#define PKTDBG_TRACE(osh, pkt, bit) ++#endif ++ ++#define PKTCTFMAP(osh, p) ++ ++/* -------------------------------------------------------------------------- ++** Register manipulation macros. ++*/ ++ ++#define SET_REG(osh, r, mask, val) W_REG((osh), (r), ((R_REG((osh), r) & ~(mask)) | (val))) ++ ++#ifndef AND_REG ++#define AND_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) & (v)) ++#endif /* !AND_REG */ ++ ++#ifndef OR_REG ++#define OR_REG(osh, r, v) W_REG(osh, (r), R_REG(osh, r) | (v)) ++#endif /* !OR_REG */ ++ ++#if !defined(OSL_SYSUPTIME) ++#define OSL_SYSUPTIME() (0) ++#define OSL_SYSUPTIME_SUPPORT FALSE ++#else ++#define OSL_SYSUPTIME_SUPPORT TRUE ++#endif /* OSL_SYSUPTIME */ ++ ++#if !defined(PKTC) ++#define PKTCCNT(skb) (0) ++#define PKTCLEN(skb) (0) ++#define PKTCFLAGS(skb) (0) ++#define PKTCSETCNT(skb, c) ++#define PKTCSETLEN(skb, l) ++#define PKTCSETFLAG(skb, fb) ++#define PKTCCLRFLAG(skb, fb) ++#define PKTCLINK(skb) PKTLINK(skb) ++#define PKTSETCLINK(skb, x) PKTSETLINK((skb), (x)) ++#define PKTISCHAINED(skb) FALSE ++#define FOREACH_CHAINED_PKT(skb, nskb) \ ++ for ((nskb) = NULL; (skb) != NULL; (skb) = (nskb)) ++#define PKTCFREE PKTFREE ++#endif ++ ++ ++#endif /* _osl_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/packed_section_end.h b/drivers/net/wireless/ap6210/include/packed_section_end.h +new file mode 100644 +index 0000000..0779b04 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/packed_section_end.h +@@ -0,0 +1,59 @@ ++/* ++ * Declare directives for structure packing. No padding will be provided ++ * between the members of packed structures, and therefore, there is no ++ * guarantee that structure members will be aligned. ++ * ++ * Declaring packed structures is compiler specific. In order to handle all ++ * cases, packed structures should be delared as: ++ * ++ * #include ++ * ++ * typedef BWL_PRE_PACKED_STRUCT struct foobar_t { ++ * some_struct_members; ++ * } BWL_POST_PACKED_STRUCT foobar_t; ++ * ++ * #include ++ * ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: packed_section_end.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++ ++/* Error check - BWL_PACKED_SECTION is defined in packed_section_start.h ++ * and undefined in packed_section_end.h. If it is NOT defined at this ++ * point, then there is a missing include of packed_section_start.h. ++ */ ++#ifdef BWL_PACKED_SECTION ++ #undef BWL_PACKED_SECTION ++#else ++ #error "BWL_PACKED_SECTION is NOT defined!" ++#endif ++ ++ ++ ++ ++/* Compiler-specific directives for structure packing are declared in ++ * packed_section_start.h. This marks the end of the structure packing section, ++ * so, undef them here. ++ */ ++#undef BWL_PRE_PACKED_STRUCT ++#undef BWL_POST_PACKED_STRUCT +diff --git a/drivers/net/wireless/ap6210/include/packed_section_start.h b/drivers/net/wireless/ap6210/include/packed_section_start.h +new file mode 100644 +index 0000000..ee93a4b +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/packed_section_start.h +@@ -0,0 +1,63 @@ ++/* ++ * Declare directives for structure packing. No padding will be provided ++ * between the members of packed structures, and therefore, there is no ++ * guarantee that structure members will be aligned. ++ * ++ * Declaring packed structures is compiler specific. In order to handle all ++ * cases, packed structures should be delared as: ++ * ++ * #include ++ * ++ * typedef BWL_PRE_PACKED_STRUCT struct foobar_t { ++ * some_struct_members; ++ * } BWL_POST_PACKED_STRUCT foobar_t; ++ * ++ * #include ++ * ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: packed_section_start.h 286783 2011-09-29 06:18:57Z $ ++ */ ++ ++ ++/* Error check - BWL_PACKED_SECTION is defined in packed_section_start.h ++ * and undefined in packed_section_end.h. If it is already defined at this ++ * point, then there is a missing include of packed_section_end.h. ++ */ ++#ifdef BWL_PACKED_SECTION ++ #error "BWL_PACKED_SECTION is already defined!" ++#else ++ #define BWL_PACKED_SECTION ++#endif ++ ++ ++ ++ ++/* Declare compiler-specific directives for structure packing. */ ++#if defined(__GNUC__) || defined(__lint) ++ #define BWL_PRE_PACKED_STRUCT ++ #define BWL_POST_PACKED_STRUCT __attribute__ ((packed)) ++#elif defined(__CC_ARM) ++ #define BWL_PRE_PACKED_STRUCT __packed ++ #define BWL_POST_PACKED_STRUCT ++#else ++ #error "Unknown compiler!" ++#endif +diff --git a/drivers/net/wireless/ap6210/include/pcicfg.h b/drivers/net/wireless/ap6210/include/pcicfg.h +new file mode 100644 +index 0000000..0278bb2 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/pcicfg.h +@@ -0,0 +1,100 @@ ++/* ++ * pcicfg.h: PCI configuration constants and structures. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: pcicfg.h 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#ifndef _h_pcicfg_ ++#define _h_pcicfg_ ++ ++/* A structure for the config registers is nice, but in most ++ * systems the config space is not memory mapped, so we need ++ * field offsetts. :-( ++ */ ++#define PCI_CFG_VID 0 ++#define PCI_CFG_DID 2 ++#define PCI_CFG_CMD 4 ++#define PCI_CFG_STAT 6 ++#define PCI_CFG_REV 8 ++#define PCI_CFG_PROGIF 9 ++#define PCI_CFG_SUBCL 0xa ++#define PCI_CFG_BASECL 0xb ++#define PCI_CFG_CLSZ 0xc ++#define PCI_CFG_LATTIM 0xd ++#define PCI_CFG_HDR 0xe ++#define PCI_CFG_BIST 0xf ++#define PCI_CFG_BAR0 0x10 ++#define PCI_CFG_BAR1 0x14 ++#define PCI_CFG_BAR2 0x18 ++#define PCI_CFG_BAR3 0x1c ++#define PCI_CFG_BAR4 0x20 ++#define PCI_CFG_BAR5 0x24 ++#define PCI_CFG_CIS 0x28 ++#define PCI_CFG_SVID 0x2c ++#define PCI_CFG_SSID 0x2e ++#define PCI_CFG_ROMBAR 0x30 ++#define PCI_CFG_CAPPTR 0x34 ++#define PCI_CFG_INT 0x3c ++#define PCI_CFG_PIN 0x3d ++#define PCI_CFG_MINGNT 0x3e ++#define PCI_CFG_MAXLAT 0x3f ++#define PCI_BAR0_WIN 0x80 /* backplane addres space accessed by BAR0 */ ++#define PCI_BAR1_WIN 0x84 /* backplane addres space accessed by BAR1 */ ++#define PCI_SPROM_CONTROL 0x88 /* sprom property control */ ++#define PCI_BAR1_CONTROL 0x8c /* BAR1 region burst control */ ++#define PCI_INT_STATUS 0x90 /* PCI and other cores interrupts */ ++#define PCI_INT_MASK 0x94 /* mask of PCI and other cores interrupts */ ++#define PCI_TO_SB_MB 0x98 /* signal backplane interrupts */ ++#define PCI_BACKPLANE_ADDR 0xa0 /* address an arbitrary location on the system backplane */ ++#define PCI_BACKPLANE_DATA 0xa4 /* data at the location specified by above address */ ++#define PCI_CLK_CTL_ST 0xa8 /* pci config space clock control/status (>=rev14) */ ++#define PCI_BAR0_WIN2 0xac /* backplane addres space accessed by second 4KB of BAR0 */ ++#define PCI_GPIO_IN 0xb0 /* pci config space gpio input (>=rev3) */ ++#define PCI_GPIO_OUT 0xb4 /* pci config space gpio output (>=rev3) */ ++#define PCI_GPIO_OUTEN 0xb8 /* pci config space gpio output enable (>=rev3) */ ++ ++#define PCI_BAR0_SHADOW_OFFSET (2 * 1024) /* bar0 + 2K accesses sprom shadow (in pci core) */ ++#define PCI_BAR0_SPROM_OFFSET (4 * 1024) /* bar0 + 4K accesses external sprom */ ++#define PCI_BAR0_PCIREGS_OFFSET (6 * 1024) /* bar0 + 6K accesses pci core registers */ ++#define PCI_BAR0_PCISBR_OFFSET (4 * 1024) /* pci core SB registers are at the end of the ++ * 8KB window, so their address is the "regular" ++ * address plus 4K ++ */ ++/* ++ * PCIE GEN2 changed some of the above locations for ++ * Bar0WrapperBase, SecondaryBAR0Window and SecondaryBAR0WrapperBase ++ * BAR0 maps 32K of register space ++*/ ++#define PCIE2_BAR0_WIN2 0x70 /* backplane addres space accessed by second 4KB of BAR0 */ ++#define PCIE2_BAR0_CORE2_WIN 0x74 /* backplane addres space accessed by second 4KB of BAR0 */ ++#define PCIE2_BAR0_CORE2_WIN2 0x78 /* backplane addres space accessed by second 4KB of BAR0 */ ++ ++#define PCI_BAR0_WINSZ (16 * 1024) /* bar0 window size Match with corerev 13 */ ++/* On pci corerev >= 13 and all pcie, the bar0 is now 16KB and it maps: */ ++#define PCI_16KB0_PCIREGS_OFFSET (8 * 1024) /* bar0 + 8K accesses pci/pcie core registers */ ++#define PCI_16KB0_CCREGS_OFFSET (12 * 1024) /* bar0 + 12K accesses chipc core registers */ ++#define PCI_16KBB0_WINSZ (16 * 1024) /* bar0 window size */ ++ ++ ++#define PCI_CONFIG_SPACE_SIZE 256 ++#endif /* _h_pcicfg_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/802.11.h b/drivers/net/wireless/ap6210/include/proto/802.11.h +new file mode 100644 +index 0000000..15cd56c +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/802.11.h +@@ -0,0 +1,2355 @@ ++/* ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * Fundamental types and constants relating to 802.11 ++ * ++ * $Id: 802.11.h 346820 2012-07-24 13:53:12Z $ ++ */ ++ ++#ifndef _802_11_H_ ++#define _802_11_H_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++#ifndef _NET_ETHERNET_H_ ++#include ++#endif ++ ++#include ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++ ++#define DOT11_TU_TO_US 1024 /* 802.11 Time Unit is 1024 microseconds */ ++ ++/* Generic 802.11 frame constants */ ++#define DOT11_A3_HDR_LEN 24 /* d11 header length with A3 */ ++#define DOT11_A4_HDR_LEN 30 /* d11 header length with A4 */ ++#define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN /* MAC header length */ ++#define DOT11_FCS_LEN 4 /* d11 FCS length */ ++#define DOT11_ICV_LEN 4 /* d11 ICV length */ ++#define DOT11_ICV_AES_LEN 8 /* d11 ICV/AES length */ ++#define DOT11_QOS_LEN 2 /* d11 QoS length */ ++#define DOT11_HTC_LEN 4 /* d11 HT Control field length */ ++ ++#define DOT11_KEY_INDEX_SHIFT 6 /* d11 key index shift */ ++#define DOT11_IV_LEN 4 /* d11 IV length */ ++#define DOT11_IV_TKIP_LEN 8 /* d11 IV TKIP length */ ++#define DOT11_IV_AES_OCB_LEN 4 /* d11 IV/AES/OCB length */ ++#define DOT11_IV_AES_CCM_LEN 8 /* d11 IV/AES/CCM length */ ++#define DOT11_IV_MAX_LEN 8 /* maximum iv len for any encryption */ ++ ++/* Includes MIC */ ++#define DOT11_MAX_MPDU_BODY_LEN 2304 /* max MPDU body length */ ++/* A4 header + QoS + CCMP + PDU + ICV + FCS = 2352 */ ++#define DOT11_MAX_MPDU_LEN (DOT11_A4_HDR_LEN + \ ++ DOT11_QOS_LEN + \ ++ DOT11_IV_AES_CCM_LEN + \ ++ DOT11_MAX_MPDU_BODY_LEN + \ ++ DOT11_ICV_LEN + \ ++ DOT11_FCS_LEN) /* d11 max MPDU length */ ++ ++#define DOT11_MAX_SSID_LEN 32 /* d11 max ssid length */ ++ ++/* dot11RTSThreshold */ ++#define DOT11_DEFAULT_RTS_LEN 2347 /* d11 default RTS length */ ++#define DOT11_MAX_RTS_LEN 2347 /* d11 max RTS length */ ++ ++/* dot11FragmentationThreshold */ ++#define DOT11_MIN_FRAG_LEN 256 /* d11 min fragmentation length */ ++#define DOT11_MAX_FRAG_LEN 2346 /* Max frag is also limited by aMPDUMaxLength ++ * of the attached PHY ++ */ ++#define DOT11_DEFAULT_FRAG_LEN 2346 /* d11 default fragmentation length */ ++ ++/* dot11BeaconPeriod */ ++#define DOT11_MIN_BEACON_PERIOD 1 /* d11 min beacon period */ ++#define DOT11_MAX_BEACON_PERIOD 0xFFFF /* d11 max beacon period */ ++ ++/* dot11DTIMPeriod */ ++#define DOT11_MIN_DTIM_PERIOD 1 /* d11 min DTIM period */ ++#define DOT11_MAX_DTIM_PERIOD 0xFF /* d11 max DTIM period */ ++ ++/* 802.2 LLC/SNAP header used by 802.11 per 802.1H */ ++#define DOT11_LLC_SNAP_HDR_LEN 8 /* d11 LLC/SNAP header length */ ++#define DOT11_OUI_LEN 3 /* d11 OUI length */ ++BWL_PRE_PACKED_STRUCT struct dot11_llc_snap_header { ++ uint8 dsap; /* always 0xAA */ ++ uint8 ssap; /* always 0xAA */ ++ uint8 ctl; /* always 0x03 */ ++ uint8 oui[DOT11_OUI_LEN]; /* RFC1042: 0x00 0x00 0x00 ++ * Bridge-Tunnel: 0x00 0x00 0xF8 ++ */ ++ uint16 type; /* ethertype */ ++} BWL_POST_PACKED_STRUCT; ++ ++/* RFC1042 header used by 802.11 per 802.1H */ ++#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) /* RCF1042 header length */ ++ ++/* Generic 802.11 MAC header */ ++/* ++ * N.B.: This struct reflects the full 4 address 802.11 MAC header. ++ * The fields are defined such that the shorter 1, 2, and 3 ++ * address headers just use the first k fields. ++ */ ++BWL_PRE_PACKED_STRUCT struct dot11_header { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr a1; /* address 1 */ ++ struct ether_addr a2; /* address 2 */ ++ struct ether_addr a3; /* address 3 */ ++ uint16 seq; /* sequence control */ ++ struct ether_addr a4; /* address 4 */ ++} BWL_POST_PACKED_STRUCT; ++ ++/* Control frames */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_rts_frame { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr ra; /* receiver address */ ++ struct ether_addr ta; /* transmitter address */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_RTS_LEN 16 /* d11 RTS frame length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_cts_frame { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr ra; /* receiver address */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_CTS_LEN 10 /* d11 CTS frame length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_ack_frame { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr ra; /* receiver address */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_ACK_LEN 10 /* d11 ACK frame length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_ps_poll_frame { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* AID */ ++ struct ether_addr bssid; /* receiver address, STA in AP */ ++ struct ether_addr ta; /* transmitter address */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_PS_POLL_LEN 16 /* d11 PS poll frame length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_cf_end_frame { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr ra; /* receiver address */ ++ struct ether_addr bssid; /* transmitter address, STA in AP */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_CS_END_LEN 16 /* d11 CF-END frame length */ ++ ++/* RWL wifi protocol: The Vendor Specific Action frame is defined for vendor-specific signaling ++* category+OUI+vendor specific content ( this can be variable) ++*/ ++BWL_PRE_PACKED_STRUCT struct dot11_action_wifi_vendor_specific { ++ uint8 category; ++ uint8 OUI[3]; ++ uint8 type; ++ uint8 subtype; ++ uint8 data[1040]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_action_wifi_vendor_specific dot11_action_wifi_vendor_specific_t; ++ ++/* generic vender specific action frame with variable length */ ++BWL_PRE_PACKED_STRUCT struct dot11_action_vs_frmhdr { ++ uint8 category; ++ uint8 OUI[3]; ++ uint8 type; ++ uint8 subtype; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_action_vs_frmhdr dot11_action_vs_frmhdr_t; ++#define DOT11_ACTION_VS_HDR_LEN 6 ++ ++#define BCM_ACTION_OUI_BYTE0 0x00 ++#define BCM_ACTION_OUI_BYTE1 0x90 ++#define BCM_ACTION_OUI_BYTE2 0x4c ++ ++/* BA/BAR Control parameters */ ++#define DOT11_BA_CTL_POLICY_NORMAL 0x0000 /* normal ack */ ++#define DOT11_BA_CTL_POLICY_NOACK 0x0001 /* no ack */ ++#define DOT11_BA_CTL_POLICY_MASK 0x0001 /* ack policy mask */ ++ ++#define DOT11_BA_CTL_MTID 0x0002 /* multi tid BA */ ++#define DOT11_BA_CTL_COMPRESSED 0x0004 /* compressed bitmap */ ++ ++#define DOT11_BA_CTL_NUMMSDU_MASK 0x0FC0 /* num msdu in bitmap mask */ ++#define DOT11_BA_CTL_NUMMSDU_SHIFT 6 /* num msdu in bitmap shift */ ++ ++#define DOT11_BA_CTL_TID_MASK 0xF000 /* tid mask */ ++#define DOT11_BA_CTL_TID_SHIFT 12 /* tid shift */ ++ ++/* control frame header (BA/BAR) */ ++BWL_PRE_PACKED_STRUCT struct dot11_ctl_header { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr ra; /* receiver address */ ++ struct ether_addr ta; /* transmitter address */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_CTL_HDR_LEN 16 /* control frame hdr len */ ++ ++/* BAR frame payload */ ++BWL_PRE_PACKED_STRUCT struct dot11_bar { ++ uint16 bar_control; /* BAR Control */ ++ uint16 seqnum; /* Starting Sequence control */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_BAR_LEN 4 /* BAR frame payload length */ ++ ++#define DOT11_BA_BITMAP_LEN 128 /* bitmap length */ ++#define DOT11_BA_CMP_BITMAP_LEN 8 /* compressed bitmap length */ ++/* BA frame payload */ ++BWL_PRE_PACKED_STRUCT struct dot11_ba { ++ uint16 ba_control; /* BA Control */ ++ uint16 seqnum; /* Starting Sequence control */ ++ uint8 bitmap[DOT11_BA_BITMAP_LEN]; /* Block Ack Bitmap */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_BA_LEN 4 /* BA frame payload len (wo bitmap) */ ++ ++/* Management frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_management_header { ++ uint16 fc; /* frame control */ ++ uint16 durid; /* duration/ID */ ++ struct ether_addr da; /* receiver address */ ++ struct ether_addr sa; /* transmitter address */ ++ struct ether_addr bssid; /* BSS ID */ ++ uint16 seq; /* sequence control */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_MGMT_HDR_LEN 24 /* d11 management header length */ ++ ++/* Management frame payloads */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_bcn_prb { ++ uint32 timestamp[2]; ++ uint16 beacon_interval; ++ uint16 capability; ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_BCN_PRB_LEN 12 /* 802.11 beacon/probe frame fixed length */ ++#define DOT11_BCN_PRB_FIXED_LEN 12 /* 802.11 beacon/probe frame fixed length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_auth { ++ uint16 alg; /* algorithm */ ++ uint16 seq; /* sequence control */ ++ uint16 status; /* status code */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_AUTH_FIXED_LEN 6 /* length of auth frame without challenge IE */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_assoc_req { ++ uint16 capability; /* capability information */ ++ uint16 listen; /* listen interval */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_ASSOC_REQ_FIXED_LEN 4 /* length of assoc frame without info elts */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_reassoc_req { ++ uint16 capability; /* capability information */ ++ uint16 listen; /* listen interval */ ++ struct ether_addr ap; /* Current AP address */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_REASSOC_REQ_FIXED_LEN 10 /* length of assoc frame without info elts */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_assoc_resp { ++ uint16 capability; /* capability information */ ++ uint16 status; /* status code */ ++ uint16 aid; /* association ID */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_ASSOC_RESP_FIXED_LEN 6 /* length of assoc resp frame without info elts */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_measure { ++ uint8 category; ++ uint8 action; ++ uint8 token; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_ACTION_MEASURE_LEN 3 /* d11 action measurement header length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_ht_ch_width { ++ uint8 category; ++ uint8 action; ++ uint8 ch_width; ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_ht_mimops { ++ uint8 category; ++ uint8 action; ++ uint8 control; ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_sa_query { ++ uint8 category; ++ uint8 action; ++ uint16 id; ++} BWL_POST_PACKED_STRUCT; ++ ++#define SM_PWRSAVE_ENABLE 1 ++#define SM_PWRSAVE_MODE 2 ++ ++/* ************* 802.11h related definitions. ************* */ ++BWL_PRE_PACKED_STRUCT struct dot11_power_cnst { ++ uint8 id; ++ uint8 len; ++ uint8 power; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_power_cnst dot11_power_cnst_t; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_power_cap { ++ uint8 min; ++ uint8 max; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_power_cap dot11_power_cap_t; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_tpc_rep { ++ uint8 id; ++ uint8 len; ++ uint8 tx_pwr; ++ uint8 margin; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_tpc_rep dot11_tpc_rep_t; ++#define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_supp_channels { ++ uint8 id; ++ uint8 len; ++ uint8 first_channel; ++ uint8 num_channels; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_supp_channels dot11_supp_channels_t; ++ ++/* Extension Channel Offset IE: 802.11n-D1.0 spec. added sideband ++ * offset for 40MHz operation. The possible 3 values are: ++ * 1 = above control channel ++ * 3 = below control channel ++ * 0 = no extension channel ++ */ ++BWL_PRE_PACKED_STRUCT struct dot11_extch { ++ uint8 id; /* IE ID, 62, DOT11_MNG_EXT_CHANNEL_OFFSET */ ++ uint8 len; /* IE length */ ++ uint8 extch; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_extch dot11_extch_ie_t; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_brcm_extch { ++ uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ ++ uint8 len; /* IE length */ ++ uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ ++ uint8 type; /* type inidicates what follows */ ++ uint8 extch; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_brcm_extch dot11_brcm_extch_ie_t; ++ ++#define BRCM_EXTCH_IE_LEN 5 ++#define BRCM_EXTCH_IE_TYPE 53 /* 802.11n ID not yet assigned */ ++#define DOT11_EXTCH_IE_LEN 1 ++#define DOT11_EXT_CH_MASK 0x03 /* extension channel mask */ ++#define DOT11_EXT_CH_UPPER 0x01 /* ext. ch. on upper sb */ ++#define DOT11_EXT_CH_LOWER 0x03 /* ext. ch. on lower sb */ ++#define DOT11_EXT_CH_NONE 0x00 /* no extension ch. */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_frmhdr { ++ uint8 category; ++ uint8 action; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_ACTION_FRMHDR_LEN 2 ++ ++/* CSA IE data structure */ ++BWL_PRE_PACKED_STRUCT struct dot11_channel_switch { ++ uint8 id; /* id DOT11_MNG_CHANNEL_SWITCH_ID */ ++ uint8 len; /* length of IE */ ++ uint8 mode; /* mode 0 or 1 */ ++ uint8 channel; /* channel switch to */ ++ uint8 count; /* number of beacons before switching */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_channel_switch dot11_chan_switch_ie_t; ++ ++#define DOT11_SWITCH_IE_LEN 3 /* length of IE data, not including 2 byte header */ ++/* CSA mode - 802.11h-2003 $7.3.2.20 */ ++#define DOT11_CSA_MODE_ADVISORY 0 /* no DOT11_CSA_MODE_NO_TX restriction imposed */ ++#define DOT11_CSA_MODE_NO_TX 1 /* no transmission upon receiving CSA frame. */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_switch_channel { ++ uint8 category; ++ uint8 action; ++ dot11_chan_switch_ie_t chan_switch_ie; /* for switch IE */ ++ dot11_brcm_extch_ie_t extch_ie; /* extension channel offset */ ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_csa_body { ++ uint8 mode; /* mode 0 or 1 */ ++ uint8 reg; /* regulatory class */ ++ uint8 channel; /* channel switch to */ ++ uint8 count; /* number of beacons before switching */ ++} BWL_POST_PACKED_STRUCT; ++ ++/* 11n Extended Channel Switch IE data structure */ ++BWL_PRE_PACKED_STRUCT struct dot11_ext_csa { ++ uint8 id; /* id DOT11_MNG_EXT_CHANNEL_SWITCH_ID */ ++ uint8 len; /* length of IE */ ++ struct dot11_csa_body b; /* body of the ie */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_ext_csa dot11_ext_csa_ie_t; ++#define DOT11_EXT_CSA_IE_LEN 4 /* length of extended channel switch IE body */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_action_ext_csa { ++ uint8 category; ++ uint8 action; ++ dot11_ext_csa_ie_t chan_switch_ie; /* for switch IE */ ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct dot11y_action_ext_csa { ++ uint8 category; ++ uint8 action; ++ struct dot11_csa_body b; /* body of the ie */ ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_obss_coex { ++ uint8 id; ++ uint8 len; ++ uint8 info; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_obss_coex dot11_obss_coex_t; ++#define DOT11_OBSS_COEXINFO_LEN 1 /* length of OBSS Coexistence INFO IE */ ++ ++#define DOT11_OBSS_COEX_INFO_REQ 0x01 ++#define DOT11_OBSS_COEX_40MHZ_INTOLERANT 0x02 ++#define DOT11_OBSS_COEX_20MHZ_WIDTH_REQ 0x04 ++ ++BWL_PRE_PACKED_STRUCT struct dot11_obss_chanlist { ++ uint8 id; ++ uint8 len; ++ uint8 regclass; ++ uint8 chanlist[1]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_obss_chanlist dot11_obss_chanlist_t; ++#define DOT11_OBSS_CHANLIST_FIXED_LEN 1 /* fixed length of regclass */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_extcap_ie { ++ uint8 id; ++ uint8 len; ++ uint8 cap[1]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_extcap_ie dot11_extcap_ie_t; ++ ++#define DOT11_EXTCAP_LEN_MAX 7 ++#define DOT11_EXTCAP_LEN_COEX 1 ++#define DOT11_EXTCAP_LEN_BT 3 ++#define DOT11_EXTCAP_LEN_IW 4 ++#define DOT11_EXTCAP_LEN_SI 6 ++ ++#define DOT11_EXTCAP_LEN_TDLS 5 ++BWL_PRE_PACKED_STRUCT struct dot11_extcap { ++ uint8 extcap[DOT11_EXTCAP_LEN_TDLS]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_extcap dot11_extcap_t; ++ ++/* TDLS Capabilities */ ++#define TDLS_CAP_TDLS 37 /* TDLS support */ ++#define TDLS_CAP_PU_BUFFER_STA 28 /* TDLS Peer U-APSD buffer STA support */ ++#define TDLS_CAP_PEER_PSM 20 /* TDLS Peer PSM support */ ++#define TDLS_CAP_CH_SW 30 /* TDLS Channel switch */ ++#define TDLS_CAP_PROH 38 /* TDLS prohibited */ ++#define TDLS_CAP_CH_SW_PROH 39 /* TDLS Channel switch prohibited */ ++ ++#define TDLS_CAP_MAX_BIT 39 /* TDLS max bit defined in ext cap */ ++ ++/* 802.11h/802.11k Measurement Request/Report IEs */ ++/* Measurement Type field */ ++#define DOT11_MEASURE_TYPE_BASIC 0 /* d11 measurement basic type */ ++#define DOT11_MEASURE_TYPE_CCA 1 /* d11 measurement CCA type */ ++#define DOT11_MEASURE_TYPE_RPI 2 /* d11 measurement RPI type */ ++#define DOT11_MEASURE_TYPE_CHLOAD 3 /* d11 measurement Channel Load type */ ++#define DOT11_MEASURE_TYPE_NOISE 4 /* d11 measurement Noise Histogram type */ ++#define DOT11_MEASURE_TYPE_BEACON 5 /* d11 measurement Beacon type */ ++#define DOT11_MEASURE_TYPE_FRAME 6 /* d11 measurement Frame type */ ++#define DOT11_MEASURE_TYPE_STATS 7 /* d11 measurement STA Statistics type */ ++#define DOT11_MEASURE_TYPE_LCI 8 /* d11 measurement LCI type */ ++#define DOT11_MEASURE_TYPE_TXSTREAM 9 /* d11 measurement TX Stream type */ ++#define DOT11_MEASURE_TYPE_PAUSE 255 /* d11 measurement pause type */ ++ ++/* Measurement Request Modes */ ++#define DOT11_MEASURE_MODE_PARALLEL (1<<0) /* d11 measurement parallel */ ++#define DOT11_MEASURE_MODE_ENABLE (1<<1) /* d11 measurement enable */ ++#define DOT11_MEASURE_MODE_REQUEST (1<<2) /* d11 measurement request */ ++#define DOT11_MEASURE_MODE_REPORT (1<<3) /* d11 measurement report */ ++#define DOT11_MEASURE_MODE_DUR (1<<4) /* d11 measurement dur mandatory */ ++/* Measurement Report Modes */ ++#define DOT11_MEASURE_MODE_LATE (1<<0) /* d11 measurement late */ ++#define DOT11_MEASURE_MODE_INCAPABLE (1<<1) /* d11 measurement incapable */ ++#define DOT11_MEASURE_MODE_REFUSED (1<<2) /* d11 measurement refuse */ ++/* Basic Measurement Map bits */ ++#define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) /* d11 measurement basic map BSS */ ++#define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) /* d11 measurement map OFDM */ ++#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) /* d11 measurement map unknown */ ++#define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) /* d11 measurement map radar */ ++#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) /* d11 measurement map unmeasuremnt */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_meas_req { ++ uint8 id; ++ uint8 len; ++ uint8 token; ++ uint8 mode; ++ uint8 type; ++ uint8 channel; ++ uint8 start_time[8]; ++ uint16 duration; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_meas_req dot11_meas_req_t; ++#define DOT11_MNG_IE_MREQ_LEN 14 /* d11 measurement request IE length */ ++/* length of Measure Request IE data not including variable len */ ++#define DOT11_MNG_IE_MREQ_FIXED_LEN 3 /* d11 measurement request IE fixed length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_meas_rep { ++ uint8 id; ++ uint8 len; ++ uint8 token; ++ uint8 mode; ++ uint8 type; ++ BWL_PRE_PACKED_STRUCT union ++ { ++ BWL_PRE_PACKED_STRUCT struct { ++ uint8 channel; ++ uint8 start_time[8]; ++ uint16 duration; ++ uint8 map; ++ } BWL_POST_PACKED_STRUCT basic; ++ uint8 data[1]; ++ } BWL_POST_PACKED_STRUCT rep; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_meas_rep dot11_meas_rep_t; ++ ++/* length of Measure Report IE data not including variable len */ ++#define DOT11_MNG_IE_MREP_FIXED_LEN 3 /* d11 measurement response IE fixed length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_meas_rep_basic { ++ uint8 channel; ++ uint8 start_time[8]; ++ uint16 duration; ++ uint8 map; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t; ++#define DOT11_MEASURE_BASIC_REP_LEN 12 /* d11 measurement basic report length */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_quiet { ++ uint8 id; ++ uint8 len; ++ uint8 count; /* TBTTs until beacon interval in quiet starts */ ++ uint8 period; /* Beacon intervals between periodic quiet periods ? */ ++ uint16 duration; /* Length of quiet period, in TU's */ ++ uint16 offset; /* TU's offset from TBTT in Count field */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_quiet dot11_quiet_t; ++ ++BWL_PRE_PACKED_STRUCT struct chan_map_tuple { ++ uint8 channel; ++ uint8 map; ++} BWL_POST_PACKED_STRUCT; ++typedef struct chan_map_tuple chan_map_tuple_t; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_ibss_dfs { ++ uint8 id; ++ uint8 len; ++ uint8 eaddr[ETHER_ADDR_LEN]; ++ uint8 interval; ++ chan_map_tuple_t map[1]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_ibss_dfs dot11_ibss_dfs_t; ++ ++/* WME Elements */ ++#define WME_OUI "\x00\x50\xf2" /* WME OUI */ ++#define WME_OUI_LEN 3 ++#define WME_OUI_TYPE 2 /* WME type */ ++#define WME_TYPE 2 /* WME type, deprecated */ ++#define WME_SUBTYPE_IE 0 /* Information Element */ ++#define WME_SUBTYPE_PARAM_IE 1 /* Parameter Element */ ++#define WME_SUBTYPE_TSPEC 2 /* Traffic Specification */ ++#define WME_VER 1 /* WME version */ ++ ++/* WME Access Category Indices (ACIs) */ ++#define AC_BE 0 /* Best Effort */ ++#define AC_BK 1 /* Background */ ++#define AC_VI 2 /* Video */ ++#define AC_VO 3 /* Voice */ ++#define AC_COUNT 4 /* number of ACs */ ++ ++typedef uint8 ac_bitmap_t; /* AC bitmap of (1 << AC_xx) */ ++ ++#define AC_BITMAP_NONE 0x0 /* No ACs */ ++#define AC_BITMAP_ALL 0xf /* All ACs */ ++#define AC_BITMAP_TST(ab, ac) (((ab) & (1 << (ac))) != 0) ++#define AC_BITMAP_SET(ab, ac) (((ab) |= (1 << (ac)))) ++#define AC_BITMAP_RESET(ab, ac) (((ab) &= ~(1 << (ac)))) ++ ++/* WME Information Element (IE) */ ++BWL_PRE_PACKED_STRUCT struct wme_ie { ++ uint8 oui[3]; ++ uint8 type; ++ uint8 subtype; ++ uint8 version; ++ uint8 qosinfo; ++} BWL_POST_PACKED_STRUCT; ++typedef struct wme_ie wme_ie_t; ++#define WME_IE_LEN 7 /* WME IE length */ ++ ++BWL_PRE_PACKED_STRUCT struct edcf_acparam { ++ uint8 ACI; ++ uint8 ECW; ++ uint16 TXOP; /* stored in network order (ls octet first) */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct edcf_acparam edcf_acparam_t; ++ ++/* WME Parameter Element (PE) */ ++BWL_PRE_PACKED_STRUCT struct wme_param_ie { ++ uint8 oui[3]; ++ uint8 type; ++ uint8 subtype; ++ uint8 version; ++ uint8 qosinfo; ++ uint8 rsvd; ++ edcf_acparam_t acparam[AC_COUNT]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct wme_param_ie wme_param_ie_t; ++#define WME_PARAM_IE_LEN 24 /* WME Parameter IE length */ ++ ++/* QoS Info field for IE as sent from AP */ ++#define WME_QI_AP_APSD_MASK 0x80 /* U-APSD Supported mask */ ++#define WME_QI_AP_APSD_SHIFT 7 /* U-APSD Supported shift */ ++#define WME_QI_AP_COUNT_MASK 0x0f /* Parameter set count mask */ ++#define WME_QI_AP_COUNT_SHIFT 0 /* Parameter set count shift */ ++ ++/* QoS Info field for IE as sent from STA */ ++#define WME_QI_STA_MAXSPLEN_MASK 0x60 /* Max Service Period Length mask */ ++#define WME_QI_STA_MAXSPLEN_SHIFT 5 /* Max Service Period Length shift */ ++#define WME_QI_STA_APSD_ALL_MASK 0xf /* APSD all AC bits mask */ ++#define WME_QI_STA_APSD_ALL_SHIFT 0 /* APSD all AC bits shift */ ++#define WME_QI_STA_APSD_BE_MASK 0x8 /* APSD AC_BE mask */ ++#define WME_QI_STA_APSD_BE_SHIFT 3 /* APSD AC_BE shift */ ++#define WME_QI_STA_APSD_BK_MASK 0x4 /* APSD AC_BK mask */ ++#define WME_QI_STA_APSD_BK_SHIFT 2 /* APSD AC_BK shift */ ++#define WME_QI_STA_APSD_VI_MASK 0x2 /* APSD AC_VI mask */ ++#define WME_QI_STA_APSD_VI_SHIFT 1 /* APSD AC_VI shift */ ++#define WME_QI_STA_APSD_VO_MASK 0x1 /* APSD AC_VO mask */ ++#define WME_QI_STA_APSD_VO_SHIFT 0 /* APSD AC_VO shift */ ++ ++/* ACI */ ++#define EDCF_AIFSN_MIN 1 /* AIFSN minimum value */ ++#define EDCF_AIFSN_MAX 15 /* AIFSN maximum value */ ++#define EDCF_AIFSN_MASK 0x0f /* AIFSN mask */ ++#define EDCF_ACM_MASK 0x10 /* ACM mask */ ++#define EDCF_ACI_MASK 0x60 /* ACI mask */ ++#define EDCF_ACI_SHIFT 5 /* ACI shift */ ++#define EDCF_AIFSN_SHIFT 12 /* 4 MSB(0xFFF) in ifs_ctl for AC idx */ ++ ++/* ECW */ ++#define EDCF_ECW_MIN 0 /* cwmin/cwmax exponent minimum value */ ++#define EDCF_ECW_MAX 15 /* cwmin/cwmax exponent maximum value */ ++#define EDCF_ECW2CW(exp) ((1 << (exp)) - 1) ++#define EDCF_ECWMIN_MASK 0x0f /* cwmin exponent form mask */ ++#define EDCF_ECWMAX_MASK 0xf0 /* cwmax exponent form mask */ ++#define EDCF_ECWMAX_SHIFT 4 /* cwmax exponent form shift */ ++ ++/* TXOP */ ++#define EDCF_TXOP_MIN 0 /* TXOP minimum value */ ++#define EDCF_TXOP_MAX 65535 /* TXOP maximum value */ ++#define EDCF_TXOP2USEC(txop) ((txop) << 5) ++ ++/* Default BE ACI value for non-WME connection STA */ ++#define NON_EDCF_AC_BE_ACI_STA 0x02 ++ ++/* Default EDCF parameters that AP advertises for STA to use; WMM draft Table 12 */ ++#define EDCF_AC_BE_ACI_STA 0x03 /* STA ACI value for best effort AC */ ++#define EDCF_AC_BE_ECW_STA 0xA4 /* STA ECW value for best effort AC */ ++#define EDCF_AC_BE_TXOP_STA 0x0000 /* STA TXOP value for best effort AC */ ++#define EDCF_AC_BK_ACI_STA 0x27 /* STA ACI value for background AC */ ++#define EDCF_AC_BK_ECW_STA 0xA4 /* STA ECW value for background AC */ ++#define EDCF_AC_BK_TXOP_STA 0x0000 /* STA TXOP value for background AC */ ++#define EDCF_AC_VI_ACI_STA 0x42 /* STA ACI value for video AC */ ++#define EDCF_AC_VI_ECW_STA 0x43 /* STA ECW value for video AC */ ++#define EDCF_AC_VI_TXOP_STA 0x005e /* STA TXOP value for video AC */ ++#define EDCF_AC_VO_ACI_STA 0x62 /* STA ACI value for audio AC */ ++#define EDCF_AC_VO_ECW_STA 0x32 /* STA ECW value for audio AC */ ++#define EDCF_AC_VO_TXOP_STA 0x002f /* STA TXOP value for audio AC */ ++ ++/* Default EDCF parameters that AP uses; WMM draft Table 14 */ ++#define EDCF_AC_BE_ACI_AP 0x03 /* AP ACI value for best effort AC */ ++#define EDCF_AC_BE_ECW_AP 0x64 /* AP ECW value for best effort AC */ ++#define EDCF_AC_BE_TXOP_AP 0x0000 /* AP TXOP value for best effort AC */ ++#define EDCF_AC_BK_ACI_AP 0x27 /* AP ACI value for background AC */ ++#define EDCF_AC_BK_ECW_AP 0xA4 /* AP ECW value for background AC */ ++#define EDCF_AC_BK_TXOP_AP 0x0000 /* AP TXOP value for background AC */ ++#define EDCF_AC_VI_ACI_AP 0x41 /* AP ACI value for video AC */ ++#define EDCF_AC_VI_ECW_AP 0x43 /* AP ECW value for video AC */ ++#define EDCF_AC_VI_TXOP_AP 0x005e /* AP TXOP value for video AC */ ++#define EDCF_AC_VO_ACI_AP 0x61 /* AP ACI value for audio AC */ ++#define EDCF_AC_VO_ECW_AP 0x32 /* AP ECW value for audio AC */ ++#define EDCF_AC_VO_TXOP_AP 0x002f /* AP TXOP value for audio AC */ ++ ++/* EDCA Parameter IE */ ++BWL_PRE_PACKED_STRUCT struct edca_param_ie { ++ uint8 qosinfo; ++ uint8 rsvd; ++ edcf_acparam_t acparam[AC_COUNT]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct edca_param_ie edca_param_ie_t; ++#define EDCA_PARAM_IE_LEN 18 /* EDCA Parameter IE length */ ++ ++/* QoS Capability IE */ ++BWL_PRE_PACKED_STRUCT struct qos_cap_ie { ++ uint8 qosinfo; ++} BWL_POST_PACKED_STRUCT; ++typedef struct qos_cap_ie qos_cap_ie_t; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_qbss_load_ie { ++ uint8 id; /* 11, DOT11_MNG_QBSS_LOAD_ID */ ++ uint8 length; ++ uint16 station_count; /* total number of STAs associated */ ++ uint8 channel_utilization; /* % of time, normalized to 255, QAP sensed medium busy */ ++ uint16 aac; /* available admission capacity */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t; ++#define BSS_LOAD_IE_SIZE 7 /* BSS load IE size */ ++ ++/* nom_msdu_size */ ++#define FIXED_MSDU_SIZE 0x8000 /* MSDU size is fixed */ ++#define MSDU_SIZE_MASK 0x7fff /* (Nominal or fixed) MSDU size */ ++ ++/* surplus_bandwidth */ ++/* Represented as 3 bits of integer, binary point, 13 bits fraction */ ++#define INTEGER_SHIFT 13 /* integer shift */ ++#define FRACTION_MASK 0x1FFF /* fraction mask */ ++ ++/* Management Notification Frame */ ++BWL_PRE_PACKED_STRUCT struct dot11_management_notification { ++ uint8 category; /* DOT11_ACTION_NOTIFICATION */ ++ uint8 action; ++ uint8 token; ++ uint8 status; ++ uint8 data[1]; /* Elements */ ++} BWL_POST_PACKED_STRUCT; ++#define DOT11_MGMT_NOTIFICATION_LEN 4 /* Fixed length */ ++ ++/* Timeout Interval IE */ ++BWL_PRE_PACKED_STRUCT struct ti_ie { ++ uint8 ti_type; ++ uint32 ti_val; ++} BWL_POST_PACKED_STRUCT; ++typedef struct ti_ie ti_ie_t; ++#define TI_TYPE_REASSOC_DEADLINE 1 ++#define TI_TYPE_KEY_LIFETIME 2 ++ ++/* WME Action Codes */ ++#define WME_ADDTS_REQUEST 0 /* WME ADDTS request */ ++#define WME_ADDTS_RESPONSE 1 /* WME ADDTS response */ ++#define WME_DELTS_REQUEST 2 /* WME DELTS request */ ++ ++/* WME Setup Response Status Codes */ ++#define WME_ADMISSION_ACCEPTED 0 /* WME admission accepted */ ++#define WME_INVALID_PARAMETERS 1 /* WME invalide parameters */ ++#define WME_ADMISSION_REFUSED 3 /* WME admission refused */ ++ ++/* Macro to take a pointer to a beacon or probe response ++ * body and return the char* pointer to the SSID info element ++ */ ++#define BCN_PRB_SSID(body) ((char*)(body) + DOT11_BCN_PRB_LEN) ++ ++/* Authentication frame payload constants */ ++#define DOT11_OPEN_SYSTEM 0 /* d11 open authentication */ ++#define DOT11_SHARED_KEY 1 /* d11 shared authentication */ ++#define DOT11_FAST_BSS 2 /* d11 fast bss authentication */ ++#define DOT11_CHALLENGE_LEN 128 /* d11 challenge text length */ ++ ++/* Frame control macros */ ++#define FC_PVER_MASK 0x3 /* PVER mask */ ++#define FC_PVER_SHIFT 0 /* PVER shift */ ++#define FC_TYPE_MASK 0xC /* type mask */ ++#define FC_TYPE_SHIFT 2 /* type shift */ ++#define FC_SUBTYPE_MASK 0xF0 /* subtype mask */ ++#define FC_SUBTYPE_SHIFT 4 /* subtype shift */ ++#define FC_TODS 0x100 /* to DS */ ++#define FC_TODS_SHIFT 8 /* to DS shift */ ++#define FC_FROMDS 0x200 /* from DS */ ++#define FC_FROMDS_SHIFT 9 /* from DS shift */ ++#define FC_MOREFRAG 0x400 /* more frag. */ ++#define FC_MOREFRAG_SHIFT 10 /* more frag. shift */ ++#define FC_RETRY 0x800 /* retry */ ++#define FC_RETRY_SHIFT 11 /* retry shift */ ++#define FC_PM 0x1000 /* PM */ ++#define FC_PM_SHIFT 12 /* PM shift */ ++#define FC_MOREDATA 0x2000 /* more data */ ++#define FC_MOREDATA_SHIFT 13 /* more data shift */ ++#define FC_WEP 0x4000 /* WEP */ ++#define FC_WEP_SHIFT 14 /* WEP shift */ ++#define FC_ORDER 0x8000 /* order */ ++#define FC_ORDER_SHIFT 15 /* order shift */ ++ ++/* sequence control macros */ ++#define SEQNUM_SHIFT 4 /* seq. number shift */ ++#define SEQNUM_MAX 0x1000 /* max seqnum + 1 */ ++#define FRAGNUM_MASK 0xF /* frag. number mask */ ++ ++/* Frame Control type/subtype defs */ ++ ++/* FC Types */ ++#define FC_TYPE_MNG 0 /* management type */ ++#define FC_TYPE_CTL 1 /* control type */ ++#define FC_TYPE_DATA 2 /* data type */ ++ ++/* Management Subtypes */ ++#define FC_SUBTYPE_ASSOC_REQ 0 /* assoc. request */ ++#define FC_SUBTYPE_ASSOC_RESP 1 /* assoc. response */ ++#define FC_SUBTYPE_REASSOC_REQ 2 /* reassoc. request */ ++#define FC_SUBTYPE_REASSOC_RESP 3 /* reassoc. response */ ++#define FC_SUBTYPE_PROBE_REQ 4 /* probe request */ ++#define FC_SUBTYPE_PROBE_RESP 5 /* probe response */ ++#define FC_SUBTYPE_BEACON 8 /* beacon */ ++#define FC_SUBTYPE_ATIM 9 /* ATIM */ ++#define FC_SUBTYPE_DISASSOC 10 /* disassoc. */ ++#define FC_SUBTYPE_AUTH 11 /* authentication */ ++#define FC_SUBTYPE_DEAUTH 12 /* de-authentication */ ++#define FC_SUBTYPE_ACTION 13 /* action */ ++#define FC_SUBTYPE_ACTION_NOACK 14 /* action no-ack */ ++ ++/* Control Subtypes */ ++#define FC_SUBTYPE_CTL_WRAPPER 7 /* Control Wrapper */ ++#define FC_SUBTYPE_BLOCKACK_REQ 8 /* Block Ack Req */ ++#define FC_SUBTYPE_BLOCKACK 9 /* Block Ack */ ++#define FC_SUBTYPE_PS_POLL 10 /* PS poll */ ++#define FC_SUBTYPE_RTS 11 /* RTS */ ++#define FC_SUBTYPE_CTS 12 /* CTS */ ++#define FC_SUBTYPE_ACK 13 /* ACK */ ++#define FC_SUBTYPE_CF_END 14 /* CF-END */ ++#define FC_SUBTYPE_CF_END_ACK 15 /* CF-END ACK */ ++ ++/* Data Subtypes */ ++#define FC_SUBTYPE_DATA 0 /* Data */ ++#define FC_SUBTYPE_DATA_CF_ACK 1 /* Data + CF-ACK */ ++#define FC_SUBTYPE_DATA_CF_POLL 2 /* Data + CF-Poll */ ++#define FC_SUBTYPE_DATA_CF_ACK_POLL 3 /* Data + CF-Ack + CF-Poll */ ++#define FC_SUBTYPE_NULL 4 /* Null */ ++#define FC_SUBTYPE_CF_ACK 5 /* CF-Ack */ ++#define FC_SUBTYPE_CF_POLL 6 /* CF-Poll */ ++#define FC_SUBTYPE_CF_ACK_POLL 7 /* CF-Ack + CF-Poll */ ++#define FC_SUBTYPE_QOS_DATA 8 /* QoS Data */ ++#define FC_SUBTYPE_QOS_DATA_CF_ACK 9 /* QoS Data + CF-Ack */ ++#define FC_SUBTYPE_QOS_DATA_CF_POLL 10 /* QoS Data + CF-Poll */ ++#define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11 /* QoS Data + CF-Ack + CF-Poll */ ++#define FC_SUBTYPE_QOS_NULL 12 /* QoS Null */ ++#define FC_SUBTYPE_QOS_CF_POLL 14 /* QoS CF-Poll */ ++#define FC_SUBTYPE_QOS_CF_ACK_POLL 15 /* QoS CF-Ack + CF-Poll */ ++ ++/* Data Subtype Groups */ ++#define FC_SUBTYPE_ANY_QOS(s) (((s) & 8) != 0) ++#define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0) ++#define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0) ++#define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0) ++ ++/* Type/Subtype Combos */ ++#define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) /* FC kind mask */ ++ ++#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) /* FC kind */ ++ ++#define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT) /* Subtype from FC */ ++#define FC_TYPE(fc) (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT) /* Type from FC */ ++ ++#define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) /* assoc. request */ ++#define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) /* assoc. response */ ++#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) /* reassoc. request */ ++#define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) /* reassoc. response */ ++#define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) /* probe request */ ++#define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) /* probe response */ ++#define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) /* beacon */ ++#define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) /* disassoc */ ++#define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) /* authentication */ ++#define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) /* deauthentication */ ++#define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) /* action */ ++#define FC_ACTION_NOACK FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION_NOACK) /* action no-ack */ ++ ++#define FC_CTL_WRAPPER FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTL_WRAPPER) /* Control Wrapper */ ++#define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ) /* Block Ack Req */ ++#define FC_BLOCKACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK) /* Block Ack */ ++#define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) /* PS poll */ ++#define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) /* RTS */ ++#define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) /* CTS */ ++#define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) /* ACK */ ++#define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) /* CF-END */ ++#define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) /* CF-END ACK */ ++ ++#define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) /* data */ ++#define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) /* null data */ ++#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) /* data CF ACK */ ++#define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) /* QoS data */ ++#define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) /* QoS null */ ++ ++/* QoS Control Field */ ++ ++/* 802.1D Priority */ ++#define QOS_PRIO_SHIFT 0 /* QoS priority shift */ ++#define QOS_PRIO_MASK 0x0007 /* QoS priority mask */ ++#define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) /* QoS priority */ ++ ++/* Traffic Identifier */ ++#define QOS_TID_SHIFT 0 /* QoS TID shift */ ++#define QOS_TID_MASK 0x000f /* QoS TID mask */ ++#define QOS_TID(qos) (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT) /* QoS TID */ ++ ++/* End of Service Period (U-APSD) */ ++#define QOS_EOSP_SHIFT 4 /* QoS End of Service Period shift */ ++#define QOS_EOSP_MASK 0x0010 /* QoS End of Service Period mask */ ++#define QOS_EOSP(qos) (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT) /* Qos EOSP */ ++ ++/* Ack Policy */ ++#define QOS_ACK_NORMAL_ACK 0 /* Normal Ack */ ++#define QOS_ACK_NO_ACK 1 /* No Ack (eg mcast) */ ++#define QOS_ACK_NO_EXP_ACK 2 /* No Explicit Ack */ ++#define QOS_ACK_BLOCK_ACK 3 /* Block Ack */ ++#define QOS_ACK_SHIFT 5 /* QoS ACK shift */ ++#define QOS_ACK_MASK 0x0060 /* QoS ACK mask */ ++#define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) /* QoS ACK */ ++ ++/* A-MSDU flag */ ++#define QOS_AMSDU_SHIFT 7 /* AMSDU shift */ ++#define QOS_AMSDU_MASK 0x0080 /* AMSDU mask */ ++ ++/* Management Frames */ ++ ++/* Management Frame Constants */ ++ ++/* Fixed fields */ ++#define DOT11_MNG_AUTH_ALGO_LEN 2 /* d11 management auth. algo. length */ ++#define DOT11_MNG_AUTH_SEQ_LEN 2 /* d11 management auth. seq. length */ ++#define DOT11_MNG_BEACON_INT_LEN 2 /* d11 management beacon interval length */ ++#define DOT11_MNG_CAP_LEN 2 /* d11 management cap. length */ ++#define DOT11_MNG_AP_ADDR_LEN 6 /* d11 management AP address length */ ++#define DOT11_MNG_LISTEN_INT_LEN 2 /* d11 management listen interval length */ ++#define DOT11_MNG_REASON_LEN 2 /* d11 management reason length */ ++#define DOT11_MNG_AID_LEN 2 /* d11 management AID length */ ++#define DOT11_MNG_STATUS_LEN 2 /* d11 management status length */ ++#define DOT11_MNG_TIMESTAMP_LEN 8 /* d11 management timestamp length */ ++ ++/* DUR/ID field in assoc resp is 0xc000 | AID */ ++#define DOT11_AID_MASK 0x3fff /* d11 AID mask */ ++ ++/* Reason Codes */ ++#define DOT11_RC_RESERVED 0 /* d11 RC reserved */ ++#define DOT11_RC_UNSPECIFIED 1 /* Unspecified reason */ ++#define DOT11_RC_AUTH_INVAL 2 /* Previous authentication no longer valid */ ++#define DOT11_RC_DEAUTH_LEAVING 3 /* Deauthenticated because sending station ++ * is leaving (or has left) IBSS or ESS ++ */ ++#define DOT11_RC_INACTIVITY 4 /* Disassociated due to inactivity */ ++#define DOT11_RC_BUSY 5 /* Disassociated because AP is unable to handle ++ * all currently associated stations ++ */ ++#define DOT11_RC_INVAL_CLASS_2 6 /* Class 2 frame received from ++ * nonauthenticated station ++ */ ++#define DOT11_RC_INVAL_CLASS_3 7 /* Class 3 frame received from ++ * nonassociated station ++ */ ++#define DOT11_RC_DISASSOC_LEAVING 8 /* Disassociated because sending station is ++ * leaving (or has left) BSS ++ */ ++#define DOT11_RC_NOT_AUTH 9 /* Station requesting (re)association is not ++ * authenticated with responding station ++ */ ++#define DOT11_RC_BAD_PC 10 /* Unacceptable power capability element */ ++#define DOT11_RC_BAD_CHANNELS 11 /* Unacceptable supported channels element */ ++/* 12 is unused */ ++ ++/* 32-39 are QSTA specific reasons added in 11e */ ++#define DOT11_RC_UNSPECIFIED_QOS 32 /* unspecified QoS-related reason */ ++#define DOT11_RC_INSUFFCIENT_BW 33 /* QAP lacks sufficient bandwidth */ ++#define DOT11_RC_EXCESSIVE_FRAMES 34 /* excessive number of frames need ack */ ++#define DOT11_RC_TX_OUTSIDE_TXOP 35 /* transmitting outside the limits of txop */ ++#define DOT11_RC_LEAVING_QBSS 36 /* QSTA is leaving the QBSS (or restting) */ ++#define DOT11_RC_BAD_MECHANISM 37 /* does not want to use the mechanism */ ++#define DOT11_RC_SETUP_NEEDED 38 /* mechanism needs a setup */ ++#define DOT11_RC_TIMEOUT 39 /* timeout */ ++ ++#define DOT11_RC_MAX 23 /* Reason codes > 23 are reserved */ ++ ++#define DOT11_RC_TDLS_PEER_UNREACH 25 ++#define DOT11_RC_TDLS_DOWN_UNSPECIFIED 26 ++ ++/* Status Codes */ ++#define DOT11_SC_SUCCESS 0 /* Successful */ ++#define DOT11_SC_FAILURE 1 /* Unspecified failure */ ++#define DOT11_SC_TDLS_WAKEUP_SCH_ALT 2 /* TDLS wakeup schedule rejected but alternative */ ++ /* schedule provided */ ++#define DOT11_SC_TDLS_WAKEUP_SCH_REJ 3 /* TDLS wakeup schedule rejected */ ++#define DOT11_SC_TDLS_SEC_DISABLED 5 /* TDLS Security disabled */ ++#define DOT11_SC_LIFETIME_REJ 6 /* Unacceptable lifetime */ ++#define DOT11_SC_NOT_SAME_BSS 7 /* Not in same BSS */ ++#define DOT11_SC_CAP_MISMATCH 10 /* Cannot support all requested ++ * capabilities in the Capability ++ * Information field ++ */ ++#define DOT11_SC_REASSOC_FAIL 11 /* Reassociation denied due to inability ++ * to confirm that association exists ++ */ ++#define DOT11_SC_ASSOC_FAIL 12 /* Association denied due to reason ++ * outside the scope of this standard ++ */ ++#define DOT11_SC_AUTH_MISMATCH 13 /* Responding station does not support ++ * the specified authentication ++ * algorithm ++ */ ++#define DOT11_SC_AUTH_SEQ 14 /* Received an Authentication frame ++ * with authentication transaction ++ * sequence number out of expected ++ * sequence ++ */ ++#define DOT11_SC_AUTH_CHALLENGE_FAIL 15 /* Authentication rejected because of ++ * challenge failure ++ */ ++#define DOT11_SC_AUTH_TIMEOUT 16 /* Authentication rejected due to timeout ++ * waiting for next frame in sequence ++ */ ++#define DOT11_SC_ASSOC_BUSY_FAIL 17 /* Association denied because AP is ++ * unable to handle additional ++ * associated stations ++ */ ++#define DOT11_SC_ASSOC_RATE_MISMATCH 18 /* Association denied due to requesting ++ * station not supporting all of the ++ * data rates in the BSSBasicRateSet ++ * parameter ++ */ ++#define DOT11_SC_ASSOC_SHORT_REQUIRED 19 /* Association denied due to requesting ++ * station not supporting the Short ++ * Preamble option ++ */ ++#define DOT11_SC_ASSOC_PBCC_REQUIRED 20 /* Association denied due to requesting ++ * station not supporting the PBCC ++ * Modulation option ++ */ ++#define DOT11_SC_ASSOC_AGILITY_REQUIRED 21 /* Association denied due to requesting ++ * station not supporting the Channel ++ * Agility option ++ */ ++#define DOT11_SC_ASSOC_SPECTRUM_REQUIRED 22 /* Association denied because Spectrum ++ * Management capability is required. ++ */ ++#define DOT11_SC_ASSOC_BAD_POWER_CAP 23 /* Association denied because the info ++ * in the Power Cap element is ++ * unacceptable. ++ */ ++#define DOT11_SC_ASSOC_BAD_SUP_CHANNELS 24 /* Association denied because the info ++ * in the Supported Channel element is ++ * unacceptable ++ */ ++#define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED 25 /* Association denied due to requesting ++ * station not supporting the Short Slot ++ * Time option ++ */ ++#define DOT11_SC_ASSOC_ERPBCC_REQUIRED 26 /* Association denied due to requesting ++ * station not supporting the ER-PBCC ++ * Modulation option ++ */ ++#define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27 /* Association denied due to requesting ++ * station not supporting the DSS-OFDM ++ * option ++ */ ++#define DOT11_SC_ASSOC_R0KH_UNREACHABLE 28 /* Association denied due to AP ++ * being unable to reach the R0 Key Holder ++ */ ++#define DOT11_SC_ASSOC_TRY_LATER 30 /* Association denied temporarily, try again later ++ */ ++#define DOT11_SC_ASSOC_MFP_VIOLATION 31 /* Association denied due to Robust Management ++ * frame policy violation ++ */ ++ ++#define DOT11_SC_DECLINED 37 /* request declined */ ++#define DOT11_SC_INVALID_PARAMS 38 /* One or more params have invalid values */ ++#define DOT11_SC_INVALID_PAIRWISE_CIPHER 42 /* invalid pairwise cipher */ ++#define DOT11_SC_INVALID_AKMP 43 /* Association denied due to invalid AKMP */ ++#define DOT11_SC_INVALID_RSNIE_CAP 45 /* invalid RSN IE capabilities */ ++#define DOT11_SC_DLS_NOT_ALLOWED 48 /* DLS is not allowed in the BSS by policy */ ++#define DOT11_SC_INVALID_PMKID 53 /* Association denied due to invalid PMKID */ ++#define DOT11_SC_INVALID_MDID 54 /* Association denied due to invalid MDID */ ++#define DOT11_SC_INVALID_FTIE 55 /* Association denied due to invalid FTIE */ ++ ++#define DOT11_SC_UNEXP_MSG 70 /* Unexpected message */ ++#define DOT11_SC_INVALID_SNONCE 71 /* Invalid SNonce */ ++#define DOT11_SC_INVALID_RSNIE 72 /* Invalid contents of RSNIE */ ++ ++/* Info Elts, length of INFORMATION portion of Info Elts */ ++#define DOT11_MNG_DS_PARAM_LEN 1 /* d11 management DS parameter length */ ++#define DOT11_MNG_IBSS_PARAM_LEN 2 /* d11 management IBSS parameter length */ ++ ++/* TIM Info element has 3 bytes fixed info in INFORMATION field, ++ * followed by 1 to 251 bytes of Partial Virtual Bitmap ++ */ ++#define DOT11_MNG_TIM_FIXED_LEN 3 /* d11 management TIM fixed length */ ++#define DOT11_MNG_TIM_DTIM_COUNT 0 /* d11 management DTIM count */ ++#define DOT11_MNG_TIM_DTIM_PERIOD 1 /* d11 management DTIM period */ ++#define DOT11_MNG_TIM_BITMAP_CTL 2 /* d11 management TIM BITMAP control */ ++#define DOT11_MNG_TIM_PVB 3 /* d11 management TIM PVB */ ++ ++/* TLV defines */ ++#define TLV_TAG_OFF 0 /* tag offset */ ++#define TLV_LEN_OFF 1 /* length offset */ ++#define TLV_HDR_LEN 2 /* header length */ ++#define TLV_BODY_OFF 2 /* body offset */ ++ ++/* Management Frame Information Element IDs */ ++#define DOT11_MNG_SSID_ID 0 /* d11 management SSID id */ ++#define DOT11_MNG_RATES_ID 1 /* d11 management rates id */ ++#define DOT11_MNG_FH_PARMS_ID 2 /* d11 management FH parameter id */ ++#define DOT11_MNG_DS_PARMS_ID 3 /* d11 management DS parameter id */ ++#define DOT11_MNG_CF_PARMS_ID 4 /* d11 management CF parameter id */ ++#define DOT11_MNG_TIM_ID 5 /* d11 management TIM id */ ++#define DOT11_MNG_IBSS_PARMS_ID 6 /* d11 management IBSS parameter id */ ++#define DOT11_MNG_COUNTRY_ID 7 /* d11 management country id */ ++#define DOT11_MNG_HOPPING_PARMS_ID 8 /* d11 management hopping parameter id */ ++#define DOT11_MNG_HOPPING_TABLE_ID 9 /* d11 management hopping table id */ ++#define DOT11_MNG_REQUEST_ID 10 /* d11 management request id */ ++#define DOT11_MNG_QBSS_LOAD_ID 11 /* d11 management QBSS Load id */ ++#define DOT11_MNG_EDCA_PARAM_ID 12 /* 11E EDCA Parameter id */ ++#define DOT11_MNG_CHALLENGE_ID 16 /* d11 management chanllenge id */ ++#define DOT11_MNG_PWR_CONSTRAINT_ID 32 /* 11H PowerConstraint */ ++#define DOT11_MNG_PWR_CAP_ID 33 /* 11H PowerCapability */ ++#define DOT11_MNG_TPC_REQUEST_ID 34 /* 11H TPC Request */ ++#define DOT11_MNG_TPC_REPORT_ID 35 /* 11H TPC Report */ ++#define DOT11_MNG_SUPP_CHANNELS_ID 36 /* 11H Supported Channels */ ++#define DOT11_MNG_CHANNEL_SWITCH_ID 37 /* 11H ChannelSwitch Announcement */ ++#define DOT11_MNG_MEASURE_REQUEST_ID 38 /* 11H MeasurementRequest */ ++#define DOT11_MNG_MEASURE_REPORT_ID 39 /* 11H MeasurementReport */ ++#define DOT11_MNG_QUIET_ID 40 /* 11H Quiet */ ++#define DOT11_MNG_IBSS_DFS_ID 41 /* 11H IBSS_DFS */ ++#define DOT11_MNG_ERP_ID 42 /* d11 management ERP id */ ++#define DOT11_MNG_TS_DELAY_ID 43 /* d11 management TS Delay id */ ++#define DOT11_MNG_HT_CAP 45 /* d11 mgmt HT cap id */ ++#define DOT11_MNG_QOS_CAP_ID 46 /* 11E QoS Capability id */ ++#define DOT11_MNG_NONERP_ID 47 /* d11 management NON-ERP id */ ++#define DOT11_MNG_RSN_ID 48 /* d11 management RSN id */ ++#define DOT11_MNG_EXT_RATES_ID 50 /* d11 management ext. rates id */ ++#define DOT11_MNG_AP_CHREP_ID 51 /* 11k AP Channel report id */ ++#define DOT11_MNG_NBR_REP_ID 52 /* 11k Neighbor report id */ ++#define DOT11_MNG_MDIE_ID 54 /* 11r Mobility domain id */ ++#define DOT11_MNG_FTIE_ID 55 /* 11r Fast Bss Transition id */ ++#define DOT11_MNG_FT_TI_ID 56 /* 11r Timeout Interval id */ ++#define DOT11_MNG_REGCLASS_ID 59 /* d11 management regulatory class id */ ++#define DOT11_MNG_EXT_CSA_ID 60 /* d11 Extended CSA */ ++#define DOT11_MNG_HT_ADD 61 /* d11 mgmt additional HT info */ ++#define DOT11_MNG_EXT_CHANNEL_OFFSET 62 /* d11 mgmt ext channel offset */ ++#ifdef BCMWAPI_WAI ++#define DOT11_MNG_WAPI_ID 68 /* d11 management WAPI id */ ++#endif ++#define DOT11_MNG_WAPI_ID 68 /* d11 management WAPI id */ ++#define DOT11_MNG_TIME_ADVERTISE_ID 69 /* 11p time advertisement */ ++#define DOT11_MNG_RRM_CAP_ID 70 /* 11k radio measurement capability */ ++#define DOT11_MNG_HT_BSS_COEXINFO_ID 72 /* d11 mgmt OBSS Coexistence INFO */ ++#define DOT11_MNG_HT_BSS_CHANNEL_REPORT_ID 73 /* d11 mgmt OBSS Intolerant Channel list */ ++#define DOT11_MNG_HT_OBSS_ID 74 /* d11 mgmt OBSS HT info */ ++#define DOT11_MNG_CHANNEL_USAGE 97 /* 11v channel usage */ ++#define DOT11_MNG_TIME_ZONE_ID 98 /* 11v time zone */ ++#define DOT11_MNG_LINK_IDENTIFIER_ID 101 /* 11z TDLS Link Identifier IE */ ++#define DOT11_MNG_WAKEUP_SCHEDULE_ID 102 /* 11z TDLS Wakeup Schedule IE */ ++#define DOT11_MNG_CHANNEL_SWITCH_TIMING_ID 104 /* 11z TDLS Channel Switch Timing IE */ ++#define DOT11_MNG_PTI_CONTROL_ID 105 /* 11z TDLS PTI Control IE */ ++#define DOT11_MNG_PU_BUFFER_STATUS_ID 106 /* 11z TDLS PU Buffer Status IE */ ++#define DOT11_MNG_INTERWORKING_ID 107 /* 11u interworking */ ++#define DOT11_MNG_ADVERTISEMENT_ID 108 /* 11u advertisement protocol */ ++#define DOT11_MNG_EXP_BW_REQ_ID 109 /* 11u expedited bandwith request */ ++#define DOT11_MNG_QOS_MAP_ID 110 /* 11u QoS map set */ ++#define DOT11_MNG_ROAM_CONSORT_ID 111 /* 11u roaming consortium */ ++#define DOT11_MNG_EMERGCY_ALERT_ID 112 /* 11u emergency alert identifier */ ++#define DOT11_MNG_EXT_CAP_ID 127 /* d11 mgmt ext capability */ ++#define DOT11_MNG_VHT_CAP_ID 191 /* d11 mgmt VHT cap id */ ++#define DOT11_MNG_VHT_OPERATION_ID 192 /* d11 mgmt VHT op id */ ++ ++#define DOT11_MNG_WPA_ID 221 /* d11 management WPA id */ ++#define DOT11_MNG_PROPR_ID 221 /* d11 management proprietary id */ ++/* should start using this one instead of above two */ ++#define DOT11_MNG_VS_ID 221 /* d11 management Vendor Specific IE */ ++ ++/* Rate element Basic flag and rate mask */ ++#define DOT11_RATE_BASIC 0x80 /* flag for a Basic Rate */ ++#define DOT11_RATE_MASK 0x7F /* mask for numeric part of rate */ ++ ++/* ERP info element bit values */ ++#define DOT11_MNG_ERP_LEN 1 /* ERP is currently 1 byte long */ ++#define DOT11_MNG_NONERP_PRESENT 0x01 /* NonERP (802.11b) STAs are present ++ *in the BSS ++ */ ++#define DOT11_MNG_USE_PROTECTION 0x02 /* Use protection mechanisms for ++ *ERP-OFDM frames ++ */ ++#define DOT11_MNG_BARKER_PREAMBLE 0x04 /* Short Preambles: 0 == allowed, ++ * 1 == not allowed ++ */ ++/* TS Delay element offset & size */ ++#define DOT11_MGN_TS_DELAY_LEN 4 /* length of TS DELAY IE */ ++#define TS_DELAY_FIELD_SIZE 4 /* TS DELAY field size */ ++ ++/* Capability Information Field */ ++#define DOT11_CAP_ESS 0x0001 /* d11 cap. ESS */ ++#define DOT11_CAP_IBSS 0x0002 /* d11 cap. IBSS */ ++#define DOT11_CAP_POLLABLE 0x0004 /* d11 cap. pollable */ ++#define DOT11_CAP_POLL_RQ 0x0008 /* d11 cap. poll request */ ++#define DOT11_CAP_PRIVACY 0x0010 /* d11 cap. privacy */ ++#define DOT11_CAP_SHORT 0x0020 /* d11 cap. short */ ++#define DOT11_CAP_PBCC 0x0040 /* d11 cap. PBCC */ ++#define DOT11_CAP_AGILITY 0x0080 /* d11 cap. agility */ ++#define DOT11_CAP_SPECTRUM 0x0100 /* d11 cap. spectrum */ ++#define DOT11_CAP_SHORTSLOT 0x0400 /* d11 cap. shortslot */ ++#define DOT11_CAP_RRM 0x1000 /* d11 cap. 11k radio measurement */ ++#define DOT11_CAP_CCK_OFDM 0x2000 /* d11 cap. CCK/OFDM */ ++ ++/* Extended capabilities IE bitfields */ ++/* 20/40 BSS Coexistence Management support bit position */ ++#define DOT11_EXT_CAP_OBSS_COEX_MGMT 0 ++/* scheduled PSMP support bit position */ ++#define DOT11_EXT_CAP_SPSMP 6 ++/* BSS Transition Management support bit position */ ++#define DOT11_EXT_CAP_BSS_TRANSITION_MGMT 19 ++/* Interworking support bit position */ ++#define DOT11_EXT_CAP_IW 31 ++/* service Interval granularity bit position and mask */ ++#define DOT11_EXT_CAP_SI 41 ++#define DOT11_EXT_CAP_SI_MASK 0x0E ++ ++/* ++ * Action Frame Constants ++ */ ++#define DOT11_ACTION_HDR_LEN 2 /* action frame category + action field */ ++#define DOT11_ACTION_CAT_OFF 0 /* category offset */ ++#define DOT11_ACTION_ACT_OFF 1 /* action offset */ ++ ++/* Action Category field (sec 7.3.1.11) */ ++#define DOT11_ACTION_CAT_ERR_MASK 0x80 /* category error mask */ ++#define DOT11_ACTION_CAT_MASK 0x7F /* category mask */ ++#define DOT11_ACTION_CAT_SPECT_MNG 0 /* category spectrum management */ ++#define DOT11_ACTION_CAT_QOS 1 /* category QoS */ ++#define DOT11_ACTION_CAT_DLS 2 /* category DLS */ ++#define DOT11_ACTION_CAT_BLOCKACK 3 /* category block ack */ ++#define DOT11_ACTION_CAT_PUBLIC 4 /* category public */ ++#define DOT11_ACTION_CAT_RRM 5 /* category radio measurements */ ++#define DOT11_ACTION_CAT_FBT 6 /* category fast bss transition */ ++#define DOT11_ACTION_CAT_HT 7 /* category for HT */ ++#define DOT11_ACTION_CAT_SA_QUERY 8 /* security association query */ ++#define DOT11_ACTION_CAT_PDPA 9 /* protected dual of public action */ ++#define DOT11_ACTION_CAT_BSSMGMT 10 /* category for BSS transition management */ ++#define DOT11_ACTION_NOTIFICATION 17 ++#define DOT11_ACTION_CAT_VSP 126 /* protected vendor specific */ ++#define DOT11_ACTION_CAT_VS 127 /* category Vendor Specific */ ++ ++/* Spectrum Management Action IDs (sec 7.4.1) */ ++#define DOT11_SM_ACTION_M_REQ 0 /* d11 action measurement request */ ++#define DOT11_SM_ACTION_M_REP 1 /* d11 action measurement response */ ++#define DOT11_SM_ACTION_TPC_REQ 2 /* d11 action TPC request */ ++#define DOT11_SM_ACTION_TPC_REP 3 /* d11 action TPC response */ ++#define DOT11_SM_ACTION_CHANNEL_SWITCH 4 /* d11 action channel switch */ ++#define DOT11_SM_ACTION_EXT_CSA 5 /* d11 extened CSA for 11n */ ++ ++/* HT action ids */ ++#define DOT11_ACTION_ID_HT_CH_WIDTH 0 /* notify channel width action id */ ++#define DOT11_ACTION_ID_HT_MIMO_PS 1 /* mimo ps action id */ ++ ++/* Public action ids */ ++#define DOT11_PUB_ACTION_BSS_COEX_MNG 0 /* 20/40 Coexistence Management action id */ ++#define DOT11_PUB_ACTION_CHANNEL_SWITCH 4 /* d11 action channel switch */ ++ ++/* Block Ack action types */ ++#define DOT11_BA_ACTION_ADDBA_REQ 0 /* ADDBA Req action frame type */ ++#define DOT11_BA_ACTION_ADDBA_RESP 1 /* ADDBA Resp action frame type */ ++#define DOT11_BA_ACTION_DELBA 2 /* DELBA action frame type */ ++ ++/* ADDBA action parameters */ ++#define DOT11_ADDBA_PARAM_AMSDU_SUP 0x0001 /* AMSDU supported under BA */ ++#define DOT11_ADDBA_PARAM_POLICY_MASK 0x0002 /* policy mask(ack vs delayed) */ ++#define DOT11_ADDBA_PARAM_POLICY_SHIFT 1 /* policy shift */ ++#define DOT11_ADDBA_PARAM_TID_MASK 0x003c /* tid mask */ ++#define DOT11_ADDBA_PARAM_TID_SHIFT 2 /* tid shift */ ++#define DOT11_ADDBA_PARAM_BSIZE_MASK 0xffc0 /* buffer size mask */ ++#define DOT11_ADDBA_PARAM_BSIZE_SHIFT 6 /* buffer size shift */ ++ ++#define DOT11_ADDBA_POLICY_DELAYED 0 /* delayed BA policy */ ++#define DOT11_ADDBA_POLICY_IMMEDIATE 1 /* immediate BA policy */ ++ ++/* Fast Transition action types */ ++#define DOT11_FT_ACTION_FT_RESERVED 0 ++#define DOT11_FT_ACTION_FT_REQ 1 /* FBT request - for over-the-DS FBT */ ++#define DOT11_FT_ACTION_FT_RES 2 /* FBT response - for over-the-DS FBT */ ++#define DOT11_FT_ACTION_FT_CON 3 /* FBT confirm - for OTDS with RRP */ ++#define DOT11_FT_ACTION_FT_ACK 4 /* FBT ack */ ++ ++/* DLS action types */ ++#define DOT11_DLS_ACTION_REQ 0 /* DLS Request */ ++#define DOT11_DLS_ACTION_RESP 1 /* DLS Response */ ++#define DOT11_DLS_ACTION_TD 2 /* DLS Teardown */ ++ ++/* Wireless Network Management (WNM) action types */ ++#define DOT11_WNM_ACTION_EVENT_REQ 0 ++#define DOT11_WNM_ACTION_EVENT_REP 1 ++#define DOT11_WNM_ACTION_DIAG_REQ 2 ++#define DOT11_WNM_ACTION_DIAG_REP 3 ++#define DOT11_WNM_ACTION_LOC_CFG_REQ 4 ++#define DOT11_WNM_ACTION_LOC_RFG_RESP 5 ++#define DOT11_WNM_ACTION_BSS_TRANS_QURY 6 ++#define DOT11_WNM_ACTION_BSS_TRANS_REQ 7 ++#define DOT11_WNM_ACTION_BSS_TRANS_RESP 8 ++#define DOT11_WNM_ACTION_FMS_REQ 9 ++#define DOT11_WNM_ACTION_FMS_RESP 10 ++#define DOT11_WNM_ACTION_COL_INTRFRNCE_REQ 11 ++#define DOT11_WNM_ACTION_COL_INTRFRNCE_REP 12 ++#define DOT11_WNM_ACTION_TFS_REQ 13 ++#define DOT11_WNM_ACTION_TFS_RESP 14 ++#define DOT11_WNM_ACTION_TFS_NOTIFY 15 ++#define DOT11_WNM_ACTION_WNM_SLEEP_REQ 16 ++#define DOT11_WNM_ACTION_WNM_SLEEP_RESP 17 ++#define DOT11_WNM_ACTION_TIM_BCAST_REQ 18 ++#define DOT11_WNM_ACTION_TIM_BCAST_RESP 19 ++#define DOT11_WNM_ACTION_QOS_TRFC_CAP_UPD 20 ++#define DOT11_WNM_ACTION_CHAN_USAGE_REQ 21 ++#define DOT11_WNM_ACTION_CHAN_USAGE_RESP 22 ++#define DOT11_WNM_ACTION_DMS_REQ 23 ++#define DOT11_WNM_ACTION_DMS_RESP 24 ++#define DOT11_WNM_ACTION_TMNG_MEASUR_REQ 25 ++#define DOT11_WNM_ACTION_NOTFCTN_REQ 26 ++#define DOT11_WNM_ACTION_NOTFCTN_RES 27 ++ ++#define DOT11_MNG_COUNTRY_ID_LEN 3 ++ ++/* DLS Request frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_dls_req { ++ uint8 category; /* category of action frame (2) */ ++ uint8 action; /* DLS action: req (0) */ ++ struct ether_addr da; /* destination address */ ++ struct ether_addr sa; /* source address */ ++ uint16 cap; /* capability */ ++ uint16 timeout; /* timeout value */ ++ uint8 data[1]; /* IE:support rate, extend support rate, HT cap */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_dls_req dot11_dls_req_t; ++#define DOT11_DLS_REQ_LEN 18 /* Fixed length */ ++ ++/* DLS response frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_dls_resp { ++ uint8 category; /* category of action frame (2) */ ++ uint8 action; /* DLS action: req (0) */ ++ uint16 status; /* status code field */ ++ struct ether_addr da; /* destination address */ ++ struct ether_addr sa; /* source address */ ++ uint8 data[1]; /* optional: capability, rate ... */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_dls_resp dot11_dls_resp_t; ++#define DOT11_DLS_RESP_LEN 16 /* Fixed length */ ++ ++ ++/* BSS Management Transition Query frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_query { ++ uint8 category; /* category of action frame (10) */ ++ uint8 action; /* WNM action: trans_query (6) */ ++ uint8 token; /* dialog token */ ++ uint8 reason; /* transition query reason */ ++ uint8 data[1]; /* Elements */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_bss_trans_query dot11_bss_trans_query_t; ++#define DOT11_BSS_TRANS_QUERY_LEN 4 /* Fixed length */ ++ ++/* BSS Management Transition Request frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_req { ++ uint8 category; /* category of action frame (10) */ ++ uint8 action; /* WNM action: trans_req (7) */ ++ uint8 token; /* dialog token */ ++ uint8 reqmode; /* transition request mode */ ++ uint16 disassoc_tmr; /* disassociation timer */ ++ uint8 validity_intrvl; /* validity interval */ ++ uint8 data[1]; /* optional: BSS term duration, ... */ ++ /* ...session info URL, list */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_bss_trans_req dot11_bss_trans_req_t; ++#define DOT11_BSS_TRANS_REQ_LEN 7 /* Fixed length */ ++ ++#define DOT11_BSS_TERM_DUR_LEN 12 /* Fixed length if present */ ++ ++ ++/* BSS Mgmt Transition Request Mode Field - 802.11v */ ++#define DOT11_BSS_TRNS_REQMODE_PREF_LIST_INCL 0x01 ++#define DOT11_BSS_TRNS_REQMODE_ABRIDGED 0x02 ++#define DOT11_BSS_TRNS_REQMODE_DISASSOC_IMMINENT 0x04 ++#define DOT11_BSS_TRNS_REQMODE_BSS_TERM_INCL 0x08 ++#define DOT11_BSS_TRNS_REQMODE_ESS_DISASSOC_IMNT 0x10 ++ ++ ++/* BSS Management transition response frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_bss_trans_res { ++ uint8 category; /* category of action frame (10) */ ++ uint8 action; /* WNM action: trans_res (8) */ ++ uint8 token; /* dialog token */ ++ uint8 status; /* transition status */ ++ uint8 term_delay; /* validity interval */ ++ uint8 data[1]; /* optional: BSS term duration, ... */ ++ /* ...session info URL, list */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_bss_trans_res dot11_bss_trans_res_t; ++#define DOT11_BSS_TRANS_RES_LEN 5 /* Fixed length */ ++ ++/* BSS Mgmt Transition Response Status Field */ ++#define DOT11_BSS_TRNS_RES_STATUS_ACCEPT 0 ++#define DOT11_BSS_TRNS_RES_STATUS_REJECT 1 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_BCN 2 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_INSUFF_CAP 3 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_UNDESIRED 4 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_TERM_DELAY_REQ 5 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_BSS_LIST_PROVIDED 6 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_NO_SUITABLE_BSS 7 ++#define DOT11_BSS_TRNS_RES_STATUS_REJ_LEAVING_ESS 8 ++ ++ ++/* Neighbor Report BSSID Information Field */ ++#define DOT11_NBR_RPRT_BSSID_INFO_REACHABILTY 0x0003 ++#define DOT11_NBR_RPRT_BSSID_INFO_SEC 0x0004 ++#define DOT11_NBR_RPRT_BSSID_INFO_KEY_SCOPE 0x0008 ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP 0x03f0 ++ ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP_SPEC_MGMT 0x0010 ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP_QOS 0x0020 ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP_APSD 0x0040 ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP_RDIO_MSMT 0x0080 ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP_DEL_BA 0x0100 ++#define DOT11_NBR_RPRT_BSSID_INFO_CAP_IMM_BA 0x0200 ++ ++/* Neighbor Report Subelements */ ++#define DOT11_NBR_RPRT_SUBELEM_BSS_CANDDT_PREF_ID 3 ++ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_addba_req { ++ uint8 category; /* category of action frame (3) */ ++ uint8 action; /* action: addba req */ ++ uint8 token; /* identifier */ ++ uint16 addba_param_set; /* parameter set */ ++ uint16 timeout; /* timeout in seconds */ ++ uint16 start_seqnum; /* starting sequence number */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_addba_req dot11_addba_req_t; ++#define DOT11_ADDBA_REQ_LEN 9 /* length of addba req frame */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_addba_resp { ++ uint8 category; /* category of action frame (3) */ ++ uint8 action; /* action: addba resp */ ++ uint8 token; /* identifier */ ++ uint16 status; /* status of add request */ ++ uint16 addba_param_set; /* negotiated parameter set */ ++ uint16 timeout; /* negotiated timeout in seconds */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_addba_resp dot11_addba_resp_t; ++#define DOT11_ADDBA_RESP_LEN 9 /* length of addba resp frame */ ++ ++/* DELBA action parameters */ ++#define DOT11_DELBA_PARAM_INIT_MASK 0x0800 /* initiator mask */ ++#define DOT11_DELBA_PARAM_INIT_SHIFT 11 /* initiator shift */ ++#define DOT11_DELBA_PARAM_TID_MASK 0xf000 /* tid mask */ ++#define DOT11_DELBA_PARAM_TID_SHIFT 12 /* tid shift */ ++ ++BWL_PRE_PACKED_STRUCT struct dot11_delba { ++ uint8 category; /* category of action frame (3) */ ++ uint8 action; /* action: addba req */ ++ uint16 delba_param_set; /* paarmeter set */ ++ uint16 reason; /* reason for dellba */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_delba dot11_delba_t; ++#define DOT11_DELBA_LEN 6 /* length of delba frame */ ++ ++/* SA Query action field value */ ++#define SA_QUERY_REQUEST 0 ++#define SA_QUERY_RESPONSE 1 ++ ++/* ************* 802.11r related definitions. ************* */ ++ ++/* Over-the-DS Fast Transition Request frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_ft_req { ++ uint8 category; /* category of action frame (6) */ ++ uint8 action; /* action: ft req */ ++ uint8 sta_addr[ETHER_ADDR_LEN]; ++ uint8 tgt_ap_addr[ETHER_ADDR_LEN]; ++ uint8 data[1]; /* Elements */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_ft_req dot11_ft_req_t; ++#define DOT11_FT_REQ_FIXED_LEN 14 ++ ++/* Over-the-DS Fast Transition Response frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_ft_res { ++ uint8 category; /* category of action frame (6) */ ++ uint8 action; /* action: ft resp */ ++ uint8 sta_addr[ETHER_ADDR_LEN]; ++ uint8 tgt_ap_addr[ETHER_ADDR_LEN]; ++ uint16 status; /* status code */ ++ uint8 data[1]; /* Elements */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_ft_res dot11_ft_res_t; ++#define DOT11_FT_RES_FIXED_LEN 16 ++ ++ ++/* ************* 802.11k related definitions. ************* */ ++ ++/* Radio measurements enabled capability ie */ ++ ++#define DOT11_RRM_CAP_LEN 5 /* length of rrm cap bitmap */ ++BWL_PRE_PACKED_STRUCT struct dot11_rrm_cap_ie { ++ uint8 cap[DOT11_RRM_CAP_LEN]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rrm_cap_ie dot11_rrm_cap_ie_t; ++ ++/* Bitmap definitions for cap ie */ ++#define DOT11_RRM_CAP_LINK 0 ++#define DOT11_RRM_CAP_NEIGHBOR_REPORT 1 ++#define DOT11_RRM_CAP_PARALLEL 2 ++#define DOT11_RRM_CAP_REPEATED 3 ++#define DOT11_RRM_CAP_BCN_PASSIVE 4 ++#define DOT11_RRM_CAP_BCN_ACTIVE 5 ++#define DOT11_RRM_CAP_BCN_TABLE 6 ++#define DOT11_RRM_CAP_BCN_REP_COND 7 ++#define DOT11_RRM_CAP_AP_CHANREP 16 ++ ++ ++/* Operating Class (formerly "Regulatory Class") definitions */ ++#define DOT11_OP_CLASS_NONE 255 ++ ++ ++/* Radio Measurements action ids */ ++#define DOT11_RM_ACTION_RM_REQ 0 /* Radio measurement request */ ++#define DOT11_RM_ACTION_RM_REP 1 /* Radio measurement report */ ++#define DOT11_RM_ACTION_LM_REQ 2 /* Link measurement request */ ++#define DOT11_RM_ACTION_LM_REP 3 /* Link measurement report */ ++#define DOT11_RM_ACTION_NR_REQ 4 /* Neighbor report request */ ++#define DOT11_RM_ACTION_NR_REP 5 /* Neighbor report response */ ++ ++/* Generic radio measurement action frame header */ ++BWL_PRE_PACKED_STRUCT struct dot11_rm_action { ++ uint8 category; /* category of action frame (5) */ ++ uint8 action; /* radio measurement action */ ++ uint8 token; /* dialog token */ ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rm_action dot11_rm_action_t; ++#define DOT11_RM_ACTION_LEN 3 ++ ++BWL_PRE_PACKED_STRUCT struct dot11_rmreq { ++ uint8 category; /* category of action frame (5) */ ++ uint8 action; /* radio measurement action */ ++ uint8 token; /* dialog token */ ++ uint16 reps; /* no. of repetitions */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rmreq dot11_rmreq_t; ++#define DOT11_RMREQ_LEN 5 ++ ++BWL_PRE_PACKED_STRUCT struct dot11_rm_ie { ++ uint8 id; ++ uint8 len; ++ uint8 token; ++ uint8 mode; ++ uint8 type; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rm_ie dot11_rm_ie_t; ++#define DOT11_RM_IE_LEN 5 ++ ++/* Definitions for "mode" bits in rm req */ ++#define DOT11_RMREQ_MODE_PARALLEL 1 ++#define DOT11_RMREQ_MODE_ENABLE 2 ++#define DOT11_RMREQ_MODE_REQUEST 4 ++#define DOT11_RMREQ_MODE_REPORT 8 ++#define DOT11_RMREQ_MODE_DURMAND 0x10 /* Duration Mandatory */ ++ ++/* Definitions for "mode" bits in rm rep */ ++#define DOT11_RMREP_MODE_LATE 1 ++#define DOT11_RMREP_MODE_INCAPABLE 2 ++#define DOT11_RMREP_MODE_REFUSED 4 ++ ++BWL_PRE_PACKED_STRUCT struct dot11_rmreq_bcn { ++ uint8 id; ++ uint8 len; ++ uint8 token; ++ uint8 mode; ++ uint8 type; ++ uint8 reg; ++ uint8 channel; ++ uint16 interval; ++ uint16 duration; ++ uint8 bcn_mode; ++ struct ether_addr bssid; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rmreq_bcn dot11_rmreq_bcn_t; ++#define DOT11_RMREQ_BCN_LEN 18 ++ ++BWL_PRE_PACKED_STRUCT struct dot11_rmrep_bcn { ++ uint8 reg; ++ uint8 channel; ++ uint32 starttime[2]; ++ uint16 duration; ++ uint8 frame_info; ++ uint8 rcpi; ++ uint8 rsni; ++ struct ether_addr bssid; ++ uint8 antenna_id; ++ uint32 parent_tsf; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rmrep_bcn dot11_rmrep_bcn_t; ++#define DOT11_RMREP_BCN_LEN 26 ++ ++/* Beacon request measurement mode */ ++#define DOT11_RMREQ_BCN_PASSIVE 0 ++#define DOT11_RMREQ_BCN_ACTIVE 1 ++#define DOT11_RMREQ_BCN_TABLE 2 ++ ++/* Sub-element IDs for Beacon Request */ ++#define DOT11_RMREQ_BCN_SSID_ID 0 ++#define DOT11_RMREQ_BCN_REPINFO_ID 1 ++#define DOT11_RMREQ_BCN_REPDET_ID 2 ++#define DOT11_RMREQ_BCN_REQUEST_ID 10 ++#define DOT11_RMREQ_BCN_APCHREP_ID 51 ++ ++/* Reporting Detail element definition */ ++#define DOT11_RMREQ_BCN_REPDET_FIXED 0 /* Fixed length fields only */ ++#define DOT11_RMREQ_BCN_REPDET_REQUEST 1 /* + requested information elems */ ++#define DOT11_RMREQ_BCN_REPDET_ALL 2 /* All fields */ ++ ++/* Sub-element IDs for Beacon Report */ ++#define DOT11_RMREP_BCN_FRM_BODY 1 ++ ++/* Neighbor measurement report */ ++BWL_PRE_PACKED_STRUCT struct dot11_rmrep_nbr { ++ struct ether_addr bssid; ++ uint32 bssid_info; ++ uint8 reg; ++ uint8 channel; ++ uint8 phytype; ++ uchar sub_elements[1]; /* Variable size data */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_rmrep_nbr dot11_rmrep_nbr_t; ++#define DOT11_RMREP_NBR_LEN 13 ++ ++/* MLME Enumerations */ ++#define DOT11_BSSTYPE_INFRASTRUCTURE 0 /* d11 infrastructure */ ++#define DOT11_BSSTYPE_INDEPENDENT 1 /* d11 independent */ ++#define DOT11_BSSTYPE_ANY 2 /* d11 any BSS type */ ++#define DOT11_SCANTYPE_ACTIVE 0 /* d11 scan active */ ++#define DOT11_SCANTYPE_PASSIVE 1 /* d11 scan passive */ ++ ++/* Link Measurement */ ++BWL_PRE_PACKED_STRUCT struct dot11_lmreq { ++ uint8 category; /* category of action frame (5) */ ++ uint8 action; /* radio measurement action */ ++ uint8 token; /* dialog token */ ++ uint8 txpwr; /* Transmit Power Used */ ++ uint8 maxtxpwr; /* Max Transmit Power */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_lmreq dot11_lmreq_t; ++#define DOT11_LMREQ_LEN 5 ++ ++BWL_PRE_PACKED_STRUCT struct dot11_lmrep { ++ uint8 category; /* category of action frame (5) */ ++ uint8 action; /* radio measurement action */ ++ uint8 token; /* dialog token */ ++ dot11_tpc_rep_t tpc; /* TPC element */ ++ uint8 rxant; /* Receive Antenna ID */ ++ uint8 txant; /* Transmit Antenna ID */ ++ uint8 rcpi; /* RCPI */ ++ uint8 rsni; /* RSNI */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_lmrep dot11_lmrep_t; ++#define DOT11_LMREP_LEN 11 ++ ++/* 802.11 BRCM "Compromise" Pre N constants */ ++#define PREN_PREAMBLE 24 /* green field preamble time */ ++#define PREN_MM_EXT 12 /* extra mixed mode preamble time */ ++#define PREN_PREAMBLE_EXT 4 /* extra preamble (multiply by unique_streams-1) */ ++ ++/* 802.11N PHY constants */ ++#define RIFS_11N_TIME 2 /* NPHY RIFS time */ ++ ++/* 802.11 HT PLCP format 802.11n-2009, sec 20.3.9.4.3 ++ * HT-SIG is composed of two 24 bit parts, HT-SIG1 and HT-SIG2 ++ */ ++/* HT-SIG1 */ ++#define HT_SIG1_MCS_MASK 0x00007F ++#define HT_SIG1_CBW 0x000080 ++#define HT_SIG1_HT_LENGTH 0xFFFF00 ++ ++/* HT-SIG2 */ ++#define HT_SIG2_SMOOTHING 0x000001 ++#define HT_SIG2_NOT_SOUNDING 0x000002 ++#define HT_SIG2_RESERVED 0x000004 ++#define HT_SIG2_AGGREGATION 0x000008 ++#define HT_SIG2_STBC_MASK 0x000030 ++#define HT_SIG2_STBC_SHIFT 4 ++#define HT_SIG2_FEC_CODING 0x000040 ++#define HT_SIG2_SHORT_GI 0x000080 ++#define HT_SIG2_ESS_MASK 0x000300 ++#define HT_SIG2_ESS_SHIFT 8 ++#define HT_SIG2_CRC 0x03FC00 ++#define HT_SIG2_TAIL 0x1C0000 ++ ++/* 802.11 A PHY constants */ ++#define APHY_SLOT_TIME 9 /* APHY slot time */ ++#define APHY_SIFS_TIME 16 /* APHY SIFS time */ ++#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) /* APHY DIFS time */ ++#define APHY_PREAMBLE_TIME 16 /* APHY preamble time */ ++#define APHY_SIGNAL_TIME 4 /* APHY signal time */ ++#define APHY_SYMBOL_TIME 4 /* APHY symbol time */ ++#define APHY_SERVICE_NBITS 16 /* APHY service nbits */ ++#define APHY_TAIL_NBITS 6 /* APHY tail nbits */ ++#define APHY_CWMIN 15 /* APHY cwmin */ ++ ++/* 802.11 B PHY constants */ ++#define BPHY_SLOT_TIME 20 /* BPHY slot time */ ++#define BPHY_SIFS_TIME 10 /* BPHY SIFS time */ ++#define BPHY_DIFS_TIME 50 /* BPHY DIFS time */ ++#define BPHY_PLCP_TIME 192 /* BPHY PLCP time */ ++#define BPHY_PLCP_SHORT_TIME 96 /* BPHY PLCP short time */ ++#define BPHY_CWMIN 31 /* BPHY cwmin */ ++ ++/* 802.11 G constants */ ++#define DOT11_OFDM_SIGNAL_EXTENSION 6 /* d11 OFDM signal extension */ ++ ++#define PHY_CWMAX 1023 /* PHY cwmax */ ++ ++#define DOT11_MAXNUMFRAGS 16 /* max # fragments per MSDU */ ++ ++/* 802.11 AC (VHT) constants */ ++ ++typedef int vht_group_id_t; ++ ++/* for VHT-A1 */ ++/* SIG-A1 reserved bits */ ++#define VHT_SIGA1_CONST_MASK 0x800004 ++ ++#define VHT_SIGA1_20MHZ_VAL 0x000000 ++#define VHT_SIGA1_40MHZ_VAL 0x000001 ++#define VHT_SIGA1_80MHZ_VAL 0x000002 ++#define VHT_SIGA1_160MHZ_VAL 0x000003 ++ ++#define VHT_SIGA1_STBC 0x000008 ++ ++#define VHT_SIGA1_GID_MAX_GID 0x3f ++#define VHT_SIGA1_GID_SHIFT 4 ++#define VHT_SIGA1_GID_TO_AP 0x00 ++#define VHT_SIGA1_GID_NOT_TO_AP 0x3f ++ ++#define VHT_SIGA1_NSTS_SHIFT 10 ++#define VHT_SIGA1_NSTS_SHIFT_MASK_USER0 0x001C00 ++ ++#define VHT_SIGA1_PARTIAL_AID_SHIFT 13 ++ ++/* for VHT-A2 */ ++#define VHT_SIGA2_GI_NONE 0x000000 ++#define VHT_SIGA2_GI_SHORT 0x000001 ++#define VHT_SIGA2_GI_W_MOD10 0x000002 ++#define VHT_SIGA2_CODING_LDPC 0x000004 ++#define VHT_SIGA2_BEAMFORM_ENABLE 0x000100 ++#define VHT_SIGA2_MCS_SHIFT 4 ++ ++#define VHT_SIGA2_B9_RESERVED 0x000200 ++#define VHT_SIGA2_TAIL_MASK 0xfc0000 ++#define VHT_SIGA2_TAIL_VALUE 0x000000 ++ ++#define VHT_SIGA2_SVC_BITS 16 ++#define VHT_SIGA2_TAIL_BITS 6 ++ ++ ++/* dot11Counters Table - 802.11 spec., Annex D */ ++typedef struct d11cnt { ++ uint32 txfrag; /* dot11TransmittedFragmentCount */ ++ uint32 txmulti; /* dot11MulticastTransmittedFrameCount */ ++ uint32 txfail; /* dot11FailedCount */ ++ uint32 txretry; /* dot11RetryCount */ ++ uint32 txretrie; /* dot11MultipleRetryCount */ ++ uint32 rxdup; /* dot11FrameduplicateCount */ ++ uint32 txrts; /* dot11RTSSuccessCount */ ++ uint32 txnocts; /* dot11RTSFailureCount */ ++ uint32 txnoack; /* dot11ACKFailureCount */ ++ uint32 rxfrag; /* dot11ReceivedFragmentCount */ ++ uint32 rxmulti; /* dot11MulticastReceivedFrameCount */ ++ uint32 rxcrc; /* dot11FCSErrorCount */ ++ uint32 txfrmsnt; /* dot11TransmittedFrameCount */ ++ uint32 rxundec; /* dot11WEPUndecryptableCount */ ++} d11cnt_t; ++ ++/* OUI for BRCM proprietary IE */ ++#define BRCM_PROP_OUI "\x00\x90\x4C" /* Broadcom proprietary OUI */ ++ ++ ++/* BRCM OUI: Used in the proprietary(221) IE in all broadcom devices */ ++#define BRCM_OUI "\x00\x10\x18" /* Broadcom OUI */ ++ ++/* BRCM info element */ ++BWL_PRE_PACKED_STRUCT struct brcm_ie { ++ uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ ++ uint8 len; /* IE length */ ++ uint8 oui[3]; /* Proprietary OUI, BRCM_OUI */ ++ uint8 ver; /* type/ver of this IE */ ++ uint8 assoc; /* # of assoc STAs */ ++ uint8 flags; /* misc flags */ ++ uint8 flags1; /* misc flags */ ++ uint16 amsdu_mtu_pref; /* preferred A-MSDU MTU */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct brcm_ie brcm_ie_t; ++#define BRCM_IE_LEN 11 /* BRCM IE length */ ++#define BRCM_IE_VER 2 /* BRCM IE version */ ++#define BRCM_IE_LEGACY_AES_VER 1 /* BRCM IE legacy AES version */ ++ ++/* brcm_ie flags */ ++#define BRF_LZWDS 0x4 /* lazy wds enabled */ ++#define BRF_BLOCKACK 0x8 /* BlockACK capable */ ++ ++/* brcm_ie flags1 */ ++#define BRF1_AMSDU 0x1 /* A-MSDU capable */ ++#define BRF1_WMEPS 0x4 /* AP is capable of handling WME + PS w/o APSD */ ++#define BRF1_PSOFIX 0x8 /* AP has fixed PS mode out-of-order packets */ ++#define BRF1_RX_LARGE_AGG 0x10 /* device can rx large aggregates */ ++#define BRF1_RFAWARE_DCS 0x20 /* RFAWARE dynamic channel selection (DCS) */ ++#define BRF1_SOFTAP 0x40 /* Configure as Broadcom SOFTAP */ ++ ++/* Vendor IE structure */ ++BWL_PRE_PACKED_STRUCT struct vndr_ie { ++ uchar id; ++ uchar len; ++ uchar oui [3]; ++ uchar data [1]; /* Variable size data */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct vndr_ie vndr_ie_t; ++ ++#define VNDR_IE_HDR_LEN 2 /* id + len field */ ++#define VNDR_IE_MIN_LEN 3 /* size of the oui field */ ++#define VNDR_IE_FIXED_LEN (VNDR_IE_HDR_LEN + VNDR_IE_MIN_LEN) ++#define VNDR_IE_MAX_LEN 256 /* verdor IE max length */ ++ ++/* ************* HT definitions. ************* */ ++#define MCSSET_LEN 16 /* 16-bits per 8-bit set to give 128-bits bitmap of MCS Index */ ++#define MAX_MCS_NUM (128) /* max mcs number = 128 */ ++ ++BWL_PRE_PACKED_STRUCT struct ht_cap_ie { ++ uint16 cap; ++ uint8 params; ++ uint8 supp_mcs[MCSSET_LEN]; ++ uint16 ext_htcap; ++ uint32 txbf_cap; ++ uint8 as_cap; ++} BWL_POST_PACKED_STRUCT; ++typedef struct ht_cap_ie ht_cap_ie_t; ++ ++/* CAP IE: HT 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */ ++/* the capability IE is primarily used to convey this nodes abilities */ ++BWL_PRE_PACKED_STRUCT struct ht_prop_cap_ie { ++ uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ ++ uint8 len; /* IE length */ ++ uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ ++ uint8 type; /* type inidicates what follows */ ++ ht_cap_ie_t cap_ie; ++} BWL_POST_PACKED_STRUCT; ++typedef struct ht_prop_cap_ie ht_prop_cap_ie_t; ++ ++#define HT_PROP_IE_OVERHEAD 4 /* overhead bytes for prop oui ie */ ++#define HT_CAP_IE_LEN 26 /* HT capability len (based on .11n d2.0) */ ++#define HT_CAP_IE_TYPE 51 ++ ++#define HT_CAP_LDPC_CODING 0x0001 /* Support for rx of LDPC coded pkts */ ++#define HT_CAP_40MHZ 0x0002 /* FALSE:20Mhz, TRUE:20/40MHZ supported */ ++#define HT_CAP_MIMO_PS_MASK 0x000C /* Mimo PS mask */ ++#define HT_CAP_MIMO_PS_SHIFT 0x0002 /* Mimo PS shift */ ++#define HT_CAP_MIMO_PS_OFF 0x0003 /* Mimo PS, no restriction */ ++#define HT_CAP_MIMO_PS_RTS 0x0001 /* Mimo PS, send RTS/CTS around MIMO frames */ ++#define HT_CAP_MIMO_PS_ON 0x0000 /* Mimo PS, MIMO disallowed */ ++#define HT_CAP_GF 0x0010 /* Greenfield preamble support */ ++#define HT_CAP_SHORT_GI_20 0x0020 /* 20MHZ short guard interval support */ ++#define HT_CAP_SHORT_GI_40 0x0040 /* 40Mhz short guard interval support */ ++#define HT_CAP_TX_STBC 0x0080 /* Tx STBC support */ ++#define HT_CAP_RX_STBC_MASK 0x0300 /* Rx STBC mask */ ++#define HT_CAP_RX_STBC_SHIFT 8 /* Rx STBC shift */ ++#define HT_CAP_DELAYED_BA 0x0400 /* delayed BA support */ ++#define HT_CAP_MAX_AMSDU 0x0800 /* Max AMSDU size in bytes , 0=3839, 1=7935 */ ++ ++#define HT_CAP_DSSS_CCK 0x1000 /* DSSS/CCK supported by the BSS */ ++#define HT_CAP_PSMP 0x2000 /* Power Save Multi Poll support */ ++#define HT_CAP_40MHZ_INTOLERANT 0x4000 /* 40MHz Intolerant */ ++#define HT_CAP_LSIG_TXOP 0x8000 /* L-SIG TXOP protection support */ ++ ++#define HT_CAP_RX_STBC_NO 0x0 /* no rx STBC support */ ++#define HT_CAP_RX_STBC_ONE_STREAM 0x1 /* rx STBC support of 1 spatial stream */ ++#define HT_CAP_RX_STBC_TWO_STREAM 0x2 /* rx STBC support of 1-2 spatial streams */ ++#define HT_CAP_RX_STBC_THREE_STREAM 0x3 /* rx STBC support of 1-3 spatial streams */ ++ ++#define VHT_MAX_MPDU 11454 /* max mpdu size for now (bytes) */ ++#define VHT_MPDU_MSDU_DELTA 56 /* Difference in spec - vht mpdu, amsdu len */ ++/* Max AMSDU len - per spec */ ++#define VHT_MAX_AMSDU (VHT_MAX_MPDU - VHT_MPDU_MSDU_DELTA) ++ ++#define HT_MAX_AMSDU 7935 /* max amsdu size (bytes) per the HT spec */ ++#define HT_MIN_AMSDU 3835 /* min amsdu size (bytes) per the HT spec */ ++ ++#define HT_PARAMS_RX_FACTOR_MASK 0x03 /* ampdu rcv factor mask */ ++#define HT_PARAMS_DENSITY_MASK 0x1C /* ampdu density mask */ ++#define HT_PARAMS_DENSITY_SHIFT 2 /* ampdu density shift */ ++ ++/* HT/AMPDU specific define */ ++#define AMPDU_MAX_MPDU_DENSITY 7 /* max mpdu density; in 1/4 usec units */ ++#define AMPDU_DENSITY_NONE 0 /* No density requirement */ ++#define AMPDU_DENSITY_1over4_US 1 /* 1/4 us density */ ++#define AMPDU_DENSITY_1over2_US 2 /* 1/2 us density */ ++#define AMPDU_DENSITY_1_US 3 /* 1 us density */ ++#define AMPDU_DENSITY_2_US 4 /* 2 us density */ ++#define AMPDU_DENSITY_4_US 5 /* 4 us density */ ++#define AMPDU_DENSITY_8_US 6 /* 8 us density */ ++#define AMPDU_DENSITY_16_US 7 /* 16 us density */ ++#define AMPDU_RX_FACTOR_8K 0 /* max rcv ampdu len (8kb) */ ++#define AMPDU_RX_FACTOR_16K 1 /* max rcv ampdu len (16kb) */ ++#define AMPDU_RX_FACTOR_32K 2 /* max rcv ampdu len (32kb) */ ++#define AMPDU_RX_FACTOR_64K 3 /* max rcv ampdu len (64kb) */ ++#define AMPDU_RX_FACTOR_BASE 8*1024 /* ampdu factor base for rx len */ ++ ++#define AMPDU_DELIMITER_LEN 4 /* length of ampdu delimiter */ ++#define AMPDU_DELIMITER_LEN_MAX 63 /* max length of ampdu delimiter(enforced in HW) */ ++ ++#define HT_CAP_EXT_PCO 0x0001 ++#define HT_CAP_EXT_PCO_TTIME_MASK 0x0006 ++#define HT_CAP_EXT_PCO_TTIME_SHIFT 1 ++#define HT_CAP_EXT_MCS_FEEDBACK_MASK 0x0300 ++#define HT_CAP_EXT_MCS_FEEDBACK_SHIFT 8 ++#define HT_CAP_EXT_HTC 0x0400 ++#define HT_CAP_EXT_RD_RESP 0x0800 ++ ++BWL_PRE_PACKED_STRUCT struct ht_add_ie { ++ uint8 ctl_ch; /* control channel number */ ++ uint8 byte1; /* ext ch,rec. ch. width, RIFS support */ ++ uint16 opmode; /* operation mode */ ++ uint16 misc_bits; /* misc bits */ ++ uint8 basic_mcs[MCSSET_LEN]; /* required MCS set */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct ht_add_ie ht_add_ie_t; ++ ++/* ADD IE: HT 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */ ++/* the additional IE is primarily used to convey the current BSS configuration */ ++BWL_PRE_PACKED_STRUCT struct ht_prop_add_ie { ++ uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ ++ uint8 len; /* IE length */ ++ uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ ++ uint8 type; /* indicates what follows */ ++ ht_add_ie_t add_ie; ++} BWL_POST_PACKED_STRUCT; ++typedef struct ht_prop_add_ie ht_prop_add_ie_t; ++ ++#define HT_ADD_IE_LEN 22 ++#define HT_ADD_IE_TYPE 52 ++ ++/* byte1 defn's */ ++#define HT_BW_ANY 0x04 /* set, STA can use 20 or 40MHz */ ++#define HT_RIFS_PERMITTED 0x08 /* RIFS allowed */ ++ ++/* opmode defn's */ ++#define HT_OPMODE_MASK 0x0003 /* protection mode mask */ ++#define HT_OPMODE_SHIFT 0 /* protection mode shift */ ++#define HT_OPMODE_PURE 0x0000 /* protection mode PURE */ ++#define HT_OPMODE_OPTIONAL 0x0001 /* protection mode optional */ ++#define HT_OPMODE_HT20IN40 0x0002 /* protection mode 20MHz HT in 40MHz BSS */ ++#define HT_OPMODE_MIXED 0x0003 /* protection mode Mixed Mode */ ++#define HT_OPMODE_NONGF 0x0004 /* protection mode non-GF */ ++#define DOT11N_TXBURST 0x0008 /* Tx burst limit */ ++#define DOT11N_OBSS_NONHT 0x0010 /* OBSS Non-HT STA present */ ++ ++/* misc_bites defn's */ ++#define HT_BASIC_STBC_MCS 0x007f /* basic STBC MCS */ ++#define HT_DUAL_STBC_PROT 0x0080 /* Dual STBC Protection */ ++#define HT_SECOND_BCN 0x0100 /* Secondary beacon support */ ++#define HT_LSIG_TXOP 0x0200 /* L-SIG TXOP Protection full support */ ++#define HT_PCO_ACTIVE 0x0400 /* PCO active */ ++#define HT_PCO_PHASE 0x0800 /* PCO phase */ ++#define HT_DUALCTS_PROTECTION 0x0080 /* DUAL CTS protection needed */ ++ ++/* Tx Burst Limits */ ++#define DOT11N_2G_TXBURST_LIMIT 6160 /* 2G band Tx burst limit per 802.11n Draft 1.10 (usec) */ ++#define DOT11N_5G_TXBURST_LIMIT 3080 /* 5G band Tx burst limit per 802.11n Draft 1.10 (usec) */ ++ ++/* Macros for opmode */ ++#define GET_HT_OPMODE(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ ++ >> HT_OPMODE_SHIFT) ++#define HT_MIXEDMODE_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ ++ == HT_OPMODE_MIXED) /* mixed mode present */ ++#define HT_HT20_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ ++ == HT_OPMODE_HT20IN40) /* 20MHz HT present */ ++#define HT_OPTIONAL_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_MASK) \ ++ == HT_OPMODE_OPTIONAL) /* Optional protection present */ ++#define HT_USE_PROTECTION(add_ie) (HT_HT20_PRESENT((add_ie)) || \ ++ HT_MIXEDMODE_PRESENT((add_ie))) /* use protection */ ++#define HT_NONGF_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & HT_OPMODE_NONGF) \ ++ == HT_OPMODE_NONGF) /* non-GF present */ ++#define DOT11N_TXBURST_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_TXBURST) \ ++ == DOT11N_TXBURST) /* Tx Burst present */ ++#define DOT11N_OBSS_NONHT_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_OBSS_NONHT) \ ++ == DOT11N_OBSS_NONHT) /* OBSS Non-HT present */ ++ ++BWL_PRE_PACKED_STRUCT struct obss_params { ++ uint16 passive_dwell; ++ uint16 active_dwell; ++ uint16 bss_widthscan_interval; ++ uint16 passive_total; ++ uint16 active_total; ++ uint16 chanwidth_transition_dly; ++ uint16 activity_threshold; ++} BWL_POST_PACKED_STRUCT; ++typedef struct obss_params obss_params_t; ++ ++BWL_PRE_PACKED_STRUCT struct dot11_obss_ie { ++ uint8 id; ++ uint8 len; ++ obss_params_t obss_params; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_obss_ie dot11_obss_ie_t; ++#define DOT11_OBSS_SCAN_IE_LEN sizeof(obss_params_t) /* HT OBSS len (based on 802.11n d3.0) */ ++ ++/* HT control field */ ++#define HT_CTRL_LA_TRQ 0x00000002 /* sounding request */ ++#define HT_CTRL_LA_MAI 0x0000003C /* MCS request or antenna selection indication */ ++#define HT_CTRL_LA_MAI_SHIFT 2 ++#define HT_CTRL_LA_MAI_MRQ 0x00000004 /* MCS request */ ++#define HT_CTRL_LA_MAI_MSI 0x00000038 /* MCS request sequence identifier */ ++#define HT_CTRL_LA_MFSI 0x000001C0 /* MFB sequence identifier */ ++#define HT_CTRL_LA_MFSI_SHIFT 6 ++#define HT_CTRL_LA_MFB_ASELC 0x0000FE00 /* MCS feedback, antenna selection command/data */ ++#define HT_CTRL_LA_MFB_ASELC_SH 9 ++#define HT_CTRL_LA_ASELC_CMD 0x00000C00 /* ASEL command */ ++#define HT_CTRL_LA_ASELC_DATA 0x0000F000 /* ASEL data */ ++#define HT_CTRL_CAL_POS 0x00030000 /* Calibration position */ ++#define HT_CTRL_CAL_SEQ 0x000C0000 /* Calibration sequence */ ++#define HT_CTRL_CSI_STEERING 0x00C00000 /* CSI/Steering */ ++#define HT_CTRL_CSI_STEER_SHIFT 22 ++#define HT_CTRL_CSI_STEER_NFB 0 /* no fedback required */ ++#define HT_CTRL_CSI_STEER_CSI 1 /* CSI, H matrix */ ++#define HT_CTRL_CSI_STEER_NCOM 2 /* non-compressed beamforming */ ++#define HT_CTRL_CSI_STEER_COM 3 /* compressed beamforming */ ++#define HT_CTRL_NDP_ANNOUNCE 0x01000000 /* NDP announcement */ ++#define HT_CTRL_AC_CONSTRAINT 0x40000000 /* AC Constraint */ ++#define HT_CTRL_RDG_MOREPPDU 0x80000000 /* RDG/More PPDU */ ++ ++#define HT_OPMODE_OPTIONAL 0x0001 /* protection mode optional */ ++#define HT_OPMODE_HT20IN40 0x0002 /* protection mode 20MHz HT in 40MHz BSS */ ++#define HT_OPMODE_MIXED 0x0003 /* protection mode Mixed Mode */ ++#define HT_OPMODE_NONGF 0x0004 /* protection mode non-GF */ ++#define DOT11N_TXBURST 0x0008 /* Tx burst limit */ ++#define DOT11N_OBSS_NONHT 0x0010 /* OBSS Non-HT STA present */ ++ ++/* ************* VHT definitions. ************* */ ++ ++BWL_PRE_PACKED_STRUCT struct vht_cap_ie { ++ uint32 vht_cap_info; ++ /* supported MCS set - 64 bit field */ ++ uint16 rx_mcs_map; ++ uint16 rx_max_rate; ++ uint16 tx_mcs_map; ++ uint16 tx_max_rate; ++} BWL_POST_PACKED_STRUCT; ++typedef struct vht_cap_ie vht_cap_ie_t; ++/* 4B cap_info + 8B supp_mcs */ ++#define VHT_CAP_IE_LEN 12 ++/* 32bit - cap info */ ++#define VHT_CAP_INFO_MAX_MPDU_LEN_MASK 0x00000003 ++#define VHT_CAP_INFO_SUPP_CHAN_WIDTH_MASK 0x0000000c ++#define VHT_CAP_INFO_LDPC 0x00000010 ++#define VHT_CAP_INFO_SGI_80MHZ 0x00000020 ++ ++#define VHT_CAP_INFO_SGI_160MHZ 0x00000040 ++#define VHT_CAP_INFO_TX_STBC 0x00000080 ++ ++#define VHT_CAP_INFO_RX_STBC_MASK 0x00000700 ++#define VHT_CAP_INFO_RX_STBC_SHIFT 8 ++#define VHT_CAP_INFO_SU_BEAMFMR 0x00000800 ++#define VHT_CAP_INFO_SU_BEAMFMEE 0x00001000 ++#define VHT_CAP_INFO_NUM_BMFMR_ANT_MASK 0x0000e000 ++#define VHT_CAP_INFO_NUM_BMFMR_ANT_SHIFT 13 ++ ++#define VHT_CAP_INFO_NUM_SOUNDING_DIM_MASK 0x00070000 ++#define VHT_CAP_INFO_NUM_SOUNDING_DIM_SHIFT 16 ++#define VHT_CAP_INFO_MU_BEAMFMR 0x00080000 ++#define VHT_CAP_INFO_MU_BEAMFMEE 0x00100000 ++#define VHT_CAP_INFO_TXOPPS 0x00200000 ++#define VHT_CAP_INFO_HTCVHT 0x00400000 ++#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_MASK 0x03800000 ++#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_SHIFT 23 ++ ++#define VHT_CAP_INFO_LINK_ADAPT_CAP_MASK 0x0c000000 ++#define VHT_CAP_INFO_LINK_ADAPT_CAP_SHIFT 26 ++ ++/* 64-bit Supp MCS. */ ++#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_MASK 0x1fff ++#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_SHIFT 0 ++ ++#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_MASK 0x1fff ++#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_SHIFT 0 ++ ++#define VHT_CAP_MCS_MAP_0_7 0 ++#define VHT_CAP_MCS_MAP_0_8 1 ++#define VHT_CAP_MCS_MAP_0_9 2 ++#define VHT_CAP_MCS_MAP_NONE 3 ++ ++#define VHT_CAP_MCS_MAP_NSS_MAX 8 ++ ++/* VHT Capabilities Supported Channel Width */ ++typedef enum vht_cap_chan_width { ++ VHT_CAP_CHAN_WIDTH_20_40 = 0x00, ++ VHT_CAP_CHAN_WIDTH_80 = 0x04, ++ VHT_CAP_CHAN_WIDTH_160 = 0x08 ++} vht_cap_chan_width_t; ++ ++/* VHT Capabilities Supported max MPDU LEN */ ++typedef enum vht_cap_max_mpdu_len { ++ VHT_CAP_MPDU_MAX_4K = 0x00, ++ VHT_CAP_MPDU_MAX_8K = 0x01, ++ VHT_CAP_MPDU_MAX_11K = 0x02 ++} vht_cap_max_mpdu_len_t; ++ ++/* VHT Operation Element */ ++BWL_PRE_PACKED_STRUCT struct vht_op_ie { ++ uint8 chan_width; ++ uint8 chan1; ++ uint8 chan2; ++ uint16 supp_mcs; /* same def as above in vht cap */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct vht_op_ie vht_op_ie_t; ++/* 3B VHT Op info + 2B Basic MCS */ ++#define VHT_OP_IE_LEN 5 ++ ++typedef enum vht_op_chan_width { ++ VHT_OP_CHAN_WIDTH_20_40 = 0, ++ VHT_OP_CHAN_WIDTH_80 = 1, ++ VHT_OP_CHAN_WIDTH_160 = 2, ++ VHT_OP_CHAN_WIDTH_80_80 = 3 ++} vht_op_chan_width_t; ++ ++/* Def for rx & tx basic mcs maps - ea ss num has 2 bits of info */ ++#define VHT_MCS_MAP_GET_SS_IDX(nss) (((nss)-1)*2) ++#define VHT_MCS_MAP_GET_MCS_PER_SS(nss, mcsMap) \ ++ (((mcsMap) >> VHT_MCS_MAP_GET_SS_IDX(nss)) & 0x3) ++#define VHT_MCS_MAP_SET_MCS_PER_SS(nss, numMcs, mcsMap) \ ++ ((mcsMap) |= (((numMcs) & 0x3) << VHT_MCS_MAP_GET_SS_IDX(nss))) ++ ++/* ************* WPA definitions. ************* */ ++#define WPA_OUI "\x00\x50\xF2" /* WPA OUI */ ++#define WPA_OUI_LEN 3 /* WPA OUI length */ ++#define WPA_OUI_TYPE 1 ++#define WPA_VERSION 1 /* WPA version */ ++#define WPA2_OUI "\x00\x0F\xAC" /* WPA2 OUI */ ++#define WPA2_OUI_LEN 3 /* WPA2 OUI length */ ++#define WPA2_VERSION 1 /* WPA2 version */ ++#define WPA2_VERSION_LEN 2 /* WAP2 version length */ ++ ++/* ************* WPS definitions. ************* */ ++#define WPS_OUI "\x00\x50\xF2" /* WPS OUI */ ++#define WPS_OUI_LEN 3 /* WPS OUI length */ ++#define WPS_OUI_TYPE 4 ++ ++/* ************* WFA definitions. ************* */ ++ ++#ifdef P2P_IE_OVRD ++#define WFA_OUI MAC_OUI ++#else ++#define WFA_OUI "\x50\x6F\x9A" /* WFA OUI */ ++#endif /* P2P_IE_OVRD */ ++#define WFA_OUI_LEN 3 /* WFA OUI length */ ++#ifdef P2P_IE_OVRD ++#define WFA_OUI_TYPE_P2P MAC_OUI_TYPE_P2P ++#else ++#define WFA_OUI_TYPE_P2P 9 ++#endif ++ ++#define WFA_OUI_TYPE_TPC 8 ++#ifdef WLTDLS ++#define WFA_OUI_TYPE_WFD 10 ++#endif /* WTDLS */ ++ ++/* RSN authenticated key managment suite */ ++#define RSN_AKM_NONE 0 /* None (IBSS) */ ++#define RSN_AKM_UNSPECIFIED 1 /* Over 802.1x */ ++#define RSN_AKM_PSK 2 /* Pre-shared Key */ ++#define RSN_AKM_FBT_1X 3 /* Fast Bss transition using 802.1X */ ++#define RSN_AKM_FBT_PSK 4 /* Fast Bss transition using Pre-shared Key */ ++#define RSN_AKM_MFP_1X 5 /* SHA256 key derivation, using 802.1X */ ++#define RSN_AKM_MFP_PSK 6 /* SHA256 key derivation, using Pre-shared Key */ ++#define RSN_AKM_TPK 7 /* TPK(TDLS Peer Key) handshake */ ++ ++/* Key related defines */ ++#define DOT11_MAX_DEFAULT_KEYS 4 /* number of default keys */ ++#define DOT11_MAX_KEY_SIZE 32 /* max size of any key */ ++#define DOT11_MAX_IV_SIZE 16 /* max size of any IV */ ++#define DOT11_EXT_IV_FLAG (1<<5) /* flag to indicate IV is > 4 bytes */ ++#define DOT11_WPA_KEY_RSC_LEN 8 /* WPA RSC key len */ ++ ++#define WEP1_KEY_SIZE 5 /* max size of any WEP key */ ++#define WEP1_KEY_HEX_SIZE 10 /* size of WEP key in hex. */ ++#define WEP128_KEY_SIZE 13 /* max size of any WEP key */ ++#define WEP128_KEY_HEX_SIZE 26 /* size of WEP key in hex. */ ++#define TKIP_MIC_SIZE 8 /* size of TKIP MIC */ ++#define TKIP_EOM_SIZE 7 /* max size of TKIP EOM */ ++#define TKIP_EOM_FLAG 0x5a /* TKIP EOM flag byte */ ++#define TKIP_KEY_SIZE 32 /* size of any TKIP key */ ++#define TKIP_MIC_AUTH_TX 16 /* offset to Authenticator MIC TX key */ ++#define TKIP_MIC_AUTH_RX 24 /* offset to Authenticator MIC RX key */ ++#define TKIP_MIC_SUP_RX TKIP_MIC_AUTH_TX /* offset to Supplicant MIC RX key */ ++#define TKIP_MIC_SUP_TX TKIP_MIC_AUTH_RX /* offset to Supplicant MIC TX key */ ++#define AES_KEY_SIZE 16 /* size of AES key */ ++#define AES_MIC_SIZE 8 /* size of AES MIC */ ++#define BIP_KEY_SIZE 16 /* size of BIP key */ ++ ++/* WCN */ ++#define WCN_OUI "\x00\x50\xf2" /* WCN OUI */ ++#define WCN_TYPE 4 /* WCN type */ ++#ifdef BCMWAPI_WPI ++#define SMS4_KEY_LEN 16 ++#define SMS4_WPI_CBC_MAC_LEN 16 ++#endif ++ ++ ++/* 802.11r protocol definitions */ ++ ++/* Mobility Domain IE */ ++BWL_PRE_PACKED_STRUCT struct dot11_mdid_ie { ++ uint8 id; ++ uint8 len; ++ uint16 mdid; /* Mobility Domain Id */ ++ uint8 cap; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_mdid_ie dot11_mdid_ie_t; ++ ++#define FBT_MDID_CAP_OVERDS 0x01 /* Fast Bss transition over the DS support */ ++#define FBT_MDID_CAP_RRP 0x02 /* Resource request protocol support */ ++ ++/* Fast Bss Transition IE */ ++BWL_PRE_PACKED_STRUCT struct dot11_ft_ie { ++ uint8 id; ++ uint8 len; ++ uint16 mic_control; /* Mic Control */ ++ uint8 mic[16]; ++ uint8 anonce[32]; ++ uint8 snonce[32]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_ft_ie dot11_ft_ie_t; ++ ++#define TIE_TYPE_RESERVED 0 ++#define TIE_TYPE_REASSOC_DEADLINE 1 ++#define TIE_TYPE_KEY_LIEFTIME 2 ++#define TIE_TYPE_ASSOC_COMEBACK 3 ++BWL_PRE_PACKED_STRUCT struct dot11_timeout_ie { ++ uint8 id; ++ uint8 len; ++ uint8 type; /* timeout interval type */ ++ uint32 value; /* timeout interval value */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_timeout_ie dot11_timeout_ie_t; ++ ++ ++/* GTK ie */ ++BWL_PRE_PACKED_STRUCT struct dot11_gtk_ie { ++ uint8 id; ++ uint8 len; ++ uint16 key_info; ++ uint8 key_len; ++ uint8 rsc[8]; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT; ++typedef struct dot11_gtk_ie dot11_gtk_ie_t; ++ ++#define BSSID_INVALID "\x00\x00\x00\x00\x00\x00" ++#define BSSID_BROADCAST "\xFF\xFF\xFF\xFF\xFF\xFF" ++ ++ ++/* ************* WMM Parameter definitions. ************* */ ++#define WMM_OUI "\x00\x50\xF2" /* WNN OUI */ ++#define WMM_OUI_LEN 3 /* WMM OUI length */ ++#define WMM_OUI_TYPE 2 /* WMM OUT type */ ++#define WMM_VERSION 1 ++#define WMM_VERSION_LEN 1 ++ ++/* WMM OUI subtype */ ++#define WMM_OUI_SUBTYPE_PARAMETER 1 ++#define WMM_PARAMETER_IE_LEN 24 ++ ++/* Link Identifier Element */ ++BWL_PRE_PACKED_STRUCT struct link_id_ie { ++ uint8 id; ++ uint8 len; ++ struct ether_addr bssid; ++ struct ether_addr tdls_init_mac; ++ struct ether_addr tdls_resp_mac; ++} BWL_POST_PACKED_STRUCT; ++typedef struct link_id_ie link_id_ie_t; ++#define TDLS_LINK_ID_IE_LEN 18 ++ ++/* Link Wakeup Schedule Element */ ++BWL_PRE_PACKED_STRUCT struct wakeup_sch_ie { ++ uint8 id; ++ uint8 len; ++ uint32 offset; /* in ms between TSF0 and start of 1st Awake Window */ ++ uint32 interval; /* in ms bwtween the start of 2 Awake Windows */ ++ uint32 awake_win_slots; /* in backof slots, duration of Awake Window */ ++ uint32 max_wake_win; /* in ms, max duration of Awake Window */ ++ uint16 idle_cnt; /* number of consecutive Awake Windows */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wakeup_sch_ie wakeup_sch_ie_t; ++#define TDLS_WAKEUP_SCH_IE_LEN 18 ++ ++/* Channel Switch Timing Element */ ++BWL_PRE_PACKED_STRUCT struct channel_switch_timing_ie { ++ uint8 id; ++ uint8 len; ++ uint16 switch_time; /* in ms, time to switch channels */ ++ uint16 switch_timeout; /* in ms */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct channel_switch_timing_ie channel_switch_timing_ie_t; ++#define TDLS_CHANNEL_SWITCH_TIMING_IE_LEN 4 ++ ++/* PTI Control Element */ ++BWL_PRE_PACKED_STRUCT struct pti_control_ie { ++ uint8 id; ++ uint8 len; ++ uint8 tid; ++ uint16 seq_control; ++} BWL_POST_PACKED_STRUCT; ++typedef struct pti_control_ie pti_control_ie_t; ++#define TDLS_PTI_CONTROL_IE_LEN 3 ++ ++/* PU Buffer Status Element */ ++BWL_PRE_PACKED_STRUCT struct pu_buffer_status_ie { ++ uint8 id; ++ uint8 len; ++ uint8 status; ++} BWL_POST_PACKED_STRUCT; ++typedef struct pu_buffer_status_ie pu_buffer_status_ie_t; ++#define TDLS_PU_BUFFER_STATUS_IE_LEN 1 ++#define TDLS_PU_BUFFER_STATUS_AC_BK 1 ++#define TDLS_PU_BUFFER_STATUS_AC_BE 2 ++#define TDLS_PU_BUFFER_STATUS_AC_VI 4 ++#define TDLS_PU_BUFFER_STATUS_AC_VO 8 ++ ++#ifdef BCMWAPI_WAI ++#define WAPI_IE_MIN_LEN 20 /* WAPI IE min length */ ++#define WAPI_VERSION 1 /* WAPI version */ ++#define WAPI_VERSION_LEN 2 /* WAPI version length */ ++#define WAPI_OUI "\x00\x14\x72" /* WAPI OUI */ ++#define WAPI_OUI_LEN DOT11_OUI_LEN /* WAPI OUI length */ ++#endif /* BCMWAPI_WAI */ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _802_11_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/802.11_bta.h b/drivers/net/wireless/ap6210/include/proto/802.11_bta.h +new file mode 100644 +index 0000000..3ee5a74 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/802.11_bta.h +@@ -0,0 +1,45 @@ ++/* ++ * BT-AMP (BlueTooth Alternate Mac and Phy) 802.11 PAL (Protocol Adaptation Layer) ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: 802.11_bta.h 294267 2011-11-04 23:41:52Z $ ++*/ ++ ++#ifndef _802_11_BTA_H_ ++#define _802_11_BTA_H_ ++ ++#define BT_SIG_SNAP_MPROT "\xAA\xAA\x03\x00\x19\x58" ++ ++/* BT-AMP 802.11 PAL Protocols */ ++#define BTA_PROT_L2CAP 1 ++#define BTA_PROT_ACTIVITY_REPORT 2 ++#define BTA_PROT_SECURITY 3 ++#define BTA_PROT_LINK_SUPERVISION_REQUEST 4 ++#define BTA_PROT_LINK_SUPERVISION_REPLY 5 ++ ++/* BT-AMP 802.11 PAL AMP_ASSOC Type IDs */ ++#define BTA_TYPE_ID_MAC_ADDRESS 1 ++#define BTA_TYPE_ID_PREFERRED_CHANNELS 2 ++#define BTA_TYPE_ID_CONNECTED_CHANNELS 3 ++#define BTA_TYPE_ID_CAPABILITIES 4 ++#define BTA_TYPE_ID_VERSION 5 ++#endif /* _802_11_bta_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/802.11e.h b/drivers/net/wireless/ap6210/include/proto/802.11e.h +new file mode 100644 +index 0000000..f391e68 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/802.11e.h +@@ -0,0 +1,131 @@ ++/* ++ * 802.11e protocol header file ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: 802.11e.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _802_11e_H_ ++#define _802_11e_H_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++ ++/* WME Traffic Specification (TSPEC) element */ ++#define WME_TSPEC_HDR_LEN 2 /* WME TSPEC header length */ ++#define WME_TSPEC_BODY_OFF 2 /* WME TSPEC body offset */ ++ ++#define WME_CATEGORY_CODE_OFFSET 0 /* WME Category code offset */ ++#define WME_ACTION_CODE_OFFSET 1 /* WME Action code offset */ ++#define WME_TOKEN_CODE_OFFSET 2 /* WME Token code offset */ ++#define WME_STATUS_CODE_OFFSET 3 /* WME Status code offset */ ++ ++BWL_PRE_PACKED_STRUCT struct tsinfo { ++ uint8 octets[3]; ++} BWL_POST_PACKED_STRUCT; ++ ++typedef struct tsinfo tsinfo_t; ++ ++/* 802.11e TSPEC IE */ ++typedef BWL_PRE_PACKED_STRUCT struct tspec { ++ uint8 oui[DOT11_OUI_LEN]; /* WME_OUI */ ++ uint8 type; /* WME_TYPE */ ++ uint8 subtype; /* WME_SUBTYPE_TSPEC */ ++ uint8 version; /* WME_VERSION */ ++ tsinfo_t tsinfo; /* TS Info bit field */ ++ uint16 nom_msdu_size; /* (Nominal or fixed) MSDU Size (bytes) */ ++ uint16 max_msdu_size; /* Maximum MSDU Size (bytes) */ ++ uint32 min_srv_interval; /* Minimum Service Interval (us) */ ++ uint32 max_srv_interval; /* Maximum Service Interval (us) */ ++ uint32 inactivity_interval; /* Inactivity Interval (us) */ ++ uint32 suspension_interval; /* Suspension Interval (us) */ ++ uint32 srv_start_time; /* Service Start Time (us) */ ++ uint32 min_data_rate; /* Minimum Data Rate (bps) */ ++ uint32 mean_data_rate; /* Mean Data Rate (bps) */ ++ uint32 peak_data_rate; /* Peak Data Rate (bps) */ ++ uint32 max_burst_size; /* Maximum Burst Size (bytes) */ ++ uint32 delay_bound; /* Delay Bound (us) */ ++ uint32 min_phy_rate; /* Minimum PHY Rate (bps) */ ++ uint16 surplus_bw; /* Surplus Bandwidth Allowance (range 1.0-8.0) */ ++ uint16 medium_time; /* Medium Time (32 us/s periods) */ ++} BWL_POST_PACKED_STRUCT tspec_t; ++ ++#define WME_TSPEC_LEN (sizeof(tspec_t)) /* not including 2-bytes of header */ ++ ++/* ts_info */ ++/* 802.1D priority is duplicated - bits 13-11 AND bits 3-1 */ ++#define TS_INFO_TID_SHIFT 1 /* TS info. TID shift */ ++#define TS_INFO_TID_MASK (0xf << TS_INFO_TID_SHIFT) /* TS info. TID mask */ ++#define TS_INFO_CONTENTION_SHIFT 7 /* TS info. contention shift */ ++#define TS_INFO_CONTENTION_MASK (0x1 << TS_INFO_CONTENTION_SHIFT) /* TS info. contention mask */ ++#define TS_INFO_DIRECTION_SHIFT 5 /* TS info. direction shift */ ++#define TS_INFO_DIRECTION_MASK (0x3 << TS_INFO_DIRECTION_SHIFT) /* TS info. direction mask */ ++#define TS_INFO_PSB_SHIFT 2 /* TS info. PSB bit Shift */ ++#define TS_INFO_PSB_MASK (1 << TS_INFO_PSB_SHIFT) /* TS info. PSB mask */ ++#define TS_INFO_UPLINK (0 << TS_INFO_DIRECTION_SHIFT) /* TS info. uplink */ ++#define TS_INFO_DOWNLINK (1 << TS_INFO_DIRECTION_SHIFT) /* TS info. downlink */ ++#define TS_INFO_BIDIRECTIONAL (3 << TS_INFO_DIRECTION_SHIFT) /* TS info. bidirectional */ ++#define TS_INFO_USER_PRIO_SHIFT 3 /* TS info. user priority shift */ ++/* TS info. user priority mask */ ++#define TS_INFO_USER_PRIO_MASK (0x7 << TS_INFO_USER_PRIO_SHIFT) ++ ++/* Macro to get/set bit(s) field in TSINFO */ ++#define WLC_CAC_GET_TID(pt) ((((pt).octets[0]) & TS_INFO_TID_MASK) >> TS_INFO_TID_SHIFT) ++#define WLC_CAC_GET_DIR(pt) ((((pt).octets[0]) & \ ++ TS_INFO_DIRECTION_MASK) >> TS_INFO_DIRECTION_SHIFT) ++#define WLC_CAC_GET_PSB(pt) ((((pt).octets[1]) & TS_INFO_PSB_MASK) >> TS_INFO_PSB_SHIFT) ++#define WLC_CAC_GET_USER_PRIO(pt) ((((pt).octets[1]) & \ ++ TS_INFO_USER_PRIO_MASK) >> TS_INFO_USER_PRIO_SHIFT) ++ ++#define WLC_CAC_SET_TID(pt, id) ((((pt).octets[0]) & (~TS_INFO_TID_MASK)) | \ ++ ((id) << TS_INFO_TID_SHIFT)) ++#define WLC_CAC_SET_USER_PRIO(pt, prio) ((((pt).octets[0]) & (~TS_INFO_USER_PRIO_MASK)) | \ ++ ((prio) << TS_INFO_USER_PRIO_SHIFT)) ++ ++/* 802.11e QBSS Load IE */ ++#define QBSS_LOAD_IE_LEN 5 /* QBSS Load IE length */ ++#define QBSS_LOAD_AAC_OFF 3 /* AAC offset in IE */ ++ ++#define CAC_ADDTS_RESP_TIMEOUT 300 /* default ADDTS response timeout in ms */ ++ ++/* 802.11e ADDTS status code */ ++#define DOT11E_STATUS_ADMISSION_ACCEPTED 0 /* TSPEC Admission accepted status */ ++#define DOT11E_STATUS_ADDTS_INVALID_PARAM 1 /* TSPEC invalid parameter status */ ++#define DOT11E_STATUS_ADDTS_REFUSED_NSBW 3 /* ADDTS refused (non-sufficient BW) */ ++#define DOT11E_STATUS_ADDTS_REFUSED_AWHILE 47 /* ADDTS refused but could retry later */ ++ ++/* 802.11e DELTS status code */ ++#define DOT11E_STATUS_QSTA_LEAVE_QBSS 36 /* STA leave QBSS */ ++#define DOT11E_STATUS_END_TS 37 /* END TS */ ++#define DOT11E_STATUS_UNKNOWN_TS 38 /* UNKNOWN TS */ ++#define DOT11E_STATUS_QSTA_REQ_TIMEOUT 39 /* STA ADDTS request timeout */ ++ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _802_11e_CAC_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/802.1d.h b/drivers/net/wireless/ap6210/include/proto/802.1d.h +new file mode 100644 +index 0000000..f11cc6c +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/802.1d.h +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * Fundamental types and constants relating to 802.1D ++ * ++ * $Id: 802.1d.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _802_1_D_ ++#define _802_1_D_ ++ ++/* 802.1D priority defines */ ++#define PRIO_8021D_NONE 2 /* None = - */ ++#define PRIO_8021D_BK 1 /* BK - Background */ ++#define PRIO_8021D_BE 0 /* BE - Best-effort */ ++#define PRIO_8021D_EE 3 /* EE - Excellent-effort */ ++#define PRIO_8021D_CL 4 /* CL - Controlled Load */ ++#define PRIO_8021D_VI 5 /* Vi - Video */ ++#define PRIO_8021D_VO 6 /* Vo - Voice */ ++#define PRIO_8021D_NC 7 /* NC - Network Control */ ++#define MAXPRIO 7 /* 0-7 */ ++#define NUMPRIO (MAXPRIO + 1) ++ ++#define ALLPRIO -1 /* All prioirty */ ++ ++/* Converts prio to precedence since the numerical value of ++ * PRIO_8021D_BE and PRIO_8021D_NONE are swapped. ++ */ ++#define PRIO2PREC(prio) \ ++ (((prio) == PRIO_8021D_NONE || (prio) == PRIO_8021D_BE) ? ((prio^2)) : (prio)) ++ ++#endif /* _802_1_D__ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/bcmeth.h b/drivers/net/wireless/ap6210/include/proto/bcmeth.h +new file mode 100644 +index 0000000..91ae75c +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/bcmeth.h +@@ -0,0 +1,112 @@ ++/* ++ * Broadcom Ethernettype protocol definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bcmeth.h 294352 2011-11-06 19:23:00Z $ ++ */ ++ ++/* ++ * Broadcom Ethernet protocol defines ++ */ ++ ++#ifndef _BCMETH_H_ ++#define _BCMETH_H_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++/* ETHER_TYPE_BRCM is defined in ethernet.h */ ++ ++/* ++ * Following the 2byte BRCM ether_type is a 16bit BRCM subtype field ++ * in one of two formats: (only subtypes 32768-65535 are in use now) ++ * ++ * subtypes 0-32767: ++ * 8 bit subtype (0-127) ++ * 8 bit length in bytes (0-255) ++ * ++ * subtypes 32768-65535: ++ * 16 bit big-endian subtype ++ * 16 bit big-endian length in bytes (0-65535) ++ * ++ * length is the number of additional bytes beyond the 4 or 6 byte header ++ * ++ * Reserved values: ++ * 0 reserved ++ * 5-15 reserved for iLine protocol assignments ++ * 17-126 reserved, assignable ++ * 127 reserved ++ * 32768 reserved ++ * 32769-65534 reserved, assignable ++ * 65535 reserved ++ */ ++ ++/* ++ * While adding the subtypes and their specific processing code make sure ++ * bcmeth_bcm_hdr_t is the first data structure in the user specific data structure definition ++ */ ++ ++#define BCMILCP_SUBTYPE_RATE 1 ++#define BCMILCP_SUBTYPE_LINK 2 ++#define BCMILCP_SUBTYPE_CSA 3 ++#define BCMILCP_SUBTYPE_LARQ 4 ++#define BCMILCP_SUBTYPE_VENDOR 5 ++#define BCMILCP_SUBTYPE_FLH 17 ++ ++#define BCMILCP_SUBTYPE_VENDOR_LONG 32769 ++#define BCMILCP_SUBTYPE_CERT 32770 ++#define BCMILCP_SUBTYPE_SES 32771 ++ ++ ++#define BCMILCP_BCM_SUBTYPE_RESERVED 0 ++#define BCMILCP_BCM_SUBTYPE_EVENT 1 ++#define BCMILCP_BCM_SUBTYPE_SES 2 ++/* ++ * The EAPOL type is not used anymore. Instead EAPOL messages are now embedded ++ * within BCMILCP_BCM_SUBTYPE_EVENT type messages ++ */ ++/* #define BCMILCP_BCM_SUBTYPE_EAPOL 3 */ ++#define BCMILCP_BCM_SUBTYPE_DPT 4 ++ ++#define BCMILCP_BCM_SUBTYPEHDR_MINLENGTH 8 ++#define BCMILCP_BCM_SUBTYPEHDR_VERSION 0 ++ ++/* These fields are stored in network order */ ++typedef BWL_PRE_PACKED_STRUCT struct bcmeth_hdr ++{ ++ uint16 subtype; /* Vendor specific..32769 */ ++ uint16 length; ++ uint8 version; /* Version is 0 */ ++ uint8 oui[3]; /* Broadcom OUI */ ++ /* user specific Data */ ++ uint16 usr_subtype; ++} BWL_POST_PACKED_STRUCT bcmeth_hdr_t; ++ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _BCMETH_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/bcmevent.h b/drivers/net/wireless/ap6210/include/proto/bcmevent.h +new file mode 100644 +index 0000000..c439707 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/bcmevent.h +@@ -0,0 +1,368 @@ ++/* ++ * Broadcom Event protocol definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * Dependencies: proto/bcmeth.h ++ * ++ * $Id: bcmevent.h 374275 2012-12-12 11:44:18Z $ ++ * ++ */ ++ ++/* ++ * Broadcom Ethernet Events protocol defines ++ * ++ */ ++ ++#ifndef _BCMEVENT_H_ ++#define _BCMEVENT_H_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++#define BCM_EVENT_MSG_VERSION 2 /* wl_event_msg_t struct version */ ++#define BCM_MSG_IFNAME_MAX 16 /* max length of interface name */ ++ ++/* flags */ ++#define WLC_EVENT_MSG_LINK 0x01 /* link is up */ ++#define WLC_EVENT_MSG_FLUSHTXQ 0x02 /* flush tx queue on MIC error */ ++#define WLC_EVENT_MSG_GROUP 0x04 /* group MIC error */ ++#define WLC_EVENT_MSG_UNKBSS 0x08 /* unknown source bsscfg */ ++#define WLC_EVENT_MSG_UNKIF 0x10 /* unknown source OS i/f */ ++ ++/* these fields are stored in network order */ ++ ++/* version 1 */ ++typedef BWL_PRE_PACKED_STRUCT struct ++{ ++ uint16 version; ++ uint16 flags; /* see flags below */ ++ uint32 event_type; /* Message (see below) */ ++ uint32 status; /* Status code (see below) */ ++ uint32 reason; /* Reason code (if applicable) */ ++ uint32 auth_type; /* WLC_E_AUTH */ ++ uint32 datalen; /* data buf */ ++ struct ether_addr addr; /* Station address (if applicable) */ ++ char ifname[BCM_MSG_IFNAME_MAX]; /* name of the packet incoming interface */ ++} BWL_POST_PACKED_STRUCT wl_event_msg_v1_t; ++ ++/* the current version */ ++typedef BWL_PRE_PACKED_STRUCT struct ++{ ++ uint16 version; ++ uint16 flags; /* see flags below */ ++ uint32 event_type; /* Message (see below) */ ++ uint32 status; /* Status code (see below) */ ++ uint32 reason; /* Reason code (if applicable) */ ++ uint32 auth_type; /* WLC_E_AUTH */ ++ uint32 datalen; /* data buf */ ++ struct ether_addr addr; /* Station address (if applicable) */ ++ char ifname[BCM_MSG_IFNAME_MAX]; /* name of the packet incoming interface */ ++ uint8 ifidx; /* destination OS i/f index */ ++ uint8 bsscfgidx; /* source bsscfg index */ ++} BWL_POST_PACKED_STRUCT wl_event_msg_t; ++ ++/* used by driver msgs */ ++typedef BWL_PRE_PACKED_STRUCT struct bcm_event { ++ struct ether_header eth; ++ bcmeth_hdr_t bcm_hdr; ++ wl_event_msg_t event; ++ /* data portion follows */ ++} BWL_POST_PACKED_STRUCT bcm_event_t; ++ ++#define BCM_MSG_LEN (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header)) ++ ++/* Event messages */ ++#define WLC_E_SET_SSID 0 /* indicates status of set SSID */ ++#define WLC_E_JOIN 1 /* differentiates join IBSS from found (WLC_E_START) IBSS */ ++#define WLC_E_START 2 /* STA founded an IBSS or AP started a BSS */ ++#define WLC_E_AUTH 3 /* 802.11 AUTH request */ ++#define WLC_E_AUTH_IND 4 /* 802.11 AUTH indication */ ++#define WLC_E_DEAUTH 5 /* 802.11 DEAUTH request */ ++#define WLC_E_DEAUTH_IND 6 /* 802.11 DEAUTH indication */ ++#define WLC_E_ASSOC 7 /* 802.11 ASSOC request */ ++#define WLC_E_ASSOC_IND 8 /* 802.11 ASSOC indication */ ++#define WLC_E_REASSOC 9 /* 802.11 REASSOC request */ ++#define WLC_E_REASSOC_IND 10 /* 802.11 REASSOC indication */ ++#define WLC_E_DISASSOC 11 /* 802.11 DISASSOC request */ ++#define WLC_E_DISASSOC_IND 12 /* 802.11 DISASSOC indication */ ++#define WLC_E_QUIET_START 13 /* 802.11h Quiet period started */ ++#define WLC_E_QUIET_END 14 /* 802.11h Quiet period ended */ ++#define WLC_E_BEACON_RX 15 /* BEACONS received/lost indication */ ++#define WLC_E_LINK 16 /* generic link indication */ ++#define WLC_E_MIC_ERROR 17 /* TKIP MIC error occurred */ ++#define WLC_E_NDIS_LINK 18 /* NDIS style link indication */ ++#define WLC_E_ROAM 19 /* roam attempt occurred: indicate status & reason */ ++#define WLC_E_TXFAIL 20 /* change in dot11FailedCount (txfail) */ ++#define WLC_E_PMKID_CACHE 21 /* WPA2 pmkid cache indication */ ++#define WLC_E_RETROGRADE_TSF 22 /* current AP's TSF value went backward */ ++#define WLC_E_PRUNE 23 /* AP was pruned from join list for reason */ ++#define WLC_E_AUTOAUTH 24 /* report AutoAuth table entry match for join attempt */ ++#define WLC_E_EAPOL_MSG 25 /* Event encapsulating an EAPOL message */ ++#define WLC_E_SCAN_COMPLETE 26 /* Scan results are ready or scan was aborted */ ++#define WLC_E_ADDTS_IND 27 /* indicate to host addts fail/success */ ++#define WLC_E_DELTS_IND 28 /* indicate to host delts fail/success */ ++#define WLC_E_BCNSENT_IND 29 /* indicate to host of beacon transmit */ ++#define WLC_E_BCNRX_MSG 30 /* Send the received beacon up to the host */ ++#define WLC_E_BCNLOST_MSG 31 /* indicate to host loss of beacon */ ++#define WLC_E_ROAM_PREP 32 /* before attempting to roam */ ++#define WLC_E_PFN_NET_FOUND 33 /* PFN network found event */ ++#define WLC_E_PFN_NET_LOST 34 /* PFN network lost event */ ++#define WLC_E_RESET_COMPLETE 35 ++#define WLC_E_JOIN_START 36 ++#define WLC_E_ROAM_START 37 ++#define WLC_E_ASSOC_START 38 ++#define WLC_E_IBSS_ASSOC 39 ++#define WLC_E_RADIO 40 ++#define WLC_E_PSM_WATCHDOG 41 /* PSM microcode watchdog fired */ ++#define WLC_E_PROBREQ_MSG 44 /* probe request received */ ++#define WLC_E_SCAN_CONFIRM_IND 45 ++#define WLC_E_PSK_SUP 46 /* WPA Handshake fail */ ++#define WLC_E_COUNTRY_CODE_CHANGED 47 ++#define WLC_E_EXCEEDED_MEDIUM_TIME 48 /* WMMAC excedded medium time */ ++#define WLC_E_ICV_ERROR 49 /* WEP ICV error occurred */ ++#define WLC_E_UNICAST_DECODE_ERROR 50 /* Unsupported unicast encrypted frame */ ++#define WLC_E_MULTICAST_DECODE_ERROR 51 /* Unsupported multicast encrypted frame */ ++#define WLC_E_TRACE 52 ++#ifdef WLBTAMP ++#define WLC_E_BTA_HCI_EVENT 53 /* BT-AMP HCI event */ ++#endif ++#define WLC_E_IF 54 /* I/F change (for dongle host notification) */ ++#define WLC_E_P2P_DISC_LISTEN_COMPLETE 55 /* listen state expires */ ++#define WLC_E_RSSI 56 /* indicate RSSI change based on configured levels */ ++#define WLC_E_PFN_SCAN_COMPLETE 57 /* PFN completed scan of network list */ ++#define WLC_E_EXTLOG_MSG 58 ++#define WLC_E_ACTION_FRAME 59 /* Action frame Rx */ ++#define WLC_E_ACTION_FRAME_COMPLETE 60 /* Action frame Tx complete */ ++#define WLC_E_PRE_ASSOC_IND 61 /* assoc request received */ ++#define WLC_E_PRE_REASSOC_IND 62 /* re-assoc request received */ ++#define WLC_E_CHANNEL_ADOPTED 63 ++#define WLC_E_AP_STARTED 64 /* AP started */ ++#define WLC_E_DFS_AP_STOP 65 /* AP stopped due to DFS */ ++#define WLC_E_DFS_AP_RESUME 66 /* AP resumed due to DFS */ ++#define WLC_E_WAI_STA_EVENT 67 /* WAI stations event */ ++#define WLC_E_WAI_MSG 68 /* event encapsulating an WAI message */ ++#define WLC_E_ESCAN_RESULT 69 /* escan result event */ ++#define WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE 70 /* action frame off channel complete */ ++#define WLC_E_PROBRESP_MSG 71 /* probe response received */ ++#define WLC_E_P2P_PROBREQ_MSG 72 /* P2P Probe request received */ ++#define WLC_E_DCS_REQUEST 73 ++ ++#define WLC_E_FIFO_CREDIT_MAP 74 /* credits for D11 FIFOs. [AC0,AC1,AC2,AC3,BC_MC,ATIM] */ ++ ++#define WLC_E_ACTION_FRAME_RX 75 /* Received action frame event WITH ++ * wl_event_rx_frame_data_t header ++ */ ++#define WLC_E_WAKE_EVENT 76 /* Wake Event timer fired, used for wake WLAN test mode */ ++#define WLC_E_RM_COMPLETE 77 /* Radio measurement complete */ ++#define WLC_E_HTSFSYNC 78 /* Synchronize TSF with the host */ ++#define WLC_E_OVERLAY_REQ 79 /* request an overlay IOCTL/iovar from the host */ ++#define WLC_E_CSA_COMPLETE_IND 80 /* 802.11 CHANNEL SWITCH ACTION completed */ ++#define WLC_E_EXCESS_PM_WAKE_EVENT 81 /* excess PM Wake Event to inform host */ ++#define WLC_E_PFN_SCAN_NONE 82 /* no PFN networks around */ ++#define WLC_E_PFN_SCAN_ALLGONE 83 /* last found PFN network gets lost */ ++#define WLC_E_GTK_PLUMBED 84 ++#define WLC_E_ASSOC_IND_NDIS 85 /* 802.11 ASSOC indication for NDIS only */ ++#define WLC_E_REASSOC_IND_NDIS 86 /* 802.11 REASSOC indication for NDIS only */ ++#define WLC_E_ASSOC_REQ_IE 87 ++#define WLC_E_ASSOC_RESP_IE 88 ++#define WLC_E_ASSOC_RECREATED 89 /* association recreated on resume */ ++#define WLC_E_ACTION_FRAME_RX_NDIS 90 /* rx action frame event for NDIS only */ ++#define WLC_E_AUTH_REQ 91 /* authentication request received */ ++#define WLC_E_TDLS_PEER_EVENT 92 /* discovered peer, connected or disconnected peer */ ++#define WLC_E_SPEEDY_RECREATE_FAIL 93 /* fast assoc recreation failed */ ++#define WLC_E_SERVICE_FOUND 102 /* desired service found */ ++#define WLC_E_GAS_FRAGMENT_RX 103 /* GAS fragment received */ ++#define WLC_E_GAS_COMPLETE 104 /* GAS sessions all complete */ ++#define WLC_E_P2PO_ADD_DEVICE 105 /* New device found by p2p offload */ ++#define WLC_E_P2PO_DEL_DEVICE 106 /* device has been removed by p2p offload */ ++#define WLC_E_LAST 107 /* highest val + 1 for range checking */ ++ ++ ++/* Table of event name strings for UIs and debugging dumps */ ++typedef struct { ++ uint event; ++ const char *name; ++} bcmevent_name_t; ++ ++extern const bcmevent_name_t bcmevent_names[]; ++extern const int bcmevent_names_size; ++ ++/* Event status codes */ ++#define WLC_E_STATUS_SUCCESS 0 /* operation was successful */ ++#define WLC_E_STATUS_FAIL 1 /* operation failed */ ++#define WLC_E_STATUS_TIMEOUT 2 /* operation timed out */ ++#define WLC_E_STATUS_NO_NETWORKS 3 /* failed due to no matching network found */ ++#define WLC_E_STATUS_ABORT 4 /* operation was aborted */ ++#define WLC_E_STATUS_NO_ACK 5 /* protocol failure: packet not ack'd */ ++#define WLC_E_STATUS_UNSOLICITED 6 /* AUTH or ASSOC packet was unsolicited */ ++#define WLC_E_STATUS_ATTEMPT 7 /* attempt to assoc to an auto auth configuration */ ++#define WLC_E_STATUS_PARTIAL 8 /* scan results are incomplete */ ++#define WLC_E_STATUS_NEWSCAN 9 /* scan aborted by another scan */ ++#define WLC_E_STATUS_NEWASSOC 10 /* scan aborted due to assoc in progress */ ++#define WLC_E_STATUS_11HQUIET 11 /* 802.11h quiet period started */ ++#define WLC_E_STATUS_SUPPRESS 12 /* user disabled scanning (WLC_SET_SCANSUPPRESS) */ ++#define WLC_E_STATUS_NOCHANS 13 /* no allowable channels to scan */ ++#define WLC_E_STATUS_CS_ABORT 15 /* abort channel select */ ++#define WLC_E_STATUS_ERROR 16 /* request failed due to error */ ++ ++/* roam reason codes */ ++#define WLC_E_REASON_INITIAL_ASSOC 0 /* initial assoc */ ++#define WLC_E_REASON_LOW_RSSI 1 /* roamed due to low RSSI */ ++#define WLC_E_REASON_DEAUTH 2 /* roamed due to DEAUTH indication */ ++#define WLC_E_REASON_DISASSOC 3 /* roamed due to DISASSOC indication */ ++#define WLC_E_REASON_BCNS_LOST 4 /* roamed due to lost beacons */ ++#define WLC_E_REASON_MINTXRATE 9 /* roamed because at mintxrate for too long */ ++#define WLC_E_REASON_TXFAIL 10 /* We can hear AP, but AP can't hear us */ ++ ++/* Roam codes used primarily by CCX */ ++#define WLC_E_REASON_FAST_ROAM_FAILED 5 /* roamed due to fast roam failure */ ++#define WLC_E_REASON_DIRECTED_ROAM 6 /* roamed due to request by AP */ ++#define WLC_E_REASON_TSPEC_REJECTED 7 /* roamed due to TSPEC rejection */ ++#define WLC_E_REASON_BETTER_AP 8 /* roamed due to finding better AP */ ++ ++ ++#define WLC_E_REASON_REQUESTED_ROAM 11 /* roamed due to BSS Mgmt Transition request by AP */ ++ ++/* prune reason codes */ ++#define WLC_E_PRUNE_ENCR_MISMATCH 1 /* encryption mismatch */ ++#define WLC_E_PRUNE_BCAST_BSSID 2 /* AP uses a broadcast BSSID */ ++#define WLC_E_PRUNE_MAC_DENY 3 /* STA's MAC addr is in AP's MAC deny list */ ++#define WLC_E_PRUNE_MAC_NA 4 /* STA's MAC addr is not in AP's MAC allow list */ ++#define WLC_E_PRUNE_REG_PASSV 5 /* AP not allowed due to regulatory restriction */ ++#define WLC_E_PRUNE_SPCT_MGMT 6 /* AP does not support STA locale spectrum mgmt */ ++#define WLC_E_PRUNE_RADAR 7 /* AP is on a radar channel of STA locale */ ++#define WLC_E_RSN_MISMATCH 8 /* STA does not support AP's RSN */ ++#define WLC_E_PRUNE_NO_COMMON_RATES 9 /* No rates in common with AP */ ++#define WLC_E_PRUNE_BASIC_RATES 10 /* STA does not support all basic rates of BSS */ ++#define WLC_E_PRUNE_CIPHER_NA 12 /* BSS's cipher not supported */ ++#define WLC_E_PRUNE_KNOWN_STA 13 /* AP is already known to us as a STA */ ++#define WLC_E_PRUNE_WDS_PEER 15 /* AP is already known to us as a WDS peer */ ++#define WLC_E_PRUNE_QBSS_LOAD 16 /* QBSS LOAD - AAC is too low */ ++#define WLC_E_PRUNE_HOME_AP 17 /* prune home AP */ ++ ++/* WPA failure reason codes carried in the WLC_E_PSK_SUP event */ ++#define WLC_E_SUP_OTHER 0 /* Other reason */ ++#define WLC_E_SUP_DECRYPT_KEY_DATA 1 /* Decryption of key data failed */ ++#define WLC_E_SUP_BAD_UCAST_WEP128 2 /* Illegal use of ucast WEP128 */ ++#define WLC_E_SUP_BAD_UCAST_WEP40 3 /* Illegal use of ucast WEP40 */ ++#define WLC_E_SUP_UNSUP_KEY_LEN 4 /* Unsupported key length */ ++#define WLC_E_SUP_PW_KEY_CIPHER 5 /* Unicast cipher mismatch in pairwise key */ ++#define WLC_E_SUP_MSG3_TOO_MANY_IE 6 /* WPA IE contains > 1 RSN IE in key msg 3 */ ++#define WLC_E_SUP_MSG3_IE_MISMATCH 7 /* WPA IE mismatch in key message 3 */ ++#define WLC_E_SUP_NO_INSTALL_FLAG 8 /* INSTALL flag unset in 4-way msg */ ++#define WLC_E_SUP_MSG3_NO_GTK 9 /* encapsulated GTK missing from msg 3 */ ++#define WLC_E_SUP_GRP_KEY_CIPHER 10 /* Multicast cipher mismatch in group key */ ++#define WLC_E_SUP_GRP_MSG1_NO_GTK 11 /* encapsulated GTK missing from group msg 1 */ ++#define WLC_E_SUP_GTK_DECRYPT_FAIL 12 /* GTK decrypt failure */ ++#define WLC_E_SUP_SEND_FAIL 13 /* message send failure */ ++#define WLC_E_SUP_DEAUTH 14 /* received FC_DEAUTH */ ++#define WLC_E_SUP_WPA_PSK_TMO 15 /* WPA PSK 4-way handshake timeout */ ++ ++/* Event data for events that include frames received over the air */ ++/* WLC_E_PROBRESP_MSG ++ * WLC_E_P2P_PROBREQ_MSG ++ * WLC_E_ACTION_FRAME_RX ++ */ ++typedef BWL_PRE_PACKED_STRUCT struct wl_event_rx_frame_data { ++ uint16 version; ++ uint16 channel; /* Matches chanspec_t format from bcmwifi_channels.h */ ++ int32 rssi; ++ uint32 mactime; ++ uint32 rate; ++} BWL_POST_PACKED_STRUCT wl_event_rx_frame_data_t; ++ ++#define BCM_RX_FRAME_DATA_VERSION 1 ++ ++/* WLC_E_IF event data */ ++typedef struct wl_event_data_if { ++ uint8 ifidx; /* RTE virtual device index (for dongle) */ ++ uint8 opcode; /* see I/F opcode */ ++ uint8 reserved; ++ uint8 bssidx; /* bsscfg index */ ++ uint8 role; /* see I/F role */ ++} wl_event_data_if_t; ++ ++/* opcode in WLC_E_IF event */ ++#define WLC_E_IF_ADD 1 /* bsscfg add */ ++#define WLC_E_IF_DEL 2 /* bsscfg delete */ ++#define WLC_E_IF_CHANGE 3 /* bsscfg role change */ ++ ++/* I/F role code in WLC_E_IF event */ ++#define WLC_E_IF_ROLE_STA 0 /* Infra STA */ ++#define WLC_E_IF_ROLE_AP 1 /* Access Point */ ++#define WLC_E_IF_ROLE_WDS 2 /* WDS link */ ++#define WLC_E_IF_ROLE_P2P_GO 3 /* P2P Group Owner */ ++#define WLC_E_IF_ROLE_P2P_CLIENT 4 /* P2P Client */ ++#ifdef WLBTAMP ++#define WLC_E_IF_ROLE_BTA_CREATOR 5 /* BT-AMP Creator */ ++#define WLC_E_IF_ROLE_BTA_ACCEPTOR 6 /* BT-AMP Acceptor */ ++#endif ++ ++/* Reason codes for LINK */ ++#define WLC_E_LINK_BCN_LOSS 1 /* Link down because of beacon loss */ ++#define WLC_E_LINK_DISASSOC 2 /* Link down because of disassoc */ ++#define WLC_E_LINK_ASSOC_REC 3 /* Link down because assoc recreate failed */ ++#define WLC_E_LINK_BSSCFG_DIS 4 /* Link down due to bsscfg down */ ++ ++/* reason codes for WLC_E_OVERLAY_REQ event */ ++#define WLC_E_OVL_DOWNLOAD 0 /* overlay download request */ ++#define WLC_E_OVL_UPDATE_IND 1 /* device indication of host overlay update */ ++ ++/* reason codes for WLC_E_TDLS_PEER_EVENT event */ ++#define WLC_E_TDLS_PEER_DISCOVERED 0 /* peer is ready to establish TDLS */ ++#define WLC_E_TDLS_PEER_CONNECTED 1 ++#define WLC_E_TDLS_PEER_DISCONNECTED 2 ++ ++/* GAS event data */ ++typedef BWL_PRE_PACKED_STRUCT struct wl_event_gas { ++ uint16 channel; /* channel of GAS protocol */ ++ uint8 dialog_token; /* GAS dialog token */ ++ uint8 fragment_id; /* fragment id */ ++ uint16 status_code; /* status code on GAS completion */ ++ uint16 data_len; /* length of data to follow */ ++ uint8 data[1]; /* variable length specified by data_len */ ++} BWL_POST_PACKED_STRUCT wl_event_gas_t; ++ ++/* service discovery TLV */ ++typedef BWL_PRE_PACKED_STRUCT struct wl_sd_tlv { ++ uint16 length; /* length of response_data */ ++ uint8 protocol; /* service protocol type */ ++ uint8 transaction_id; /* service transaction id */ ++ uint8 status_code; /* status code */ ++ uint8 data[1]; /* response data */ ++} BWL_POST_PACKED_STRUCT wl_sd_tlv_t; ++ ++/* service discovery event data */ ++typedef BWL_PRE_PACKED_STRUCT struct wl_event_sd { ++ uint16 channel; /* channel */ ++ uint8 count; /* number of tlvs */ ++ wl_sd_tlv_t tlv[1]; /* service discovery TLV */ ++} BWL_POST_PACKED_STRUCT wl_event_sd_t; ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _BCMEVENT_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/bcmip.h b/drivers/net/wireless/ap6210/include/proto/bcmip.h +new file mode 100644 +index 0000000..52cd71d +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/bcmip.h +@@ -0,0 +1,210 @@ ++/* ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * Fundamental constants relating to IP Protocol ++ * ++ * $Id: bcmip.h 290206 2011-10-17 19:13:51Z $ ++ */ ++ ++#ifndef _bcmip_h_ ++#define _bcmip_h_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++ ++/* IPV4 and IPV6 common */ ++#define IP_VER_OFFSET 0x0 /* offset to version field */ ++#define IP_VER_MASK 0xf0 /* version mask */ ++#define IP_VER_SHIFT 4 /* version shift */ ++#define IP_VER_4 4 /* version number for IPV4 */ ++#define IP_VER_6 6 /* version number for IPV6 */ ++ ++#define IP_VER(ip_body) \ ++ ((((uint8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT) ++ ++#define IP_PROT_ICMP 0x1 /* ICMP protocol */ ++#define IP_PROT_IGMP 0x2 /* IGMP protocol */ ++#define IP_PROT_TCP 0x6 /* TCP protocol */ ++#define IP_PROT_UDP 0x11 /* UDP protocol type */ ++#define IP_PROT_ICMP6 0x3a /* ICMPv6 protocol type */ ++ ++/* IPV4 field offsets */ ++#define IPV4_VER_HL_OFFSET 0 /* version and ihl byte offset */ ++#define IPV4_TOS_OFFSET 1 /* type of service offset */ ++#define IPV4_PKTLEN_OFFSET 2 /* packet length offset */ ++#define IPV4_PKTFLAG_OFFSET 6 /* more-frag,dont-frag flag offset */ ++#define IPV4_PROT_OFFSET 9 /* protocol type offset */ ++#define IPV4_CHKSUM_OFFSET 10 /* IP header checksum offset */ ++#define IPV4_SRC_IP_OFFSET 12 /* src IP addr offset */ ++#define IPV4_DEST_IP_OFFSET 16 /* dest IP addr offset */ ++#define IPV4_OPTIONS_OFFSET 20 /* IP options offset */ ++ ++/* IPV4 field decodes */ ++#define IPV4_VER_MASK 0xf0 /* IPV4 version mask */ ++#define IPV4_VER_SHIFT 4 /* IPV4 version shift */ ++ ++#define IPV4_HLEN_MASK 0x0f /* IPV4 header length mask */ ++#define IPV4_HLEN(ipv4_body) (4 * (((uint8 *)(ipv4_body))[IPV4_VER_HL_OFFSET] & IPV4_HLEN_MASK)) ++ ++#define IPV4_ADDR_LEN 4 /* IPV4 address length */ ++ ++#define IPV4_ADDR_NULL(a) ((((uint8 *)(a))[0] | ((uint8 *)(a))[1] | \ ++ ((uint8 *)(a))[2] | ((uint8 *)(a))[3]) == 0) ++ ++#define IPV4_ADDR_BCAST(a) ((((uint8 *)(a))[0] & ((uint8 *)(a))[1] & \ ++ ((uint8 *)(a))[2] & ((uint8 *)(a))[3]) == 0xff) ++ ++#define IPV4_TOS_DSCP_MASK 0xfc /* DiffServ codepoint mask */ ++#define IPV4_TOS_DSCP_SHIFT 2 /* DiffServ codepoint shift */ ++ ++#define IPV4_TOS(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_TOS_OFFSET]) ++ ++#define IPV4_TOS_PREC_MASK 0xe0 /* Historical precedence mask */ ++#define IPV4_TOS_PREC_SHIFT 5 /* Historical precedence shift */ ++ ++#define IPV4_TOS_LOWDELAY 0x10 /* Lowest delay requested */ ++#define IPV4_TOS_THROUGHPUT 0x8 /* Best throughput requested */ ++#define IPV4_TOS_RELIABILITY 0x4 /* Most reliable delivery requested */ ++ ++#define IPV4_PROT(ipv4_body) (((uint8 *)(ipv4_body))[IPV4_PROT_OFFSET]) ++ ++#define IPV4_FRAG_RESV 0x8000 /* Reserved */ ++#define IPV4_FRAG_DONT 0x4000 /* Don't fragment */ ++#define IPV4_FRAG_MORE 0x2000 /* More fragments */ ++#define IPV4_FRAG_OFFSET_MASK 0x1fff /* Fragment offset */ ++ ++#define IPV4_ADDR_STR_LEN 16 /* Max IP address length in string format */ ++ ++/* IPV4 packet formats */ ++BWL_PRE_PACKED_STRUCT struct ipv4_addr { ++ uint8 addr[IPV4_ADDR_LEN]; ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct ipv4_hdr { ++ uint8 version_ihl; /* Version and Internet Header Length */ ++ uint8 tos; /* Type Of Service */ ++ uint16 tot_len; /* Number of bytes in packet (max 65535) */ ++ uint16 id; ++ uint16 frag; /* 3 flag bits and fragment offset */ ++ uint8 ttl; /* Time To Live */ ++ uint8 prot; /* Protocol */ ++ uint16 hdr_chksum; /* IP header checksum */ ++ uint8 src_ip[IPV4_ADDR_LEN]; /* Source IP Address */ ++ uint8 dst_ip[IPV4_ADDR_LEN]; /* Destination IP Address */ ++} BWL_POST_PACKED_STRUCT; ++ ++/* IPV6 field offsets */ ++#define IPV6_PAYLOAD_LEN_OFFSET 4 /* payload length offset */ ++#define IPV6_NEXT_HDR_OFFSET 6 /* next header/protocol offset */ ++#define IPV6_HOP_LIMIT_OFFSET 7 /* hop limit offset */ ++#define IPV6_SRC_IP_OFFSET 8 /* src IP addr offset */ ++#define IPV6_DEST_IP_OFFSET 24 /* dst IP addr offset */ ++ ++/* IPV6 field decodes */ ++#define IPV6_TRAFFIC_CLASS(ipv6_body) \ ++ (((((uint8 *)(ipv6_body))[0] & 0x0f) << 4) | \ ++ ((((uint8 *)(ipv6_body))[1] & 0xf0) >> 4)) ++ ++#define IPV6_FLOW_LABEL(ipv6_body) \ ++ (((((uint8 *)(ipv6_body))[1] & 0x0f) << 16) | \ ++ (((uint8 *)(ipv6_body))[2] << 8) | \ ++ (((uint8 *)(ipv6_body))[3])) ++ ++#define IPV6_PAYLOAD_LEN(ipv6_body) \ ++ ((((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 0] << 8) | \ ++ ((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 1]) ++ ++#define IPV6_NEXT_HDR(ipv6_body) \ ++ (((uint8 *)(ipv6_body))[IPV6_NEXT_HDR_OFFSET]) ++ ++#define IPV6_PROT(ipv6_body) IPV6_NEXT_HDR(ipv6_body) ++ ++#define IPV6_ADDR_LEN 16 /* IPV6 address length */ ++ ++/* IPV4 TOS or IPV6 Traffic Classifier or 0 */ ++#define IP_TOS46(ip_body) \ ++ (IP_VER(ip_body) == IP_VER_4 ? IPV4_TOS(ip_body) : \ ++ IP_VER(ip_body) == IP_VER_6 ? IPV6_TRAFFIC_CLASS(ip_body) : 0) ++ ++/* IPV6 extension headers (options) */ ++#define IPV6_EXTHDR_HOP 0 ++#define IPV6_EXTHDR_ROUTING 43 ++#define IPV6_EXTHDR_FRAGMENT 44 ++#define IPV6_EXTHDR_AUTH 51 ++#define IPV6_EXTHDR_NONE 59 ++#define IPV6_EXTHDR_DEST 60 ++ ++#define IPV6_EXTHDR(prot) (((prot) == IPV6_EXTHDR_HOP) || \ ++ ((prot) == IPV6_EXTHDR_ROUTING) || \ ++ ((prot) == IPV6_EXTHDR_FRAGMENT) || \ ++ ((prot) == IPV6_EXTHDR_AUTH) || \ ++ ((prot) == IPV6_EXTHDR_NONE) || \ ++ ((prot) == IPV6_EXTHDR_DEST)) ++ ++#define IPV6_MIN_HLEN 40 ++ ++#define IPV6_EXTHDR_LEN(eh) ((((struct ipv6_exthdr *)(eh))->hdrlen + 1) << 3) ++ ++BWL_PRE_PACKED_STRUCT struct ipv6_exthdr { ++ uint8 nexthdr; ++ uint8 hdrlen; ++} BWL_POST_PACKED_STRUCT; ++ ++BWL_PRE_PACKED_STRUCT struct ipv6_exthdr_frag { ++ uint8 nexthdr; ++ uint8 rsvd; ++ uint16 frag_off; ++ uint32 ident; ++} BWL_POST_PACKED_STRUCT; ++ ++static INLINE int32 ++ipv6_exthdr_len(uint8 *h, uint8 *proto) ++{ ++ uint16 len = 0, hlen; ++ struct ipv6_exthdr *eh = (struct ipv6_exthdr *)h; ++ ++ while (IPV6_EXTHDR(eh->nexthdr)) { ++ if (eh->nexthdr == IPV6_EXTHDR_NONE) ++ return -1; ++ else if (eh->nexthdr == IPV6_EXTHDR_FRAGMENT) ++ hlen = 8; ++ else if (eh->nexthdr == IPV6_EXTHDR_AUTH) ++ hlen = (eh->hdrlen + 2) << 2; ++ else ++ hlen = IPV6_EXTHDR_LEN(eh); ++ ++ len += hlen; ++ eh = (struct ipv6_exthdr *)(h + len); ++ } ++ ++ *proto = eh->nexthdr; ++ return len; ++} ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _bcmip_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/bt_amp_hci.h b/drivers/net/wireless/ap6210/include/proto/bt_amp_hci.h +new file mode 100644 +index 0000000..8617985 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/bt_amp_hci.h +@@ -0,0 +1,441 @@ ++/* ++ * BT-AMP (BlueTooth Alternate Mac and Phy) HCI (Host/Controller Interface) ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: bt_amp_hci.h 294267 2011-11-04 23:41:52Z $ ++*/ ++ ++#ifndef _bt_amp_hci_h ++#define _bt_amp_hci_h ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++ ++/* AMP HCI CMD packet format */ ++typedef BWL_PRE_PACKED_STRUCT struct amp_hci_cmd { ++ uint16 opcode; ++ uint8 plen; ++ uint8 parms[1]; ++} BWL_POST_PACKED_STRUCT amp_hci_cmd_t; ++ ++#define HCI_CMD_PREAMBLE_SIZE OFFSETOF(amp_hci_cmd_t, parms) ++#define HCI_CMD_DATA_SIZE 255 ++ ++/* AMP HCI CMD opcode layout */ ++#define HCI_CMD_OPCODE(ogf, ocf) ((((ogf) & 0x3F) << 10) | ((ocf) & 0x03FF)) ++#define HCI_CMD_OGF(opcode) ((uint8)(((opcode) >> 10) & 0x3F)) ++#define HCI_CMD_OCF(opcode) ((opcode) & 0x03FF) ++ ++/* AMP HCI command opcodes */ ++#define HCI_Read_Failed_Contact_Counter HCI_CMD_OPCODE(0x05, 0x0001) ++#define HCI_Reset_Failed_Contact_Counter HCI_CMD_OPCODE(0x05, 0x0002) ++#define HCI_Read_Link_Quality HCI_CMD_OPCODE(0x05, 0x0003) ++#define HCI_Read_Local_AMP_Info HCI_CMD_OPCODE(0x05, 0x0009) ++#define HCI_Read_Local_AMP_ASSOC HCI_CMD_OPCODE(0x05, 0x000A) ++#define HCI_Write_Remote_AMP_ASSOC HCI_CMD_OPCODE(0x05, 0x000B) ++#define HCI_Create_Physical_Link HCI_CMD_OPCODE(0x01, 0x0035) ++#define HCI_Accept_Physical_Link_Request HCI_CMD_OPCODE(0x01, 0x0036) ++#define HCI_Disconnect_Physical_Link HCI_CMD_OPCODE(0x01, 0x0037) ++#define HCI_Create_Logical_Link HCI_CMD_OPCODE(0x01, 0x0038) ++#define HCI_Accept_Logical_Link HCI_CMD_OPCODE(0x01, 0x0039) ++#define HCI_Disconnect_Logical_Link HCI_CMD_OPCODE(0x01, 0x003A) ++#define HCI_Logical_Link_Cancel HCI_CMD_OPCODE(0x01, 0x003B) ++#define HCI_Flow_Spec_Modify HCI_CMD_OPCODE(0x01, 0x003C) ++#define HCI_Write_Flow_Control_Mode HCI_CMD_OPCODE(0x01, 0x0067) ++#define HCI_Read_Best_Effort_Flush_Timeout HCI_CMD_OPCODE(0x01, 0x0069) ++#define HCI_Write_Best_Effort_Flush_Timeout HCI_CMD_OPCODE(0x01, 0x006A) ++#define HCI_Short_Range_Mode HCI_CMD_OPCODE(0x01, 0x006B) ++#define HCI_Reset HCI_CMD_OPCODE(0x03, 0x0003) ++#define HCI_Read_Connection_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0015) ++#define HCI_Write_Connection_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0016) ++#define HCI_Read_Link_Supervision_Timeout HCI_CMD_OPCODE(0x03, 0x0036) ++#define HCI_Write_Link_Supervision_Timeout HCI_CMD_OPCODE(0x03, 0x0037) ++#define HCI_Enhanced_Flush HCI_CMD_OPCODE(0x03, 0x005F) ++#define HCI_Read_Logical_Link_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0061) ++#define HCI_Write_Logical_Link_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0062) ++#define HCI_Set_Event_Mask_Page_2 HCI_CMD_OPCODE(0x03, 0x0063) ++#define HCI_Read_Location_Data_Command HCI_CMD_OPCODE(0x03, 0x0064) ++#define HCI_Write_Location_Data_Command HCI_CMD_OPCODE(0x03, 0x0065) ++#define HCI_Read_Local_Version_Info HCI_CMD_OPCODE(0x04, 0x0001) ++#define HCI_Read_Local_Supported_Commands HCI_CMD_OPCODE(0x04, 0x0002) ++#define HCI_Read_Buffer_Size HCI_CMD_OPCODE(0x04, 0x0005) ++#define HCI_Read_Data_Block_Size HCI_CMD_OPCODE(0x04, 0x000A) ++ ++/* AMP HCI command parameters */ ++typedef BWL_PRE_PACKED_STRUCT struct read_local_cmd_parms { ++ uint8 plh; ++ uint8 offset[2]; /* length so far */ ++ uint8 max_remote[2]; ++} BWL_POST_PACKED_STRUCT read_local_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct write_remote_cmd_parms { ++ uint8 plh; ++ uint8 offset[2]; ++ uint8 len[2]; ++ uint8 frag[1]; ++} BWL_POST_PACKED_STRUCT write_remote_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct phy_link_cmd_parms { ++ uint8 plh; ++ uint8 key_length; ++ uint8 key_type; ++ uint8 key[1]; ++} BWL_POST_PACKED_STRUCT phy_link_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct dis_phy_link_cmd_parms { ++ uint8 plh; ++ uint8 reason; ++} BWL_POST_PACKED_STRUCT dis_phy_link_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct log_link_cmd_parms { ++ uint8 plh; ++ uint8 txflow[16]; ++ uint8 rxflow[16]; ++} BWL_POST_PACKED_STRUCT log_link_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct ext_flow_spec { ++ uint8 id; ++ uint8 service_type; ++ uint8 max_sdu[2]; ++ uint8 sdu_ia_time[4]; ++ uint8 access_latency[4]; ++ uint8 flush_timeout[4]; ++} BWL_POST_PACKED_STRUCT ext_flow_spec_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct log_link_cancel_cmd_parms { ++ uint8 plh; ++ uint8 tx_fs_ID; ++} BWL_POST_PACKED_STRUCT log_link_cancel_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct flow_spec_mod_cmd_parms { ++ uint8 llh[2]; ++ uint8 txflow[16]; ++ uint8 rxflow[16]; ++} BWL_POST_PACKED_STRUCT flow_spec_mod_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct plh_pad { ++ uint8 plh; ++ uint8 pad; ++} BWL_POST_PACKED_STRUCT plh_pad_t; ++ ++typedef BWL_PRE_PACKED_STRUCT union hci_handle { ++ uint16 bredr; ++ plh_pad_t amp; ++} BWL_POST_PACKED_STRUCT hci_handle_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct ls_to_cmd_parms { ++ hci_handle_t handle; ++ uint8 timeout[2]; ++} BWL_POST_PACKED_STRUCT ls_to_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct befto_cmd_parms { ++ uint8 llh[2]; ++ uint8 befto[4]; ++} BWL_POST_PACKED_STRUCT befto_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct srm_cmd_parms { ++ uint8 plh; ++ uint8 srm; ++} BWL_POST_PACKED_STRUCT srm_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct ld_cmd_parms { ++ uint8 ld_aware; ++ uint8 ld[2]; ++ uint8 ld_opts; ++ uint8 l_opts; ++} BWL_POST_PACKED_STRUCT ld_cmd_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct eflush_cmd_parms { ++ uint8 llh[2]; ++ uint8 packet_type; ++} BWL_POST_PACKED_STRUCT eflush_cmd_parms_t; ++ ++/* Generic AMP extended flow spec service types */ ++#define EFS_SVCTYPE_NO_TRAFFIC 0 ++#define EFS_SVCTYPE_BEST_EFFORT 1 ++#define EFS_SVCTYPE_GUARANTEED 2 ++ ++/* AMP HCI event packet format */ ++typedef BWL_PRE_PACKED_STRUCT struct amp_hci_event { ++ uint8 ecode; ++ uint8 plen; ++ uint8 parms[1]; ++} BWL_POST_PACKED_STRUCT amp_hci_event_t; ++ ++#define HCI_EVT_PREAMBLE_SIZE OFFSETOF(amp_hci_event_t, parms) ++ ++/* AMP HCI event codes */ ++#define HCI_Command_Complete 0x0E ++#define HCI_Command_Status 0x0F ++#define HCI_Flush_Occurred 0x11 ++#define HCI_Enhanced_Flush_Complete 0x39 ++#define HCI_Physical_Link_Complete 0x40 ++#define HCI_Channel_Select 0x41 ++#define HCI_Disconnect_Physical_Link_Complete 0x42 ++#define HCI_Logical_Link_Complete 0x45 ++#define HCI_Disconnect_Logical_Link_Complete 0x46 ++#define HCI_Flow_Spec_Modify_Complete 0x47 ++#define HCI_Number_of_Completed_Data_Blocks 0x48 ++#define HCI_Short_Range_Mode_Change_Complete 0x4C ++#define HCI_Status_Change_Event 0x4D ++#define HCI_Vendor_Specific 0xFF ++ ++/* AMP HCI event mask bit positions */ ++#define HCI_Physical_Link_Complete_Event_Mask 0x0001 ++#define HCI_Channel_Select_Event_Mask 0x0002 ++#define HCI_Disconnect_Physical_Link_Complete_Event_Mask 0x0004 ++#define HCI_Logical_Link_Complete_Event_Mask 0x0020 ++#define HCI_Disconnect_Logical_Link_Complete_Event_Mask 0x0040 ++#define HCI_Flow_Spec_Modify_Complete_Event_Mask 0x0080 ++#define HCI_Number_of_Completed_Data_Blocks_Event_Mask 0x0100 ++#define HCI_Short_Range_Mode_Change_Complete_Event_Mask 0x1000 ++#define HCI_Status_Change_Event_Mask 0x2000 ++#define HCI_All_Event_Mask 0x31e7 ++/* AMP HCI event parameters */ ++typedef BWL_PRE_PACKED_STRUCT struct cmd_status_parms { ++ uint8 status; ++ uint8 cmdpkts; ++ uint16 opcode; ++} BWL_POST_PACKED_STRUCT cmd_status_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct cmd_complete_parms { ++ uint8 cmdpkts; ++ uint16 opcode; ++ uint8 parms[1]; ++} BWL_POST_PACKED_STRUCT cmd_complete_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct flush_occurred_evt_parms { ++ uint16 handle; ++} BWL_POST_PACKED_STRUCT flush_occurred_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct write_remote_evt_parms { ++ uint8 status; ++ uint8 plh; ++} BWL_POST_PACKED_STRUCT write_remote_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct read_local_evt_parms { ++ uint8 status; ++ uint8 plh; ++ uint16 len; ++ uint8 frag[1]; ++} BWL_POST_PACKED_STRUCT read_local_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct read_local_info_evt_parms { ++ uint8 status; ++ uint8 AMP_status; ++ uint32 bandwidth; ++ uint32 gbandwidth; ++ uint32 latency; ++ uint32 PDU_size; ++ uint8 ctrl_type; ++ uint16 PAL_cap; ++ uint16 AMP_ASSOC_len; ++ uint32 max_flush_timeout; ++ uint32 be_flush_timeout; ++} BWL_POST_PACKED_STRUCT read_local_info_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct log_link_evt_parms { ++ uint8 status; ++ uint16 llh; ++ uint8 plh; ++ uint8 tx_fs_ID; ++} BWL_POST_PACKED_STRUCT log_link_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct disc_log_link_evt_parms { ++ uint8 status; ++ uint16 llh; ++ uint8 reason; ++} BWL_POST_PACKED_STRUCT disc_log_link_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct log_link_cancel_evt_parms { ++ uint8 status; ++ uint8 plh; ++ uint8 tx_fs_ID; ++} BWL_POST_PACKED_STRUCT log_link_cancel_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct flow_spec_mod_evt_parms { ++ uint8 status; ++ uint16 llh; ++} BWL_POST_PACKED_STRUCT flow_spec_mod_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct phy_link_evt_parms { ++ uint8 status; ++ uint8 plh; ++} BWL_POST_PACKED_STRUCT phy_link_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct dis_phy_link_evt_parms { ++ uint8 status; ++ uint8 plh; ++ uint8 reason; ++} BWL_POST_PACKED_STRUCT dis_phy_link_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct read_ls_to_evt_parms { ++ uint8 status; ++ hci_handle_t handle; ++ uint16 timeout; ++} BWL_POST_PACKED_STRUCT read_ls_to_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct read_lla_ca_to_evt_parms { ++ uint8 status; ++ uint16 timeout; ++} BWL_POST_PACKED_STRUCT read_lla_ca_to_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct read_data_block_size_evt_parms { ++ uint8 status; ++ uint16 ACL_pkt_len; ++ uint16 data_block_len; ++ uint16 data_block_num; ++} BWL_POST_PACKED_STRUCT read_data_block_size_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct data_blocks { ++ uint16 handle; ++ uint16 pkts; ++ uint16 blocks; ++} BWL_POST_PACKED_STRUCT data_blocks_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct num_completed_data_blocks_evt_parms { ++ uint16 num_blocks; ++ uint8 num_handles; ++ data_blocks_t completed[1]; ++} BWL_POST_PACKED_STRUCT num_completed_data_blocks_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct befto_evt_parms { ++ uint8 status; ++ uint32 befto; ++} BWL_POST_PACKED_STRUCT befto_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct srm_evt_parms { ++ uint8 status; ++ uint8 plh; ++ uint8 srm; ++} BWL_POST_PACKED_STRUCT srm_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct contact_counter_evt_parms { ++ uint8 status; ++ uint8 llh[2]; ++ uint16 counter; ++} BWL_POST_PACKED_STRUCT contact_counter_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct contact_counter_reset_evt_parms { ++ uint8 status; ++ uint8 llh[2]; ++} BWL_POST_PACKED_STRUCT contact_counter_reset_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct read_linkq_evt_parms { ++ uint8 status; ++ hci_handle_t handle; ++ uint8 link_quality; ++} BWL_POST_PACKED_STRUCT read_linkq_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct ld_evt_parms { ++ uint8 status; ++ uint8 ld_aware; ++ uint8 ld[2]; ++ uint8 ld_opts; ++ uint8 l_opts; ++} BWL_POST_PACKED_STRUCT ld_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct eflush_complete_evt_parms { ++ uint16 handle; ++} BWL_POST_PACKED_STRUCT eflush_complete_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct vendor_specific_evt_parms { ++ uint8 len; ++ uint8 parms[1]; ++} BWL_POST_PACKED_STRUCT vendor_specific_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct local_version_info_evt_parms { ++ uint8 status; ++ uint8 hci_version; ++ uint16 hci_revision; ++ uint8 pal_version; ++ uint16 mfg_name; ++ uint16 pal_subversion; ++} BWL_POST_PACKED_STRUCT local_version_info_evt_parms_t; ++ ++#define MAX_SUPPORTED_CMD_BYTE 64 ++typedef BWL_PRE_PACKED_STRUCT struct local_supported_cmd_evt_parms { ++ uint8 status; ++ uint8 cmd[MAX_SUPPORTED_CMD_BYTE]; ++} BWL_POST_PACKED_STRUCT local_supported_cmd_evt_parms_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct status_change_evt_parms { ++ uint8 status; ++ uint8 amp_status; ++} BWL_POST_PACKED_STRUCT status_change_evt_parms_t; ++ ++/* AMP HCI error codes */ ++#define HCI_SUCCESS 0x00 ++#define HCI_ERR_ILLEGAL_COMMAND 0x01 ++#define HCI_ERR_NO_CONNECTION 0x02 ++#define HCI_ERR_MEMORY_FULL 0x07 ++#define HCI_ERR_CONNECTION_TIMEOUT 0x08 ++#define HCI_ERR_MAX_NUM_OF_CONNECTIONS 0x09 ++#define HCI_ERR_CONNECTION_EXISTS 0x0B ++#define HCI_ERR_CONNECTION_DISALLOWED 0x0C ++#define HCI_ERR_CONNECTION_ACCEPT_TIMEOUT 0x10 ++#define HCI_ERR_UNSUPPORTED_VALUE 0x11 ++#define HCI_ERR_ILLEGAL_PARAMETER_FMT 0x12 ++#define HCI_ERR_CONN_TERM_BY_LOCAL_HOST 0x16 ++#define HCI_ERR_UNSPECIFIED 0x1F ++#define HCI_ERR_UNIT_KEY_USED 0x26 ++#define HCI_ERR_QOS_REJECTED 0x2D ++#define HCI_ERR_PARAM_OUT_OF_RANGE 0x30 ++#define HCI_ERR_NO_SUITABLE_CHANNEL 0x39 ++#define HCI_ERR_CHANNEL_MOVE 0xFF ++ ++/* AMP HCI ACL Data packet format */ ++typedef BWL_PRE_PACKED_STRUCT struct amp_hci_ACL_data { ++ uint16 handle; /* 12-bit connection handle + 2-bit PB and 2-bit BC flags */ ++ uint16 dlen; /* data total length */ ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT amp_hci_ACL_data_t; ++ ++#define HCI_ACL_DATA_PREAMBLE_SIZE OFFSETOF(amp_hci_ACL_data_t, data) ++ ++#define HCI_ACL_DATA_BC_FLAGS (0x0 << 14) ++#define HCI_ACL_DATA_PB_FLAGS (0x3 << 12) ++ ++#define HCI_ACL_DATA_HANDLE(handle) ((handle) & 0x0fff) ++#define HCI_ACL_DATA_FLAGS(handle) ((handle) >> 12) ++ ++/* AMP Activity Report packet formats */ ++typedef BWL_PRE_PACKED_STRUCT struct amp_hci_activity_report { ++ uint8 ScheduleKnown; ++ uint8 NumReports; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT amp_hci_activity_report_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct amp_hci_activity_report_triple { ++ uint32 StartTime; ++ uint32 Duration; ++ uint32 Periodicity; ++} BWL_POST_PACKED_STRUCT amp_hci_activity_report_triple_t; ++ ++#define HCI_AR_SCHEDULE_KNOWN 0x01 ++ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _bt_amp_hci_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/eapol.h b/drivers/net/wireless/ap6210/include/proto/eapol.h +new file mode 100644 +index 0000000..8936d16 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/eapol.h +@@ -0,0 +1,193 @@ ++/* ++ * 802.1x EAPOL definitions ++ * ++ * See ++ * IEEE Std 802.1X-2001 ++ * IEEE 802.1X RADIUS Usage Guidelines ++ * ++ * Copyright (C) 2002 Broadcom Corporation ++ * ++ * $Id: eapol.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _eapol_h_ ++#define _eapol_h_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++#include ++ ++/* EAPOL for 802.3/Ethernet */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ struct ether_header eth; /* 802.3/Ethernet header */ ++ unsigned char version; /* EAPOL protocol version */ ++ unsigned char type; /* EAPOL type */ ++ unsigned short length; /* Length of body */ ++ unsigned char body[1]; /* Body (optional) */ ++} BWL_POST_PACKED_STRUCT eapol_header_t; ++ ++#define EAPOL_HEADER_LEN 18 ++ ++typedef struct { ++ unsigned char version; /* EAPOL protocol version */ ++ unsigned char type; /* EAPOL type */ ++ unsigned short length; /* Length of body */ ++} eapol_hdr_t; ++ ++#define EAPOL_HDR_LEN 4 ++ ++/* EAPOL version */ ++#define WPA2_EAPOL_VERSION 2 ++#define WPA_EAPOL_VERSION 1 ++#define LEAP_EAPOL_VERSION 1 ++#define SES_EAPOL_VERSION 1 ++ ++/* EAPOL types */ ++#define EAP_PACKET 0 ++#define EAPOL_START 1 ++#define EAPOL_LOGOFF 2 ++#define EAPOL_KEY 3 ++#define EAPOL_ASF 4 ++ ++/* EAPOL-Key types */ ++#define EAPOL_RC4_KEY 1 ++#define EAPOL_WPA2_KEY 2 /* 802.11i/WPA2 */ ++#define EAPOL_WPA_KEY 254 /* WPA */ ++ ++/* RC4 EAPOL-Key header field sizes */ ++#define EAPOL_KEY_REPLAY_LEN 8 ++#define EAPOL_KEY_IV_LEN 16 ++#define EAPOL_KEY_SIG_LEN 16 ++ ++/* RC4 EAPOL-Key */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ unsigned char type; /* Key Descriptor Type */ ++ unsigned short length; /* Key Length (unaligned) */ ++ unsigned char replay[EAPOL_KEY_REPLAY_LEN]; /* Replay Counter */ ++ unsigned char iv[EAPOL_KEY_IV_LEN]; /* Key IV */ ++ unsigned char index; /* Key Flags & Index */ ++ unsigned char signature[EAPOL_KEY_SIG_LEN]; /* Key Signature */ ++ unsigned char key[1]; /* Key (optional) */ ++} BWL_POST_PACKED_STRUCT eapol_key_header_t; ++ ++#define EAPOL_KEY_HEADER_LEN 44 ++ ++/* RC4 EAPOL-Key flags */ ++#define EAPOL_KEY_FLAGS_MASK 0x80 ++#define EAPOL_KEY_BROADCAST 0 ++#define EAPOL_KEY_UNICAST 0x80 ++ ++/* RC4 EAPOL-Key index */ ++#define EAPOL_KEY_INDEX_MASK 0x7f ++ ++/* WPA/802.11i/WPA2 EAPOL-Key header field sizes */ ++#define EAPOL_WPA_KEY_REPLAY_LEN 8 ++#define EAPOL_WPA_KEY_NONCE_LEN 32 ++#define EAPOL_WPA_KEY_IV_LEN 16 ++#define EAPOL_WPA_KEY_RSC_LEN 8 ++#define EAPOL_WPA_KEY_ID_LEN 8 ++#define EAPOL_WPA_KEY_MIC_LEN 16 ++#define EAPOL_WPA_KEY_DATA_LEN (EAPOL_WPA_MAX_KEY_SIZE + AKW_BLOCK_LEN) ++#define EAPOL_WPA_MAX_KEY_SIZE 32 ++ ++/* WPA EAPOL-Key */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ unsigned char type; /* Key Descriptor Type */ ++ unsigned short key_info; /* Key Information (unaligned) */ ++ unsigned short key_len; /* Key Length (unaligned) */ ++ unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN]; /* Replay Counter */ ++ unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN]; /* Nonce */ ++ unsigned char iv[EAPOL_WPA_KEY_IV_LEN]; /* Key IV */ ++ unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN]; /* Key RSC */ ++ unsigned char id[EAPOL_WPA_KEY_ID_LEN]; /* WPA:Key ID, 802.11i/WPA2: Reserved */ ++ unsigned char mic[EAPOL_WPA_KEY_MIC_LEN]; /* Key MIC */ ++ unsigned short data_len; /* Key Data Length */ ++ unsigned char data[EAPOL_WPA_KEY_DATA_LEN]; /* Key data */ ++} BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t; ++ ++#define EAPOL_WPA_KEY_LEN 95 ++ ++/* WPA/802.11i/WPA2 KEY KEY_INFO bits */ ++#define WPA_KEY_DESC_V1 0x01 ++#define WPA_KEY_DESC_V2 0x02 ++#define WPA_KEY_DESC_V3 0x03 ++#define WPA_KEY_PAIRWISE 0x08 ++#define WPA_KEY_INSTALL 0x40 ++#define WPA_KEY_ACK 0x80 ++#define WPA_KEY_MIC 0x100 ++#define WPA_KEY_SECURE 0x200 ++#define WPA_KEY_ERROR 0x400 ++#define WPA_KEY_REQ 0x800 ++ ++#define WPA_KEY_DESC_V2_OR_V3 WPA_KEY_DESC_V2 ++ ++/* WPA-only KEY KEY_INFO bits */ ++#define WPA_KEY_INDEX_0 0x00 ++#define WPA_KEY_INDEX_1 0x10 ++#define WPA_KEY_INDEX_2 0x20 ++#define WPA_KEY_INDEX_3 0x30 ++#define WPA_KEY_INDEX_MASK 0x30 ++#define WPA_KEY_INDEX_SHIFT 0x04 ++ ++/* 802.11i/WPA2-only KEY KEY_INFO bits */ ++#define WPA_KEY_ENCRYPTED_DATA 0x1000 ++ ++/* Key Data encapsulation */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint8 type; ++ uint8 length; ++ uint8 oui[3]; ++ uint8 subtype; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t; ++ ++#define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 6 ++ ++#define WPA2_KEY_DATA_SUBTYPE_GTK 1 ++#define WPA2_KEY_DATA_SUBTYPE_STAKEY 2 ++#define WPA2_KEY_DATA_SUBTYPE_MAC 3 ++#define WPA2_KEY_DATA_SUBTYPE_PMKID 4 ++#define WPA2_KEY_DATA_SUBTYPE_IGTK 9 ++ ++/* GTK encapsulation */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint8 flags; ++ uint8 reserved; ++ uint8 gtk[EAPOL_WPA_MAX_KEY_SIZE]; ++} BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t; ++ ++#define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 2 ++ ++#define WPA2_GTK_INDEX_MASK 0x03 ++#define WPA2_GTK_INDEX_SHIFT 0x00 ++ ++#define WPA2_GTK_TRANSMIT 0x04 ++ ++/* IGTK encapsulation */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint16 key_id; ++ uint8 ipn[6]; ++ uint8 key[EAPOL_WPA_MAX_KEY_SIZE]; ++} BWL_POST_PACKED_STRUCT eapol_wpa2_key_igtk_encap_t; ++ ++#define EAPOL_WPA2_KEY_IGTK_ENCAP_HDR_LEN 8 ++ ++/* STAKey encapsulation */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint8 reserved[2]; ++ uint8 mac[ETHER_ADDR_LEN]; ++ uint8 stakey[EAPOL_WPA_MAX_KEY_SIZE]; ++} BWL_POST_PACKED_STRUCT eapol_wpa2_key_stakey_encap_t; ++ ++#define WPA2_KEY_DATA_PAD 0xdd ++ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _eapol_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/ethernet.h b/drivers/net/wireless/ap6210/include/proto/ethernet.h +new file mode 100644 +index 0000000..a6ce6e1 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/ethernet.h +@@ -0,0 +1,190 @@ ++/* ++ * From FreeBSD 2.2.7: Fundamental constants relating to ethernet. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: ethernet.h 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#ifndef _NET_ETHERNET_H_ /* use native BSD ethernet.h when available */ ++#define _NET_ETHERNET_H_ ++ ++#ifndef _TYPEDEFS_H_ ++#include "typedefs.h" ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++ ++/* ++ * The number of bytes in an ethernet (MAC) address. ++ */ ++#define ETHER_ADDR_LEN 6 ++ ++/* ++ * The number of bytes in the type field. ++ */ ++#define ETHER_TYPE_LEN 2 ++ ++/* ++ * The number of bytes in the trailing CRC field. ++ */ ++#define ETHER_CRC_LEN 4 ++ ++/* ++ * The length of the combined header. ++ */ ++#define ETHER_HDR_LEN (ETHER_ADDR_LEN * 2 + ETHER_TYPE_LEN) ++ ++/* ++ * The minimum packet length. ++ */ ++#define ETHER_MIN_LEN 64 ++ ++/* ++ * The minimum packet user data length. ++ */ ++#define ETHER_MIN_DATA 46 ++ ++/* ++ * The maximum packet length. ++ */ ++#define ETHER_MAX_LEN 1518 ++ ++/* ++ * The maximum packet user data length. ++ */ ++#define ETHER_MAX_DATA 1500 ++ ++/* ether types */ ++#define ETHER_TYPE_MIN 0x0600 /* Anything less than MIN is a length */ ++#define ETHER_TYPE_IP 0x0800 /* IP */ ++#define ETHER_TYPE_ARP 0x0806 /* ARP */ ++#define ETHER_TYPE_8021Q 0x8100 /* 802.1Q */ ++#define ETHER_TYPE_IPV6 0x86dd /* IPv6 */ ++#define ETHER_TYPE_BRCM 0x886c /* Broadcom Corp. */ ++#define ETHER_TYPE_802_1X 0x888e /* 802.1x */ ++#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 /* 802.1x preauthentication */ ++#define ETHER_TYPE_WAI 0x88b4 /* WAI */ ++#define ETHER_TYPE_89_0D 0x890d /* 89-0d frame for TDLS */ ++ ++#define ETHER_TYPE_IPV6 0x86dd /* IPV6 */ ++ ++/* Broadcom subtype follows ethertype; First 2 bytes are reserved; Next 2 are subtype; */ ++#define ETHER_BRCM_SUBTYPE_LEN 4 /* Broadcom 4 byte subtype */ ++ ++/* ether header */ ++#define ETHER_DEST_OFFSET (0 * ETHER_ADDR_LEN) /* dest address offset */ ++#define ETHER_SRC_OFFSET (1 * ETHER_ADDR_LEN) /* src address offset */ ++#define ETHER_TYPE_OFFSET (2 * ETHER_ADDR_LEN) /* ether type offset */ ++ ++/* ++ * A macro to validate a length with ++ */ ++#define ETHER_IS_VALID_LEN(foo) \ ++ ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN) ++ ++#define ETHER_FILL_MCAST_ADDR_FROM_IP(ea, mgrp_ip) { \ ++ ((uint8 *)ea)[0] = 0x01; \ ++ ((uint8 *)ea)[1] = 0x00; \ ++ ((uint8 *)ea)[2] = 0x5e; \ ++ ((uint8 *)ea)[3] = ((mgrp_ip) >> 16) & 0x7f; \ ++ ((uint8 *)ea)[4] = ((mgrp_ip) >> 8) & 0xff; \ ++ ((uint8 *)ea)[5] = ((mgrp_ip) >> 0) & 0xff; \ ++} ++ ++#ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */ ++/* ++ * Structure of a 10Mb/s Ethernet header. ++ */ ++BWL_PRE_PACKED_STRUCT struct ether_header { ++ uint8 ether_dhost[ETHER_ADDR_LEN]; ++ uint8 ether_shost[ETHER_ADDR_LEN]; ++ uint16 ether_type; ++} BWL_POST_PACKED_STRUCT; ++ ++/* ++ * Structure of a 48-bit Ethernet address. ++ */ ++BWL_PRE_PACKED_STRUCT struct ether_addr { ++ uint8 octet[ETHER_ADDR_LEN]; ++} BWL_POST_PACKED_STRUCT; ++#endif /* !__INCif_etherh Quick and ugly hack for VxWorks */ ++ ++/* ++ * Takes a pointer, set, test, clear, toggle locally admininistered ++ * address bit in the 48-bit Ethernet address. ++ */ ++#define ETHER_SET_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2)) ++#define ETHER_IS_LOCALADDR(ea) (((uint8 *)(ea))[0] & 2) ++#define ETHER_CLR_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & 0xfd)) ++#define ETHER_TOGGLE_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] ^ 2)) ++ ++/* Takes a pointer, marks unicast address bit in the MAC address */ ++#define ETHER_SET_UNICAST(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] & ~1)) ++ ++/* ++ * Takes a pointer, returns true if a 48-bit multicast address ++ * (including broadcast, since it is all ones) ++ */ ++#define ETHER_ISMULTI(ea) (((const uint8 *)(ea))[0] & 1) ++ ++ ++/* compare two ethernet addresses - assumes the pointers can be referenced as shorts */ ++#define ether_cmp(a, b) (!(((short*)(a))[0] == ((short*)(b))[0]) | \ ++ !(((short*)(a))[1] == ((short*)(b))[1]) | \ ++ !(((short*)(a))[2] == ((short*)(b))[2])) ++ ++/* copy an ethernet address - assumes the pointers can be referenced as shorts */ ++#define ether_copy(s, d) { \ ++ ((short*)(d))[0] = ((const short*)(s))[0]; \ ++ ((short*)(d))[1] = ((const short*)(s))[1]; \ ++ ((short*)(d))[2] = ((const short*)(s))[2]; } ++ ++ ++static const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}}; ++static const struct ether_addr ether_null = {{0, 0, 0, 0, 0, 0}}; ++ ++#define ETHER_ISBCAST(ea) ((((uint8 *)(ea))[0] & \ ++ ((uint8 *)(ea))[1] & \ ++ ((uint8 *)(ea))[2] & \ ++ ((uint8 *)(ea))[3] & \ ++ ((uint8 *)(ea))[4] & \ ++ ((uint8 *)(ea))[5]) == 0xff) ++#define ETHER_ISNULLADDR(ea) ((((uint8 *)(ea))[0] | \ ++ ((uint8 *)(ea))[1] | \ ++ ((uint8 *)(ea))[2] | \ ++ ((uint8 *)(ea))[3] | \ ++ ((uint8 *)(ea))[4] | \ ++ ((uint8 *)(ea))[5]) == 0) ++ ++#define ETHER_MOVE_HDR(d, s) \ ++do { \ ++ struct ether_header t; \ ++ t = *(struct ether_header *)(s); \ ++ *(struct ether_header *)(d) = t; \ ++} while (0) ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _NET_ETHERNET_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/p2p.h b/drivers/net/wireless/ap6210/include/proto/p2p.h +new file mode 100644 +index 0000000..6716e2a +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/p2p.h +@@ -0,0 +1,579 @@ ++/* ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * Fundamental types and constants relating to WFA P2P (aka WiFi Direct) ++ * ++ * $Id: p2p.h 356417 2012-09-12 16:41:24Z $ ++ */ ++ ++#ifndef _P2P_H_ ++#define _P2P_H_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++#include ++#include ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++ ++/* WiFi P2P OUI values */ ++#define P2P_OUI WFA_OUI /* WiFi P2P OUI */ ++#define P2P_VER WFA_OUI_TYPE_P2P /* P2P version: 9=WiFi P2P v1.0 */ ++ ++#define P2P_IE_ID 0xdd /* P2P IE element ID */ ++ ++/* WiFi P2P IE */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_ie { ++ uint8 id; /* IE ID: 0xDD */ ++ uint8 len; /* IE length */ ++ uint8 OUI[3]; /* WiFi P2P specific OUI: P2P_OUI */ ++ uint8 oui_type; /* Identifies P2P version: P2P_VER */ ++ uint8 subelts[1]; /* variable length subelements */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_ie wifi_p2p_ie_t; ++ ++#define P2P_IE_FIXED_LEN 6 ++ ++#define P2P_ATTR_ID_OFF 0 ++#define P2P_ATTR_LEN_OFF 1 ++#define P2P_ATTR_DATA_OFF 3 ++ ++#define P2P_ATTR_ID_LEN 1 /* ID filed length */ ++#define P2P_ATTR_LEN_LEN 2 /* length field length */ ++#define P2P_ATTR_HDR_LEN 3 /* ID + 2-byte length field spec 1.02 */ ++ ++/* P2P IE Subelement IDs from WiFi P2P Technical Spec 1.00 */ ++#define P2P_SEID_STATUS 0 /* Status */ ++#define P2P_SEID_MINOR_RC 1 /* Minor Reason Code */ ++#define P2P_SEID_P2P_INFO 2 /* P2P Capability (capabilities info) */ ++#define P2P_SEID_DEV_ID 3 /* P2P Device ID */ ++#define P2P_SEID_INTENT 4 /* Group Owner Intent */ ++#define P2P_SEID_CFG_TIMEOUT 5 /* Configuration Timeout */ ++#define P2P_SEID_CHANNEL 6 /* Channel */ ++#define P2P_SEID_GRP_BSSID 7 /* P2P Group BSSID */ ++#define P2P_SEID_XT_TIMING 8 /* Extended Listen Timing */ ++#define P2P_SEID_INTINTADDR 9 /* Intended P2P Interface Address */ ++#define P2P_SEID_P2P_MGBTY 10 /* P2P Manageability */ ++#define P2P_SEID_CHAN_LIST 11 /* Channel List */ ++#define P2P_SEID_ABSENCE 12 /* Notice of Absence */ ++#define P2P_SEID_DEV_INFO 13 /* Device Info */ ++#define P2P_SEID_GROUP_INFO 14 /* Group Info */ ++#define P2P_SEID_GROUP_ID 15 /* Group ID */ ++#define P2P_SEID_P2P_IF 16 /* P2P Interface */ ++#define P2P_SEID_OP_CHANNEL 17 /* Operating Channel */ ++#define P2P_SEID_INVITE_FLAGS 18 /* Invitation Flags */ ++#define P2P_SEID_VNDR 221 /* Vendor-specific subelement */ ++ ++#define P2P_SE_VS_ID_SERVICES 0x1b /* BRCM proprietary subel: L2 Services */ ++ ++ ++/* WiFi P2P IE subelement: P2P Capability (capabilities info) */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_info_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_P2P_INFO */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 dev; /* Device Capability Bitmap */ ++ uint8 group; /* Group Capability Bitmap */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_info_se_s wifi_p2p_info_se_t; ++ ++/* P2P Capability subelement's Device Capability Bitmap bit values */ ++#define P2P_CAPSE_DEV_SERVICE_DIS 0x1 /* Service Discovery */ ++#define P2P_CAPSE_DEV_CLIENT_DIS 0x2 /* Client Discoverability */ ++#define P2P_CAPSE_DEV_CONCURRENT 0x4 /* Concurrent Operation */ ++#define P2P_CAPSE_DEV_INFRA_MAN 0x8 /* P2P Infrastructure Managed */ ++#define P2P_CAPSE_DEV_LIMIT 0x10 /* P2P Device Limit */ ++#define P2P_CAPSE_INVITE_PROC 0x20 /* P2P Invitation Procedure */ ++ ++/* P2P Capability subelement's Group Capability Bitmap bit values */ ++#define P2P_CAPSE_GRP_OWNER 0x1 /* P2P Group Owner */ ++#define P2P_CAPSE_PERSIST_GRP 0x2 /* Persistent P2P Group */ ++#define P2P_CAPSE_GRP_LIMIT 0x4 /* P2P Group Limit */ ++#define P2P_CAPSE_GRP_INTRA_BSS 0x8 /* Intra-BSS Distribution */ ++#define P2P_CAPSE_GRP_X_CONNECT 0x10 /* Cross Connection */ ++#define P2P_CAPSE_GRP_PERSISTENT 0x20 /* Persistent Reconnect */ ++#define P2P_CAPSE_GRP_FORMATION 0x40 /* Group Formation */ ++ ++ ++/* WiFi P2P IE subelement: Group Owner Intent */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_intent_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_INTENT */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 intent; /* Intent Value 0...15 (0=legacy 15=master only) */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_intent_se_s wifi_p2p_intent_se_t; ++ ++/* WiFi P2P IE subelement: Configuration Timeout */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_cfg_tmo_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_CFG_TIMEOUT */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 go_tmo; /* GO config timeout in units of 10 ms */ ++ uint8 client_tmo; /* Client config timeout in units of 10 ms */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_cfg_tmo_se_s wifi_p2p_cfg_tmo_se_t; ++ ++/* WiFi P2P IE subelement: Listen Channel */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_listen_channel_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_CHANNEL */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 country[3]; /* Country String */ ++ uint8 op_class; /* Operating Class */ ++ uint8 channel; /* Channel */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_listen_channel_se_s wifi_p2p_listen_channel_se_t; ++ ++/* WiFi P2P IE subelement: P2P Group BSSID */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_bssid_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_GRP_BSSID */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 mac[6]; /* P2P group bssid */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_grp_bssid_se_s wifi_p2p_grp_bssid_se_t; ++ ++/* WiFi P2P IE subelement: P2P Group ID */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_grp_id_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_GROUP_ID */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 mac[6]; /* P2P device address */ ++ uint8 ssid[1]; /* ssid. device id. variable length */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_grp_id_se_s wifi_p2p_grp_id_se_t; ++ ++/* WiFi P2P IE subelement: P2P Interface */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_intf_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_P2P_IF */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 mac[6]; /* P2P device address */ ++ uint8 ifaddrs; /* P2P Interface Address count */ ++ uint8 ifaddr[1][6]; /* P2P Interface Address list */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_intf_se_s wifi_p2p_intf_se_t; ++ ++/* WiFi P2P IE subelement: Status */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_status_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_STATUS */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 status; /* Status Code: P2P_STATSE_* */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_status_se_s wifi_p2p_status_se_t; ++ ++/* Status subelement Status Code definitions */ ++#define P2P_STATSE_SUCCESS 0 ++ /* Success */ ++#define P2P_STATSE_FAIL_INFO_CURR_UNAVAIL 1 ++ /* Failed, information currently unavailable */ ++#define P2P_STATSE_PASSED_UP P2P_STATSE_FAIL_INFO_CURR_UNAVAIL ++ /* Old name for above in P2P spec 1.08 and older */ ++#define P2P_STATSE_FAIL_INCOMPAT_PARAMS 2 ++ /* Failed, incompatible parameters */ ++#define P2P_STATSE_FAIL_LIMIT_REACHED 3 ++ /* Failed, limit reached */ ++#define P2P_STATSE_FAIL_INVALID_PARAMS 4 ++ /* Failed, invalid parameters */ ++#define P2P_STATSE_FAIL_UNABLE_TO_ACCOM 5 ++ /* Failed, unable to accomodate request */ ++#define P2P_STATSE_FAIL_PROTO_ERROR 6 ++ /* Failed, previous protocol error or disruptive behaviour */ ++#define P2P_STATSE_FAIL_NO_COMMON_CHAN 7 ++ /* Failed, no common channels */ ++#define P2P_STATSE_FAIL_UNKNOWN_GROUP 8 ++ /* Failed, unknown P2P Group */ ++#define P2P_STATSE_FAIL_INTENT 9 ++ /* Failed, both peers indicated Intent 15 in GO Negotiation */ ++#define P2P_STATSE_FAIL_INCOMPAT_PROVIS 10 ++ /* Failed, incompatible provisioning method */ ++#define P2P_STATSE_FAIL_USER_REJECT 11 ++ /* Failed, rejected by user */ ++ ++/* WiFi P2P IE attribute: Extended Listen Timing */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_ext_se_s { ++ uint8 eltId; /* ID: P2P_SEID_EXT_TIMING */ ++ uint8 len[2]; /* length not including eltId, len fields */ ++ uint8 avail[2]; /* availibility period */ ++ uint8 interval[2]; /* availibility interval */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_ext_se_s wifi_p2p_ext_se_t; ++ ++#define P2P_EXT_MIN 10 /* minimum 10ms */ ++ ++/* WiFi P2P IE subelement: Intended P2P Interface Address */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_intintad_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_INTINTADDR */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 mac[6]; /* intended P2P interface MAC address */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_intintad_se_s wifi_p2p_intintad_se_t; ++ ++/* WiFi P2P IE subelement: Channel */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_channel_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_STATUS */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 band; /* Regulatory Class (band) */ ++ uint8 channel; /* Channel */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_channel_se_s wifi_p2p_channel_se_t; ++ ++ ++/* Channel Entry structure within the Channel List SE */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_entry_s { ++ uint8 band; /* Regulatory Class (band) */ ++ uint8 num_channels; /* # of channels in the channel list */ ++ uint8 channels[WL_NUMCHANNELS]; /* Channel List */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_chanlist_entry_s wifi_p2p_chanlist_entry_t; ++#define WIFI_P2P_CHANLIST_SE_MAX_ENTRIES 2 ++ ++/* WiFi P2P IE subelement: Channel List */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_CHAN_LIST */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 country[3]; /* Country String */ ++ uint8 num_entries; /* # of channel entries */ ++ wifi_p2p_chanlist_entry_t entries[WIFI_P2P_CHANLIST_SE_MAX_ENTRIES]; ++ /* Channel Entry List */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_chanlist_se_s wifi_p2p_chanlist_se_t; ++ ++/* WiFi Primary Device Type structure */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_pri_devtype_s { ++ uint16 cat_id; /* Category ID */ ++ uint8 OUI[3]; /* WFA OUI: 0x0050F2 */ ++ uint8 oui_type; /* WPS_OUI_TYPE */ ++ uint16 sub_cat_id; /* Sub Category ID */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_pri_devtype_s wifi_p2p_pri_devtype_t; ++ ++/* WiFi P2P IE's Device Info subelement */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_devinfo_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_DEVINFO */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 mac[6]; /* P2P Device MAC address */ ++ uint16 wps_cfg_meths; /* Config Methods: reg_prototlv.h WPS_CONFMET_* */ ++ uint8 pri_devtype[8]; /* Primary Device Type */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_devinfo_se_s wifi_p2p_devinfo_se_t; ++ ++#define P2P_DEV_TYPE_LEN 8 ++ ++/* WiFi P2P IE's Group Info subelement Client Info Descriptor */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_cid_fixed_s { ++ uint8 len; ++ uint8 devaddr[ETHER_ADDR_LEN]; /* P2P Device Address */ ++ uint8 ifaddr[ETHER_ADDR_LEN]; /* P2P Interface Address */ ++ uint8 devcap; /* Device Capability */ ++ uint8 cfg_meths[2]; /* Config Methods: reg_prototlv.h WPS_CONFMET_* */ ++ uint8 pridt[P2P_DEV_TYPE_LEN]; /* Primary Device Type */ ++ uint8 secdts; /* Number of Secondary Device Types */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_cid_fixed_s wifi_p2p_cid_fixed_t; ++ ++/* WiFi P2P IE's Device ID subelement */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_devid_se_s { ++ uint8 eltId; ++ uint8 len[2]; ++ struct ether_addr addr; /* P2P Device MAC address */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_devid_se_s wifi_p2p_devid_se_t; ++ ++/* WiFi P2P IE subelement: P2P Manageability */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_mgbt_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_P2P_MGBTY */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 mg_bitmap; /* manageability bitmap */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_mgbt_se_s wifi_p2p_mgbt_se_t; ++/* mg_bitmap field bit values */ ++#define P2P_MGBTSE_P2PDEVMGMT_FLAG 0x1 /* AP supports Managed P2P Device */ ++ ++/* WiFi P2P IE subelement: Group Info */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_grpinfo_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_GROUP_INFO */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_grpinfo_se_s wifi_p2p_grpinfo_se_t; ++ ++/* WiFi IE subelement: Operating Channel */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_op_channel_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_OP_CHANNEL */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 country[3]; /* Country String */ ++ uint8 op_class; /* Operating Class */ ++ uint8 channel; /* Channel */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_op_channel_se_s wifi_p2p_op_channel_se_t; ++ ++/* WiFi IE subelement: INVITATION FLAGS */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_invite_flags_se_s { ++ uint8 eltId; /* SE ID: P2P_SEID_INVITE_FLAGS */ ++ uint8 len[2]; /* SE length not including eltId, len fields */ ++ uint8 flags; /* Flags */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_invite_flags_se_s wifi_p2p_invite_flags_se_t; ++ ++/* WiFi P2P Action Frame */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_action_frame { ++ uint8 category; /* P2P_AF_CATEGORY */ ++ uint8 OUI[3]; /* OUI - P2P_OUI */ ++ uint8 type; /* OUI Type - P2P_VER */ ++ uint8 subtype; /* OUI Subtype - P2P_AF_* */ ++ uint8 dialog_token; /* nonzero, identifies req/resp tranaction */ ++ uint8 elts[1]; /* Variable length information elements. Max size = ++ * ACTION_FRAME_SIZE - sizeof(this structure) - 1 ++ */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_action_frame wifi_p2p_action_frame_t; ++#define P2P_AF_CATEGORY 0x7f ++ ++#define P2P_AF_FIXED_LEN 7 ++ ++/* WiFi P2P Action Frame OUI Subtypes */ ++#define P2P_AF_NOTICE_OF_ABSENCE 0 /* Notice of Absence */ ++#define P2P_AF_PRESENCE_REQ 1 /* P2P Presence Request */ ++#define P2P_AF_PRESENCE_RSP 2 /* P2P Presence Response */ ++#define P2P_AF_GO_DISC_REQ 3 /* GO Discoverability Request */ ++ ++ ++/* WiFi P2P Public Action Frame */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_pub_act_frame { ++ uint8 category; /* P2P_PUB_AF_CATEGORY */ ++ uint8 action; /* P2P_PUB_AF_ACTION */ ++ uint8 oui[3]; /* P2P_OUI */ ++ uint8 oui_type; /* OUI type - P2P_VER */ ++ uint8 subtype; /* OUI subtype - P2P_TYPE_* */ ++ uint8 dialog_token; /* nonzero, identifies req/rsp transaction */ ++ uint8 elts[1]; /* Variable length information elements. Max size = ++ * ACTION_FRAME_SIZE - sizeof(this structure) - 1 ++ */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_pub_act_frame wifi_p2p_pub_act_frame_t; ++#define P2P_PUB_AF_FIXED_LEN 8 ++#define P2P_PUB_AF_CATEGORY 0x04 ++#define P2P_PUB_AF_ACTION 0x09 ++ ++/* WiFi P2P Public Action Frame OUI Subtypes */ ++#define P2P_PAF_GON_REQ 0 /* Group Owner Negotiation Req */ ++#define P2P_PAF_GON_RSP 1 /* Group Owner Negotiation Rsp */ ++#define P2P_PAF_GON_CONF 2 /* Group Owner Negotiation Confirm */ ++#define P2P_PAF_INVITE_REQ 3 /* P2P Invitation Request */ ++#define P2P_PAF_INVITE_RSP 4 /* P2P Invitation Response */ ++#define P2P_PAF_DEVDIS_REQ 5 /* Device Discoverability Request */ ++#define P2P_PAF_DEVDIS_RSP 6 /* Device Discoverability Response */ ++#define P2P_PAF_PROVDIS_REQ 7 /* Provision Discovery Request */ ++#define P2P_PAF_PROVDIS_RSP 8 /* Provision Discovery Response */ ++#define P2P_PAF_SUBTYPE_INVALID 255 /* Invalid Subtype */ ++ ++/* TODO: Stop using these obsolete aliases for P2P_PAF_GON_* */ ++#define P2P_TYPE_MNREQ P2P_PAF_GON_REQ ++#define P2P_TYPE_MNRSP P2P_PAF_GON_RSP ++#define P2P_TYPE_MNCONF P2P_PAF_GON_CONF ++ ++/* WiFi P2P IE subelement: Notice of Absence */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_desc { ++ uint8 cnt_type; /* Count/Type */ ++ uint32 duration; /* Duration */ ++ uint32 interval; /* Interval */ ++ uint32 start; /* Start Time */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_noa_desc wifi_p2p_noa_desc_t; ++ ++BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_se { ++ uint8 eltId; /* Subelement ID */ ++ uint8 len[2]; /* Length */ ++ uint8 index; /* Index */ ++ uint8 ops_ctw_parms; /* CTWindow and OppPS Parameters */ ++ wifi_p2p_noa_desc_t desc[1]; /* Notice of Absence Descriptor(s) */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2p_noa_se wifi_p2p_noa_se_t; ++ ++#define P2P_NOA_SE_FIXED_LEN 5 ++ ++/* cnt_type field values */ ++#define P2P_NOA_DESC_CNT_RESERVED 0 /* reserved and should not be used */ ++#define P2P_NOA_DESC_CNT_REPEAT 255 /* continuous schedule */ ++#define P2P_NOA_DESC_TYPE_PREFERRED 1 /* preferred values */ ++#define P2P_NOA_DESC_TYPE_ACCEPTABLE 2 /* acceptable limits */ ++ ++/* ctw_ops_parms field values */ ++#define P2P_NOA_CTW_MASK 0x7f ++#define P2P_NOA_OPS_MASK 0x80 ++#define P2P_NOA_OPS_SHIFT 7 ++ ++#define P2P_CTW_MIN 10 /* minimum 10TU */ ++ ++/* ++ * P2P Service Discovery related ++ */ ++#define P2PSD_ACTION_CATEGORY 0x04 ++ /* Public action frame */ ++#define P2PSD_ACTION_ID_GAS_IREQ 0x0a ++ /* Action value for GAS Initial Request AF */ ++#define P2PSD_ACTION_ID_GAS_IRESP 0x0b ++ /* Action value for GAS Initial Response AF */ ++#define P2PSD_ACTION_ID_GAS_CREQ 0x0c ++ /* Action value for GAS Comback Request AF */ ++#define P2PSD_ACTION_ID_GAS_CRESP 0x0d ++ /* Action value for GAS Comback Response AF */ ++#define P2PSD_AD_EID 0x6c ++ /* Advertisement Protocol IE ID */ ++#define P2PSD_ADP_TUPLE_QLMT_PAMEBI 0x00 ++ /* Query Response Length Limit 7 bits plus PAME-BI 1 bit */ ++#define P2PSD_ADP_PROTO_ID 0x00 ++ /* Advertisement Protocol ID. Always 0 for P2P SD */ ++#define P2PSD_GAS_OUI P2P_OUI ++ /* WFA OUI */ ++#define P2PSD_GAS_OUI_SUBTYPE P2P_VER ++ /* OUI Subtype for GAS IE */ ++#define P2PSD_GAS_NQP_INFOID 0xDDDD ++ /* NQP Query Info ID: 56797 */ ++#define P2PSD_GAS_COMEBACKDEALY 0x00 ++ /* Not used in the Native GAS protocol */ ++ ++/* Service Protocol Type */ ++typedef enum p2psd_svc_protype { ++ SVC_RPOTYPE_ALL = 0, ++ SVC_RPOTYPE_BONJOUR = 1, ++ SVC_RPOTYPE_UPNP = 2, ++ SVC_RPOTYPE_WSD = 3, ++ SVC_RPOTYPE_VENDOR = 255 ++} p2psd_svc_protype_t; ++ ++/* Service Discovery response status code */ ++typedef enum { ++ P2PSD_RESP_STATUS_SUCCESS = 0, ++ P2PSD_RESP_STATUS_PROTYPE_NA = 1, ++ P2PSD_RESP_STATUS_DATA_NA = 2, ++ P2PSD_RESP_STATUS_BAD_REQUEST = 3 ++} p2psd_resp_status_t; ++ ++/* Advertisement Protocol IE tuple field */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_tpl { ++ uint8 llm_pamebi; /* Query Response Length Limit bit 0-6, set to 0 plus ++ * Pre-Associated Message Exchange BSSID Independent bit 7, set to 0 ++ */ ++ uint8 adp_id; /* Advertisement Protocol ID: 0 for NQP Native Query Protocol */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_adp_tpl wifi_p2psd_adp_tpl_t; ++ ++/* Advertisement Protocol IE */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_ie { ++ uint8 id; /* IE ID: 0x6c - 108 */ ++ uint8 len; /* IE length */ ++ wifi_p2psd_adp_tpl_t adp_tpl; /* Advertisement Protocol Tuple field. Only one ++ * tuple is defined for P2P Service Discovery ++ */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_adp_ie wifi_p2psd_adp_ie_t; ++ ++/* NQP Vendor-specific Content */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_nqp_query_vsc { ++ uint8 oui_subtype; /* OUI Subtype: 0x09 */ ++ uint16 svc_updi; /* Service Update Indicator */ ++ uint8 svc_tlvs[1]; /* wifi_p2psd_qreq_tlv_t type for service request, ++ * wifi_p2psd_qresp_tlv_t type for service response ++ */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_nqp_query_vsc wifi_p2psd_nqp_query_vsc_t; ++ ++/* Service Request TLV */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_tlv { ++ uint16 len; /* Length: 5 plus size of Query Data */ ++ uint8 svc_prot; /* Service Protocol Type */ ++ uint8 svc_tscid; /* Service Transaction ID */ ++ uint8 query_data[1]; /* Query Data, passed in from above Layer 2 */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_qreq_tlv wifi_p2psd_qreq_tlv_t; ++ ++/* Query Request Frame, defined in generic format, instead of NQP specific */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_frame { ++ uint16 info_id; /* Info ID: 0xDDDD */ ++ uint16 len; /* Length of service request TLV, 5 plus the size of request data */ ++ uint8 oui[3]; /* WFA OUI: 0x0050F2 */ ++ uint8 qreq_vsc[1]; /* Vendor-specific Content: wifi_p2psd_nqp_query_vsc_t type for NQP */ ++ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_qreq_frame wifi_p2psd_qreq_frame_t; ++ ++/* GAS Initial Request AF body, "elts" in wifi_p2p_pub_act_frame */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_ireq_frame { ++ wifi_p2psd_adp_ie_t adp_ie; /* Advertisement Protocol IE */ ++ uint16 qreq_len; /* Query Request Length */ ++ uint8 qreq_frm[1]; /* Query Request Frame wifi_p2psd_qreq_frame_t */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_gas_ireq_frame wifi_p2psd_gas_ireq_frame_t; ++ ++/* Service Response TLV */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_tlv { ++ uint16 len; /* Length: 5 plus size of Query Data */ ++ uint8 svc_prot; /* Service Protocol Type */ ++ uint8 svc_tscid; /* Service Transaction ID */ ++ uint8 status; /* Value defined in Table 57 of P2P spec. */ ++ uint8 query_data[1]; /* Response Data, passed in from above Layer 2 */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_qresp_tlv wifi_p2psd_qresp_tlv_t; ++ ++/* Query Response Frame, defined in generic format, instead of NQP specific */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_frame { ++ uint16 info_id; /* Info ID: 0xDDDD */ ++ uint16 len; /* Lenth of service response TLV, 6 plus the size of resp data */ ++ uint8 oui[3]; /* WFA OUI: 0x0050F2 */ ++ uint8 qresp_vsc[1]; /* Vendor-specific Content: wifi_p2psd_qresp_tlv_t type for NQP */ ++ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_qresp_frame wifi_p2psd_qresp_frame_t; ++ ++/* GAS Initial Response AF body, "elts" in wifi_p2p_pub_act_frame */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_iresp_frame { ++ uint16 status; /* Value defined in Table 7-23 of IEEE P802.11u */ ++ uint16 cb_delay; /* GAS Comeback Delay */ ++ wifi_p2psd_adp_ie_t adp_ie; /* Advertisement Protocol IE */ ++ uint16 qresp_len; /* Query Response Length */ ++ uint8 qresp_frm[1]; /* Query Response Frame wifi_p2psd_qresp_frame_t */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_gas_iresp_frame wifi_p2psd_gas_iresp_frame_t; ++ ++/* GAS Comeback Response AF body, "elts" in wifi_p2p_pub_act_frame */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_cresp_frame { ++ uint16 status; /* Value defined in Table 7-23 of IEEE P802.11u */ ++ uint8 fragment_id; /* Fragmentation ID */ ++ uint16 cb_delay; /* GAS Comeback Delay */ ++ wifi_p2psd_adp_ie_t adp_ie; /* Advertisement Protocol IE */ ++ uint16 qresp_len; /* Query Response Length */ ++ uint8 qresp_frm[1]; /* Query Response Frame wifi_p2psd_qresp_frame_t */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_gas_cresp_frame wifi_p2psd_gas_cresp_frame_t; ++ ++/* Wi-Fi GAS Public Action Frame */ ++BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_pub_act_frame { ++ uint8 category; /* 0x04 Public Action Frame */ ++ uint8 action; /* 0x6c Advertisement Protocol */ ++ uint8 dialog_token; /* nonzero, identifies req/rsp transaction */ ++ uint8 query_data[1]; /* Query Data. wifi_p2psd_gas_ireq_frame_t ++ * or wifi_p2psd_gas_iresp_frame_t format ++ */ ++} BWL_POST_PACKED_STRUCT; ++typedef struct wifi_p2psd_gas_pub_act_frame wifi_p2psd_gas_pub_act_frame_t; ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _P2P_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/sdspi.h b/drivers/net/wireless/ap6210/include/proto/sdspi.h +new file mode 100644 +index 0000000..a4900ed +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/sdspi.h +@@ -0,0 +1,75 @@ ++/* ++ * SD-SPI Protocol Standard ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sdspi.h 241182 2011-02-17 21:50:03Z $ ++ */ ++#ifndef _SD_SPI_H ++#define _SD_SPI_H ++ ++#define SPI_START_M BITFIELD_MASK(1) /* Bit [31] - Start Bit */ ++#define SPI_START_S 31 ++#define SPI_DIR_M BITFIELD_MASK(1) /* Bit [30] - Direction */ ++#define SPI_DIR_S 30 ++#define SPI_CMD_INDEX_M BITFIELD_MASK(6) /* Bits [29:24] - Command number */ ++#define SPI_CMD_INDEX_S 24 ++#define SPI_RW_M BITFIELD_MASK(1) /* Bit [23] - Read=0, Write=1 */ ++#define SPI_RW_S 23 ++#define SPI_FUNC_M BITFIELD_MASK(3) /* Bits [22:20] - Function Number */ ++#define SPI_FUNC_S 20 ++#define SPI_RAW_M BITFIELD_MASK(1) /* Bit [19] - Read After Wr */ ++#define SPI_RAW_S 19 ++#define SPI_STUFF_M BITFIELD_MASK(1) /* Bit [18] - Stuff bit */ ++#define SPI_STUFF_S 18 ++#define SPI_BLKMODE_M BITFIELD_MASK(1) /* Bit [19] - Blockmode 1=blk */ ++#define SPI_BLKMODE_S 19 ++#define SPI_OPCODE_M BITFIELD_MASK(1) /* Bit [18] - OP Code */ ++#define SPI_OPCODE_S 18 ++#define SPI_ADDR_M BITFIELD_MASK(17) /* Bits [17:1] - Address */ ++#define SPI_ADDR_S 1 ++#define SPI_STUFF0_M BITFIELD_MASK(1) /* Bit [0] - Stuff bit */ ++#define SPI_STUFF0_S 0 ++ ++#define SPI_RSP_START_M BITFIELD_MASK(1) /* Bit [7] - Start Bit (always 0) */ ++#define SPI_RSP_START_S 7 ++#define SPI_RSP_PARAM_ERR_M BITFIELD_MASK(1) /* Bit [6] - Parameter Error */ ++#define SPI_RSP_PARAM_ERR_S 6 ++#define SPI_RSP_RFU5_M BITFIELD_MASK(1) /* Bit [5] - RFU (Always 0) */ ++#define SPI_RSP_RFU5_S 5 ++#define SPI_RSP_FUNC_ERR_M BITFIELD_MASK(1) /* Bit [4] - Function number error */ ++#define SPI_RSP_FUNC_ERR_S 4 ++#define SPI_RSP_CRC_ERR_M BITFIELD_MASK(1) /* Bit [3] - COM CRC Error */ ++#define SPI_RSP_CRC_ERR_S 3 ++#define SPI_RSP_ILL_CMD_M BITFIELD_MASK(1) /* Bit [2] - Illegal Command error */ ++#define SPI_RSP_ILL_CMD_S 2 ++#define SPI_RSP_RFU1_M BITFIELD_MASK(1) /* Bit [1] - RFU (Always 0) */ ++#define SPI_RSP_RFU1_S 1 ++#define SPI_RSP_IDLE_M BITFIELD_MASK(1) /* Bit [0] - In idle state */ ++#define SPI_RSP_IDLE_S 0 ++ ++/* SD-SPI Protocol Definitions */ ++#define SDSPI_COMMAND_LEN 6 /* Number of bytes in an SD command */ ++#define SDSPI_START_BLOCK 0xFE /* SD Start Block Token */ ++#define SDSPI_IDLE_PAD 0xFF /* SD-SPI idle value for MOSI */ ++#define SDSPI_START_BIT_MASK 0x80 ++ ++#endif /* _SD_SPI_H */ +diff --git a/drivers/net/wireless/ap6210/include/proto/vlan.h b/drivers/net/wireless/ap6210/include/proto/vlan.h +new file mode 100644 +index 0000000..88502bf +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/vlan.h +@@ -0,0 +1,69 @@ ++/* ++ * 802.1Q VLAN protocol definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: vlan.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _vlan_h_ ++#define _vlan_h_ ++ ++#ifndef _TYPEDEFS_H_ ++#include ++#endif ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++#define VLAN_VID_MASK 0xfff /* low 12 bits are vlan id */ ++#define VLAN_CFI_SHIFT 12 /* canonical format indicator bit */ ++#define VLAN_PRI_SHIFT 13 /* user priority */ ++ ++#define VLAN_PRI_MASK 7 /* 3 bits of priority */ ++ ++#define VLAN_TAG_LEN 4 ++#define VLAN_TAG_OFFSET (2 * ETHER_ADDR_LEN) /* offset in Ethernet II packet only */ ++ ++#define VLAN_TPID 0x8100 /* VLAN ethertype/Tag Protocol ID */ ++ ++struct ethervlan_header { ++ uint8 ether_dhost[ETHER_ADDR_LEN]; ++ uint8 ether_shost[ETHER_ADDR_LEN]; ++ uint16 vlan_type; /* 0x8100 */ ++ uint16 vlan_tag; /* priority, cfi and vid */ ++ uint16 ether_type; ++}; ++ ++#define ETHERVLAN_HDR_LEN (ETHER_HDR_LEN + VLAN_TAG_LEN) ++ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#define ETHERVLAN_MOVE_HDR(d, s) \ ++do { \ ++ struct ethervlan_header t; \ ++ t = *(struct ethervlan_header *)(s); \ ++ *(struct ethervlan_header *)(d) = t; \ ++} while (0) ++ ++#endif /* _vlan_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/proto/wpa.h b/drivers/net/wireless/ap6210/include/proto/wpa.h +new file mode 100644 +index 0000000..23ab8d6 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/proto/wpa.h +@@ -0,0 +1,206 @@ ++/* ++ * Fundamental types and constants relating to WPA ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wpa.h 261155 2011-05-23 23:51:32Z $ ++ */ ++ ++#ifndef _proto_wpa_h_ ++#define _proto_wpa_h_ ++ ++#include ++#include ++ ++ ++/* This marks the start of a packed structure section. */ ++#include ++ ++/* Reason Codes */ ++ ++/* 13 through 23 taken from IEEE Std 802.11i-2004 */ ++#define DOT11_RC_INVALID_WPA_IE 13 /* Invalid info. element */ ++#define DOT11_RC_MIC_FAILURE 14 /* Michael failure */ ++#define DOT11_RC_4WH_TIMEOUT 15 /* 4-way handshake timeout */ ++#define DOT11_RC_GTK_UPDATE_TIMEOUT 16 /* Group key update timeout */ ++#define DOT11_RC_WPA_IE_MISMATCH 17 /* WPA IE in 4-way handshake differs from ++ * (re-)assoc. request/probe response ++ */ ++#define DOT11_RC_INVALID_MC_CIPHER 18 /* Invalid multicast cipher */ ++#define DOT11_RC_INVALID_UC_CIPHER 19 /* Invalid unicast cipher */ ++#define DOT11_RC_INVALID_AKMP 20 /* Invalid authenticated key management protocol */ ++#define DOT11_RC_BAD_WPA_VERSION 21 /* Unsupported WPA version */ ++#define DOT11_RC_INVALID_WPA_CAP 22 /* Invalid WPA IE capabilities */ ++#define DOT11_RC_8021X_AUTH_FAIL 23 /* 802.1X authentication failure */ ++ ++#define WPA2_PMKID_LEN 16 ++ ++/* WPA IE fixed portion */ ++typedef BWL_PRE_PACKED_STRUCT struct ++{ ++ uint8 tag; /* TAG */ ++ uint8 length; /* TAG length */ ++ uint8 oui[3]; /* IE OUI */ ++ uint8 oui_type; /* OUI type */ ++ BWL_PRE_PACKED_STRUCT struct { ++ uint8 low; ++ uint8 high; ++ } BWL_POST_PACKED_STRUCT version; /* IE version */ ++} BWL_POST_PACKED_STRUCT wpa_ie_fixed_t; ++#define WPA_IE_OUITYPE_LEN 4 ++#define WPA_IE_FIXED_LEN 8 ++#define WPA_IE_TAG_FIXED_LEN 6 ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint8 tag; /* TAG */ ++ uint8 length; /* TAG length */ ++ BWL_PRE_PACKED_STRUCT struct { ++ uint8 low; ++ uint8 high; ++ } BWL_POST_PACKED_STRUCT version; /* IE version */ ++} BWL_POST_PACKED_STRUCT wpa_rsn_ie_fixed_t; ++#define WPA_RSN_IE_FIXED_LEN 4 ++#define WPA_RSN_IE_TAG_FIXED_LEN 2 ++typedef uint8 wpa_pmkid_t[WPA2_PMKID_LEN]; ++ ++/* WPA suite/multicast suite */ ++typedef BWL_PRE_PACKED_STRUCT struct ++{ ++ uint8 oui[3]; ++ uint8 type; ++} BWL_POST_PACKED_STRUCT wpa_suite_t, wpa_suite_mcast_t; ++#define WPA_SUITE_LEN 4 ++ ++/* WPA unicast suite list/key management suite list */ ++typedef BWL_PRE_PACKED_STRUCT struct ++{ ++ BWL_PRE_PACKED_STRUCT struct { ++ uint8 low; ++ uint8 high; ++ } BWL_POST_PACKED_STRUCT count; ++ wpa_suite_t list[1]; ++} BWL_POST_PACKED_STRUCT wpa_suite_ucast_t, wpa_suite_auth_key_mgmt_t; ++#define WPA_IE_SUITE_COUNT_LEN 2 ++typedef BWL_PRE_PACKED_STRUCT struct ++{ ++ BWL_PRE_PACKED_STRUCT struct { ++ uint8 low; ++ uint8 high; ++ } BWL_POST_PACKED_STRUCT count; ++ wpa_pmkid_t list[1]; ++} BWL_POST_PACKED_STRUCT wpa_pmkid_list_t; ++ ++/* WPA cipher suites */ ++#define WPA_CIPHER_NONE 0 /* None */ ++#define WPA_CIPHER_WEP_40 1 /* WEP (40-bit) */ ++#define WPA_CIPHER_TKIP 2 /* TKIP: default for WPA */ ++#define WPA_CIPHER_AES_OCB 3 /* AES (OCB) */ ++#define WPA_CIPHER_AES_CCM 4 /* AES (CCM) */ ++#define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */ ++#define WPA_CIPHER_BIP 6 /* WEP (104-bit) */ ++#define WPA_CIPHER_TPK 7 /* Group addressed traffic not allowed */ ++#ifdef BCMWAPI_WPI ++#define WAPI_CIPHER_NONE WPA_CIPHER_NONE ++#define WAPI_CIPHER_SMS4 11 ++ ++#define WAPI_CSE_WPI_SMS4 1 ++#endif /* BCMWAPI_WPI */ ++ ++ ++#define IS_WPA_CIPHER(cipher) ((cipher) == WPA_CIPHER_NONE || \ ++ (cipher) == WPA_CIPHER_WEP_40 || \ ++ (cipher) == WPA_CIPHER_WEP_104 || \ ++ (cipher) == WPA_CIPHER_TKIP || \ ++ (cipher) == WPA_CIPHER_AES_OCB || \ ++ (cipher) == WPA_CIPHER_AES_CCM || \ ++ (cipher) == WPA_CIPHER_TPK) ++ ++#ifdef BCMWAPI_WAI ++#define IS_WAPI_CIPHER(cipher) ((cipher) == WAPI_CIPHER_NONE || \ ++ (cipher) == WAPI_CSE_WPI_SMS4) ++ ++/* convert WAPI_CSE_WPI_XXX to WAPI_CIPHER_XXX */ ++#define WAPI_CSE_WPI_2_CIPHER(cse) ((cse) == WAPI_CSE_WPI_SMS4 ? \ ++ WAPI_CIPHER_SMS4 : WAPI_CIPHER_NONE) ++ ++#define WAPI_CIPHER_2_CSE_WPI(cipher) ((cipher) == WAPI_CIPHER_SMS4 ? \ ++ WAPI_CSE_WPI_SMS4 : WAPI_CIPHER_NONE) ++#endif /* BCMWAPI_WAI */ ++ ++ ++/* WPA TKIP countermeasures parameters */ ++#define WPA_TKIP_CM_DETECT 60 /* multiple MIC failure window (seconds) */ ++#define WPA_TKIP_CM_BLOCK 60 /* countermeasures active window (seconds) */ ++ ++/* RSN IE defines */ ++#define RSN_CAP_LEN 2 /* Length of RSN capabilities field (2 octets) */ ++ ++/* RSN Capabilities defined in 802.11i */ ++#define RSN_CAP_PREAUTH 0x0001 ++#define RSN_CAP_NOPAIRWISE 0x0002 ++#define RSN_CAP_PTK_REPLAY_CNTR_MASK 0x000C ++#define RSN_CAP_PTK_REPLAY_CNTR_SHIFT 2 ++#define RSN_CAP_GTK_REPLAY_CNTR_MASK 0x0030 ++#define RSN_CAP_GTK_REPLAY_CNTR_SHIFT 4 ++#define RSN_CAP_1_REPLAY_CNTR 0 ++#define RSN_CAP_2_REPLAY_CNTRS 1 ++#define RSN_CAP_4_REPLAY_CNTRS 2 ++#define RSN_CAP_16_REPLAY_CNTRS 3 ++#ifdef MFP ++#define RSN_CAP_MFPR 0x0040 ++#define RSN_CAP_MFPC 0x0080 ++#endif ++ ++/* WPA capabilities defined in 802.11i */ ++#define WPA_CAP_4_REPLAY_CNTRS RSN_CAP_4_REPLAY_CNTRS ++#define WPA_CAP_16_REPLAY_CNTRS RSN_CAP_16_REPLAY_CNTRS ++#define WPA_CAP_REPLAY_CNTR_SHIFT RSN_CAP_PTK_REPLAY_CNTR_SHIFT ++#define WPA_CAP_REPLAY_CNTR_MASK RSN_CAP_PTK_REPLAY_CNTR_MASK ++ ++/* WPA capabilities defined in 802.11zD9.0 */ ++#define WPA_CAP_PEER_KEY_ENABLE (0x1 << 1) /* bit 9 */ ++ ++/* WPA Specific defines */ ++#define WPA_CAP_LEN RSN_CAP_LEN /* Length of RSN capabilities in RSN IE (2 octets) */ ++#define WPA_PMKID_CNT_LEN 2 /* Length of RSN PMKID count (2 octests) */ ++ ++#define WPA_CAP_WPA2_PREAUTH RSN_CAP_PREAUTH ++ ++#ifdef BCMWAPI_WAI ++#define WAPI_CAP_PREAUTH RSN_CAP_PREAUTH ++ ++/* Other WAI definition */ ++#define WAPI_WAI_REQUEST 0x00F1 ++#define WAPI_UNICAST_REKEY 0x00F2 ++#define WAPI_STA_AGING 0x00F3 ++#define WAPI_MUTIL_REKEY 0x00F4 ++#define WAPI_STA_STATS 0x00F5 ++ ++#define WAPI_USK_REKEY_COUNT 0x4000000 /* 0xA00000 */ ++#define WAPI_MSK_REKEY_COUNT 0x4000000 /* 0xA00000 */ ++#endif /* BCMWAPI_WAI */ ++#define WPA2_PMKID_COUNT_LEN 2 ++ ++ ++/* This marks the end of a packed structure section. */ ++#include ++ ++#endif /* _proto_wpa_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/sbchipc.h b/drivers/net/wireless/ap6210/include/sbchipc.h +new file mode 100644 +index 0000000..c694291 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbchipc.h +@@ -0,0 +1,2405 @@ ++/* ++ * SiliconBackplane Chipcommon core hardware definitions. ++ * ++ * The chipcommon core provides chip identification, SB control, ++ * JTAG, 0/1/2 UARTs, clock frequency control, a watchdog interrupt timer, ++ * GPIO interface, extbus, and support for serial and parallel flashes. ++ * ++ * $Id: sbchipc.h 347614 2012-07-27 10:24:51Z $ ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ */ ++ ++#ifndef _SBCHIPC_H ++#define _SBCHIPC_H ++ ++#ifndef _LANGUAGE_ASSEMBLY ++ ++/* cpp contortions to concatenate w/arg prescan */ ++#ifndef PAD ++#define _PADLINE(line) pad ## line ++#define _XSTR(line) _PADLINE(line) ++#define PAD _XSTR(__LINE__) ++#endif /* PAD */ ++ ++typedef struct eci_prerev35 { ++ uint32 eci_output; ++ uint32 eci_control; ++ uint32 eci_inputlo; ++ uint32 eci_inputmi; ++ uint32 eci_inputhi; ++ uint32 eci_inputintpolaritylo; ++ uint32 eci_inputintpolaritymi; ++ uint32 eci_inputintpolarityhi; ++ uint32 eci_intmasklo; ++ uint32 eci_intmaskmi; ++ uint32 eci_intmaskhi; ++ uint32 eci_eventlo; ++ uint32 eci_eventmi; ++ uint32 eci_eventhi; ++ uint32 eci_eventmasklo; ++ uint32 eci_eventmaskmi; ++ uint32 eci_eventmaskhi; ++ uint32 PAD[3]; ++} eci_prerev35_t; ++ ++typedef struct eci_rev35 { ++ uint32 eci_outputlo; ++ uint32 eci_outputhi; ++ uint32 eci_controllo; ++ uint32 eci_controlhi; ++ uint32 eci_inputlo; ++ uint32 eci_inputhi; ++ uint32 eci_inputintpolaritylo; ++ uint32 eci_inputintpolarityhi; ++ uint32 eci_intmasklo; ++ uint32 eci_intmaskhi; ++ uint32 eci_eventlo; ++ uint32 eci_eventhi; ++ uint32 eci_eventmasklo; ++ uint32 eci_eventmaskhi; ++ uint32 eci_auxtx; ++ uint32 eci_auxrx; ++ uint32 eci_datatag; ++ uint32 eci_uartescvalue; ++ uint32 eci_autobaudctr; ++ uint32 eci_uartfifolevel; ++} eci_rev35_t; ++ ++typedef struct flash_config { ++ uint32 PAD[19]; ++ /* Flash struct configuration registers (0x18c) for BCM4706 (corerev = 31) */ ++ uint32 flashstrconfig; ++} flash_config_t; ++ ++typedef volatile struct { ++ uint32 chipid; /* 0x0 */ ++ uint32 capabilities; ++ uint32 corecontrol; /* corerev >= 1 */ ++ uint32 bist; ++ ++ /* OTP */ ++ uint32 otpstatus; /* 0x10, corerev >= 10 */ ++ uint32 otpcontrol; ++ uint32 otpprog; ++ uint32 otplayout; /* corerev >= 23 */ ++ ++ /* Interrupt control */ ++ uint32 intstatus; /* 0x20 */ ++ uint32 intmask; ++ ++ /* Chip specific regs */ ++ uint32 chipcontrol; /* 0x28, rev >= 11 */ ++ uint32 chipstatus; /* 0x2c, rev >= 11 */ ++ ++ /* Jtag Master */ ++ uint32 jtagcmd; /* 0x30, rev >= 10 */ ++ uint32 jtagir; ++ uint32 jtagdr; ++ uint32 jtagctrl; ++ ++ /* serial flash interface registers */ ++ uint32 flashcontrol; /* 0x40 */ ++ uint32 flashaddress; ++ uint32 flashdata; ++ uint32 otplayoutextension; /* rev >= 35 */ ++ ++ /* Silicon backplane configuration broadcast control */ ++ uint32 broadcastaddress; /* 0x50 */ ++ uint32 broadcastdata; ++ ++ /* gpio - cleared only by power-on-reset */ ++ uint32 gpiopullup; /* 0x58, corerev >= 20 */ ++ uint32 gpiopulldown; /* 0x5c, corerev >= 20 */ ++ uint32 gpioin; /* 0x60 */ ++ uint32 gpioout; /* 0x64 */ ++ uint32 gpioouten; /* 0x68 */ ++ uint32 gpiocontrol; /* 0x6C */ ++ uint32 gpiointpolarity; /* 0x70 */ ++ uint32 gpiointmask; /* 0x74 */ ++ ++ /* GPIO events corerev >= 11 */ ++ uint32 gpioevent; ++ uint32 gpioeventintmask; ++ ++ /* Watchdog timer */ ++ uint32 watchdog; /* 0x80 */ ++ ++ /* GPIO events corerev >= 11 */ ++ uint32 gpioeventintpolarity; ++ ++ /* GPIO based LED powersave registers corerev >= 16 */ ++ uint32 gpiotimerval; /* 0x88 */ ++ uint32 gpiotimeroutmask; ++ ++ /* clock control */ ++ uint32 clockcontrol_n; /* 0x90 */ ++ uint32 clockcontrol_sb; /* aka m0 */ ++ uint32 clockcontrol_pci; /* aka m1 */ ++ uint32 clockcontrol_m2; /* mii/uart/mipsref */ ++ uint32 clockcontrol_m3; /* cpu */ ++ uint32 clkdiv; /* corerev >= 3 */ ++ uint32 gpiodebugsel; /* corerev >= 28 */ ++ uint32 capabilities_ext; /* 0xac */ ++ ++ /* pll delay registers (corerev >= 4) */ ++ uint32 pll_on_delay; /* 0xb0 */ ++ uint32 fref_sel_delay; ++ uint32 slow_clk_ctl; /* 5 < corerev < 10 */ ++ uint32 PAD; ++ ++ /* Instaclock registers (corerev >= 10) */ ++ uint32 system_clk_ctl; /* 0xc0 */ ++ uint32 clkstatestretch; ++ uint32 PAD[2]; ++ ++ /* Indirect backplane access (corerev >= 22) */ ++ uint32 bp_addrlow; /* 0xd0 */ ++ uint32 bp_addrhigh; ++ uint32 bp_data; ++ uint32 PAD; ++ uint32 bp_indaccess; ++ /* SPI registers, corerev >= 37 */ ++ uint32 gsioctrl; ++ uint32 gsioaddress; ++ uint32 gsiodata; ++ ++ /* More clock dividers (corerev >= 32) */ ++ uint32 clkdiv2; ++ /* FAB ID (corerev >= 40) */ ++ uint32 otpcontrol1; ++ uint32 fabid; /* 0xf8 */ ++ ++ /* In AI chips, pointer to erom */ ++ uint32 eromptr; /* 0xfc */ ++ ++ /* ExtBus control registers (corerev >= 3) */ ++ uint32 pcmcia_config; /* 0x100 */ ++ uint32 pcmcia_memwait; ++ uint32 pcmcia_attrwait; ++ uint32 pcmcia_iowait; ++ uint32 ide_config; ++ uint32 ide_memwait; ++ uint32 ide_attrwait; ++ uint32 ide_iowait; ++ uint32 prog_config; ++ uint32 prog_waitcount; ++ uint32 flash_config; ++ uint32 flash_waitcount; ++ uint32 SECI_config; /* 0x130 SECI configuration */ ++ uint32 SECI_status; ++ uint32 SECI_statusmask; ++ uint32 SECI_rxnibchanged; ++ ++ uint32 PAD[20]; ++ ++ /* SROM interface (corerev >= 32) */ ++ uint32 sromcontrol; /* 0x190 */ ++ uint32 sromaddress; ++ uint32 sromdata; ++ uint32 PAD[1]; /* 0x19C */ ++ /* NAND flash registers for BCM4706 (corerev = 31) */ ++ uint32 nflashctrl; /* 0x1a0 */ ++ uint32 nflashconf; ++ uint32 nflashcoladdr; ++ uint32 nflashrowaddr; ++ uint32 nflashdata; ++ uint32 nflashwaitcnt0; /* 0x1b4 */ ++ uint32 PAD[2]; ++ ++ uint32 seci_uart_data; /* 0x1C0 */ ++ uint32 seci_uart_bauddiv; ++ uint32 seci_uart_fcr; ++ uint32 seci_uart_lcr; ++ uint32 seci_uart_mcr; ++ uint32 seci_uart_lsr; ++ uint32 seci_uart_msr; ++ uint32 seci_uart_baudadj; ++ /* Clock control and hardware workarounds (corerev >= 20) */ ++ uint32 clk_ctl_st; /* 0x1e0 */ ++ uint32 hw_war; ++ uint32 PAD[70]; ++ ++ /* UARTs */ ++ uint8 uart0data; /* 0x300 */ ++ uint8 uart0imr; ++ uint8 uart0fcr; ++ uint8 uart0lcr; ++ uint8 uart0mcr; ++ uint8 uart0lsr; ++ uint8 uart0msr; ++ uint8 uart0scratch; ++ uint8 PAD[248]; /* corerev >= 1 */ ++ ++ uint8 uart1data; /* 0x400 */ ++ uint8 uart1imr; ++ uint8 uart1fcr; ++ uint8 uart1lcr; ++ uint8 uart1mcr; ++ uint8 uart1lsr; ++ uint8 uart1msr; ++ uint8 uart1scratch; ++ uint32 PAD[126]; ++ ++ /* PMU registers (corerev >= 20) */ ++ /* Note: all timers driven by ILP clock are updated asynchronously to HT/ALP. ++ * The CPU must read them twice, compare, and retry if different. ++ */ ++ uint32 pmucontrol; /* 0x600 */ ++ uint32 pmucapabilities; ++ uint32 pmustatus; ++ uint32 res_state; ++ uint32 res_pending; ++ uint32 pmutimer; ++ uint32 min_res_mask; ++ uint32 max_res_mask; ++ uint32 res_table_sel; ++ uint32 res_dep_mask; ++ uint32 res_updn_timer; ++ uint32 res_timer; ++ uint32 clkstretch; ++ uint32 pmuwatchdog; ++ uint32 gpiosel; /* 0x638, rev >= 1 */ ++ uint32 gpioenable; /* 0x63c, rev >= 1 */ ++ uint32 res_req_timer_sel; ++ uint32 res_req_timer; ++ uint32 res_req_mask; ++ uint32 PAD; ++ uint32 chipcontrol_addr; /* 0x650 */ ++ uint32 chipcontrol_data; /* 0x654 */ ++ uint32 regcontrol_addr; ++ uint32 regcontrol_data; ++ uint32 pllcontrol_addr; ++ uint32 pllcontrol_data; ++ uint32 pmustrapopt; /* 0x668, corerev >= 28 */ ++ uint32 pmu_xtalfreq; /* 0x66C, pmurev >= 10 */ ++ uint32 retention_ctl; /* 0x670 */ ++ uint32 PAD[3]; ++ uint32 retention_grpidx; /* 0x680 */ ++ uint32 retention_grpctl; /* 0x684 */ ++ uint32 PAD[94]; ++ uint16 sromotp[512]; /* 0x800 */ ++#ifdef NFLASH_SUPPORT ++ /* Nand flash MLC controller registers (corerev >= 38) */ ++ uint32 nand_revision; /* 0xC00 */ ++ uint32 nand_cmd_start; ++ uint32 nand_cmd_addr_x; ++ uint32 nand_cmd_addr; ++ uint32 nand_cmd_end_addr; ++ uint32 nand_cs_nand_select; ++ uint32 nand_cs_nand_xor; ++ uint32 PAD; ++ uint32 nand_spare_rd0; ++ uint32 nand_spare_rd4; ++ uint32 nand_spare_rd8; ++ uint32 nand_spare_rd12; ++ uint32 nand_spare_wr0; ++ uint32 nand_spare_wr4; ++ uint32 nand_spare_wr8; ++ uint32 nand_spare_wr12; ++ uint32 nand_acc_control; ++ uint32 PAD; ++ uint32 nand_config; ++ uint32 PAD; ++ uint32 nand_timing_1; ++ uint32 nand_timing_2; ++ uint32 nand_semaphore; ++ uint32 PAD; ++ uint32 nand_devid; ++ uint32 nand_devid_x; ++ uint32 nand_block_lock_status; ++ uint32 nand_intfc_status; ++ uint32 nand_ecc_corr_addr_x; ++ uint32 nand_ecc_corr_addr; ++ uint32 nand_ecc_unc_addr_x; ++ uint32 nand_ecc_unc_addr; ++ uint32 nand_read_error_count; ++ uint32 nand_corr_stat_threshold; ++ uint32 PAD[2]; ++ uint32 nand_read_addr_x; ++ uint32 nand_read_addr; ++ uint32 nand_page_program_addr_x; ++ uint32 nand_page_program_addr; ++ uint32 nand_copy_back_addr_x; ++ uint32 nand_copy_back_addr; ++ uint32 nand_block_erase_addr_x; ++ uint32 nand_block_erase_addr; ++ uint32 nand_inv_read_addr_x; ++ uint32 nand_inv_read_addr; ++ uint32 PAD[2]; ++ uint32 nand_blk_wr_protect; ++ uint32 PAD[3]; ++ uint32 nand_acc_control_cs1; ++ uint32 nand_config_cs1; ++ uint32 nand_timing_1_cs1; ++ uint32 nand_timing_2_cs1; ++ uint32 PAD[20]; ++ uint32 nand_spare_rd16; ++ uint32 nand_spare_rd20; ++ uint32 nand_spare_rd24; ++ uint32 nand_spare_rd28; ++ uint32 nand_cache_addr; ++ uint32 nand_cache_data; ++ uint32 nand_ctrl_config; ++ uint32 nand_ctrl_status; ++#endif /* NFLASH_SUPPORT */ ++ uint32 gci_corecaps0; /* GCI starting at 0xC00 */ ++ uint32 gci_corecaps1; ++ uint32 gci_corecaps2; ++ uint32 gci_corectrl; ++ uint32 gci_corestat; /* 0xC10 */ ++ uint32 PAD[11]; ++ uint32 gci_indirect_addr; /* 0xC40 */ ++ uint32 PAD[111]; ++ uint32 gci_chipctrl; /* 0xE00 */ ++} chipcregs_t; ++ ++#endif /* _LANGUAGE_ASSEMBLY */ ++ ++ ++#define CC_CHIPID 0 ++#define CC_CAPABILITIES 4 ++#define CC_CHIPST 0x2c ++#define CC_EROMPTR 0xfc ++ ++#define CC_OTPST 0x10 ++#define CC_JTAGCMD 0x30 ++#define CC_JTAGIR 0x34 ++#define CC_JTAGDR 0x38 ++#define CC_JTAGCTRL 0x3c ++#define CC_GPIOPU 0x58 ++#define CC_GPIOPD 0x5c ++#define CC_GPIOIN 0x60 ++#define CC_GPIOOUT 0x64 ++#define CC_GPIOOUTEN 0x68 ++#define CC_GPIOCTRL 0x6c ++#define CC_GPIOPOL 0x70 ++#define CC_GPIOINTM 0x74 ++#define CC_WATCHDOG 0x80 ++#define CC_CLKC_N 0x90 ++#define CC_CLKC_M0 0x94 ++#define CC_CLKC_M1 0x98 ++#define CC_CLKC_M2 0x9c ++#define CC_CLKC_M3 0xa0 ++#define CC_CLKDIV 0xa4 ++#define CC_SYS_CLK_CTL 0xc0 ++#define CC_CLK_CTL_ST SI_CLK_CTL_ST ++#define PMU_CTL 0x600 ++#define PMU_CAP 0x604 ++#define PMU_ST 0x608 ++#define PMU_RES_STATE 0x60c ++#define PMU_TIMER 0x614 ++#define PMU_MIN_RES_MASK 0x618 ++#define PMU_MAX_RES_MASK 0x61c ++#define CC_CHIPCTL_ADDR 0x650 ++#define CC_CHIPCTL_DATA 0x654 ++#define PMU_REG_CONTROL_ADDR 0x658 ++#define PMU_REG_CONTROL_DATA 0x65C ++#define PMU_PLL_CONTROL_ADDR 0x660 ++#define PMU_PLL_CONTROL_DATA 0x664 ++#define CC_SROM_OTP 0x800 /* SROM/OTP address space */ ++#define CC_GCI_INDIRECT_ADDR_REG 0xC40 ++#define CC_GCI_CHIP_CTRL_REG 0xE00 ++#define CC_GCI_CC_OFFSET_2 2 ++#define CC_GCI_CC_OFFSET_5 5 ++ ++#ifdef NFLASH_SUPPORT ++/* NAND flash support */ ++#define CC_NAND_REVISION 0xC00 ++#define CC_NAND_CMD_START 0xC04 ++#define CC_NAND_CMD_ADDR 0xC0C ++#define CC_NAND_SPARE_RD_0 0xC20 ++#define CC_NAND_SPARE_RD_4 0xC24 ++#define CC_NAND_SPARE_RD_8 0xC28 ++#define CC_NAND_SPARE_RD_C 0xC2C ++#define CC_NAND_CONFIG 0xC48 ++#define CC_NAND_DEVID 0xC60 ++#define CC_NAND_DEVID_EXT 0xC64 ++#define CC_NAND_INTFC_STATUS 0xC6C ++#endif /* NFLASH_SUPPORT */ ++ ++/* chipid */ ++#define CID_ID_MASK 0x0000ffff /* Chip Id mask */ ++#define CID_REV_MASK 0x000f0000 /* Chip Revision mask */ ++#define CID_REV_SHIFT 16 /* Chip Revision shift */ ++#define CID_PKG_MASK 0x00f00000 /* Package Option mask */ ++#define CID_PKG_SHIFT 20 /* Package Option shift */ ++#define CID_CC_MASK 0x0f000000 /* CoreCount (corerev >= 4) */ ++#define CID_CC_SHIFT 24 ++#define CID_TYPE_MASK 0xf0000000 /* Chip Type */ ++#define CID_TYPE_SHIFT 28 ++ ++/* capabilities */ ++#define CC_CAP_UARTS_MASK 0x00000003 /* Number of UARTs */ ++#define CC_CAP_MIPSEB 0x00000004 /* MIPS is in big-endian mode */ ++#define CC_CAP_UCLKSEL 0x00000018 /* UARTs clock select */ ++#define CC_CAP_UINTCLK 0x00000008 /* UARTs are driven by internal divided clock */ ++#define CC_CAP_UARTGPIO 0x00000020 /* UARTs own GPIOs 15:12 */ ++#define CC_CAP_EXTBUS_MASK 0x000000c0 /* External bus mask */ ++#define CC_CAP_EXTBUS_NONE 0x00000000 /* No ExtBus present */ ++#define CC_CAP_EXTBUS_FULL 0x00000040 /* ExtBus: PCMCIA, IDE & Prog */ ++#define CC_CAP_EXTBUS_PROG 0x00000080 /* ExtBus: ProgIf only */ ++#define CC_CAP_FLASH_MASK 0x00000700 /* Type of flash */ ++#define CC_CAP_PLL_MASK 0x00038000 /* Type of PLL */ ++#define CC_CAP_PWR_CTL 0x00040000 /* Power control */ ++#define CC_CAP_OTPSIZE 0x00380000 /* OTP Size (0 = none) */ ++#define CC_CAP_OTPSIZE_SHIFT 19 /* OTP Size shift */ ++#define CC_CAP_OTPSIZE_BASE 5 /* OTP Size base */ ++#define CC_CAP_JTAGP 0x00400000 /* JTAG Master Present */ ++#define CC_CAP_ROM 0x00800000 /* Internal boot rom active */ ++#define CC_CAP_BKPLN64 0x08000000 /* 64-bit backplane */ ++#define CC_CAP_PMU 0x10000000 /* PMU Present, rev >= 20 */ ++#define CC_CAP_ECI 0x20000000 /* ECI Present, rev >= 21 */ ++#define CC_CAP_SROM 0x40000000 /* Srom Present, rev >= 32 */ ++#define CC_CAP_NFLASH 0x80000000 /* Nand flash present, rev >= 35 */ ++ ++#define CC_CAP2_SECI 0x00000001 /* SECI Present, rev >= 36 */ ++#define CC_CAP2_GSIO 0x00000002 /* GSIO (spi/i2c) present, rev >= 37 */ ++ ++/* capabilities extension */ ++#define CC_CAP_EXT_SECI_PRESENT 0x00000001 /* SECI present */ ++ ++/* PLL type */ ++#define PLL_NONE 0x00000000 ++#define PLL_TYPE1 0x00010000 /* 48MHz base, 3 dividers */ ++#define PLL_TYPE2 0x00020000 /* 48MHz, 4 dividers */ ++#define PLL_TYPE3 0x00030000 /* 25MHz, 2 dividers */ ++#define PLL_TYPE4 0x00008000 /* 48MHz, 4 dividers */ ++#define PLL_TYPE5 0x00018000 /* 25MHz, 4 dividers */ ++#define PLL_TYPE6 0x00028000 /* 100/200 or 120/240 only */ ++#define PLL_TYPE7 0x00038000 /* 25MHz, 4 dividers */ ++ ++/* ILP clock */ ++#define ILP_CLOCK 32000 ++ ++/* ALP clock on pre-PMU chips */ ++#define ALP_CLOCK 20000000 ++ ++/* HT clock */ ++#define HT_CLOCK 80000000 ++ ++/* corecontrol */ ++#define CC_UARTCLKO 0x00000001 /* Drive UART with internal clock */ ++#define CC_SE 0x00000002 /* sync clk out enable (corerev >= 3) */ ++#define CC_ASYNCGPIO 0x00000004 /* 1=generate GPIO interrupt without backplane clock */ ++#define CC_UARTCLKEN 0x00000008 /* enable UART Clock (corerev > = 21 */ ++ ++/* 4321 chipcontrol */ ++#define CHIPCTRL_4321A0_DEFAULT 0x3a4 ++#define CHIPCTRL_4321A1_DEFAULT 0x0a4 ++#define CHIPCTRL_4321_PLL_DOWN 0x800000 /* serdes PLL down override */ ++ ++/* Fields in the otpstatus register in rev >= 21 */ ++#define OTPS_OL_MASK 0x000000ff ++#define OTPS_OL_MFG 0x00000001 /* manuf row is locked */ ++#define OTPS_OL_OR1 0x00000002 /* otp redundancy row 1 is locked */ ++#define OTPS_OL_OR2 0x00000004 /* otp redundancy row 2 is locked */ ++#define OTPS_OL_GU 0x00000008 /* general use region is locked */ ++#define OTPS_GUP_MASK 0x00000f00 ++#define OTPS_GUP_SHIFT 8 ++#define OTPS_GUP_HW 0x00000100 /* h/w subregion is programmed */ ++#define OTPS_GUP_SW 0x00000200 /* s/w subregion is programmed */ ++#define OTPS_GUP_CI 0x00000400 /* chipid/pkgopt subregion is programmed */ ++#define OTPS_GUP_FUSE 0x00000800 /* fuse subregion is programmed */ ++#define OTPS_READY 0x00001000 ++#define OTPS_RV(x) (1 << (16 + (x))) /* redundancy entry valid */ ++#define OTPS_RV_MASK 0x0fff0000 ++#define OTPS_PROGOK 0x40000000 ++ ++/* Fields in the otpcontrol register in rev >= 21 */ ++#define OTPC_PROGSEL 0x00000001 ++#define OTPC_PCOUNT_MASK 0x0000000e ++#define OTPC_PCOUNT_SHIFT 1 ++#define OTPC_VSEL_MASK 0x000000f0 ++#define OTPC_VSEL_SHIFT 4 ++#define OTPC_TMM_MASK 0x00000700 ++#define OTPC_TMM_SHIFT 8 ++#define OTPC_ODM 0x00000800 ++#define OTPC_PROGEN 0x80000000 ++ ++/* Fields in the 40nm otpcontrol register in rev >= 40 */ ++#define OTPC_40NM_PROGSEL_SHIFT 0 ++#define OTPC_40NM_PCOUNT_SHIFT 1 ++#define OTPC_40NM_PCOUNT_WR 0xA ++#define OTPC_40NM_PCOUNT_V1X 0xB ++#define OTPC_40NM_REGCSEL_SHIFT 5 ++#define OTPC_40NM_REGCSEL_DEF 0x4 ++#define OTPC_40NM_PROGIN_SHIFT 8 ++#define OTPC_40NM_R2X_SHIFT 10 ++#define OTPC_40NM_ODM_SHIFT 11 ++#define OTPC_40NM_DF_SHIFT 15 ++#define OTPC_40NM_VSEL_SHIFT 16 ++#define OTPC_40NM_VSEL_WR 0xA ++#define OTPC_40NM_VSEL_V1X 0xA ++#define OTPC_40NM_VSEL_R1X 0x5 ++#define OTPC_40NM_COFAIL_SHIFT 30 ++ ++#define OTPC1_CPCSEL_SHIFT 0 ++#define OTPC1_CPCSEL_DEF 6 ++#define OTPC1_TM_SHIFT 8 ++#define OTPC1_TM_WR 0x84 ++#define OTPC1_TM_V1X 0x84 ++#define OTPC1_TM_R1X 0x4 ++ ++/* Fields in otpprog in rev >= 21 and HND OTP */ ++#define OTPP_COL_MASK 0x000000ff ++#define OTPP_COL_SHIFT 0 ++#define OTPP_ROW_MASK 0x0000ff00 ++#define OTPP_ROW_SHIFT 8 ++#define OTPP_OC_MASK 0x0f000000 ++#define OTPP_OC_SHIFT 24 ++#define OTPP_READERR 0x10000000 ++#define OTPP_VALUE_MASK 0x20000000 ++#define OTPP_VALUE_SHIFT 29 ++#define OTPP_START_BUSY 0x80000000 ++#define OTPP_READ 0x40000000 /* HND OTP */ ++ ++/* Fields in otplayout register */ ++#define OTPL_HWRGN_OFF_MASK 0x00000FFF ++#define OTPL_HWRGN_OFF_SHIFT 0 ++#define OTPL_WRAP_REVID_MASK 0x00F80000 ++#define OTPL_WRAP_REVID_SHIFT 19 ++#define OTPL_WRAP_TYPE_MASK 0x00070000 ++#define OTPL_WRAP_TYPE_SHIFT 16 ++#define OTPL_WRAP_TYPE_65NM 0 ++#define OTPL_WRAP_TYPE_40NM 1 ++ ++/* otplayout reg corerev >= 36 */ ++#define OTP_CISFORMAT_NEW 0x80000000 ++ ++/* Opcodes for OTPP_OC field */ ++#define OTPPOC_READ 0 ++#define OTPPOC_BIT_PROG 1 ++#define OTPPOC_VERIFY 3 ++#define OTPPOC_INIT 4 ++#define OTPPOC_SET 5 ++#define OTPPOC_RESET 6 ++#define OTPPOC_OCST 7 ++#define OTPPOC_ROW_LOCK 8 ++#define OTPPOC_PRESCN_TEST 9 ++ ++/* Opcodes for OTPP_OC field (40NM) */ ++#define OTPPOC_READ_40NM 0 ++#define OTPPOC_PROG_ENABLE_40NM 1 ++#define OTPPOC_PROG_DISABLE_40NM 2 ++#define OTPPOC_VERIFY_40NM 3 ++#define OTPPOC_WORD_VERIFY_1_40NM 4 ++#define OTPPOC_ROW_LOCK_40NM 5 ++#define OTPPOC_STBY_40NM 6 ++#define OTPPOC_WAKEUP_40NM 7 ++#define OTPPOC_WORD_VERIFY_0_40NM 8 ++#define OTPPOC_PRESCN_TEST_40NM 9 ++#define OTPPOC_BIT_PROG_40NM 10 ++#define OTPPOC_WORDPROG_40NM 11 ++#define OTPPOC_BURNIN_40NM 12 ++#define OTPPOC_AUTORELOAD_40NM 13 ++#define OTPPOC_OVST_READ_40NM 14 ++#define OTPPOC_OVST_PROG_40NM 15 ++ ++/* Fields in otplayoutextension */ ++#define OTPLAYOUTEXT_FUSE_MASK 0x3FF ++ ++ ++/* Jtagm characteristics that appeared at a given corerev */ ++#define JTAGM_CREV_OLD 10 /* Old command set, 16bit max IR */ ++#define JTAGM_CREV_IRP 22 /* Able to do pause-ir */ ++#define JTAGM_CREV_RTI 28 /* Able to do return-to-idle */ ++ ++/* jtagcmd */ ++#define JCMD_START 0x80000000 ++#define JCMD_BUSY 0x80000000 ++#define JCMD_STATE_MASK 0x60000000 ++#define JCMD_STATE_TLR 0x00000000 /* Test-logic-reset */ ++#define JCMD_STATE_PIR 0x20000000 /* Pause IR */ ++#define JCMD_STATE_PDR 0x40000000 /* Pause DR */ ++#define JCMD_STATE_RTI 0x60000000 /* Run-test-idle */ ++#define JCMD0_ACC_MASK 0x0000f000 ++#define JCMD0_ACC_IRDR 0x00000000 ++#define JCMD0_ACC_DR 0x00001000 ++#define JCMD0_ACC_IR 0x00002000 ++#define JCMD0_ACC_RESET 0x00003000 ++#define JCMD0_ACC_IRPDR 0x00004000 ++#define JCMD0_ACC_PDR 0x00005000 ++#define JCMD0_IRW_MASK 0x00000f00 ++#define JCMD_ACC_MASK 0x000f0000 /* Changes for corerev 11 */ ++#define JCMD_ACC_IRDR 0x00000000 ++#define JCMD_ACC_DR 0x00010000 ++#define JCMD_ACC_IR 0x00020000 ++#define JCMD_ACC_RESET 0x00030000 ++#define JCMD_ACC_IRPDR 0x00040000 ++#define JCMD_ACC_PDR 0x00050000 ++#define JCMD_ACC_PIR 0x00060000 ++#define JCMD_ACC_IRDR_I 0x00070000 /* rev 28: return to run-test-idle */ ++#define JCMD_ACC_DR_I 0x00080000 /* rev 28: return to run-test-idle */ ++#define JCMD_IRW_MASK 0x00001f00 ++#define JCMD_IRW_SHIFT 8 ++#define JCMD_DRW_MASK 0x0000003f ++ ++/* jtagctrl */ ++#define JCTRL_FORCE_CLK 4 /* Force clock */ ++#define JCTRL_EXT_EN 2 /* Enable external targets */ ++#define JCTRL_EN 1 /* Enable Jtag master */ ++ ++/* Fields in clkdiv */ ++#define CLKD_SFLASH 0x0f000000 ++#define CLKD_SFLASH_SHIFT 24 ++#define CLKD_OTP 0x000f0000 ++#define CLKD_OTP_SHIFT 16 ++#define CLKD_JTAG 0x00000f00 ++#define CLKD_JTAG_SHIFT 8 ++#define CLKD_UART 0x000000ff ++ ++#define CLKD2_SROM 0x00000003 ++ ++/* intstatus/intmask */ ++#define CI_GPIO 0x00000001 /* gpio intr */ ++#define CI_EI 0x00000002 /* extif intr (corerev >= 3) */ ++#define CI_TEMP 0x00000004 /* temp. ctrl intr (corerev >= 15) */ ++#define CI_SIRQ 0x00000008 /* serial IRQ intr (corerev >= 15) */ ++#define CI_ECI 0x00000010 /* eci intr (corerev >= 21) */ ++#define CI_PMU 0x00000020 /* pmu intr (corerev >= 21) */ ++#define CI_UART 0x00000040 /* uart intr (corerev >= 21) */ ++#define CI_WDRESET 0x80000000 /* watchdog reset occurred */ ++ ++/* slow_clk_ctl */ ++#define SCC_SS_MASK 0x00000007 /* slow clock source mask */ ++#define SCC_SS_LPO 0x00000000 /* source of slow clock is LPO */ ++#define SCC_SS_XTAL 0x00000001 /* source of slow clock is crystal */ ++#define SCC_SS_PCI 0x00000002 /* source of slow clock is PCI */ ++#define SCC_LF 0x00000200 /* LPOFreqSel, 1: 160Khz, 0: 32KHz */ ++#define SCC_LP 0x00000400 /* LPOPowerDown, 1: LPO is disabled, ++ * 0: LPO is enabled ++ */ ++#define SCC_FS 0x00000800 /* ForceSlowClk, 1: sb/cores running on slow clock, ++ * 0: power logic control ++ */ ++#define SCC_IP 0x00001000 /* IgnorePllOffReq, 1/0: power logic ignores/honors ++ * PLL clock disable requests from core ++ */ ++#define SCC_XC 0x00002000 /* XtalControlEn, 1/0: power logic does/doesn't ++ * disable crystal when appropriate ++ */ ++#define SCC_XP 0x00004000 /* XtalPU (RO), 1/0: crystal running/disabled */ ++#define SCC_CD_MASK 0xffff0000 /* ClockDivider (SlowClk = 1/(4+divisor)) */ ++#define SCC_CD_SHIFT 16 ++ ++/* system_clk_ctl */ ++#define SYCC_IE 0x00000001 /* ILPen: Enable Idle Low Power */ ++#define SYCC_AE 0x00000002 /* ALPen: Enable Active Low Power */ ++#define SYCC_FP 0x00000004 /* ForcePLLOn */ ++#define SYCC_AR 0x00000008 /* Force ALP (or HT if ALPen is not set */ ++#define SYCC_HR 0x00000010 /* Force HT */ ++#define SYCC_CD_MASK 0xffff0000 /* ClkDiv (ILP = 1/(4 * (divisor + 1)) */ ++#define SYCC_CD_SHIFT 16 ++ ++/* Indirect backplane access */ ++#define BPIA_BYTEEN 0x0000000f ++#define BPIA_SZ1 0x00000001 ++#define BPIA_SZ2 0x00000003 ++#define BPIA_SZ4 0x00000007 ++#define BPIA_SZ8 0x0000000f ++#define BPIA_WRITE 0x00000100 ++#define BPIA_START 0x00000200 ++#define BPIA_BUSY 0x00000200 ++#define BPIA_ERROR 0x00000400 ++ ++/* pcmcia/prog/flash_config */ ++#define CF_EN 0x00000001 /* enable */ ++#define CF_EM_MASK 0x0000000e /* mode */ ++#define CF_EM_SHIFT 1 ++#define CF_EM_FLASH 0 /* flash/asynchronous mode */ ++#define CF_EM_SYNC 2 /* synchronous mode */ ++#define CF_EM_PCMCIA 4 /* pcmcia mode */ ++#define CF_DS 0x00000010 /* destsize: 0=8bit, 1=16bit */ ++#define CF_BS 0x00000020 /* byteswap */ ++#define CF_CD_MASK 0x000000c0 /* clock divider */ ++#define CF_CD_SHIFT 6 ++#define CF_CD_DIV2 0x00000000 /* backplane/2 */ ++#define CF_CD_DIV3 0x00000040 /* backplane/3 */ ++#define CF_CD_DIV4 0x00000080 /* backplane/4 */ ++#define CF_CE 0x00000100 /* clock enable */ ++#define CF_SB 0x00000200 /* size/bytestrobe (synch only) */ ++ ++/* pcmcia_memwait */ ++#define PM_W0_MASK 0x0000003f /* waitcount0 */ ++#define PM_W1_MASK 0x00001f00 /* waitcount1 */ ++#define PM_W1_SHIFT 8 ++#define PM_W2_MASK 0x001f0000 /* waitcount2 */ ++#define PM_W2_SHIFT 16 ++#define PM_W3_MASK 0x1f000000 /* waitcount3 */ ++#define PM_W3_SHIFT 24 ++ ++/* pcmcia_attrwait */ ++#define PA_W0_MASK 0x0000003f /* waitcount0 */ ++#define PA_W1_MASK 0x00001f00 /* waitcount1 */ ++#define PA_W1_SHIFT 8 ++#define PA_W2_MASK 0x001f0000 /* waitcount2 */ ++#define PA_W2_SHIFT 16 ++#define PA_W3_MASK 0x1f000000 /* waitcount3 */ ++#define PA_W3_SHIFT 24 ++ ++/* pcmcia_iowait */ ++#define PI_W0_MASK 0x0000003f /* waitcount0 */ ++#define PI_W1_MASK 0x00001f00 /* waitcount1 */ ++#define PI_W1_SHIFT 8 ++#define PI_W2_MASK 0x001f0000 /* waitcount2 */ ++#define PI_W2_SHIFT 16 ++#define PI_W3_MASK 0x1f000000 /* waitcount3 */ ++#define PI_W3_SHIFT 24 ++ ++/* prog_waitcount */ ++#define PW_W0_MASK 0x0000001f /* waitcount0 */ ++#define PW_W1_MASK 0x00001f00 /* waitcount1 */ ++#define PW_W1_SHIFT 8 ++#define PW_W2_MASK 0x001f0000 /* waitcount2 */ ++#define PW_W2_SHIFT 16 ++#define PW_W3_MASK 0x1f000000 /* waitcount3 */ ++#define PW_W3_SHIFT 24 ++ ++#define PW_W0 0x0000000c ++#define PW_W1 0x00000a00 ++#define PW_W2 0x00020000 ++#define PW_W3 0x01000000 ++ ++/* flash_waitcount */ ++#define FW_W0_MASK 0x0000003f /* waitcount0 */ ++#define FW_W1_MASK 0x00001f00 /* waitcount1 */ ++#define FW_W1_SHIFT 8 ++#define FW_W2_MASK 0x001f0000 /* waitcount2 */ ++#define FW_W2_SHIFT 16 ++#define FW_W3_MASK 0x1f000000 /* waitcount3 */ ++#define FW_W3_SHIFT 24 ++ ++/* When Srom support present, fields in sromcontrol */ ++#define SRC_START 0x80000000 ++#define SRC_BUSY 0x80000000 ++#define SRC_OPCODE 0x60000000 ++#define SRC_OP_READ 0x00000000 ++#define SRC_OP_WRITE 0x20000000 ++#define SRC_OP_WRDIS 0x40000000 ++#define SRC_OP_WREN 0x60000000 ++#define SRC_OTPSEL 0x00000010 ++#define SRC_LOCK 0x00000008 ++#define SRC_SIZE_MASK 0x00000006 ++#define SRC_SIZE_1K 0x00000000 ++#define SRC_SIZE_4K 0x00000002 ++#define SRC_SIZE_16K 0x00000004 ++#define SRC_SIZE_SHIFT 1 ++#define SRC_PRESENT 0x00000001 ++ ++/* Fields in pmucontrol */ ++#define PCTL_ILP_DIV_MASK 0xffff0000 ++#define PCTL_ILP_DIV_SHIFT 16 ++#define PCTL_PLL_PLLCTL_UPD 0x00000400 /* rev 2 */ ++#define PCTL_NOILP_ON_WAIT 0x00000200 /* rev 1 */ ++#define PCTL_HT_REQ_EN 0x00000100 ++#define PCTL_ALP_REQ_EN 0x00000080 ++#define PCTL_XTALFREQ_MASK 0x0000007c ++#define PCTL_XTALFREQ_SHIFT 2 ++#define PCTL_ILP_DIV_EN 0x00000002 ++#define PCTL_LPO_SEL 0x00000001 ++ ++/* Fields in clkstretch */ ++#define CSTRETCH_HT 0xffff0000 ++#define CSTRETCH_ALP 0x0000ffff ++ ++/* gpiotimerval */ ++#define GPIO_ONTIME_SHIFT 16 ++ ++/* clockcontrol_n */ ++#define CN_N1_MASK 0x3f /* n1 control */ ++#define CN_N2_MASK 0x3f00 /* n2 control */ ++#define CN_N2_SHIFT 8 ++#define CN_PLLC_MASK 0xf0000 /* pll control */ ++#define CN_PLLC_SHIFT 16 ++ ++/* clockcontrol_sb/pci/uart */ ++#define CC_M1_MASK 0x3f /* m1 control */ ++#define CC_M2_MASK 0x3f00 /* m2 control */ ++#define CC_M2_SHIFT 8 ++#define CC_M3_MASK 0x3f0000 /* m3 control */ ++#define CC_M3_SHIFT 16 ++#define CC_MC_MASK 0x1f000000 /* mux control */ ++#define CC_MC_SHIFT 24 ++ ++/* N3M Clock control magic field values */ ++#define CC_F6_2 0x02 /* A factor of 2 in */ ++#define CC_F6_3 0x03 /* 6-bit fields like */ ++#define CC_F6_4 0x05 /* N1, M1 or M3 */ ++#define CC_F6_5 0x09 ++#define CC_F6_6 0x11 ++#define CC_F6_7 0x21 ++ ++#define CC_F5_BIAS 5 /* 5-bit fields get this added */ ++ ++#define CC_MC_BYPASS 0x08 ++#define CC_MC_M1 0x04 ++#define CC_MC_M1M2 0x02 ++#define CC_MC_M1M2M3 0x01 ++#define CC_MC_M1M3 0x11 ++ ++/* Type 2 Clock control magic field values */ ++#define CC_T2_BIAS 2 /* n1, n2, m1 & m3 bias */ ++#define CC_T2M2_BIAS 3 /* m2 bias */ ++ ++#define CC_T2MC_M1BYP 1 ++#define CC_T2MC_M2BYP 2 ++#define CC_T2MC_M3BYP 4 ++ ++/* Type 6 Clock control magic field values */ ++#define CC_T6_MMASK 1 /* bits of interest in m */ ++#define CC_T6_M0 120000000 /* sb clock for m = 0 */ ++#define CC_T6_M1 100000000 /* sb clock for m = 1 */ ++#define SB2MIPS_T6(sb) (2 * (sb)) ++ ++/* Common clock base */ ++#define CC_CLOCK_BASE1 24000000 /* Half the clock freq */ ++#define CC_CLOCK_BASE2 12500000 /* Alternate crystal on some PLLs */ ++ ++/* Clock control values for 200MHz in 5350 */ ++#define CLKC_5350_N 0x0311 ++#define CLKC_5350_M 0x04020009 ++ ++/* Flash types in the chipcommon capabilities register */ ++#define FLASH_NONE 0x000 /* No flash */ ++#define SFLASH_ST 0x100 /* ST serial flash */ ++#define SFLASH_AT 0x200 /* Atmel serial flash */ ++#define NFLASH 0x300 ++#define PFLASH 0x700 /* Parallel flash */ ++ ++/* Bits in the ExtBus config registers */ ++#define CC_CFG_EN 0x0001 /* Enable */ ++#define CC_CFG_EM_MASK 0x000e /* Extif Mode */ ++#define CC_CFG_EM_ASYNC 0x0000 /* Async/Parallel flash */ ++#define CC_CFG_EM_SYNC 0x0002 /* Synchronous */ ++#define CC_CFG_EM_PCMCIA 0x0004 /* PCMCIA */ ++#define CC_CFG_EM_IDE 0x0006 /* IDE */ ++#define CC_CFG_DS 0x0010 /* Data size, 0=8bit, 1=16bit */ ++#define CC_CFG_CD_MASK 0x00e0 /* Sync: Clock divisor, rev >= 20 */ ++#define CC_CFG_CE 0x0100 /* Sync: Clock enable, rev >= 20 */ ++#define CC_CFG_SB 0x0200 /* Sync: Size/Bytestrobe, rev >= 20 */ ++#define CC_CFG_IS 0x0400 /* Extif Sync Clk Select, rev >= 20 */ ++ ++/* ExtBus address space */ ++#define CC_EB_BASE 0x1a000000 /* Chipc ExtBus base address */ ++#define CC_EB_PCMCIA_MEM 0x1a000000 /* PCMCIA 0 memory base address */ ++#define CC_EB_PCMCIA_IO 0x1a200000 /* PCMCIA 0 I/O base address */ ++#define CC_EB_PCMCIA_CFG 0x1a400000 /* PCMCIA 0 config base address */ ++#define CC_EB_IDE 0x1a800000 /* IDE memory base */ ++#define CC_EB_PCMCIA1_MEM 0x1a800000 /* PCMCIA 1 memory base address */ ++#define CC_EB_PCMCIA1_IO 0x1aa00000 /* PCMCIA 1 I/O base address */ ++#define CC_EB_PCMCIA1_CFG 0x1ac00000 /* PCMCIA 1 config base address */ ++#define CC_EB_PROGIF 0x1b000000 /* ProgIF Async/Sync base address */ ++ ++ ++/* Start/busy bit in flashcontrol */ ++#define SFLASH_OPCODE 0x000000ff ++#define SFLASH_ACTION 0x00000700 ++#define SFLASH_CS_ACTIVE 0x00001000 /* Chip Select Active, rev >= 20 */ ++#define SFLASH_START 0x80000000 ++#define SFLASH_BUSY SFLASH_START ++ ++/* flashcontrol action codes */ ++#define SFLASH_ACT_OPONLY 0x0000 /* Issue opcode only */ ++#define SFLASH_ACT_OP1D 0x0100 /* opcode + 1 data byte */ ++#define SFLASH_ACT_OP3A 0x0200 /* opcode + 3 addr bytes */ ++#define SFLASH_ACT_OP3A1D 0x0300 /* opcode + 3 addr & 1 data bytes */ ++#define SFLASH_ACT_OP3A4D 0x0400 /* opcode + 3 addr & 4 data bytes */ ++#define SFLASH_ACT_OP3A4X4D 0x0500 /* opcode + 3 addr, 4 don't care & 4 data bytes */ ++#define SFLASH_ACT_OP3A1X4D 0x0700 /* opcode + 3 addr, 1 don't care & 4 data bytes */ ++ ++/* flashcontrol action+opcodes for ST flashes */ ++#define SFLASH_ST_WREN 0x0006 /* Write Enable */ ++#define SFLASH_ST_WRDIS 0x0004 /* Write Disable */ ++#define SFLASH_ST_RDSR 0x0105 /* Read Status Register */ ++#define SFLASH_ST_WRSR 0x0101 /* Write Status Register */ ++#define SFLASH_ST_READ 0x0303 /* Read Data Bytes */ ++#define SFLASH_ST_PP 0x0302 /* Page Program */ ++#define SFLASH_ST_SE 0x02d8 /* Sector Erase */ ++#define SFLASH_ST_BE 0x00c7 /* Bulk Erase */ ++#define SFLASH_ST_DP 0x00b9 /* Deep Power-down */ ++#define SFLASH_ST_RES 0x03ab /* Read Electronic Signature */ ++#define SFLASH_ST_CSA 0x1000 /* Keep chip select asserted */ ++#define SFLASH_ST_SSE 0x0220 /* Sub-sector Erase */ ++ ++#define SFLASH_MXIC_RDID 0x0390 /* Read Manufacture ID */ ++#define SFLASH_MXIC_MFID 0xc2 /* MXIC Manufacture ID */ ++ ++/* Status register bits for ST flashes */ ++#define SFLASH_ST_WIP 0x01 /* Write In Progress */ ++#define SFLASH_ST_WEL 0x02 /* Write Enable Latch */ ++#define SFLASH_ST_BP_MASK 0x1c /* Block Protect */ ++#define SFLASH_ST_BP_SHIFT 2 ++#define SFLASH_ST_SRWD 0x80 /* Status Register Write Disable */ ++ ++/* flashcontrol action+opcodes for Atmel flashes */ ++#define SFLASH_AT_READ 0x07e8 ++#define SFLASH_AT_PAGE_READ 0x07d2 ++#define SFLASH_AT_BUF1_READ ++#define SFLASH_AT_BUF2_READ ++#define SFLASH_AT_STATUS 0x01d7 ++#define SFLASH_AT_BUF1_WRITE 0x0384 ++#define SFLASH_AT_BUF2_WRITE 0x0387 ++#define SFLASH_AT_BUF1_ERASE_PROGRAM 0x0283 ++#define SFLASH_AT_BUF2_ERASE_PROGRAM 0x0286 ++#define SFLASH_AT_BUF1_PROGRAM 0x0288 ++#define SFLASH_AT_BUF2_PROGRAM 0x0289 ++#define SFLASH_AT_PAGE_ERASE 0x0281 ++#define SFLASH_AT_BLOCK_ERASE 0x0250 ++#define SFLASH_AT_BUF1_WRITE_ERASE_PROGRAM 0x0382 ++#define SFLASH_AT_BUF2_WRITE_ERASE_PROGRAM 0x0385 ++#define SFLASH_AT_BUF1_LOAD 0x0253 ++#define SFLASH_AT_BUF2_LOAD 0x0255 ++#define SFLASH_AT_BUF1_COMPARE 0x0260 ++#define SFLASH_AT_BUF2_COMPARE 0x0261 ++#define SFLASH_AT_BUF1_REPROGRAM 0x0258 ++#define SFLASH_AT_BUF2_REPROGRAM 0x0259 ++ ++/* Status register bits for Atmel flashes */ ++#define SFLASH_AT_READY 0x80 ++#define SFLASH_AT_MISMATCH 0x40 ++#define SFLASH_AT_ID_MASK 0x38 ++#define SFLASH_AT_ID_SHIFT 3 ++ ++/* SPI register bits, corerev >= 37 */ ++#define GSIO_START 0x80000000 ++#define GSIO_BUSY GSIO_START ++ ++/* ++ * These are the UART port assignments, expressed as offsets from the base ++ * register. These assignments should hold for any serial port based on ++ * a 8250, 16450, or 16550(A). ++ */ ++ ++#define UART_RX 0 /* In: Receive buffer (DLAB=0) */ ++#define UART_TX 0 /* Out: Transmit buffer (DLAB=0) */ ++#define UART_DLL 0 /* Out: Divisor Latch Low (DLAB=1) */ ++#define UART_IER 1 /* In/Out: Interrupt Enable Register (DLAB=0) */ ++#define UART_DLM 1 /* Out: Divisor Latch High (DLAB=1) */ ++#define UART_IIR 2 /* In: Interrupt Identity Register */ ++#define UART_FCR 2 /* Out: FIFO Control Register */ ++#define UART_LCR 3 /* Out: Line Control Register */ ++#define UART_MCR 4 /* Out: Modem Control Register */ ++#define UART_LSR 5 /* In: Line Status Register */ ++#define UART_MSR 6 /* In: Modem Status Register */ ++#define UART_SCR 7 /* I/O: Scratch Register */ ++#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */ ++#define UART_LCR_WLEN8 0x03 /* Word length: 8 bits */ ++#define UART_MCR_OUT2 0x08 /* MCR GPIO out 2 */ ++#define UART_MCR_LOOP 0x10 /* Enable loopback test mode */ ++#define UART_LSR_RX_FIFO 0x80 /* Receive FIFO error */ ++#define UART_LSR_TDHR 0x40 /* Data-hold-register empty */ ++#define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */ ++#define UART_LSR_BREAK 0x10 /* Break interrupt */ ++#define UART_LSR_FRAMING 0x08 /* Framing error */ ++#define UART_LSR_PARITY 0x04 /* Parity error */ ++#define UART_LSR_OVERRUN 0x02 /* Overrun error */ ++#define UART_LSR_RXRDY 0x01 /* Receiver ready */ ++#define UART_FCR_FIFO_ENABLE 1 /* FIFO control register bit controlling FIFO enable/disable */ ++ ++/* Interrupt Identity Register (IIR) bits */ ++#define UART_IIR_FIFO_MASK 0xc0 /* IIR FIFO disable/enabled mask */ ++#define UART_IIR_INT_MASK 0xf /* IIR interrupt ID source */ ++#define UART_IIR_MDM_CHG 0x0 /* Modem status changed */ ++#define UART_IIR_NOINT 0x1 /* No interrupt pending */ ++#define UART_IIR_THRE 0x2 /* THR empty */ ++#define UART_IIR_RCVD_DATA 0x4 /* Received data available */ ++#define UART_IIR_RCVR_STATUS 0x6 /* Receiver status */ ++#define UART_IIR_CHAR_TIME 0xc /* Character time */ ++ ++/* Interrupt Enable Register (IER) bits */ ++#define UART_IER_EDSSI 8 /* enable modem status interrupt */ ++#define UART_IER_ELSI 4 /* enable receiver line status interrupt */ ++#define UART_IER_ETBEI 2 /* enable transmitter holding register empty interrupt */ ++#define UART_IER_ERBFI 1 /* enable data available interrupt */ ++ ++/* pmustatus */ ++#define PST_EXTLPOAVAIL 0x0100 ++#define PST_WDRESET 0x0080 ++#define PST_INTPEND 0x0040 ++#define PST_SBCLKST 0x0030 ++#define PST_SBCLKST_ILP 0x0010 ++#define PST_SBCLKST_ALP 0x0020 ++#define PST_SBCLKST_HT 0x0030 ++#define PST_ALPAVAIL 0x0008 ++#define PST_HTAVAIL 0x0004 ++#define PST_RESINIT 0x0003 ++ ++/* pmucapabilities */ ++#define PCAP_REV_MASK 0x000000ff ++#define PCAP_RC_MASK 0x00001f00 ++#define PCAP_RC_SHIFT 8 ++#define PCAP_TC_MASK 0x0001e000 ++#define PCAP_TC_SHIFT 13 ++#define PCAP_PC_MASK 0x001e0000 ++#define PCAP_PC_SHIFT 17 ++#define PCAP_VC_MASK 0x01e00000 ++#define PCAP_VC_SHIFT 21 ++#define PCAP_CC_MASK 0x1e000000 ++#define PCAP_CC_SHIFT 25 ++#define PCAP5_PC_MASK 0x003e0000 /* PMU corerev >= 5 */ ++#define PCAP5_PC_SHIFT 17 ++#define PCAP5_VC_MASK 0x07c00000 ++#define PCAP5_VC_SHIFT 22 ++#define PCAP5_CC_MASK 0xf8000000 ++#define PCAP5_CC_SHIFT 27 ++ ++/* PMU Resource Request Timer registers */ ++/* This is based on PmuRev0 */ ++#define PRRT_TIME_MASK 0x03ff ++#define PRRT_INTEN 0x0400 ++#define PRRT_REQ_ACTIVE 0x0800 ++#define PRRT_ALP_REQ 0x1000 ++#define PRRT_HT_REQ 0x2000 ++#define PRRT_HQ_REQ 0x4000 ++ ++/* PMU resource bit position */ ++#define PMURES_BIT(bit) (1 << (bit)) ++ ++/* PMU resource number limit */ ++#define PMURES_MAX_RESNUM 30 ++ ++/* PMU chip control0 register */ ++#define PMU_CHIPCTL0 0 ++ ++/* clock req types */ ++#define PMU_CC1_CLKREQ_TYPE_SHIFT 19 ++#define PMU_CC1_CLKREQ_TYPE_MASK (1 << PMU_CC1_CLKREQ_TYPE_SHIFT) ++ ++#define CLKREQ_TYPE_CONFIG_OPENDRAIN 0 ++#define CLKREQ_TYPE_CONFIG_PUSHPULL 1 ++ ++/* PMU chip control1 register */ ++#define PMU_CHIPCTL1 1 ++#define PMU_CC1_RXC_DLL_BYPASS 0x00010000 ++ ++#define PMU_CC1_IF_TYPE_MASK 0x00000030 ++#define PMU_CC1_IF_TYPE_RMII 0x00000000 ++#define PMU_CC1_IF_TYPE_MII 0x00000010 ++#define PMU_CC1_IF_TYPE_RGMII 0x00000020 ++ ++#define PMU_CC1_SW_TYPE_MASK 0x000000c0 ++#define PMU_CC1_SW_TYPE_EPHY 0x00000000 ++#define PMU_CC1_SW_TYPE_EPHYMII 0x00000040 ++#define PMU_CC1_SW_TYPE_EPHYRMII 0x00000080 ++#define PMU_CC1_SW_TYPE_RGMII 0x000000c0 ++ ++/* PMU chip control2 register */ ++#define PMU_CHIPCTL2 2 ++ ++/* PMU chip control3 register */ ++#define PMU_CHIPCTL3 3 ++ ++#define PMU_CC3_ENABLE_SDIO_WAKEUP_SHIFT 19 ++#define PMU_CC3_ENABLE_RF_SHIFT 22 ++#define PMU_CC3_RF_DISABLE_IVALUE_SHIFT 23 ++ ++ ++/* PMU corerev and chip specific PLL controls. ++ * PMU_PLL_XX where is PMU corerev and is an arbitrary number ++ * to differentiate different PLLs controlled by the same PMU rev. ++ */ ++/* pllcontrol registers */ ++/* PDIV, div_phy, div_arm, div_adc, dith_sel, ioff, kpd_scale, lsb_sel, mash_sel, lf_c & lf_r */ ++#define PMU0_PLL0_PLLCTL0 0 ++#define PMU0_PLL0_PC0_PDIV_MASK 1 ++#define PMU0_PLL0_PC0_PDIV_FREQ 25000 ++#define PMU0_PLL0_PC0_DIV_ARM_MASK 0x00000038 ++#define PMU0_PLL0_PC0_DIV_ARM_SHIFT 3 ++#define PMU0_PLL0_PC0_DIV_ARM_BASE 8 ++ ++/* PC0_DIV_ARM for PLLOUT_ARM */ ++#define PMU0_PLL0_PC0_DIV_ARM_110MHZ 0 ++#define PMU0_PLL0_PC0_DIV_ARM_97_7MHZ 1 ++#define PMU0_PLL0_PC0_DIV_ARM_88MHZ 2 ++#define PMU0_PLL0_PC0_DIV_ARM_80MHZ 3 /* Default */ ++#define PMU0_PLL0_PC0_DIV_ARM_73_3MHZ 4 ++#define PMU0_PLL0_PC0_DIV_ARM_67_7MHZ 5 ++#define PMU0_PLL0_PC0_DIV_ARM_62_9MHZ 6 ++#define PMU0_PLL0_PC0_DIV_ARM_58_6MHZ 7 ++ ++/* Wildcard base, stop_mod, en_lf_tp, en_cal & lf_r2 */ ++#define PMU0_PLL0_PLLCTL1 1 ++#define PMU0_PLL0_PC1_WILD_INT_MASK 0xf0000000 ++#define PMU0_PLL0_PC1_WILD_INT_SHIFT 28 ++#define PMU0_PLL0_PC1_WILD_FRAC_MASK 0x0fffff00 ++#define PMU0_PLL0_PC1_WILD_FRAC_SHIFT 8 ++#define PMU0_PLL0_PC1_STOP_MOD 0x00000040 ++ ++/* Wildcard base, vco_calvar, vco_swc, vco_var_selref, vso_ical & vco_sel_avdd */ ++#define PMU0_PLL0_PLLCTL2 2 ++#define PMU0_PLL0_PC2_WILD_INT_MASK 0xf ++#define PMU0_PLL0_PC2_WILD_INT_SHIFT 4 ++ ++/* pllcontrol registers */ ++/* ndiv_pwrdn, pwrdn_ch, refcomp_pwrdn, dly_ch, p1div, p2div, _bypass_sdmod */ ++#define PMU1_PLL0_PLLCTL0 0 ++#define PMU1_PLL0_PC0_P1DIV_MASK 0x00f00000 ++#define PMU1_PLL0_PC0_P1DIV_SHIFT 20 ++#define PMU1_PLL0_PC0_P2DIV_MASK 0x0f000000 ++#define PMU1_PLL0_PC0_P2DIV_SHIFT 24 ++ ++/* mdiv */ ++#define PMU1_PLL0_PLLCTL1 1 ++#define PMU1_PLL0_PC1_M1DIV_MASK 0x000000ff ++#define PMU1_PLL0_PC1_M1DIV_SHIFT 0 ++#define PMU1_PLL0_PC1_M2DIV_MASK 0x0000ff00 ++#define PMU1_PLL0_PC1_M2DIV_SHIFT 8 ++#define PMU1_PLL0_PC1_M3DIV_MASK 0x00ff0000 ++#define PMU1_PLL0_PC1_M3DIV_SHIFT 16 ++#define PMU1_PLL0_PC1_M4DIV_MASK 0xff000000 ++#define PMU1_PLL0_PC1_M4DIV_SHIFT 24 ++#define PMU1_PLL0_PC1_M4DIV_BY_9 9 ++#define PMU1_PLL0_PC1_M4DIV_BY_18 0x12 ++#define PMU1_PLL0_PC1_M4DIV_BY_36 0x24 ++ ++#define DOT11MAC_880MHZ_CLK_DIVISOR_SHIFT 8 ++#define DOT11MAC_880MHZ_CLK_DIVISOR_MASK (0xFF << DOT11MAC_880MHZ_CLK_DIVISOR_SHIFT) ++#define DOT11MAC_880MHZ_CLK_DIVISOR_VAL (0xE << DOT11MAC_880MHZ_CLK_DIVISOR_SHIFT) ++ ++/* mdiv, ndiv_dither_mfb, ndiv_mode, ndiv_int */ ++#define PMU1_PLL0_PLLCTL2 2 ++#define PMU1_PLL0_PC2_M5DIV_MASK 0x000000ff ++#define PMU1_PLL0_PC2_M5DIV_SHIFT 0 ++#define PMU1_PLL0_PC2_M5DIV_BY_12 0xc ++#define PMU1_PLL0_PC2_M5DIV_BY_18 0x12 ++#define PMU1_PLL0_PC2_M5DIV_BY_36 0x24 ++#define PMU1_PLL0_PC2_M6DIV_MASK 0x0000ff00 ++#define PMU1_PLL0_PC2_M6DIV_SHIFT 8 ++#define PMU1_PLL0_PC2_M6DIV_BY_18 0x12 ++#define PMU1_PLL0_PC2_M6DIV_BY_36 0x24 ++#define PMU1_PLL0_PC2_NDIV_MODE_MASK 0x000e0000 ++#define PMU1_PLL0_PC2_NDIV_MODE_SHIFT 17 ++#define PMU1_PLL0_PC2_NDIV_MODE_MASH 1 ++#define PMU1_PLL0_PC2_NDIV_MODE_MFB 2 /* recommended for 4319 */ ++#define PMU1_PLL0_PC2_NDIV_INT_MASK 0x1ff00000 ++#define PMU1_PLL0_PC2_NDIV_INT_SHIFT 20 ++ ++/* ndiv_frac */ ++#define PMU1_PLL0_PLLCTL3 3 ++#define PMU1_PLL0_PC3_NDIV_FRAC_MASK 0x00ffffff ++#define PMU1_PLL0_PC3_NDIV_FRAC_SHIFT 0 ++ ++/* pll_ctrl */ ++#define PMU1_PLL0_PLLCTL4 4 ++ ++/* pll_ctrl, vco_rng, clkdrive_ch */ ++#define PMU1_PLL0_PLLCTL5 5 ++#define PMU1_PLL0_PC5_CLK_DRV_MASK 0xffffff00 ++#define PMU1_PLL0_PC5_CLK_DRV_SHIFT 8 ++ ++/* PMU rev 2 control words */ ++#define PMU2_PHY_PLL_PLLCTL 4 ++#define PMU2_SI_PLL_PLLCTL 10 ++ ++/* PMU rev 2 */ ++/* pllcontrol registers */ ++/* ndiv_pwrdn, pwrdn_ch, refcomp_pwrdn, dly_ch, p1div, p2div, _bypass_sdmod */ ++#define PMU2_PLL_PLLCTL0 0 ++#define PMU2_PLL_PC0_P1DIV_MASK 0x00f00000 ++#define PMU2_PLL_PC0_P1DIV_SHIFT 20 ++#define PMU2_PLL_PC0_P2DIV_MASK 0x0f000000 ++#define PMU2_PLL_PC0_P2DIV_SHIFT 24 ++ ++/* mdiv */ ++#define PMU2_PLL_PLLCTL1 1 ++#define PMU2_PLL_PC1_M1DIV_MASK 0x000000ff ++#define PMU2_PLL_PC1_M1DIV_SHIFT 0 ++#define PMU2_PLL_PC1_M2DIV_MASK 0x0000ff00 ++#define PMU2_PLL_PC1_M2DIV_SHIFT 8 ++#define PMU2_PLL_PC1_M3DIV_MASK 0x00ff0000 ++#define PMU2_PLL_PC1_M3DIV_SHIFT 16 ++#define PMU2_PLL_PC1_M4DIV_MASK 0xff000000 ++#define PMU2_PLL_PC1_M4DIV_SHIFT 24 ++ ++/* mdiv, ndiv_dither_mfb, ndiv_mode, ndiv_int */ ++#define PMU2_PLL_PLLCTL2 2 ++#define PMU2_PLL_PC2_M5DIV_MASK 0x000000ff ++#define PMU2_PLL_PC2_M5DIV_SHIFT 0 ++#define PMU2_PLL_PC2_M6DIV_MASK 0x0000ff00 ++#define PMU2_PLL_PC2_M6DIV_SHIFT 8 ++#define PMU2_PLL_PC2_NDIV_MODE_MASK 0x000e0000 ++#define PMU2_PLL_PC2_NDIV_MODE_SHIFT 17 ++#define PMU2_PLL_PC2_NDIV_INT_MASK 0x1ff00000 ++#define PMU2_PLL_PC2_NDIV_INT_SHIFT 20 ++ ++/* ndiv_frac */ ++#define PMU2_PLL_PLLCTL3 3 ++#define PMU2_PLL_PC3_NDIV_FRAC_MASK 0x00ffffff ++#define PMU2_PLL_PC3_NDIV_FRAC_SHIFT 0 ++ ++/* pll_ctrl */ ++#define PMU2_PLL_PLLCTL4 4 ++ ++/* pll_ctrl, vco_rng, clkdrive_ch */ ++#define PMU2_PLL_PLLCTL5 5 ++#define PMU2_PLL_PC5_CLKDRIVE_CH1_MASK 0x00000f00 ++#define PMU2_PLL_PC5_CLKDRIVE_CH1_SHIFT 8 ++#define PMU2_PLL_PC5_CLKDRIVE_CH2_MASK 0x0000f000 ++#define PMU2_PLL_PC5_CLKDRIVE_CH2_SHIFT 12 ++#define PMU2_PLL_PC5_CLKDRIVE_CH3_MASK 0x000f0000 ++#define PMU2_PLL_PC5_CLKDRIVE_CH3_SHIFT 16 ++#define PMU2_PLL_PC5_CLKDRIVE_CH4_MASK 0x00f00000 ++#define PMU2_PLL_PC5_CLKDRIVE_CH4_SHIFT 20 ++#define PMU2_PLL_PC5_CLKDRIVE_CH5_MASK 0x0f000000 ++#define PMU2_PLL_PC5_CLKDRIVE_CH5_SHIFT 24 ++#define PMU2_PLL_PC5_CLKDRIVE_CH6_MASK 0xf0000000 ++#define PMU2_PLL_PC5_CLKDRIVE_CH6_SHIFT 28 ++ ++/* PMU rev 5 (& 6) */ ++#define PMU5_PLL_P1P2_OFF 0 ++#define PMU5_PLL_P1_MASK 0x0f000000 ++#define PMU5_PLL_P1_SHIFT 24 ++#define PMU5_PLL_P2_MASK 0x00f00000 ++#define PMU5_PLL_P2_SHIFT 20 ++#define PMU5_PLL_M14_OFF 1 ++#define PMU5_PLL_MDIV_MASK 0x000000ff ++#define PMU5_PLL_MDIV_WIDTH 8 ++#define PMU5_PLL_NM5_OFF 2 ++#define PMU5_PLL_NDIV_MASK 0xfff00000 ++#define PMU5_PLL_NDIV_SHIFT 20 ++#define PMU5_PLL_NDIV_MODE_MASK 0x000e0000 ++#define PMU5_PLL_NDIV_MODE_SHIFT 17 ++#define PMU5_PLL_FMAB_OFF 3 ++#define PMU5_PLL_MRAT_MASK 0xf0000000 ++#define PMU5_PLL_MRAT_SHIFT 28 ++#define PMU5_PLL_ABRAT_MASK 0x08000000 ++#define PMU5_PLL_ABRAT_SHIFT 27 ++#define PMU5_PLL_FDIV_MASK 0x07ffffff ++#define PMU5_PLL_PLLCTL_OFF 4 ++#define PMU5_PLL_PCHI_OFF 5 ++#define PMU5_PLL_PCHI_MASK 0x0000003f ++ ++/* pmu XtalFreqRatio */ ++#define PMU_XTALFREQ_REG_ILPCTR_MASK 0x00001FFF ++#define PMU_XTALFREQ_REG_MEASURE_MASK 0x80000000 ++#define PMU_XTALFREQ_REG_MEASURE_SHIFT 31 ++ ++/* Divider allocation in 4716/47162/5356/5357 */ ++#define PMU5_MAINPLL_CPU 1 ++#define PMU5_MAINPLL_MEM 2 ++#define PMU5_MAINPLL_SI 3 ++ ++/* 4706 PMU */ ++#define PMU4706_MAINPLL_PLL0 0 ++#define PMU6_4706_PROCPLL_OFF 4 /* The CPU PLL */ ++#define PMU6_4706_PROC_P2DIV_MASK 0x000f0000 ++#define PMU6_4706_PROC_P2DIV_SHIFT 16 ++#define PMU6_4706_PROC_P1DIV_MASK 0x0000f000 ++#define PMU6_4706_PROC_P1DIV_SHIFT 12 ++#define PMU6_4706_PROC_NDIV_INT_MASK 0x00000ff8 ++#define PMU6_4706_PROC_NDIV_INT_SHIFT 3 ++#define PMU6_4706_PROC_NDIV_MODE_MASK 0x00000007 ++#define PMU6_4706_PROC_NDIV_MODE_SHIFT 0 ++ ++#define PMU7_PLL_PLLCTL7 7 ++#define PMU7_PLL_CTL7_M4DIV_MASK 0xff000000 ++#define PMU7_PLL_CTL7_M4DIV_SHIFT 24 ++#define PMU7_PLL_CTL7_M4DIV_BY_6 6 ++#define PMU7_PLL_CTL7_M4DIV_BY_12 0xc ++#define PMU7_PLL_CTL7_M4DIV_BY_24 0x18 ++#define PMU7_PLL_PLLCTL8 8 ++#define PMU7_PLL_CTL8_M5DIV_MASK 0x000000ff ++#define PMU7_PLL_CTL8_M5DIV_SHIFT 0 ++#define PMU7_PLL_CTL8_M5DIV_BY_8 8 ++#define PMU7_PLL_CTL8_M5DIV_BY_12 0xc ++#define PMU7_PLL_CTL8_M5DIV_BY_24 0x18 ++#define PMU7_PLL_CTL8_M6DIV_MASK 0x0000ff00 ++#define PMU7_PLL_CTL8_M6DIV_SHIFT 8 ++#define PMU7_PLL_CTL8_M6DIV_BY_12 0xc ++#define PMU7_PLL_CTL8_M6DIV_BY_24 0x18 ++#define PMU7_PLL_PLLCTL11 11 ++#define PMU7_PLL_PLLCTL11_MASK 0xffffff00 ++#define PMU7_PLL_PLLCTL11_VAL 0x22222200 ++ ++/* PMU rev 15 */ ++#define PMU15_PLL_PLLCTL0 0 ++#define PMU15_PLL_PC0_CLKSEL_MASK 0x00000003 ++#define PMU15_PLL_PC0_CLKSEL_SHIFT 0 ++#define PMU15_PLL_PC0_FREQTGT_MASK 0x003FFFFC ++#define PMU15_PLL_PC0_FREQTGT_SHIFT 2 ++#define PMU15_PLL_PC0_PRESCALE_MASK 0x00C00000 ++#define PMU15_PLL_PC0_PRESCALE_SHIFT 22 ++#define PMU15_PLL_PC0_KPCTRL_MASK 0x07000000 ++#define PMU15_PLL_PC0_KPCTRL_SHIFT 24 ++#define PMU15_PLL_PC0_FCNTCTRL_MASK 0x38000000 ++#define PMU15_PLL_PC0_FCNTCTRL_SHIFT 27 ++#define PMU15_PLL_PC0_FDCMODE_MASK 0x40000000 ++#define PMU15_PLL_PC0_FDCMODE_SHIFT 30 ++#define PMU15_PLL_PC0_CTRLBIAS_MASK 0x80000000 ++#define PMU15_PLL_PC0_CTRLBIAS_SHIFT 31 ++ ++#define PMU15_PLL_PLLCTL1 1 ++#define PMU15_PLL_PC1_BIAS_CTLM_MASK 0x00000060 ++#define PMU15_PLL_PC1_BIAS_CTLM_SHIFT 5 ++#define PMU15_PLL_PC1_BIAS_CTLM_RST_MASK 0x00000040 ++#define PMU15_PLL_PC1_BIAS_CTLM_RST_SHIFT 6 ++#define PMU15_PLL_PC1_BIAS_SS_DIVR_MASK 0x0001FF80 ++#define PMU15_PLL_PC1_BIAS_SS_DIVR_SHIFT 7 ++#define PMU15_PLL_PC1_BIAS_SS_RSTVAL_MASK 0x03FE0000 ++#define PMU15_PLL_PC1_BIAS_SS_RSTVAL_SHIFT 17 ++#define PMU15_PLL_PC1_BIAS_INTG_BW_MASK 0x0C000000 ++#define PMU15_PLL_PC1_BIAS_INTG_BW_SHIFT 26 ++#define PMU15_PLL_PC1_BIAS_INTG_BYP_MASK 0x10000000 ++#define PMU15_PLL_PC1_BIAS_INTG_BYP_SHIFT 28 ++#define PMU15_PLL_PC1_OPENLP_EN_MASK 0x40000000 ++#define PMU15_PLL_PC1_OPENLP_EN_SHIFT 30 ++ ++#define PMU15_PLL_PLLCTL2 2 ++#define PMU15_PLL_PC2_CTEN_MASK 0x00000001 ++#define PMU15_PLL_PC2_CTEN_SHIFT 0 ++ ++#define PMU15_PLL_PLLCTL3 3 ++#define PMU15_PLL_PC3_DITHER_EN_MASK 0x00000001 ++#define PMU15_PLL_PC3_DITHER_EN_SHIFT 0 ++#define PMU15_PLL_PC3_DCOCTLSP_MASK 0xFE000000 ++#define PMU15_PLL_PC3_DCOCTLSP_SHIFT 25 ++#define PMU15_PLL_PC3_DCOCTLSP_DIV2EN_MASK 0x01 ++#define PMU15_PLL_PC3_DCOCTLSP_DIV2EN_SHIFT 0 ++#define PMU15_PLL_PC3_DCOCTLSP_CH0EN_MASK 0x02 ++#define PMU15_PLL_PC3_DCOCTLSP_CH0EN_SHIFT 1 ++#define PMU15_PLL_PC3_DCOCTLSP_CH1EN_MASK 0x04 ++#define PMU15_PLL_PC3_DCOCTLSP_CH1EN_SHIFT 2 ++#define PMU15_PLL_PC3_DCOCTLSP_CH0SEL_MASK 0x18 ++#define PMU15_PLL_PC3_DCOCTLSP_CH0SEL_SHIFT 3 ++#define PMU15_PLL_PC3_DCOCTLSP_CH1SEL_MASK 0x60 ++#define PMU15_PLL_PC3_DCOCTLSP_CH1SEL_SHIFT 5 ++#define PMU15_PLL_PC3_DCOCTLSP_CHSEL_OUTP_DIV1 0 ++#define PMU15_PLL_PC3_DCOCTLSP_CHSEL_OUTP_DIV2 1 ++#define PMU15_PLL_PC3_DCOCTLSP_CHSEL_OUTP_DIV3 2 ++#define PMU15_PLL_PC3_DCOCTLSP_CHSEL_OUTP_DIV5 3 ++ ++#define PMU15_PLL_PLLCTL4 4 ++#define PMU15_PLL_PC4_FLLCLK1_DIV_MASK 0x00000007 ++#define PMU15_PLL_PC4_FLLCLK1_DIV_SHIFT 0 ++#define PMU15_PLL_PC4_FLLCLK2_DIV_MASK 0x00000038 ++#define PMU15_PLL_PC4_FLLCLK2_DIV_SHIFT 3 ++#define PMU15_PLL_PC4_FLLCLK3_DIV_MASK 0x000001C0 ++#define PMU15_PLL_PC4_FLLCLK3_DIV_SHIFT 6 ++#define PMU15_PLL_PC4_DBGMODE_MASK 0x00000E00 ++#define PMU15_PLL_PC4_DBGMODE_SHIFT 9 ++#define PMU15_PLL_PC4_FLL480_CTLSP_LK_MASK 0x00001000 ++#define PMU15_PLL_PC4_FLL480_CTLSP_LK_SHIFT 12 ++#define PMU15_PLL_PC4_FLL480_CTLSP_MASK 0x000FE000 ++#define PMU15_PLL_PC4_FLL480_CTLSP_SHIFT 13 ++#define PMU15_PLL_PC4_DINPOL_MASK 0x00100000 ++#define PMU15_PLL_PC4_DINPOL_SHIFT 20 ++#define PMU15_PLL_PC4_CLKOUT_PD_MASK 0x00200000 ++#define PMU15_PLL_PC4_CLKOUT_PD_SHIFT 21 ++#define PMU15_PLL_PC4_CLKDIV2_PD_MASK 0x00400000 ++#define PMU15_PLL_PC4_CLKDIV2_PD_SHIFT 22 ++#define PMU15_PLL_PC4_CLKDIV4_PD_MASK 0x00800000 ++#define PMU15_PLL_PC4_CLKDIV4_PD_SHIFT 23 ++#define PMU15_PLL_PC4_CLKDIV8_PD_MASK 0x01000000 ++#define PMU15_PLL_PC4_CLKDIV8_PD_SHIFT 24 ++#define PMU15_PLL_PC4_CLKDIV16_PD_MASK 0x02000000 ++#define PMU15_PLL_PC4_CLKDIV16_PD_SHIFT 25 ++#define PMU15_PLL_PC4_TEST_EN_MASK 0x04000000 ++#define PMU15_PLL_PC4_TEST_EN_SHIFT 26 ++ ++#define PMU15_PLL_PLLCTL5 5 ++#define PMU15_PLL_PC5_FREQTGT_MASK 0x000FFFFF ++#define PMU15_PLL_PC5_FREQTGT_SHIFT 0 ++#define PMU15_PLL_PC5_DCOCTLSP_MASK 0x07F00000 ++#define PMU15_PLL_PC5_DCOCTLSP_SHIFT 20 ++#define PMU15_PLL_PC5_PRESCALE_MASK 0x18000000 ++#define PMU15_PLL_PC5_PRESCALE_SHIFT 27 ++ ++#define PMU15_PLL_PLLCTL6 6 ++#define PMU15_PLL_PC6_FREQTGT_MASK 0x000FFFFF ++#define PMU15_PLL_PC6_FREQTGT_SHIFT 0 ++#define PMU15_PLL_PC6_DCOCTLSP_MASK 0x07F00000 ++#define PMU15_PLL_PC6_DCOCTLSP_SHIFT 20 ++#define PMU15_PLL_PC6_PRESCALE_MASK 0x18000000 ++#define PMU15_PLL_PC6_PRESCALE_SHIFT 27 ++ ++#define PMU15_FREQTGT_480_DEFAULT 0x19AB1 ++#define PMU15_FREQTGT_492_DEFAULT 0x1A4F5 ++#define PMU15_ARM_96MHZ 96000000 /* 96 Mhz */ ++#define PMU15_ARM_98MHZ 98400000 /* 98.4 Mhz */ ++#define PMU15_ARM_97MHZ 97000000 /* 97 Mhz */ ++ ++ ++#define PMU17_PLLCTL2_NDIVTYPE_MASK 0x00000070 ++#define PMU17_PLLCTL2_NDIVTYPE_SHIFT 4 ++ ++#define PMU17_PLLCTL2_NDIV_MODE_INT 0 ++#define PMU17_PLLCTL2_NDIV_MODE_INT1B8 1 ++#define PMU17_PLLCTL2_NDIV_MODE_MASH111 2 ++#define PMU17_PLLCTL2_NDIV_MODE_MASH111B8 3 ++ ++#define PMU17_PLLCTL0_BBPLL_PWRDWN 0 ++#define PMU17_PLLCTL0_BBPLL_DRST 3 ++#define PMU17_PLLCTL0_BBPLL_DISBL_CLK 8 ++ ++/* PLL usage in 4716/47162 */ ++#define PMU4716_MAINPLL_PLL0 12 ++ ++/* PLL usage in 5356/5357 */ ++#define PMU5356_MAINPLL_PLL0 0 ++#define PMU5357_MAINPLL_PLL0 0 ++ ++/* 4716/47162 resources */ ++#define RES4716_PROC_PLL_ON 0x00000040 ++#define RES4716_PROC_HT_AVAIL 0x00000080 ++ ++/* 4716/4717/4718 Chip specific ChipControl register bits */ ++#define CCTRL_471X_I2S_PINS_ENABLE 0x0080 /* I2S pins off by default, shared w/ pflash */ ++ ++/* 5357 Chip specific ChipControl register bits */ ++/* 2nd - 32-bit reg */ ++#define CCTRL_5357_I2S_PINS_ENABLE 0x00040000 /* I2S pins enable */ ++#define CCTRL_5357_I2CSPI_PINS_ENABLE 0x00080000 /* I2C/SPI pins enable */ ++ ++/* 5354 resources */ ++#define RES5354_EXT_SWITCHER_PWM 0 /* 0x00001 */ ++#define RES5354_BB_SWITCHER_PWM 1 /* 0x00002 */ ++#define RES5354_BB_SWITCHER_BURST 2 /* 0x00004 */ ++#define RES5354_BB_EXT_SWITCHER_BURST 3 /* 0x00008 */ ++#define RES5354_ILP_REQUEST 4 /* 0x00010 */ ++#define RES5354_RADIO_SWITCHER_PWM 5 /* 0x00020 */ ++#define RES5354_RADIO_SWITCHER_BURST 6 /* 0x00040 */ ++#define RES5354_ROM_SWITCH 7 /* 0x00080 */ ++#define RES5354_PA_REF_LDO 8 /* 0x00100 */ ++#define RES5354_RADIO_LDO 9 /* 0x00200 */ ++#define RES5354_AFE_LDO 10 /* 0x00400 */ ++#define RES5354_PLL_LDO 11 /* 0x00800 */ ++#define RES5354_BG_FILTBYP 12 /* 0x01000 */ ++#define RES5354_TX_FILTBYP 13 /* 0x02000 */ ++#define RES5354_RX_FILTBYP 14 /* 0x04000 */ ++#define RES5354_XTAL_PU 15 /* 0x08000 */ ++#define RES5354_XTAL_EN 16 /* 0x10000 */ ++#define RES5354_BB_PLL_FILTBYP 17 /* 0x20000 */ ++#define RES5354_RF_PLL_FILTBYP 18 /* 0x40000 */ ++#define RES5354_BB_PLL_PU 19 /* 0x80000 */ ++ ++/* 5357 Chip specific ChipControl register bits */ ++#define CCTRL5357_EXTPA (1<<14) /* extPA in ChipControl 1, bit 14 */ ++#define CCTRL5357_ANT_MUX_2o3 (1<<15) /* 2o3 in ChipControl 1, bit 15 */ ++#define CCTRL5357_NFLASH (1<<16) /* Nandflash in ChipControl 1, bit 16 */ ++ ++/* 43217 Chip specific ChipControl register bits */ ++#define CCTRL43217_EXTPA_C0 (1<<13) /* core0 extPA in ChipControl 1, bit 13 */ ++#define CCTRL43217_EXTPA_C1 (1<<8) /* core1 extPA in ChipControl 1, bit 8 */ ++ ++/* 4328 resources */ ++#define RES4328_EXT_SWITCHER_PWM 0 /* 0x00001 */ ++#define RES4328_BB_SWITCHER_PWM 1 /* 0x00002 */ ++#define RES4328_BB_SWITCHER_BURST 2 /* 0x00004 */ ++#define RES4328_BB_EXT_SWITCHER_BURST 3 /* 0x00008 */ ++#define RES4328_ILP_REQUEST 4 /* 0x00010 */ ++#define RES4328_RADIO_SWITCHER_PWM 5 /* 0x00020 */ ++#define RES4328_RADIO_SWITCHER_BURST 6 /* 0x00040 */ ++#define RES4328_ROM_SWITCH 7 /* 0x00080 */ ++#define RES4328_PA_REF_LDO 8 /* 0x00100 */ ++#define RES4328_RADIO_LDO 9 /* 0x00200 */ ++#define RES4328_AFE_LDO 10 /* 0x00400 */ ++#define RES4328_PLL_LDO 11 /* 0x00800 */ ++#define RES4328_BG_FILTBYP 12 /* 0x01000 */ ++#define RES4328_TX_FILTBYP 13 /* 0x02000 */ ++#define RES4328_RX_FILTBYP 14 /* 0x04000 */ ++#define RES4328_XTAL_PU 15 /* 0x08000 */ ++#define RES4328_XTAL_EN 16 /* 0x10000 */ ++#define RES4328_BB_PLL_FILTBYP 17 /* 0x20000 */ ++#define RES4328_RF_PLL_FILTBYP 18 /* 0x40000 */ ++#define RES4328_BB_PLL_PU 19 /* 0x80000 */ ++ ++/* 4325 A0/A1 resources */ ++#define RES4325_BUCK_BOOST_BURST 0 /* 0x00000001 */ ++#define RES4325_CBUCK_BURST 1 /* 0x00000002 */ ++#define RES4325_CBUCK_PWM 2 /* 0x00000004 */ ++#define RES4325_CLDO_CBUCK_BURST 3 /* 0x00000008 */ ++#define RES4325_CLDO_CBUCK_PWM 4 /* 0x00000010 */ ++#define RES4325_BUCK_BOOST_PWM 5 /* 0x00000020 */ ++#define RES4325_ILP_REQUEST 6 /* 0x00000040 */ ++#define RES4325_ABUCK_BURST 7 /* 0x00000080 */ ++#define RES4325_ABUCK_PWM 8 /* 0x00000100 */ ++#define RES4325_LNLDO1_PU 9 /* 0x00000200 */ ++#define RES4325_OTP_PU 10 /* 0x00000400 */ ++#define RES4325_LNLDO3_PU 11 /* 0x00000800 */ ++#define RES4325_LNLDO4_PU 12 /* 0x00001000 */ ++#define RES4325_XTAL_PU 13 /* 0x00002000 */ ++#define RES4325_ALP_AVAIL 14 /* 0x00004000 */ ++#define RES4325_RX_PWRSW_PU 15 /* 0x00008000 */ ++#define RES4325_TX_PWRSW_PU 16 /* 0x00010000 */ ++#define RES4325_RFPLL_PWRSW_PU 17 /* 0x00020000 */ ++#define RES4325_LOGEN_PWRSW_PU 18 /* 0x00040000 */ ++#define RES4325_AFE_PWRSW_PU 19 /* 0x00080000 */ ++#define RES4325_BBPLL_PWRSW_PU 20 /* 0x00100000 */ ++#define RES4325_HT_AVAIL 21 /* 0x00200000 */ ++ ++/* 4325 B0/C0 resources */ ++#define RES4325B0_CBUCK_LPOM 1 /* 0x00000002 */ ++#define RES4325B0_CBUCK_BURST 2 /* 0x00000004 */ ++#define RES4325B0_CBUCK_PWM 3 /* 0x00000008 */ ++#define RES4325B0_CLDO_PU 4 /* 0x00000010 */ ++ ++/* 4325 C1 resources */ ++#define RES4325C1_LNLDO2_PU 12 /* 0x00001000 */ ++ ++/* 4325 chip-specific ChipStatus register bits */ ++#define CST4325_SPROM_OTP_SEL_MASK 0x00000003 ++#define CST4325_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */ ++#define CST4325_SPROM_SEL 1 /* OTP is powered up, SPROM is present */ ++#define CST4325_OTP_SEL 2 /* OTP is powered up, no SPROM */ ++#define CST4325_OTP_PWRDN 3 /* OTP is powered down, SPROM is present */ ++#define CST4325_SDIO_USB_MODE_MASK 0x00000004 ++#define CST4325_SDIO_USB_MODE_SHIFT 2 ++#define CST4325_RCAL_VALID_MASK 0x00000008 ++#define CST4325_RCAL_VALID_SHIFT 3 ++#define CST4325_RCAL_VALUE_MASK 0x000001f0 ++#define CST4325_RCAL_VALUE_SHIFT 4 ++#define CST4325_PMUTOP_2B_MASK 0x00000200 /* 1 for 2b, 0 for to 2a */ ++#define CST4325_PMUTOP_2B_SHIFT 9 ++ ++#define RES4329_RESERVED0 0 /* 0x00000001 */ ++#define RES4329_CBUCK_LPOM 1 /* 0x00000002 */ ++#define RES4329_CBUCK_BURST 2 /* 0x00000004 */ ++#define RES4329_CBUCK_PWM 3 /* 0x00000008 */ ++#define RES4329_CLDO_PU 4 /* 0x00000010 */ ++#define RES4329_PALDO_PU 5 /* 0x00000020 */ ++#define RES4329_ILP_REQUEST 6 /* 0x00000040 */ ++#define RES4329_RESERVED7 7 /* 0x00000080 */ ++#define RES4329_RESERVED8 8 /* 0x00000100 */ ++#define RES4329_LNLDO1_PU 9 /* 0x00000200 */ ++#define RES4329_OTP_PU 10 /* 0x00000400 */ ++#define RES4329_RESERVED11 11 /* 0x00000800 */ ++#define RES4329_LNLDO2_PU 12 /* 0x00001000 */ ++#define RES4329_XTAL_PU 13 /* 0x00002000 */ ++#define RES4329_ALP_AVAIL 14 /* 0x00004000 */ ++#define RES4329_RX_PWRSW_PU 15 /* 0x00008000 */ ++#define RES4329_TX_PWRSW_PU 16 /* 0x00010000 */ ++#define RES4329_RFPLL_PWRSW_PU 17 /* 0x00020000 */ ++#define RES4329_LOGEN_PWRSW_PU 18 /* 0x00040000 */ ++#define RES4329_AFE_PWRSW_PU 19 /* 0x00080000 */ ++#define RES4329_BBPLL_PWRSW_PU 20 /* 0x00100000 */ ++#define RES4329_HT_AVAIL 21 /* 0x00200000 */ ++ ++#define CST4329_SPROM_OTP_SEL_MASK 0x00000003 ++#define CST4329_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */ ++#define CST4329_SPROM_SEL 1 /* OTP is powered up, SPROM is present */ ++#define CST4329_OTP_SEL 2 /* OTP is powered up, no SPROM */ ++#define CST4329_OTP_PWRDN 3 /* OTP is powered down, SPROM is present */ ++#define CST4329_SPI_SDIO_MODE_MASK 0x00000004 ++#define CST4329_SPI_SDIO_MODE_SHIFT 2 ++ ++/* 4312 chip-specific ChipStatus register bits */ ++#define CST4312_SPROM_OTP_SEL_MASK 0x00000003 ++#define CST4312_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */ ++#define CST4312_SPROM_SEL 1 /* OTP is powered up, SPROM is present */ ++#define CST4312_OTP_SEL 2 /* OTP is powered up, no SPROM */ ++#define CST4312_OTP_BAD 3 /* OTP is broken, SPROM is present */ ++ ++/* 4312 resources (all PMU chips with little memory constraint) */ ++#define RES4312_SWITCHER_BURST 0 /* 0x00000001 */ ++#define RES4312_SWITCHER_PWM 1 /* 0x00000002 */ ++#define RES4312_PA_REF_LDO 2 /* 0x00000004 */ ++#define RES4312_CORE_LDO_BURST 3 /* 0x00000008 */ ++#define RES4312_CORE_LDO_PWM 4 /* 0x00000010 */ ++#define RES4312_RADIO_LDO 5 /* 0x00000020 */ ++#define RES4312_ILP_REQUEST 6 /* 0x00000040 */ ++#define RES4312_BG_FILTBYP 7 /* 0x00000080 */ ++#define RES4312_TX_FILTBYP 8 /* 0x00000100 */ ++#define RES4312_RX_FILTBYP 9 /* 0x00000200 */ ++#define RES4312_XTAL_PU 10 /* 0x00000400 */ ++#define RES4312_ALP_AVAIL 11 /* 0x00000800 */ ++#define RES4312_BB_PLL_FILTBYP 12 /* 0x00001000 */ ++#define RES4312_RF_PLL_FILTBYP 13 /* 0x00002000 */ ++#define RES4312_HT_AVAIL 14 /* 0x00004000 */ ++ ++/* 4322 resources */ ++#define RES4322_RF_LDO 0 ++#define RES4322_ILP_REQUEST 1 ++#define RES4322_XTAL_PU 2 ++#define RES4322_ALP_AVAIL 3 ++#define RES4322_SI_PLL_ON 4 ++#define RES4322_HT_SI_AVAIL 5 ++#define RES4322_PHY_PLL_ON 6 ++#define RES4322_HT_PHY_AVAIL 7 ++#define RES4322_OTP_PU 8 ++ ++/* 4322 chip-specific ChipStatus register bits */ ++#define CST4322_XTAL_FREQ_20_40MHZ 0x00000020 ++#define CST4322_SPROM_OTP_SEL_MASK 0x000000c0 ++#define CST4322_SPROM_OTP_SEL_SHIFT 6 ++#define CST4322_NO_SPROM_OTP 0 /* no OTP, no SPROM */ ++#define CST4322_SPROM_PRESENT 1 /* SPROM is present */ ++#define CST4322_OTP_PRESENT 2 /* OTP is present */ ++#define CST4322_PCI_OR_USB 0x00000100 ++#define CST4322_BOOT_MASK 0x00000600 ++#define CST4322_BOOT_SHIFT 9 ++#define CST4322_BOOT_FROM_SRAM 0 /* boot from SRAM, ARM in reset */ ++#define CST4322_BOOT_FROM_ROM 1 /* boot from ROM */ ++#define CST4322_BOOT_FROM_FLASH 2 /* boot from FLASH */ ++#define CST4322_BOOT_FROM_INVALID 3 ++#define CST4322_ILP_DIV_EN 0x00000800 ++#define CST4322_FLASH_TYPE_MASK 0x00001000 ++#define CST4322_FLASH_TYPE_SHIFT 12 ++#define CST4322_FLASH_TYPE_SHIFT_ST 0 /* ST serial FLASH */ ++#define CST4322_FLASH_TYPE_SHIFT_ATMEL 1 /* ATMEL flash */ ++#define CST4322_ARM_TAP_SEL 0x00002000 ++#define CST4322_RES_INIT_MODE_MASK 0x0000c000 ++#define CST4322_RES_INIT_MODE_SHIFT 14 ++#define CST4322_RES_INIT_MODE_ILPAVAIL 0 /* resinitmode: ILP available */ ++#define CST4322_RES_INIT_MODE_ILPREQ 1 /* resinitmode: ILP request */ ++#define CST4322_RES_INIT_MODE_ALPAVAIL 2 /* resinitmode: ALP available */ ++#define CST4322_RES_INIT_MODE_HTAVAIL 3 /* resinitmode: HT available */ ++#define CST4322_PCIPLLCLK_GATING 0x00010000 ++#define CST4322_CLK_SWITCH_PCI_TO_ALP 0x00020000 ++#define CST4322_PCI_CARDBUS_MODE 0x00040000 ++ ++/* 43224 chip-specific ChipControl register bits */ ++#define CCTRL43224_GPIO_TOGGLE 0x8000 /* gpio[3:0] pins as btcoex or s/w gpio */ ++#define CCTRL_43224A0_12MA_LED_DRIVE 0x00F000F0 /* 12 mA drive strength */ ++#define CCTRL_43224B0_12MA_LED_DRIVE 0xF0 /* 12 mA drive strength for later 43224s */ ++ ++/* 43236 resources */ ++#define RES43236_REGULATOR 0 ++#define RES43236_ILP_REQUEST 1 ++#define RES43236_XTAL_PU 2 ++#define RES43236_ALP_AVAIL 3 ++#define RES43236_SI_PLL_ON 4 ++#define RES43236_HT_SI_AVAIL 5 ++ ++/* 43236 chip-specific ChipControl register bits */ ++#define CCTRL43236_BT_COEXIST (1<<0) /* 0 disable */ ++#define CCTRL43236_SECI (1<<1) /* 0 SECI is disabled (JATG functional) */ ++#define CCTRL43236_EXT_LNA (1<<2) /* 0 disable */ ++#define CCTRL43236_ANT_MUX_2o3 (1<<3) /* 2o3 mux, chipcontrol bit 3 */ ++#define CCTRL43236_GSIO (1<<4) /* 0 disable */ ++ ++/* 43236 Chip specific ChipStatus register bits */ ++#define CST43236_SFLASH_MASK 0x00000040 ++#define CST43236_OTP_SEL_MASK 0x00000080 ++#define CST43236_OTP_SEL_SHIFT 7 ++#define CST43236_HSIC_MASK 0x00000100 /* USB/HSIC */ ++#define CST43236_BP_CLK 0x00000200 /* 120/96Mbps */ ++#define CST43236_BOOT_MASK 0x00001800 ++#define CST43236_BOOT_SHIFT 11 ++#define CST43236_BOOT_FROM_SRAM 0 /* boot from SRAM, ARM in reset */ ++#define CST43236_BOOT_FROM_ROM 1 /* boot from ROM */ ++#define CST43236_BOOT_FROM_FLASH 2 /* boot from FLASH */ ++#define CST43236_BOOT_FROM_INVALID 3 ++ ++/* 43237 resources */ ++#define RES43237_REGULATOR 0 ++#define RES43237_ILP_REQUEST 1 ++#define RES43237_XTAL_PU 2 ++#define RES43237_ALP_AVAIL 3 ++#define RES43237_SI_PLL_ON 4 ++#define RES43237_HT_SI_AVAIL 5 ++ ++/* 43237 chip-specific ChipControl register bits */ ++#define CCTRL43237_BT_COEXIST (1<<0) /* 0 disable */ ++#define CCTRL43237_SECI (1<<1) /* 0 SECI is disabled (JATG functional) */ ++#define CCTRL43237_EXT_LNA (1<<2) /* 0 disable */ ++#define CCTRL43237_ANT_MUX_2o3 (1<<3) /* 2o3 mux, chipcontrol bit 3 */ ++#define CCTRL43237_GSIO (1<<4) /* 0 disable */ ++ ++/* 43237 Chip specific ChipStatus register bits */ ++#define CST43237_SFLASH_MASK 0x00000040 ++#define CST43237_OTP_SEL_MASK 0x00000080 ++#define CST43237_OTP_SEL_SHIFT 7 ++#define CST43237_HSIC_MASK 0x00000100 /* USB/HSIC */ ++#define CST43237_BP_CLK 0x00000200 /* 120/96Mbps */ ++#define CST43237_BOOT_MASK 0x00001800 ++#define CST43237_BOOT_SHIFT 11 ++#define CST43237_BOOT_FROM_SRAM 0 /* boot from SRAM, ARM in reset */ ++#define CST43237_BOOT_FROM_ROM 1 /* boot from ROM */ ++#define CST43237_BOOT_FROM_FLASH 2 /* boot from FLASH */ ++#define CST43237_BOOT_FROM_INVALID 3 ++ ++/* 43239 resources */ ++#define RES43239_OTP_PU 9 ++#define RES43239_MACPHY_CLKAVAIL 23 ++#define RES43239_HT_AVAIL 24 ++ ++/* 43239 Chip specific ChipStatus register bits */ ++#define CST43239_SPROM_MASK 0x00000002 ++#define CST43239_SFLASH_MASK 0x00000004 ++#define CST43239_RES_INIT_MODE_SHIFT 7 ++#define CST43239_RES_INIT_MODE_MASK 0x000001f0 ++#define CST43239_CHIPMODE_SDIOD(cs) ((cs) & (1 << 15)) /* SDIO || gSPI */ ++#define CST43239_CHIPMODE_USB20D(cs) (~(cs) & (1 << 15)) /* USB || USBDA */ ++#define CST43239_CHIPMODE_SDIO(cs) (((cs) & (1 << 0)) == 0) /* SDIO */ ++#define CST43239_CHIPMODE_GSPI(cs) (((cs) & (1 << 0)) == (1 << 0)) /* gSPI */ ++ ++/* 4324 resources */ ++#define RES4324_OTP_PU 10 ++#define RES4324_HT_AVAIL 29 ++#define RES4324_MACPHY_CLKAVAIL 30 ++ ++/* 4324 Chip specific ChipStatus register bits */ ++#define CST4324_SPROM_MASK 0x00000080 ++#define CST4324_SFLASH_MASK 0x00400000 ++#define CST4324_RES_INIT_MODE_SHIFT 10 ++#define CST4324_RES_INIT_MODE_MASK 0x00000c00 ++#define CST4324_CHIPMODE_MASK 0x7 ++#define CST4324_CHIPMODE_SDIOD(cs) ((~(cs)) & (1 << 2)) /* SDIO || gSPI */ ++#define CST4324_CHIPMODE_USB20D(cs) (((cs) & CST4324_CHIPMODE_MASK) == 0x6) /* USB || USBDA */ ++ ++/* 4331 resources */ ++#define RES4331_REGULATOR 0 ++#define RES4331_ILP_REQUEST 1 ++#define RES4331_XTAL_PU 2 ++#define RES4331_ALP_AVAIL 3 ++#define RES4331_SI_PLL_ON 4 ++#define RES4331_HT_SI_AVAIL 5 ++ ++/* 4331 chip-specific ChipControl register bits */ ++#define CCTRL4331_BT_COEXIST (1<<0) /* 0 disable */ ++#define CCTRL4331_SECI (1<<1) /* 0 SECI is disabled (JATG functional) */ ++#define CCTRL4331_EXT_LNA_G (1<<2) /* 0 disable */ ++#define CCTRL4331_SPROM_GPIO13_15 (1<<3) /* sprom/gpio13-15 mux */ ++#define CCTRL4331_EXTPA_EN (1<<4) /* 0 ext pa disable, 1 ext pa enabled */ ++#define CCTRL4331_GPIOCLK_ON_SPROMCS (1<<5) /* set drive out GPIO_CLK on sprom_cs pin */ ++#define CCTRL4331_PCIE_MDIO_ON_SPROMCS (1<<6) /* use sprom_cs pin as PCIE mdio interface */ ++#define CCTRL4331_EXTPA_ON_GPIO2_5 (1<<7) /* aband extpa will be at gpio2/5 and sprom_dout */ ++#define CCTRL4331_OVR_PIPEAUXCLKEN (1<<8) /* override core control on pipe_AuxClkEnable */ ++#define CCTRL4331_OVR_PIPEAUXPWRDOWN (1<<9) /* override core control on pipe_AuxPowerDown */ ++#define CCTRL4331_PCIE_AUXCLKEN (1<<10) /* pcie_auxclkenable */ ++#define CCTRL4331_PCIE_PIPE_PLLDOWN (1<<11) /* pcie_pipe_pllpowerdown */ ++#define CCTRL4331_EXTPA_EN2 (1<<12) /* 0 ext pa disable, 1 ext pa enabled */ ++#define CCTRL4331_EXT_LNA_A (1<<13) /* 0 disable */ ++#define CCTRL4331_BT_SHD0_ON_GPIO4 (1<<16) /* enable bt_shd0 at gpio4 */ ++#define CCTRL4331_BT_SHD1_ON_GPIO5 (1<<17) /* enable bt_shd1 at gpio5 */ ++#define CCTRL4331_EXTPA_ANA_EN (1<<24) /* 0 ext pa disable, 1 ext pa enabled */ ++ ++/* 4331 Chip specific ChipStatus register bits */ ++#define CST4331_XTAL_FREQ 0x00000001 /* crystal frequency 20/40Mhz */ ++#define CST4331_SPROM_OTP_SEL_MASK 0x00000006 ++#define CST4331_SPROM_OTP_SEL_SHIFT 1 ++#define CST4331_SPROM_PRESENT 0x00000002 ++#define CST4331_OTP_PRESENT 0x00000004 ++#define CST4331_LDO_RF 0x00000008 ++#define CST4331_LDO_PAR 0x00000010 ++ ++/* 4315 resource */ ++#define RES4315_CBUCK_LPOM 1 /* 0x00000002 */ ++#define RES4315_CBUCK_BURST 2 /* 0x00000004 */ ++#define RES4315_CBUCK_PWM 3 /* 0x00000008 */ ++#define RES4315_CLDO_PU 4 /* 0x00000010 */ ++#define RES4315_PALDO_PU 5 /* 0x00000020 */ ++#define RES4315_ILP_REQUEST 6 /* 0x00000040 */ ++#define RES4315_LNLDO1_PU 9 /* 0x00000200 */ ++#define RES4315_OTP_PU 10 /* 0x00000400 */ ++#define RES4315_LNLDO2_PU 12 /* 0x00001000 */ ++#define RES4315_XTAL_PU 13 /* 0x00002000 */ ++#define RES4315_ALP_AVAIL 14 /* 0x00004000 */ ++#define RES4315_RX_PWRSW_PU 15 /* 0x00008000 */ ++#define RES4315_TX_PWRSW_PU 16 /* 0x00010000 */ ++#define RES4315_RFPLL_PWRSW_PU 17 /* 0x00020000 */ ++#define RES4315_LOGEN_PWRSW_PU 18 /* 0x00040000 */ ++#define RES4315_AFE_PWRSW_PU 19 /* 0x00080000 */ ++#define RES4315_BBPLL_PWRSW_PU 20 /* 0x00100000 */ ++#define RES4315_HT_AVAIL 21 /* 0x00200000 */ ++ ++/* 4315 chip-specific ChipStatus register bits */ ++#define CST4315_SPROM_OTP_SEL_MASK 0x00000003 /* gpio [7:6], SDIO CIS selection */ ++#define CST4315_DEFCIS_SEL 0x00000000 /* use default CIS, OTP is powered up */ ++#define CST4315_SPROM_SEL 0x00000001 /* use SPROM, OTP is powered up */ ++#define CST4315_OTP_SEL 0x00000002 /* use OTP, OTP is powered up */ ++#define CST4315_OTP_PWRDN 0x00000003 /* use SPROM, OTP is powered down */ ++#define CST4315_SDIO_MODE 0x00000004 /* gpio [8], sdio/usb mode */ ++#define CST4315_RCAL_VALID 0x00000008 ++#define CST4315_RCAL_VALUE_MASK 0x000001f0 ++#define CST4315_RCAL_VALUE_SHIFT 4 ++#define CST4315_PALDO_EXTPNP 0x00000200 /* PALDO is configured with external PNP */ ++#define CST4315_CBUCK_MODE_MASK 0x00000c00 ++#define CST4315_CBUCK_MODE_BURST 0x00000400 ++#define CST4315_CBUCK_MODE_LPBURST 0x00000c00 ++ ++/* 4319 resources */ ++#define RES4319_CBUCK_LPOM 1 /* 0x00000002 */ ++#define RES4319_CBUCK_BURST 2 /* 0x00000004 */ ++#define RES4319_CBUCK_PWM 3 /* 0x00000008 */ ++#define RES4319_CLDO_PU 4 /* 0x00000010 */ ++#define RES4319_PALDO_PU 5 /* 0x00000020 */ ++#define RES4319_ILP_REQUEST 6 /* 0x00000040 */ ++#define RES4319_LNLDO1_PU 9 /* 0x00000200 */ ++#define RES4319_OTP_PU 10 /* 0x00000400 */ ++#define RES4319_LNLDO2_PU 12 /* 0x00001000 */ ++#define RES4319_XTAL_PU 13 /* 0x00002000 */ ++#define RES4319_ALP_AVAIL 14 /* 0x00004000 */ ++#define RES4319_RX_PWRSW_PU 15 /* 0x00008000 */ ++#define RES4319_TX_PWRSW_PU 16 /* 0x00010000 */ ++#define RES4319_RFPLL_PWRSW_PU 17 /* 0x00020000 */ ++#define RES4319_LOGEN_PWRSW_PU 18 /* 0x00040000 */ ++#define RES4319_AFE_PWRSW_PU 19 /* 0x00080000 */ ++#define RES4319_BBPLL_PWRSW_PU 20 /* 0x00100000 */ ++#define RES4319_HT_AVAIL 21 /* 0x00200000 */ ++ ++/* 4319 chip-specific ChipStatus register bits */ ++#define CST4319_SPI_CPULESSUSB 0x00000001 ++#define CST4319_SPI_CLK_POL 0x00000002 ++#define CST4319_SPI_CLK_PH 0x00000008 ++#define CST4319_SPROM_OTP_SEL_MASK 0x000000c0 /* gpio [7:6], SDIO CIS selection */ ++#define CST4319_SPROM_OTP_SEL_SHIFT 6 ++#define CST4319_DEFCIS_SEL 0x00000000 /* use default CIS, OTP is powered up */ ++#define CST4319_SPROM_SEL 0x00000040 /* use SPROM, OTP is powered up */ ++#define CST4319_OTP_SEL 0x00000080 /* use OTP, OTP is powered up */ ++#define CST4319_OTP_PWRDN 0x000000c0 /* use SPROM, OTP is powered down */ ++#define CST4319_SDIO_USB_MODE 0x00000100 /* gpio [8], sdio/usb mode */ ++#define CST4319_REMAP_SEL_MASK 0x00000600 ++#define CST4319_ILPDIV_EN 0x00000800 ++#define CST4319_XTAL_PD_POL 0x00001000 ++#define CST4319_LPO_SEL 0x00002000 ++#define CST4319_RES_INIT_MODE 0x0000c000 ++#define CST4319_PALDO_EXTPNP 0x00010000 /* PALDO is configured with external PNP */ ++#define CST4319_CBUCK_MODE_MASK 0x00060000 ++#define CST4319_CBUCK_MODE_BURST 0x00020000 ++#define CST4319_CBUCK_MODE_LPBURST 0x00060000 ++#define CST4319_RCAL_VALID 0x01000000 ++#define CST4319_RCAL_VALUE_MASK 0x3e000000 ++#define CST4319_RCAL_VALUE_SHIFT 25 ++ ++#define PMU1_PLL0_CHIPCTL0 0 ++#define PMU1_PLL0_CHIPCTL1 1 ++#define PMU1_PLL0_CHIPCTL2 2 ++#define CCTL_4319USB_XTAL_SEL_MASK 0x00180000 ++#define CCTL_4319USB_XTAL_SEL_SHIFT 19 ++#define CCTL_4319USB_48MHZ_PLL_SEL 1 ++#define CCTL_4319USB_24MHZ_PLL_SEL 2 ++ ++/* PMU resources for 4336 */ ++#define RES4336_CBUCK_LPOM 0 ++#define RES4336_CBUCK_BURST 1 ++#define RES4336_CBUCK_LP_PWM 2 ++#define RES4336_CBUCK_PWM 3 ++#define RES4336_CLDO_PU 4 ++#define RES4336_DIS_INT_RESET_PD 5 ++#define RES4336_ILP_REQUEST 6 ++#define RES4336_LNLDO_PU 7 ++#define RES4336_LDO3P3_PU 8 ++#define RES4336_OTP_PU 9 ++#define RES4336_XTAL_PU 10 ++#define RES4336_ALP_AVAIL 11 ++#define RES4336_RADIO_PU 12 ++#define RES4336_BG_PU 13 ++#define RES4336_VREG1p4_PU_PU 14 ++#define RES4336_AFE_PWRSW_PU 15 ++#define RES4336_RX_PWRSW_PU 16 ++#define RES4336_TX_PWRSW_PU 17 ++#define RES4336_BB_PWRSW_PU 18 ++#define RES4336_SYNTH_PWRSW_PU 19 ++#define RES4336_MISC_PWRSW_PU 20 ++#define RES4336_LOGEN_PWRSW_PU 21 ++#define RES4336_BBPLL_PWRSW_PU 22 ++#define RES4336_MACPHY_CLKAVAIL 23 ++#define RES4336_HT_AVAIL 24 ++#define RES4336_RSVD 25 ++ ++/* 4336 chip-specific ChipStatus register bits */ ++#define CST4336_SPI_MODE_MASK 0x00000001 ++#define CST4336_SPROM_PRESENT 0x00000002 ++#define CST4336_OTP_PRESENT 0x00000004 ++#define CST4336_ARMREMAP_0 0x00000008 ++#define CST4336_ILPDIV_EN_MASK 0x00000010 ++#define CST4336_ILPDIV_EN_SHIFT 4 ++#define CST4336_XTAL_PD_POL_MASK 0x00000020 ++#define CST4336_XTAL_PD_POL_SHIFT 5 ++#define CST4336_LPO_SEL_MASK 0x00000040 ++#define CST4336_LPO_SEL_SHIFT 6 ++#define CST4336_RES_INIT_MODE_MASK 0x00000180 ++#define CST4336_RES_INIT_MODE_SHIFT 7 ++#define CST4336_CBUCK_MODE_MASK 0x00000600 ++#define CST4336_CBUCK_MODE_SHIFT 9 ++ ++/* 4336 Chip specific PMU ChipControl register bits */ ++#define PCTL_4336_SERIAL_ENAB (1 << 24) ++ ++/* 4330 resources */ ++#define RES4330_CBUCK_LPOM 0 ++#define RES4330_CBUCK_BURST 1 ++#define RES4330_CBUCK_LP_PWM 2 ++#define RES4330_CBUCK_PWM 3 ++#define RES4330_CLDO_PU 4 ++#define RES4330_DIS_INT_RESET_PD 5 ++#define RES4330_ILP_REQUEST 6 ++#define RES4330_LNLDO_PU 7 ++#define RES4330_LDO3P3_PU 8 ++#define RES4330_OTP_PU 9 ++#define RES4330_XTAL_PU 10 ++#define RES4330_ALP_AVAIL 11 ++#define RES4330_RADIO_PU 12 ++#define RES4330_BG_PU 13 ++#define RES4330_VREG1p4_PU_PU 14 ++#define RES4330_AFE_PWRSW_PU 15 ++#define RES4330_RX_PWRSW_PU 16 ++#define RES4330_TX_PWRSW_PU 17 ++#define RES4330_BB_PWRSW_PU 18 ++#define RES4330_SYNTH_PWRSW_PU 19 ++#define RES4330_MISC_PWRSW_PU 20 ++#define RES4330_LOGEN_PWRSW_PU 21 ++#define RES4330_BBPLL_PWRSW_PU 22 ++#define RES4330_MACPHY_CLKAVAIL 23 ++#define RES4330_HT_AVAIL 24 ++#define RES4330_5gRX_PWRSW_PU 25 ++#define RES4330_5gTX_PWRSW_PU 26 ++#define RES4330_5g_LOGEN_PWRSW_PU 27 ++ ++/* 4330 chip-specific ChipStatus register bits */ ++#define CST4330_CHIPMODE_SDIOD(cs) (((cs) & 0x7) < 6) /* SDIO || gSPI */ ++#define CST4330_CHIPMODE_USB20D(cs) (((cs) & 0x7) >= 6) /* USB || USBDA */ ++#define CST4330_CHIPMODE_SDIO(cs) (((cs) & 0x4) == 0) /* SDIO */ ++#define CST4330_CHIPMODE_GSPI(cs) (((cs) & 0x6) == 4) /* gSPI */ ++#define CST4330_CHIPMODE_USB(cs) (((cs) & 0x7) == 6) /* USB packet-oriented */ ++#define CST4330_CHIPMODE_USBDA(cs) (((cs) & 0x7) == 7) /* USB Direct Access */ ++#define CST4330_OTP_PRESENT 0x00000010 ++#define CST4330_LPO_AUTODET_EN 0x00000020 ++#define CST4330_ARMREMAP_0 0x00000040 ++#define CST4330_SPROM_PRESENT 0x00000080 /* takes priority over OTP if both set */ ++#define CST4330_ILPDIV_EN 0x00000100 ++#define CST4330_LPO_SEL 0x00000200 ++#define CST4330_RES_INIT_MODE_SHIFT 10 ++#define CST4330_RES_INIT_MODE_MASK 0x00000c00 ++#define CST4330_CBUCK_MODE_SHIFT 12 ++#define CST4330_CBUCK_MODE_MASK 0x00003000 ++#define CST4330_CBUCK_POWER_OK 0x00004000 ++#define CST4330_BB_PLL_LOCKED 0x00008000 ++#define SOCDEVRAM_BP_ADDR 0x1E000000 ++#define SOCDEVRAM_ARM_ADDR 0x00800000 ++ ++/* 4330 Chip specific PMU ChipControl register bits */ ++#define PCTL_4330_SERIAL_ENAB (1 << 24) ++ ++/* 4330 Chip specific ChipControl register bits */ ++#define CCTRL_4330_GPIO_SEL 0x00000001 /* 1=select GPIOs to be muxed out */ ++#define CCTRL_4330_ERCX_SEL 0x00000002 /* 1=select ERCX BT coex to be muxed out */ ++#define CCTRL_4330_SDIO_HOST_WAKE 0x00000004 /* SDIO: 1=configure GPIO0 for host wake */ ++#define CCTRL_4330_JTAG_DISABLE 0x00000008 /* 1=disable JTAG interface on mux'd pins */ ++ ++#define PMU_VREG0_ADDR 0 ++#define PMU_VREG0_DISABLE_PULLD_BT_SHIFT 2 ++#define PMU_VREG0_DISABLE_PULLD_WL_SHIFT 3 ++ ++/* 4334 resources */ ++#define RES4334_LPLDO_PU 0 ++#define RES4334_RESET_PULLDN_DIS 1 ++#define RES4334_PMU_BG_PU 2 ++#define RES4334_HSIC_LDO_PU 3 ++#define RES4334_CBUCK_LPOM_PU 4 ++#define RES4334_CBUCK_PFM_PU 5 ++#define RES4334_CLDO_PU 6 ++#define RES4334_LPLDO2_LVM 7 ++#define RES4334_LNLDO_PU 8 ++#define RES4334_LDO3P3_PU 9 ++#define RES4334_OTP_PU 10 ++#define RES4334_XTAL_PU 11 ++#define RES4334_WL_PWRSW_PU 12 ++#define RES4334_LQ_AVAIL 13 ++#define RES4334_LOGIC_RET 14 ++#define RES4334_MEM_SLEEP 15 ++#define RES4334_MACPHY_RET 16 ++#define RES4334_WL_CORE_READY 17 ++#define RES4334_ILP_REQ 18 ++#define RES4334_ALP_AVAIL 19 ++#define RES4334_MISC_PWRSW_PU 20 ++#define RES4334_SYNTH_PWRSW_PU 21 ++#define RES4334_RX_PWRSW_PU 22 ++#define RES4334_RADIO_PU 23 ++#define RES4334_WL_PMU_PU 24 ++#define RES4334_VCO_LDO_PU 25 ++#define RES4334_AFE_LDO_PU 26 ++#define RES4334_RX_LDO_PU 27 ++#define RES4334_TX_LDO_PU 28 ++#define RES4334_HT_AVAIL 29 ++#define RES4334_MACPHY_CLK_AVAIL 30 ++ ++/* 4334 chip-specific ChipStatus register bits */ ++#define CST4334_CHIPMODE_MASK 7 ++#define CST4334_SDIO_MODE 0x00000000 ++#define CST4334_SPI_MODE 0x00000004 ++#define CST4334_HSIC_MODE 0x00000006 ++#define CST4334_BLUSB_MODE 0x00000007 ++#define CST4334_CHIPMODE_HSIC(cs) (((cs) & CST4334_CHIPMODE_MASK) == CST4334_HSIC_MODE) ++#define CST4334_OTP_PRESENT 0x00000010 ++#define CST4334_LPO_AUTODET_EN 0x00000020 ++#define CST4334_ARMREMAP_0 0x00000040 ++#define CST4334_SPROM_PRESENT 0x00000080 ++#define CST4334_ILPDIV_EN_MASK 0x00000100 ++#define CST4334_ILPDIV_EN_SHIFT 8 ++#define CST4334_LPO_SEL_MASK 0x00000200 ++#define CST4334_LPO_SEL_SHIFT 9 ++#define CST4334_RES_INIT_MODE_MASK 0x00000C00 ++#define CST4334_RES_INIT_MODE_SHIFT 10 ++ ++/* 4334 Chip specific PMU ChipControl register bits */ ++#define PCTL_4334_GPIO3_ENAB (1 << 3) ++ ++/* 4334 Chip control */ ++#define CCTRL4334_HSIC_LDO_PU (1 << 23) ++ ++/* 4324 Chip specific ChipControl1 register bits */ ++#define CCTRL1_4324_GPIO_SEL (1 << 0) /* 1=select GPIOs to be muxed out */ ++#define CCTRL1_4324_SDIO_HOST_WAKE (1 << 2) /* SDIO: 1=configure GPIO0 for host wake */ ++ ++ ++/* 4313 resources */ ++#define RES4313_BB_PU_RSRC 0 ++#define RES4313_ILP_REQ_RSRC 1 ++#define RES4313_XTAL_PU_RSRC 2 ++#define RES4313_ALP_AVAIL_RSRC 3 ++#define RES4313_RADIO_PU_RSRC 4 ++#define RES4313_BG_PU_RSRC 5 ++#define RES4313_VREG1P4_PU_RSRC 6 ++#define RES4313_AFE_PWRSW_RSRC 7 ++#define RES4313_RX_PWRSW_RSRC 8 ++#define RES4313_TX_PWRSW_RSRC 9 ++#define RES4313_BB_PWRSW_RSRC 10 ++#define RES4313_SYNTH_PWRSW_RSRC 11 ++#define RES4313_MISC_PWRSW_RSRC 12 ++#define RES4313_BB_PLL_PWRSW_RSRC 13 ++#define RES4313_HT_AVAIL_RSRC 14 ++#define RES4313_MACPHY_CLK_AVAIL_RSRC 15 ++ ++/* 4313 chip-specific ChipStatus register bits */ ++#define CST4313_SPROM_PRESENT 1 ++#define CST4313_OTP_PRESENT 2 ++#define CST4313_SPROM_OTP_SEL_MASK 0x00000002 ++#define CST4313_SPROM_OTP_SEL_SHIFT 0 ++ ++/* 4313 Chip specific ChipControl register bits */ ++#define CCTRL_4313_12MA_LED_DRIVE 0x00000007 /* 12 mA drive strengh for later 4313 */ ++ ++/* PMU respources for 4314 */ ++#define RES4314_LPLDO_PU 0 ++#define RES4314_PMU_SLEEP_DIS 1 ++#define RES4314_PMU_BG_PU 2 ++#define RES4314_CBUCK_LPOM_PU 3 ++#define RES4314_CBUCK_PFM_PU 4 ++#define RES4314_CLDO_PU 5 ++#define RES4314_LPLDO2_LVM 6 ++#define RES4314_WL_PMU_PU 7 ++#define RES4314_LNLDO_PU 8 ++#define RES4314_LDO3P3_PU 9 ++#define RES4314_OTP_PU 10 ++#define RES4314_XTAL_PU 11 ++#define RES4314_WL_PWRSW_PU 12 ++#define RES4314_LQ_AVAIL 13 ++#define RES4314_LOGIC_RET 14 ++#define RES4314_MEM_SLEEP 15 ++#define RES4314_MACPHY_RET 16 ++#define RES4314_WL_CORE_READY 17 ++#define RES4314_ILP_REQ 18 ++#define RES4314_ALP_AVAIL 19 ++#define RES4314_MISC_PWRSW_PU 20 ++#define RES4314_SYNTH_PWRSW_PU 21 ++#define RES4314_RX_PWRSW_PU 22 ++#define RES4314_RADIO_PU 23 ++#define RES4314_VCO_LDO_PU 24 ++#define RES4314_AFE_LDO_PU 25 ++#define RES4314_RX_LDO_PU 26 ++#define RES4314_TX_LDO_PU 27 ++#define RES4314_HT_AVAIL 28 ++#define RES4314_MACPHY_CLK_AVAIL 29 ++ ++/* 4314 chip-specific ChipStatus register bits */ ++#define CST4314_OTP_ENABLED 0x00200000 ++ ++/* 43228 resources */ ++#define RES43228_NOT_USED 0 ++#define RES43228_ILP_REQUEST 1 ++#define RES43228_XTAL_PU 2 ++#define RES43228_ALP_AVAIL 3 ++#define RES43228_PLL_EN 4 ++#define RES43228_HT_PHY_AVAIL 5 ++ ++/* 43228 chipstatus reg bits */ ++#define CST43228_ILP_DIV_EN 0x1 ++#define CST43228_OTP_PRESENT 0x2 ++#define CST43228_SERDES_REFCLK_PADSEL 0x4 ++#define CST43228_SDIO_MODE 0x8 ++#define CST43228_SDIO_OTP_PRESENT 0x10 ++#define CST43228_SDIO_RESET 0x20 ++ ++/* 4706 chipstatus reg bits */ ++#define CST4706_PKG_OPTION (1<<0) /* 0: full-featured package 1: low-cost package */ ++#define CST4706_SFLASH_PRESENT (1<<1) /* 0: parallel, 1: serial flash is present */ ++#define CST4706_SFLASH_TYPE (1<<2) /* 0: 8b-p/ST-s flash, 1: 16b-p/Atmal-s flash */ ++#define CST4706_MIPS_BENDIAN (1<<3) /* 0: little, 1: big endian */ ++#define CST4706_PCIE1_DISABLE (1<<5) /* PCIE1 enable strap pin */ ++ ++/* 4706 flashstrconfig reg bits */ ++#define FLSTRCF4706_MASK 0x000000ff ++#define FLSTRCF4706_SF1 0x00000001 /* 2nd serial flash present */ ++#define FLSTRCF4706_PF1 0x00000002 /* 2nd parallel flash present */ ++#define FLSTRCF4706_SF1_TYPE 0x00000004 /* 2nd serial flash type : 0 : ST, 1 : Atmel */ ++#define FLSTRCF4706_NF1 0x00000008 /* 2nd NAND flash present */ ++#define FLSTRCF4706_1ST_MADDR_SEG_MASK 0x000000f0 /* Valid value mask */ ++#define FLSTRCF4706_1ST_MADDR_SEG_4MB 0x00000010 /* 4MB */ ++#define FLSTRCF4706_1ST_MADDR_SEG_8MB 0x00000020 /* 8MB */ ++#define FLSTRCF4706_1ST_MADDR_SEG_16MB 0x00000030 /* 16MB */ ++#define FLSTRCF4706_1ST_MADDR_SEG_32MB 0x00000040 /* 32MB */ ++#define FLSTRCF4706_1ST_MADDR_SEG_64MB 0x00000050 /* 64MB */ ++#define FLSTRCF4706_1ST_MADDR_SEG_128MB 0x00000060 /* 128MB */ ++#define FLSTRCF4706_1ST_MADDR_SEG_256MB 0x00000070 /* 256MB */ ++ ++/* 4360 Chip specific ChipControl register bits */ ++#define CCTRL4360_SECI_MODE (1 << 2) ++#define CCTRL4360_BTSWCTRL_MODE (1 << 3) ++#define CCTRL4360_EXTRA_FEMCTRL_MODE (1 << 8) ++#define CCTRL4360_BT_LGCY_MODE (1 << 9) ++#define CCTRL4360_CORE2FEMCTRL4_ON (1 << 21) ++ ++/* 4360 PMU resources and chip status bits */ ++#define RES4360_REGULATOR 0 ++#define RES4360_ILP_AVAIL 1 ++#define RES4360_ILP_REQ 2 ++#define RES4360_XTAL_LDO_PU 3 ++#define RES4360_XTAL_PU 4 ++#define RES4360_ALP_AVAIL 5 ++#define RES4360_BBPLLPWRSW_PU 6 ++#define RES4360_HT_AVAIL 7 ++#define RES4360_OTP_PU 8 ++ ++#define CST4360_XTAL_40MZ 0x00000001 ++#define CST4360_SFLASH 0x00000002 ++#define CST4360_SPROM_PRESENT 0x00000004 ++#define CST4360_SFLASH_TYPE 0x00000004 ++#define CST4360_OTP_ENABLED 0x00000008 ++#define CST4360_REMAP_ROM 0x00000010 ++#define CST4360_RSRC_INIT_MODE_MASK 0x00000060 ++#define CST4360_RSRC_INIT_MODE_SHIFT 5 ++#define CST4360_ILP_DIVEN 0x00000080 ++#define CST4360_MODE_USB 0x00000100 ++#define CST4360_SPROM_SIZE_MASK 0x00000600 ++#define CST4360_SPROM_SIZE_SHIFT 9 ++#define CST4360_BBPLL_LOCK 0x00000800 ++#define CST4360_AVBBPLL_LOCK 0x00001000 ++#define CST4360_USBBBPLL_LOCK 0x00002000 ++ ++#define CCTRL_4360_UART_SEL 0x2 ++ ++/* 4335 resources */ ++#define RES4335_LPLDO_PO 0 ++#define RES4335_PMU_BG_PU 1 ++#define RES4335_PMU_SLEEP 2 ++#define RES4335_RSVD_3 3 ++#define RES4335_CBUCK_LPOM_PU 4 ++#define RES4335_CBUCK_PFM_PU 5 ++#define RES4335_RSVD_6 6 ++#define RES4335_RSVD_7 7 ++#define RES4335_LNLDO_PU 8 ++#define RES4335_XTALLDO_PU 9 ++#define RES4335_LDO3P3_PU 10 ++#define RES4335_OTP_PU 11 ++#define RES4335_XTAL_PU 12 ++#define RES4335_SR_CLK_START 13 ++#define RES4335_LQ_AVAIL 14 ++#define RES4335_LQ_START 15 ++#define RES4335_RSVD_16 16 ++#define RES4335_WL_CORE_RDY 17 ++#define RES4335_ILP_REQ 18 ++#define RES4335_ALP_AVAIL 19 ++#define RES4335_MINI_PMU 20 ++#define RES4335_RADIO_PU 21 ++#define RES4335_SR_CLK_STABLE 22 ++#define RES4335_SR_SAVE_RESTORE 23 ++#define RES4335_SR_PHY_PWRSW 24 ++#define RES4335_SR_VDDM_PWRSW 25 ++#define RES4335_SR_SUBCORE_PWRSW 26 ++#define RES4335_SR_SLEEP 27 ++#define RES4335_HT_START 28 ++#define RES4335_HT_AVAIL 29 ++#define RES4335_MACPHY_CLKAVAIL 30 ++ ++/* 4335 Chip specific ChipStatus register bits */ ++#define CST4335_SPROM_MASK 0x00000020 ++#define CST4335_SFLASH_MASK 0x00000040 ++#define CST4335_RES_INIT_MODE_SHIFT 7 ++#define CST4335_RES_INIT_MODE_MASK 0x00000180 ++#define CST4335_CHIPMODE_MASK 0xF ++#define CST4335_CHIPMODE_SDIOD(cs) (((cs) & (1 << 0)) != 0) /* SDIO */ ++#define CST4335_CHIPMODE_GSPI(cs) (((cs) & (1 << 1)) != 0) /* gSPI */ ++#define CST4335_CHIPMODE_USB20D(cs) (((cs) & (1 << 2)) != 0) /* USB || USBDA */ ++#define CST4335_CHIPMODE_PCIE(cs) (((cs) & (1 << 3)) != 0) /* PCIE */ ++ ++/* 4335 Chip specific ChipControl1 register bits */ ++#define CCTRL1_4335_GPIO_SEL (1 << 0) /* 1=select GPIOs to be muxed out */ ++#define CCTRL1_4335_SDIO_HOST_WAKE (1 << 2) /* SDIO: 1=configure GPIO0 for host wake */ ++ ++ ++#define CR4_RAM_BASE (0x180000) ++ ++/* 4335 resources--END */ ++ ++/* GCI chipcontrol register indices */ ++#define CC_GCI_CHIPCTRL_00 (0) ++#define CC_GCI_CHIPCTRL_01 (1) ++#define CC_GCI_CHIPCTRL_02 (2) ++#define CC_GCI_CHIPCTRL_03 (3) ++#define CC_GCI_CHIPCTRL_04 (4) ++#define CC_GCI_CHIPCTRL_05 (5) ++#define CC_GCI_CHIPCTRL_06 (6) ++#define CC_GCI_CHIPCTRL_07 (7) ++#define CC_GCI_CHIPCTRL_08 (8) ++ ++#define CC_GCI_NUMCHIPCTRLREGS(cap1) ((cap1 & 0xF00) >> 8) ++ ++/* 4335 pins ++* note: only the values set as default/used are added here. ++*/ ++#define CC4335_PIN_GPIO_00 (0) ++#define CC4335_PIN_GPIO_01 (1) ++#define CC4335_PIN_GPIO_02 (2) ++#define CC4335_PIN_GPIO_03 (3) ++#define CC4335_PIN_GPIO_04 (4) ++#define CC4335_PIN_GPIO_05 (5) ++#define CC4335_PIN_GPIO_06 (6) ++#define CC4335_PIN_GPIO_07 (7) ++#define CC4335_PIN_GPIO_08 (8) ++#define CC4335_PIN_GPIO_09 (9) ++#define CC4335_PIN_GPIO_10 (10) ++#define CC4335_PIN_GPIO_11 (11) ++#define CC4335_PIN_GPIO_12 (12) ++#define CC4335_PIN_GPIO_13 (13) ++#define CC4335_PIN_GPIO_14 (14) ++#define CC4335_PIN_GPIO_15 (15) ++#define CC4335_PIN_SDIO_CLK (16) ++#define CC4335_PIN_SDIO_CMD (17) ++#define CC4335_PIN_SDIO_DATA0 (18) ++#define CC4335_PIN_SDIO_DATA1 (19) ++#define CC4335_PIN_SDIO_DATA2 (20) ++#define CC4335_PIN_SDIO_DATA3 (21) ++#define CC4335_PIN_RF_SW_CTRL_0 (22) ++#define CC4335_PIN_RF_SW_CTRL_1 (23) ++#define CC4335_PIN_RF_SW_CTRL_2 (24) ++#define CC4335_PIN_RF_SW_CTRL_3 (25) ++#define CC4335_PIN_RF_SW_CTRL_4 (26) ++#define CC4335_PIN_RF_SW_CTRL_5 (27) ++#define CC4335_PIN_RF_SW_CTRL_6 (28) ++#define CC4335_PIN_RF_SW_CTRL_7 (29) ++#define CC4335_PIN_RF_SW_CTRL_8 (30) ++#define CC4335_PIN_RF_SW_CTRL_9 (31) ++ ++/* 4335 GCI function sel values ++*/ ++#define CC4335_FNSEL_HWDEF (0) ++#define CC4335_FNSEL_SAMEASPIN (1) ++#define CC4335_FNSEL_GPIO0 (2) ++#define CC4335_FNSEL_GPIO1 (3) ++#define CC4335_FNSEL_GCI0 (4) ++#define CC4335_FNSEL_GCI1 (5) ++#define CC4335_FNSEL_UART (6) ++#define CC4335_FNSEL_SFLASH (7) ++#define CC4335_FNSEL_SPROM (8) ++#define CC4335_FNSEL_MISC0 (9) ++#define CC4335_FNSEL_MISC1 (10) ++#define CC4335_FNSEL_MISC2 (11) ++#define CC4335_FNSEL_IND (12) ++#define CC4335_FNSEL_PDN (13) ++#define CC4335_FNSEL_PUP (14) ++#define CC4335_FNSEL_TRI (15) ++ ++/* find the 4 bit mask given the bit position */ ++#define GCIMASK(pos) (((uint32)0xF) << pos) ++ ++/* get the value which can be used to directly OR with chipcontrol reg */ ++#define GCIPOSVAL(val, pos) ((((uint32)val) << pos) & GCIMASK(pos)) ++ ++/* 4335 MUX options. each nibble belongs to a setting. Non-zero value specifies a logic ++* for now only UART for bootloader. ++*/ ++#define MUXENAB4335_UART_MASK (0x0000000f) ++ ++ ++/* defines to detect active host interface in use */ ++#define CHIP_HOSTIF_USB(sih) (si_chip_hostif(sih) & CST4360_MODE_USB) ++ ++/* ++* Maximum delay for the PMU state transition in us. ++* This is an upper bound intended for spinwaits etc. ++*/ ++#define PMU_MAX_TRANSITION_DLY 15000 ++ ++/* PMU resource up transition time in ILP cycles */ ++#define PMURES_UP_TRANSITION 2 ++ ++ ++/* SECI configuration */ ++#define SECI_MODE_UART 0x0 ++#define SECI_MODE_SECI 0x1 ++#define SECI_MODE_LEGACY_3WIRE_BT 0x2 ++#define SECI_MODE_LEGACY_3WIRE_WLAN 0x3 ++#define SECI_MODE_HALF_SECI 0x4 ++ ++#define SECI_RESET (1 << 0) ++#define SECI_RESET_BAR_UART (1 << 1) ++#define SECI_ENAB_SECI_ECI (1 << 2) ++#define SECI_ENAB_SECIOUT_DIS (1 << 3) ++#define SECI_MODE_MASK 0x7 ++#define SECI_MODE_SHIFT 4 /* (bits 5, 6, 7) */ ++#define SECI_UPD_SECI (1 << 7) ++ ++#define SECI_SIGNOFF_0 0xDB ++#define SECI_SIGNOFF_1 0 ++ ++/* seci clk_ctl_st bits */ ++#define CLKCTL_STS_SECI_CLK_REQ (1 << 8) ++#define CLKCTL_STS_SECI_CLK_AVAIL (1 << 24) ++ ++#define SECI_UART_MSR_CTS_STATE (1 << 0) ++#define SECI_UART_MSR_RTS_STATE (1 << 1) ++#define SECI_UART_SECI_IN_STATE (1 << 2) ++#define SECI_UART_SECI_IN2_STATE (1 << 3) ++ ++/* SECI UART LCR/MCR register bits */ ++#define SECI_UART_LCR_STOP_BITS (1 << 0) /* 0 - 1bit, 1 - 2bits */ ++#define SECI_UART_LCR_PARITY_EN (1 << 1) ++#define SECI_UART_LCR_PARITY (1 << 2) /* 0 - odd, 1 - even */ ++#define SECI_UART_LCR_RX_EN (1 << 3) ++#define SECI_UART_LCR_LBRK_CTRL (1 << 4) /* 1 => SECI_OUT held low */ ++#define SECI_UART_LCR_TXO_EN (1 << 5) ++#define SECI_UART_LCR_RTSO_EN (1 << 6) ++#define SECI_UART_LCR_SLIPMODE_EN (1 << 7) ++#define SECI_UART_LCR_RXCRC_CHK (1 << 8) ++#define SECI_UART_LCR_TXCRC_INV (1 << 9) ++#define SECI_UART_LCR_TXCRC_LSBF (1 << 10) ++#define SECI_UART_LCR_TXCRC_EN (1 << 11) ++ ++#define SECI_UART_MCR_TX_EN (1 << 0) ++#define SECI_UART_MCR_PRTS (1 << 1) ++#define SECI_UART_MCR_SWFLCTRL_EN (1 << 2) ++#define SECI_UART_MCR_HIGHRATE_EN (1 << 3) ++#define SECI_UART_MCR_LOOPBK_EN (1 << 4) ++#define SECI_UART_MCR_AUTO_RTS (1 << 5) ++#define SECI_UART_MCR_AUTO_TX_DIS (1 << 6) ++#define SECI_UART_MCR_BAUD_ADJ_EN (1 << 7) ++#define SECI_UART_MCR_XONOFF_RPT (1 << 9) ++ ++/* WLAN channel numbers - used from wifi.h */ ++ ++/* WLAN BW */ ++#define ECI_BW_20 0x0 ++#define ECI_BW_25 0x1 ++#define ECI_BW_30 0x2 ++#define ECI_BW_35 0x3 ++#define ECI_BW_40 0x4 ++#define ECI_BW_45 0x5 ++#define ECI_BW_50 0x6 ++#define ECI_BW_ALL 0x7 ++ ++/* WLAN - number of antenna */ ++#define WLAN_NUM_ANT1 TXANT_0 ++#define WLAN_NUM_ANT2 TXANT_1 ++ ++#endif /* _SBCHIPC_H */ +diff --git a/drivers/net/wireless/ap6210/include/sbconfig.h b/drivers/net/wireless/ap6210/include/sbconfig.h +new file mode 100644 +index 0000000..73ddadd +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbconfig.h +@@ -0,0 +1,282 @@ ++/* ++ * Broadcom SiliconBackplane hardware register definitions. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbconfig.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _SBCONFIG_H ++#define _SBCONFIG_H ++ ++/* cpp contortions to concatenate w/arg prescan */ ++#ifndef PAD ++#define _PADLINE(line) pad ## line ++#define _XSTR(line) _PADLINE(line) ++#define PAD _XSTR(__LINE__) ++#endif ++ ++/* enumeration in SB is based on the premise that cores are contiguos in the ++ * enumeration space. ++ */ ++#define SB_BUS_SIZE 0x10000 /* Each bus gets 64Kbytes for cores */ ++#define SB_BUS_BASE(b) (SI_ENUM_BASE + (b) * SB_BUS_SIZE) ++#define SB_BUS_MAXCORES (SB_BUS_SIZE / SI_CORE_SIZE) /* Max cores per bus */ ++ ++/* ++ * Sonics Configuration Space Registers. ++ */ ++#define SBCONFIGOFF 0xf00 /* core sbconfig regs are top 256bytes of regs */ ++#define SBCONFIGSIZE 256 /* sizeof (sbconfig_t) */ ++ ++#define SBIPSFLAG 0x08 ++#define SBTPSFLAG 0x18 ++#define SBTMERRLOGA 0x48 /* sonics >= 2.3 */ ++#define SBTMERRLOG 0x50 /* sonics >= 2.3 */ ++#define SBADMATCH3 0x60 ++#define SBADMATCH2 0x68 ++#define SBADMATCH1 0x70 ++#define SBIMSTATE 0x90 ++#define SBINTVEC 0x94 ++#define SBTMSTATELOW 0x98 ++#define SBTMSTATEHIGH 0x9c ++#define SBBWA0 0xa0 ++#define SBIMCONFIGLOW 0xa8 ++#define SBIMCONFIGHIGH 0xac ++#define SBADMATCH0 0xb0 ++#define SBTMCONFIGLOW 0xb8 ++#define SBTMCONFIGHIGH 0xbc ++#define SBBCONFIG 0xc0 ++#define SBBSTATE 0xc8 ++#define SBACTCNFG 0xd8 ++#define SBFLAGST 0xe8 ++#define SBIDLOW 0xf8 ++#define SBIDHIGH 0xfc ++ ++/* All the previous registers are above SBCONFIGOFF, but with Sonics 2.3, we have ++ * a few registers *below* that line. I think it would be very confusing to try ++ * and change the value of SBCONFIGOFF, so I'm definig them as absolute offsets here, ++ */ ++ ++#define SBIMERRLOGA 0xea8 ++#define SBIMERRLOG 0xeb0 ++#define SBTMPORTCONNID0 0xed8 ++#define SBTMPORTLOCK0 0xef8 ++ ++#ifndef _LANGUAGE_ASSEMBLY ++ ++typedef volatile struct _sbconfig { ++ uint32 PAD[2]; ++ uint32 sbipsflag; /* initiator port ocp slave flag */ ++ uint32 PAD[3]; ++ uint32 sbtpsflag; /* target port ocp slave flag */ ++ uint32 PAD[11]; ++ uint32 sbtmerrloga; /* (sonics >= 2.3) */ ++ uint32 PAD; ++ uint32 sbtmerrlog; /* (sonics >= 2.3) */ ++ uint32 PAD[3]; ++ uint32 sbadmatch3; /* address match3 */ ++ uint32 PAD; ++ uint32 sbadmatch2; /* address match2 */ ++ uint32 PAD; ++ uint32 sbadmatch1; /* address match1 */ ++ uint32 PAD[7]; ++ uint32 sbimstate; /* initiator agent state */ ++ uint32 sbintvec; /* interrupt mask */ ++ uint32 sbtmstatelow; /* target state */ ++ uint32 sbtmstatehigh; /* target state */ ++ uint32 sbbwa0; /* bandwidth allocation table0 */ ++ uint32 PAD; ++ uint32 sbimconfiglow; /* initiator configuration */ ++ uint32 sbimconfighigh; /* initiator configuration */ ++ uint32 sbadmatch0; /* address match0 */ ++ uint32 PAD; ++ uint32 sbtmconfiglow; /* target configuration */ ++ uint32 sbtmconfighigh; /* target configuration */ ++ uint32 sbbconfig; /* broadcast configuration */ ++ uint32 PAD; ++ uint32 sbbstate; /* broadcast state */ ++ uint32 PAD[3]; ++ uint32 sbactcnfg; /* activate configuration */ ++ uint32 PAD[3]; ++ uint32 sbflagst; /* current sbflags */ ++ uint32 PAD[3]; ++ uint32 sbidlow; /* identification */ ++ uint32 sbidhigh; /* identification */ ++} sbconfig_t; ++ ++#endif /* _LANGUAGE_ASSEMBLY */ ++ ++/* sbipsflag */ ++#define SBIPS_INT1_MASK 0x3f /* which sbflags get routed to mips interrupt 1 */ ++#define SBIPS_INT1_SHIFT 0 ++#define SBIPS_INT2_MASK 0x3f00 /* which sbflags get routed to mips interrupt 2 */ ++#define SBIPS_INT2_SHIFT 8 ++#define SBIPS_INT3_MASK 0x3f0000 /* which sbflags get routed to mips interrupt 3 */ ++#define SBIPS_INT3_SHIFT 16 ++#define SBIPS_INT4_MASK 0x3f000000 /* which sbflags get routed to mips interrupt 4 */ ++#define SBIPS_INT4_SHIFT 24 ++ ++/* sbtpsflag */ ++#define SBTPS_NUM0_MASK 0x3f /* interrupt sbFlag # generated by this core */ ++#define SBTPS_F0EN0 0x40 /* interrupt is always sent on the backplane */ ++ ++/* sbtmerrlog */ ++#define SBTMEL_CM 0x00000007 /* command */ ++#define SBTMEL_CI 0x0000ff00 /* connection id */ ++#define SBTMEL_EC 0x0f000000 /* error code */ ++#define SBTMEL_ME 0x80000000 /* multiple error */ ++ ++/* sbimstate */ ++#define SBIM_PC 0xf /* pipecount */ ++#define SBIM_AP_MASK 0x30 /* arbitration policy */ ++#define SBIM_AP_BOTH 0x00 /* use both timeslaces and token */ ++#define SBIM_AP_TS 0x10 /* use timesliaces only */ ++#define SBIM_AP_TK 0x20 /* use token only */ ++#define SBIM_AP_RSV 0x30 /* reserved */ ++#define SBIM_IBE 0x20000 /* inbanderror */ ++#define SBIM_TO 0x40000 /* timeout */ ++#define SBIM_BY 0x01800000 /* busy (sonics >= 2.3) */ ++#define SBIM_RJ 0x02000000 /* reject (sonics >= 2.3) */ ++ ++/* sbtmstatelow */ ++#define SBTML_RESET 0x0001 /* reset */ ++#define SBTML_REJ_MASK 0x0006 /* reject field */ ++#define SBTML_REJ 0x0002 /* reject */ ++#define SBTML_TMPREJ 0x0004 /* temporary reject, for error recovery */ ++ ++#define SBTML_SICF_SHIFT 16 /* Shift to locate the SI control flags in sbtml */ ++ ++/* sbtmstatehigh */ ++#define SBTMH_SERR 0x0001 /* serror */ ++#define SBTMH_INT 0x0002 /* interrupt */ ++#define SBTMH_BUSY 0x0004 /* busy */ ++#define SBTMH_TO 0x0020 /* timeout (sonics >= 2.3) */ ++ ++#define SBTMH_SISF_SHIFT 16 /* Shift to locate the SI status flags in sbtmh */ ++ ++/* sbbwa0 */ ++#define SBBWA_TAB0_MASK 0xffff /* lookup table 0 */ ++#define SBBWA_TAB1_MASK 0xffff /* lookup table 1 */ ++#define SBBWA_TAB1_SHIFT 16 ++ ++/* sbimconfiglow */ ++#define SBIMCL_STO_MASK 0x7 /* service timeout */ ++#define SBIMCL_RTO_MASK 0x70 /* request timeout */ ++#define SBIMCL_RTO_SHIFT 4 ++#define SBIMCL_CID_MASK 0xff0000 /* connection id */ ++#define SBIMCL_CID_SHIFT 16 ++ ++/* sbimconfighigh */ ++#define SBIMCH_IEM_MASK 0xc /* inband error mode */ ++#define SBIMCH_TEM_MASK 0x30 /* timeout error mode */ ++#define SBIMCH_TEM_SHIFT 4 ++#define SBIMCH_BEM_MASK 0xc0 /* bus error mode */ ++#define SBIMCH_BEM_SHIFT 6 ++ ++/* sbadmatch0 */ ++#define SBAM_TYPE_MASK 0x3 /* address type */ ++#define SBAM_AD64 0x4 /* reserved */ ++#define SBAM_ADINT0_MASK 0xf8 /* type0 size */ ++#define SBAM_ADINT0_SHIFT 3 ++#define SBAM_ADINT1_MASK 0x1f8 /* type1 size */ ++#define SBAM_ADINT1_SHIFT 3 ++#define SBAM_ADINT2_MASK 0x1f8 /* type2 size */ ++#define SBAM_ADINT2_SHIFT 3 ++#define SBAM_ADEN 0x400 /* enable */ ++#define SBAM_ADNEG 0x800 /* negative decode */ ++#define SBAM_BASE0_MASK 0xffffff00 /* type0 base address */ ++#define SBAM_BASE0_SHIFT 8 ++#define SBAM_BASE1_MASK 0xfffff000 /* type1 base address for the core */ ++#define SBAM_BASE1_SHIFT 12 ++#define SBAM_BASE2_MASK 0xffff0000 /* type2 base address for the core */ ++#define SBAM_BASE2_SHIFT 16 ++ ++/* sbtmconfiglow */ ++#define SBTMCL_CD_MASK 0xff /* clock divide */ ++#define SBTMCL_CO_MASK 0xf800 /* clock offset */ ++#define SBTMCL_CO_SHIFT 11 ++#define SBTMCL_IF_MASK 0xfc0000 /* interrupt flags */ ++#define SBTMCL_IF_SHIFT 18 ++#define SBTMCL_IM_MASK 0x3000000 /* interrupt mode */ ++#define SBTMCL_IM_SHIFT 24 ++ ++/* sbtmconfighigh */ ++#define SBTMCH_BM_MASK 0x3 /* busy mode */ ++#define SBTMCH_RM_MASK 0x3 /* retry mode */ ++#define SBTMCH_RM_SHIFT 2 ++#define SBTMCH_SM_MASK 0x30 /* stop mode */ ++#define SBTMCH_SM_SHIFT 4 ++#define SBTMCH_EM_MASK 0x300 /* sb error mode */ ++#define SBTMCH_EM_SHIFT 8 ++#define SBTMCH_IM_MASK 0xc00 /* int mode */ ++#define SBTMCH_IM_SHIFT 10 ++ ++/* sbbconfig */ ++#define SBBC_LAT_MASK 0x3 /* sb latency */ ++#define SBBC_MAX0_MASK 0xf0000 /* maxccntr0 */ ++#define SBBC_MAX0_SHIFT 16 ++#define SBBC_MAX1_MASK 0xf00000 /* maxccntr1 */ ++#define SBBC_MAX1_SHIFT 20 ++ ++/* sbbstate */ ++#define SBBS_SRD 0x1 /* st reg disable */ ++#define SBBS_HRD 0x2 /* hold reg disable */ ++ ++/* sbidlow */ ++#define SBIDL_CS_MASK 0x3 /* config space */ ++#define SBIDL_AR_MASK 0x38 /* # address ranges supported */ ++#define SBIDL_AR_SHIFT 3 ++#define SBIDL_SYNCH 0x40 /* sync */ ++#define SBIDL_INIT 0x80 /* initiator */ ++#define SBIDL_MINLAT_MASK 0xf00 /* minimum backplane latency */ ++#define SBIDL_MINLAT_SHIFT 8 ++#define SBIDL_MAXLAT 0xf000 /* maximum backplane latency */ ++#define SBIDL_MAXLAT_SHIFT 12 ++#define SBIDL_FIRST 0x10000 /* this initiator is first */ ++#define SBIDL_CW_MASK 0xc0000 /* cycle counter width */ ++#define SBIDL_CW_SHIFT 18 ++#define SBIDL_TP_MASK 0xf00000 /* target ports */ ++#define SBIDL_TP_SHIFT 20 ++#define SBIDL_IP_MASK 0xf000000 /* initiator ports */ ++#define SBIDL_IP_SHIFT 24 ++#define SBIDL_RV_MASK 0xf0000000 /* sonics backplane revision code */ ++#define SBIDL_RV_SHIFT 28 ++#define SBIDL_RV_2_2 0x00000000 /* version 2.2 or earlier */ ++#define SBIDL_RV_2_3 0x10000000 /* version 2.3 */ ++ ++/* sbidhigh */ ++#define SBIDH_RC_MASK 0x000f /* revision code */ ++#define SBIDH_RCE_MASK 0x7000 /* revision code extension field */ ++#define SBIDH_RCE_SHIFT 8 ++#define SBCOREREV(sbidh) \ ++ ((((sbidh) & SBIDH_RCE_MASK) >> SBIDH_RCE_SHIFT) | ((sbidh) & SBIDH_RC_MASK)) ++#define SBIDH_CC_MASK 0x8ff0 /* core code */ ++#define SBIDH_CC_SHIFT 4 ++#define SBIDH_VC_MASK 0xffff0000 /* vendor code */ ++#define SBIDH_VC_SHIFT 16 ++ ++#define SB_COMMIT 0xfd8 /* update buffered registers value */ ++ ++/* vendor codes */ ++#define SB_VEND_BCM 0x4243 /* Broadcom's SB vendor code */ ++ ++#endif /* _SBCONFIG_H */ +diff --git a/drivers/net/wireless/ap6210/include/sbhnddma.h b/drivers/net/wireless/ap6210/include/sbhnddma.h +new file mode 100644 +index 0000000..40ebd8a +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbhnddma.h +@@ -0,0 +1,384 @@ ++/* ++ * Generic Broadcom Home Networking Division (HND) DMA engine HW interface ++ * This supports the following chips: BCM42xx, 44xx, 47xx . ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbhnddma.h 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#ifndef _sbhnddma_h_ ++#define _sbhnddma_h_ ++ ++/* DMA structure: ++ * support two DMA engines: 32 bits address or 64 bit addressing ++ * basic DMA register set is per channel(transmit or receive) ++ * a pair of channels is defined for convenience ++ */ ++ ++ ++/* 32 bits addressing */ ++ ++/* dma registers per channel(xmt or rcv) */ ++typedef volatile struct { ++ uint32 control; /* enable, et al */ ++ uint32 addr; /* descriptor ring base address (4K aligned) */ ++ uint32 ptr; /* last descriptor posted to chip */ ++ uint32 status; /* current active descriptor, et al */ ++} dma32regs_t; ++ ++typedef volatile struct { ++ dma32regs_t xmt; /* dma tx channel */ ++ dma32regs_t rcv; /* dma rx channel */ ++} dma32regp_t; ++ ++typedef volatile struct { /* diag access */ ++ uint32 fifoaddr; /* diag address */ ++ uint32 fifodatalow; /* low 32bits of data */ ++ uint32 fifodatahigh; /* high 32bits of data */ ++ uint32 pad; /* reserved */ ++} dma32diag_t; ++ ++/* ++ * DMA Descriptor ++ * Descriptors are only read by the hardware, never written back. ++ */ ++typedef volatile struct { ++ uint32 ctrl; /* misc control bits & bufcount */ ++ uint32 addr; /* data buffer address */ ++} dma32dd_t; ++ ++/* ++ * Each descriptor ring must be 4096byte aligned, and fit within a single 4096byte page. ++ */ ++#define D32RINGALIGN_BITS 12 ++#define D32MAXRINGSZ (1 << D32RINGALIGN_BITS) ++#define D32RINGALIGN (1 << D32RINGALIGN_BITS) ++ ++#define D32MAXDD (D32MAXRINGSZ / sizeof (dma32dd_t)) ++ ++/* transmit channel control */ ++#define XC_XE ((uint32)1 << 0) /* transmit enable */ ++#define XC_SE ((uint32)1 << 1) /* transmit suspend request */ ++#define XC_LE ((uint32)1 << 2) /* loopback enable */ ++#define XC_FL ((uint32)1 << 4) /* flush request */ ++#define XC_MR_MASK 0x000000C0 /* Multiple outstanding reads */ ++#define XC_MR_SHIFT 6 ++#define XC_PD ((uint32)1 << 11) /* parity check disable */ ++#define XC_AE ((uint32)3 << 16) /* address extension bits */ ++#define XC_AE_SHIFT 16 ++#define XC_BL_MASK 0x001C0000 /* BurstLen bits */ ++#define XC_BL_SHIFT 18 ++#define XC_PC_MASK 0x00E00000 /* Prefetch control */ ++#define XC_PC_SHIFT 21 ++#define XC_PT_MASK 0x03000000 /* Prefetch threshold */ ++#define XC_PT_SHIFT 24 ++ ++/* Multiple outstanding reads */ ++#define DMA_MR_1 0 ++#define DMA_MR_2 1 ++/* 2, 3: reserved */ ++ ++/* DMA Burst Length in bytes */ ++#define DMA_BL_16 0 ++#define DMA_BL_32 1 ++#define DMA_BL_64 2 ++#define DMA_BL_128 3 ++#define DMA_BL_256 4 ++#define DMA_BL_512 5 ++#define DMA_BL_1024 6 ++ ++/* Prefetch control */ ++#define DMA_PC_0 0 ++#define DMA_PC_4 1 ++#define DMA_PC_8 2 ++#define DMA_PC_16 3 ++/* others: reserved */ ++ ++/* Prefetch threshold */ ++#define DMA_PT_1 0 ++#define DMA_PT_2 1 ++#define DMA_PT_4 2 ++#define DMA_PT_8 3 ++ ++/* transmit descriptor table pointer */ ++#define XP_LD_MASK 0xfff /* last valid descriptor */ ++ ++/* transmit channel status */ ++#define XS_CD_MASK 0x0fff /* current descriptor pointer */ ++#define XS_XS_MASK 0xf000 /* transmit state */ ++#define XS_XS_SHIFT 12 ++#define XS_XS_DISABLED 0x0000 /* disabled */ ++#define XS_XS_ACTIVE 0x1000 /* active */ ++#define XS_XS_IDLE 0x2000 /* idle wait */ ++#define XS_XS_STOPPED 0x3000 /* stopped */ ++#define XS_XS_SUSP 0x4000 /* suspend pending */ ++#define XS_XE_MASK 0xf0000 /* transmit errors */ ++#define XS_XE_SHIFT 16 ++#define XS_XE_NOERR 0x00000 /* no error */ ++#define XS_XE_DPE 0x10000 /* descriptor protocol error */ ++#define XS_XE_DFU 0x20000 /* data fifo underrun */ ++#define XS_XE_BEBR 0x30000 /* bus error on buffer read */ ++#define XS_XE_BEDA 0x40000 /* bus error on descriptor access */ ++#define XS_AD_MASK 0xfff00000 /* active descriptor */ ++#define XS_AD_SHIFT 20 ++ ++/* receive channel control */ ++#define RC_RE ((uint32)1 << 0) /* receive enable */ ++#define RC_RO_MASK 0xfe /* receive frame offset */ ++#define RC_RO_SHIFT 1 ++#define RC_FM ((uint32)1 << 8) /* direct fifo receive (pio) mode */ ++#define RC_SH ((uint32)1 << 9) /* separate rx header descriptor enable */ ++#define RC_OC ((uint32)1 << 10) /* overflow continue */ ++#define RC_PD ((uint32)1 << 11) /* parity check disable */ ++#define RC_AE ((uint32)3 << 16) /* address extension bits */ ++#define RC_AE_SHIFT 16 ++#define RC_BL_MASK 0x001C0000 /* BurstLen bits */ ++#define RC_BL_SHIFT 18 ++#define RC_PC_MASK 0x00E00000 /* Prefetch control */ ++#define RC_PC_SHIFT 21 ++#define RC_PT_MASK 0x03000000 /* Prefetch threshold */ ++#define RC_PT_SHIFT 24 ++ ++/* receive descriptor table pointer */ ++#define RP_LD_MASK 0xfff /* last valid descriptor */ ++ ++/* receive channel status */ ++#define RS_CD_MASK 0x0fff /* current descriptor pointer */ ++#define RS_RS_MASK 0xf000 /* receive state */ ++#define RS_RS_SHIFT 12 ++#define RS_RS_DISABLED 0x0000 /* disabled */ ++#define RS_RS_ACTIVE 0x1000 /* active */ ++#define RS_RS_IDLE 0x2000 /* idle wait */ ++#define RS_RS_STOPPED 0x3000 /* reserved */ ++#define RS_RE_MASK 0xf0000 /* receive errors */ ++#define RS_RE_SHIFT 16 ++#define RS_RE_NOERR 0x00000 /* no error */ ++#define RS_RE_DPE 0x10000 /* descriptor protocol error */ ++#define RS_RE_DFO 0x20000 /* data fifo overflow */ ++#define RS_RE_BEBW 0x30000 /* bus error on buffer write */ ++#define RS_RE_BEDA 0x40000 /* bus error on descriptor access */ ++#define RS_AD_MASK 0xfff00000 /* active descriptor */ ++#define RS_AD_SHIFT 20 ++ ++/* fifoaddr */ ++#define FA_OFF_MASK 0xffff /* offset */ ++#define FA_SEL_MASK 0xf0000 /* select */ ++#define FA_SEL_SHIFT 16 ++#define FA_SEL_XDD 0x00000 /* transmit dma data */ ++#define FA_SEL_XDP 0x10000 /* transmit dma pointers */ ++#define FA_SEL_RDD 0x40000 /* receive dma data */ ++#define FA_SEL_RDP 0x50000 /* receive dma pointers */ ++#define FA_SEL_XFD 0x80000 /* transmit fifo data */ ++#define FA_SEL_XFP 0x90000 /* transmit fifo pointers */ ++#define FA_SEL_RFD 0xc0000 /* receive fifo data */ ++#define FA_SEL_RFP 0xd0000 /* receive fifo pointers */ ++#define FA_SEL_RSD 0xe0000 /* receive frame status data */ ++#define FA_SEL_RSP 0xf0000 /* receive frame status pointers */ ++ ++/* descriptor control flags */ ++#define CTRL_BC_MASK 0x00001fff /* buffer byte count, real data len must <= 4KB */ ++#define CTRL_AE ((uint32)3 << 16) /* address extension bits */ ++#define CTRL_AE_SHIFT 16 ++#define CTRL_PARITY ((uint32)3 << 18) /* parity bit */ ++#define CTRL_EOT ((uint32)1 << 28) /* end of descriptor table */ ++#define CTRL_IOC ((uint32)1 << 29) /* interrupt on completion */ ++#define CTRL_EOF ((uint32)1 << 30) /* end of frame */ ++#define CTRL_SOF ((uint32)1 << 31) /* start of frame */ ++ ++/* control flags in the range [27:20] are core-specific and not defined here */ ++#define CTRL_CORE_MASK 0x0ff00000 ++ ++/* 64 bits addressing */ ++ ++/* dma registers per channel(xmt or rcv) */ ++typedef volatile struct { ++ uint32 control; /* enable, et al */ ++ uint32 ptr; /* last descriptor posted to chip */ ++ uint32 addrlow; /* descriptor ring base address low 32-bits (8K aligned) */ ++ uint32 addrhigh; /* descriptor ring base address bits 63:32 (8K aligned) */ ++ uint32 status0; /* current descriptor, xmt state */ ++ uint32 status1; /* active descriptor, xmt error */ ++} dma64regs_t; ++ ++typedef volatile struct { ++ dma64regs_t tx; /* dma64 tx channel */ ++ dma64regs_t rx; /* dma64 rx channel */ ++} dma64regp_t; ++ ++typedef volatile struct { /* diag access */ ++ uint32 fifoaddr; /* diag address */ ++ uint32 fifodatalow; /* low 32bits of data */ ++ uint32 fifodatahigh; /* high 32bits of data */ ++ uint32 pad; /* reserved */ ++} dma64diag_t; ++ ++/* ++ * DMA Descriptor ++ * Descriptors are only read by the hardware, never written back. ++ */ ++typedef volatile struct { ++ uint32 ctrl1; /* misc control bits */ ++ uint32 ctrl2; /* buffer count and address extension */ ++ uint32 addrlow; /* memory address of the date buffer, bits 31:0 */ ++ uint32 addrhigh; /* memory address of the date buffer, bits 63:32 */ ++} dma64dd_t; ++ ++/* ++ * Each descriptor ring must be 8kB aligned, and fit within a contiguous 8kB physical addresss. ++ */ ++#define D64RINGALIGN_BITS 13 ++#define D64MAXRINGSZ (1 << D64RINGALIGN_BITS) ++#define D64RINGALIGN (1 << D64RINGALIGN_BITS) ++ ++#define D64MAXDD (D64MAXRINGSZ / sizeof (dma64dd_t)) ++ ++/* transmit channel control */ ++#define D64_XC_XE 0x00000001 /* transmit enable */ ++#define D64_XC_SE 0x00000002 /* transmit suspend request */ ++#define D64_XC_LE 0x00000004 /* loopback enable */ ++#define D64_XC_FL 0x00000010 /* flush request */ ++#define D64_XC_MR_MASK 0x000000C0 /* Multiple outstanding reads */ ++#define D64_XC_MR_SHIFT 6 ++#define D64_XC_PD 0x00000800 /* parity check disable */ ++#define D64_XC_AE 0x00030000 /* address extension bits */ ++#define D64_XC_AE_SHIFT 16 ++#define D64_XC_BL_MASK 0x001C0000 /* BurstLen bits */ ++#define D64_XC_BL_SHIFT 18 ++#define D64_XC_PC_MASK 0x00E00000 /* Prefetch control */ ++#define D64_XC_PC_SHIFT 21 ++#define D64_XC_PT_MASK 0x03000000 /* Prefetch threshold */ ++#define D64_XC_PT_SHIFT 24 ++ ++/* transmit descriptor table pointer */ ++#define D64_XP_LD_MASK 0x00001fff /* last valid descriptor */ ++ ++/* transmit channel status */ ++#define D64_XS0_CD_MASK 0x00001fff /* current descriptor pointer */ ++#define D64_XS0_XS_MASK 0xf0000000 /* transmit state */ ++#define D64_XS0_XS_SHIFT 28 ++#define D64_XS0_XS_DISABLED 0x00000000 /* disabled */ ++#define D64_XS0_XS_ACTIVE 0x10000000 /* active */ ++#define D64_XS0_XS_IDLE 0x20000000 /* idle wait */ ++#define D64_XS0_XS_STOPPED 0x30000000 /* stopped */ ++#define D64_XS0_XS_SUSP 0x40000000 /* suspend pending */ ++ ++#define D64_XS1_AD_MASK 0x00001fff /* active descriptor */ ++#define D64_XS1_XE_MASK 0xf0000000 /* transmit errors */ ++#define D64_XS1_XE_SHIFT 28 ++#define D64_XS1_XE_NOERR 0x00000000 /* no error */ ++#define D64_XS1_XE_DPE 0x10000000 /* descriptor protocol error */ ++#define D64_XS1_XE_DFU 0x20000000 /* data fifo underrun */ ++#define D64_XS1_XE_DTE 0x30000000 /* data transfer error */ ++#define D64_XS1_XE_DESRE 0x40000000 /* descriptor read error */ ++#define D64_XS1_XE_COREE 0x50000000 /* core error */ ++ ++/* receive channel control */ ++#define D64_RC_RE 0x00000001 /* receive enable */ ++#define D64_RC_RO_MASK 0x000000fe /* receive frame offset */ ++#define D64_RC_RO_SHIFT 1 ++#define D64_RC_FM 0x00000100 /* direct fifo receive (pio) mode */ ++#define D64_RC_SH 0x00000200 /* separate rx header descriptor enable */ ++#define D64_RC_OC 0x00000400 /* overflow continue */ ++#define D64_RC_PD 0x00000800 /* parity check disable */ ++#define D64_RC_AE 0x00030000 /* address extension bits */ ++#define D64_RC_AE_SHIFT 16 ++#define D64_RC_BL_MASK 0x001C0000 /* BurstLen bits */ ++#define D64_RC_BL_SHIFT 18 ++#define D64_RC_PC_MASK 0x00E00000 /* Prefetch control */ ++#define D64_RC_PC_SHIFT 21 ++#define D64_RC_PT_MASK 0x03000000 /* Prefetch threshold */ ++#define D64_RC_PT_SHIFT 24 ++ ++/* flags for dma controller */ ++#define DMA_CTRL_PEN (1 << 0) /* partity enable */ ++#define DMA_CTRL_ROC (1 << 1) /* rx overflow continue */ ++#define DMA_CTRL_RXMULTI (1 << 2) /* allow rx scatter to multiple descriptors */ ++#define DMA_CTRL_UNFRAMED (1 << 3) /* Unframed Rx/Tx data */ ++#define DMA_CTRL_USB_BOUNDRY4KB_WAR (1 << 4) ++#define DMA_CTRL_DMA_AVOIDANCE_WAR (1 << 5) /* DMA avoidance WAR for 4331 */ ++ ++/* receive descriptor table pointer */ ++#define D64_RP_LD_MASK 0x00001fff /* last valid descriptor */ ++ ++/* receive channel status */ ++#define D64_RS0_CD_MASK 0x00001fff /* current descriptor pointer */ ++#define D64_RS0_RS_MASK 0xf0000000 /* receive state */ ++#define D64_RS0_RS_SHIFT 28 ++#define D64_RS0_RS_DISABLED 0x00000000 /* disabled */ ++#define D64_RS0_RS_ACTIVE 0x10000000 /* active */ ++#define D64_RS0_RS_IDLE 0x20000000 /* idle wait */ ++#define D64_RS0_RS_STOPPED 0x30000000 /* stopped */ ++#define D64_RS0_RS_SUSP 0x40000000 /* suspend pending */ ++ ++#define D64_RS1_AD_MASK 0x0001ffff /* active descriptor */ ++#define D64_RS1_RE_MASK 0xf0000000 /* receive errors */ ++#define D64_RS1_RE_SHIFT 28 ++#define D64_RS1_RE_NOERR 0x00000000 /* no error */ ++#define D64_RS1_RE_DPO 0x10000000 /* descriptor protocol error */ ++#define D64_RS1_RE_DFU 0x20000000 /* data fifo overflow */ ++#define D64_RS1_RE_DTE 0x30000000 /* data transfer error */ ++#define D64_RS1_RE_DESRE 0x40000000 /* descriptor read error */ ++#define D64_RS1_RE_COREE 0x50000000 /* core error */ ++ ++/* fifoaddr */ ++#define D64_FA_OFF_MASK 0xffff /* offset */ ++#define D64_FA_SEL_MASK 0xf0000 /* select */ ++#define D64_FA_SEL_SHIFT 16 ++#define D64_FA_SEL_XDD 0x00000 /* transmit dma data */ ++#define D64_FA_SEL_XDP 0x10000 /* transmit dma pointers */ ++#define D64_FA_SEL_RDD 0x40000 /* receive dma data */ ++#define D64_FA_SEL_RDP 0x50000 /* receive dma pointers */ ++#define D64_FA_SEL_XFD 0x80000 /* transmit fifo data */ ++#define D64_FA_SEL_XFP 0x90000 /* transmit fifo pointers */ ++#define D64_FA_SEL_RFD 0xc0000 /* receive fifo data */ ++#define D64_FA_SEL_RFP 0xd0000 /* receive fifo pointers */ ++#define D64_FA_SEL_RSD 0xe0000 /* receive frame status data */ ++#define D64_FA_SEL_RSP 0xf0000 /* receive frame status pointers */ ++ ++/* descriptor control flags 1 */ ++#define D64_CTRL_COREFLAGS 0x0ff00000 /* core specific flags */ ++#define D64_CTRL1_EOT ((uint32)1 << 28) /* end of descriptor table */ ++#define D64_CTRL1_IOC ((uint32)1 << 29) /* interrupt on completion */ ++#define D64_CTRL1_EOF ((uint32)1 << 30) /* end of frame */ ++#define D64_CTRL1_SOF ((uint32)1 << 31) /* start of frame */ ++ ++/* descriptor control flags 2 */ ++#define D64_CTRL2_BC_MASK 0x00007fff /* buffer byte count. real data len must <= 16KB */ ++#define D64_CTRL2_AE 0x00030000 /* address extension bits */ ++#define D64_CTRL2_AE_SHIFT 16 ++#define D64_CTRL2_PARITY 0x00040000 /* parity bit */ ++ ++/* control flags in the range [27:20] are core-specific and not defined here */ ++#define D64_CTRL_CORE_MASK 0x0ff00000 ++ ++#define D64_RX_FRM_STS_LEN 0x0000ffff /* frame length mask */ ++#define D64_RX_FRM_STS_OVFL 0x00800000 /* RxOverFlow */ ++#define D64_RX_FRM_STS_DSCRCNT 0x0f000000 /* no. of descriptors used - 1, d11corerev >= 22 */ ++#define D64_RX_FRM_STS_DATATYPE 0xf0000000 /* core-dependent data type */ ++ ++/* receive frame status */ ++typedef volatile struct { ++ uint16 len; ++ uint16 flags; ++} dma_rxh_t; ++ ++#endif /* _sbhnddma_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/sbpcmcia.h b/drivers/net/wireless/ap6210/include/sbpcmcia.h +new file mode 100644 +index 0000000..c4e9d46 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbpcmcia.h +@@ -0,0 +1,113 @@ ++/* ++ * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbpcmcia.h 326494 2012-04-09 13:29:57Z $ ++ */ ++ ++#ifndef _SBPCMCIA_H ++#define _SBPCMCIA_H ++ ++/* All the addresses that are offsets in attribute space are divided ++ * by two to account for the fact that odd bytes are invalid in ++ * attribute space and our read/write routines make the space appear ++ * as if they didn't exist. Still we want to show the original numbers ++ * as documented in the hnd_pcmcia core manual. ++ */ ++ ++/* PCMCIA Function Configuration Registers */ ++#define PCMCIA_FCR (0x700 / 2) ++ ++#define FCR0_OFF 0 ++#define FCR1_OFF (0x40 / 2) ++#define FCR2_OFF (0x80 / 2) ++#define FCR3_OFF (0xc0 / 2) ++ ++#define PCMCIA_FCR0 (0x700 / 2) ++#define PCMCIA_FCR1 (0x740 / 2) ++#define PCMCIA_FCR2 (0x780 / 2) ++#define PCMCIA_FCR3 (0x7c0 / 2) ++ ++/* Standard PCMCIA FCR registers */ ++ ++#define PCMCIA_COR 0 ++ ++#define COR_RST 0x80 ++#define COR_LEV 0x40 ++#define COR_IRQEN 0x04 ++#define COR_BLREN 0x01 ++#define COR_FUNEN 0x01 ++ ++ ++#define PCICIA_FCSR (2 / 2) ++#define PCICIA_PRR (4 / 2) ++#define PCICIA_SCR (6 / 2) ++#define PCICIA_ESR (8 / 2) ++ ++ ++#define PCM_MEMOFF 0x0000 ++#define F0_MEMOFF 0x1000 ++#define F1_MEMOFF 0x2000 ++#define F2_MEMOFF 0x3000 ++#define F3_MEMOFF 0x4000 ++ ++/* Memory base in the function fcr's */ ++#define MEM_ADDR0 (0x728 / 2) ++#define MEM_ADDR1 (0x72a / 2) ++#define MEM_ADDR2 (0x72c / 2) ++ ++/* PCMCIA base plus Srom access in fcr0: */ ++#define PCMCIA_ADDR0 (0x072e / 2) ++#define PCMCIA_ADDR1 (0x0730 / 2) ++#define PCMCIA_ADDR2 (0x0732 / 2) ++ ++#define MEM_SEG (0x0734 / 2) ++#define SROM_CS (0x0736 / 2) ++#define SROM_DATAL (0x0738 / 2) ++#define SROM_DATAH (0x073a / 2) ++#define SROM_ADDRL (0x073c / 2) ++#define SROM_ADDRH (0x073e / 2) ++#define SROM_INFO2 (0x0772 / 2) /* Corerev >= 2 && <= 5 */ ++#define SROM_INFO (0x07be / 2) /* Corerev >= 6 */ ++ ++/* Values for srom_cs: */ ++#define SROM_IDLE 0 ++#define SROM_WRITE 1 ++#define SROM_READ 2 ++#define SROM_WEN 4 ++#define SROM_WDS 7 ++#define SROM_DONE 8 ++ ++/* Fields in srom_info: */ ++#define SRI_SZ_MASK 0x03 ++#define SRI_BLANK 0x04 ++#define SRI_OTP 0x80 ++ ++ ++/* sbtmstatelow */ ++#define SBTML_INT_ACK 0x40000 /* ack the sb interrupt */ ++#define SBTML_INT_EN 0x20000 /* enable sb interrupt */ ++ ++/* sbtmstatehigh */ ++#define SBTMH_INT_STATUS 0x40000 /* sb interrupt status */ ++ ++#endif /* _SBPCMCIA_H */ +diff --git a/drivers/net/wireless/ap6210/include/sbsdio.h b/drivers/net/wireless/ap6210/include/sbsdio.h +new file mode 100644 +index 0000000..8d0139d +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbsdio.h +@@ -0,0 +1,188 @@ ++/* ++ * SDIO device core hardware definitions. ++ * sdio is a portion of the pcmcia core in core rev 3 - rev 8 ++ * ++ * SDIO core support 1bit, 4 bit SDIO mode as well as SPI mode. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbsdio.h 361940 2012-10-10 08:32:12Z $ ++ */ ++ ++#ifndef _SBSDIO_H ++#define _SBSDIO_H ++ ++#define SBSDIO_NUM_FUNCTION 3 /* as of sdiod rev 0, supports 3 functions */ ++ ++/* function 1 miscellaneous registers */ ++#define SBSDIO_SPROM_CS 0x10000 /* sprom command and status */ ++#define SBSDIO_SPROM_INFO 0x10001 /* sprom info register */ ++#define SBSDIO_SPROM_DATA_LOW 0x10002 /* sprom indirect access data byte 0 */ ++#define SBSDIO_SPROM_DATA_HIGH 0x10003 /* sprom indirect access data byte 1 */ ++#define SBSDIO_SPROM_ADDR_LOW 0x10004 /* sprom indirect access addr byte 0 */ ++#define SBSDIO_SPROM_ADDR_HIGH 0x10005 /* sprom indirect access addr byte 0 */ ++#define SBSDIO_CHIP_CTRL_DATA 0x10006 /* xtal_pu (gpio) output */ ++#define SBSDIO_CHIP_CTRL_EN 0x10007 /* xtal_pu (gpio) enable */ ++#define SBSDIO_WATERMARK 0x10008 /* rev < 7, watermark for sdio device */ ++#define SBSDIO_DEVICE_CTL 0x10009 /* control busy signal generation */ ++ ++/* registers introduced in rev 8, some content (mask/bits) defs in sbsdpcmdev.h */ ++#define SBSDIO_FUNC1_SBADDRLOW 0x1000A /* SB Address Window Low (b15) */ ++#define SBSDIO_FUNC1_SBADDRMID 0x1000B /* SB Address Window Mid (b23:b16) */ ++#define SBSDIO_FUNC1_SBADDRHIGH 0x1000C /* SB Address Window High (b31:b24) */ ++#define SBSDIO_FUNC1_FRAMECTRL 0x1000D /* Frame Control (frame term/abort) */ ++#define SBSDIO_FUNC1_CHIPCLKCSR 0x1000E /* ChipClockCSR (ALP/HT ctl/status) */ ++#define SBSDIO_FUNC1_SDIOPULLUP 0x1000F /* SdioPullUp (on cmd, d0-d2) */ ++#define SBSDIO_FUNC1_WFRAMEBCLO 0x10019 /* Write Frame Byte Count Low */ ++#define SBSDIO_FUNC1_WFRAMEBCHI 0x1001A /* Write Frame Byte Count High */ ++#define SBSDIO_FUNC1_RFRAMEBCLO 0x1001B /* Read Frame Byte Count Low */ ++#define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C /* Read Frame Byte Count High */ ++#define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D /* MesBusyCtl at 0x1001D (rev 11) */ ++ ++#define SBSDIO_FUNC1_MISC_REG_START 0x10000 /* f1 misc register start */ ++#define SBSDIO_FUNC1_MISC_REG_LIMIT 0x1001C /* f1 misc register end */ ++ ++/* Sdio Core Rev 12 */ ++#define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E ++#define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK 0x1 ++#define SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT 0 ++#define SBSDIO_FUNC1_WCTRL_HTWAIT_MASK 0x2 ++#define SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT 1 ++#define SBSDIO_FUNC1_SLEEPCSR 0x1001F ++#define SBSDIO_FUNC1_SLEEPCSR_KSO_MASK 0x1 ++#define SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT 0 ++#define SBSDIO_FUNC1_SLEEPCSR_KSO_EN 1 ++#define SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK 0x2 ++#define SBSDIO_FUNC1_SLEEPCSR_DEVON_SHIFT 1 ++ ++/* SBSDIO_SPROM_CS */ ++#define SBSDIO_SPROM_IDLE 0 ++#define SBSDIO_SPROM_WRITE 1 ++#define SBSDIO_SPROM_READ 2 ++#define SBSDIO_SPROM_WEN 4 ++#define SBSDIO_SPROM_WDS 7 ++#define SBSDIO_SPROM_DONE 8 ++ ++/* SBSDIO_SPROM_INFO */ ++#define SROM_SZ_MASK 0x03 /* SROM size, 1: 4k, 2: 16k */ ++#define SROM_BLANK 0x04 /* depreciated in corerev 6 */ ++#define SROM_OTP 0x80 /* OTP present */ ++ ++/* SBSDIO_CHIP_CTRL */ ++#define SBSDIO_CHIP_CTRL_XTAL 0x01 /* or'd with onchip xtal_pu, ++ * 1: power on oscillator ++ * (for 4318 only) ++ */ ++/* SBSDIO_WATERMARK */ ++#define SBSDIO_WATERMARK_MASK 0x7f /* number of words - 1 for sd device ++ * to wait before sending data to host ++ */ ++ ++/* SBSDIO_MESBUSYCTRL */ ++/* When RX FIFO has less entries than this & MBE is set ++ * => busy signal is asserted between data blocks. ++*/ ++#define SBSDIO_MESBUSYCTRL_MASK 0x7f ++ ++/* SBSDIO_DEVICE_CTL */ ++#define SBSDIO_DEVCTL_SETBUSY 0x01 /* 1: device will assert busy signal when ++ * receiving CMD53 ++ */ ++#define SBSDIO_DEVCTL_SPI_INTR_SYNC 0x02 /* 1: assertion of sdio interrupt is ++ * synchronous to the sdio clock ++ */ ++#define SBSDIO_DEVCTL_CA_INT_ONLY 0x04 /* 1: mask all interrupts to host ++ * except the chipActive (rev 8) ++ */ ++#define SBSDIO_DEVCTL_PADS_ISO 0x08 /* 1: isolate internal sdio signals, put ++ * external pads in tri-state; requires ++ * sdio bus power cycle to clear (rev 9) ++ */ ++#define SBSDIO_DEVCTL_SB_RST_CTL 0x30 /* Force SD->SB reset mapping (rev 11) */ ++#define SBSDIO_DEVCTL_RST_CORECTL 0x00 /* Determined by CoreControl bit */ ++#define SBSDIO_DEVCTL_RST_BPRESET 0x10 /* Force backplane reset */ ++#define SBSDIO_DEVCTL_RST_NOBPRESET 0x20 /* Force no backplane reset */ ++#define SBSDIO_DEVCTL_EN_F2_BLK_WATERMARK 0x10 /* Enable function 2 tx for each block */ ++ ++ ++/* SBSDIO_FUNC1_CHIPCLKCSR */ ++#define SBSDIO_FORCE_ALP 0x01 /* Force ALP request to backplane */ ++#define SBSDIO_FORCE_HT 0x02 /* Force HT request to backplane */ ++#define SBSDIO_FORCE_ILP 0x04 /* Force ILP request to backplane */ ++#define SBSDIO_ALP_AVAIL_REQ 0x08 /* Make ALP ready (power up xtal) */ ++#define SBSDIO_HT_AVAIL_REQ 0x10 /* Make HT ready (power up PLL) */ ++#define SBSDIO_FORCE_HW_CLKREQ_OFF 0x20 /* Squelch clock requests from HW */ ++#define SBSDIO_ALP_AVAIL 0x40 /* Status: ALP is ready */ ++#define SBSDIO_HT_AVAIL 0x80 /* Status: HT is ready */ ++/* In rev8, actual avail bits followed original docs */ ++#define SBSDIO_Rev8_HT_AVAIL 0x40 ++#define SBSDIO_Rev8_ALP_AVAIL 0x80 ++#define SBSDIO_CSR_MASK 0x1F ++ ++#define SBSDIO_AVBITS (SBSDIO_HT_AVAIL | SBSDIO_ALP_AVAIL) ++#define SBSDIO_ALPAV(regval) ((regval) & SBSDIO_AVBITS) ++#define SBSDIO_HTAV(regval) (((regval) & SBSDIO_AVBITS) == SBSDIO_AVBITS) ++#define SBSDIO_ALPONLY(regval) (SBSDIO_ALPAV(regval) && !SBSDIO_HTAV(regval)) ++#define SBSDIO_CLKAV(regval, alponly) (SBSDIO_ALPAV(regval) && \ ++ (alponly ? 1 : SBSDIO_HTAV(regval))) ++ ++/* SBSDIO_FUNC1_SDIOPULLUP */ ++#define SBSDIO_PULLUP_D0 0x01 /* Enable D0/MISO pullup */ ++#define SBSDIO_PULLUP_D1 0x02 /* Enable D1/INT# pullup */ ++#define SBSDIO_PULLUP_D2 0x04 /* Enable D2 pullup */ ++#define SBSDIO_PULLUP_CMD 0x08 /* Enable CMD/MOSI pullup */ ++#define SBSDIO_PULLUP_ALL 0x0f /* All valid bits */ ++ ++/* function 1 OCP space */ ++#define SBSDIO_SB_OFT_ADDR_MASK 0x07FFF /* sb offset addr is <= 15 bits, 32k */ ++#define SBSDIO_SB_OFT_ADDR_LIMIT 0x08000 ++#define SBSDIO_SB_ACCESS_2_4B_FLAG 0x08000 /* with b15, maps to 32-bit SB access */ ++ ++/* some duplication with sbsdpcmdev.h here */ ++/* valid bits in SBSDIO_FUNC1_SBADDRxxx regs */ ++#define SBSDIO_SBADDRLOW_MASK 0x80 /* Valid bits in SBADDRLOW */ ++#define SBSDIO_SBADDRMID_MASK 0xff /* Valid bits in SBADDRMID */ ++#define SBSDIO_SBADDRHIGH_MASK 0xffU /* Valid bits in SBADDRHIGH */ ++#define SBSDIO_SBWINDOW_MASK 0xffff8000 /* Address bits from SBADDR regs */ ++ ++/* direct(mapped) cis space */ ++#define SBSDIO_CIS_BASE_COMMON 0x1000 /* MAPPED common CIS address */ ++#define SBSDIO_CIS_SIZE_LIMIT 0x200 /* maximum bytes in one CIS */ ++#define SBSDIO_OTP_CIS_SIZE_LIMIT 0x078 /* maximum bytes OTP CIS */ ++ ++#define SBSDIO_CIS_OFT_ADDR_MASK 0x1FFFF /* cis offset addr is < 17 bits */ ++ ++#define SBSDIO_CIS_MANFID_TUPLE_LEN 6 /* manfid tuple length, include tuple, ++ * link bytes ++ */ ++ ++/* indirect cis access (in sprom) */ ++#define SBSDIO_SPROM_CIS_OFFSET 0x8 /* 8 control bytes first, CIS starts from ++ * 8th byte ++ */ ++ ++#define SBSDIO_BYTEMODE_DATALEN_MAX 64 /* sdio byte mode: maximum length of one ++ * data comamnd ++ */ ++ ++#define SBSDIO_CORE_ADDR_MASK 0x1FFFF /* sdio core function one address mask */ ++ ++#endif /* _SBSDIO_H */ +diff --git a/drivers/net/wireless/ap6210/include/sbsdpcmdev.h b/drivers/net/wireless/ap6210/include/sbsdpcmdev.h +new file mode 100644 +index 0000000..10c7401 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbsdpcmdev.h +@@ -0,0 +1,295 @@ ++/* ++ * Broadcom SiliconBackplane SDIO/PCMCIA hardware-specific ++ * device core support ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbsdpcmdev.h 347614 2012-07-27 10:24:51Z $ ++ */ ++ ++#ifndef _sbsdpcmdev_h_ ++#define _sbsdpcmdev_h_ ++ ++/* cpp contortions to concatenate w/arg prescan */ ++#ifndef PAD ++#define _PADLINE(line) pad ## line ++#define _XSTR(line) _PADLINE(line) ++#define PAD _XSTR(__LINE__) ++#endif /* PAD */ ++ ++ ++typedef volatile struct { ++ dma64regs_t xmt; /* dma tx */ ++ uint32 PAD[2]; ++ dma64regs_t rcv; /* dma rx */ ++ uint32 PAD[2]; ++} dma64p_t; ++ ++/* dma64 sdiod corerev >= 1 */ ++typedef volatile struct { ++ dma64p_t dma64regs[2]; ++ dma64diag_t dmafifo; /* DMA Diagnostic Regs, 0x280-0x28c */ ++ uint32 PAD[92]; ++} sdiodma64_t; ++ ++/* dma32 sdiod corerev == 0 */ ++typedef volatile struct { ++ dma32regp_t dma32regs[2]; /* dma tx & rx, 0x200-0x23c */ ++ dma32diag_t dmafifo; /* DMA Diagnostic Regs, 0x240-0x24c */ ++ uint32 PAD[108]; ++} sdiodma32_t; ++ ++/* dma32 regs for pcmcia core */ ++typedef volatile struct { ++ dma32regp_t dmaregs; /* DMA Regs, 0x200-0x21c, rev8 */ ++ dma32diag_t dmafifo; /* DMA Diagnostic Regs, 0x220-0x22c */ ++ uint32 PAD[116]; ++} pcmdma32_t; ++ ++/* core registers */ ++typedef volatile struct { ++ uint32 corecontrol; /* CoreControl, 0x000, rev8 */ ++ uint32 corestatus; /* CoreStatus, 0x004, rev8 */ ++ uint32 PAD[1]; ++ uint32 biststatus; /* BistStatus, 0x00c, rev8 */ ++ ++ /* PCMCIA access */ ++ uint16 pcmciamesportaladdr; /* PcmciaMesPortalAddr, 0x010, rev8 */ ++ uint16 PAD[1]; ++ uint16 pcmciamesportalmask; /* PcmciaMesPortalMask, 0x014, rev8 */ ++ uint16 PAD[1]; ++ uint16 pcmciawrframebc; /* PcmciaWrFrameBC, 0x018, rev8 */ ++ uint16 PAD[1]; ++ uint16 pcmciaunderflowtimer; /* PcmciaUnderflowTimer, 0x01c, rev8 */ ++ uint16 PAD[1]; ++ ++ /* interrupt */ ++ uint32 intstatus; /* IntStatus, 0x020, rev8 */ ++ uint32 hostintmask; /* IntHostMask, 0x024, rev8 */ ++ uint32 intmask; /* IntSbMask, 0x028, rev8 */ ++ uint32 sbintstatus; /* SBIntStatus, 0x02c, rev8 */ ++ uint32 sbintmask; /* SBIntMask, 0x030, rev8 */ ++ uint32 funcintmask; /* SDIO Function Interrupt Mask, SDIO rev4 */ ++ uint32 PAD[2]; ++ uint32 tosbmailbox; /* ToSBMailbox, 0x040, rev8 */ ++ uint32 tohostmailbox; /* ToHostMailbox, 0x044, rev8 */ ++ uint32 tosbmailboxdata; /* ToSbMailboxData, 0x048, rev8 */ ++ uint32 tohostmailboxdata; /* ToHostMailboxData, 0x04c, rev8 */ ++ ++ /* synchronized access to registers in SDIO clock domain */ ++ uint32 sdioaccess; /* SdioAccess, 0x050, rev8 */ ++ uint32 PAD[3]; ++ ++ /* PCMCIA frame control */ ++ uint8 pcmciaframectrl; /* pcmciaFrameCtrl, 0x060, rev8 */ ++ uint8 PAD[3]; ++ uint8 pcmciawatermark; /* pcmciaWaterMark, 0x064, rev8 */ ++ uint8 PAD[155]; ++ ++ /* interrupt batching control */ ++ uint32 intrcvlazy; /* IntRcvLazy, 0x100, rev8 */ ++ uint32 PAD[3]; ++ ++ /* counters */ ++ uint32 cmd52rd; /* Cmd52RdCount, 0x110, rev8, SDIO: cmd52 reads */ ++ uint32 cmd52wr; /* Cmd52WrCount, 0x114, rev8, SDIO: cmd52 writes */ ++ uint32 cmd53rd; /* Cmd53RdCount, 0x118, rev8, SDIO: cmd53 reads */ ++ uint32 cmd53wr; /* Cmd53WrCount, 0x11c, rev8, SDIO: cmd53 writes */ ++ uint32 abort; /* AbortCount, 0x120, rev8, SDIO: aborts */ ++ uint32 datacrcerror; /* DataCrcErrorCount, 0x124, rev8, SDIO: frames w/bad CRC */ ++ uint32 rdoutofsync; /* RdOutOfSyncCount, 0x128, rev8, SDIO/PCMCIA: Rd Frm OOS */ ++ uint32 wroutofsync; /* RdOutOfSyncCount, 0x12c, rev8, SDIO/PCMCIA: Wr Frm OOS */ ++ uint32 writebusy; /* WriteBusyCount, 0x130, rev8, SDIO: dev asserted "busy" */ ++ uint32 readwait; /* ReadWaitCount, 0x134, rev8, SDIO: read: no data avail */ ++ uint32 readterm; /* ReadTermCount, 0x138, rev8, SDIO: rd frm terminates */ ++ uint32 writeterm; /* WriteTermCount, 0x13c, rev8, SDIO: wr frm terminates */ ++ uint32 PAD[40]; ++ uint32 clockctlstatus; /* ClockCtlStatus, 0x1e0, rev8 */ ++ uint32 PAD[7]; ++ ++ /* DMA engines */ ++ volatile union { ++ pcmdma32_t pcm32; ++ sdiodma32_t sdiod32; ++ sdiodma64_t sdiod64; ++ } dma; ++ ++ /* SDIO/PCMCIA CIS region */ ++ char cis[512]; /* 512 byte CIS, 0x400-0x5ff, rev6 */ ++ ++ /* PCMCIA function control registers */ ++ char pcmciafcr[256]; /* PCMCIA FCR, 0x600-6ff, rev6 */ ++ uint16 PAD[55]; ++ ++ /* PCMCIA backplane access */ ++ uint16 backplanecsr; /* BackplaneCSR, 0x76E, rev6 */ ++ uint16 backplaneaddr0; /* BackplaneAddr0, 0x770, rev6 */ ++ uint16 backplaneaddr1; /* BackplaneAddr1, 0x772, rev6 */ ++ uint16 backplaneaddr2; /* BackplaneAddr2, 0x774, rev6 */ ++ uint16 backplaneaddr3; /* BackplaneAddr3, 0x776, rev6 */ ++ uint16 backplanedata0; /* BackplaneData0, 0x778, rev6 */ ++ uint16 backplanedata1; /* BackplaneData1, 0x77a, rev6 */ ++ uint16 backplanedata2; /* BackplaneData2, 0x77c, rev6 */ ++ uint16 backplanedata3; /* BackplaneData3, 0x77e, rev6 */ ++ uint16 PAD[31]; ++ ++ /* sprom "size" & "blank" info */ ++ uint16 spromstatus; /* SPROMStatus, 0x7BE, rev2 */ ++ uint32 PAD[464]; ++ ++ /* Sonics SiliconBackplane registers */ ++ sbconfig_t sbconfig; /* SbConfig Regs, 0xf00-0xfff, rev8 */ ++} sdpcmd_regs_t; ++ ++/* corecontrol */ ++#define CC_CISRDY (1 << 0) /* CIS Ready */ ++#define CC_BPRESEN (1 << 1) /* CCCR RES signal causes backplane reset */ ++#define CC_F2RDY (1 << 2) /* set CCCR IOR2 bit */ ++#define CC_CLRPADSISO (1 << 3) /* clear SDIO pads isolation bit (rev 11) */ ++#define CC_XMTDATAAVAIL_MODE (1 << 4) /* data avail generates an interrupt */ ++#define CC_XMTDATAAVAIL_CTRL (1 << 5) /* data avail interrupt ctrl */ ++ ++/* corestatus */ ++#define CS_PCMCIAMODE (1 << 0) /* Device Mode; 0=SDIO, 1=PCMCIA */ ++#define CS_SMARTDEV (1 << 1) /* 1=smartDev enabled */ ++#define CS_F2ENABLED (1 << 2) /* 1=host has enabled the device */ ++ ++#define PCMCIA_MES_PA_MASK 0x7fff /* PCMCIA Message Portal Address Mask */ ++#define PCMCIA_MES_PM_MASK 0x7fff /* PCMCIA Message Portal Mask Mask */ ++#define PCMCIA_WFBC_MASK 0xffff /* PCMCIA Write Frame Byte Count Mask */ ++#define PCMCIA_UT_MASK 0x07ff /* PCMCIA Underflow Timer Mask */ ++ ++/* intstatus */ ++#define I_SMB_SW0 (1 << 0) /* To SB Mail S/W interrupt 0 */ ++#define I_SMB_SW1 (1 << 1) /* To SB Mail S/W interrupt 1 */ ++#define I_SMB_SW2 (1 << 2) /* To SB Mail S/W interrupt 2 */ ++#define I_SMB_SW3 (1 << 3) /* To SB Mail S/W interrupt 3 */ ++#define I_SMB_SW_MASK 0x0000000f /* To SB Mail S/W interrupts mask */ ++#define I_SMB_SW_SHIFT 0 /* To SB Mail S/W interrupts shift */ ++#define I_HMB_SW0 (1 << 4) /* To Host Mail S/W interrupt 0 */ ++#define I_HMB_SW1 (1 << 5) /* To Host Mail S/W interrupt 1 */ ++#define I_HMB_SW2 (1 << 6) /* To Host Mail S/W interrupt 2 */ ++#define I_HMB_SW3 (1 << 7) /* To Host Mail S/W interrupt 3 */ ++#define I_HMB_SW_MASK 0x000000f0 /* To Host Mail S/W interrupts mask */ ++#define I_HMB_SW_SHIFT 4 /* To Host Mail S/W interrupts shift */ ++#define I_WR_OOSYNC (1 << 8) /* Write Frame Out Of Sync */ ++#define I_RD_OOSYNC (1 << 9) /* Read Frame Out Of Sync */ ++#define I_PC (1 << 10) /* descriptor error */ ++#define I_PD (1 << 11) /* data error */ ++#define I_DE (1 << 12) /* Descriptor protocol Error */ ++#define I_RU (1 << 13) /* Receive descriptor Underflow */ ++#define I_RO (1 << 14) /* Receive fifo Overflow */ ++#define I_XU (1 << 15) /* Transmit fifo Underflow */ ++#define I_RI (1 << 16) /* Receive Interrupt */ ++#define I_BUSPWR (1 << 17) /* SDIO Bus Power Change (rev 9) */ ++#define I_XMTDATA_AVAIL (1 << 23) /* bits in fifo */ ++#define I_XI (1 << 24) /* Transmit Interrupt */ ++#define I_RF_TERM (1 << 25) /* Read Frame Terminate */ ++#define I_WF_TERM (1 << 26) /* Write Frame Terminate */ ++#define I_PCMCIA_XU (1 << 27) /* PCMCIA Transmit FIFO Underflow */ ++#define I_SBINT (1 << 28) /* sbintstatus Interrupt */ ++#define I_CHIPACTIVE (1 << 29) /* chip transitioned from doze to active state */ ++#define I_SRESET (1 << 30) /* CCCR RES interrupt */ ++#define I_IOE2 (1U << 31) /* CCCR IOE2 Bit Changed */ ++#define I_ERRORS (I_PC | I_PD | I_DE | I_RU | I_RO | I_XU) /* DMA Errors */ ++#define I_DMA (I_RI | I_XI | I_ERRORS) ++ ++/* sbintstatus */ ++#define I_SB_SERR (1 << 8) /* Backplane SError (write) */ ++#define I_SB_RESPERR (1 << 9) /* Backplane Response Error (read) */ ++#define I_SB_SPROMERR (1 << 10) /* Error accessing the sprom */ ++ ++/* sdioaccess */ ++#define SDA_DATA_MASK 0x000000ff /* Read/Write Data Mask */ ++#define SDA_ADDR_MASK 0x000fff00 /* Read/Write Address Mask */ ++#define SDA_ADDR_SHIFT 8 /* Read/Write Address Shift */ ++#define SDA_WRITE 0x01000000 /* Write bit */ ++#define SDA_READ 0x00000000 /* Write bit cleared for Read */ ++#define SDA_BUSY 0x80000000 /* Busy bit */ ++ ++/* sdioaccess-accessible register address spaces */ ++#define SDA_CCCR_SPACE 0x000 /* sdioAccess CCCR register space */ ++#define SDA_F1_FBR_SPACE 0x100 /* sdioAccess F1 FBR register space */ ++#define SDA_F2_FBR_SPACE 0x200 /* sdioAccess F2 FBR register space */ ++#define SDA_F1_REG_SPACE 0x300 /* sdioAccess F1 core-specific register space */ ++ ++/* SDA_F1_REG_SPACE sdioaccess-accessible F1 reg space register offsets */ ++#define SDA_CHIPCONTROLDATA 0x006 /* ChipControlData */ ++#define SDA_CHIPCONTROLENAB 0x007 /* ChipControlEnable */ ++#define SDA_F2WATERMARK 0x008 /* Function 2 Watermark */ ++#define SDA_DEVICECONTROL 0x009 /* DeviceControl */ ++#define SDA_SBADDRLOW 0x00a /* SbAddrLow */ ++#define SDA_SBADDRMID 0x00b /* SbAddrMid */ ++#define SDA_SBADDRHIGH 0x00c /* SbAddrHigh */ ++#define SDA_FRAMECTRL 0x00d /* FrameCtrl */ ++#define SDA_CHIPCLOCKCSR 0x00e /* ChipClockCSR */ ++#define SDA_SDIOPULLUP 0x00f /* SdioPullUp */ ++#define SDA_SDIOWRFRAMEBCLOW 0x019 /* SdioWrFrameBCLow */ ++#define SDA_SDIOWRFRAMEBCHIGH 0x01a /* SdioWrFrameBCHigh */ ++#define SDA_SDIORDFRAMEBCLOW 0x01b /* SdioRdFrameBCLow */ ++#define SDA_SDIORDFRAMEBCHIGH 0x01c /* SdioRdFrameBCHigh */ ++ ++/* SDA_F2WATERMARK */ ++#define SDA_F2WATERMARK_MASK 0x7f /* F2Watermark Mask */ ++ ++/* SDA_SBADDRLOW */ ++#define SDA_SBADDRLOW_MASK 0x80 /* SbAddrLow Mask */ ++ ++/* SDA_SBADDRMID */ ++#define SDA_SBADDRMID_MASK 0xff /* SbAddrMid Mask */ ++ ++/* SDA_SBADDRHIGH */ ++#define SDA_SBADDRHIGH_MASK 0xff /* SbAddrHigh Mask */ ++ ++/* SDA_FRAMECTRL */ ++#define SFC_RF_TERM (1 << 0) /* Read Frame Terminate */ ++#define SFC_WF_TERM (1 << 1) /* Write Frame Terminate */ ++#define SFC_CRC4WOOS (1 << 2) /* HW reports CRC error for write out of sync */ ++#define SFC_ABORTALL (1 << 3) /* Abort cancels all in-progress frames */ ++ ++/* pcmciaframectrl */ ++#define PFC_RF_TERM (1 << 0) /* Read Frame Terminate */ ++#define PFC_WF_TERM (1 << 1) /* Write Frame Terminate */ ++ ++/* intrcvlazy */ ++#define IRL_TO_MASK 0x00ffffff /* timeout */ ++#define IRL_FC_MASK 0xff000000 /* frame count */ ++#define IRL_FC_SHIFT 24 /* frame count */ ++ ++/* rx header */ ++typedef volatile struct { ++ uint16 len; ++ uint16 flags; ++} sdpcmd_rxh_t; ++ ++/* rx header flags */ ++#define RXF_CRC 0x0001 /* CRC error detected */ ++#define RXF_WOOS 0x0002 /* write frame out of sync */ ++#define RXF_WF_TERM 0x0004 /* write frame terminated */ ++#define RXF_ABORT 0x0008 /* write frame aborted */ ++#define RXF_DISCARD (RXF_CRC | RXF_WOOS | RXF_WF_TERM | RXF_ABORT) /* bad frame */ ++ ++/* HW frame tag */ ++#define SDPCM_FRAMETAG_LEN 4 /* HW frametag: 2 bytes len, 2 bytes check val */ ++ ++#define SDPCM_HWEXT_LEN 8 ++ ++#endif /* _sbsdpcmdev_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/sbsocram.h b/drivers/net/wireless/ap6210/include/sbsocram.h +new file mode 100644 +index 0000000..6455f2b +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sbsocram.h +@@ -0,0 +1,199 @@ ++/* ++ * BCM47XX Sonics SiliconBackplane embedded ram core ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbsocram.h 271781 2011-07-13 20:00:06Z $ ++ */ ++ ++#ifndef _SBSOCRAM_H ++#define _SBSOCRAM_H ++ ++#ifndef _LANGUAGE_ASSEMBLY ++ ++/* cpp contortions to concatenate w/arg prescan */ ++#ifndef PAD ++#define _PADLINE(line) pad ## line ++#define _XSTR(line) _PADLINE(line) ++#define PAD _XSTR(__LINE__) ++#endif /* PAD */ ++ ++/* Memcsocram core registers */ ++typedef volatile struct sbsocramregs { ++ uint32 coreinfo; ++ uint32 bwalloc; ++ uint32 extracoreinfo; ++ uint32 biststat; ++ uint32 bankidx; ++ uint32 standbyctrl; ++ ++ uint32 errlogstatus; /* rev 6 */ ++ uint32 errlogaddr; /* rev 6 */ ++ /* used for patching rev 3 & 5 */ ++ uint32 cambankidx; ++ uint32 cambankstandbyctrl; ++ uint32 cambankpatchctrl; ++ uint32 cambankpatchtblbaseaddr; ++ uint32 cambankcmdreg; ++ uint32 cambankdatareg; ++ uint32 cambankmaskreg; ++ uint32 PAD[1]; ++ uint32 bankinfo; /* corev 8 */ ++ uint32 PAD[15]; ++ uint32 extmemconfig; ++ uint32 extmemparitycsr; ++ uint32 extmemparityerrdata; ++ uint32 extmemparityerrcnt; ++ uint32 extmemwrctrlandsize; ++ uint32 PAD[84]; ++ uint32 workaround; ++ uint32 pwrctl; /* corerev >= 2 */ ++ uint32 PAD[133]; ++ uint32 sr_control; /* corerev >= 15 */ ++ uint32 sr_status; /* corerev >= 15 */ ++ uint32 sr_address; /* corerev >= 15 */ ++ uint32 sr_data; /* corerev >= 15 */ ++} sbsocramregs_t; ++ ++#endif /* _LANGUAGE_ASSEMBLY */ ++ ++/* Register offsets */ ++#define SR_COREINFO 0x00 ++#define SR_BWALLOC 0x04 ++#define SR_BISTSTAT 0x0c ++#define SR_BANKINDEX 0x10 ++#define SR_BANKSTBYCTL 0x14 ++#define SR_PWRCTL 0x1e8 ++ ++/* Coreinfo register */ ++#define SRCI_PT_MASK 0x00070000 /* corerev >= 6; port type[18:16] */ ++#define SRCI_PT_SHIFT 16 ++/* port types : SRCI_PT__ */ ++#define SRCI_PT_OCP_OCP 0 ++#define SRCI_PT_AXI_OCP 1 ++#define SRCI_PT_ARM7AHB_OCP 2 ++#define SRCI_PT_CM3AHB_OCP 3 ++#define SRCI_PT_AXI_AXI 4 ++#define SRCI_PT_AHB_AXI 5 ++/* corerev >= 3 */ ++#define SRCI_LSS_MASK 0x00f00000 ++#define SRCI_LSS_SHIFT 20 ++#define SRCI_LRS_MASK 0x0f000000 ++#define SRCI_LRS_SHIFT 24 ++ ++/* In corerev 0, the memory size is 2 to the power of the ++ * base plus 16 plus to the contents of the memsize field plus 1. ++ */ ++#define SRCI_MS0_MASK 0xf ++#define SR_MS0_BASE 16 ++ ++/* ++ * In corerev 1 the bank size is 2 ^ the bank size field plus 14, ++ * the memory size is number of banks times bank size. ++ * The same applies to rom size. ++ */ ++#define SRCI_ROMNB_MASK 0xf000 ++#define SRCI_ROMNB_SHIFT 12 ++#define SRCI_ROMBSZ_MASK 0xf00 ++#define SRCI_ROMBSZ_SHIFT 8 ++#define SRCI_SRNB_MASK 0xf0 ++#define SRCI_SRNB_SHIFT 4 ++#define SRCI_SRBSZ_MASK 0xf ++#define SRCI_SRBSZ_SHIFT 0 ++ ++#define SR_BSZ_BASE 14 ++ ++/* Standby control register */ ++#define SRSC_SBYOVR_MASK 0x80000000 ++#define SRSC_SBYOVR_SHIFT 31 ++#define SRSC_SBYOVRVAL_MASK 0x60000000 ++#define SRSC_SBYOVRVAL_SHIFT 29 ++#define SRSC_SBYEN_MASK 0x01000000 /* rev >= 3 */ ++#define SRSC_SBYEN_SHIFT 24 ++ ++/* Power control register */ ++#define SRPC_PMU_STBYDIS_MASK 0x00000010 /* rev >= 3 */ ++#define SRPC_PMU_STBYDIS_SHIFT 4 ++#define SRPC_STBYOVRVAL_MASK 0x00000008 ++#define SRPC_STBYOVRVAL_SHIFT 3 ++#define SRPC_STBYOVR_MASK 0x00000007 ++#define SRPC_STBYOVR_SHIFT 0 ++ ++/* Extra core capability register */ ++#define SRECC_NUM_BANKS_MASK 0x000000F0 ++#define SRECC_NUM_BANKS_SHIFT 4 ++#define SRECC_BANKSIZE_MASK 0x0000000F ++#define SRECC_BANKSIZE_SHIFT 0 ++ ++#define SRECC_BANKSIZE(value) (1 << (value)) ++ ++/* CAM bank patch control */ ++#define SRCBPC_PATCHENABLE 0x80000000 ++ ++#define SRP_ADDRESS 0x0001FFFC ++#define SRP_VALID 0x8000 ++ ++/* CAM bank command reg */ ++#define SRCMD_WRITE 0x00020000 ++#define SRCMD_READ 0x00010000 ++#define SRCMD_DONE 0x80000000 ++ ++#define SRCMD_DONE_DLY 1000 ++ ++/* bankidx and bankinfo reg defines corerev >= 8 */ ++#define SOCRAM_BANKINFO_SZMASK 0x7f ++#define SOCRAM_BANKIDX_ROM_MASK 0x100 ++ ++#define SOCRAM_BANKIDX_MEMTYPE_SHIFT 8 ++/* socram bankinfo memtype */ ++#define SOCRAM_MEMTYPE_RAM 0 ++#define SOCRAM_MEMTYPE_R0M 1 ++#define SOCRAM_MEMTYPE_DEVRAM 2 ++ ++#define SOCRAM_BANKINFO_REG 0x40 ++#define SOCRAM_BANKIDX_REG 0x10 ++#define SOCRAM_BANKINFO_STDBY_MASK 0x400 ++#define SOCRAM_BANKINFO_STDBY_TIMER 0x800 ++ ++/* bankinfo rev >= 10 */ ++#define SOCRAM_BANKINFO_DEVRAMSEL_SHIFT 13 ++#define SOCRAM_BANKINFO_DEVRAMSEL_MASK 0x2000 ++#define SOCRAM_BANKINFO_DEVRAMPRO_SHIFT 14 ++#define SOCRAM_BANKINFO_DEVRAMPRO_MASK 0x4000 ++#define SOCRAM_BANKINFO_SLPSUPP_SHIFT 15 ++#define SOCRAM_BANKINFO_SLPSUPP_MASK 0x8000 ++#define SOCRAM_BANKINFO_RETNTRAM_SHIFT 16 ++#define SOCRAM_BANKINFO_RETNTRAM_MASK 0x00010000 ++#define SOCRAM_BANKINFO_PDASZ_SHIFT 17 ++#define SOCRAM_BANKINFO_PDASZ_MASK 0x003E0000 ++#define SOCRAM_BANKINFO_DEVRAMREMAP_SHIFT 24 ++#define SOCRAM_BANKINFO_DEVRAMREMAP_MASK 0x01000000 ++ ++/* extracoreinfo register */ ++#define SOCRAM_DEVRAMBANK_MASK 0xF000 ++#define SOCRAM_DEVRAMBANK_SHIFT 12 ++ ++/* bank info to calculate bank size */ ++#define SOCRAM_BANKINFO_SZBASE 8192 ++#define SOCRAM_BANKSIZE_SHIFT 13 /* SOCRAM_BANKINFO_SZBASE */ ++ ++ ++#endif /* _SBSOCRAM_H */ +diff --git a/drivers/net/wireless/ap6210/include/sdio.h b/drivers/net/wireless/ap6210/include/sdio.h +new file mode 100644 +index 0000000..b8eee1f +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sdio.h +@@ -0,0 +1,617 @@ ++/* ++ * SDIO spec header file ++ * Protocol and standard (common) device definitions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sdio.h 308973 2012-01-18 04:19:34Z $ ++ */ ++ ++#ifndef _SDIO_H ++#define _SDIO_H ++ ++ ++/* CCCR structure for function 0 */ ++typedef volatile struct { ++ uint8 cccr_sdio_rev; /* RO, cccr and sdio revision */ ++ uint8 sd_rev; /* RO, sd spec revision */ ++ uint8 io_en; /* I/O enable */ ++ uint8 io_rdy; /* I/O ready reg */ ++ uint8 intr_ctl; /* Master and per function interrupt enable control */ ++ uint8 intr_status; /* RO, interrupt pending status */ ++ uint8 io_abort; /* read/write abort or reset all functions */ ++ uint8 bus_inter; /* bus interface control */ ++ uint8 capability; /* RO, card capability */ ++ ++ uint8 cis_base_low; /* 0x9 RO, common CIS base address, LSB */ ++ uint8 cis_base_mid; ++ uint8 cis_base_high; /* 0xB RO, common CIS base address, MSB */ ++ ++ /* suspend/resume registers */ ++ uint8 bus_suspend; /* 0xC */ ++ uint8 func_select; /* 0xD */ ++ uint8 exec_flag; /* 0xE */ ++ uint8 ready_flag; /* 0xF */ ++ ++ uint8 fn0_blk_size[2]; /* 0x10(LSB), 0x11(MSB) */ ++ ++ uint8 power_control; /* 0x12 (SDIO version 1.10) */ ++ ++ uint8 speed_control; /* 0x13 */ ++} sdio_regs_t; ++ ++/* SDIO Device CCCR offsets */ ++#define SDIOD_CCCR_REV 0x00 ++#define SDIOD_CCCR_SDREV 0x01 ++#define SDIOD_CCCR_IOEN 0x02 ++#define SDIOD_CCCR_IORDY 0x03 ++#define SDIOD_CCCR_INTEN 0x04 ++#define SDIOD_CCCR_INTPEND 0x05 ++#define SDIOD_CCCR_IOABORT 0x06 ++#define SDIOD_CCCR_BICTRL 0x07 ++#define SDIOD_CCCR_CAPABLITIES 0x08 ++#define SDIOD_CCCR_CISPTR_0 0x09 ++#define SDIOD_CCCR_CISPTR_1 0x0A ++#define SDIOD_CCCR_CISPTR_2 0x0B ++#define SDIOD_CCCR_BUSSUSP 0x0C ++#define SDIOD_CCCR_FUNCSEL 0x0D ++#define SDIOD_CCCR_EXECFLAGS 0x0E ++#define SDIOD_CCCR_RDYFLAGS 0x0F ++#define SDIOD_CCCR_BLKSIZE_0 0x10 ++#define SDIOD_CCCR_BLKSIZE_1 0x11 ++#define SDIOD_CCCR_POWER_CONTROL 0x12 ++#define SDIOD_CCCR_SPEED_CONTROL 0x13 ++#define SDIOD_CCCR_UHSI_SUPPORT 0x14 ++#define SDIOD_CCCR_DRIVER_STRENGTH 0x15 ++#define SDIOD_CCCR_INTR_EXTN 0x16 ++ ++/* Broadcom extensions (corerev >= 1) */ ++#define SDIOD_CCCR_BRCM_CARDCAP 0xf0 ++#define SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT 0x02 ++#define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT 0x04 ++#define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC 0x08 ++#define SDIOD_CCCR_BRCM_CARDCTL 0xf1 ++#define SDIOD_CCCR_BRCM_SEPINT 0xf2 ++ ++/* cccr_sdio_rev */ ++#define SDIO_REV_SDIOID_MASK 0xf0 /* SDIO spec revision number */ ++#define SDIO_REV_CCCRID_MASK 0x0f /* CCCR format version number */ ++ ++/* sd_rev */ ++#define SD_REV_PHY_MASK 0x0f /* SD format version number */ ++ ++/* io_en */ ++#define SDIO_FUNC_ENABLE_1 0x02 /* function 1 I/O enable */ ++#define SDIO_FUNC_ENABLE_2 0x04 /* function 2 I/O enable */ ++ ++/* io_rdys */ ++#define SDIO_FUNC_READY_1 0x02 /* function 1 I/O ready */ ++#define SDIO_FUNC_READY_2 0x04 /* function 2 I/O ready */ ++ ++/* intr_ctl */ ++#define INTR_CTL_MASTER_EN 0x1 /* interrupt enable master */ ++#define INTR_CTL_FUNC1_EN 0x2 /* interrupt enable for function 1 */ ++#define INTR_CTL_FUNC2_EN 0x4 /* interrupt enable for function 2 */ ++ ++/* intr_status */ ++#define INTR_STATUS_FUNC1 0x2 /* interrupt pending for function 1 */ ++#define INTR_STATUS_FUNC2 0x4 /* interrupt pending for function 2 */ ++ ++/* io_abort */ ++#define IO_ABORT_RESET_ALL 0x08 /* I/O card reset */ ++#define IO_ABORT_FUNC_MASK 0x07 /* abort selction: function x */ ++ ++/* bus_inter */ ++#define BUS_CARD_DETECT_DIS 0x80 /* Card Detect disable */ ++#define BUS_SPI_CONT_INTR_CAP 0x40 /* support continuous SPI interrupt */ ++#define BUS_SPI_CONT_INTR_EN 0x20 /* continuous SPI interrupt enable */ ++#define BUS_SD_DATA_WIDTH_MASK 0x03 /* bus width mask */ ++#define BUS_SD_DATA_WIDTH_4BIT 0x02 /* bus width 4-bit mode */ ++#define BUS_SD_DATA_WIDTH_1BIT 0x00 /* bus width 1-bit mode */ ++ ++/* capability */ ++#define SDIO_CAP_4BLS 0x80 /* 4-bit support for low speed card */ ++#define SDIO_CAP_LSC 0x40 /* low speed card */ ++#define SDIO_CAP_E4MI 0x20 /* enable interrupt between block of data in 4-bit mode */ ++#define SDIO_CAP_S4MI 0x10 /* support interrupt between block of data in 4-bit mode */ ++#define SDIO_CAP_SBS 0x08 /* support suspend/resume */ ++#define SDIO_CAP_SRW 0x04 /* support read wait */ ++#define SDIO_CAP_SMB 0x02 /* support multi-block transfer */ ++#define SDIO_CAP_SDC 0x01 /* Support Direct commands during multi-byte transfer */ ++ ++/* power_control */ ++#define SDIO_POWER_SMPC 0x01 /* supports master power control (RO) */ ++#define SDIO_POWER_EMPC 0x02 /* enable master power control (allow > 200mA) (RW) */ ++ ++/* speed_control (control device entry into high-speed clocking mode) */ ++#define SDIO_SPEED_SHS 0x01 /* supports high-speed [clocking] mode (RO) */ ++#define SDIO_SPEED_EHS 0x02 /* enable high-speed [clocking] mode (RW) */ ++ ++/* for setting bus speed in card: 0x13h */ ++#define SDIO_BUS_SPEED_UHSISEL_M BITFIELD_MASK(3) ++#define SDIO_BUS_SPEED_UHSISEL_S 1 ++ ++/* for getting bus speed cap in card: 0x14h */ ++#define SDIO_BUS_SPEED_UHSICAP_M BITFIELD_MASK(3) ++#define SDIO_BUS_SPEED_UHSICAP_S 0 ++ ++/* for getting driver type CAP in card: 0x15h */ ++#define SDIO_BUS_DRVR_TYPE_CAP_M BITFIELD_MASK(3) ++#define SDIO_BUS_DRVR_TYPE_CAP_S 0 ++ ++/* for setting driver type selection in card: 0x15h */ ++#define SDIO_BUS_DRVR_TYPE_SEL_M BITFIELD_MASK(2) ++#define SDIO_BUS_DRVR_TYPE_SEL_S 4 ++ ++/* for getting async int support in card: 0x16h */ ++#define SDIO_BUS_ASYNCINT_CAP_M BITFIELD_MASK(1) ++#define SDIO_BUS_ASYNCINT_CAP_S 0 ++ ++/* for setting async int selection in card: 0x16h */ ++#define SDIO_BUS_ASYNCINT_SEL_M BITFIELD_MASK(1) ++#define SDIO_BUS_ASYNCINT_SEL_S 1 ++ ++/* brcm sepint */ ++#define SDIO_SEPINT_MASK 0x01 /* route sdpcmdev intr onto separate pad (chip-specific) */ ++#define SDIO_SEPINT_OE 0x02 /* 1 asserts output enable for above pad */ ++#define SDIO_SEPINT_ACT_HI 0x04 /* use active high interrupt level instead of active low */ ++ ++/* FBR structure for function 1-7, FBR addresses and register offsets */ ++typedef volatile struct { ++ uint8 devctr; /* device interface, CSA control */ ++ uint8 ext_dev; /* extended standard I/O device type code */ ++ uint8 pwr_sel; /* power selection support */ ++ uint8 PAD[6]; /* reserved */ ++ ++ uint8 cis_low; /* CIS LSB */ ++ uint8 cis_mid; ++ uint8 cis_high; /* CIS MSB */ ++ uint8 csa_low; /* code storage area, LSB */ ++ uint8 csa_mid; ++ uint8 csa_high; /* code storage area, MSB */ ++ uint8 csa_dat_win; /* data access window to function */ ++ ++ uint8 fnx_blk_size[2]; /* block size, little endian */ ++} sdio_fbr_t; ++ ++/* Maximum number of I/O funcs */ ++#define SDIOD_MAX_FUNCS 8 ++#define SDIOD_MAX_IOFUNCS 7 ++ ++/* SDIO Device FBR Start Address */ ++#define SDIOD_FBR_STARTADDR 0x100 ++ ++/* SDIO Device FBR Size */ ++#define SDIOD_FBR_SIZE 0x100 ++ ++/* Macro to calculate FBR register base */ ++#define SDIOD_FBR_BASE(n) ((n) * 0x100) ++ ++/* Function register offsets */ ++#define SDIOD_FBR_DEVCTR 0x00 /* basic info for function */ ++#define SDIOD_FBR_EXT_DEV 0x01 /* extended I/O device code */ ++#define SDIOD_FBR_PWR_SEL 0x02 /* power selection bits */ ++ ++/* SDIO Function CIS ptr offset */ ++#define SDIOD_FBR_CISPTR_0 0x09 ++#define SDIOD_FBR_CISPTR_1 0x0A ++#define SDIOD_FBR_CISPTR_2 0x0B ++ ++/* Code Storage Area pointer */ ++#define SDIOD_FBR_CSA_ADDR_0 0x0C ++#define SDIOD_FBR_CSA_ADDR_1 0x0D ++#define SDIOD_FBR_CSA_ADDR_2 0x0E ++#define SDIOD_FBR_CSA_DATA 0x0F ++ ++/* SDIO Function I/O Block Size */ ++#define SDIOD_FBR_BLKSIZE_0 0x10 ++#define SDIOD_FBR_BLKSIZE_1 0x11 ++ ++/* devctr */ ++#define SDIOD_FBR_DEVCTR_DIC 0x0f /* device interface code */ ++#define SDIOD_FBR_DECVTR_CSA 0x40 /* CSA support flag */ ++#define SDIOD_FBR_DEVCTR_CSA_EN 0x80 /* CSA enabled */ ++/* interface codes */ ++#define SDIOD_DIC_NONE 0 /* SDIO standard interface is not supported */ ++#define SDIOD_DIC_UART 1 ++#define SDIOD_DIC_BLUETOOTH_A 2 ++#define SDIOD_DIC_BLUETOOTH_B 3 ++#define SDIOD_DIC_GPS 4 ++#define SDIOD_DIC_CAMERA 5 ++#define SDIOD_DIC_PHS 6 ++#define SDIOD_DIC_WLAN 7 ++#define SDIOD_DIC_EXT 0xf /* extended device interface, read ext_dev register */ ++ ++/* pwr_sel */ ++#define SDIOD_PWR_SEL_SPS 0x01 /* supports power selection */ ++#define SDIOD_PWR_SEL_EPS 0x02 /* enable power selection (low-current mode) */ ++ ++/* misc defines */ ++#define SDIO_FUNC_0 0 ++#define SDIO_FUNC_1 1 ++#define SDIO_FUNC_2 2 ++#define SDIO_FUNC_3 3 ++#define SDIO_FUNC_4 4 ++#define SDIO_FUNC_5 5 ++#define SDIO_FUNC_6 6 ++#define SDIO_FUNC_7 7 ++ ++#define SD_CARD_TYPE_UNKNOWN 0 /* bad type or unrecognized */ ++#define SD_CARD_TYPE_IO 1 /* IO only card */ ++#define SD_CARD_TYPE_MEMORY 2 /* memory only card */ ++#define SD_CARD_TYPE_COMBO 3 /* IO and memory combo card */ ++ ++#define SDIO_MAX_BLOCK_SIZE 2048 /* maximum block size for block mode operation */ ++#define SDIO_MIN_BLOCK_SIZE 1 /* minimum block size for block mode operation */ ++ ++/* Card registers: status bit position */ ++#define CARDREG_STATUS_BIT_OUTOFRANGE 31 ++#define CARDREG_STATUS_BIT_COMCRCERROR 23 ++#define CARDREG_STATUS_BIT_ILLEGALCOMMAND 22 ++#define CARDREG_STATUS_BIT_ERROR 19 ++#define CARDREG_STATUS_BIT_IOCURRENTSTATE3 12 ++#define CARDREG_STATUS_BIT_IOCURRENTSTATE2 11 ++#define CARDREG_STATUS_BIT_IOCURRENTSTATE1 10 ++#define CARDREG_STATUS_BIT_IOCURRENTSTATE0 9 ++#define CARDREG_STATUS_BIT_FUN_NUM_ERROR 4 ++ ++ ++ ++#define SD_CMD_GO_IDLE_STATE 0 /* mandatory for SDIO */ ++#define SD_CMD_SEND_OPCOND 1 ++#define SD_CMD_MMC_SET_RCA 3 ++#define SD_CMD_IO_SEND_OP_COND 5 /* mandatory for SDIO */ ++#define SD_CMD_SELECT_DESELECT_CARD 7 ++#define SD_CMD_SEND_CSD 9 ++#define SD_CMD_SEND_CID 10 ++#define SD_CMD_STOP_TRANSMISSION 12 ++#define SD_CMD_SEND_STATUS 13 ++#define SD_CMD_GO_INACTIVE_STATE 15 ++#define SD_CMD_SET_BLOCKLEN 16 ++#define SD_CMD_READ_SINGLE_BLOCK 17 ++#define SD_CMD_READ_MULTIPLE_BLOCK 18 ++#define SD_CMD_WRITE_BLOCK 24 ++#define SD_CMD_WRITE_MULTIPLE_BLOCK 25 ++#define SD_CMD_PROGRAM_CSD 27 ++#define SD_CMD_SET_WRITE_PROT 28 ++#define SD_CMD_CLR_WRITE_PROT 29 ++#define SD_CMD_SEND_WRITE_PROT 30 ++#define SD_CMD_ERASE_WR_BLK_START 32 ++#define SD_CMD_ERASE_WR_BLK_END 33 ++#define SD_CMD_ERASE 38 ++#define SD_CMD_LOCK_UNLOCK 42 ++#define SD_CMD_IO_RW_DIRECT 52 /* mandatory for SDIO */ ++#define SD_CMD_IO_RW_EXTENDED 53 /* mandatory for SDIO */ ++#define SD_CMD_APP_CMD 55 ++#define SD_CMD_GEN_CMD 56 ++#define SD_CMD_READ_OCR 58 ++#define SD_CMD_CRC_ON_OFF 59 /* mandatory for SDIO */ ++#define SD_ACMD_SD_STATUS 13 ++#define SD_ACMD_SEND_NUM_WR_BLOCKS 22 ++#define SD_ACMD_SET_WR_BLOCK_ERASE_CNT 23 ++#define SD_ACMD_SD_SEND_OP_COND 41 ++#define SD_ACMD_SET_CLR_CARD_DETECT 42 ++#define SD_ACMD_SEND_SCR 51 ++ ++/* argument for SD_CMD_IO_RW_DIRECT and SD_CMD_IO_RW_EXTENDED */ ++#define SD_IO_OP_READ 0 /* Read_Write: Read */ ++#define SD_IO_OP_WRITE 1 /* Read_Write: Write */ ++#define SD_IO_RW_NORMAL 0 /* no RAW */ ++#define SD_IO_RW_RAW 1 /* RAW */ ++#define SD_IO_BYTE_MODE 0 /* Byte Mode */ ++#define SD_IO_BLOCK_MODE 1 /* BlockMode */ ++#define SD_IO_FIXED_ADDRESS 0 /* fix Address */ ++#define SD_IO_INCREMENT_ADDRESS 1 /* IncrementAddress */ ++ ++/* build SD_CMD_IO_RW_DIRECT Argument */ ++#define SDIO_IO_RW_DIRECT_ARG(rw, raw, func, addr, data) \ ++ ((((rw) & 1) << 31) | (((func) & 0x7) << 28) | (((raw) & 1) << 27) | \ ++ (((addr) & 0x1FFFF) << 9) | ((data) & 0xFF)) ++ ++/* build SD_CMD_IO_RW_EXTENDED Argument */ ++#define SDIO_IO_RW_EXTENDED_ARG(rw, blk, func, addr, inc_addr, count) \ ++ ((((rw) & 1) << 31) | (((func) & 0x7) << 28) | (((blk) & 1) << 27) | \ ++ (((inc_addr) & 1) << 26) | (((addr) & 0x1FFFF) << 9) | ((count) & 0x1FF)) ++ ++/* SDIO response parameters */ ++#define SD_RSP_NO_NONE 0 ++#define SD_RSP_NO_1 1 ++#define SD_RSP_NO_2 2 ++#define SD_RSP_NO_3 3 ++#define SD_RSP_NO_4 4 ++#define SD_RSP_NO_5 5 ++#define SD_RSP_NO_6 6 ++ ++ /* Modified R6 response (to CMD3) */ ++#define SD_RSP_MR6_COM_CRC_ERROR 0x8000 ++#define SD_RSP_MR6_ILLEGAL_COMMAND 0x4000 ++#define SD_RSP_MR6_ERROR 0x2000 ++ ++ /* Modified R1 in R4 Response (to CMD5) */ ++#define SD_RSP_MR1_SBIT 0x80 ++#define SD_RSP_MR1_PARAMETER_ERROR 0x40 ++#define SD_RSP_MR1_RFU5 0x20 ++#define SD_RSP_MR1_FUNC_NUM_ERROR 0x10 ++#define SD_RSP_MR1_COM_CRC_ERROR 0x08 ++#define SD_RSP_MR1_ILLEGAL_COMMAND 0x04 ++#define SD_RSP_MR1_RFU1 0x02 ++#define SD_RSP_MR1_IDLE_STATE 0x01 ++ ++ /* R5 response (to CMD52 and CMD53) */ ++#define SD_RSP_R5_COM_CRC_ERROR 0x80 ++#define SD_RSP_R5_ILLEGAL_COMMAND 0x40 ++#define SD_RSP_R5_IO_CURRENTSTATE1 0x20 ++#define SD_RSP_R5_IO_CURRENTSTATE0 0x10 ++#define SD_RSP_R5_ERROR 0x08 ++#define SD_RSP_R5_RFU 0x04 ++#define SD_RSP_R5_FUNC_NUM_ERROR 0x02 ++#define SD_RSP_R5_OUT_OF_RANGE 0x01 ++ ++#define SD_RSP_R5_ERRBITS 0xCB ++ ++ ++/* ------------------------------------------------ ++ * SDIO Commands and responses ++ * ++ * I/O only commands are: ++ * CMD0, CMD3, CMD5, CMD7, CMD14, CMD15, CMD52, CMD53 ++ * ------------------------------------------------ ++ */ ++ ++/* SDIO Commands */ ++#define SDIOH_CMD_0 0 ++#define SDIOH_CMD_3 3 ++#define SDIOH_CMD_5 5 ++#define SDIOH_CMD_7 7 ++#define SDIOH_CMD_11 11 ++#define SDIOH_CMD_14 14 ++#define SDIOH_CMD_15 15 ++#define SDIOH_CMD_19 19 ++#define SDIOH_CMD_52 52 ++#define SDIOH_CMD_53 53 ++#define SDIOH_CMD_59 59 ++ ++/* SDIO Command Responses */ ++#define SDIOH_RSP_NONE 0 ++#define SDIOH_RSP_R1 1 ++#define SDIOH_RSP_R2 2 ++#define SDIOH_RSP_R3 3 ++#define SDIOH_RSP_R4 4 ++#define SDIOH_RSP_R5 5 ++#define SDIOH_RSP_R6 6 ++ ++/* ++ * SDIO Response Error flags ++ */ ++#define SDIOH_RSP5_ERROR_FLAGS 0xCB ++ ++/* ------------------------------------------------ ++ * SDIO Command structures. I/O only commands are: ++ * ++ * CMD0, CMD3, CMD5, CMD7, CMD15, CMD52, CMD53 ++ * ------------------------------------------------ ++ */ ++ ++#define CMD5_OCR_M BITFIELD_MASK(24) ++#define CMD5_OCR_S 0 ++ ++#define CMD5_S18R_M BITFIELD_MASK(1) ++#define CMD5_S18R_S 24 ++ ++#define CMD7_RCA_M BITFIELD_MASK(16) ++#define CMD7_RCA_S 16 ++ ++#define CMD14_RCA_M BITFIELD_MASK(16) ++#define CMD14_RCA_S 16 ++#define CMD14_SLEEP_M BITFIELD_MASK(1) ++#define CMD14_SLEEP_S 15 ++ ++#define CMD_15_RCA_M BITFIELD_MASK(16) ++#define CMD_15_RCA_S 16 ++ ++#define CMD52_DATA_M BITFIELD_MASK(8) /* Bits [7:0] - Write Data/Stuff bits of CMD52 ++ */ ++#define CMD52_DATA_S 0 ++#define CMD52_REG_ADDR_M BITFIELD_MASK(17) /* Bits [25:9] - register address */ ++#define CMD52_REG_ADDR_S 9 ++#define CMD52_RAW_M BITFIELD_MASK(1) /* Bit 27 - Read after Write flag */ ++#define CMD52_RAW_S 27 ++#define CMD52_FUNCTION_M BITFIELD_MASK(3) /* Bits [30:28] - Function number */ ++#define CMD52_FUNCTION_S 28 ++#define CMD52_RW_FLAG_M BITFIELD_MASK(1) /* Bit 31 - R/W flag */ ++#define CMD52_RW_FLAG_S 31 ++ ++ ++#define CMD53_BYTE_BLK_CNT_M BITFIELD_MASK(9) /* Bits [8:0] - Byte/Block Count of CMD53 */ ++#define CMD53_BYTE_BLK_CNT_S 0 ++#define CMD53_REG_ADDR_M BITFIELD_MASK(17) /* Bits [25:9] - register address */ ++#define CMD53_REG_ADDR_S 9 ++#define CMD53_OP_CODE_M BITFIELD_MASK(1) /* Bit 26 - R/W Operation Code */ ++#define CMD53_OP_CODE_S 26 ++#define CMD53_BLK_MODE_M BITFIELD_MASK(1) /* Bit 27 - Block Mode */ ++#define CMD53_BLK_MODE_S 27 ++#define CMD53_FUNCTION_M BITFIELD_MASK(3) /* Bits [30:28] - Function number */ ++#define CMD53_FUNCTION_S 28 ++#define CMD53_RW_FLAG_M BITFIELD_MASK(1) /* Bit 31 - R/W flag */ ++#define CMD53_RW_FLAG_S 31 ++ ++/* ------------------------------------------------------ ++ * SDIO Command Response structures for SD1 and SD4 modes ++ * ----------------------------------------------------- ++ */ ++#define RSP4_IO_OCR_M BITFIELD_MASK(24) /* Bits [23:0] - Card's OCR Bits [23:0] */ ++#define RSP4_IO_OCR_S 0 ++ ++#define RSP4_S18A_M BITFIELD_MASK(1) /* Bits [23:0] - Card's OCR Bits [23:0] */ ++#define RSP4_S18A_S 24 ++ ++#define RSP4_STUFF_M BITFIELD_MASK(3) /* Bits [26:24] - Stuff bits */ ++#define RSP4_STUFF_S 24 ++#define RSP4_MEM_PRESENT_M BITFIELD_MASK(1) /* Bit 27 - Memory present */ ++#define RSP4_MEM_PRESENT_S 27 ++#define RSP4_NUM_FUNCS_M BITFIELD_MASK(3) /* Bits [30:28] - Number of I/O funcs */ ++#define RSP4_NUM_FUNCS_S 28 ++#define RSP4_CARD_READY_M BITFIELD_MASK(1) /* Bit 31 - SDIO card ready */ ++#define RSP4_CARD_READY_S 31 ++ ++#define RSP6_STATUS_M BITFIELD_MASK(16) /* Bits [15:0] - Card status bits [19,22,23,12:0] ++ */ ++#define RSP6_STATUS_S 0 ++#define RSP6_IO_RCA_M BITFIELD_MASK(16) /* Bits [31:16] - RCA bits[31-16] */ ++#define RSP6_IO_RCA_S 16 ++ ++#define RSP1_AKE_SEQ_ERROR_M BITFIELD_MASK(1) /* Bit 3 - Authentication seq error */ ++#define RSP1_AKE_SEQ_ERROR_S 3 ++#define RSP1_APP_CMD_M BITFIELD_MASK(1) /* Bit 5 - Card expects ACMD */ ++#define RSP1_APP_CMD_S 5 ++#define RSP1_READY_FOR_DATA_M BITFIELD_MASK(1) /* Bit 8 - Ready for data (buff empty) */ ++#define RSP1_READY_FOR_DATA_S 8 ++#define RSP1_CURR_STATE_M BITFIELD_MASK(4) /* Bits [12:9] - State of card ++ * when Cmd was received ++ */ ++#define RSP1_CURR_STATE_S 9 ++#define RSP1_EARSE_RESET_M BITFIELD_MASK(1) /* Bit 13 - Erase seq cleared */ ++#define RSP1_EARSE_RESET_S 13 ++#define RSP1_CARD_ECC_DISABLE_M BITFIELD_MASK(1) /* Bit 14 - Card ECC disabled */ ++#define RSP1_CARD_ECC_DISABLE_S 14 ++#define RSP1_WP_ERASE_SKIP_M BITFIELD_MASK(1) /* Bit 15 - Partial blocks erased due to W/P */ ++#define RSP1_WP_ERASE_SKIP_S 15 ++#define RSP1_CID_CSD_OVERW_M BITFIELD_MASK(1) /* Bit 16 - Illegal write to CID or R/O bits ++ * of CSD ++ */ ++#define RSP1_CID_CSD_OVERW_S 16 ++#define RSP1_ERROR_M BITFIELD_MASK(1) /* Bit 19 - General/Unknown error */ ++#define RSP1_ERROR_S 19 ++#define RSP1_CC_ERROR_M BITFIELD_MASK(1) /* Bit 20 - Internal Card Control error */ ++#define RSP1_CC_ERROR_S 20 ++#define RSP1_CARD_ECC_FAILED_M BITFIELD_MASK(1) /* Bit 21 - Card internal ECC failed ++ * to correct data ++ */ ++#define RSP1_CARD_ECC_FAILED_S 21 ++#define RSP1_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 22 - Cmd not legal for the card state */ ++#define RSP1_ILLEGAL_CMD_S 22 ++#define RSP1_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 23 - CRC check of previous command failed ++ */ ++#define RSP1_COM_CRC_ERROR_S 23 ++#define RSP1_LOCK_UNLOCK_FAIL_M BITFIELD_MASK(1) /* Bit 24 - Card lock-unlock Cmd Seq error */ ++#define RSP1_LOCK_UNLOCK_FAIL_S 24 ++#define RSP1_CARD_LOCKED_M BITFIELD_MASK(1) /* Bit 25 - Card locked by the host */ ++#define RSP1_CARD_LOCKED_S 25 ++#define RSP1_WP_VIOLATION_M BITFIELD_MASK(1) /* Bit 26 - Attempt to program ++ * write-protected blocks ++ */ ++#define RSP1_WP_VIOLATION_S 26 ++#define RSP1_ERASE_PARAM_M BITFIELD_MASK(1) /* Bit 27 - Invalid erase blocks */ ++#define RSP1_ERASE_PARAM_S 27 ++#define RSP1_ERASE_SEQ_ERR_M BITFIELD_MASK(1) /* Bit 28 - Erase Cmd seq error */ ++#define RSP1_ERASE_SEQ_ERR_S 28 ++#define RSP1_BLK_LEN_ERR_M BITFIELD_MASK(1) /* Bit 29 - Block length error */ ++#define RSP1_BLK_LEN_ERR_S 29 ++#define RSP1_ADDR_ERR_M BITFIELD_MASK(1) /* Bit 30 - Misaligned address */ ++#define RSP1_ADDR_ERR_S 30 ++#define RSP1_OUT_OF_RANGE_M BITFIELD_MASK(1) /* Bit 31 - Cmd arg was out of range */ ++#define RSP1_OUT_OF_RANGE_S 31 ++ ++ ++#define RSP5_DATA_M BITFIELD_MASK(8) /* Bits [0:7] - data */ ++#define RSP5_DATA_S 0 ++#define RSP5_FLAGS_M BITFIELD_MASK(8) /* Bit [15:8] - Rsp flags */ ++#define RSP5_FLAGS_S 8 ++#define RSP5_STUFF_M BITFIELD_MASK(16) /* Bits [31:16] - Stuff bits */ ++#define RSP5_STUFF_S 16 ++ ++/* ---------------------------------------------- ++ * SDIO Command Response structures for SPI mode ++ * ---------------------------------------------- ++ */ ++#define SPIRSP4_IO_OCR_M BITFIELD_MASK(16) /* Bits [15:0] - Card's OCR Bits [23:8] */ ++#define SPIRSP4_IO_OCR_S 0 ++#define SPIRSP4_STUFF_M BITFIELD_MASK(3) /* Bits [18:16] - Stuff bits */ ++#define SPIRSP4_STUFF_S 16 ++#define SPIRSP4_MEM_PRESENT_M BITFIELD_MASK(1) /* Bit 19 - Memory present */ ++#define SPIRSP4_MEM_PRESENT_S 19 ++#define SPIRSP4_NUM_FUNCS_M BITFIELD_MASK(3) /* Bits [22:20] - Number of I/O funcs */ ++#define SPIRSP4_NUM_FUNCS_S 20 ++#define SPIRSP4_CARD_READY_M BITFIELD_MASK(1) /* Bit 23 - SDIO card ready */ ++#define SPIRSP4_CARD_READY_S 23 ++#define SPIRSP4_IDLE_STATE_M BITFIELD_MASK(1) /* Bit 24 - idle state */ ++#define SPIRSP4_IDLE_STATE_S 24 ++#define SPIRSP4_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 26 - Illegal Cmd error */ ++#define SPIRSP4_ILLEGAL_CMD_S 26 ++#define SPIRSP4_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 27 - COM CRC error */ ++#define SPIRSP4_COM_CRC_ERROR_S 27 ++#define SPIRSP4_FUNC_NUM_ERROR_M BITFIELD_MASK(1) /* Bit 28 - Function number error ++ */ ++#define SPIRSP4_FUNC_NUM_ERROR_S 28 ++#define SPIRSP4_PARAM_ERROR_M BITFIELD_MASK(1) /* Bit 30 - Parameter Error Bit */ ++#define SPIRSP4_PARAM_ERROR_S 30 ++#define SPIRSP4_START_BIT_M BITFIELD_MASK(1) /* Bit 31 - Start Bit */ ++#define SPIRSP4_START_BIT_S 31 ++ ++#define SPIRSP5_DATA_M BITFIELD_MASK(8) /* Bits [23:16] - R/W Data */ ++#define SPIRSP5_DATA_S 16 ++#define SPIRSP5_IDLE_STATE_M BITFIELD_MASK(1) /* Bit 24 - Idle state */ ++#define SPIRSP5_IDLE_STATE_S 24 ++#define SPIRSP5_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 26 - Illegal Cmd error */ ++#define SPIRSP5_ILLEGAL_CMD_S 26 ++#define SPIRSP5_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 27 - COM CRC error */ ++#define SPIRSP5_COM_CRC_ERROR_S 27 ++#define SPIRSP5_FUNC_NUM_ERROR_M BITFIELD_MASK(1) /* Bit 28 - Function number error ++ */ ++#define SPIRSP5_FUNC_NUM_ERROR_S 28 ++#define SPIRSP5_PARAM_ERROR_M BITFIELD_MASK(1) /* Bit 30 - Parameter Error Bit */ ++#define SPIRSP5_PARAM_ERROR_S 30 ++#define SPIRSP5_START_BIT_M BITFIELD_MASK(1) /* Bit 31 - Start Bit */ ++#define SPIRSP5_START_BIT_S 31 ++ ++/* RSP6 card status format; Pg 68 Physical Layer spec v 1.10 */ ++#define RSP6STAT_AKE_SEQ_ERROR_M BITFIELD_MASK(1) /* Bit 3 - Authentication seq error ++ */ ++#define RSP6STAT_AKE_SEQ_ERROR_S 3 ++#define RSP6STAT_APP_CMD_M BITFIELD_MASK(1) /* Bit 5 - Card expects ACMD */ ++#define RSP6STAT_APP_CMD_S 5 ++#define RSP6STAT_READY_FOR_DATA_M BITFIELD_MASK(1) /* Bit 8 - Ready for data ++ * (buff empty) ++ */ ++#define RSP6STAT_READY_FOR_DATA_S 8 ++#define RSP6STAT_CURR_STATE_M BITFIELD_MASK(4) /* Bits [12:9] - Card state at ++ * Cmd reception ++ */ ++#define RSP6STAT_CURR_STATE_S 9 ++#define RSP6STAT_ERROR_M BITFIELD_MASK(1) /* Bit 13 - General/Unknown error Bit 19 ++ */ ++#define RSP6STAT_ERROR_S 13 ++#define RSP6STAT_ILLEGAL_CMD_M BITFIELD_MASK(1) /* Bit 14 - Illegal cmd for ++ * card state Bit 22 ++ */ ++#define RSP6STAT_ILLEGAL_CMD_S 14 ++#define RSP6STAT_COM_CRC_ERROR_M BITFIELD_MASK(1) /* Bit 15 - CRC previous command ++ * failed Bit 23 ++ */ ++#define RSP6STAT_COM_CRC_ERROR_S 15 ++ ++#define SDIOH_XFER_TYPE_READ SD_IO_OP_READ ++#define SDIOH_XFER_TYPE_WRITE SD_IO_OP_WRITE ++ ++/* command issue options */ ++#define CMD_OPTION_DEFAULT 0 ++#define CMD_OPTION_TUNING 1 ++#endif /* _SDIO_H */ +diff --git a/drivers/net/wireless/ap6210/include/sdioh.h b/drivers/net/wireless/ap6210/include/sdioh.h +new file mode 100644 +index 0000000..5517a71 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sdioh.h +@@ -0,0 +1,445 @@ ++/* ++ * SDIO Host Controller Spec header file ++ * Register map and definitions for the Standard Host Controller ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sdioh.h 347633 2012-07-27 11:02:02Z $ ++ */ ++ ++#ifndef _SDIOH_H ++#define _SDIOH_H ++ ++#define SD_SysAddr 0x000 ++#define SD_BlockSize 0x004 ++#define SD_BlockCount 0x006 ++#define SD_Arg0 0x008 ++#define SD_Arg1 0x00A ++#define SD_TransferMode 0x00C ++#define SD_Command 0x00E ++#define SD_Response0 0x010 ++#define SD_Response1 0x012 ++#define SD_Response2 0x014 ++#define SD_Response3 0x016 ++#define SD_Response4 0x018 ++#define SD_Response5 0x01A ++#define SD_Response6 0x01C ++#define SD_Response7 0x01E ++#define SD_BufferDataPort0 0x020 ++#define SD_BufferDataPort1 0x022 ++#define SD_PresentState 0x024 ++#define SD_HostCntrl 0x028 ++#define SD_PwrCntrl 0x029 ++#define SD_BlockGapCntrl 0x02A ++#define SD_WakeupCntrl 0x02B ++#define SD_ClockCntrl 0x02C ++#define SD_TimeoutCntrl 0x02E ++#define SD_SoftwareReset 0x02F ++#define SD_IntrStatus 0x030 ++#define SD_ErrorIntrStatus 0x032 ++#define SD_IntrStatusEnable 0x034 ++#define SD_ErrorIntrStatusEnable 0x036 ++#define SD_IntrSignalEnable 0x038 ++#define SD_ErrorIntrSignalEnable 0x03A ++#define SD_CMD12ErrorStatus 0x03C ++#define SD_Capabilities 0x040 ++#define SD_Capabilities3 0x044 ++#define SD_MaxCurCap 0x048 ++#define SD_MaxCurCap_Reserved 0x04C ++#define SD_ADMA_ErrStatus 0x054 ++#define SD_ADMA_SysAddr 0x58 ++#define SD_SlotInterruptStatus 0x0FC ++#define SD_HostControllerVersion 0x0FE ++#define SD_GPIO_Reg 0x100 ++#define SD_GPIO_OE 0x104 ++#define SD_GPIO_Enable 0x108 ++ ++/* SD specific registers in PCI config space */ ++#define SD_SlotInfo 0x40 ++ ++/* HC 3.0 specific registers and offsets */ ++#define SD3_HostCntrl2 0x03E ++/* preset regsstart and count */ ++#define SD3_PresetValStart 0x060 ++#define SD3_PresetValCount 8 ++/* preset-indiv regs */ ++#define SD3_PresetVal_init 0x060 ++#define SD3_PresetVal_default 0x062 ++#define SD3_PresetVal_HS 0x064 ++#define SD3_PresetVal_SDR12 0x066 ++#define SD3_PresetVal_SDR25 0x068 ++#define SD3_PresetVal_SDR50 0x06a ++#define SD3_PresetVal_SDR104 0x06c ++#define SD3_PresetVal_DDR50 0x06e ++/* SDIO3.0 Revx specific Registers */ ++#define SD3_Tuning_Info_Register 0x0EC ++#define SD3_WL_BT_reset_register 0x0F0 ++ ++ ++/* preset value indices */ ++#define SD3_PRESETVAL_INITIAL_IX 0 ++#define SD3_PRESETVAL_DESPEED_IX 1 ++#define SD3_PRESETVAL_HISPEED_IX 2 ++#define SD3_PRESETVAL_SDR12_IX 3 ++#define SD3_PRESETVAL_SDR25_IX 4 ++#define SD3_PRESETVAL_SDR50_IX 5 ++#define SD3_PRESETVAL_SDR104_IX 6 ++#define SD3_PRESETVAL_DDR50_IX 7 ++ ++/* SD_Capabilities reg (0x040) */ ++#define CAP_TO_CLKFREQ_M BITFIELD_MASK(6) ++#define CAP_TO_CLKFREQ_S 0 ++#define CAP_TO_CLKUNIT_M BITFIELD_MASK(1) ++#define CAP_TO_CLKUNIT_S 7 ++/* Note: for sdio-2.0 case, this mask has to be 6 bits, but msb 2 ++ bits are reserved. going ahead with 8 bits, as it is req for 3.0 ++*/ ++#define CAP_BASECLK_M BITFIELD_MASK(8) ++#define CAP_BASECLK_S 8 ++#define CAP_MAXBLOCK_M BITFIELD_MASK(2) ++#define CAP_MAXBLOCK_S 16 ++#define CAP_ADMA2_M BITFIELD_MASK(1) ++#define CAP_ADMA2_S 19 ++#define CAP_ADMA1_M BITFIELD_MASK(1) ++#define CAP_ADMA1_S 20 ++#define CAP_HIGHSPEED_M BITFIELD_MASK(1) ++#define CAP_HIGHSPEED_S 21 ++#define CAP_DMA_M BITFIELD_MASK(1) ++#define CAP_DMA_S 22 ++#define CAP_SUSPEND_M BITFIELD_MASK(1) ++#define CAP_SUSPEND_S 23 ++#define CAP_VOLT_3_3_M BITFIELD_MASK(1) ++#define CAP_VOLT_3_3_S 24 ++#define CAP_VOLT_3_0_M BITFIELD_MASK(1) ++#define CAP_VOLT_3_0_S 25 ++#define CAP_VOLT_1_8_M BITFIELD_MASK(1) ++#define CAP_VOLT_1_8_S 26 ++#define CAP_64BIT_HOST_M BITFIELD_MASK(1) ++#define CAP_64BIT_HOST_S 28 ++ ++#define SDIO_OCR_READ_FAIL (2) ++ ++ ++#define CAP_ASYNCINT_SUP_M BITFIELD_MASK(1) ++#define CAP_ASYNCINT_SUP_S 29 ++ ++#define CAP_SLOTTYPE_M BITFIELD_MASK(2) ++#define CAP_SLOTTYPE_S 30 ++ ++#define CAP3_MSBits_OFFSET (32) ++/* note: following are caps MSB32 bits. ++ So the bits start from 0, instead of 32. that is why ++ CAP3_MSBits_OFFSET is subtracted. ++*/ ++#define CAP3_SDR50_SUP_M BITFIELD_MASK(1) ++#define CAP3_SDR50_SUP_S (32 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_SDR104_SUP_M BITFIELD_MASK(1) ++#define CAP3_SDR104_SUP_S (33 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_DDR50_SUP_M BITFIELD_MASK(1) ++#define CAP3_DDR50_SUP_S (34 - CAP3_MSBits_OFFSET) ++ ++/* for knowing the clk caps in a single read */ ++#define CAP3_30CLKCAP_M BITFIELD_MASK(3) ++#define CAP3_30CLKCAP_S (32 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_DRIVTYPE_A_M BITFIELD_MASK(1) ++#define CAP3_DRIVTYPE_A_S (36 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_DRIVTYPE_C_M BITFIELD_MASK(1) ++#define CAP3_DRIVTYPE_C_S (37 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_DRIVTYPE_D_M BITFIELD_MASK(1) ++#define CAP3_DRIVTYPE_D_S (38 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_RETUNING_TC_M BITFIELD_MASK(4) ++#define CAP3_RETUNING_TC_S (40 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_TUNING_SDR50_M BITFIELD_MASK(1) ++#define CAP3_TUNING_SDR50_S (45 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_RETUNING_MODES_M BITFIELD_MASK(2) ++#define CAP3_RETUNING_MODES_S (46 - CAP3_MSBits_OFFSET) ++ ++#define CAP3_CLK_MULT_M BITFIELD_MASK(8) ++#define CAP3_CLK_MULT_S (48 - CAP3_MSBits_OFFSET) ++ ++#define PRESET_DRIVR_SELECT_M BITFIELD_MASK(2) ++#define PRESET_DRIVR_SELECT_S 14 ++ ++#define PRESET_CLK_DIV_M BITFIELD_MASK(10) ++#define PRESET_CLK_DIV_S 0 ++ ++/* SD_MaxCurCap reg (0x048) */ ++#define CAP_CURR_3_3_M BITFIELD_MASK(8) ++#define CAP_CURR_3_3_S 0 ++#define CAP_CURR_3_0_M BITFIELD_MASK(8) ++#define CAP_CURR_3_0_S 8 ++#define CAP_CURR_1_8_M BITFIELD_MASK(8) ++#define CAP_CURR_1_8_S 16 ++ ++/* SD_SysAddr: Offset 0x0000, Size 4 bytes */ ++ ++/* SD_BlockSize: Offset 0x004, Size 2 bytes */ ++#define BLKSZ_BLKSZ_M BITFIELD_MASK(12) ++#define BLKSZ_BLKSZ_S 0 ++#define BLKSZ_BNDRY_M BITFIELD_MASK(3) ++#define BLKSZ_BNDRY_S 12 ++ ++/* SD_BlockCount: Offset 0x006, size 2 bytes */ ++ ++/* SD_Arg0: Offset 0x008, size = 4 bytes */ ++/* SD_TransferMode Offset 0x00C, size = 2 bytes */ ++#define XFER_DMA_ENABLE_M BITFIELD_MASK(1) ++#define XFER_DMA_ENABLE_S 0 ++#define XFER_BLK_COUNT_EN_M BITFIELD_MASK(1) ++#define XFER_BLK_COUNT_EN_S 1 ++#define XFER_CMD_12_EN_M BITFIELD_MASK(1) ++#define XFER_CMD_12_EN_S 2 ++#define XFER_DATA_DIRECTION_M BITFIELD_MASK(1) ++#define XFER_DATA_DIRECTION_S 4 ++#define XFER_MULTI_BLOCK_M BITFIELD_MASK(1) ++#define XFER_MULTI_BLOCK_S 5 ++ ++/* SD_Command: Offset 0x00E, size = 2 bytes */ ++/* resp_type field */ ++#define RESP_TYPE_NONE 0 ++#define RESP_TYPE_136 1 ++#define RESP_TYPE_48 2 ++#define RESP_TYPE_48_BUSY 3 ++/* type field */ ++#define CMD_TYPE_NORMAL 0 ++#define CMD_TYPE_SUSPEND 1 ++#define CMD_TYPE_RESUME 2 ++#define CMD_TYPE_ABORT 3 ++ ++#define CMD_RESP_TYPE_M BITFIELD_MASK(2) /* Bits [0-1] - Response type */ ++#define CMD_RESP_TYPE_S 0 ++#define CMD_CRC_EN_M BITFIELD_MASK(1) /* Bit 3 - CRC enable */ ++#define CMD_CRC_EN_S 3 ++#define CMD_INDEX_EN_M BITFIELD_MASK(1) /* Bit 4 - Enable index checking */ ++#define CMD_INDEX_EN_S 4 ++#define CMD_DATA_EN_M BITFIELD_MASK(1) /* Bit 5 - Using DAT line */ ++#define CMD_DATA_EN_S 5 ++#define CMD_TYPE_M BITFIELD_MASK(2) /* Bit [6-7] - Normal, abort, resume, etc ++ */ ++#define CMD_TYPE_S 6 ++#define CMD_INDEX_M BITFIELD_MASK(6) /* Bits [8-13] - Command number */ ++#define CMD_INDEX_S 8 ++ ++/* SD_BufferDataPort0 : Offset 0x020, size = 2 or 4 bytes */ ++/* SD_BufferDataPort1 : Offset 0x022, size = 2 bytes */ ++/* SD_PresentState : Offset 0x024, size = 4 bytes */ ++#define PRES_CMD_INHIBIT_M BITFIELD_MASK(1) /* Bit 0 May use CMD */ ++#define PRES_CMD_INHIBIT_S 0 ++#define PRES_DAT_INHIBIT_M BITFIELD_MASK(1) /* Bit 1 May use DAT */ ++#define PRES_DAT_INHIBIT_S 1 ++#define PRES_DAT_BUSY_M BITFIELD_MASK(1) /* Bit 2 DAT is busy */ ++#define PRES_DAT_BUSY_S 2 ++#define PRES_PRESENT_RSVD_M BITFIELD_MASK(5) /* Bit [3-7] rsvd */ ++#define PRES_PRESENT_RSVD_S 3 ++#define PRES_WRITE_ACTIVE_M BITFIELD_MASK(1) /* Bit 8 Write is active */ ++#define PRES_WRITE_ACTIVE_S 8 ++#define PRES_READ_ACTIVE_M BITFIELD_MASK(1) /* Bit 9 Read is active */ ++#define PRES_READ_ACTIVE_S 9 ++#define PRES_WRITE_DATA_RDY_M BITFIELD_MASK(1) /* Bit 10 Write buf is avail */ ++#define PRES_WRITE_DATA_RDY_S 10 ++#define PRES_READ_DATA_RDY_M BITFIELD_MASK(1) /* Bit 11 Read buf data avail */ ++#define PRES_READ_DATA_RDY_S 11 ++#define PRES_CARD_PRESENT_M BITFIELD_MASK(1) /* Bit 16 Card present - debounced */ ++#define PRES_CARD_PRESENT_S 16 ++#define PRES_CARD_STABLE_M BITFIELD_MASK(1) /* Bit 17 Debugging */ ++#define PRES_CARD_STABLE_S 17 ++#define PRES_CARD_PRESENT_RAW_M BITFIELD_MASK(1) /* Bit 18 Not debounced */ ++#define PRES_CARD_PRESENT_RAW_S 18 ++#define PRES_WRITE_ENABLED_M BITFIELD_MASK(1) /* Bit 19 Write protected? */ ++#define PRES_WRITE_ENABLED_S 19 ++#define PRES_DAT_SIGNAL_M BITFIELD_MASK(4) /* Bit [20-23] Debugging */ ++#define PRES_DAT_SIGNAL_S 20 ++#define PRES_CMD_SIGNAL_M BITFIELD_MASK(1) /* Bit 24 Debugging */ ++#define PRES_CMD_SIGNAL_S 24 ++ ++/* SD_HostCntrl: Offset 0x028, size = 1 bytes */ ++#define HOST_LED_M BITFIELD_MASK(1) /* Bit 0 LED On/Off */ ++#define HOST_LED_S 0 ++#define HOST_DATA_WIDTH_M BITFIELD_MASK(1) /* Bit 1 4 bit enable */ ++#define HOST_DATA_WIDTH_S 1 ++#define HOST_HI_SPEED_EN_M BITFIELD_MASK(1) /* Bit 2 High speed vs low speed */ ++#define HOST_DMA_SEL_S 3 ++#define HOST_DMA_SEL_M BITFIELD_MASK(2) /* Bit 4:3 DMA Select */ ++#define HOST_HI_SPEED_EN_S 2 ++ ++/* Host Control2: */ ++#define HOSTCtrl2_PRESVAL_EN_M BITFIELD_MASK(1) /* 1 bit */ ++#define HOSTCtrl2_PRESVAL_EN_S 15 /* bit# */ ++ ++#define HOSTCtrl2_ASYINT_EN_M BITFIELD_MASK(1) /* 1 bit */ ++#define HOSTCtrl2_ASYINT_EN_S 14 /* bit# */ ++ ++#define HOSTCtrl2_SAMPCLK_SEL_M BITFIELD_MASK(1) /* 1 bit */ ++#define HOSTCtrl2_SAMPCLK_SEL_S 7 /* bit# */ ++ ++#define HOSTCtrl2_EXEC_TUNING_M BITFIELD_MASK(1) /* 1 bit */ ++#define HOSTCtrl2_EXEC_TUNING_S 6 /* bit# */ ++ ++#define HOSTCtrl2_DRIVSTRENGTH_SEL_M BITFIELD_MASK(2) /* 2 bit */ ++#define HOSTCtrl2_DRIVSTRENGTH_SEL_S 4 /* bit# */ ++ ++#define HOSTCtrl2_1_8SIG_EN_M BITFIELD_MASK(1) /* 1 bit */ ++#define HOSTCtrl2_1_8SIG_EN_S 3 /* bit# */ ++ ++#define HOSTCtrl2_UHSMODE_SEL_M BITFIELD_MASK(3) /* 3 bit */ ++#define HOSTCtrl2_UHSMODE_SEL_S 0 /* bit# */ ++ ++#define HOST_CONTR_VER_2 (1) ++#define HOST_CONTR_VER_3 (2) ++ ++/* misc defines */ ++#define SD1_MODE 0x1 /* SD Host Cntrlr Spec */ ++#define SD4_MODE 0x2 /* SD Host Cntrlr Spec */ ++ ++/* SD_PwrCntrl: Offset 0x029, size = 1 bytes */ ++#define PWR_BUS_EN_M BITFIELD_MASK(1) /* Bit 0 Power the bus */ ++#define PWR_BUS_EN_S 0 ++#define PWR_VOLTS_M BITFIELD_MASK(3) /* Bit [1-3] Voltage Select */ ++#define PWR_VOLTS_S 1 ++ ++/* SD_SoftwareReset: Offset 0x02F, size = 1 byte */ ++#define SW_RESET_ALL_M BITFIELD_MASK(1) /* Bit 0 Reset All */ ++#define SW_RESET_ALL_S 0 ++#define SW_RESET_CMD_M BITFIELD_MASK(1) /* Bit 1 CMD Line Reset */ ++#define SW_RESET_CMD_S 1 ++#define SW_RESET_DAT_M BITFIELD_MASK(1) /* Bit 2 DAT Line Reset */ ++#define SW_RESET_DAT_S 2 ++ ++/* SD_IntrStatus: Offset 0x030, size = 2 bytes */ ++/* Defs also serve SD_IntrStatusEnable and SD_IntrSignalEnable */ ++#define INTSTAT_CMD_COMPLETE_M BITFIELD_MASK(1) /* Bit 0 */ ++#define INTSTAT_CMD_COMPLETE_S 0 ++#define INTSTAT_XFER_COMPLETE_M BITFIELD_MASK(1) ++#define INTSTAT_XFER_COMPLETE_S 1 ++#define INTSTAT_BLOCK_GAP_EVENT_M BITFIELD_MASK(1) ++#define INTSTAT_BLOCK_GAP_EVENT_S 2 ++#define INTSTAT_DMA_INT_M BITFIELD_MASK(1) ++#define INTSTAT_DMA_INT_S 3 ++#define INTSTAT_BUF_WRITE_READY_M BITFIELD_MASK(1) ++#define INTSTAT_BUF_WRITE_READY_S 4 ++#define INTSTAT_BUF_READ_READY_M BITFIELD_MASK(1) ++#define INTSTAT_BUF_READ_READY_S 5 ++#define INTSTAT_CARD_INSERTION_M BITFIELD_MASK(1) ++#define INTSTAT_CARD_INSERTION_S 6 ++#define INTSTAT_CARD_REMOVAL_M BITFIELD_MASK(1) ++#define INTSTAT_CARD_REMOVAL_S 7 ++#define INTSTAT_CARD_INT_M BITFIELD_MASK(1) ++#define INTSTAT_CARD_INT_S 8 ++#define INTSTAT_RETUNING_INT_M BITFIELD_MASK(1) /* Bit 12 */ ++#define INTSTAT_RETUNING_INT_S 12 ++#define INTSTAT_ERROR_INT_M BITFIELD_MASK(1) /* Bit 15 */ ++#define INTSTAT_ERROR_INT_S 15 ++ ++/* SD_ErrorIntrStatus: Offset 0x032, size = 2 bytes */ ++/* Defs also serve SD_ErrorIntrStatusEnable and SD_ErrorIntrSignalEnable */ ++#define ERRINT_CMD_TIMEOUT_M BITFIELD_MASK(1) ++#define ERRINT_CMD_TIMEOUT_S 0 ++#define ERRINT_CMD_CRC_M BITFIELD_MASK(1) ++#define ERRINT_CMD_CRC_S 1 ++#define ERRINT_CMD_ENDBIT_M BITFIELD_MASK(1) ++#define ERRINT_CMD_ENDBIT_S 2 ++#define ERRINT_CMD_INDEX_M BITFIELD_MASK(1) ++#define ERRINT_CMD_INDEX_S 3 ++#define ERRINT_DATA_TIMEOUT_M BITFIELD_MASK(1) ++#define ERRINT_DATA_TIMEOUT_S 4 ++#define ERRINT_DATA_CRC_M BITFIELD_MASK(1) ++#define ERRINT_DATA_CRC_S 5 ++#define ERRINT_DATA_ENDBIT_M BITFIELD_MASK(1) ++#define ERRINT_DATA_ENDBIT_S 6 ++#define ERRINT_CURRENT_LIMIT_M BITFIELD_MASK(1) ++#define ERRINT_CURRENT_LIMIT_S 7 ++#define ERRINT_AUTO_CMD12_M BITFIELD_MASK(1) ++#define ERRINT_AUTO_CMD12_S 8 ++#define ERRINT_VENDOR_M BITFIELD_MASK(4) ++#define ERRINT_VENDOR_S 12 ++#define ERRINT_ADMA_M BITFIELD_MASK(1) ++#define ERRINT_ADMA_S 9 ++ ++/* Also provide definitions in "normal" form to allow combined masks */ ++#define ERRINT_CMD_TIMEOUT_BIT 0x0001 ++#define ERRINT_CMD_CRC_BIT 0x0002 ++#define ERRINT_CMD_ENDBIT_BIT 0x0004 ++#define ERRINT_CMD_INDEX_BIT 0x0008 ++#define ERRINT_DATA_TIMEOUT_BIT 0x0010 ++#define ERRINT_DATA_CRC_BIT 0x0020 ++#define ERRINT_DATA_ENDBIT_BIT 0x0040 ++#define ERRINT_CURRENT_LIMIT_BIT 0x0080 ++#define ERRINT_AUTO_CMD12_BIT 0x0100 ++#define ERRINT_ADMA_BIT 0x0200 ++ ++/* Masks to select CMD vs. DATA errors */ ++#define ERRINT_CMD_ERRS (ERRINT_CMD_TIMEOUT_BIT | ERRINT_CMD_CRC_BIT |\ ++ ERRINT_CMD_ENDBIT_BIT | ERRINT_CMD_INDEX_BIT) ++#define ERRINT_DATA_ERRS (ERRINT_DATA_TIMEOUT_BIT | ERRINT_DATA_CRC_BIT |\ ++ ERRINT_DATA_ENDBIT_BIT | ERRINT_ADMA_BIT) ++#define ERRINT_TRANSFER_ERRS (ERRINT_CMD_ERRS | ERRINT_DATA_ERRS) ++ ++/* SD_WakeupCntr_BlockGapCntrl : Offset 0x02A , size = bytes */ ++/* SD_ClockCntrl : Offset 0x02C , size = bytes */ ++/* SD_SoftwareReset_TimeoutCntrl : Offset 0x02E , size = bytes */ ++/* SD_IntrStatus : Offset 0x030 , size = bytes */ ++/* SD_ErrorIntrStatus : Offset 0x032 , size = bytes */ ++/* SD_IntrStatusEnable : Offset 0x034 , size = bytes */ ++/* SD_ErrorIntrStatusEnable : Offset 0x036 , size = bytes */ ++/* SD_IntrSignalEnable : Offset 0x038 , size = bytes */ ++/* SD_ErrorIntrSignalEnable : Offset 0x03A , size = bytes */ ++/* SD_CMD12ErrorStatus : Offset 0x03C , size = bytes */ ++/* SD_Capabilities : Offset 0x040 , size = bytes */ ++/* SD_MaxCurCap : Offset 0x048 , size = bytes */ ++/* SD_MaxCurCap_Reserved: Offset 0x04C , size = bytes */ ++/* SD_SlotInterruptStatus: Offset 0x0FC , size = bytes */ ++/* SD_HostControllerVersion : Offset 0x0FE , size = bytes */ ++ ++/* SDIO Host Control Register DMA Mode Definitions */ ++#define SDIOH_SDMA_MODE 0 ++#define SDIOH_ADMA1_MODE 1 ++#define SDIOH_ADMA2_MODE 2 ++#define SDIOH_ADMA2_64_MODE 3 ++ ++#define ADMA2_ATTRIBUTE_VALID (1 << 0) /* ADMA Descriptor line valid */ ++#define ADMA2_ATTRIBUTE_END (1 << 1) /* End of Descriptor */ ++#define ADMA2_ATTRIBUTE_INT (1 << 2) /* Interrupt when line is done */ ++#define ADMA2_ATTRIBUTE_ACT_NOP (0 << 4) /* Skip current line, go to next. */ ++#define ADMA2_ATTRIBUTE_ACT_RSV (1 << 4) /* Same as NOP */ ++#define ADMA1_ATTRIBUTE_ACT_SET (1 << 4) /* ADMA1 Only - set transfer length */ ++#define ADMA2_ATTRIBUTE_ACT_TRAN (2 << 4) /* Transfer Data of one descriptor line. */ ++#define ADMA2_ATTRIBUTE_ACT_LINK (3 << 4) /* Link Descriptor */ ++ ++/* ADMA2 Descriptor Table Entry for 32-bit Address */ ++typedef struct adma2_dscr_32b { ++ uint32 len_attr; ++ uint32 phys_addr; ++} adma2_dscr_32b_t; ++ ++/* ADMA1 Descriptor Table Entry */ ++typedef struct adma1_dscr { ++ uint32 phys_addr_attr; ++} adma1_dscr_t; ++ ++#endif /* _SDIOH_H */ +diff --git a/drivers/net/wireless/ap6210/include/sdiovar.h b/drivers/net/wireless/ap6210/include/sdiovar.h +new file mode 100644 +index 0000000..83f82de +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/sdiovar.h +@@ -0,0 +1,58 @@ ++/* ++ * Structure used by apps whose drivers access SDIO drivers. ++ * Pulled out separately so dhdu and wlu can both use it. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sdiovar.h 241182 2011-02-17 21:50:03Z $ ++ */ ++ ++#ifndef _sdiovar_h_ ++#define _sdiovar_h_ ++ ++#include ++ ++/* require default structure packing */ ++#define BWL_DEFAULT_PACKING ++#include ++ ++typedef struct sdreg { ++ int func; ++ int offset; ++ int value; ++} sdreg_t; ++ ++/* Common msglevel constants */ ++#define SDH_ERROR_VAL 0x0001 /* Error */ ++#define SDH_TRACE_VAL 0x0002 /* Trace */ ++#define SDH_INFO_VAL 0x0004 /* Info */ ++#define SDH_DEBUG_VAL 0x0008 /* Debug */ ++#define SDH_DATA_VAL 0x0010 /* Data */ ++#define SDH_CTRL_VAL 0x0020 /* Control Regs */ ++#define SDH_LOG_VAL 0x0040 /* Enable bcmlog */ ++#define SDH_DMA_VAL 0x0080 /* DMA */ ++ ++#define NUM_PREV_TRANSACTIONS 16 ++ ++ ++#include ++ ++#endif /* _sdiovar_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/siutils.h b/drivers/net/wireless/ap6210/include/siutils.h +new file mode 100644 +index 0000000..acc72ee +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/siutils.h +@@ -0,0 +1,347 @@ ++/* ++ * Misc utility routines for accessing the SOC Interconnects ++ * of Broadcom HNBU chips. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: siutils.h 347614 2012-07-27 10:24:51Z $ ++ */ ++ ++#ifndef _siutils_h_ ++#define _siutils_h_ ++ ++/* ++ * Data structure to export all chip specific common variables ++ * public (read-only) portion of siutils handle returned by si_attach()/si_kattach() ++ */ ++struct si_pub { ++ uint socitype; /* SOCI_SB, SOCI_AI */ ++ ++ uint bustype; /* SI_BUS, PCI_BUS */ ++ uint buscoretype; /* PCI_CORE_ID, PCIE_CORE_ID, PCMCIA_CORE_ID */ ++ uint buscorerev; /* buscore rev */ ++ uint buscoreidx; /* buscore index */ ++ int ccrev; /* chip common core rev */ ++ uint32 cccaps; /* chip common capabilities */ ++ uint32 cccaps_ext; /* chip common capabilities extension */ ++ int pmurev; /* pmu core rev */ ++ uint32 pmucaps; /* pmu capabilities */ ++ uint boardtype; /* board type */ ++ uint boardrev; /* board rev */ ++ uint boardvendor; /* board vendor */ ++ uint boardflags; /* board flags */ ++ uint boardflags2; /* board flags2 */ ++ uint chip; /* chip number */ ++ uint chiprev; /* chip revision */ ++ uint chippkg; /* chip package option */ ++ uint32 chipst; /* chip status */ ++ bool issim; /* chip is in simulation or emulation */ ++ uint socirev; /* SOC interconnect rev */ ++ bool pci_pr32414; ++ ++}; ++ ++/* for HIGH_ONLY driver, the si_t must be writable to allow states sync from BMAC to HIGH driver ++ * for monolithic driver, it is readonly to prevent accident change ++ */ ++typedef const struct si_pub si_t; ++ ++ ++/* ++ * Many of the routines below take an 'sih' handle as their first arg. ++ * Allocate this by calling si_attach(). Free it by calling si_detach(). ++ * At any one time, the sih is logically focused on one particular si core ++ * (the "current core"). ++ * Use si_setcore() or si_setcoreidx() to change the association to another core. ++ */ ++#define SI_OSH NULL /* Use for si_kattach when no osh is available */ ++ ++#define BADIDX (SI_MAXCORES + 1) ++ ++/* clkctl xtal what flags */ ++#define XTAL 0x1 /* primary crystal oscillator (2050) */ ++#define PLL 0x2 /* main chip pll */ ++ ++/* clkctl clk mode */ ++#define CLK_FAST 0 /* force fast (pll) clock */ ++#define CLK_DYNAMIC 2 /* enable dynamic clock control */ ++ ++/* GPIO usage priorities */ ++#define GPIO_DRV_PRIORITY 0 /* Driver */ ++#define GPIO_APP_PRIORITY 1 /* Application */ ++#define GPIO_HI_PRIORITY 2 /* Highest priority. Ignore GPIO reservation */ ++ ++/* GPIO pull up/down */ ++#define GPIO_PULLUP 0 ++#define GPIO_PULLDN 1 ++ ++/* GPIO event regtype */ ++#define GPIO_REGEVT 0 /* GPIO register event */ ++#define GPIO_REGEVT_INTMSK 1 /* GPIO register event int mask */ ++#define GPIO_REGEVT_INTPOL 2 /* GPIO register event int polarity */ ++ ++/* device path */ ++#define SI_DEVPATH_BUFSZ 16 /* min buffer size in bytes */ ++ ++/* SI routine enumeration: to be used by update function with multiple hooks */ ++#define SI_DOATTACH 1 ++#define SI_PCIDOWN 2 ++#define SI_PCIUP 3 ++ ++#define ISSIM_ENAB(sih) 0 ++ ++/* PMU clock/power control */ ++#if defined(BCMPMUCTL) ++#define PMUCTL_ENAB(sih) (BCMPMUCTL) ++#else ++#define PMUCTL_ENAB(sih) ((sih)->cccaps & CC_CAP_PMU) ++#endif ++ ++/* chipcommon clock/power control (exclusive with PMU's) */ ++#if defined(BCMPMUCTL) && BCMPMUCTL ++#define CCCTL_ENAB(sih) (0) ++#define CCPLL_ENAB(sih) (0) ++#else ++#define CCCTL_ENAB(sih) ((sih)->cccaps & CC_CAP_PWR_CTL) ++#define CCPLL_ENAB(sih) ((sih)->cccaps & CC_CAP_PLL_MASK) ++#endif ++ ++typedef void (*gpio_handler_t)(uint32 stat, void *arg); ++/* External BT Coex enable mask */ ++#define CC_BTCOEX_EN_MASK 0x01 ++/* External PA enable mask */ ++#define GPIO_CTRL_EPA_EN_MASK 0x40 ++/* WL/BT control enable mask */ ++#define GPIO_CTRL_5_6_EN_MASK 0x60 ++#define GPIO_CTRL_7_6_EN_MASK 0xC0 ++#define GPIO_OUT_7_EN_MASK 0x80 ++ ++ ++/* CR4 specific defines used by the host driver */ ++#define SI_CR4_CAP (0x04) ++#define SI_CR4_BANKIDX (0x40) ++#define SI_CR4_BANKINFO (0x44) ++ ++#define ARMCR4_TCBBNB_MASK 0xf0 ++#define ARMCR4_TCBBNB_SHIFT 4 ++#define ARMCR4_TCBANB_MASK 0xf ++#define ARMCR4_TCBANB_SHIFT 0 ++ ++#define SICF_CPUHALT (0x0020) ++#define ARMCR4_BSZ_MASK 0x3f ++#define ARMCR4_BSZ_MULT 8192 ++ ++ ++/* === exported functions === */ ++extern si_t *si_attach(uint pcidev, osl_t *osh, void *regs, uint bustype, ++ void *sdh, char **vars, uint *varsz); ++extern si_t *si_kattach(osl_t *osh); ++extern void si_detach(si_t *sih); ++extern bool si_pci_war16165(si_t *sih); ++ ++extern uint si_corelist(si_t *sih, uint coreid[]); ++extern uint si_coreid(si_t *sih); ++extern uint si_flag(si_t *sih); ++extern uint si_intflag(si_t *sih); ++extern uint si_coreidx(si_t *sih); ++extern uint si_coreunit(si_t *sih); ++extern uint si_corevendor(si_t *sih); ++extern uint si_corerev(si_t *sih); ++extern void *si_osh(si_t *sih); ++extern void si_setosh(si_t *sih, osl_t *osh); ++extern uint si_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val); ++extern void *si_coreregs(si_t *sih); ++extern uint si_wrapperreg(si_t *sih, uint32 offset, uint32 mask, uint32 val); ++extern uint32 si_core_cflags(si_t *sih, uint32 mask, uint32 val); ++extern void si_core_cflags_wo(si_t *sih, uint32 mask, uint32 val); ++extern uint32 si_core_sflags(si_t *sih, uint32 mask, uint32 val); ++extern bool si_iscoreup(si_t *sih); ++extern uint si_findcoreidx(si_t *sih, uint coreid, uint coreunit); ++extern void *si_setcoreidx(si_t *sih, uint coreidx); ++extern void *si_setcore(si_t *sih, uint coreid, uint coreunit); ++extern void *si_switch_core(si_t *sih, uint coreid, uint *origidx, uint *intr_val); ++extern void si_restore_core(si_t *sih, uint coreid, uint intr_val); ++extern int si_numaddrspaces(si_t *sih); ++extern uint32 si_addrspace(si_t *sih, uint asidx); ++extern uint32 si_addrspacesize(si_t *sih, uint asidx); ++extern void si_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size); ++extern int si_corebist(si_t *sih); ++extern void si_core_reset(si_t *sih, uint32 bits, uint32 resetbits); ++extern void si_core_disable(si_t *sih, uint32 bits); ++extern uint32 si_clock_rate(uint32 pll_type, uint32 n, uint32 m); ++extern bool si_read_pmu_autopll(si_t *sih); ++extern uint32 si_clock(si_t *sih); ++extern uint32 si_alp_clock(si_t *sih); ++extern uint32 si_ilp_clock(si_t *sih); ++extern void si_pci_setup(si_t *sih, uint coremask); ++extern void si_pcmcia_init(si_t *sih); ++extern void si_setint(si_t *sih, int siflag); ++extern bool si_backplane64(si_t *sih); ++extern void si_register_intr_callback(si_t *sih, void *intrsoff_fn, void *intrsrestore_fn, ++ void *intrsenabled_fn, void *intr_arg); ++extern void si_deregister_intr_callback(si_t *sih); ++extern void si_clkctl_init(si_t *sih); ++extern uint16 si_clkctl_fast_pwrup_delay(si_t *sih); ++extern bool si_clkctl_cc(si_t *sih, uint mode); ++extern int si_clkctl_xtal(si_t *sih, uint what, bool on); ++extern uint32 si_gpiotimerval(si_t *sih, uint32 mask, uint32 val); ++extern void si_btcgpiowar(si_t *sih); ++extern bool si_deviceremoved(si_t *sih); ++extern uint32 si_socram_size(si_t *sih); ++extern uint32 si_socdevram_size(si_t *sih); ++extern uint32 si_socram_srmem_size(si_t *sih); ++extern void si_socdevram(si_t *sih, bool set, uint8 *ennable, uint8 *protect, uint8 *remap); ++extern bool si_socdevram_pkg(si_t *sih); ++extern bool si_socdevram_remap_isenb(si_t *sih); ++extern uint32 si_socdevram_remap_size(si_t *sih); ++ ++extern void si_watchdog(si_t *sih, uint ticks); ++extern void si_watchdog_ms(si_t *sih, uint32 ms); ++extern uint32 si_watchdog_msticks(void); ++extern void *si_gpiosetcore(si_t *sih); ++extern uint32 si_gpiocontrol(si_t *sih, uint32 mask, uint32 val, uint8 priority); ++extern uint32 si_gpioouten(si_t *sih, uint32 mask, uint32 val, uint8 priority); ++extern uint32 si_gpioout(si_t *sih, uint32 mask, uint32 val, uint8 priority); ++extern uint32 si_gpioin(si_t *sih); ++extern uint32 si_gpiointpolarity(si_t *sih, uint32 mask, uint32 val, uint8 priority); ++extern uint32 si_gpiointmask(si_t *sih, uint32 mask, uint32 val, uint8 priority); ++extern uint32 si_gpioled(si_t *sih, uint32 mask, uint32 val); ++extern uint32 si_gpioreserve(si_t *sih, uint32 gpio_num, uint8 priority); ++extern uint32 si_gpiorelease(si_t *sih, uint32 gpio_num, uint8 priority); ++extern uint32 si_gpiopull(si_t *sih, bool updown, uint32 mask, uint32 val); ++extern uint32 si_gpioevent(si_t *sih, uint regtype, uint32 mask, uint32 val); ++extern uint32 si_gpio_int_enable(si_t *sih, bool enable); ++ ++/* GPIO event handlers */ ++extern void *si_gpio_handler_register(si_t *sih, uint32 e, bool lev, gpio_handler_t cb, void *arg); ++extern void si_gpio_handler_unregister(si_t *sih, void* gpioh); ++extern void si_gpio_handler_process(si_t *sih); ++ ++/* Wake-on-wireless-LAN (WOWL) */ ++extern bool si_pci_pmecap(si_t *sih); ++struct osl_info; ++extern bool si_pci_fastpmecap(struct osl_info *osh); ++extern bool si_pci_pmestat(si_t *sih); ++extern void si_pci_pmeclr(si_t *sih); ++extern void si_pci_pmeen(si_t *sih); ++extern void si_pci_pmestatclr(si_t *sih); ++extern uint si_pcie_readreg(void *sih, uint addrtype, uint offset); ++ ++extern void si_sdio_init(si_t *sih); ++ ++extern uint16 si_d11_devid(si_t *sih); ++extern int si_corepciid(si_t *sih, uint func, uint16 *pcivendor, uint16 *pcidevice, ++ uint8 *pciclass, uint8 *pcisubclass, uint8 *pciprogif, uint8 *pciheader); ++ ++#define si_eci(sih) 0 ++static INLINE void * si_eci_init(si_t *sih) {return NULL;} ++#define si_eci_notify_bt(sih, type, val) (0) ++#define si_seci(sih) 0 ++#define si_seci_upd(sih, a) do {} while (0) ++static INLINE void * si_seci_init(si_t *sih, uint8 use_seci) {return NULL;} ++#define si_seci_down(sih) do {} while (0) ++ ++/* OTP status */ ++extern bool si_is_otp_disabled(si_t *sih); ++extern bool si_is_otp_powered(si_t *sih); ++extern void si_otp_power(si_t *sih, bool on); ++ ++/* SPROM availability */ ++extern bool si_is_sprom_available(si_t *sih); ++extern bool si_is_sprom_enabled(si_t *sih); ++extern void si_sprom_enable(si_t *sih, bool enable); ++ ++/* OTP/SROM CIS stuff */ ++extern int si_cis_source(si_t *sih); ++#define CIS_DEFAULT 0 ++#define CIS_SROM 1 ++#define CIS_OTP 2 ++ ++/* Fab-id information */ ++#define DEFAULT_FAB 0x0 /* Original/first fab used for this chip */ ++#define CSM_FAB7 0x1 /* CSM Fab7 chip */ ++#define TSMC_FAB12 0x2 /* TSMC Fab12/Fab14 chip */ ++#define SMIC_FAB4 0x3 /* SMIC Fab4 chip */ ++extern int si_otp_fabid(si_t *sih, uint16 *fabid, bool rw); ++extern uint16 si_fabid(si_t *sih); ++ ++/* ++ * Build device path. Path size must be >= SI_DEVPATH_BUFSZ. ++ * The returned path is NULL terminated and has trailing '/'. ++ * Return 0 on success, nonzero otherwise. ++ */ ++extern int si_devpath(si_t *sih, char *path, int size); ++/* Read variable with prepending the devpath to the name */ ++extern char *si_getdevpathvar(si_t *sih, const char *name); ++extern int si_getdevpathintvar(si_t *sih, const char *name); ++extern char *si_coded_devpathvar(si_t *sih, char *varname, int var_len, const char *name); ++ ++ ++extern uint8 si_pcieclkreq(si_t *sih, uint32 mask, uint32 val); ++extern uint32 si_pcielcreg(si_t *sih, uint32 mask, uint32 val); ++extern void si_war42780_clkreq(si_t *sih, bool clkreq); ++extern void si_pci_down(si_t *sih); ++extern void si_pci_up(si_t *sih); ++extern void si_pci_sleep(si_t *sih); ++extern void si_pcie_war_ovr_update(si_t *sih, uint8 aspm); ++extern void si_pcie_power_save_enable(si_t *sih, bool enable); ++extern void si_pcie_extendL1timer(si_t *sih, bool extend); ++extern int si_pci_fixcfg(si_t *sih); ++extern void si_chippkg_set(si_t *sih, uint); ++ ++extern void si_chipcontrl_btshd0_4331(si_t *sih, bool on); ++extern void si_chipcontrl_restore(si_t *sih, uint32 val); ++extern uint32 si_chipcontrl_read(si_t *sih); ++extern void si_chipcontrl_epa4331(si_t *sih, bool on); ++extern void si_chipcontrl_epa4331_wowl(si_t *sih, bool enter_wowl); ++extern void si_chipcontrl_srom4360(si_t *sih, bool on); ++/* Enable BT-COEX & Ex-PA for 4313 */ ++extern void si_epa_4313war(si_t *sih); ++extern void si_btc_enable_chipcontrol(si_t *sih); ++/* BT/WL selection for 4313 bt combo >= P250 boards */ ++extern void si_btcombo_p250_4313_war(si_t *sih); ++extern void si_btcombo_43228_war(si_t *sih); ++extern void si_clk_pmu_htavail_set(si_t *sih, bool set_clear); ++extern uint si_pll_reset(si_t *sih); ++/* === debug routines === */ ++ ++extern bool si_taclear(si_t *sih, bool details); ++ ++ ++ ++extern uint32 si_pciereg(si_t *sih, uint32 offset, uint32 mask, uint32 val, uint type); ++extern uint32 si_pcieserdesreg(si_t *sih, uint32 mdioslave, uint32 offset, uint32 mask, uint32 val); ++extern void si_pcie_set_request_size(si_t *sih, uint16 size); ++extern uint16 si_pcie_get_request_size(si_t *sih); ++extern uint16 si_pcie_get_ssid(si_t *sih); ++extern uint32 si_pcie_get_bar0(si_t *sih); ++extern int si_pcie_configspace_cache(si_t *sih); ++extern int si_pcie_configspace_restore(si_t *sih); ++extern int si_pcie_configspace_get(si_t *sih, uint8 *buf, uint size); ++ ++char *si_getnvramflvar(si_t *sih, const char *name); ++ ++ ++extern uint32 si_tcm_size(si_t *sih); ++ ++extern int si_set_sromctl(si_t *sih, uint32 value); ++extern uint32 si_get_sromctl(si_t *sih); ++#endif /* _siutils_h_ */ +diff --git a/drivers/net/wireless/ap6210/include/trxhdr.h b/drivers/net/wireless/ap6210/include/trxhdr.h +new file mode 100644 +index 0000000..bf92a56 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/trxhdr.h +@@ -0,0 +1,53 @@ ++/* ++ * TRX image file header format. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: trxhdr.h 260898 2011-05-20 23:11:12Z $ ++ */ ++ ++#ifndef _TRX_HDR_H ++#define _TRX_HDR_H ++ ++#include ++ ++#define TRX_MAGIC 0x30524448 /* "HDR0" */ ++#define TRX_VERSION 1 /* Version 1 */ ++#define TRX_MAX_LEN 0x3B0000 /* Max length */ ++#define TRX_NO_HEADER 1 /* Do not write TRX header */ ++#define TRX_GZ_FILES 0x2 /* Contains up to TRX_MAX_OFFSET individual gzip files */ ++#define TRX_EMBED_UCODE 0x8 /* Trx contains embedded ucode image */ ++#define TRX_ROMSIM_IMAGE 0x10 /* Trx contains ROM simulation image */ ++#define TRX_UNCOMP_IMAGE 0x20 /* Trx contains uncompressed rtecdc.bin image */ ++#define TRX_MAX_OFFSET 3 /* Max number of individual files */ ++ ++struct trx_header { ++ uint32 magic; /* "HDR0" */ ++ uint32 len; /* Length of file including header */ ++ uint32 crc32; /* 32-bit CRC from flag_version to end of file */ ++ uint32 flag_version; /* 0:15 flags, 16:31 version */ ++ uint32 offsets[TRX_MAX_OFFSET]; /* Offsets of partitions from start of header */ ++}; ++ ++/* Compatibility */ ++typedef struct trx_header TRXHDR, *PTRXHDR; ++ ++#endif /* _TRX_HDR_H */ +diff --git a/drivers/net/wireless/ap6210/include/typedefs.h b/drivers/net/wireless/ap6210/include/typedefs.h +new file mode 100644 +index 0000000..fe1d162 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/typedefs.h +@@ -0,0 +1,343 @@ ++/* ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * $Id: typedefs.h 286783 2011-09-29 06:18:57Z $ ++ */ ++ ++#ifndef _TYPEDEFS_H_ ++#define _TYPEDEFS_H_ ++ ++#ifdef SITE_TYPEDEFS ++ ++/* ++ * Define SITE_TYPEDEFS in the compile to include a site-specific ++ * typedef file "site_typedefs.h". ++ * ++ * If SITE_TYPEDEFS is not defined, then the code section below makes ++ * inferences about the compile environment based on defined symbols and ++ * possibly compiler pragmas. ++ * ++ * Following these two sections is the Default Typedefs section. ++ * This section is only processed if USE_TYPEDEF_DEFAULTS is ++ * defined. This section has a default set of typedefs and a few ++ * preprocessor symbols (TRUE, FALSE, NULL, ...). ++ */ ++ ++#include "site_typedefs.h" ++ ++#else ++ ++/* ++ * Infer the compile environment based on preprocessor symbols and pragmas. ++ * Override type definitions as needed, and include configuration-dependent ++ * header files to define types. ++ */ ++ ++#ifdef __cplusplus ++ ++#define TYPEDEF_BOOL ++#ifndef FALSE ++#define FALSE false ++#endif ++#ifndef TRUE ++#define TRUE true ++#endif ++ ++#else /* ! __cplusplus */ ++ ++ ++#endif /* ! __cplusplus */ ++ ++#if defined(__x86_64__) ++#define TYPEDEF_UINTPTR ++typedef unsigned long long int uintptr; ++#endif ++ ++ ++ ++ ++ ++#if defined(_NEED_SIZE_T_) ++typedef long unsigned int size_t; ++#endif ++ ++ ++ ++ ++#if defined(__sparc__) ++#define TYPEDEF_ULONG ++#endif ++ ++ ++/* ++ * If this is either a Linux hybrid build or the per-port code of a hybrid build ++ * then use the Linux header files to get some of the typedefs. Otherwise, define ++ * them entirely in this file. We can't always define the types because we get ++ * a duplicate typedef error; there is no way to "undefine" a typedef. ++ * We know when it's per-port code because each file defines LINUX_PORT at the top. ++ */ ++#if !defined(LINUX_HYBRID) || defined(LINUX_PORT) ++#define TYPEDEF_UINT ++#ifndef TARGETENV_android ++#define TYPEDEF_USHORT ++#define TYPEDEF_ULONG ++#endif /* TARGETENV_android */ ++#ifdef __KERNEL__ ++#include ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) ++#define TYPEDEF_BOOL ++#endif /* >= 2.6.19 */ ++/* special detection for 2.6.18-128.7.1.0.1.el5 */ ++#if (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 18)) ++#include ++#ifdef noinline_for_stack ++#define TYPEDEF_BOOL ++#endif ++#endif /* == 2.6.18 */ ++#endif /* __KERNEL__ */ ++#endif /* !defined(LINUX_HYBRID) || defined(LINUX_PORT) */ ++ ++ ++ ++ ++/* Do not support the (u)int64 types with strict ansi for GNU C */ ++#if defined(__GNUC__) && defined(__STRICT_ANSI__) ++#define TYPEDEF_INT64 ++#define TYPEDEF_UINT64 ++#endif ++ ++/* ICL accepts unsigned 64 bit type only, and complains in ANSI mode ++ * for signed or unsigned ++ */ ++#if defined(__ICL) ++ ++#define TYPEDEF_INT64 ++ ++#if defined(__STDC__) ++#define TYPEDEF_UINT64 ++#endif ++ ++#endif /* __ICL */ ++ ++#if !defined(__DJGPP__) ++ ++/* pick up ushort & uint from standard types.h */ ++#if defined(__KERNEL__) ++ ++/* See note above */ ++#if !defined(LINUX_HYBRID) || defined(LINUX_PORT) ++#include /* sys/types.h and linux/types.h are oil and water */ ++#endif /* !defined(LINUX_HYBRID) || defined(LINUX_PORT) */ ++ ++#else ++ ++ ++#include ++ ++#endif /* linux && __KERNEL__ */ ++ ++#endif ++ ++ ++ ++/* use the default typedefs in the next section of this file */ ++#define USE_TYPEDEF_DEFAULTS ++ ++#endif /* SITE_TYPEDEFS */ ++ ++ ++/* ++ * Default Typedefs ++ */ ++ ++#ifdef USE_TYPEDEF_DEFAULTS ++#undef USE_TYPEDEF_DEFAULTS ++ ++#ifndef TYPEDEF_BOOL ++typedef /* @abstract@ */ unsigned char bool; ++#endif ++ ++/* define uchar, ushort, uint, ulong */ ++ ++#ifndef TYPEDEF_UCHAR ++typedef unsigned char uchar; ++#endif ++ ++#ifndef TYPEDEF_USHORT ++typedef unsigned short ushort; ++#endif ++ ++#ifndef TYPEDEF_UINT ++typedef unsigned int uint; ++#endif ++ ++#ifndef TYPEDEF_ULONG ++typedef unsigned long ulong; ++#endif ++ ++/* define [u]int8/16/32/64, uintptr */ ++ ++#ifndef TYPEDEF_UINT8 ++typedef unsigned char uint8; ++#endif ++ ++#ifndef TYPEDEF_UINT16 ++typedef unsigned short uint16; ++#endif ++ ++#ifndef TYPEDEF_UINT32 ++typedef unsigned int uint32; ++#endif ++ ++#ifndef TYPEDEF_UINT64 ++typedef unsigned long long uint64; ++#endif ++ ++#ifndef TYPEDEF_UINTPTR ++typedef unsigned int uintptr; ++#endif ++ ++#ifndef TYPEDEF_INT8 ++typedef signed char int8; ++#endif ++ ++#ifndef TYPEDEF_INT16 ++typedef signed short int16; ++#endif ++ ++#ifndef TYPEDEF_INT32 ++typedef signed int int32; ++#endif ++ ++#ifndef TYPEDEF_INT64 ++typedef signed long long int64; ++#endif ++ ++/* define float32/64, float_t */ ++ ++#ifndef TYPEDEF_FLOAT32 ++typedef float float32; ++#endif ++ ++#ifndef TYPEDEF_FLOAT64 ++typedef double float64; ++#endif ++ ++/* ++ * abstracted floating point type allows for compile time selection of ++ * single or double precision arithmetic. Compiling with -DFLOAT32 ++ * selects single precision; the default is double precision. ++ */ ++ ++#ifndef TYPEDEF_FLOAT_T ++ ++#if defined(FLOAT32) ++typedef float32 float_t; ++#else /* default to double precision floating point */ ++typedef float64 float_t; ++#endif ++ ++#endif /* TYPEDEF_FLOAT_T */ ++ ++/* define macro values */ ++ ++#ifndef FALSE ++#define FALSE 0 ++#endif ++ ++#ifndef TRUE ++#define TRUE 1 /* TRUE */ ++#endif ++ ++#ifndef NULL ++#define NULL 0 ++#endif ++ ++#ifndef OFF ++#define OFF 0 ++#endif ++ ++#ifndef ON ++#define ON 1 /* ON = 1 */ ++#endif ++ ++#define AUTO (-1) /* Auto = -1 */ ++ ++/* define PTRSZ, INLINE */ ++ ++#ifndef PTRSZ ++#define PTRSZ sizeof(char*) ++#endif ++ ++ ++/* Detect compiler type. */ ++#if defined(__GNUC__) || defined(__lint) ++ #define BWL_COMPILER_GNU ++#elif defined(__CC_ARM) && __CC_ARM ++ #define BWL_COMPILER_ARMCC ++#else ++ #error "Unknown compiler!" ++#endif ++ ++ ++#ifndef INLINE ++ #if defined(BWL_COMPILER_MICROSOFT) ++ #define INLINE __inline ++ #elif defined(BWL_COMPILER_GNU) ++ #define INLINE __inline__ ++ #elif defined(BWL_COMPILER_ARMCC) ++ #define INLINE __inline ++ #else ++ #define INLINE ++ #endif ++#endif /* INLINE */ ++ ++#undef TYPEDEF_BOOL ++#undef TYPEDEF_UCHAR ++#undef TYPEDEF_USHORT ++#undef TYPEDEF_UINT ++#undef TYPEDEF_ULONG ++#undef TYPEDEF_UINT8 ++#undef TYPEDEF_UINT16 ++#undef TYPEDEF_UINT32 ++#undef TYPEDEF_UINT64 ++#undef TYPEDEF_UINTPTR ++#undef TYPEDEF_INT8 ++#undef TYPEDEF_INT16 ++#undef TYPEDEF_INT32 ++#undef TYPEDEF_INT64 ++#undef TYPEDEF_FLOAT32 ++#undef TYPEDEF_FLOAT64 ++#undef TYPEDEF_FLOAT_T ++ ++#endif /* USE_TYPEDEF_DEFAULTS */ ++ ++/* Suppress unused parameter warning */ ++#define UNUSED_PARAMETER(x) (void)(x) ++ ++/* Avoid warning for discarded const or volatile qualifier in special cases (-Wcast-qual) */ ++#define DISCARD_QUAL(ptr, type) ((type *)(uintptr)(ptr)) ++ ++/* ++ * Including the bcmdefs.h here, to make sure everyone including typedefs.h ++ * gets this automatically ++*/ ++#include ++#endif /* _TYPEDEFS_H_ */ +diff --git a/drivers/net/wireless/ap6210/include/wlfc_proto.h b/drivers/net/wireless/ap6210/include/wlfc_proto.h +new file mode 100644 +index 0000000..98d2fa9 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/wlfc_proto.h +@@ -0,0 +1,217 @@ ++/* ++* Copyright (C) 1999-2012, Broadcom Corporation ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2 (the "GPL"), ++* available at http://www.broadcom.com/licenses/GPLv2.php, with the ++* following added to such license: ++* ++* As a special exception, the copyright holders of this software give you ++* permission to link this software with independent modules, and to copy and ++* distribute the resulting executable under terms of your choice, provided that ++* you also meet, for each linked independent module, the terms and conditions of ++* the license of that module. An independent module is a module which is not ++* derived from this software. The special exception does not apply to any ++* modifications of the software. ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a license ++* other than the GPL, without Broadcom's express prior written consent. ++* $Id: wlfc_proto.h 361006 2012-10-05 07:45:51Z $ ++* ++*/ ++#ifndef __wlfc_proto_definitions_h__ ++#define __wlfc_proto_definitions_h__ ++ ++ /* Use TLV to convey WLFC information. ++ --------------------------------------------------------------------------- ++ | Type | Len | value | Description ++ --------------------------------------------------------------------------- ++ | 1 | 1 | (handle) | MAC OPEN ++ --------------------------------------------------------------------------- ++ | 2 | 1 | (handle) | MAC CLOSE ++ --------------------------------------------------------------------------- ++ | 3 | 2 | (count, handle, prec_bmp)| Set the credit depth for a MAC dstn ++ --------------------------------------------------------------------------- ++ | 4 | 4 | see pkttag comments | TXSTATUS ++ --------------------------------------------------------------------------- ++ | 5 | 4 | see pkttag comments | PKKTTAG [host->firmware] ++ --------------------------------------------------------------------------- ++ | 6 | 8 | (handle, ifid, MAC) | MAC ADD ++ --------------------------------------------------------------------------- ++ | 7 | 8 | (handle, ifid, MAC) | MAC DEL ++ --------------------------------------------------------------------------- ++ | 8 | 1 | (rssi) | RSSI - RSSI value for the packet. ++ --------------------------------------------------------------------------- ++ | 9 | 1 | (interface ID) | Interface OPEN ++ --------------------------------------------------------------------------- ++ | 10 | 1 | (interface ID) | Interface CLOSE ++ --------------------------------------------------------------------------- ++ | 11 | 8 | fifo credit returns map | FIFO credits back to the host ++ | | | | ++ | | | | -------------------------------------- ++ | | | | | ac0 | ac1 | ac2 | ac3 | bcmc | atim | ++ | | | | -------------------------------------- ++ | | | | ++ --------------------------------------------------------------------------- ++ | 12 | 2 | MAC handle, | Host provides a bitmap of pending ++ | | | AC[0-3] traffic bitmap | unicast traffic for MAC-handle dstn. ++ | | | | [host->firmware] ++ --------------------------------------------------------------------------- ++ | 13 | 3 | (count, handle, prec_bmp)| One time request for packet to a specific ++ | | | | MAC destination. ++ --------------------------------------------------------------------------- ++ | 15 | 1 | interface ID | NIC period start ++ --------------------------------------------------------------------------- ++ | 16 | 1 | interface ID | NIC period end ++ --------------------------------------------------------------------------- ++ | 17 | 3 | (ifid, txs) | Action frame tx status ++ --------------------------------------------------------------------------- ++ | 255 | N/A | N/A | FILLER - This is a special type ++ | | | | that has no length or value. ++ | | | | Typically used for padding. ++ --------------------------------------------------------------------------- ++ */ ++ ++#define WLFC_CTL_TYPE_MAC_OPEN 1 ++#define WLFC_CTL_TYPE_MAC_CLOSE 2 ++#define WLFC_CTL_TYPE_MAC_REQUEST_CREDIT 3 ++#define WLFC_CTL_TYPE_TXSTATUS 4 ++#define WLFC_CTL_TYPE_PKTTAG 5 ++ ++#define WLFC_CTL_TYPE_MACDESC_ADD 6 ++#define WLFC_CTL_TYPE_MACDESC_DEL 7 ++#define WLFC_CTL_TYPE_RSSI 8 ++ ++#define WLFC_CTL_TYPE_INTERFACE_OPEN 9 ++#define WLFC_CTL_TYPE_INTERFACE_CLOSE 10 ++ ++#define WLFC_CTL_TYPE_FIFO_CREDITBACK 11 ++ ++#define WLFC_CTL_TYPE_PENDING_TRAFFIC_BMP 12 ++#define WLFC_CTL_TYPE_MAC_REQUEST_PACKET 13 ++#define WLFC_CTL_TYPE_HOST_REORDER_RXPKTS 14 ++ ++#define WLFC_CTL_TYPE_NIC_PRD_START 15 ++#define WLFC_CTL_TYPE_NIC_PRD_END 16 ++#define WLFC_CTL_TYPE_AF_TXS 17 ++#define WLFC_CTL_TYPE_TRANS_ID 18 ++#define WLFC_CTL_TYPE_COMP_TXSTATUS 19 ++ ++#define WLFC_CTL_TYPE_FILLER 255 ++ ++#define WLFC_CTL_VALUE_LEN_MACDESC 8 /* handle, interface, MAC */ ++ ++#define WLFC_CTL_VALUE_LEN_MAC 1 /* MAC-handle */ ++#define WLFC_CTL_VALUE_LEN_RSSI 1 ++ ++#define WLFC_CTL_VALUE_LEN_INTERFACE 1 ++#define WLFC_CTL_VALUE_LEN_PENDING_TRAFFIC_BMP 2 ++ ++#define WLFC_CTL_VALUE_LEN_TXSTATUS 4 ++#define WLFC_CTL_VALUE_LEN_PKTTAG 4 ++ ++/* enough space to host all 4 ACs, bc/mc and atim fifo credit */ ++#define WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK 6 ++ ++#define WLFC_CTL_VALUE_LEN_REQUEST_CREDIT 3 /* credit, MAC-handle, prec_bitmap */ ++#define WLFC_CTL_VALUE_LEN_REQUEST_PACKET 3 /* credit, MAC-handle, prec_bitmap */ ++ ++#define WLFC_CTL_VALUE_LEN_NIC_PRD_START 1 ++#define WLFC_CTL_VALUE_LEN_NIC_PRD_END 1 ++#define WLFC_CTL_VALUE_LEN_AF_TXS 3 ++ ++ ++#define WLFC_PKTID_GEN_MASK 0x80000000 ++#define WLFC_PKTID_GEN_SHIFT 31 ++ ++#define WLFC_PKTID_GEN(x) (((x) & WLFC_PKTID_GEN_MASK) >> WLFC_PKTID_GEN_SHIFT) ++#define WLFC_PKTID_SETGEN(x, gen) (x) = ((x) & ~WLFC_PKTID_GEN_MASK) | \ ++ (((gen) << WLFC_PKTID_GEN_SHIFT) & WLFC_PKTID_GEN_MASK) ++ ++#define WLFC_PKTFLAG_PKTFROMHOST 0x01 ++#define WLFC_PKTFLAG_PKT_REQUESTED 0x02 ++ ++#define WL_TXSTATUS_FLAGS_MASK 0xf /* allow 4 bits only */ ++#define WL_TXSTATUS_FLAGS_SHIFT 27 ++ ++#define WL_TXSTATUS_SET_FLAGS(x, flags) ((x) = \ ++ ((x) & ~(WL_TXSTATUS_FLAGS_MASK << WL_TXSTATUS_FLAGS_SHIFT)) | \ ++ (((flags) & WL_TXSTATUS_FLAGS_MASK) << WL_TXSTATUS_FLAGS_SHIFT)) ++#define WL_TXSTATUS_GET_FLAGS(x) (((x) >> WL_TXSTATUS_FLAGS_SHIFT) & \ ++ WL_TXSTATUS_FLAGS_MASK) ++ ++#define WL_TXSTATUS_FIFO_MASK 0x7 /* allow 3 bits for FIFO ID */ ++#define WL_TXSTATUS_FIFO_SHIFT 24 ++ ++#define WL_TXSTATUS_SET_FIFO(x, flags) ((x) = \ ++ ((x) & ~(WL_TXSTATUS_FIFO_MASK << WL_TXSTATUS_FIFO_SHIFT)) | \ ++ (((flags) & WL_TXSTATUS_FIFO_MASK) << WL_TXSTATUS_FIFO_SHIFT)) ++#define WL_TXSTATUS_GET_FIFO(x) (((x) >> WL_TXSTATUS_FIFO_SHIFT) & WL_TXSTATUS_FIFO_MASK) ++ ++#define WL_TXSTATUS_PKTID_MASK 0xffffff /* allow 24 bits */ ++#define WL_TXSTATUS_SET_PKTID(x, num) ((x) = \ ++ ((x) & ~WL_TXSTATUS_PKTID_MASK) | (num)) ++#define WL_TXSTATUS_GET_PKTID(x) ((x) & WL_TXSTATUS_PKTID_MASK) ++ ++/* 32 STA should be enough??, 6 bits; Must be power of 2 */ ++#define WLFC_MAC_DESC_TABLE_SIZE 32 ++#define WLFC_MAX_IFNUM 16 ++#define WLFC_MAC_DESC_ID_INVALID 0xff ++ ++/* b[7:5] -reuse guard, b[4:0] -value */ ++#define WLFC_MAC_DESC_GET_LOOKUP_INDEX(x) ((x) & 0x1f) ++ ++#define WLFC_PKTFLAG_SET_PKTREQUESTED(x) (x) |= \ ++ (WLFC_PKTFLAG_PKT_REQUESTED << WL_TXSTATUS_FLAGS_SHIFT) ++ ++#define WLFC_PKTFLAG_CLR_PKTREQUESTED(x) (x) &= \ ++ ~(WLFC_PKTFLAG_PKT_REQUESTED << WL_TXSTATUS_FLAGS_SHIFT) ++ ++#define WL_TXSTATUS_GENERATION_MASK 1 ++#define WL_TXSTATUS_GENERATION_SHIFT 31 ++ ++#define WLFC_PKTFLAG_SET_GENERATION(x, gen) ((x) = \ ++ ((x) & ~(WL_TXSTATUS_GENERATION_MASK << WL_TXSTATUS_GENERATION_SHIFT)) | \ ++ (((gen) & WL_TXSTATUS_GENERATION_MASK) << WL_TXSTATUS_GENERATION_SHIFT)) ++ ++#define WLFC_PKTFLAG_GENERATION(x) (((x) >> WL_TXSTATUS_GENERATION_SHIFT) & \ ++ WL_TXSTATUS_GENERATION_MASK) ++ ++#define WLFC_MAX_PENDING_DATALEN 120 ++ ++/* host is free to discard the packet */ ++#define WLFC_CTL_PKTFLAG_DISCARD 0 ++/* D11 suppressed a packet */ ++#define WLFC_CTL_PKTFLAG_D11SUPPRESS 1 ++/* WL firmware suppressed a packet because MAC is ++ already in PSMode (short time window) ++*/ ++#define WLFC_CTL_PKTFLAG_WLSUPPRESS 2 ++/* Firmware tossed this packet */ ++#define WLFC_CTL_PKTFLAG_TOSSED_BYWLC 3 ++ ++#define WLFC_D11_STATUS_INTERPRET(txs) \ ++ (((txs)->status.suppr_ind != 0) ? WLFC_CTL_PKTFLAG_D11SUPPRESS : WLFC_CTL_PKTFLAG_DISCARD) ++ ++/* AMPDU host reorder packet flags */ ++#define WLHOST_REORDERDATA_MAXFLOWS 256 ++#define WLHOST_REORDERDATA_LEN 10 ++#define WLHOST_REORDERDATA_TOTLEN (WLHOST_REORDERDATA_LEN + 1 + 1) /* +tag +len */ ++ ++#define WLHOST_REORDERDATA_FLOWID_OFFSET 0 ++#define WLHOST_REORDERDATA_MAXIDX_OFFSET 2 ++#define WLHOST_REORDERDATA_FLAGS_OFFSET 4 ++#define WLHOST_REORDERDATA_CURIDX_OFFSET 6 ++#define WLHOST_REORDERDATA_EXPIDX_OFFSET 8 ++ ++#define WLHOST_REORDERDATA_DEL_FLOW 0x01 ++#define WLHOST_REORDERDATA_FLUSH_ALL 0x02 ++#define WLHOST_REORDERDATA_CURIDX_VALID 0x04 ++#define WLHOST_REORDERDATA_EXPIDX_VALID 0x08 ++#define WLHOST_REORDERDATA_NEW_HOLE 0x10 ++/* transaction id data len byte 0: rsvd, byte 1: seqnumber, byte 2-5 will be used for timestampe */ ++#define WLFC_CTL_TRANS_ID_LEN 6 ++ ++#endif /* __wlfc_proto_definitions_h__ */ +diff --git a/drivers/net/wireless/ap6210/include/wlioctl.h b/drivers/net/wireless/ap6210/include/wlioctl.h +new file mode 100644 +index 0000000..a3e7003 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/include/wlioctl.h +@@ -0,0 +1,5079 @@ ++/* ++ * Custom OID/ioctl definitions for ++ * Broadcom 802.11abg Networking Device Driver ++ * ++ * Definitions subject to change without notice. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wlioctl.h 366141 2012-11-01 01:55:06Z $ ++ */ ++ ++#ifndef _wlioctl_h_ ++#define _wlioctl_h_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#include ++#include ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* LINUX_POSTMOGRIFY_REMOVAL: undefined during compile phase, so its ++ * a no-op for most cases. For hybrid and other open source releases, ++ * its defined during a second pass and mogrified out for distribution. ++ */ ++ ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++#ifndef INTF_NAME_SIZ ++#define INTF_NAME_SIZ 16 ++#endif ++ ++/* Used to send ioctls over the transport pipe */ ++typedef struct remote_ioctl { ++ cdc_ioctl_t msg; ++ uint data_len; ++ char intf_name[INTF_NAME_SIZ]; ++} rem_ioctl_t; ++#define REMOTE_SIZE sizeof(rem_ioctl_t) ++ ++#define ACTION_FRAME_SIZE 1800 ++ ++typedef struct wl_action_frame { ++ struct ether_addr da; ++ uint16 len; ++ uint32 packetId; ++ uint8 data[ACTION_FRAME_SIZE]; ++} wl_action_frame_t; ++ ++#define WL_WIFI_ACTION_FRAME_SIZE sizeof(struct wl_action_frame) ++ ++typedef struct ssid_info ++{ ++ uint8 ssid_len; /* the length of SSID */ ++ uint8 ssid[32]; /* SSID string */ ++} ssid_info_t; ++ ++typedef struct wl_af_params { ++ uint32 channel; ++ int32 dwell_time; ++ struct ether_addr BSSID; ++ wl_action_frame_t action_frame; ++} wl_af_params_t; ++ ++#define WL_WIFI_AF_PARAMS_SIZE sizeof(struct wl_af_params) ++ ++#define MFP_TEST_FLAG_NORMAL 0 ++#define MFP_TEST_FLAG_ANY_KEY 1 ++typedef struct wl_sa_query { ++ uint32 flag; ++ uint8 action; ++ uint16 id; ++ struct ether_addr da; ++} wl_sa_query_t; ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* require default structure packing */ ++#define BWL_DEFAULT_PACKING ++#include ++ ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++/* Legacy structure to help keep backward compatible wl tool and tray app */ ++ ++#define LEGACY_WL_BSS_INFO_VERSION 107 /* older version of wl_bss_info struct */ ++ ++typedef struct wl_bss_info_107 { ++ uint32 version; /* version field */ ++ uint32 length; /* byte length of data in this record, ++ * starting at version and including IEs ++ */ ++ struct ether_addr BSSID; ++ uint16 beacon_period; /* units are Kusec */ ++ uint16 capability; /* Capability information */ ++ uint8 SSID_len; ++ uint8 SSID[32]; ++ struct { ++ uint count; /* # rates in this set */ ++ uint8 rates[16]; /* rates in 500kbps units w/hi bit set if basic */ ++ } rateset; /* supported rates */ ++ uint8 channel; /* Channel no. */ ++ uint16 atim_window; /* units are Kusec */ ++ uint8 dtim_period; /* DTIM period */ ++ int16 RSSI; /* receive signal strength (in dBm) */ ++ int8 phy_noise; /* noise (in dBm) */ ++ uint32 ie_length; /* byte length of Information Elements */ ++ /* variable length Information Elements */ ++} wl_bss_info_107_t; ++ ++/* ++ * Per-BSS information structure. ++ */ ++ ++#define LEGACY2_WL_BSS_INFO_VERSION 108 /* old version of wl_bss_info struct */ ++ ++/* BSS info structure ++ * Applications MUST CHECK ie_offset field and length field to access IEs and ++ * next bss_info structure in a vector (in wl_scan_results_t) ++ */ ++typedef struct wl_bss_info_108 { ++ uint32 version; /* version field */ ++ uint32 length; /* byte length of data in this record, ++ * starting at version and including IEs ++ */ ++ struct ether_addr BSSID; ++ uint16 beacon_period; /* units are Kusec */ ++ uint16 capability; /* Capability information */ ++ uint8 SSID_len; ++ uint8 SSID[32]; ++ struct { ++ uint count; /* # rates in this set */ ++ uint8 rates[16]; /* rates in 500kbps units w/hi bit set if basic */ ++ } rateset; /* supported rates */ ++ chanspec_t chanspec; /* chanspec for bss */ ++ uint16 atim_window; /* units are Kusec */ ++ uint8 dtim_period; /* DTIM period */ ++ int16 RSSI; /* receive signal strength (in dBm) */ ++ int8 phy_noise; /* noise (in dBm) */ ++ ++ uint8 n_cap; /* BSS is 802.11N Capable */ ++ uint32 nbss_cap; /* 802.11N BSS Capabilities (based on HT_CAP_*) */ ++ uint8 ctl_ch; /* 802.11N BSS control channel number */ ++ uint32 reserved32[1]; /* Reserved for expansion of BSS properties */ ++ uint8 flags; /* flags */ ++ uint8 reserved[3]; /* Reserved for expansion of BSS properties */ ++ uint8 basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ ++ ++ uint16 ie_offset; /* offset at which IEs start, from beginning */ ++ uint32 ie_length; /* byte length of Information Elements */ ++ /* Add new fields here */ ++ /* variable length Information Elements */ ++} wl_bss_info_108_t; ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++#define WL_BSS_INFO_VERSION 109 /* current version of wl_bss_info struct */ ++ ++/* BSS info structure ++ * Applications MUST CHECK ie_offset field and length field to access IEs and ++ * next bss_info structure in a vector (in wl_scan_results_t) ++ */ ++typedef struct wl_bss_info { ++ uint32 version; /* version field */ ++ uint32 length; /* byte length of data in this record, ++ * starting at version and including IEs ++ */ ++ struct ether_addr BSSID; ++ uint16 beacon_period; /* units are Kusec */ ++ uint16 capability; /* Capability information */ ++ uint8 SSID_len; ++ uint8 SSID[32]; ++ struct { ++ uint count; /* # rates in this set */ ++ uint8 rates[16]; /* rates in 500kbps units w/hi bit set if basic */ ++ } rateset; /* supported rates */ ++ chanspec_t chanspec; /* chanspec for bss */ ++ uint16 atim_window; /* units are Kusec */ ++ uint8 dtim_period; /* DTIM period */ ++ int16 RSSI; /* receive signal strength (in dBm) */ ++ int8 phy_noise; /* noise (in dBm) */ ++ ++ uint8 n_cap; /* BSS is 802.11N Capable */ ++ uint32 nbss_cap; /* 802.11N+AC BSS Capabilities */ ++ uint8 ctl_ch; /* 802.11N BSS control channel number */ ++ uint8 padding1[3]; /* explicit struct alignment padding */ ++ uint16 vht_rxmcsmap; /* VHT rx mcs map */ ++ uint16 vht_txmcsmap; /* VHT tx mcs map */ ++ uint8 flags; /* flags */ ++ uint8 vht_cap; /* BSS is vht capable */ ++ uint8 reserved[2]; /* Reserved for expansion of BSS properties */ ++ uint8 basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ ++ ++ uint16 ie_offset; /* offset at which IEs start, from beginning */ ++ uint32 ie_length; /* byte length of Information Elements */ ++ int16 SNR; /* average SNR of during frame reception */ ++ /* Add new fields here */ ++ /* variable length Information Elements */ ++} wl_bss_info_t; ++ ++/* bss_info_cap_t flags */ ++#define WL_BSS_FLAGS_FROM_BEACON 0x01 /* bss_info derived from beacon */ ++#define WL_BSS_FLAGS_FROM_CACHE 0x02 /* bss_info collected from cache */ ++#define WL_BSS_FLAGS_RSSI_ONCHANNEL 0x04 /* rssi info was received on channel (vs offchannel) */ ++ ++/* bssinfo flag for nbss_cap */ ++#define VHT_BI_SGI_80MHZ 0x00000100 ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++typedef struct wl_bsscfg { ++ uint32 wsec; ++ uint32 WPA_auth; ++ uint32 wsec_index; ++ uint32 associated; ++ uint32 BSS; ++ uint32 phytest_on; ++ struct ether_addr prev_BSSID; ++ struct ether_addr BSSID; ++ uint32 targetbss_wpa2_flags; ++ uint32 assoc_type; ++ uint32 assoc_state; ++} wl_bsscfg_t; ++ ++typedef struct wl_bss_config { ++ uint32 atim_window; ++ uint32 beacon_period; ++ uint32 chanspec; ++} wl_bss_config_t; ++ ++#define DLOAD_HANDLER_VER 1 /* Downloader version */ ++#define DLOAD_FLAG_VER_MASK 0xf000 /* Downloader version mask */ ++#define DLOAD_FLAG_VER_SHIFT 12 /* Downloader version shift */ ++ ++#define DL_CRC_NOT_INUSE 0x0001 ++ ++/* generic download types & flags */ ++enum { ++ DL_TYPE_UCODE = 1, ++ DL_TYPE_CLM = 2 ++}; ++ ++/* ucode type values */ ++enum { ++ UCODE_FW, ++ INIT_VALS, ++ BS_INIT_VALS ++}; ++ ++struct wl_dload_data { ++ uint16 flag; ++ uint16 dload_type; ++ uint32 len; ++ uint32 crc; ++ uint8 data[1]; ++}; ++typedef struct wl_dload_data wl_dload_data_t; ++ ++struct wl_ucode_info { ++ uint32 ucode_type; ++ uint32 num_chunks; ++ uint32 chunk_len; ++ uint32 chunk_num; ++ uint8 data_chunk[1]; ++}; ++typedef struct wl_ucode_info wl_ucode_info_t; ++ ++struct wl_clm_dload_info { ++ uint32 ds_id; ++ uint32 clm_total_len; ++ uint32 num_chunks; ++ uint32 chunk_len; ++ uint32 chunk_offset; ++ uint8 data_chunk[1]; ++}; ++typedef struct wl_clm_dload_info wl_clm_dload_info_t; ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++typedef struct wlc_ssid { ++ uint32 SSID_len; ++ uchar SSID[32]; ++} wlc_ssid_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++#define MAX_PREFERRED_AP_NUM 5 ++typedef struct wlc_fastssidinfo { ++ uint32 SSID_channel[MAX_PREFERRED_AP_NUM]; ++ wlc_ssid_t SSID_info[MAX_PREFERRED_AP_NUM]; ++} wlc_fastssidinfo_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct wnm_url { ++ uint8 len; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT wnm_url_t; ++ ++typedef struct chan_scandata { ++ uint8 txpower; ++ uint8 pad; ++ chanspec_t channel; /* Channel num, bw, ctrl_sb and band */ ++ uint32 channel_mintime; ++ uint32 channel_maxtime; ++} chan_scandata_t; ++ ++typedef enum wl_scan_type { ++ EXTDSCAN_FOREGROUND_SCAN, ++ EXTDSCAN_BACKGROUND_SCAN, ++ EXTDSCAN_FORCEDBACKGROUND_SCAN ++} wl_scan_type_t; ++ ++#define WLC_EXTDSCAN_MAX_SSID 5 ++ ++typedef struct wl_extdscan_params { ++ int8 nprobes; /* 0, passive, otherwise active */ ++ int8 split_scan; /* split scan */ ++ int8 band; /* band */ ++ int8 pad; ++ wlc_ssid_t ssid[WLC_EXTDSCAN_MAX_SSID]; /* ssid list */ ++ uint32 tx_rate; /* in 500ksec units */ ++ wl_scan_type_t scan_type; /* enum */ ++ int32 channel_num; ++ chan_scandata_t channel_list[1]; /* list of chandata structs */ ++} wl_extdscan_params_t; ++ ++#define WL_EXTDSCAN_PARAMS_FIXED_SIZE (sizeof(wl_extdscan_params_t) - sizeof(chan_scandata_t)) ++ ++#define WL_BSSTYPE_INFRA 1 ++#define WL_BSSTYPE_INDEP 0 ++#define WL_BSSTYPE_ANY 2 ++ ++/* Bitmask for scan_type */ ++#define WL_SCANFLAGS_PASSIVE 0x01 /* force passive scan */ ++#define WL_SCANFLAGS_RESERVED 0x02 /* Reserved */ ++#define WL_SCANFLAGS_PROHIBITED 0x04 /* allow scanning prohibited channels */ ++ ++#define WL_SCAN_PARAMS_SSID_MAX 10 ++ ++typedef struct wl_scan_params { ++ wlc_ssid_t ssid; /* default: {0, ""} */ ++ struct ether_addr bssid; /* default: bcast */ ++ int8 bss_type; /* default: any, ++ * DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT ++ */ ++ uint8 scan_type; /* flags, 0 use default */ ++ int32 nprobes; /* -1 use default, number of probes per channel */ ++ int32 active_time; /* -1 use default, dwell time per channel for ++ * active scanning ++ */ ++ int32 passive_time; /* -1 use default, dwell time per channel ++ * for passive scanning ++ */ ++ int32 home_time; /* -1 use default, dwell time for the home channel ++ * between channel scans ++ */ ++ int32 channel_num; /* count of channels and ssids that follow ++ * ++ * low half is count of channels in channel_list, 0 ++ * means default (use all available channels) ++ * ++ * high half is entries in wlc_ssid_t array that ++ * follows channel_list, aligned for int32 (4 bytes) ++ * meaning an odd channel count implies a 2-byte pad ++ * between end of channel_list and first ssid ++ * ++ * if ssid count is zero, single ssid in the fixed ++ * parameter portion is assumed, otherwise ssid in ++ * the fixed portion is ignored ++ */ ++ uint16 channel_list[1]; /* list of chanspecs */ ++} wl_scan_params_t; ++ ++/* size of wl_scan_params not including variable length array */ ++#define WL_SCAN_PARAMS_FIXED_SIZE 64 ++ ++/* masks for channel and ssid count */ ++#define WL_SCAN_PARAMS_COUNT_MASK 0x0000ffff ++#define WL_SCAN_PARAMS_NSSID_SHIFT 16 ++ ++#define WL_SCAN_ACTION_START 1 ++#define WL_SCAN_ACTION_CONTINUE 2 ++#define WL_SCAN_ACTION_ABORT 3 ++ ++#define ISCAN_REQ_VERSION 1 ++ ++/* incremental scan struct */ ++typedef struct wl_iscan_params { ++ uint32 version; ++ uint16 action; ++ uint16 scan_duration; ++ wl_scan_params_t params; ++} wl_iscan_params_t; ++ ++/* 3 fields + size of wl_scan_params, not including variable length array */ ++#define WL_ISCAN_PARAMS_FIXED_SIZE (OFFSETOF(wl_iscan_params_t, params) + sizeof(wlc_ssid_t)) ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++typedef struct wl_scan_results { ++ uint32 buflen; ++ uint32 version; ++ uint32 count; ++ wl_bss_info_t bss_info[1]; ++} wl_scan_results_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++/* size of wl_scan_results not including variable length array */ ++#define WL_SCAN_RESULTS_FIXED_SIZE (sizeof(wl_scan_results_t) - sizeof(wl_bss_info_t)) ++ ++/* wl_iscan_results status values */ ++#define WL_SCAN_RESULTS_SUCCESS 0 ++#define WL_SCAN_RESULTS_PARTIAL 1 ++#define WL_SCAN_RESULTS_PENDING 2 ++#define WL_SCAN_RESULTS_ABORTED 3 ++#define WL_SCAN_RESULTS_NO_MEM 4 ++ ++/* Used in EXT_STA */ ++#define DNGL_RXCTXT_SIZE 45 ++ ++ ++#define ESCAN_REQ_VERSION 1 ++ ++typedef struct wl_escan_params { ++ uint32 version; ++ uint16 action; ++ uint16 sync_id; ++ wl_scan_params_t params; ++} wl_escan_params_t; ++ ++#define WL_ESCAN_PARAMS_FIXED_SIZE (OFFSETOF(wl_escan_params_t, params) + sizeof(wlc_ssid_t)) ++ ++typedef struct wl_escan_result { ++ uint32 buflen; ++ uint32 version; ++ uint16 sync_id; ++ uint16 bss_count; ++ wl_bss_info_t bss_info[1]; ++} wl_escan_result_t; ++ ++#define WL_ESCAN_RESULTS_FIXED_SIZE (sizeof(wl_escan_result_t) - sizeof(wl_bss_info_t)) ++ ++/* incremental scan results struct */ ++typedef struct wl_iscan_results { ++ uint32 status; ++ wl_scan_results_t results; ++} wl_iscan_results_t; ++ ++/* size of wl_iscan_results not including variable length array */ ++#define WL_ISCAN_RESULTS_FIXED_SIZE \ ++ (WL_SCAN_RESULTS_FIXED_SIZE + OFFSETOF(wl_iscan_results_t, results)) ++ ++typedef struct wl_probe_params { ++ wlc_ssid_t ssid; ++ struct ether_addr bssid; ++ struct ether_addr mac; ++} wl_probe_params_t; ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++#define WL_MAXRATES_IN_SET 16 /* max # of rates in a rateset */ ++typedef struct wl_rateset { ++ uint32 count; /* # rates in this set */ ++ uint8 rates[WL_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */ ++} wl_rateset_t; ++ ++typedef struct wl_rateset_args { ++ uint32 count; /* # rates in this set */ ++ uint8 rates[WL_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */ ++ uint8 mcs[MCSSET_LEN]; /* supported mcs index bit map */ ++} wl_rateset_args_t; ++ ++/* uint32 list */ ++typedef struct wl_uint32_list { ++ /* in - # of elements, out - # of entries */ ++ uint32 count; ++ /* variable length uint32 list */ ++ uint32 element[1]; ++} wl_uint32_list_t; ++ ++/* used for association with a specific BSSID and chanspec list */ ++typedef struct wl_assoc_params { ++ struct ether_addr bssid; /* 00:00:00:00:00:00: broadcast scan */ ++ uint16 bssid_cnt; /* 0: use chanspec_num, and the single bssid, ++ * otherwise count of chanspecs in chanspec_list ++ * AND paired bssids following chanspec_list ++ */ ++ int32 chanspec_num; /* 0: all available channels, ++ * otherwise count of chanspecs in chanspec_list ++ */ ++ chanspec_t chanspec_list[1]; /* list of chanspecs */ ++} wl_assoc_params_t; ++#define WL_ASSOC_PARAMS_FIXED_SIZE OFFSETOF(wl_assoc_params_t, chanspec_list) ++ ++/* used for reassociation/roam to a specific BSSID and channel */ ++typedef wl_assoc_params_t wl_reassoc_params_t; ++#define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE ++ ++/* used for association to a specific BSSID and channel */ ++typedef wl_assoc_params_t wl_join_assoc_params_t; ++#define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE ++ ++/* used for join with or without a specific bssid and channel list */ ++typedef struct wl_join_params { ++ wlc_ssid_t ssid; ++ wl_assoc_params_t params; /* optional field, but it must include the fixed portion ++ * of the wl_assoc_params_t struct when it does present. ++ */ ++} wl_join_params_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#define WL_JOIN_PARAMS_FIXED_SIZE (OFFSETOF(wl_join_params_t, params) + \ ++ WL_ASSOC_PARAMS_FIXED_SIZE) ++/* scan params for extended join */ ++typedef struct wl_join_scan_params { ++ uint8 scan_type; /* 0 use default, active or passive scan */ ++ int32 nprobes; /* -1 use default, number of probes per channel */ ++ int32 active_time; /* -1 use default, dwell time per channel for ++ * active scanning ++ */ ++ int32 passive_time; /* -1 use default, dwell time per channel ++ * for passive scanning ++ */ ++ int32 home_time; /* -1 use default, dwell time for the home channel ++ * between channel scans ++ */ ++} wl_join_scan_params_t; ++ ++/* extended join params */ ++typedef struct wl_extjoin_params { ++ wlc_ssid_t ssid; /* {0, ""}: wildcard scan */ ++ wl_join_scan_params_t scan; ++ wl_join_assoc_params_t assoc; /* optional field, but it must include the fixed portion ++ * of the wl_join_assoc_params_t struct when it does ++ * present. ++ */ ++} wl_extjoin_params_t; ++#define WL_EXTJOIN_PARAMS_FIXED_SIZE (OFFSETOF(wl_extjoin_params_t, assoc) + \ ++ WL_JOIN_ASSOC_PARAMS_FIXED_SIZE) ++ ++/* All builds use the new 11ac ratespec/chanspec */ ++#undef D11AC_IOTYPES ++#define D11AC_IOTYPES ++ ++#ifndef D11AC_IOTYPES ++ ++/* defines used by the nrate iovar */ ++#define NRATE_MCS_INUSE 0x00000080 /* MSC in use,indicates b0-6 holds an mcs */ ++#define NRATE_RATE_MASK 0x0000007f /* rate/mcs value */ ++#define NRATE_STF_MASK 0x0000ff00 /* stf mode mask: siso, cdd, stbc, sdm */ ++#define NRATE_STF_SHIFT 8 /* stf mode shift */ ++#define NRATE_OVERRIDE 0x80000000 /* bit indicates override both rate & mode */ ++#define NRATE_OVERRIDE_MCS_ONLY 0x40000000 /* bit indicate to override mcs only */ ++#define NRATE_SGI_MASK 0x00800000 /* sgi mode */ ++#define NRATE_SGI_SHIFT 23 /* sgi mode */ ++#define NRATE_LDPC_CODING 0x00400000 /* bit indicates adv coding in use */ ++#define NRATE_LDPC_SHIFT 22 /* ldpc shift */ ++ ++#define NRATE_STF_SISO 0 /* stf mode SISO */ ++#define NRATE_STF_CDD 1 /* stf mode CDD */ ++#define NRATE_STF_STBC 2 /* stf mode STBC */ ++#define NRATE_STF_SDM 3 /* stf mode SDM */ ++ ++#else /* D11AC_IOTYPES */ ++ ++/* WL_RSPEC defines for rate information */ ++#define WL_RSPEC_RATE_MASK 0x000000FF /* rate or HT MCS value */ ++#define WL_RSPEC_VHT_MCS_MASK 0x0000000F /* VHT MCS value */ ++#define WL_RSPEC_VHT_NSS_MASK 0x000000F0 /* VHT Nss value */ ++#define WL_RSPEC_VHT_NSS_SHIFT 4 /* VHT Nss value shift */ ++#define WL_RSPEC_TXEXP_MASK 0x00000300 ++#define WL_RSPEC_TXEXP_SHIFT 8 ++#define WL_RSPEC_BW_MASK 0x00070000 /* bandwidth mask */ ++#define WL_RSPEC_BW_SHIFT 16 /* bandwidth shift */ ++#define WL_RSPEC_STBC 0x00100000 /* STBC encoding, Nsts = 2 x Nss */ ++#define WL_RSPEC_LDPC 0x00400000 /* bit indicates adv coding in use */ ++#define WL_RSPEC_SGI 0x00800000 /* Short GI mode */ ++#define WL_RSPEC_ENCODING_MASK 0x03000000 /* Encoding of Rate/MCS field */ ++#define WL_RSPEC_OVERRIDE_RATE 0x40000000 /* bit indicate to override mcs only */ ++#define WL_RSPEC_OVERRIDE_MODE 0x80000000 /* bit indicates override both rate & mode */ ++ ++/* WL_RSPEC_ENCODING field defs */ ++#define WL_RSPEC_ENCODE_RATE 0x00000000 /* Legacy rate is stored in RSPEC_RATE_MASK */ ++#define WL_RSPEC_ENCODE_HT 0x01000000 /* HT MCS is stored in RSPEC_RATE_MASK */ ++#define WL_RSPEC_ENCODE_VHT 0x02000000 /* VHT MCS and Nss is stored in RSPEC_RATE_MASK */ ++ ++/* WL_RSPEC_BW field defs */ ++#define WL_RSPEC_BW_UNSPECIFIED 0 ++#define WL_RSPEC_BW_20MHZ 0x00010000 ++#define WL_RSPEC_BW_40MHZ 0x00020000 ++#define WL_RSPEC_BW_80MHZ 0x00030000 ++#define WL_RSPEC_BW_160MHZ 0x00040000 ++ ++/* Legacy defines for the nrate iovar */ ++#define OLD_NRATE_MCS_INUSE 0x00000080 /* MSC in use,indicates b0-6 holds an mcs */ ++#define OLD_NRATE_RATE_MASK 0x0000007f /* rate/mcs value */ ++#define OLD_NRATE_STF_MASK 0x0000ff00 /* stf mode mask: siso, cdd, stbc, sdm */ ++#define OLD_NRATE_STF_SHIFT 8 /* stf mode shift */ ++#define OLD_NRATE_OVERRIDE 0x80000000 /* bit indicates override both rate & mode */ ++#define OLD_NRATE_OVERRIDE_MCS_ONLY 0x40000000 /* bit indicate to override mcs only */ ++#define OLD_NRATE_SGI 0x00800000 /* sgi mode */ ++#define OLD_NRATE_LDPC_CODING 0x00400000 /* bit indicates adv coding in use */ ++ ++#define OLD_NRATE_STF_SISO 0 /* stf mode SISO */ ++#define OLD_NRATE_STF_CDD 1 /* stf mode CDD */ ++#define OLD_NRATE_STF_STBC 2 /* stf mode STBC */ ++#define OLD_NRATE_STF_SDM 3 /* stf mode SDM */ ++ ++#endif /* D11AC_IOTYPES */ ++ ++#define ANTENNA_NUM_1 1 /* total number of antennas to be used */ ++#define ANTENNA_NUM_2 2 ++#define ANTENNA_NUM_3 3 ++#define ANTENNA_NUM_4 4 ++ ++#define ANT_SELCFG_AUTO 0x80 /* bit indicates antenna sel AUTO */ ++#define ANT_SELCFG_MASK 0x33 /* antenna configuration mask */ ++#define ANT_SELCFG_MAX 4 /* max number of antenna configurations */ ++#define ANT_SELCFG_TX_UNICAST 0 /* unicast tx antenna configuration */ ++#define ANT_SELCFG_RX_UNICAST 1 /* unicast rx antenna configuration */ ++#define ANT_SELCFG_TX_DEF 2 /* default tx antenna configuration */ ++#define ANT_SELCFG_RX_DEF 3 /* default rx antenna configuration */ ++ ++#define MAX_STREAMS_SUPPORTED 4 /* max number of streams supported */ ++ ++typedef struct { ++ uint8 ant_config[ANT_SELCFG_MAX]; /* antenna configuration */ ++ uint8 num_antcfg; /* number of available antenna configurations */ ++} wlc_antselcfg_t; ++ ++#define HIGHEST_SINGLE_STREAM_MCS 7 /* MCS values greater than this enable multiple streams */ ++ ++#define MAX_CCA_CHANNELS 38 /* Max number of 20 Mhz wide channels */ ++#define MAX_CCA_SECS 60 /* CCA keeps this many seconds history */ ++ ++#define IBSS_MED 15 /* Mediom in-bss congestion percentage */ ++#define IBSS_HI 25 /* Hi in-bss congestion percentage */ ++#define OBSS_MED 12 ++#define OBSS_HI 25 ++#define INTERFER_MED 5 ++#define INTERFER_HI 10 ++ ++#define CCA_FLAG_2G_ONLY 0x01 /* Return a channel from 2.4 Ghz band */ ++#define CCA_FLAG_5G_ONLY 0x02 /* Return a channel from 2.4 Ghz band */ ++#define CCA_FLAG_IGNORE_DURATION 0x04 /* Ignore dwell time for each channel */ ++#define CCA_FLAGS_PREFER_1_6_11 0x10 ++#define CCA_FLAG_IGNORE_INTERFER 0x20 /* do not exlude channel based on interfer level */ ++ ++#define CCA_ERRNO_BAND 1 /* After filtering for band pref, no choices left */ ++#define CCA_ERRNO_DURATION 2 /* After filtering for duration, no choices left */ ++#define CCA_ERRNO_PREF_CHAN 3 /* After filtering for chan pref, no choices left */ ++#define CCA_ERRNO_INTERFER 4 /* After filtering for interference, no choices left */ ++#define CCA_ERRNO_TOO_FEW 5 /* Only 1 channel was input */ ++ ++typedef struct { ++ uint32 duration; /* millisecs spent sampling this channel */ ++ uint32 congest_ibss; /* millisecs in our bss (presumably this traffic will */ ++ /* move if cur bss moves channels) */ ++ uint32 congest_obss; /* traffic not in our bss */ ++ uint32 interference; /* millisecs detecting a non 802.11 interferer. */ ++ uint32 timestamp; /* second timestamp */ ++} cca_congest_t; ++ ++typedef struct { ++ chanspec_t chanspec; /* Which channel? */ ++ uint8 num_secs; /* How many secs worth of data */ ++ cca_congest_t secs[1]; /* Data */ ++} cca_congest_channel_req_t; ++ ++/* interference source detection and identification mode */ ++#define ITFR_MODE_DISABLE 0 /* disable feature */ ++#define ITFR_MODE_MANUAL_ENABLE 1 /* enable manual detection */ ++#define ITFR_MODE_AUTO_ENABLE 2 /* enable auto detection */ ++ ++/* interference sources */ ++enum interference_source { ++ ITFR_NONE = 0, /* interference */ ++ ITFR_PHONE, /* wireless phone */ ++ ITFR_VIDEO_CAMERA, /* wireless video camera */ ++ ITFR_MICROWAVE_OVEN, /* microwave oven */ ++ ITFR_BABY_MONITOR, /* wireless baby monitor */ ++ ITFR_BLUETOOTH, /* bluetooth */ ++ ITFR_VIDEO_CAMERA_OR_BABY_MONITOR, /* wireless camera or baby monitor */ ++ ITFR_BLUETOOTH_OR_BABY_MONITOR, /* bluetooth or baby monitor */ ++ ITFR_VIDEO_CAMERA_OR_PHONE, /* video camera or phone */ ++ ITFR_UNIDENTIFIED /* interference from unidentified source */ ++}; ++ ++/* structure for interference source report */ ++typedef struct { ++ uint32 flags; /* flags. bit definitions below */ ++ uint32 source; /* last detected interference source */ ++ uint32 timestamp; /* second timestamp on interferenced flag change */ ++} interference_source_rep_t; ++ ++/* bit definitions for flags in interference source report */ ++#define ITFR_INTERFERENCED 1 /* interference detected */ ++#define ITFR_HOME_CHANNEL 2 /* home channel has interference */ ++#define ITFR_NOISY_ENVIRONMENT 4 /* noisy environemnt so feature stopped */ ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++#define WLC_CNTRY_BUF_SZ 4 /* Country string is 3 bytes + NUL */ ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++typedef struct wl_country { ++ char country_abbrev[WLC_CNTRY_BUF_SZ]; /* nul-terminated country code used in ++ * the Country IE ++ */ ++ int32 rev; /* revision specifier for ccode ++ * on set, -1 indicates unspecified. ++ * on get, rev >= 0 ++ */ ++ char ccode[WLC_CNTRY_BUF_SZ]; /* nul-terminated built-in country code. ++ * variable length, but fixed size in ++ * struct allows simple allocation for ++ * expected country strings <= 3 chars. ++ */ ++} wl_country_t; ++ ++typedef struct wl_channels_in_country { ++ uint32 buflen; ++ uint32 band; ++ char country_abbrev[WLC_CNTRY_BUF_SZ]; ++ uint32 count; ++ uint32 channel[1]; ++} wl_channels_in_country_t; ++ ++typedef struct wl_country_list { ++ uint32 buflen; ++ uint32 band_set; ++ uint32 band; ++ uint32 count; ++ char country_abbrev[1]; ++} wl_country_list_t; ++ ++#define WL_NUM_RPI_BINS 8 ++#define WL_RM_TYPE_BASIC 1 ++#define WL_RM_TYPE_CCA 2 ++#define WL_RM_TYPE_RPI 3 ++ ++#define WL_RM_FLAG_PARALLEL (1<<0) ++ ++#define WL_RM_FLAG_LATE (1<<1) ++#define WL_RM_FLAG_INCAPABLE (1<<2) ++#define WL_RM_FLAG_REFUSED (1<<3) ++ ++typedef struct wl_rm_req_elt { ++ int8 type; ++ int8 flags; ++ chanspec_t chanspec; ++ uint32 token; /* token for this measurement */ ++ uint32 tsf_h; /* TSF high 32-bits of Measurement start time */ ++ uint32 tsf_l; /* TSF low 32-bits */ ++ uint32 dur; /* TUs */ ++} wl_rm_req_elt_t; ++ ++typedef struct wl_rm_req { ++ uint32 token; /* overall measurement set token */ ++ uint32 count; /* number of measurement requests */ ++ void *cb; /* completion callback function: may be NULL */ ++ void *cb_arg; /* arg to completion callback function */ ++ wl_rm_req_elt_t req[1]; /* variable length block of requests */ ++} wl_rm_req_t; ++#define WL_RM_REQ_FIXED_LEN OFFSETOF(wl_rm_req_t, req) ++ ++typedef struct wl_rm_rep_elt { ++ int8 type; ++ int8 flags; ++ chanspec_t chanspec; ++ uint32 token; /* token for this measurement */ ++ uint32 tsf_h; /* TSF high 32-bits of Measurement start time */ ++ uint32 tsf_l; /* TSF low 32-bits */ ++ uint32 dur; /* TUs */ ++ uint32 len; /* byte length of data block */ ++ uint8 data[1]; /* variable length data block */ ++} wl_rm_rep_elt_t; ++#define WL_RM_REP_ELT_FIXED_LEN 24 /* length excluding data block */ ++ ++#define WL_RPI_REP_BIN_NUM 8 ++typedef struct wl_rm_rpi_rep { ++ uint8 rpi[WL_RPI_REP_BIN_NUM]; ++ int8 rpi_max[WL_RPI_REP_BIN_NUM]; ++} wl_rm_rpi_rep_t; ++ ++typedef struct wl_rm_rep { ++ uint32 token; /* overall measurement set token */ ++ uint32 len; /* length of measurement report block */ ++ wl_rm_rep_elt_t rep[1]; /* variable length block of reports */ ++} wl_rm_rep_t; ++#define WL_RM_REP_FIXED_LEN 8 ++ ++ ++typedef enum sup_auth_status { ++ /* Basic supplicant authentication states */ ++ WLC_SUP_DISCONNECTED = 0, ++ WLC_SUP_CONNECTING, ++ WLC_SUP_IDREQUIRED, ++ WLC_SUP_AUTHENTICATING, ++ WLC_SUP_AUTHENTICATED, ++ WLC_SUP_KEYXCHANGE, ++ WLC_SUP_KEYED, ++ WLC_SUP_TIMEOUT, ++ WLC_SUP_LAST_BASIC_STATE, ++ ++ /* Extended supplicant authentication states */ ++ /* Waiting to receive handshake msg M1 */ ++ WLC_SUP_KEYXCHANGE_WAIT_M1 = WLC_SUP_AUTHENTICATED, ++ /* Preparing to send handshake msg M2 */ ++ WLC_SUP_KEYXCHANGE_PREP_M2 = WLC_SUP_KEYXCHANGE, ++ /* Waiting to receive handshake msg M3 */ ++ WLC_SUP_KEYXCHANGE_WAIT_M3 = WLC_SUP_LAST_BASIC_STATE, ++ WLC_SUP_KEYXCHANGE_PREP_M4, /* Preparing to send handshake msg M4 */ ++ WLC_SUP_KEYXCHANGE_WAIT_G1, /* Waiting to receive handshake msg G1 */ ++ WLC_SUP_KEYXCHANGE_PREP_G2 /* Preparing to send handshake msg G2 */ ++} sup_auth_status_t; ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* Enumerate crypto algorithms */ ++#define CRYPTO_ALGO_OFF 0 ++#define CRYPTO_ALGO_WEP1 1 ++#define CRYPTO_ALGO_TKIP 2 ++#define CRYPTO_ALGO_WEP128 3 ++#define CRYPTO_ALGO_AES_CCM 4 ++#define CRYPTO_ALGO_AES_OCB_MSDU 5 ++#define CRYPTO_ALGO_AES_OCB_MPDU 6 ++#if !defined(BCMEXTCCX) ++#define CRYPTO_ALGO_NALG 7 ++#else ++#define CRYPTO_ALGO_CKIP 7 ++#define CRYPTO_ALGO_CKIP_MMH 8 ++#define CRYPTO_ALGO_WEP_MMH 9 ++#define CRYPTO_ALGO_NALG 10 ++#endif ++#ifdef BCMWAPI_WPI ++#define CRYPTO_ALGO_SMS4 11 ++#endif /* BCMWAPI_WPI */ ++#define CRYPTO_ALGO_PMK 12 /* for 802.1x supp to set PMK before 4-way */ ++ ++#define WSEC_GEN_MIC_ERROR 0x0001 ++#define WSEC_GEN_REPLAY 0x0002 ++#define WSEC_GEN_ICV_ERROR 0x0004 ++#define WSEC_GEN_MFP_ACT_ERROR 0x0008 ++#define WSEC_GEN_MFP_DISASSOC_ERROR 0x0010 ++#define WSEC_GEN_MFP_DEAUTH_ERROR 0x0020 ++ ++#define WL_SOFT_KEY (1 << 0) /* Indicates this key is using soft encrypt */ ++#define WL_PRIMARY_KEY (1 << 1) /* Indicates this key is the primary (ie tx) key */ ++#if defined(BCMEXTCCX) ++#define WL_CKIP_KP (1 << 4) /* CMIC */ ++#define WL_CKIP_MMH (1 << 5) /* CKIP */ ++#else ++#define WL_KF_RES_4 (1 << 4) /* Reserved for backward compat */ ++#define WL_KF_RES_5 (1 << 5) /* Reserved for backward compat */ ++#endif ++#define WL_IBSS_PEER_GROUP_KEY (1 << 6) /* Indicates a group key for a IBSS PEER */ ++ ++typedef struct wl_wsec_key { ++ uint32 index; /* key index */ ++ uint32 len; /* key length */ ++ uint8 data[DOT11_MAX_KEY_SIZE]; /* key data */ ++ uint32 pad_1[18]; ++ uint32 algo; /* CRYPTO_ALGO_AES_CCM, CRYPTO_ALGO_WEP128, etc */ ++ uint32 flags; /* misc flags */ ++ uint32 pad_2[2]; ++ int pad_3; ++ int iv_initialized; /* has IV been initialized already? */ ++ int pad_4; ++ /* Rx IV */ ++ struct { ++ uint32 hi; /* upper 32 bits of IV */ ++ uint16 lo; /* lower 16 bits of IV */ ++ } rxiv; ++ uint32 pad_5[2]; ++ struct ether_addr ea; /* per station */ ++} wl_wsec_key_t; ++ ++#define WSEC_MIN_PSK_LEN 8 ++#define WSEC_MAX_PSK_LEN 64 ++ ++/* Flag for key material needing passhash'ing */ ++#define WSEC_PASSPHRASE (1<<0) ++ ++/* receptacle for WLC_SET_WSEC_PMK parameter */ ++typedef struct { ++ ushort key_len; /* octets in key material */ ++ ushort flags; /* key handling qualification */ ++ uint8 key[WSEC_MAX_PSK_LEN]; /* PMK material */ ++} wsec_pmk_t; ++ ++/* wireless security bitvec */ ++#define WEP_ENABLED 0x0001 ++#define TKIP_ENABLED 0x0002 ++#define AES_ENABLED 0x0004 ++#define WSEC_SWFLAG 0x0008 ++#define SES_OW_ENABLED 0x0040 /* to go into transition mode without setting wep */ ++ ++/* wsec macros for operating on the above definitions */ ++#define WSEC_WEP_ENABLED(wsec) ((wsec) & WEP_ENABLED) ++#define WSEC_TKIP_ENABLED(wsec) ((wsec) & TKIP_ENABLED) ++#define WSEC_AES_ENABLED(wsec) ((wsec) & AES_ENABLED) ++ ++#define WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED)) ++#define WSEC_SES_OW_ENABLED(wsec) ((wsec) & SES_OW_ENABLED) ++#ifdef BCMWAPI_WPI ++#define SMS4_ENABLED 0x0100 ++#endif /* BCMWAPI_WPI */ ++ ++#ifdef MFP ++#define MFP_CAPABLE 0x0200 ++#define MFP_REQUIRED 0x0400 ++#define MFP_SHA256 0x0800 /* a special configuration for STA for WIFI test tool */ ++#endif /* MFP */ ++ ++/* WPA authentication mode bitvec */ ++#define WPA_AUTH_DISABLED 0x0000 /* Legacy (i.e., non-WPA) */ ++#define WPA_AUTH_NONE 0x0001 /* none (IBSS) */ ++#define WPA_AUTH_UNSPECIFIED 0x0002 /* over 802.1x */ ++#define WPA_AUTH_PSK 0x0004 /* Pre-shared key */ ++#if defined(BCMEXTCCX) ++#define WPA_AUTH_CCKM 0x0008 /* CCKM */ ++#define WPA2_AUTH_CCKM 0x0010 /* CCKM2 */ ++#endif ++/* #define WPA_AUTH_8021X 0x0020 */ /* 802.1x, reserved */ ++#define WPA2_AUTH_UNSPECIFIED 0x0040 /* over 802.1x */ ++#define WPA2_AUTH_PSK 0x0080 /* Pre-shared key */ ++#define BRCM_AUTH_PSK 0x0100 /* BRCM specific PSK */ ++#define BRCM_AUTH_DPT 0x0200 /* DPT PSK without group keys */ ++#ifdef BCMWAPI_WAI ++#define WPA_AUTH_WAPI 0x0400 ++#define WAPI_AUTH_NONE WPA_AUTH_NONE /* none (IBSS) */ ++#define WAPI_AUTH_UNSPECIFIED 0x0400 /* over AS */ ++#define WAPI_AUTH_PSK 0x0800 /* Pre-shared key */ ++#endif /* BCMWAPI_WAI */ ++#define WPA2_AUTH_MFP 0x1000 /* MFP (11w) in contrast to CCX */ ++#define WPA2_AUTH_TPK 0x2000 /* TDLS Peer Key */ ++#define WPA2_AUTH_FT 0x4000 /* Fast Transition. */ ++#define WPA_AUTH_PFN_ANY 0xffffffff /* for PFN, match only ssid */ ++ ++/* pmkid */ ++#define MAXPMKID 16 ++ ++typedef struct _pmkid { ++ struct ether_addr BSSID; ++ uint8 PMKID[WPA2_PMKID_LEN]; ++} pmkid_t; ++ ++typedef struct _pmkid_list { ++ uint32 npmkid; ++ pmkid_t pmkid[1]; ++} pmkid_list_t; ++ ++typedef struct _pmkid_cand { ++ struct ether_addr BSSID; ++ uint8 preauth; ++} pmkid_cand_t; ++ ++typedef struct _pmkid_cand_list { ++ uint32 npmkid_cand; ++ pmkid_cand_t pmkid_cand[1]; ++} pmkid_cand_list_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++typedef struct wl_assoc_info { ++ uint32 req_len; ++ uint32 resp_len; ++ uint32 flags; ++ struct dot11_assoc_req req; ++ struct ether_addr reassoc_bssid; /* used in reassoc's */ ++ struct dot11_assoc_resp resp; ++} wl_assoc_info_t; ++ ++/* flags */ ++#define WLC_ASSOC_REQ_IS_REASSOC 0x01 /* assoc req was actually a reassoc */ ++ ++typedef struct wl_led_info { ++ uint32 index; /* led index */ ++ uint32 behavior; ++ uint8 activehi; ++} wl_led_info_t; ++ ++ ++/* srom read/write struct passed through ioctl */ ++typedef struct { ++ uint byteoff; /* byte offset */ ++ uint nbytes; /* number of bytes */ ++ uint16 buf[1]; ++} srom_rw_t; ++ ++/* similar cis (srom or otp) struct [iovar: may not be aligned] */ ++typedef struct { ++ uint32 source; /* cis source */ ++ uint32 byteoff; /* byte offset */ ++ uint32 nbytes; /* number of bytes */ ++ /* data follows here */ ++} cis_rw_t; ++ ++#define WLC_CIS_DEFAULT 0 /* built-in default */ ++#define WLC_CIS_SROM 1 /* source is sprom */ ++#define WLC_CIS_OTP 2 /* source is otp */ ++ ++/* R_REG and W_REG struct passed through ioctl */ ++typedef struct { ++ uint32 byteoff; /* byte offset of the field in d11regs_t */ ++ uint32 val; /* read/write value of the field */ ++ uint32 size; /* sizeof the field */ ++ uint band; /* band (optional) */ ++} rw_reg_t; ++ ++/* Structure used by GET/SET_ATTEN ioctls - it controls power in b/g-band */ ++/* PCL - Power Control Loop */ ++/* current gain setting is replaced by user input */ ++#define WL_ATTEN_APP_INPUT_PCL_OFF 0 /* turn off PCL, apply supplied input */ ++#define WL_ATTEN_PCL_ON 1 /* turn on PCL */ ++/* current gain setting is maintained */ ++#define WL_ATTEN_PCL_OFF 2 /* turn off PCL. */ ++ ++typedef struct { ++ uint16 auto_ctrl; /* WL_ATTEN_XX */ ++ uint16 bb; /* Baseband attenuation */ ++ uint16 radio; /* Radio attenuation */ ++ uint16 txctl1; /* Radio TX_CTL1 value */ ++} atten_t; ++ ++/* Per-AC retry parameters */ ++struct wme_tx_params_s { ++ uint8 short_retry; ++ uint8 short_fallback; ++ uint8 long_retry; ++ uint8 long_fallback; ++ uint16 max_rate; /* In units of 512 Kbps */ ++}; ++ ++typedef struct wme_tx_params_s wme_tx_params_t; ++ ++#define WL_WME_TX_PARAMS_IO_BYTES (sizeof(wme_tx_params_t) * AC_COUNT) ++ ++/* defines used by poweridx iovar - it controls power in a-band */ ++/* current gain setting is maintained */ ++#define WL_PWRIDX_PCL_OFF -2 /* turn off PCL. */ ++#define WL_PWRIDX_PCL_ON -1 /* turn on PCL */ ++#define WL_PWRIDX_LOWER_LIMIT -2 /* lower limit */ ++#define WL_PWRIDX_UPPER_LIMIT 63 /* upper limit */ ++/* value >= 0 causes ++ * - input to be set to that value ++ * - PCL to be off ++ */ ++ ++/* Used to get specific link/ac parameters */ ++typedef struct { ++ int ac; ++ uint8 val; ++ struct ether_addr ea; ++} link_val_t; ++ ++#define BCM_MAC_STATUS_INDICATION (0x40010200L) ++ ++typedef struct { ++ uint16 ver; /* version of this struct */ ++ uint16 len; /* length in bytes of this structure */ ++ uint16 cap; /* sta's advertised capabilities */ ++ uint32 flags; /* flags defined below */ ++ uint32 idle; /* time since data pkt rx'd from sta */ ++ struct ether_addr ea; /* Station address */ ++ wl_rateset_t rateset; /* rateset in use */ ++ uint32 in; /* seconds elapsed since associated */ ++ uint32 listen_interval_inms; /* Min Listen interval in ms for this STA */ ++ uint32 tx_pkts; /* # of packets transmitted */ ++ uint32 tx_failures; /* # of packets failed */ ++ uint32 rx_ucast_pkts; /* # of unicast packets received */ ++ uint32 rx_mcast_pkts; /* # of multicast packets received */ ++ uint32 tx_rate; /* Rate of last successful tx frame */ ++ uint32 rx_rate; /* Rate of last successful rx frame */ ++ uint32 rx_decrypt_succeeds; /* # of packet decrypted successfully */ ++ uint32 rx_decrypt_failures; /* # of packet decrypted unsuccessfully */ ++} sta_info_t; ++ ++#define WL_OLD_STAINFO_SIZE OFFSETOF(sta_info_t, tx_pkts) ++ ++#define WL_STA_VER 3 ++ ++/* Flags for sta_info_t indicating properties of STA */ ++#define WL_STA_BRCM 0x1 /* Running a Broadcom driver */ ++#define WL_STA_WME 0x2 /* WMM association */ ++#define WL_STA_UNUSED 0x4 ++#define WL_STA_AUTHE 0x8 /* Authenticated */ ++#define WL_STA_ASSOC 0x10 /* Associated */ ++#define WL_STA_AUTHO 0x20 /* Authorized */ ++#define WL_STA_WDS 0x40 /* Wireless Distribution System */ ++#define WL_STA_WDS_LINKUP 0x80 /* WDS traffic/probes flowing properly */ ++#define WL_STA_PS 0x100 /* STA is in power save mode from AP's viewpoint */ ++#define WL_STA_APSD_BE 0x200 /* APSD delv/trigger for AC_BE is default enabled */ ++#define WL_STA_APSD_BK 0x400 /* APSD delv/trigger for AC_BK is default enabled */ ++#define WL_STA_APSD_VI 0x800 /* APSD delv/trigger for AC_VI is default enabled */ ++#define WL_STA_APSD_VO 0x1000 /* APSD delv/trigger for AC_VO is default enabled */ ++#define WL_STA_N_CAP 0x2000 /* STA 802.11n capable */ ++#define WL_STA_SCBSTATS 0x4000 /* Per STA debug stats */ ++ ++#define WL_WDS_LINKUP WL_STA_WDS_LINKUP /* deprecated */ ++ ++/* Values for TX Filter override mode */ ++#define WLC_TXFILTER_OVERRIDE_DISABLED 0 ++#define WLC_TXFILTER_OVERRIDE_ENABLED 1 ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* Used to get specific STA parameters */ ++typedef struct { ++ uint32 val; ++ struct ether_addr ea; ++} scb_val_t; ++ ++/* Used by iovar versions of some ioctls, i.e. WLC_SCB_AUTHORIZE et al */ ++typedef struct { ++ uint32 code; ++ scb_val_t ioctl_args; ++} authops_t; ++ ++/* channel encoding */ ++typedef struct channel_info { ++ int hw_channel; ++ int target_channel; ++ int scan_channel; ++} channel_info_t; ++ ++/* For ioctls that take a list of MAC addresses */ ++struct maclist { ++ uint count; /* number of MAC addresses */ ++ struct ether_addr ea[1]; /* variable length array of MAC addresses */ ++}; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++/* get pkt count struct passed through ioctl */ ++typedef struct get_pktcnt { ++ uint rx_good_pkt; ++ uint rx_bad_pkt; ++ uint tx_good_pkt; ++ uint tx_bad_pkt; ++ uint rx_ocast_good_pkt; /* unicast packets destined for others */ ++} get_pktcnt_t; ++ ++/* NINTENDO2 */ ++#define LQ_IDX_MIN 0 ++#define LQ_IDX_MAX 1 ++#define LQ_IDX_AVG 2 ++#define LQ_IDX_SUM 2 ++#define LQ_IDX_LAST 3 ++#define LQ_STOP_MONITOR 0 ++#define LQ_START_MONITOR 1 ++ ++/* Get averages RSSI, Rx PHY rate and SNR values */ ++typedef struct { ++ int rssi[LQ_IDX_LAST]; /* Array to keep min, max, avg rssi */ ++ int snr[LQ_IDX_LAST]; /* Array to keep min, max, avg snr */ ++ int isvalid; /* Flag indicating whether above data is valid */ ++} wl_lq_t; /* Link Quality */ ++ ++typedef enum wl_wakeup_reason_type { ++ LCD_ON = 1, ++ LCD_OFF, ++ DRC1_WAKE, ++ DRC2_WAKE, ++ REASON_LAST ++} wl_wr_type_t; ++ ++typedef struct { ++/* Unique filter id */ ++ uint32 id; ++ ++/* stores the reason for the last wake up */ ++ uint8 reason; ++} wl_wr_t; ++ ++/* Get MAC specific rate histogram command */ ++typedef struct { ++ struct ether_addr ea; /* MAC Address */ ++ uint8 ac_cat; /* Access Category */ ++ uint8 num_pkts; /* Number of packet entries to be averaged */ ++} wl_mac_ratehisto_cmd_t; /* MAC Specific Rate Histogram command */ ++ ++/* Get MAC rate histogram response */ ++typedef struct { ++ uint32 rate[WLC_MAXRATE + 1]; /* Rates */ ++ uint32 mcs[WL_RATESET_SZ_HT_MCS * WL_TX_CHAINS_MAX]; /* MCS counts */ ++ uint32 vht[WL_RATESET_SZ_VHT_MCS][WL_TX_CHAINS_MAX]; /* VHT counts */ ++ uint32 tsf_timer[2][2]; /* Start and End time for 8bytes value */ ++} wl_mac_ratehisto_res_t; /* MAC Specific Rate Histogram Response */ ++ ++/* Values for TX Filter override mode */ ++#define WLC_TXFILTER_OVERRIDE_DISABLED 0 ++#define WLC_TXFILTER_OVERRIDE_ENABLED 1 ++ ++#define WL_IOCTL_ACTION_GET 0x0 ++#define WL_IOCTL_ACTION_SET 0x1 ++#define WL_IOCTL_ACTION_OVL_IDX_MASK 0x1e ++#define WL_IOCTL_ACTION_OVL_RSV 0x20 ++#define WL_IOCTL_ACTION_OVL 0x40 ++#define WL_IOCTL_ACTION_MASK 0x7e ++#define WL_IOCTL_ACTION_OVL_SHIFT 1 ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* Linux network driver ioctl encoding */ ++typedef struct wl_ioctl { ++ uint cmd; /* common ioctl definition */ ++ void *buf; /* pointer to user buffer */ ++ uint len; /* length of user buffer */ ++ uint8 set; /* 1=set IOCTL; 0=query IOCTL */ ++ uint used; /* bytes read or written (optional) */ ++ uint needed; /* bytes needed (optional) */ ++} wl_ioctl_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++/* reference to wl_ioctl_t struct used by usermode driver */ ++#define ioctl_subtype set /* subtype param */ ++#define ioctl_pid used /* pid param */ ++#define ioctl_status needed /* status param */ ++ ++/* ++ * Structure for passing hardware and software ++ * revision info up from the driver. ++ */ ++typedef struct wlc_rev_info { ++ uint vendorid; /* PCI vendor id */ ++ uint deviceid; /* device id of chip */ ++ uint radiorev; /* radio revision */ ++ uint chiprev; /* chip revision */ ++ uint corerev; /* core revision */ ++ uint boardid; /* board identifier (usu. PCI sub-device id) */ ++ uint boardvendor; /* board vendor (usu. PCI sub-vendor id) */ ++ uint boardrev; /* board revision */ ++ uint driverrev; /* driver version */ ++ uint ucoderev; /* microcode version */ ++ uint bus; /* bus type */ ++ uint chipnum; /* chip number */ ++ uint phytype; /* phy type */ ++ uint phyrev; /* phy revision */ ++ uint anarev; /* anacore rev */ ++ uint chippkg; /* chip package info */ ++} wlc_rev_info_t; ++ ++#define WL_REV_INFO_LEGACY_LENGTH 48 ++ ++#define WL_BRAND_MAX 10 ++typedef struct wl_instance_info { ++ uint instance; ++ char brand[WL_BRAND_MAX]; ++} wl_instance_info_t; ++ ++/* structure to change size of tx fifo */ ++typedef struct wl_txfifo_sz { ++ uint16 magic; ++ uint16 fifo; ++ uint16 size; ++} wl_txfifo_sz_t; ++/* magic pattern used for mismatch driver and wl */ ++#define WL_TXFIFO_SZ_MAGIC 0xa5a5 ++ ++/* Transfer info about an IOVar from the driver */ ++/* Max supported IOV name size in bytes, + 1 for nul termination */ ++#define WLC_IOV_NAME_LEN 30 ++typedef struct wlc_iov_trx_s { ++ uint8 module; ++ uint8 type; ++ char name[WLC_IOV_NAME_LEN]; ++} wlc_iov_trx_t; ++ ++/* check this magic number */ ++#define WLC_IOCTL_MAGIC 0x14e46c77 ++ ++/* bump this number if you change the ioctl interface */ ++#ifdef D11AC_IOTYPES ++#define WLC_IOCTL_VERSION 2 ++#define WLC_IOCTL_VERSION_LEGACY_IOTYPES 1 ++#else ++#define WLC_IOCTL_VERSION 1 ++#endif /* D11AC_IOTYPES */ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++#define WLC_IOCTL_MAXLEN 8192 /* max length ioctl buffer required */ ++#define WLC_IOCTL_SMLEN 256 /* "small" length ioctl buffer required */ ++#define WLC_IOCTL_MEDLEN 1536 /* "med" length ioctl buffer required */ ++#if defined(LCNCONF) || defined(LCN40CONF) ++#define WLC_SAMPLECOLLECT_MAXLEN 8192 /* Max Sample Collect buffer */ ++#else ++#define WLC_SAMPLECOLLECT_MAXLEN 10240 /* Max Sample Collect buffer for two cores */ ++#endif ++ ++/* common ioctl definitions */ ++#define WLC_GET_MAGIC 0 ++#define WLC_GET_VERSION 1 ++#define WLC_UP 2 ++#define WLC_DOWN 3 ++#define WLC_GET_LOOP 4 ++#define WLC_SET_LOOP 5 ++#define WLC_DUMP 6 ++#define WLC_GET_MSGLEVEL 7 ++#define WLC_SET_MSGLEVEL 8 ++#define WLC_GET_PROMISC 9 ++#define WLC_SET_PROMISC 10 ++/* #define WLC_OVERLAY_IOCTL 11 */ /* not supported */ ++#define WLC_GET_RATE 12 ++#define WLC_GET_MAX_RATE 13 ++#define WLC_GET_INSTANCE 14 ++/* #define WLC_GET_FRAG 15 */ /* no longer supported */ ++/* #define WLC_SET_FRAG 16 */ /* no longer supported */ ++/* #define WLC_GET_RTS 17 */ /* no longer supported */ ++/* #define WLC_SET_RTS 18 */ /* no longer supported */ ++#define WLC_GET_INFRA 19 ++#define WLC_SET_INFRA 20 ++#define WLC_GET_AUTH 21 ++#define WLC_SET_AUTH 22 ++#define WLC_GET_BSSID 23 ++#define WLC_SET_BSSID 24 ++#define WLC_GET_SSID 25 ++#define WLC_SET_SSID 26 ++#define WLC_RESTART 27 ++#define WLC_TERMINATED 28 ++/* #define WLC_DUMP_SCB 28 */ /* no longer supported */ ++#define WLC_GET_CHANNEL 29 ++#define WLC_SET_CHANNEL 30 ++#define WLC_GET_SRL 31 ++#define WLC_SET_SRL 32 ++#define WLC_GET_LRL 33 ++#define WLC_SET_LRL 34 ++#define WLC_GET_PLCPHDR 35 ++#define WLC_SET_PLCPHDR 36 ++#define WLC_GET_RADIO 37 ++#define WLC_SET_RADIO 38 ++#define WLC_GET_PHYTYPE 39 ++#define WLC_DUMP_RATE 40 ++#define WLC_SET_RATE_PARAMS 41 ++#define WLC_GET_FIXRATE 42 ++#define WLC_SET_FIXRATE 43 ++/* #define WLC_GET_WEP 42 */ /* no longer supported */ ++/* #define WLC_SET_WEP 43 */ /* no longer supported */ ++#define WLC_GET_KEY 44 ++#define WLC_SET_KEY 45 ++#define WLC_GET_REGULATORY 46 ++#define WLC_SET_REGULATORY 47 ++#define WLC_GET_PASSIVE_SCAN 48 ++#define WLC_SET_PASSIVE_SCAN 49 ++#define WLC_SCAN 50 ++#define WLC_SCAN_RESULTS 51 ++#define WLC_DISASSOC 52 ++#define WLC_REASSOC 53 ++#define WLC_GET_ROAM_TRIGGER 54 ++#define WLC_SET_ROAM_TRIGGER 55 ++#define WLC_GET_ROAM_DELTA 56 ++#define WLC_SET_ROAM_DELTA 57 ++#define WLC_GET_ROAM_SCAN_PERIOD 58 ++#define WLC_SET_ROAM_SCAN_PERIOD 59 ++#define WLC_EVM 60 /* diag */ ++#define WLC_GET_TXANT 61 ++#define WLC_SET_TXANT 62 ++#define WLC_GET_ANTDIV 63 ++#define WLC_SET_ANTDIV 64 ++/* #define WLC_GET_TXPWR 65 */ /* no longer supported */ ++/* #define WLC_SET_TXPWR 66 */ /* no longer supported */ ++#define WLC_GET_CLOSED 67 ++#define WLC_SET_CLOSED 68 ++#define WLC_GET_MACLIST 69 ++#define WLC_SET_MACLIST 70 ++#define WLC_GET_RATESET 71 ++#define WLC_SET_RATESET 72 ++/* #define WLC_GET_LOCALE 73 */ /* no longer supported */ ++#define WLC_LONGTRAIN 74 ++#define WLC_GET_BCNPRD 75 ++#define WLC_SET_BCNPRD 76 ++#define WLC_GET_DTIMPRD 77 ++#define WLC_SET_DTIMPRD 78 ++#define WLC_GET_SROM 79 ++#define WLC_SET_SROM 80 ++#define WLC_GET_WEP_RESTRICT 81 ++#define WLC_SET_WEP_RESTRICT 82 ++#define WLC_GET_COUNTRY 83 ++#define WLC_SET_COUNTRY 84 ++#define WLC_GET_PM 85 ++#define WLC_SET_PM 86 ++#define WLC_GET_WAKE 87 ++#define WLC_SET_WAKE 88 ++/* #define WLC_GET_D11CNTS 89 */ /* -> "counters" iovar */ ++#define WLC_GET_FORCELINK 90 /* ndis only */ ++#define WLC_SET_FORCELINK 91 /* ndis only */ ++#define WLC_FREQ_ACCURACY 92 /* diag */ ++#define WLC_CARRIER_SUPPRESS 93 /* diag */ ++#define WLC_GET_PHYREG 94 ++#define WLC_SET_PHYREG 95 ++#define WLC_GET_RADIOREG 96 ++#define WLC_SET_RADIOREG 97 ++#define WLC_GET_REVINFO 98 ++#define WLC_GET_UCANTDIV 99 ++#define WLC_SET_UCANTDIV 100 ++#define WLC_R_REG 101 ++#define WLC_W_REG 102 ++/* #define WLC_DIAG_LOOPBACK 103 old tray diag */ ++/* #define WLC_RESET_D11CNTS 104 */ /* -> "reset_d11cnts" iovar */ ++#define WLC_GET_MACMODE 105 ++#define WLC_SET_MACMODE 106 ++#define WLC_GET_MONITOR 107 ++#define WLC_SET_MONITOR 108 ++#define WLC_GET_GMODE 109 ++#define WLC_SET_GMODE 110 ++#define WLC_GET_LEGACY_ERP 111 ++#define WLC_SET_LEGACY_ERP 112 ++#define WLC_GET_RX_ANT 113 ++#define WLC_GET_CURR_RATESET 114 /* current rateset */ ++#define WLC_GET_SCANSUPPRESS 115 ++#define WLC_SET_SCANSUPPRESS 116 ++#define WLC_GET_AP 117 ++#define WLC_SET_AP 118 ++#define WLC_GET_EAP_RESTRICT 119 ++#define WLC_SET_EAP_RESTRICT 120 ++#define WLC_SCB_AUTHORIZE 121 ++#define WLC_SCB_DEAUTHORIZE 122 ++#define WLC_GET_WDSLIST 123 ++#define WLC_SET_WDSLIST 124 ++#define WLC_GET_ATIM 125 ++#define WLC_SET_ATIM 126 ++#define WLC_GET_RSSI 127 ++#define WLC_GET_PHYANTDIV 128 ++#define WLC_SET_PHYANTDIV 129 ++#define WLC_AP_RX_ONLY 130 ++#define WLC_GET_TX_PATH_PWR 131 ++#define WLC_SET_TX_PATH_PWR 132 ++#define WLC_GET_WSEC 133 ++#define WLC_SET_WSEC 134 ++#define WLC_GET_PHY_NOISE 135 ++#define WLC_GET_BSS_INFO 136 ++#define WLC_GET_PKTCNTS 137 ++#define WLC_GET_LAZYWDS 138 ++#define WLC_SET_LAZYWDS 139 ++#define WLC_GET_BANDLIST 140 ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#define WLC_GET_BAND 141 ++#define WLC_SET_BAND 142 ++#define WLC_SCB_DEAUTHENTICATE 143 ++#define WLC_GET_SHORTSLOT 144 ++#define WLC_GET_SHORTSLOT_OVERRIDE 145 ++#define WLC_SET_SHORTSLOT_OVERRIDE 146 ++#define WLC_GET_SHORTSLOT_RESTRICT 147 ++#define WLC_SET_SHORTSLOT_RESTRICT 148 ++#define WLC_GET_GMODE_PROTECTION 149 ++#define WLC_GET_GMODE_PROTECTION_OVERRIDE 150 ++#define WLC_SET_GMODE_PROTECTION_OVERRIDE 151 ++#define WLC_UPGRADE 152 ++/* #define WLC_GET_MRATE 153 */ /* no longer supported */ ++/* #define WLC_SET_MRATE 154 */ /* no longer supported */ ++#define WLC_GET_IGNORE_BCNS 155 ++#define WLC_SET_IGNORE_BCNS 156 ++#define WLC_GET_SCB_TIMEOUT 157 ++#define WLC_SET_SCB_TIMEOUT 158 ++#define WLC_GET_ASSOCLIST 159 ++#define WLC_GET_CLK 160 ++#define WLC_SET_CLK 161 ++#define WLC_GET_UP 162 ++#define WLC_OUT 163 ++#define WLC_GET_WPA_AUTH 164 ++#define WLC_SET_WPA_AUTH 165 ++#define WLC_GET_UCFLAGS 166 ++#define WLC_SET_UCFLAGS 167 ++#define WLC_GET_PWRIDX 168 ++#define WLC_SET_PWRIDX 169 ++#define WLC_GET_TSSI 170 ++#define WLC_GET_SUP_RATESET_OVERRIDE 171 ++#define WLC_SET_SUP_RATESET_OVERRIDE 172 ++/* #define WLC_SET_FAST_TIMER 173 */ /* no longer supported */ ++/* #define WLC_GET_FAST_TIMER 174 */ /* no longer supported */ ++/* #define WLC_SET_SLOW_TIMER 175 */ /* no longer supported */ ++/* #define WLC_GET_SLOW_TIMER 176 */ /* no longer supported */ ++/* #define WLC_DUMP_PHYREGS 177 */ /* no longer supported */ ++#define WLC_GET_PROTECTION_CONTROL 178 ++#define WLC_SET_PROTECTION_CONTROL 179 ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++#define WLC_GET_PHYLIST 180 ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#define WLC_ENCRYPT_STRENGTH 181 /* ndis only */ ++#define WLC_DECRYPT_STATUS 182 /* ndis only */ ++#define WLC_GET_KEY_SEQ 183 ++#define WLC_GET_SCAN_CHANNEL_TIME 184 ++#define WLC_SET_SCAN_CHANNEL_TIME 185 ++#define WLC_GET_SCAN_UNASSOC_TIME 186 ++#define WLC_SET_SCAN_UNASSOC_TIME 187 ++#define WLC_GET_SCAN_HOME_TIME 188 ++#define WLC_SET_SCAN_HOME_TIME 189 ++#define WLC_GET_SCAN_NPROBES 190 ++#define WLC_SET_SCAN_NPROBES 191 ++#define WLC_GET_PRB_RESP_TIMEOUT 192 ++#define WLC_SET_PRB_RESP_TIMEOUT 193 ++#define WLC_GET_ATTEN 194 ++#define WLC_SET_ATTEN 195 ++#define WLC_GET_SHMEM 196 /* diag */ ++#define WLC_SET_SHMEM 197 /* diag */ ++/* #define WLC_GET_GMODE_PROTECTION_CTS 198 */ /* no longer supported */ ++/* #define WLC_SET_GMODE_PROTECTION_CTS 199 */ /* no longer supported */ ++#define WLC_SET_WSEC_TEST 200 ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++#define WLC_SCB_DEAUTHENTICATE_FOR_REASON 201 ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#define WLC_TKIP_COUNTERMEASURES 202 ++#define WLC_GET_PIOMODE 203 ++#define WLC_SET_PIOMODE 204 ++#define WLC_SET_ASSOC_PREFER 205 ++#define WLC_GET_ASSOC_PREFER 206 ++#define WLC_SET_ROAM_PREFER 207 ++#define WLC_GET_ROAM_PREFER 208 ++#define WLC_SET_LED 209 ++#define WLC_GET_LED 210 ++#define WLC_GET_INTERFERENCE_MODE 211 ++#define WLC_SET_INTERFERENCE_MODE 212 ++#define WLC_GET_CHANNEL_QA 213 ++#define WLC_START_CHANNEL_QA 214 ++#define WLC_GET_CHANNEL_SEL 215 ++#define WLC_START_CHANNEL_SEL 216 ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++#define WLC_GET_VALID_CHANNELS 217 ++#define WLC_GET_FAKEFRAG 218 ++#define WLC_SET_FAKEFRAG 219 ++#define WLC_GET_PWROUT_PERCENTAGE 220 ++#define WLC_SET_PWROUT_PERCENTAGE 221 ++#define WLC_SET_BAD_FRAME_PREEMPT 222 ++#define WLC_GET_BAD_FRAME_PREEMPT 223 ++#define WLC_SET_LEAP_LIST 224 ++#define WLC_GET_LEAP_LIST 225 ++#define WLC_GET_CWMIN 226 ++#define WLC_SET_CWMIN 227 ++#define WLC_GET_CWMAX 228 ++#define WLC_SET_CWMAX 229 ++#define WLC_GET_WET 230 ++#define WLC_SET_WET 231 ++#define WLC_GET_PUB 232 ++/* #define WLC_SET_GLACIAL_TIMER 233 */ /* no longer supported */ ++/* #define WLC_GET_GLACIAL_TIMER 234 */ /* no longer supported */ ++#define WLC_GET_KEY_PRIMARY 235 ++#define WLC_SET_KEY_PRIMARY 236 ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++/* #define WLC_DUMP_RADIOREGS 237 */ /* no longer supported */ ++#define WLC_GET_ACI_ARGS 238 ++#define WLC_SET_ACI_ARGS 239 ++#define WLC_UNSET_CALLBACK 240 ++#define WLC_SET_CALLBACK 241 ++#define WLC_GET_RADAR 242 ++#define WLC_SET_RADAR 243 ++#define WLC_SET_SPECT_MANAGMENT 244 ++#define WLC_GET_SPECT_MANAGMENT 245 ++#define WLC_WDS_GET_REMOTE_HWADDR 246 /* handled in wl_linux.c/wl_vx.c */ ++#define WLC_WDS_GET_WPA_SUP 247 ++#define WLC_SET_CS_SCAN_TIMER 248 ++#define WLC_GET_CS_SCAN_TIMER 249 ++#define WLC_MEASURE_REQUEST 250 ++#define WLC_INIT 251 ++#define WLC_SEND_QUIET 252 ++#define WLC_KEEPALIVE 253 ++#define WLC_SEND_PWR_CONSTRAINT 254 ++#define WLC_UPGRADE_STATUS 255 ++#define WLC_CURRENT_PWR 256 ++#define WLC_GET_SCAN_PASSIVE_TIME 257 ++#define WLC_SET_SCAN_PASSIVE_TIME 258 ++#define WLC_LEGACY_LINK_BEHAVIOR 259 ++#define WLC_GET_CHANNELS_IN_COUNTRY 260 ++#define WLC_GET_COUNTRY_LIST 261 ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++#define WLC_GET_VAR 262 /* get value of named variable */ ++#define WLC_SET_VAR 263 /* set named variable to value */ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#define WLC_NVRAM_GET 264 /* deprecated */ ++#define WLC_NVRAM_SET 265 ++#define WLC_NVRAM_DUMP 266 ++#define WLC_REBOOT 267 ++#define WLC_SET_WSEC_PMK 268 ++#define WLC_GET_AUTH_MODE 269 ++#define WLC_SET_AUTH_MODE 270 ++#define WLC_GET_WAKEENTRY 271 ++#define WLC_SET_WAKEENTRY 272 ++#define WLC_NDCONFIG_ITEM 273 /* currently handled in wl_oid.c */ ++#define WLC_NVOTPW 274 ++#define WLC_OTPW 275 ++#define WLC_IOV_BLOCK_GET 276 ++#define WLC_IOV_MODULES_GET 277 ++#define WLC_SOFT_RESET 278 ++#define WLC_GET_ALLOW_MODE 279 ++#define WLC_SET_ALLOW_MODE 280 ++#define WLC_GET_DESIRED_BSSID 281 ++#define WLC_SET_DESIRED_BSSID 282 ++#define WLC_DISASSOC_MYAP 283 ++#define WLC_GET_NBANDS 284 /* for Dongle EXT_STA support */ ++#define WLC_GET_BANDSTATES 285 /* for Dongle EXT_STA support */ ++#define WLC_GET_WLC_BSS_INFO 286 /* for Dongle EXT_STA support */ ++#define WLC_GET_ASSOC_INFO 287 /* for Dongle EXT_STA support */ ++#define WLC_GET_OID_PHY 288 /* for Dongle EXT_STA support */ ++#define WLC_SET_OID_PHY 289 /* for Dongle EXT_STA support */ ++#define WLC_SET_ASSOC_TIME 290 /* for Dongle EXT_STA support */ ++#define WLC_GET_DESIRED_SSID 291 /* for Dongle EXT_STA support */ ++#define WLC_GET_CHANSPEC 292 /* for Dongle EXT_STA support */ ++#define WLC_GET_ASSOC_STATE 293 /* for Dongle EXT_STA support */ ++#define WLC_SET_PHY_STATE 294 /* for Dongle EXT_STA support */ ++#define WLC_GET_SCAN_PENDING 295 /* for Dongle EXT_STA support */ ++#define WLC_GET_SCANREQ_PENDING 296 /* for Dongle EXT_STA support */ ++#define WLC_GET_PREV_ROAM_REASON 297 /* for Dongle EXT_STA support */ ++#define WLC_SET_PREV_ROAM_REASON 298 /* for Dongle EXT_STA support */ ++#define WLC_GET_BANDSTATES_PI 299 /* for Dongle EXT_STA support */ ++#define WLC_GET_PHY_STATE 300 /* for Dongle EXT_STA support */ ++#define WLC_GET_BSS_WPA_RSN 301 /* for Dongle EXT_STA support */ ++#define WLC_GET_BSS_WPA2_RSN 302 /* for Dongle EXT_STA support */ ++#define WLC_GET_BSS_BCN_TS 303 /* for Dongle EXT_STA support */ ++#define WLC_GET_INT_DISASSOC 304 /* for Dongle EXT_STA support */ ++#define WLC_SET_NUM_PEERS 305 /* for Dongle EXT_STA support */ ++#define WLC_GET_NUM_BSS 306 /* for Dongle EXT_STA support */ ++#define WLC_PHY_SAMPLE_COLLECT 307 /* phy sample collect mode */ ++/* #define WLC_UM_PRIV 308 */ /* Deprecated: usermode driver */ ++#define WLC_GET_CMD 309 ++/* #define WLC_LAST 310 */ /* Never used - can be reused */ ++#define WLC_SET_INTERFERENCE_OVERRIDE_MODE 311 /* set inter mode override */ ++#define WLC_GET_INTERFERENCE_OVERRIDE_MODE 312 /* get inter mode override */ ++/* #define WLC_GET_WAI_RESTRICT 313 */ /* for WAPI, deprecated use iovar instead */ ++/* #define WLC_SET_WAI_RESTRICT 314 */ /* for WAPI, deprecated use iovar instead */ ++/* #define WLC_SET_WAI_REKEY 315 */ /* for WAPI, deprecated use iovar instead */ ++#define WLC_SET_NAT_CONFIG 316 /* for configuring NAT filter driver */ ++#define WLC_GET_NAT_STATE 317 ++#define WLC_LAST 318 ++ ++#ifndef EPICTRL_COOKIE ++#define EPICTRL_COOKIE 0xABADCEDE ++#endif ++ ++/* vx wlc ioctl's offset */ ++#define CMN_IOCTL_OFF 0x180 ++ ++/* ++ * custom OID support ++ * ++ * 0xFF - implementation specific OID ++ * 0xE4 - first byte of Broadcom PCI vendor ID ++ * 0x14 - second byte of Broadcom PCI vendor ID ++ * 0xXX - the custom OID number ++ */ ++ ++/* begin 0x1f values beyond the start of the ET driver range. */ ++#define WL_OID_BASE 0xFFE41420 ++ ++/* NDIS overrides */ ++#define OID_WL_GETINSTANCE (WL_OID_BASE + WLC_GET_INSTANCE) ++#define OID_WL_GET_FORCELINK (WL_OID_BASE + WLC_GET_FORCELINK) ++#define OID_WL_SET_FORCELINK (WL_OID_BASE + WLC_SET_FORCELINK) ++#define OID_WL_ENCRYPT_STRENGTH (WL_OID_BASE + WLC_ENCRYPT_STRENGTH) ++#define OID_WL_DECRYPT_STATUS (WL_OID_BASE + WLC_DECRYPT_STATUS) ++#define OID_LEGACY_LINK_BEHAVIOR (WL_OID_BASE + WLC_LEGACY_LINK_BEHAVIOR) ++#define OID_WL_NDCONFIG_ITEM (WL_OID_BASE + WLC_NDCONFIG_ITEM) ++ ++/* EXT_STA Dongle suuport */ ++#define OID_STA_CHANSPEC (WL_OID_BASE + WLC_GET_CHANSPEC) ++#define OID_STA_NBANDS (WL_OID_BASE + WLC_GET_NBANDS) ++#define OID_STA_GET_PHY (WL_OID_BASE + WLC_GET_OID_PHY) ++#define OID_STA_SET_PHY (WL_OID_BASE + WLC_SET_OID_PHY) ++#define OID_STA_ASSOC_TIME (WL_OID_BASE + WLC_SET_ASSOC_TIME) ++#define OID_STA_DESIRED_SSID (WL_OID_BASE + WLC_GET_DESIRED_SSID) ++#define OID_STA_SET_PHY_STATE (WL_OID_BASE + WLC_SET_PHY_STATE) ++#define OID_STA_SCAN_PENDING (WL_OID_BASE + WLC_GET_SCAN_PENDING) ++#define OID_STA_SCANREQ_PENDING (WL_OID_BASE + WLC_GET_SCANREQ_PENDING) ++#define OID_STA_GET_ROAM_REASON (WL_OID_BASE + WLC_GET_PREV_ROAM_REASON) ++#define OID_STA_SET_ROAM_REASON (WL_OID_BASE + WLC_SET_PREV_ROAM_REASON) ++#define OID_STA_GET_PHY_STATE (WL_OID_BASE + WLC_GET_PHY_STATE) ++#define OID_STA_INT_DISASSOC (WL_OID_BASE + WLC_GET_INT_DISASSOC) ++#define OID_STA_SET_NUM_PEERS (WL_OID_BASE + WLC_SET_NUM_PEERS) ++#define OID_STA_GET_NUM_BSS (WL_OID_BASE + WLC_GET_NUM_BSS) ++ ++/* NAT filter driver support */ ++#define OID_NAT_SET_CONFIG (WL_OID_BASE + WLC_SET_NAT_CONFIG) ++#define OID_NAT_GET_STATE (WL_OID_BASE + WLC_GET_NAT_STATE) ++ ++#define WL_DECRYPT_STATUS_SUCCESS 1 ++#define WL_DECRYPT_STATUS_FAILURE 2 ++#define WL_DECRYPT_STATUS_UNKNOWN 3 ++ ++/* allows user-mode app to poll the status of USB image upgrade */ ++#define WLC_UPGRADE_SUCCESS 0 ++#define WLC_UPGRADE_PENDING 1 ++ ++#ifdef CONFIG_USBRNDIS_RETAIL ++/* struct passed in for WLC_NDCONFIG_ITEM */ ++typedef struct { ++ char *name; ++ void *param; ++} ndconfig_item_t; ++#endif ++ ++ ++/* WLC_GET_AUTH, WLC_SET_AUTH values */ ++#define WL_AUTH_OPEN_SYSTEM 0 /* d11 open authentication */ ++#define WL_AUTH_SHARED_KEY 1 /* d11 shared authentication */ ++#ifdef BCM4330_CHIP ++#define WL_AUTH_OPEN_SHARED 2 /* try open, then shared if open failed w/rc 13 */ ++#else ++/* BCM4334(Phoenex branch) value changed to 3 */ ++#define WL_AUTH_OPEN_SHARED 3 /* try open, then shared if open failed w/rc 13 */ ++#endif ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* Bit masks for radio disabled status - returned by WL_GET_RADIO */ ++#define WL_RADIO_SW_DISABLE (1<<0) ++#define WL_RADIO_HW_DISABLE (1<<1) ++#define WL_RADIO_MPC_DISABLE (1<<2) ++#define WL_RADIO_COUNTRY_DISABLE (1<<3) /* some countries don't support any channel */ ++ ++#define WL_SPURAVOID_OFF 0 ++#define WL_SPURAVOID_ON1 1 ++#define WL_SPURAVOID_ON2 2 ++ ++/* Override bit for WLC_SET_TXPWR. if set, ignore other level limits */ ++#define WL_TXPWR_OVERRIDE (1U<<31) ++#define WL_TXPWR_NEG (1U<<30) ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++#define WL_PHY_PAVARS_LEN 32 /* Phy type, Band range, chain, a1[0], b0[0], b1[0] ... */ ++ ++#define WL_PHY_PAVAR_VER 1 /* pavars version */ ++ ++typedef struct wl_po { ++ uint16 phy_type; /* Phy type */ ++ uint16 band; ++ uint16 cckpo; ++ uint32 ofdmpo; ++ uint16 mcspo[8]; ++} wl_po_t; ++ ++/* a large TX Power as an init value to factor out of MIN() calculations, ++ * keep low enough to fit in an int8, units are .25 dBm ++ */ ++#define WLC_TXPWR_MAX (127) /* ~32 dBm = 1,500 mW */ ++ ++/* "diag" iovar argument and error code */ ++#define WL_DIAG_INTERRUPT 1 /* d11 loopback interrupt test */ ++#define WL_DIAG_LOOPBACK 2 /* d11 loopback data test */ ++#define WL_DIAG_MEMORY 3 /* d11 memory test */ ++#define WL_DIAG_LED 4 /* LED test */ ++#define WL_DIAG_REG 5 /* d11/phy register test */ ++#define WL_DIAG_SROM 6 /* srom read/crc test */ ++#define WL_DIAG_DMA 7 /* DMA test */ ++#define WL_DIAG_LOOPBACK_EXT 8 /* enhenced d11 loopback data test */ ++ ++#define WL_DIAGERR_SUCCESS 0 ++#define WL_DIAGERR_FAIL_TO_RUN 1 /* unable to run requested diag */ ++#define WL_DIAGERR_NOT_SUPPORTED 2 /* diag requested is not supported */ ++#define WL_DIAGERR_INTERRUPT_FAIL 3 /* loopback interrupt test failed */ ++#define WL_DIAGERR_LOOPBACK_FAIL 4 /* loopback data test failed */ ++#define WL_DIAGERR_SROM_FAIL 5 /* srom read failed */ ++#define WL_DIAGERR_SROM_BADCRC 6 /* srom crc failed */ ++#define WL_DIAGERR_REG_FAIL 7 /* d11/phy register test failed */ ++#define WL_DIAGERR_MEMORY_FAIL 8 /* d11 memory test failed */ ++#define WL_DIAGERR_NOMEM 9 /* diag test failed due to no memory */ ++#define WL_DIAGERR_DMA_FAIL 10 /* DMA test failed */ ++ ++#define WL_DIAGERR_MEMORY_TIMEOUT 11 /* d11 memory test didn't finish in time */ ++#define WL_DIAGERR_MEMORY_BADPATTERN 12 /* d11 memory test result in bad pattern */ ++ ++/* band types */ ++#define WLC_BAND_AUTO 0 /* auto-select */ ++#define WLC_BAND_5G 1 /* 5 Ghz */ ++#define WLC_BAND_2G 2 /* 2.4 Ghz */ ++#define WLC_BAND_ALL 3 /* all bands */ ++ ++/* band range returned by band_range iovar */ ++#define WL_CHAN_FREQ_RANGE_2G 0 ++#define WL_CHAN_FREQ_RANGE_5GL 1 ++#define WL_CHAN_FREQ_RANGE_5GM 2 ++#define WL_CHAN_FREQ_RANGE_5GH 3 ++ ++#define WL_CHAN_FREQ_RANGE_5G_BAND0 1 ++#define WL_CHAN_FREQ_RANGE_5G_BAND1 2 ++#define WL_CHAN_FREQ_RANGE_5G_BAND2 3 ++#define WL_CHAN_FREQ_RANGE_5G_BAND3 4 ++ ++#define WL_CHAN_FREQ_RANGE_5G_4BAND 5 ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* phy types (returned by WLC_GET_PHYTPE) */ ++#define WLC_PHY_TYPE_A 0 ++#define WLC_PHY_TYPE_B 1 ++#define WLC_PHY_TYPE_G 2 ++#define WLC_PHY_TYPE_N 4 ++#define WLC_PHY_TYPE_LP 5 ++#define WLC_PHY_TYPE_SSN 6 ++#define WLC_PHY_TYPE_HT 7 ++#define WLC_PHY_TYPE_LCN 8 ++#define WLC_PHY_TYPE_LCN40 10 ++#define WLC_PHY_TYPE_AC 11 ++#define WLC_PHY_TYPE_NULL 0xf ++ ++/* Values for PM */ ++#define PM_OFF 0 ++#define PM_MAX 1 ++#define PM_FAST 2 ++#define PM_FORCE_OFF 3 /* use this bit to force PM off even bt is active */ ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++/* MAC list modes */ ++#define WLC_MACMODE_DISABLED 0 /* MAC list disabled */ ++#define WLC_MACMODE_DENY 1 /* Deny specified (i.e. allow unspecified) */ ++#define WLC_MACMODE_ALLOW 2 /* Allow specified (i.e. deny unspecified) */ ++ ++/* ++ * 54g modes (basic bits may still be overridden) ++ * ++ * GMODE_LEGACY_B Rateset: 1b, 2b, 5.5, 11 ++ * Preamble: Long ++ * Shortslot: Off ++ * GMODE_AUTO Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54 ++ * Extended Rateset: 6, 9, 12, 48 ++ * Preamble: Long ++ * Shortslot: Auto ++ * GMODE_ONLY Rateset: 1b, 2b, 5.5b, 11b, 18, 24b, 36, 54 ++ * Extended Rateset: 6b, 9, 12b, 48 ++ * Preamble: Short required ++ * Shortslot: Auto ++ * GMODE_B_DEFERRED Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54 ++ * Extended Rateset: 6, 9, 12, 48 ++ * Preamble: Long ++ * Shortslot: On ++ * GMODE_PERFORMANCE Rateset: 1b, 2b, 5.5b, 6b, 9, 11b, 12b, 18, 24b, 36, 48, 54 ++ * Preamble: Short required ++ * Shortslot: On and required ++ * GMODE_LRS Rateset: 1b, 2b, 5.5b, 11b ++ * Extended Rateset: 6, 9, 12, 18, 24, 36, 48, 54 ++ * Preamble: Long ++ * Shortslot: Auto ++ */ ++#define GMODE_LEGACY_B 0 ++#define GMODE_AUTO 1 ++#define GMODE_ONLY 2 ++#define GMODE_B_DEFERRED 3 ++#define GMODE_PERFORMANCE 4 ++#define GMODE_LRS 5 ++#define GMODE_MAX 6 ++ ++/* values for PLCPHdr_override */ ++#define WLC_PLCP_AUTO -1 ++#define WLC_PLCP_SHORT 0 ++#define WLC_PLCP_LONG 1 ++ ++/* values for g_protection_override and n_protection_override */ ++#define WLC_PROTECTION_AUTO -1 ++#define WLC_PROTECTION_OFF 0 ++#define WLC_PROTECTION_ON 1 ++#define WLC_PROTECTION_MMHDR_ONLY 2 ++#define WLC_PROTECTION_CTS_ONLY 3 ++ ++/* values for g_protection_control and n_protection_control */ ++#define WLC_PROTECTION_CTL_OFF 0 ++#define WLC_PROTECTION_CTL_LOCAL 1 ++#define WLC_PROTECTION_CTL_OVERLAP 2 ++ ++/* values for n_protection */ ++#define WLC_N_PROTECTION_OFF 0 ++#define WLC_N_PROTECTION_OPTIONAL 1 ++#define WLC_N_PROTECTION_20IN40 2 ++#define WLC_N_PROTECTION_MIXEDMODE 3 ++ ++/* values for n_preamble_type */ ++#define WLC_N_PREAMBLE_MIXEDMODE 0 ++#define WLC_N_PREAMBLE_GF 1 ++#define WLC_N_PREAMBLE_GF_BRCM 2 ++ ++/* values for band specific 40MHz capabilities (deprecated) */ ++#define WLC_N_BW_20ALL 0 ++#define WLC_N_BW_40ALL 1 ++#define WLC_N_BW_20IN2G_40IN5G 2 ++ ++#define WLC_BW_20MHZ_BIT (1<<0) ++#define WLC_BW_40MHZ_BIT (1<<1) ++#define WLC_BW_80MHZ_BIT (1<<2) ++ ++/* Bandwidth capabilities */ ++#define WLC_BW_CAP_20MHZ (WLC_BW_20MHZ_BIT) ++#define WLC_BW_CAP_40MHZ (WLC_BW_40MHZ_BIT|WLC_BW_20MHZ_BIT) ++#define WLC_BW_CAP_80MHZ (WLC_BW_80MHZ_BIT|WLC_BW_40MHZ_BIT|WLC_BW_20MHZ_BIT) ++#define WLC_BW_CAP_UNRESTRICTED 0xFF ++ ++#define WL_BW_CAP_20MHZ(bw_cap) (((bw_cap) & WLC_BW_20MHZ_BIT) ? TRUE : FALSE) ++#define WL_BW_CAP_40MHZ(bw_cap) (((bw_cap) & WLC_BW_40MHZ_BIT) ? TRUE : FALSE) ++#define WL_BW_CAP_80MHZ(bw_cap) (((bw_cap) & WLC_BW_80MHZ_BIT) ? TRUE : FALSE) ++ ++/* values to force tx/rx chain */ ++#define WLC_N_TXRX_CHAIN0 0 ++#define WLC_N_TXRX_CHAIN1 1 ++ ++/* bitflags for SGI support (sgi_rx iovar) */ ++#define WLC_N_SGI_20 0x01 ++#define WLC_N_SGI_40 0x02 ++#define WLC_VHT_SGI_80 0x04 ++ ++/* when sgi_tx==WLC_SGI_ALL, bypass rate selection, enable sgi for all mcs */ ++#define WLC_SGI_ALL 0x02 ++ ++#define LISTEN_INTERVAL 10 ++/* interference mitigation options */ ++#define INTERFERE_OVRRIDE_OFF -1 /* interference override off */ ++#define INTERFERE_NONE 0 /* off */ ++#define NON_WLAN 1 /* foreign/non 802.11 interference, no auto detect */ ++#define WLAN_MANUAL 2 /* ACI: no auto detection */ ++#define WLAN_AUTO 3 /* ACI: auto detect */ ++#define WLAN_AUTO_W_NOISE 4 /* ACI: auto - detect and non 802.11 interference */ ++#define AUTO_ACTIVE (1 << 7) /* Auto is currently active */ ++ ++/* AP environment */ ++#define AP_ENV_DETECT_NOT_USED 0 /* We aren't using AP environment detection */ ++#define AP_ENV_DENSE 1 /* "Corporate" or other AP dense environment */ ++#define AP_ENV_SPARSE 2 /* "Home" or other sparse environment */ ++#define AP_ENV_INDETERMINATE 3 /* AP environment hasn't been identified */ ++ ++typedef struct wl_aci_args { ++ int enter_aci_thresh; /* Trigger level to start detecting ACI */ ++ int exit_aci_thresh; /* Trigger level to exit ACI mode */ ++ int usec_spin; /* microsecs to delay between rssi samples */ ++ int glitch_delay; /* interval between ACI scans when glitch count is consistently high */ ++ uint16 nphy_adcpwr_enter_thresh; /* ADC power to enter ACI mitigation mode */ ++ uint16 nphy_adcpwr_exit_thresh; /* ADC power to exit ACI mitigation mode */ ++ uint16 nphy_repeat_ctr; /* Number of tries per channel to compute power */ ++ uint16 nphy_num_samples; /* Number of samples to compute power on one channel */ ++ uint16 nphy_undetect_window_sz; /* num of undetects to exit ACI Mitigation mode */ ++ uint16 nphy_b_energy_lo_aci; /* low ACI power energy threshold for bphy */ ++ uint16 nphy_b_energy_md_aci; /* mid ACI power energy threshold for bphy */ ++ uint16 nphy_b_energy_hi_aci; /* high ACI power energy threshold for bphy */ ++ uint16 nphy_noise_noassoc_glitch_th_up; /* wl interference 4 */ ++ uint16 nphy_noise_noassoc_glitch_th_dn; ++ uint16 nphy_noise_assoc_glitch_th_up; ++ uint16 nphy_noise_assoc_glitch_th_dn; ++ uint16 nphy_noise_assoc_aci_glitch_th_up; ++ uint16 nphy_noise_assoc_aci_glitch_th_dn; ++ uint16 nphy_noise_assoc_enter_th; ++ uint16 nphy_noise_noassoc_enter_th; ++ uint16 nphy_noise_assoc_rx_glitch_badplcp_enter_th; ++ uint16 nphy_noise_noassoc_crsidx_incr; ++ uint16 nphy_noise_assoc_crsidx_incr; ++ uint16 nphy_noise_crsidx_decr; ++} wl_aci_args_t; ++ ++#define TRIGGER_NOW 0 ++#define TRIGGER_CRS 0x01 ++#define TRIGGER_CRSDEASSERT 0x02 ++#define TRIGGER_GOODFCS 0x04 ++#define TRIGGER_BADFCS 0x08 ++#define TRIGGER_BADPLCP 0x10 ++#define TRIGGER_CRSGLITCH 0x20 ++#define WL_ACI_ARGS_LEGACY_LENGTH 16 /* bytes of pre NPHY aci args */ ++#define WL_SAMPLECOLLECT_T_VERSION 2 /* version of wl_samplecollect_args_t struct */ ++typedef struct wl_samplecollect_args { ++ /* version 0 fields */ ++ uint8 coll_us; ++ int cores; ++ /* add'l version 1 fields */ ++ uint16 version; /* see definition of WL_SAMPLECOLLECT_T_VERSION */ ++ uint16 length; /* length of entire structure */ ++ int8 trigger; ++ uint16 timeout; ++ uint16 mode; ++ uint32 pre_dur; ++ uint32 post_dur; ++ uint8 gpio_sel; ++ bool downsamp; ++ bool be_deaf; ++ bool agc; /* loop from init gain and going down */ ++ bool filter; /* override high pass corners to lowest */ ++ /* add'l version 2 fields */ ++ uint8 trigger_state; ++ uint8 module_sel1; ++ uint8 module_sel2; ++ uint16 nsamps; ++} wl_samplecollect_args_t; ++ ++#define WL_SAMPLEDATA_HEADER_TYPE 1 ++#define WL_SAMPLEDATA_HEADER_SIZE 80 /* sample collect header size (bytes) */ ++#define WL_SAMPLEDATA_TYPE 2 ++#define WL_SAMPLEDATA_SEQ 0xff /* sequence # */ ++#define WL_SAMPLEDATA_MORE_DATA 0x100 /* more data mask */ ++#define WL_SAMPLEDATA_T_VERSION 1 /* version of wl_samplecollect_args_t struct */ ++/* version for unpacked sample data, int16 {(I,Q),Core(0..N)} */ ++#define WL_SAMPLEDATA_T_VERSION_SPEC_AN 2 ++ ++typedef struct wl_sampledata { ++ uint16 version; /* structure version */ ++ uint16 size; /* size of structure */ ++ uint16 tag; /* Header/Data */ ++ uint16 length; /* data length */ ++ uint32 flag; /* bit def */ ++} wl_sampledata_t; ++ ++/* wl_radar_args_t */ ++typedef struct { ++ int npulses; /* required number of pulses at n * t_int */ ++ int ncontig; /* required number of pulses at t_int */ ++ int min_pw; /* minimum pulse width (20 MHz clocks) */ ++ int max_pw; /* maximum pulse width (20 MHz clocks) */ ++ uint16 thresh0; /* Radar detection, thresh 0 */ ++ uint16 thresh1; /* Radar detection, thresh 1 */ ++ uint16 blank; /* Radar detection, blank control */ ++ uint16 fmdemodcfg; /* Radar detection, fmdemod config */ ++ int npulses_lp; /* Radar detection, minimum long pulses */ ++ int min_pw_lp; /* Minimum pulsewidth for long pulses */ ++ int max_pw_lp; /* Maximum pulsewidth for long pulses */ ++ int min_fm_lp; /* Minimum fm for long pulses */ ++ int max_span_lp; /* Maximum deltat for long pulses */ ++ int min_deltat; /* Minimum spacing between pulses */ ++ int max_deltat; /* Maximum spacing between pulses */ ++ uint16 autocorr; /* Radar detection, autocorr on or off */ ++ uint16 st_level_time; /* Radar detection, start_timing level */ ++ uint16 t2_min; /* minimum clocks needed to remain in state 2 */ ++ uint32 version; /* version */ ++ uint32 fra_pulse_err; /* sample error margin for detecting French radar pulsed */ ++ int npulses_fra; /* Radar detection, minimum French pulses set */ ++ int npulses_stg2; /* Radar detection, minimum staggered-2 pulses set */ ++ int npulses_stg3; /* Radar detection, minimum staggered-3 pulses set */ ++ uint16 percal_mask; /* defines which period cal is masked from radar detection */ ++ int quant; /* quantization resolution to pulse positions */ ++ uint32 min_burst_intv_lp; /* minimum burst to burst interval for bin3 radar */ ++ uint32 max_burst_intv_lp; /* maximum burst to burst interval for bin3 radar */ ++ int nskip_rst_lp; /* number of skipped pulses before resetting lp buffer */ ++ int max_pw_tol; /* maximum tollerance allowed in detected pulse width for radar detection */ ++ uint16 feature_mask; /* 16-bit mask to specify enabled features */ ++} wl_radar_args_t; ++ ++#define WL_RADAR_ARGS_VERSION 2 ++ ++typedef struct { ++ uint32 version; /* version */ ++ uint16 thresh0_20_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 20MHz */ ++ uint16 thresh1_20_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 20MHz */ ++ uint16 thresh0_40_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 40MHz */ ++ uint16 thresh1_40_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 40MHz */ ++ uint16 thresh0_80_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 80MHz */ ++ uint16 thresh1_80_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 80MHz */ ++ uint16 thresh0_160_lo; /* Radar detection, thresh 0 (range 5250-5350MHz) for BW 160MHz */ ++ uint16 thresh1_160_lo; /* Radar detection, thresh 1 (range 5250-5350MHz) for BW 160MHz */ ++ uint16 thresh0_20_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 20MHz */ ++ uint16 thresh1_20_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 20MHz */ ++ uint16 thresh0_40_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 40MHz */ ++ uint16 thresh1_40_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 40MHz */ ++ uint16 thresh0_80_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 80MHz */ ++ uint16 thresh1_80_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 80MHz */ ++ uint16 thresh0_160_hi; /* Radar detection, thresh 0 (range 5470-5725MHz) for BW 160MHz */ ++ uint16 thresh1_160_hi; /* Radar detection, thresh 1 (range 5470-5725MHz) for BW 160MHz */ ++} wl_radar_thr_t; ++ ++#define WL_RADAR_THR_VERSION 2 ++#define WL_THRESHOLD_LO_BAND 70 /* range from 5250MHz - 5350MHz */ ++ ++/* radar iovar SET defines */ ++#define WL_RADAR_DETECTOR_OFF 0 /* radar detector off */ ++#define WL_RADAR_DETECTOR_ON 1 /* radar detector on */ ++#define WL_RADAR_SIMULATED 2 /* force radar detector to declare ++ * detection once ++ */ ++#define WL_RSSI_ANT_VERSION 1 /* current version of wl_rssi_ant_t */ ++#define WL_ANT_RX_MAX 2 /* max 2 receive antennas */ ++#define WL_ANT_HT_RX_MAX 3 /* max 3 receive antennas/cores */ ++#define WL_ANT_IDX_1 0 /* antenna index 1 */ ++#define WL_ANT_IDX_2 1 /* antenna index 2 */ ++ ++#ifndef WL_RSSI_ANT_MAX ++#define WL_RSSI_ANT_MAX 4 /* max possible rx antennas */ ++#elif WL_RSSI_ANT_MAX != 4 ++#error "WL_RSSI_ANT_MAX does not match" ++#endif ++ ++/* RSSI per antenna */ ++typedef struct { ++ uint32 version; /* version field */ ++ uint32 count; /* number of valid antenna rssi */ ++ int8 rssi_ant[WL_RSSI_ANT_MAX]; /* rssi per antenna */ ++} wl_rssi_ant_t; ++ ++/* dfs_status iovar-related defines */ ++ ++/* cac - channel availability check, ++ * ism - in-service monitoring ++ * csa - channel switching announcement ++ */ ++ ++/* cac state values */ ++#define WL_DFS_CACSTATE_IDLE 0 /* state for operating in non-radar channel */ ++#define WL_DFS_CACSTATE_PREISM_CAC 1 /* CAC in progress */ ++#define WL_DFS_CACSTATE_ISM 2 /* ISM in progress */ ++#define WL_DFS_CACSTATE_CSA 3 /* csa */ ++#define WL_DFS_CACSTATE_POSTISM_CAC 4 /* ISM CAC */ ++#define WL_DFS_CACSTATE_PREISM_OOC 5 /* PREISM OOC */ ++#define WL_DFS_CACSTATE_POSTISM_OOC 6 /* POSTISM OOC */ ++#define WL_DFS_CACSTATES 7 /* this many states exist */ ++ ++/* data structure used in 'dfs_status' wl interface, which is used to query dfs status */ ++typedef struct { ++ uint state; /* noted by WL_DFS_CACSTATE_XX. */ ++ uint duration; /* time spent in ms in state. */ ++ /* as dfs enters ISM state, it removes the operational channel from quiet channel ++ * list and notes the channel in channel_cleared. set to 0 if no channel is cleared ++ */ ++ chanspec_t chanspec_cleared; ++ /* chanspec cleared used to be a uint, add another to uint16 to maintain size */ ++ uint16 pad; ++} wl_dfs_status_t; ++ ++#define NUM_PWRCTRL_RATES 12 ++ ++typedef struct { ++ uint8 txpwr_band_max[NUM_PWRCTRL_RATES]; /* User set target */ ++ uint8 txpwr_limit[NUM_PWRCTRL_RATES]; /* reg and local power limit */ ++ uint8 txpwr_local_max; /* local max according to the AP */ ++ uint8 txpwr_local_constraint; /* local constraint according to the AP */ ++ uint8 txpwr_chan_reg_max; /* Regulatory max for this channel */ ++ uint8 txpwr_target[2][NUM_PWRCTRL_RATES]; /* Latest target for 2.4 and 5 Ghz */ ++ uint8 txpwr_est_Pout[2]; /* Latest estimate for 2.4 and 5 Ghz */ ++ uint8 txpwr_opo[NUM_PWRCTRL_RATES]; /* On G phy, OFDM power offset */ ++ uint8 txpwr_bphy_cck_max[NUM_PWRCTRL_RATES]; /* Max CCK power for this band (SROM) */ ++ uint8 txpwr_bphy_ofdm_max; /* Max OFDM power for this band (SROM) */ ++ uint8 txpwr_aphy_max[NUM_PWRCTRL_RATES]; /* Max power for A band (SROM) */ ++ int8 txpwr_antgain[2]; /* Ant gain for each band - from SROM */ ++ uint8 txpwr_est_Pout_gofdm; /* Pwr estimate for 2.4 OFDM */ ++} tx_power_legacy_t; ++ ++#define WL_TX_POWER_RATES_LEGACY 45 ++#define WL_TX_POWER_MCS20_FIRST 12 ++#define WL_TX_POWER_MCS20_NUM 16 ++#define WL_TX_POWER_MCS40_FIRST 28 ++#define WL_TX_POWER_MCS40_NUM 17 ++ ++typedef struct { ++ uint32 flags; ++ chanspec_t chanspec; /* txpwr report for this channel */ ++ chanspec_t local_chanspec; /* channel on which we are associated */ ++ uint8 local_max; /* local max according to the AP */ ++ uint8 local_constraint; /* local constraint according to the AP */ ++ int8 antgain[2]; /* Ant gain for each band - from SROM */ ++ uint8 rf_cores; /* count of RF Cores being reported */ ++ uint8 est_Pout[4]; /* Latest tx power out estimate per RF ++ * chain without adjustment ++ */ ++ uint8 est_Pout_cck; /* Latest CCK tx power out estimate */ ++ uint8 user_limit[WL_TX_POWER_RATES_LEGACY]; /* User limit */ ++ uint8 reg_limit[WL_TX_POWER_RATES_LEGACY]; /* Regulatory power limit */ ++ uint8 board_limit[WL_TX_POWER_RATES_LEGACY]; /* Max power board can support (SROM) */ ++ uint8 target[WL_TX_POWER_RATES_LEGACY]; /* Latest target power */ ++} tx_power_legacy2_t; ++ ++/* TX Power index defines */ ++#define WL_NUM_RATES_CCK 4 /* 1, 2, 5.5, 11 Mbps */ ++#define WL_NUM_RATES_OFDM 8 /* 6, 9, 12, 18, 24, 36, 48, 54 Mbps SISO/CDD */ ++#define WL_NUM_RATES_MCS_1STREAM 8 /* MCS 0-7 1-stream rates - SISO/CDD/STBC/MCS */ ++#define WL_NUM_RATES_EXTRA_VHT 2 /* Additional VHT 11AC rates */ ++#define WL_NUM_RATES_VHT 10 ++#define WL_NUM_RATES_MCS32 1 ++ ++#define WLC_NUM_RATES_CCK WL_NUM_RATES_CCK ++#define WLC_NUM_RATES_OFDM WL_NUM_RATES_OFDM ++#define WLC_NUM_RATES_MCS_1_STREAM WL_NUM_RATES_MCS_1STREAM ++#define WLC_NUM_RATES_MCS_2_STREAM WL_NUM_RATES_MCS_1STREAM ++#define WLC_NUM_RATES_MCS32 WL_NUM_RATES_MCS32 ++#define WL_TX_POWER_CCK_NUM WL_NUM_RATES_CCK ++#define WL_TX_POWER_OFDM_NUM WL_NUM_RATES_OFDM ++#define WL_TX_POWER_MCS_1_STREAM_NUM WL_NUM_RATES_MCS_1STREAM ++#define WL_TX_POWER_MCS_2_STREAM_NUM WL_NUM_RATES_MCS_1STREAM ++#define WL_TX_POWER_MCS_32_NUM WL_NUM_RATES_MCS32 ++ ++#define WL_NUM_2x2_ELEMENTS 4 ++#define WL_NUM_3x3_ELEMENTS 6 ++ ++typedef struct txppr { ++ /* start of 20MHz tx power limits */ ++ uint8 b20_1x1dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20_1x1ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM transmission */ ++ uint8 b20_1x1mcs0[WL_NUM_RATES_MCS_1STREAM]; /* SISO MCS 0-7 */ ++ ++ uint8 b20_1x2dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20_1x2cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b20_1x2cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* CDD MCS 0-7 */ ++ uint8 b20_2x2stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b20_2x2sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* MCS 8-15 */ ++ ++ uint8 b20_1x3dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20_1x3cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b20_1x3cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* 1 Nsts to 3 Tx Chain */ ++ uint8 b20_2x3stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b20_2x3sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* 2 Nsts to 3 Tx Chain */ ++ uint8 b20_3x3sdm_mcs16[WL_NUM_RATES_MCS_1STREAM]; /* 3 Nsts to 3 Tx Chain */ ++ ++ uint8 b20_1x1vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1 */ ++ uint8 b20_1x2cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD1 */ ++ uint8 b20_2x2stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC */ ++ uint8 b20_2x2sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2 */ ++ uint8 b20_1x3cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD2 */ ++ uint8 b20_2x3stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC_SPEXP1 */ ++ uint8 b20_2x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2_SPEXP1 */ ++ uint8 b20_3x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS3 */ ++ ++ /* start of 40MHz tx power limits */ ++ uint8 b40_dummy1x1dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b40_1x1ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM transmission */ ++ uint8 b40_1x1mcs0[WL_NUM_RATES_MCS_1STREAM]; /* SISO MCS 0-7 */ ++ ++ uint8 b40_dummy1x2dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b40_1x2cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b40_1x2cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* CDD MCS 0-7 */ ++ uint8 b40_2x2stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b40_2x2sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* MCS 8-15 */ ++ ++ uint8 b40_dummy1x3dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b40_1x3cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b40_1x3cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* 1 Nsts to 3 Tx Chain */ ++ uint8 b40_2x3stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b40_2x3sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* 2 Nsts to 3 Tx Chain */ ++ uint8 b40_3x3sdm_mcs16[WL_NUM_RATES_MCS_1STREAM]; /* 3 Nsts to 3 Tx Chain */ ++ ++ uint8 b40_1x1vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1 */ ++ uint8 b40_1x2cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD1 */ ++ uint8 b40_2x2stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC */ ++ uint8 b40_2x2sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2 */ ++ uint8 b40_1x3cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD2 */ ++ uint8 b40_2x3stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC_SPEXP1 */ ++ uint8 b40_2x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2_SPEXP1 */ ++ uint8 b40_3x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS3 */ ++ ++ /* start of 20in40MHz tx power limits */ ++ uint8 b20in40_1x1dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20in40_1x1ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM transmission */ ++ uint8 b20in40_1x1mcs0[WL_NUM_RATES_MCS_1STREAM]; /* SISO MCS 0-7 */ ++ ++ uint8 b20in40_1x2dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20in40_1x2cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b20in40_1x2cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* CDD MCS 0-7 */ ++ uint8 b20in40_2x2stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b20in40_2x2sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* MCS 8-15 */ ++ ++ uint8 b20in40_1x3dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20in40_1x3cdd_ofdm[WL_NUM_RATES_OFDM]; /* 20 in 40 MHz Legacy OFDM CDD */ ++ uint8 b20in40_1x3cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* 1 Nsts to 3 Tx Chain */ ++ uint8 b20in40_2x3stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b20in40_2x3sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* 2 Nsts to 3 Tx Chain */ ++ uint8 b20in40_3x3sdm_mcs16[WL_NUM_RATES_MCS_1STREAM]; /* 3 Nsts to 3 Tx Chain */ ++ ++ uint8 b20in40_1x1vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1 */ ++ uint8 b20in40_1x2cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD1 */ ++ uint8 b20in40_2x2stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC */ ++ uint8 b20in40_2x2sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2 */ ++ uint8 b20in40_1x3cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD2 */ ++ uint8 b20in40_2x3stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC_SPEXP1 */ ++ uint8 b20in40_2x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2_SPEXP1 */ ++ uint8 b20in40_3x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS3 */ ++ ++ /* start of 80MHz tx power limits */ ++ uint8 b80_dummy1x1dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b80_1x1ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM transmission */ ++ uint8 b80_1x1mcs0[WL_NUM_RATES_MCS_1STREAM]; /* SISO MCS 0-7 */ ++ ++ uint8 b80_dummy1x2dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b80_1x2cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b80_1x2cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* CDD MCS 0-7 */ ++ uint8 b80_2x2stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b80_2x2sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* MCS 8-15 */ ++ ++ uint8 b80_dummy1x3dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b80_1x3cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b80_1x3cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* 1 Nsts to 3 Tx Chain */ ++ uint8 b80_2x3stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b80_2x3sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* 2 Nsts to 3 Tx Chain */ ++ uint8 b80_3x3sdm_mcs16[WL_NUM_RATES_MCS_1STREAM]; /* 3 Nsts to 3 Tx Chain */ ++ ++ uint8 b80_1x1vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1 */ ++ uint8 b80_1x2cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD1 */ ++ uint8 b80_2x2stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC */ ++ uint8 b80_2x2sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2 */ ++ uint8 b80_1x3cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD2 */ ++ uint8 b80_2x3stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC_SPEXP1 */ ++ uint8 b80_2x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2_SPEXP1 */ ++ uint8 b80_3x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS3 */ ++ ++ /* start of 20in80MHz tx power limits */ ++ uint8 b20in80_1x1dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20in80_1x1ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM transmission */ ++ uint8 b20in80_1x1mcs0[WL_NUM_RATES_MCS_1STREAM]; /* SISO MCS 0-7 */ ++ ++ uint8 b20in80_1x2dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20in80_1x2cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b20in80_1x2cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* CDD MCS 0-7 */ ++ uint8 b20in80_2x2stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b20in80_2x2sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* MCS 8-15 */ ++ ++ uint8 b20in80_1x3dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b20in80_1x3cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b20in80_1x3cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* 1 Nsts to 3 Tx Chain */ ++ uint8 b20in80_2x3stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b20in80_2x3sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* 2 Nsts to 3 Tx Chain */ ++ uint8 b20in80_3x3sdm_mcs16[WL_NUM_RATES_MCS_1STREAM]; /* 3 Nsts to 3 Tx Chain */ ++ ++ uint8 b20in80_1x1vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1 */ ++ uint8 b20in80_1x2cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD1 */ ++ uint8 b20in80_2x2stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC */ ++ uint8 b20in80_2x2sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2 */ ++ uint8 b20in80_1x3cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD2 */ ++ uint8 b20in80_2x3stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC_SPEXP1 */ ++ uint8 b20in80_2x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2_SPEXP1 */ ++ uint8 b20in80_3x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS3 */ ++ ++ /* start of 40in80MHz tx power limits */ ++ uint8 b40in80_dummy1x1dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b40in80_1x1ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM transmission */ ++ uint8 b40in80_1x1mcs0[WL_NUM_RATES_MCS_1STREAM]; /* SISO MCS 0-7 */ ++ ++ uint8 b40in80_dummy1x2dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b40in80_1x2cdd_ofdm[WL_NUM_RATES_OFDM]; /* Legacy OFDM CDD transmission */ ++ uint8 b40in80_1x2cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* CDD MCS 0-7 */ ++ uint8 b40in80_2x2stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b40in80_2x2sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* MCS 8-15 */ ++ ++ uint8 b40in80_dummy1x3dsss[WL_NUM_RATES_CCK]; /* Legacy CCK/DSSS */ ++ uint8 b40in80_1x3cdd_ofdm[WL_NUM_RATES_OFDM]; /* MHz Legacy OFDM CDD */ ++ uint8 b40in80_1x3cdd_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* 1 Nsts to 3 Tx Chain */ ++ uint8 b40in80_2x3stbc_mcs0[WL_NUM_RATES_MCS_1STREAM]; /* STBC MCS 0-7 */ ++ uint8 b40in80_2x3sdm_mcs8[WL_NUM_RATES_MCS_1STREAM]; /* 2 Nsts to 3 Tx Chain */ ++ uint8 b40in80_3x3sdm_mcs16[WL_NUM_RATES_MCS_1STREAM]; /* 3 Nsts to 3 Tx Chain */ ++ ++ uint8 b40in80_1x1vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1 */ ++ uint8 b40in80_1x2cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD1 */ ++ uint8 b40in80_2x2stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC */ ++ uint8 b40in80_2x2sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2 */ ++ uint8 b40in80_1x3cdd_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_CDD2 */ ++ uint8 b40in80_2x3stbc_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS1_STBC_SPEXP1 */ ++ uint8 b40in80_2x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS2_SPEXP1 */ ++ uint8 b40in80_3x3sdm_vht[WL_NUM_RATES_EXTRA_VHT]; /* VHT8_9SS3 */ ++ ++ uint8 mcs32; /* C_CHECK - THIS NEEDS TO BE REMOVED THROUGHOUT THE CODE */ ++} txppr_t; ++ ++/* 20MHz */ ++#define WL_TX_POWER_CCK_FIRST OFFSETOF(txppr_t, b20_1x1dsss) ++#define WL_TX_POWER_OFDM20_FIRST OFFSETOF(txppr_t, b20_1x1ofdm) ++#define WL_TX_POWER_MCS20_SISO_FIRST OFFSETOF(txppr_t, b20_1x1mcs0) ++#define WL_TX_POWER_20_S1x1_FIRST OFFSETOF(txppr_t, b20_1x1mcs0) ++ ++#define WL_TX_POWER_CCK_CDD_S1x2_FIRST OFFSETOF(txppr_t, b20_1x2dsss) ++#define WL_TX_POWER_OFDM20_CDD_FIRST OFFSETOF(txppr_t, b20_1x2cdd_ofdm) ++#define WL_TX_POWER_MCS20_CDD_FIRST OFFSETOF(txppr_t, b20_1x2cdd_mcs0) ++#define WL_TX_POWER_20_S1x2_FIRST OFFSETOF(txppr_t, b20_1x2cdd_mcs0) ++#define WL_TX_POWER_MCS20_STBC_FIRST OFFSETOF(txppr_t, b20_2x2stbc_mcs0) ++#define WL_TX_POWER_MCS20_SDM_FIRST OFFSETOF(txppr_t, b20_2x2sdm_mcs8) ++#define WL_TX_POWER_20_S2x2_FIRST OFFSETOF(txppr_t, b20_2x2sdm_mcs8) ++ ++#define WL_TX_POWER_CCK_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20_1x3dsss) ++#define WL_TX_POWER_OFDM20_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20_1x3cdd_ofdm) ++#define WL_TX_POWER_20_S1x3_FIRST OFFSETOF(txppr_t, b20_1x3cdd_mcs0) ++#define WL_TX_POWER_20_STBC_S2x3_FIRST OFFSETOF(txppr_t, b20_2x3stbc_mcs0) ++#define WL_TX_POWER_20_S2x3_FIRST OFFSETOF(txppr_t, b20_2x3sdm_mcs8) ++#define WL_TX_POWER_20_S3x3_FIRST OFFSETOF(txppr_t, b20_3x3sdm_mcs16) ++ ++#define WL_TX_POWER_20_S1X1_VHT OFFSETOF(txppr_t, b20_1x1vht) ++#define WL_TX_POWER_20_S1X2_CDD_VHT OFFSETOF(txppr_t, b20_1x2cdd_vht) ++#define WL_TX_POWER_20_S2X2_STBC_VHT OFFSETOF(txppr_t, b20_2x2stbc_vht) ++#define WL_TX_POWER_20_S2X2_VHT OFFSETOF(txppr_t, b20_2x2sdm_vht) ++#define WL_TX_POWER_20_S1X3_CDD_VHT OFFSETOF(txppr_t, b20_1x3cdd_vht) ++#define WL_TX_POWER_20_S2X3_STBC_VHT OFFSETOF(txppr_t, b20_2x3stbc_vht) ++#define WL_TX_POWER_20_S2X3_VHT OFFSETOF(txppr_t, b20_2x3sdm_vht) ++#define WL_TX_POWER_20_S3X3_VHT OFFSETOF(txppr_t, b20_3x3sdm_vht) ++ ++/* 40MHz */ ++#define WL_TX_POWER_40_DUMMY_CCK_FIRST OFFSETOF(txppr_t, b40_dummy1x1dsss) ++#define WL_TX_POWER_OFDM40_FIRST OFFSETOF(txppr_t, b40_1x1ofdm) ++#define WL_TX_POWER_MCS40_SISO_FIRST OFFSETOF(txppr_t, b40_1x1mcs0) ++#define WL_TX_POWER_40_S1x1_FIRST OFFSETOF(txppr_t, b40_1x1mcs0) ++ ++#define WL_TX_POWER_40_DUMMY_CCK_CDD_S1x2_FIRST OFFSETOF(txppr_t, b40_dummy1x2dsss) ++#define WL_TX_POWER_OFDM40_CDD_FIRST OFFSETOF(txppr_t, b40_1x2cdd_ofdm) ++#define WL_TX_POWER_MCS40_CDD_FIRST OFFSETOF(txppr_t, b40_1x2cdd_mcs0) ++#define WL_TX_POWER_40_S1x2_FIRST OFFSETOF(txppr_t, b40_1x2cdd_mcs0) ++#define WL_TX_POWER_MCS40_STBC_FIRST OFFSETOF(txppr_t, b40_2x2stbc_mcs0) ++#define WL_TX_POWER_MCS40_SDM_FIRST OFFSETOF(txppr_t, b40_2x2sdm_mcs8) ++#define WL_TX_POWER_40_S2x2_FIRST OFFSETOF(txppr_t, b40_2x2sdm_mcs8) ++ ++#define WL_TX_POWER_40_DUMMY_CCK_CDD_S1x3_FIRST OFFSETOF(txppr_t, b40_dummy1x3dsss) ++#define WL_TX_POWER_OFDM40_CDD_S1x3_FIRST OFFSETOF(txppr_t, b40_1x3cdd_ofdm) ++#define WL_TX_POWER_40_S1x3_FIRST OFFSETOF(txppr_t, b40_1x3cdd_mcs0) ++#define WL_TX_POWER_40_STBC_S2x3_FIRST OFFSETOF(txppr_t, b40_2x3stbc_mcs0) ++#define WL_TX_POWER_40_S2x3_FIRST OFFSETOF(txppr_t, b40_2x3sdm_mcs8) ++#define WL_TX_POWER_40_S3x3_FIRST OFFSETOF(txppr_t, b40_3x3sdm_mcs16) ++ ++#define WL_TX_POWER_40_S1X1_VHT OFFSETOF(txppr_t, b40_1x1vht) ++#define WL_TX_POWER_40_S1X2_CDD_VHT OFFSETOF(txppr_t, b40_1x2cdd_vht) ++#define WL_TX_POWER_40_S2X2_STBC_VHT OFFSETOF(txppr_t, b40_2x2stbc_vht) ++#define WL_TX_POWER_40_S2X2_VHT OFFSETOF(txppr_t, b40_2x2sdm_vht) ++#define WL_TX_POWER_40_S1X3_CDD_VHT OFFSETOF(txppr_t, b40_1x3cdd_vht) ++#define WL_TX_POWER_40_S2X3_STBC_VHT OFFSETOF(txppr_t, b40_2x3stbc_vht) ++#define WL_TX_POWER_40_S2X3_VHT OFFSETOF(txppr_t, b40_2x3sdm_vht) ++#define WL_TX_POWER_40_S3X3_VHT OFFSETOF(txppr_t, b40_3x3sdm_vht) ++ ++/* 20 in 40MHz */ ++#define WL_TX_POWER_20UL_CCK_FIRST OFFSETOF(txppr_t, b20in40_1x1dsss) ++#define WL_TX_POWER_20UL_OFDM_FIRST OFFSETOF(txppr_t, b20in40_1x1ofdm) ++#define WL_TX_POWER_20UL_S1x1_FIRST OFFSETOF(txppr_t, b20in40_1x1mcs0) ++ ++#define WL_TX_POWER_CCK_20U_CDD_S1x2_FIRST OFFSETOF(txppr_t, b20in40_1x2dsss) ++#define WL_TX_POWER_20UL_OFDM_CDD_FIRST OFFSETOF(txppr_t, b20in40_1x2cdd_ofdm) ++#define WL_TX_POWER_20UL_S1x2_FIRST OFFSETOF(txppr_t, b20in40_1x2cdd_mcs0) ++#define WL_TX_POWER_20UL_STBC_S2x2_FIRST OFFSETOF(txppr_t, b20in40_2x2stbc_mcs0) ++#define WL_TX_POWER_20UL_S2x2_FIRST OFFSETOF(txppr_t, b20in40_2x2sdm_mcs8) ++ ++#define WL_TX_POWER_CCK_20U_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3dsss) ++#define WL_TX_POWER_20UL_OFDM_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3cdd_ofdm) ++#define WL_TX_POWER_20UL_S1x3_FIRST OFFSETOF(txppr_t, b20in40_1x3cdd_mcs0) ++#define WL_TX_POWER_20UL_STBC_S2x3_FIRST OFFSETOF(txppr_t, b20in40_2x3stbc_mcs0) ++#define WL_TX_POWER_20UL_S2x3_FIRST OFFSETOF(txppr_t, b20in40_2x3sdm_mcs8) ++#define WL_TX_POWER_20UL_S3x3_FIRST OFFSETOF(txppr_t, b20in40_3x3sdm_mcs16) ++ ++#define WL_TX_POWER_20UL_S1X1_VHT OFFSETOF(txppr_t, b20in40_1x1vht) ++#define WL_TX_POWER_20UL_S1X2_CDD_VHT OFFSETOF(txppr_t, b20in40_1x2cdd_vht) ++#define WL_TX_POWER_20UL_S2X2_STBC_VHT OFFSETOF(txppr_t, b20in40_2x2stbc_vht) ++#define WL_TX_POWER_20UL_S2X2_VHT OFFSETOF(txppr_t, b20in40_2x2sdm_vht) ++#define WL_TX_POWER_20UL_S1X3_CDD_VHT OFFSETOF(txppr_t, b20in40_1x3cdd_vht) ++#define WL_TX_POWER_20UL_S2X3_STBC_VHT OFFSETOF(txppr_t, b20in40_2x3stbc_vht) ++#define WL_TX_POWER_20UL_S2X3_VHT OFFSETOF(txppr_t, b20in40_2x3sdm_vht) ++#define WL_TX_POWER_20UL_S3X3_VHT OFFSETOF(txppr_t, b20in40_3x3sdm_vht) ++ ++/* 80MHz */ ++#define WL_TX_POWER_80_DUMMY_CCK_FIRST OFFSETOF(txppr_t, b80_dummy1x1dsss) ++#define WL_TX_POWER_OFDM80_FIRST OFFSETOF(txppr_t, b80_1x1ofdm) ++#define WL_TX_POWER_MCS80_SISO_FIRST OFFSETOF(txppr_t, b80_1x1mcs0) ++#define WL_TX_POWER_80_S1x1_FIRST OFFSETOF(txppr_t, b80_1x1mcs0) ++ ++#define WL_TX_POWER_80_DUMMY_CCK_CDD_S1x2_FIRST OFFSETOF(txppr_t, b80_dummy1x2dsss) ++#define WL_TX_POWER_OFDM80_CDD_FIRST OFFSETOF(txppr_t, b80_1x2cdd_ofdm) ++#define WL_TX_POWER_MCS80_CDD_FIRST OFFSETOF(txppr_t, b80_1x2cdd_mcs0) ++#define WL_TX_POWER_80_S1x2_FIRST OFFSETOF(txppr_t, b80_1x2cdd_mcs0) ++#define WL_TX_POWER_MCS80_STBC_FIRST OFFSETOF(txppr_t, b80_2x2stbc_mcs0) ++#define WL_TX_POWER_MCS80_SDM_FIRST OFFSETOF(txppr_t, b80_2x2sdm_mcs8) ++#define WL_TX_POWER_80_S2x2_FIRST OFFSETOF(txppr_t, b80_2x2sdm_mcs8) ++ ++#define WL_TX_POWER_80_DUMMY_CCK_CDD_S1x3_FIRST OFFSETOF(txppr_t, b80_dummy1x3dsss) ++#define WL_TX_POWER_OFDM80_CDD_S1x3_FIRST OFFSETOF(txppr_t, b80_1x3cdd_ofdm) ++#define WL_TX_POWER_80_S1x3_FIRST OFFSETOF(txppr_t, b80_1x3cdd_mcs0) ++#define WL_TX_POWER_80_STBC_S2x3_FIRST OFFSETOF(txppr_t, b80_2x3stbc_mcs0) ++#define WL_TX_POWER_80_S2x3_FIRST OFFSETOF(txppr_t, b80_2x3sdm_mcs8) ++#define WL_TX_POWER_80_S3x3_FIRST OFFSETOF(txppr_t, b80_3x3sdm_mcs16) ++ ++#define WL_TX_POWER_80_S1X1_VHT OFFSETOF(txppr_t, b80_1x1vht) ++#define WL_TX_POWER_80_S1X2_CDD_VHT OFFSETOF(txppr_t, b80_1x2cdd_vht) ++#define WL_TX_POWER_80_S2X2_STBC_VHT OFFSETOF(txppr_t, b80_2x2stbc_vht) ++#define WL_TX_POWER_80_S2X2_VHT OFFSETOF(txppr_t, b80_2x2sdm_vht) ++#define WL_TX_POWER_80_S1X3_CDD_VHT OFFSETOF(txppr_t, b80_1x3cdd_vht) ++#define WL_TX_POWER_80_S2X3_STBC_VHT OFFSETOF(txppr_t, b80_2x3stbc_vht) ++#define WL_TX_POWER_80_S2X3_VHT OFFSETOF(txppr_t, b80_2x3sdm_vht) ++#define WL_TX_POWER_80_S3X3_VHT OFFSETOF(txppr_t, b80_3x3sdm_vht) ++ ++/* 20 in 80MHz */ ++#define WL_TX_POWER_20UUL_CCK_FIRST OFFSETOF(txppr_t, b20in80_1x1dsss) ++#define WL_TX_POWER_20UUL_OFDM_FIRST OFFSETOF(txppr_t, b20in80_1x1ofdm) ++#define WL_TX_POWER_20UUL_S1x1_FIRST OFFSETOF(txppr_t, b20in80_1x1mcs0) ++ ++#define WL_TX_POWER_CCK_20UU_CDD_S1x2_FIRST OFFSETOF(txppr_t, b20in80_1x2dsss) ++#define WL_TX_POWER_20UUL_OFDM_CDD_FIRST OFFSETOF(txppr_t, b20in80_1x2cdd_ofdm) ++#define WL_TX_POWER_20UUL_S1x2_FIRST OFFSETOF(txppr_t, b20in80_1x2cdd_mcs0) ++#define WL_TX_POWER_20UUL_STBC_S2x2_FIRST OFFSETOF(txppr_t, b20in80_2x2stbc_mcs0) ++#define WL_TX_POWER_20UUL_S2x2_FIRST OFFSETOF(txppr_t, b20in80_2x2sdm_mcs8) ++ ++#define WL_TX_POWER_CCK_20UU_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in80_1x3dsss) ++#define WL_TX_POWER_20UUL_OFDM_CDD_S1x3_FIRST OFFSETOF(txppr_t, b20in80_1x3cdd_ofdm) ++#define WL_TX_POWER_20UUL_S1x3_FIRST OFFSETOF(txppr_t, b20in80_1x3cdd_mcs0) ++#define WL_TX_POWER_20UUL_STBC_S2x3_FIRST OFFSETOF(txppr_t, b20in80_2x3stbc_mcs0) ++#define WL_TX_POWER_20UUL_S2x3_FIRST OFFSETOF(txppr_t, b20in80_2x3sdm_mcs8) ++#define WL_TX_POWER_20UUL_S3x3_FIRST OFFSETOF(txppr_t, b20in80_3x3sdm_mcs16) ++ ++#define WL_TX_POWER_20UUL_S1X1_VHT OFFSETOF(txppr_t, b20in80_1x1vht) ++#define WL_TX_POWER_20UUL_S1X2_CDD_VHT OFFSETOF(txppr_t, b20in80_1x2cdd_vht) ++#define WL_TX_POWER_20UUL_S2X2_STBC_VHT OFFSETOF(txppr_t, b20in80_2x2stbc_vht) ++#define WL_TX_POWER_20UUL_S2X2_VHT OFFSETOF(txppr_t, b20in80_2x2sdm_vht) ++#define WL_TX_POWER_20UUL_S1X3_CDD_VHT OFFSETOF(txppr_t, b20in80_1x3cdd_vht) ++#define WL_TX_POWER_20UUL_S2X3_STBC_VHT OFFSETOF(txppr_t, b20in80_2x3stbc_vht) ++#define WL_TX_POWER_20UUL_S2X3_VHT OFFSETOF(txppr_t, b20in80_2x3sdm_vht) ++#define WL_TX_POWER_20UUL_S3X3_VHT OFFSETOF(txppr_t, b20in80_3x3sdm_vht) ++ ++/* 40 in 80MHz */ ++#define WL_TX_POWER_40UUL_DUMMY_CCK_FIRST OFFSETOF(txppr_t, b40in80_dummy1x1dsss) ++#define WL_TX_POWER_40UUL_OFDM_FIRST OFFSETOF(txppr_t, b40in80_1x1ofdm) ++#define WL_TX_POWER_40UUL_S1x1_FIRST OFFSETOF(txppr_t, b40in80_1x1mcs0) ++ ++#define WL_TX_POWER_CCK_40UU_DUMMY_CDD_S1x2_FIRST OFFSETOF(txppr_t, b40in80_dummy1x2dsss) ++#define WL_TX_POWER_40UUL_OFDM_CDD_FIRST OFFSETOF(txppr_t, b40in80_1x2cdd_ofdm) ++#define WL_TX_POWER_40UUL_S1x2_FIRST OFFSETOF(txppr_t, b40in80_1x2cdd_mcs0) ++#define WL_TX_POWER_40UUL_STBC_S2x2_FIRST OFFSETOF(txppr_t, b40in80_2x2stbc_mcs0) ++#define WL_TX_POWER_40UUL_S2x2_FIRST OFFSETOF(txppr_t, b40in80_2x2sdm_mcs8) ++ ++#define WL_TX_POWER_CCK_40UU_DUMMY_CDD_S1x3_FIRST OFFSETOF(txppr_t, b40in80_dummy1x3dsss) ++#define WL_TX_POWER_40UUL_OFDM_CDD_S1x3_FIRST OFFSETOF(txppr_t, b40in80_1x3cdd_ofdm) ++#define WL_TX_POWER_40UUL_S1x3_FIRST OFFSETOF(txppr_t, b40in80_1x3cdd_mcs0) ++#define WL_TX_POWER_40UUL_STBC_S2x3_FIRST OFFSETOF(txppr_t, b40in80_2x3stbc_mcs0) ++#define WL_TX_POWER_40UUL_S2x3_FIRST OFFSETOF(txppr_t, b40in80_2x3sdm_mcs8) ++#define WL_TX_POWER_40UUL_S3x3_FIRST OFFSETOF(txppr_t, b40in80_3x3sdm_mcs16) ++ ++#define WL_TX_POWER_40UUL_S1X1_VHT OFFSETOF(txppr_t, b40in80_1x1vht) ++#define WL_TX_POWER_40UUL_S1X2_CDD_VHT OFFSETOF(txppr_t, b40in80_1x2cdd_vht) ++#define WL_TX_POWER_40UUL_S2X2_STBC_VHT OFFSETOF(txppr_t, b40in80_2x2stbc_vht) ++#define WL_TX_POWER_40UUL_S2X2_VHT OFFSETOF(txppr_t, b40in80_2x2sdm_vht) ++#define WL_TX_POWER_40UUL_S1X3_CDD_VHT OFFSETOF(txppr_t, b40in80_1x3cdd_vht) ++#define WL_TX_POWER_40UUL_S2X3_STBC_VHT OFFSETOF(txppr_t, b40in80_2x3stbc_vht) ++#define WL_TX_POWER_40UUL_S2X3_VHT OFFSETOF(txppr_t, b40in80_2x3sdm_vht) ++#define WL_TX_POWER_40UUL_S3X3_VHT OFFSETOF(txppr_t, b40in80_3x3sdm_vht) ++ ++#define WL_TX_POWER_MCS_32 OFFSETOF(txppr_t, mcs32) /* C_CHECK remove later */ ++ ++#define WL_TX_POWER_RATES sizeof(struct txppr) ++ ++/* sslpnphy specifics */ ++#define WL_TX_POWER_MCS20_SISO_FIRST_SSN WL_TX_POWER_MCS20_SISO_FIRST ++#define WL_TX_POWER_MCS40_SISO_FIRST_SSN WL_TX_POWER_MCS40_SISO_FIRST ++ ++/* tx_power_t.flags bits */ ++#define WL_TX_POWER_F_ENABLED 1 ++#define WL_TX_POWER_F_HW 2 ++#define WL_TX_POWER_F_MIMO 4 ++#define WL_TX_POWER_F_SISO 8 ++#define WL_TX_POWER_F_HT 0x10 ++ ++typedef struct { ++ uint16 ver; /* version of this struct */ ++ uint16 len; /* length in bytes of this structure */ ++ uint32 flags; ++ chanspec_t chanspec; /* txpwr report for this channel */ ++ chanspec_t local_chanspec; /* channel on which we are associated */ ++ uint8 ppr[WL_TX_POWER_RATES]; /* Latest target power */ ++} wl_txppr_t; ++ ++#define WL_TXPPR_VERSION 0 ++#define WL_TXPPR_LENGTH (sizeof(wl_txppr_t)) ++#define TX_POWER_T_VERSION 43 ++ ++/* Defines used with channel_bandwidth for curpower */ ++#define WL_BW_20MHZ 0 ++#define WL_BW_40MHZ 1 ++#define WL_BW_80MHZ 2 ++ ++/* tx_power_t.flags bits */ ++#ifdef PPR_API ++#define WL_TX_POWER2_F_ENABLED 1 ++#define WL_TX_POWER2_F_HW 2 ++#define WL_TX_POWER2_F_MIMO 4 ++#define WL_TX_POWER2_F_SISO 8 ++#define WL_TX_POWER2_F_HT 0x10 ++#else ++#define WL_TX_POWER_F_ENABLED 1 ++#define WL_TX_POWER_F_HW 2 ++#define WL_TX_POWER_F_MIMO 4 ++#define WL_TX_POWER_F_SISO 8 ++#define WL_TX_POWER_F_HT 0x10 ++#endif ++typedef struct { ++ uint32 flags; ++ chanspec_t chanspec; /* txpwr report for this channel */ ++ chanspec_t local_chanspec; /* channel on which we are associated */ ++ uint8 local_max; /* local max according to the AP */ ++ uint8 local_constraint; /* local constraint according to the AP */ ++ int8 antgain[2]; /* Ant gain for each band - from SROM */ ++ uint8 rf_cores; /* count of RF Cores being reported */ ++ uint8 est_Pout[4]; /* Latest tx power out estimate per RF chain */ ++ uint8 est_Pout_act[4]; /* Latest tx power out estimate per RF chain ++ * without adjustment ++ */ ++ uint8 est_Pout_cck; /* Latest CCK tx power out estimate */ ++ uint8 tx_power_max[4]; /* Maximum target power among all rates */ ++ uint tx_power_max_rate_ind[4]; /* Index of the rate with the max target power */ ++ uint8 user_limit[WL_TX_POWER_RATES]; /* User limit */ ++ int8 board_limit[WL_TX_POWER_RATES]; /* Max power board can support (SROM) */ ++ int8 target[WL_TX_POWER_RATES]; /* Latest target power */ ++ int8 clm_limits[WL_NUMRATES]; /* regulatory limits - 20, 40 or 80MHz */ ++ int8 clm_limits_subchan1[WL_NUMRATES]; /* regulatory limits - 20in40 or 40in80 */ ++ int8 clm_limits_subchan2[WL_NUMRATES]; /* regulatory limits - 20in80MHz */ ++ int8 sar; /* SAR limit for display by wl executable */ ++ int8 channel_bandwidth; /* 20, 40 or 80 MHz bandwidth? */ ++ uint8 version; /* Version of the data format wlu <--> driver */ ++ uint8 display_core; /* Displayed curpower core */ ++#ifdef PPR_API ++} tx_power_new_t; ++#else ++} tx_power_t; ++#endif ++ ++typedef struct tx_inst_power { ++ uint8 txpwr_est_Pout[2]; /* Latest estimate for 2.4 and 5 Ghz */ ++ uint8 txpwr_est_Pout_gofdm; /* Pwr estimate for 2.4 OFDM */ ++} tx_inst_power_t; ++ ++ ++typedef struct { ++ uint32 flags; ++ chanspec_t chanspec; /* txpwr report for this channel */ ++ chanspec_t local_chanspec; /* channel on which we are associated */ ++ uint8 local_max; /* local max according to the AP */ ++ uint8 local_constraint; /* local constraint according to the AP */ ++ int8 antgain[2]; /* Ant gain for each band - from SROM */ ++ uint8 rf_cores; /* count of RF Cores being reported */ ++ uint8 est_Pout[4]; /* Latest tx power out estimate per RF chain */ ++ uint8 est_Pout_act[4]; /* Latest tx power out estimate per RF chain ++ * without adjustment ++ */ ++ uint8 est_Pout_cck; /* Latest CCK tx power out estimate */ ++ uint8 tx_power_max[4]; /* Maximum target power among all rates */ ++ uint tx_power_max_rate_ind[4]; /* Index of the rate with the max target power */ ++ txppr_t user_limit; /* User limit */ ++ txppr_t reg_limit; /* Regulatory power limit */ ++ txppr_t board_limit; /* Max power board can support (SROM) */ ++ txppr_t target; /* Latest target power */ ++} wl_txpwr_t; ++ ++#define WL_NUM_TXCHAIN_MAX 4 ++typedef struct wl_txchain_pwr_offsets { ++ int8 offset[WL_NUM_TXCHAIN_MAX]; /* quarter dBm signed offset for each chain */ ++} wl_txchain_pwr_offsets_t; ++ ++/* 802.11h measurement types */ ++#define WLC_MEASURE_TPC 1 ++#define WLC_MEASURE_CHANNEL_BASIC 2 ++#define WLC_MEASURE_CHANNEL_CCA 3 ++#define WLC_MEASURE_CHANNEL_RPI 4 ++ ++/* regulatory enforcement levels */ ++#define SPECT_MNGMT_OFF 0 /* both 11h and 11d disabled */ ++#define SPECT_MNGMT_LOOSE_11H 1 /* allow non-11h APs in scan lists */ ++#define SPECT_MNGMT_STRICT_11H 2 /* prune out non-11h APs from scan list */ ++#define SPECT_MNGMT_STRICT_11D 3 /* switch to 802.11D mode */ ++/* SPECT_MNGMT_LOOSE_11H_D - same as SPECT_MNGMT_LOOSE with the exception that Country IE ++ * adoption is done regardless of capability spectrum_management ++ */ ++#define SPECT_MNGMT_LOOSE_11H_D 4 /* operation defined above */ ++ ++#define WL_CHAN_VALID_HW (1 << 0) /* valid with current HW */ ++#define WL_CHAN_VALID_SW (1 << 1) /* valid with current country setting */ ++#define WL_CHAN_BAND_5G (1 << 2) /* 5GHz-band channel */ ++#define WL_CHAN_RADAR (1 << 3) /* radar sensitive channel */ ++#define WL_CHAN_INACTIVE (1 << 4) /* temporarily inactive due to radar */ ++#define WL_CHAN_PASSIVE (1 << 5) /* channel is in passive mode */ ++#define WL_CHAN_RESTRICTED (1 << 6) /* restricted use channel */ ++ ++/* BTC mode used by "btc_mode" iovar */ ++#define WL_BTC_DISABLE 0 /* disable BT coexistence */ ++#define WL_BTC_FULLTDM 1 /* full TDM COEX */ ++#define WL_BTC_ENABLE 1 /* full TDM COEX to maintain backward compatiblity */ ++#define WL_BTC_PREMPT 2 /* full TDM COEX with preemption */ ++#define WL_BTC_LITE 3 /* light weight coex for large isolation platform */ ++#define WL_BTC_PARALLEL 4 /* BT and WLAN run in parallel with separate antenna */ ++#define WL_BTC_HYBRID 5 /* hybrid coex, only ack is allowed to transmit in BT slot */ ++#define WL_BTC_DEFAULT 8 /* set the default mode for the device */ ++#define WL_INF_BTC_DISABLE 0 ++#define WL_INF_BTC_ENABLE 1 ++#define WL_INF_BTC_AUTO 3 ++ ++/* BTC wire used by "btc_wire" iovar */ ++#define WL_BTC_DEFWIRE 0 /* use default wire setting */ ++#define WL_BTC_2WIRE 2 /* use 2-wire BTC */ ++#define WL_BTC_3WIRE 3 /* use 3-wire BTC */ ++#define WL_BTC_4WIRE 4 /* use 4-wire BTC */ ++ ++/* BTC flags: BTC configuration that can be set by host */ ++#define WL_BTC_FLAG_PREMPT (1 << 0) ++#define WL_BTC_FLAG_BT_DEF (1 << 1) ++#define WL_BTC_FLAG_ACTIVE_PROT (1 << 2) ++#define WL_BTC_FLAG_SIM_RSP (1 << 3) ++#define WL_BTC_FLAG_PS_PROTECT (1 << 4) ++#define WL_BTC_FLAG_SIM_TX_LP (1 << 5) ++#define WL_BTC_FLAG_ECI (1 << 6) ++#define WL_BTC_FLAG_LIGHT (1 << 7) ++#define WL_BTC_FLAG_PARALLEL (1 << 8) ++ ++/* Message levels */ ++#define WL_ERROR_VAL 0x00000001 ++#define WL_TRACE_VAL 0x00000002 ++#define WL_PRHDRS_VAL 0x00000004 ++#define WL_PRPKT_VAL 0x00000008 ++#define WL_INFORM_VAL 0x00000010 ++#define WL_TMP_VAL 0x00000020 ++#define WL_OID_VAL 0x00000040 ++#define WL_RATE_VAL 0x00000080 ++#define WL_ASSOC_VAL 0x00000100 ++#define WL_PRUSR_VAL 0x00000200 ++#define WL_PS_VAL 0x00000400 ++#define WL_TXPWR_VAL 0x00000800 /* retired in TOT on 6/10/2009 */ ++#define WL_PORT_VAL 0x00001000 ++#define WL_DUAL_VAL 0x00002000 ++#define WL_WSEC_VAL 0x00004000 ++#define WL_WSEC_DUMP_VAL 0x00008000 ++#define WL_LOG_VAL 0x00010000 ++#define WL_NRSSI_VAL 0x00020000 /* retired in TOT on 6/10/2009 */ ++#define WL_LOFT_VAL 0x00040000 /* retired in TOT on 6/10/2009 */ ++#define WL_REGULATORY_VAL 0x00080000 ++#define WL_PHYCAL_VAL 0x00100000 /* retired in TOT on 6/10/2009 */ ++#define WL_RADAR_VAL 0x00200000 /* retired in TOT on 6/10/2009 */ ++#define WL_MPC_VAL 0x00400000 ++#define WL_APSTA_VAL 0x00800000 ++#define WL_DFS_VAL 0x01000000 ++#define WL_BA_VAL 0x02000000 /* retired in TOT on 6/14/2010 */ ++#define WL_ACI_VAL 0x04000000 ++#define WL_MBSS_VAL 0x04000000 ++#define WL_CAC_VAL 0x08000000 ++#define WL_AMSDU_VAL 0x10000000 ++#define WL_AMPDU_VAL 0x20000000 ++#define WL_FFPLD_VAL 0x40000000 ++ ++/* wl_msg_level is full. For new bits take the next one and AND with ++ * wl_msg_level2 in wl_dbg.h ++ */ ++#define WL_DPT_VAL 0x00000001 ++#define WL_SCAN_VAL 0x00000002 ++#define WL_WOWL_VAL 0x00000004 ++#define WL_COEX_VAL 0x00000008 ++#define WL_RTDC_VAL 0x00000010 ++#define WL_PROTO_VAL 0x00000020 ++#define WL_BTA_VAL 0x00000040 ++#define WL_CHANINT_VAL 0x00000080 ++#define WL_THERMAL_VAL 0x00000100 /* retired in TOT on 6/10/2009 */ ++#define WL_P2P_VAL 0x00000200 ++#define WL_ITFR_VAL 0x00000400 ++#define WL_MCHAN_VAL 0x00000800 ++#define WL_TDLS_VAL 0x00001000 ++#define WL_MCNX_VAL 0x00002000 ++#define WL_PROT_VAL 0x00004000 ++#define WL_PSTA_VAL 0x00008000 ++#define WL_TBTT_VAL 0x00010000 ++#define WL_NIC_VAL 0x00020000 ++#define WL_PWRSEL_VAL 0x00040000 ++/* use top-bit for WL_TIME_STAMP_VAL because this is a modifier ++ * rather than a message-type of its own ++ */ ++#define WL_TIMESTAMP_VAL 0x80000000 ++ ++/* max # of leds supported by GPIO (gpio pin# == led index#) */ ++#define WL_LED_NUMGPIO 32 /* gpio 0-31 */ ++ ++/* led per-pin behaviors */ ++#define WL_LED_OFF 0 /* always off */ ++#define WL_LED_ON 1 /* always on */ ++#define WL_LED_ACTIVITY 2 /* activity */ ++#define WL_LED_RADIO 3 /* radio enabled */ ++#define WL_LED_ARADIO 4 /* 5 Ghz radio enabled */ ++#define WL_LED_BRADIO 5 /* 2.4Ghz radio enabled */ ++#define WL_LED_BGMODE 6 /* on if gmode, off if bmode */ ++#define WL_LED_WI1 7 ++#define WL_LED_WI2 8 ++#define WL_LED_WI3 9 ++#define WL_LED_ASSOC 10 /* associated state indicator */ ++#define WL_LED_INACTIVE 11 /* null behavior (clears default behavior) */ ++#define WL_LED_ASSOCACT 12 /* on when associated; blink fast for activity */ ++#define WL_LED_WI4 13 ++#define WL_LED_WI5 14 ++#define WL_LED_BLINKSLOW 15 /* blink slow */ ++#define WL_LED_BLINKMED 16 /* blink med */ ++#define WL_LED_BLINKFAST 17 /* blink fast */ ++#define WL_LED_BLINKCUSTOM 18 /* blink custom */ ++#define WL_LED_BLINKPERIODIC 19 /* blink periodic (custom 1000ms / off 400ms) */ ++#define WL_LED_ASSOC_WITH_SEC 20 /* when connected with security */ ++ /* keep on for 300 sec */ ++#define WL_LED_START_OFF 21 /* off upon boot, could be turned on later */ ++#define WL_LED_NUMBEHAVIOR 22 ++ ++/* led behavior numeric value format */ ++#define WL_LED_BEH_MASK 0x7f /* behavior mask */ ++#define WL_LED_AL_MASK 0x80 /* activelow (polarity) bit */ ++ ++/* maximum channels returned by the get valid channels iovar */ ++#define WL_NUMCHANNELS 64 ++ ++/* max number of chanspecs (used by the iovar to calc. buf space) */ ++#define WL_NUMCHANSPECS 110 ++ ++/* WDS link local endpoint WPA role */ ++#define WL_WDS_WPA_ROLE_AUTH 0 /* authenticator */ ++#define WL_WDS_WPA_ROLE_SUP 1 /* supplicant */ ++#define WL_WDS_WPA_ROLE_AUTO 255 /* auto, based on mac addr value */ ++ ++/* number of bytes needed to define a 128-bit mask for MAC event reporting */ ++#define WL_EVENTING_MASK_LEN 16 ++ ++/* ++ * Join preference iovar value is an array of tuples. Each tuple has a one-byte type, ++ * a one-byte length, and a variable length value. RSSI type tuple must be present ++ * in the array. ++ * ++ * Types are defined in "join preference types" section. ++ * ++ * Length is the value size in octets. It is reserved for WL_JOIN_PREF_WPA type tuple ++ * and must be set to zero. ++ * ++ * Values are defined below. ++ * ++ * 1. RSSI - 2 octets ++ * offset 0: reserved ++ * offset 1: reserved ++ * ++ * 2. WPA - 2 + 12 * n octets (n is # tuples defined below) ++ * offset 0: reserved ++ * offset 1: # of tuples ++ * offset 2: tuple 1 ++ * offset 14: tuple 2 ++ * ... ++ * offset 2 + 12 * (n - 1) octets: tuple n ++ * ++ * struct wpa_cfg_tuple { ++ * uint8 akm[DOT11_OUI_LEN+1]; akm suite ++ * uint8 ucipher[DOT11_OUI_LEN+1]; unicast cipher suite ++ * uint8 mcipher[DOT11_OUI_LEN+1]; multicast cipher suite ++ * }; ++ * ++ * multicast cipher suite can be specified as a specific cipher suite or WL_WPA_ACP_MCS_ANY. ++ * ++ * 3. BAND - 2 octets ++ * offset 0: reserved ++ * offset 1: see "band preference" and "band types" ++ * ++ * 4. BAND RSSI - 2 octets ++ * offset 0: band types ++ * offset 1: +ve RSSI boost balue in dB ++ */ ++ ++/* join preference types */ ++#define WL_JOIN_PREF_RSSI 1 /* by RSSI */ ++#define WL_JOIN_PREF_WPA 2 /* by akm and ciphers */ ++#define WL_JOIN_PREF_BAND 3 /* by 802.11 band */ ++#define WL_JOIN_PREF_RSSI_DELTA 4 /* by 802.11 band only if RSSI delta condition matches */ ++#define WL_JOIN_PREF_TRANS_PREF 5 /* defined by requesting AP */ ++ ++/* band preference */ ++#define WLJP_BAND_ASSOC_PREF 255 /* use what WLC_SET_ASSOC_PREFER ioctl specifies */ ++ ++/* any multicast cipher suite */ ++#define WL_WPA_ACP_MCS_ANY "\x00\x00\x00\x00" ++ ++struct tsinfo_arg { ++ uint8 octets[3]; ++}; ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++#define NFIFO 6 /* # tx/rx fifopairs */ ++ ++#define WL_CNT_T_VERSION 8 /* current version of wl_cnt_t struct */ ++ ++typedef struct { ++ uint16 version; /* see definition of WL_CNT_T_VERSION */ ++ uint16 length; /* length of entire structure */ ++ ++ /* transmit stat counters */ ++ uint32 txframe; /* tx data frames */ ++ uint32 txbyte; /* tx data bytes */ ++ uint32 txretrans; /* tx mac retransmits */ ++ uint32 txerror; /* tx data errors (derived: sum of others) */ ++ uint32 txctl; /* tx management frames */ ++ uint32 txprshort; /* tx short preamble frames */ ++ uint32 txserr; /* tx status errors */ ++ uint32 txnobuf; /* tx out of buffers errors */ ++ uint32 txnoassoc; /* tx discard because we're not associated */ ++ uint32 txrunt; /* tx runt frames */ ++ uint32 txchit; /* tx header cache hit (fastpath) */ ++ uint32 txcmiss; /* tx header cache miss (slowpath) */ ++ ++ /* transmit chip error counters */ ++ uint32 txuflo; /* tx fifo underflows */ ++ uint32 txphyerr; /* tx phy errors (indicated in tx status) */ ++ uint32 txphycrs; ++ ++ /* receive stat counters */ ++ uint32 rxframe; /* rx data frames */ ++ uint32 rxbyte; /* rx data bytes */ ++ uint32 rxerror; /* rx data errors (derived: sum of others) */ ++ uint32 rxctl; /* rx management frames */ ++ uint32 rxnobuf; /* rx out of buffers errors */ ++ uint32 rxnondata; /* rx non data frames in the data channel errors */ ++ uint32 rxbadds; /* rx bad DS errors */ ++ uint32 rxbadcm; /* rx bad control or management frames */ ++ uint32 rxfragerr; /* rx fragmentation errors */ ++ uint32 rxrunt; /* rx runt frames */ ++ uint32 rxgiant; /* rx giant frames */ ++ uint32 rxnoscb; /* rx no scb error */ ++ uint32 rxbadproto; /* rx invalid frames */ ++ uint32 rxbadsrcmac; /* rx frames with Invalid Src Mac */ ++ uint32 rxbadda; /* rx frames tossed for invalid da */ ++ uint32 rxfilter; /* rx frames filtered out */ ++ ++ /* receive chip error counters */ ++ uint32 rxoflo; /* rx fifo overflow errors */ ++ uint32 rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ ++ ++ uint32 d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ ++ uint32 d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ ++ uint32 d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ ++ ++ /* misc counters */ ++ uint32 dmade; /* tx/rx dma descriptor errors */ ++ uint32 dmada; /* tx/rx dma data errors */ ++ uint32 dmape; /* tx/rx dma descriptor protocol errors */ ++ uint32 reset; /* reset count */ ++ uint32 tbtt; /* cnts the TBTT int's */ ++ uint32 txdmawar; ++ uint32 pkt_callback_reg_fail; /* callbacks register failure */ ++ ++ /* MAC counters: 32-bit version of d11.h's macstat_t */ ++ uint32 txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, ++ * Control Management (includes retransmissions) ++ */ ++ uint32 txrtsfrm; /* number of RTS sent out by the MAC */ ++ uint32 txctsfrm; /* number of CTS sent out by the MAC */ ++ uint32 txackfrm; /* number of ACK frames sent out */ ++ uint32 txdnlfrm; /* Not used */ ++ uint32 txbcnfrm; /* beacons transmitted */ ++ uint32 txfunfl[8]; /* per-fifo tx underflows */ ++ uint32 txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS ++ * or BCN) ++ */ ++ uint32 txphyerror; /* Transmit phy error, type of error is reported in tx-status for ++ * driver enqueued frames ++ */ ++ uint32 rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */ ++ uint32 rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */ ++ uint32 rxinvmachdr; /* Either the protocol version != 0 or frame type not ++ * data/control/management ++ */ ++ uint32 rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ ++ uint32 rxbadplcp; /* parity check of the PLCP header failed */ ++ uint32 rxcrsglitch; /* PHY was able to correlate the preamble but not the header */ ++ uint32 rxstrt; /* Number of received frames with a good PLCP ++ * (i.e. passing parity check) ++ */ ++ uint32 rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ ++ uint32 rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ ++ uint32 rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ ++ uint32 rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ ++ uint32 rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ ++ uint32 rxackucast; /* number of ucast ACKS received (good FCS) */ ++ uint32 rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ ++ uint32 rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ ++ uint32 rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ ++ uint32 rxrtsocast; /* number of received RTS not addressed to the MAC */ ++ uint32 rxctsocast; /* number of received CTS not addressed to the MAC */ ++ uint32 rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ ++ uint32 rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ ++ uint32 rxcfrmmcast; /* number of RX Control multicast frames received by the MAC ++ * (unlikely to see these) ++ */ ++ uint32 rxbeaconmbss; /* beacons received from member of BSS */ ++ uint32 rxdfrmucastobss; /* number of unicast frames addressed to the MAC from ++ * other BSS (WDS FRAME) ++ */ ++ uint32 rxbeaconobss; /* beacons received from other BSS */ ++ uint32 rxrsptmout; /* Number of response timeouts for transmitted frames ++ * expecting a response ++ */ ++ uint32 bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ ++ uint32 rxf0ovfl; /* Number of receive fifo 0 overflows */ ++ uint32 rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ ++ uint32 rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ ++ uint32 txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ ++ uint32 pmqovfl; /* Number of PMQ overflows */ ++ uint32 rxcgprqfrm; /* Number of received Probe requests that made it into ++ * the PRQ fifo ++ */ ++ uint32 rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ ++ uint32 txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did ++ * not get ACK ++ */ ++ uint32 txcgprssuc; /* Tx Probe Response Success (ACK was received) */ ++ uint32 prs_timeout; /* Number of probe requests that were dropped from the PRQ ++ * fifo because a probe response could not be sent out within ++ * the time limit defined in M_PRS_MAXTIME ++ */ ++ uint32 rxnack; /* obsolete */ ++ uint32 frmscons; /* obsolete */ ++ uint32 txnack; /* obsolete */ ++ uint32 txglitch_nack; /* obsolete */ ++ uint32 txburst; /* obsolete */ ++ ++ /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ ++ uint32 txfrag; /* dot11TransmittedFragmentCount */ ++ uint32 txmulti; /* dot11MulticastTransmittedFrameCount */ ++ uint32 txfail; /* dot11FailedCount */ ++ uint32 txretry; /* dot11RetryCount */ ++ uint32 txretrie; /* dot11MultipleRetryCount */ ++ uint32 rxdup; /* dot11FrameduplicateCount */ ++ uint32 txrts; /* dot11RTSSuccessCount */ ++ uint32 txnocts; /* dot11RTSFailureCount */ ++ uint32 txnoack; /* dot11ACKFailureCount */ ++ uint32 rxfrag; /* dot11ReceivedFragmentCount */ ++ uint32 rxmulti; /* dot11MulticastReceivedFrameCount */ ++ uint32 rxcrc; /* dot11FCSErrorCount */ ++ uint32 txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ ++ uint32 rxundec; /* dot11WEPUndecryptableCount */ ++ ++ /* WPA2 counters (see rxundec for DecryptFailureCount) */ ++ uint32 tkipmicfaill; /* TKIPLocalMICFailures */ ++ uint32 tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ ++ uint32 tkipreplay; /* TKIPReplays */ ++ uint32 ccmpfmterr; /* CCMPFormatErrors */ ++ uint32 ccmpreplay; /* CCMPReplays */ ++ uint32 ccmpundec; /* CCMPDecryptErrors */ ++ uint32 fourwayfail; /* FourWayHandshakeFailures */ ++ uint32 wepundec; /* dot11WEPUndecryptableCount */ ++ uint32 wepicverr; /* dot11WEPICVErrorCount */ ++ uint32 decsuccess; /* DecryptSuccessCount */ ++ uint32 tkipicverr; /* TKIPICVErrorCount */ ++ uint32 wepexcluded; /* dot11WEPExcludedCount */ ++ ++ uint32 txchanrej; /* Tx frames suppressed due to channel rejection */ ++ uint32 psmwds; /* Count PSM watchdogs */ ++ uint32 phywatchdog; /* Count Phy watchdogs (triggered by ucode) */ ++ ++ /* MBSS counters, AP only */ ++ uint32 prq_entries_handled; /* PRQ entries read in */ ++ uint32 prq_undirected_entries; /* which were bcast bss & ssid */ ++ uint32 prq_bad_entries; /* which could not be translated to info */ ++ uint32 atim_suppress_count; /* TX suppressions on ATIM fifo */ ++ uint32 bcn_template_not_ready; /* Template marked in use on send bcn ... */ ++ uint32 bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */ ++ uint32 late_tbtt_dpc; /* TBTT DPC did not happen in time */ ++ ++ /* per-rate receive stat counters */ ++ uint32 rx1mbps; /* packets rx at 1Mbps */ ++ uint32 rx2mbps; /* packets rx at 2Mbps */ ++ uint32 rx5mbps5; /* packets rx at 5.5Mbps */ ++ uint32 rx6mbps; /* packets rx at 6Mbps */ ++ uint32 rx9mbps; /* packets rx at 9Mbps */ ++ uint32 rx11mbps; /* packets rx at 11Mbps */ ++ uint32 rx12mbps; /* packets rx at 12Mbps */ ++ uint32 rx18mbps; /* packets rx at 18Mbps */ ++ uint32 rx24mbps; /* packets rx at 24Mbps */ ++ uint32 rx36mbps; /* packets rx at 36Mbps */ ++ uint32 rx48mbps; /* packets rx at 48Mbps */ ++ uint32 rx54mbps; /* packets rx at 54Mbps */ ++ uint32 rx108mbps; /* packets rx at 108mbps */ ++ uint32 rx162mbps; /* packets rx at 162mbps */ ++ uint32 rx216mbps; /* packets rx at 216 mbps */ ++ uint32 rx270mbps; /* packets rx at 270 mbps */ ++ uint32 rx324mbps; /* packets rx at 324 mbps */ ++ uint32 rx378mbps; /* packets rx at 378 mbps */ ++ uint32 rx432mbps; /* packets rx at 432 mbps */ ++ uint32 rx486mbps; /* packets rx at 486 mbps */ ++ uint32 rx540mbps; /* packets rx at 540 mbps */ ++ ++ /* pkteng rx frame stats */ ++ uint32 pktengrxducast; /* unicast frames rxed by the pkteng code */ ++ uint32 pktengrxdmcast; /* multicast frames rxed by the pkteng code */ ++ ++ uint32 rfdisable; /* count of radio disables */ ++ uint32 bphy_rxcrsglitch; /* PHY count of bphy glitches */ ++ ++ uint32 txexptime; /* Tx frames suppressed due to timer expiration */ ++ ++ uint32 txmpdu_sgi; /* count for sgi transmit */ ++ uint32 rxmpdu_sgi; /* count for sgi received */ ++ uint32 txmpdu_stbc; /* count for stbc transmit */ ++ uint32 rxmpdu_stbc; /* count for stbc received */ ++ ++ uint32 rxundec_mcst; /* dot11WEPUndecryptableCount */ ++ ++ /* WPA2 counters (see rxundec for DecryptFailureCount) */ ++ uint32 tkipmicfaill_mcst; /* TKIPLocalMICFailures */ ++ uint32 tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */ ++ uint32 tkipreplay_mcst; /* TKIPReplays */ ++ uint32 ccmpfmterr_mcst; /* CCMPFormatErrors */ ++ uint32 ccmpreplay_mcst; /* CCMPReplays */ ++ uint32 ccmpundec_mcst; /* CCMPDecryptErrors */ ++ uint32 fourwayfail_mcst; /* FourWayHandshakeFailures */ ++ uint32 wepundec_mcst; /* dot11WEPUndecryptableCount */ ++ uint32 wepicverr_mcst; /* dot11WEPICVErrorCount */ ++ uint32 decsuccess_mcst; /* DecryptSuccessCount */ ++ uint32 tkipicverr_mcst; /* TKIPICVErrorCount */ ++ uint32 wepexcluded_mcst; /* dot11WEPExcludedCount */ ++ ++ uint32 dma_hang; /* count for dma hang */ ++ uint32 reinit; /* count for reinit */ ++ ++ uint32 pstatxucast; /* count of ucast frames xmitted on all psta assoc */ ++ uint32 pstatxnoassoc; /* count of txnoassoc frames xmitted on all psta assoc */ ++ uint32 pstarxucast; /* count of ucast frames received on all psta assoc */ ++ uint32 pstarxbcmc; /* count of bcmc frames received on all psta */ ++ uint32 pstatxbcmc; /* count of bcmc frames transmitted on all psta */ ++ ++ uint32 cso_passthrough; /* hw cso required but passthrough */ ++} wl_cnt_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++typedef struct { ++ uint16 version; /* see definition of WL_CNT_T_VERSION */ ++ uint16 length; /* length of entire structure */ ++ ++ /* transmit stat counters */ ++ uint32 txframe; /* tx data frames */ ++ uint32 txbyte; /* tx data bytes */ ++ uint32 txretrans; /* tx mac retransmits */ ++ uint32 txerror; /* tx data errors (derived: sum of others) */ ++ uint32 txctl; /* tx management frames */ ++ uint32 txprshort; /* tx short preamble frames */ ++ uint32 txserr; /* tx status errors */ ++ uint32 txnobuf; /* tx out of buffers errors */ ++ uint32 txnoassoc; /* tx discard because we're not associated */ ++ uint32 txrunt; /* tx runt frames */ ++ uint32 txchit; /* tx header cache hit (fastpath) */ ++ uint32 txcmiss; /* tx header cache miss (slowpath) */ ++ ++ /* transmit chip error counters */ ++ uint32 txuflo; /* tx fifo underflows */ ++ uint32 txphyerr; /* tx phy errors (indicated in tx status) */ ++ uint32 txphycrs; ++ ++ /* receive stat counters */ ++ uint32 rxframe; /* rx data frames */ ++ uint32 rxbyte; /* rx data bytes */ ++ uint32 rxerror; /* rx data errors (derived: sum of others) */ ++ uint32 rxctl; /* rx management frames */ ++ uint32 rxnobuf; /* rx out of buffers errors */ ++ uint32 rxnondata; /* rx non data frames in the data channel errors */ ++ uint32 rxbadds; /* rx bad DS errors */ ++ uint32 rxbadcm; /* rx bad control or management frames */ ++ uint32 rxfragerr; /* rx fragmentation errors */ ++ uint32 rxrunt; /* rx runt frames */ ++ uint32 rxgiant; /* rx giant frames */ ++ uint32 rxnoscb; /* rx no scb error */ ++ uint32 rxbadproto; /* rx invalid frames */ ++ uint32 rxbadsrcmac; /* rx frames with Invalid Src Mac */ ++ uint32 rxbadda; /* rx frames tossed for invalid da */ ++ uint32 rxfilter; /* rx frames filtered out */ ++ ++ /* receive chip error counters */ ++ uint32 rxoflo; /* rx fifo overflow errors */ ++ uint32 rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ ++ ++ uint32 d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ ++ uint32 d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ ++ uint32 d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ ++ ++ /* misc counters */ ++ uint32 dmade; /* tx/rx dma descriptor errors */ ++ uint32 dmada; /* tx/rx dma data errors */ ++ uint32 dmape; /* tx/rx dma descriptor protocol errors */ ++ uint32 reset; /* reset count */ ++ uint32 tbtt; /* cnts the TBTT int's */ ++ uint32 txdmawar; ++ uint32 pkt_callback_reg_fail; /* callbacks register failure */ ++ ++ /* MAC counters: 32-bit version of d11.h's macstat_t */ ++ uint32 txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, ++ * Control Management (includes retransmissions) ++ */ ++ uint32 txrtsfrm; /* number of RTS sent out by the MAC */ ++ uint32 txctsfrm; /* number of CTS sent out by the MAC */ ++ uint32 txackfrm; /* number of ACK frames sent out */ ++ uint32 txdnlfrm; /* Not used */ ++ uint32 txbcnfrm; /* beacons transmitted */ ++ uint32 txfunfl[8]; /* per-fifo tx underflows */ ++ uint32 txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS ++ * or BCN) ++ */ ++ uint32 txphyerror; /* Transmit phy error, type of error is reported in tx-status for ++ * driver enqueued frames ++ */ ++ uint32 rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */ ++ uint32 rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */ ++ uint32 rxinvmachdr; /* Either the protocol version != 0 or frame type not ++ * data/control/management ++ */ ++ uint32 rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ ++ uint32 rxbadplcp; /* parity check of the PLCP header failed */ ++ uint32 rxcrsglitch; /* PHY was able to correlate the preamble but not the header */ ++ uint32 rxstrt; /* Number of received frames with a good PLCP ++ * (i.e. passing parity check) ++ */ ++ uint32 rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ ++ uint32 rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ ++ uint32 rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ ++ uint32 rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ ++ uint32 rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ ++ uint32 rxackucast; /* number of ucast ACKS received (good FCS) */ ++ uint32 rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ ++ uint32 rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ ++ uint32 rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ ++ uint32 rxrtsocast; /* number of received RTS not addressed to the MAC */ ++ uint32 rxctsocast; /* number of received CTS not addressed to the MAC */ ++ uint32 rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ ++ uint32 rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ ++ uint32 rxcfrmmcast; /* number of RX Control multicast frames received by the MAC ++ * (unlikely to see these) ++ */ ++ uint32 rxbeaconmbss; /* beacons received from member of BSS */ ++ uint32 rxdfrmucastobss; /* number of unicast frames addressed to the MAC from ++ * other BSS (WDS FRAME) ++ */ ++ uint32 rxbeaconobss; /* beacons received from other BSS */ ++ uint32 rxrsptmout; /* Number of response timeouts for transmitted frames ++ * expecting a response ++ */ ++ uint32 bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ ++ uint32 rxf0ovfl; /* Number of receive fifo 0 overflows */ ++ uint32 rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ ++ uint32 rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ ++ uint32 txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ ++ uint32 pmqovfl; /* Number of PMQ overflows */ ++ uint32 rxcgprqfrm; /* Number of received Probe requests that made it into ++ * the PRQ fifo ++ */ ++ uint32 rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ ++ uint32 txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did ++ * not get ACK ++ */ ++ uint32 txcgprssuc; /* Tx Probe Response Success (ACK was received) */ ++ uint32 prs_timeout; /* Number of probe requests that were dropped from the PRQ ++ * fifo because a probe response could not be sent out within ++ * the time limit defined in M_PRS_MAXTIME ++ */ ++ uint32 rxnack; ++ uint32 frmscons; ++ uint32 txnack; ++ uint32 txglitch_nack; /* obsolete */ ++ uint32 txburst; /* obsolete */ ++ ++ /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ ++ uint32 txfrag; /* dot11TransmittedFragmentCount */ ++ uint32 txmulti; /* dot11MulticastTransmittedFrameCount */ ++ uint32 txfail; /* dot11FailedCount */ ++ uint32 txretry; /* dot11RetryCount */ ++ uint32 txretrie; /* dot11MultipleRetryCount */ ++ uint32 rxdup; /* dot11FrameduplicateCount */ ++ uint32 txrts; /* dot11RTSSuccessCount */ ++ uint32 txnocts; /* dot11RTSFailureCount */ ++ uint32 txnoack; /* dot11ACKFailureCount */ ++ uint32 rxfrag; /* dot11ReceivedFragmentCount */ ++ uint32 rxmulti; /* dot11MulticastReceivedFrameCount */ ++ uint32 rxcrc; /* dot11FCSErrorCount */ ++ uint32 txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ ++ uint32 rxundec; /* dot11WEPUndecryptableCount */ ++ ++ /* WPA2 counters (see rxundec for DecryptFailureCount) */ ++ uint32 tkipmicfaill; /* TKIPLocalMICFailures */ ++ uint32 tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ ++ uint32 tkipreplay; /* TKIPReplays */ ++ uint32 ccmpfmterr; /* CCMPFormatErrors */ ++ uint32 ccmpreplay; /* CCMPReplays */ ++ uint32 ccmpundec; /* CCMPDecryptErrors */ ++ uint32 fourwayfail; /* FourWayHandshakeFailures */ ++ uint32 wepundec; /* dot11WEPUndecryptableCount */ ++ uint32 wepicverr; /* dot11WEPICVErrorCount */ ++ uint32 decsuccess; /* DecryptSuccessCount */ ++ uint32 tkipicverr; /* TKIPICVErrorCount */ ++ uint32 wepexcluded; /* dot11WEPExcludedCount */ ++ ++ uint32 rxundec_mcst; /* dot11WEPUndecryptableCount */ ++ ++ /* WPA2 counters (see rxundec for DecryptFailureCount) */ ++ uint32 tkipmicfaill_mcst; /* TKIPLocalMICFailures */ ++ uint32 tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */ ++ uint32 tkipreplay_mcst; /* TKIPReplays */ ++ uint32 ccmpfmterr_mcst; /* CCMPFormatErrors */ ++ uint32 ccmpreplay_mcst; /* CCMPReplays */ ++ uint32 ccmpundec_mcst; /* CCMPDecryptErrors */ ++ uint32 fourwayfail_mcst; /* FourWayHandshakeFailures */ ++ uint32 wepundec_mcst; /* dot11WEPUndecryptableCount */ ++ uint32 wepicverr_mcst; /* dot11WEPICVErrorCount */ ++ uint32 decsuccess_mcst; /* DecryptSuccessCount */ ++ uint32 tkipicverr_mcst; /* TKIPICVErrorCount */ ++ uint32 wepexcluded_mcst; /* dot11WEPExcludedCount */ ++ ++ uint32 txchanrej; /* Tx frames suppressed due to channel rejection */ ++ uint32 txexptime; /* Tx frames suppressed due to timer expiration */ ++ uint32 psmwds; /* Count PSM watchdogs */ ++ uint32 phywatchdog; /* Count Phy watchdogs (triggered by ucode) */ ++ ++ /* MBSS counters, AP only */ ++ uint32 prq_entries_handled; /* PRQ entries read in */ ++ uint32 prq_undirected_entries; /* which were bcast bss & ssid */ ++ uint32 prq_bad_entries; /* which could not be translated to info */ ++ uint32 atim_suppress_count; /* TX suppressions on ATIM fifo */ ++ uint32 bcn_template_not_ready; /* Template marked in use on send bcn ... */ ++ uint32 bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */ ++ uint32 late_tbtt_dpc; /* TBTT DPC did not happen in time */ ++ ++ /* per-rate receive stat counters */ ++ uint32 rx1mbps; /* packets rx at 1Mbps */ ++ uint32 rx2mbps; /* packets rx at 2Mbps */ ++ uint32 rx5mbps5; /* packets rx at 5.5Mbps */ ++ uint32 rx6mbps; /* packets rx at 6Mbps */ ++ uint32 rx9mbps; /* packets rx at 9Mbps */ ++ uint32 rx11mbps; /* packets rx at 11Mbps */ ++ uint32 rx12mbps; /* packets rx at 12Mbps */ ++ uint32 rx18mbps; /* packets rx at 18Mbps */ ++ uint32 rx24mbps; /* packets rx at 24Mbps */ ++ uint32 rx36mbps; /* packets rx at 36Mbps */ ++ uint32 rx48mbps; /* packets rx at 48Mbps */ ++ uint32 rx54mbps; /* packets rx at 54Mbps */ ++ uint32 rx108mbps; /* packets rx at 108mbps */ ++ uint32 rx162mbps; /* packets rx at 162mbps */ ++ uint32 rx216mbps; /* packets rx at 216 mbps */ ++ uint32 rx270mbps; /* packets rx at 270 mbps */ ++ uint32 rx324mbps; /* packets rx at 324 mbps */ ++ uint32 rx378mbps; /* packets rx at 378 mbps */ ++ uint32 rx432mbps; /* packets rx at 432 mbps */ ++ uint32 rx486mbps; /* packets rx at 486 mbps */ ++ uint32 rx540mbps; /* packets rx at 540 mbps */ ++ ++ /* pkteng rx frame stats */ ++ uint32 pktengrxducast; /* unicast frames rxed by the pkteng code */ ++ uint32 pktengrxdmcast; /* multicast frames rxed by the pkteng code */ ++ ++ uint32 rfdisable; /* count of radio disables */ ++ uint32 bphy_rxcrsglitch; /* PHY count of bphy glitches */ ++ ++ uint32 txmpdu_sgi; /* count for sgi transmit */ ++ uint32 rxmpdu_sgi; /* count for sgi received */ ++ uint32 txmpdu_stbc; /* count for stbc transmit */ ++ uint32 rxmpdu_stbc; /* count for stbc received */ ++} wl_cnt_ver_six_t; ++ ++#define WL_DELTA_STATS_T_VERSION 1 /* current version of wl_delta_stats_t struct */ ++ ++typedef struct { ++ uint16 version; /* see definition of WL_DELTA_STATS_T_VERSION */ ++ uint16 length; /* length of entire structure */ ++ ++ /* transmit stat counters */ ++ uint32 txframe; /* tx data frames */ ++ uint32 txbyte; /* tx data bytes */ ++ uint32 txretrans; /* tx mac retransmits */ ++ uint32 txfail; /* tx failures */ ++ ++ /* receive stat counters */ ++ uint32 rxframe; /* rx data frames */ ++ uint32 rxbyte; /* rx data bytes */ ++ ++ /* per-rate receive stat counters */ ++ uint32 rx1mbps; /* packets rx at 1Mbps */ ++ uint32 rx2mbps; /* packets rx at 2Mbps */ ++ uint32 rx5mbps5; /* packets rx at 5.5Mbps */ ++ uint32 rx6mbps; /* packets rx at 6Mbps */ ++ uint32 rx9mbps; /* packets rx at 9Mbps */ ++ uint32 rx11mbps; /* packets rx at 11Mbps */ ++ uint32 rx12mbps; /* packets rx at 12Mbps */ ++ uint32 rx18mbps; /* packets rx at 18Mbps */ ++ uint32 rx24mbps; /* packets rx at 24Mbps */ ++ uint32 rx36mbps; /* packets rx at 36Mbps */ ++ uint32 rx48mbps; /* packets rx at 48Mbps */ ++ uint32 rx54mbps; /* packets rx at 54Mbps */ ++ uint32 rx108mbps; /* packets rx at 108mbps */ ++ uint32 rx162mbps; /* packets rx at 162mbps */ ++ uint32 rx216mbps; /* packets rx at 216 mbps */ ++ uint32 rx270mbps; /* packets rx at 270 mbps */ ++ uint32 rx324mbps; /* packets rx at 324 mbps */ ++ uint32 rx378mbps; /* packets rx at 378 mbps */ ++ uint32 rx432mbps; /* packets rx at 432 mbps */ ++ uint32 rx486mbps; /* packets rx at 486 mbps */ ++ uint32 rx540mbps; /* packets rx at 540 mbps */ ++} wl_delta_stats_t; ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++#define WL_WME_CNT_VERSION 1 /* current version of wl_wme_cnt_t */ ++ ++typedef struct { ++ uint32 packets; ++ uint32 bytes; ++} wl_traffic_stats_t; ++ ++typedef struct { ++ uint16 version; /* see definition of WL_WME_CNT_VERSION */ ++ uint16 length; /* length of entire structure */ ++ ++ wl_traffic_stats_t tx[AC_COUNT]; /* Packets transmitted */ ++ wl_traffic_stats_t tx_failed[AC_COUNT]; /* Packets dropped or failed to transmit */ ++ wl_traffic_stats_t rx[AC_COUNT]; /* Packets received */ ++ wl_traffic_stats_t rx_failed[AC_COUNT]; /* Packets failed to receive */ ++ ++ wl_traffic_stats_t forward[AC_COUNT]; /* Packets forwarded by AP */ ++ ++ wl_traffic_stats_t tx_expired[AC_COUNT]; /* packets dropped due to lifetime expiry */ ++ ++} wl_wme_cnt_t; ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++struct wl_msglevel2 { ++ uint32 low; ++ uint32 high; ++}; ++ ++typedef struct wl_mkeep_alive_pkt { ++ uint16 version; /* Version for mkeep_alive */ ++ uint16 length; /* length of fixed parameters in the structure */ ++ uint32 period_msec; ++ uint16 len_bytes; ++ uint8 keep_alive_id; /* 0 - 3 for N = 4 */ ++ uint8 data[1]; ++} wl_mkeep_alive_pkt_t; ++ ++#define WL_MKEEP_ALIVE_VERSION 1 ++#define WL_MKEEP_ALIVE_FIXED_LEN OFFSETOF(wl_mkeep_alive_pkt_t, data) ++#define WL_MKEEP_ALIVE_PRECISION 500 ++ ++#ifdef WLBA ++ ++#define WLC_BA_CNT_VERSION 1 /* current version of wlc_ba_cnt_t */ ++ ++/* block ack related stats */ ++typedef struct wlc_ba_cnt { ++ uint16 version; /* WLC_BA_CNT_VERSION */ ++ uint16 length; /* length of entire structure */ ++ ++ /* transmit stat counters */ ++ uint32 txpdu; /* pdus sent */ ++ uint32 txsdu; /* sdus sent */ ++ uint32 txfc; /* tx side flow controlled packets */ ++ uint32 txfci; /* tx side flow control initiated */ ++ uint32 txretrans; /* retransmitted pdus */ ++ uint32 txbatimer; /* ba resend due to timer */ ++ uint32 txdrop; /* dropped packets */ ++ uint32 txaddbareq; /* addba req sent */ ++ uint32 txaddbaresp; /* addba resp sent */ ++ uint32 txdelba; /* delba sent */ ++ uint32 txba; /* ba sent */ ++ uint32 txbar; /* bar sent */ ++ uint32 txpad[4]; /* future */ ++ ++ /* receive side counters */ ++ uint32 rxpdu; /* pdus recd */ ++ uint32 rxqed; /* pdus buffered before sending up */ ++ uint32 rxdup; /* duplicate pdus */ ++ uint32 rxnobuf; /* pdus discarded due to no buf */ ++ uint32 rxaddbareq; /* addba req recd */ ++ uint32 rxaddbaresp; /* addba resp recd */ ++ uint32 rxdelba; /* delba recd */ ++ uint32 rxba; /* ba recd */ ++ uint32 rxbar; /* bar recd */ ++ uint32 rxinvba; /* invalid ba recd */ ++ uint32 rxbaholes; /* ba recd with holes */ ++ uint32 rxunexp; /* unexpected packets */ ++ uint32 rxpad[4]; /* future */ ++} wlc_ba_cnt_t; ++#endif /* WLBA */ ++ ++/* structure for per-tid ampdu control */ ++struct ampdu_tid_control { ++ uint8 tid; /* tid */ ++ uint8 enable; /* enable/disable */ ++}; ++ ++/* structure for identifying ea/tid for sending addba/delba */ ++struct ampdu_ea_tid { ++ struct ether_addr ea; /* Station address */ ++ uint8 tid; /* tid */ ++}; ++/* structure for identifying retry/tid for retry_limit_tid/rr_retry_limit_tid */ ++struct ampdu_retry_tid { ++ uint8 tid; /* tid */ ++ uint8 retry; /* retry value */ ++}; ++ ++/* Different discovery modes for dpt */ ++#define DPT_DISCOVERY_MANUAL 0x01 /* manual discovery mode */ ++#define DPT_DISCOVERY_AUTO 0x02 /* auto discovery mode */ ++#define DPT_DISCOVERY_SCAN 0x04 /* scan-based discovery mode */ ++ ++/* different path selection values */ ++#define DPT_PATHSEL_AUTO 0 /* auto mode for path selection */ ++#define DPT_PATHSEL_DIRECT 1 /* always use direct DPT path */ ++#define DPT_PATHSEL_APPATH 2 /* always use AP path */ ++ ++/* different ops for deny list */ ++#define DPT_DENY_LIST_ADD 1 /* add to dpt deny list */ ++#define DPT_DENY_LIST_REMOVE 2 /* remove from dpt deny list */ ++ ++/* different ops for manual end point */ ++#define DPT_MANUAL_EP_CREATE 1 /* create manual dpt endpoint */ ++#define DPT_MANUAL_EP_MODIFY 2 /* modify manual dpt endpoint */ ++#define DPT_MANUAL_EP_DELETE 3 /* delete manual dpt endpoint */ ++ ++/* structure for dpt iovars */ ++typedef struct dpt_iovar { ++ struct ether_addr ea; /* Station address */ ++ uint8 mode; /* mode: depends on iovar */ ++ uint32 pad; /* future */ ++} dpt_iovar_t; ++ ++/* flags to indicate DPT status */ ++#define DPT_STATUS_ACTIVE 0x01 /* link active (though may be suspended) */ ++#define DPT_STATUS_AES 0x02 /* link secured through AES encryption */ ++#define DPT_STATUS_FAILED 0x04 /* DPT link failed */ ++ ++#define DPT_FNAME_LEN 48 /* Max length of friendly name */ ++ ++typedef struct dpt_status { ++ uint8 status; /* flags to indicate status */ ++ uint8 fnlen; /* length of friendly name */ ++ uchar name[DPT_FNAME_LEN]; /* friendly name */ ++ uint32 rssi; /* RSSI of the link */ ++ sta_info_t sta; /* sta info */ ++} dpt_status_t; ++ ++/* structure for dpt list */ ++typedef struct dpt_list { ++ uint32 num; /* number of entries in struct */ ++ dpt_status_t status[1]; /* per station info */ ++} dpt_list_t; ++ ++/* structure for dpt friendly name */ ++typedef struct dpt_fname { ++ uint8 len; /* length of friendly name */ ++ uchar name[DPT_FNAME_LEN]; /* friendly name */ ++} dpt_fname_t; ++ ++#define BDD_FNAME_LEN 32 /* Max length of friendly name */ ++typedef struct bdd_fname { ++ uint8 len; /* length of friendly name */ ++ uchar name[BDD_FNAME_LEN]; /* friendly name */ ++} bdd_fname_t; ++ ++/* structure for addts arguments */ ++/* For ioctls that take a list of TSPEC */ ++struct tslist { ++ int count; /* number of tspecs */ ++ struct tsinfo_arg tsinfo[1]; /* variable length array of tsinfo */ ++}; ++ ++#ifdef WLTDLS ++/* different ops for manual end point */ ++#define TDLS_MANUAL_EP_CREATE 1 /* create manual dpt endpoint */ ++#define TDLS_MANUAL_EP_MODIFY 2 /* modify manual dpt endpoint */ ++#define TDLS_MANUAL_EP_DELETE 3 /* delete manual dpt endpoint */ ++#define TDLS_MANUAL_EP_PM 4 /* put dpt endpoint in PM mode */ ++#define TDLS_MANUAL_EP_WAKE 5 /* wake up dpt endpoint from PM */ ++#define TDLS_MANUAL_EP_DISCOVERY 6 /* discover if endpoint is TDLS capable */ ++#define TDLS_MANUAL_EP_CHSW 7 /* channel switch */ ++ ++/* structure for tdls iovars */ ++typedef struct tdls_iovar { ++ struct ether_addr ea; /* Station address */ ++ uint8 mode; /* mode: depends on iovar */ ++ chanspec_t chanspec; ++ uint32 pad; /* future */ ++} tdls_iovar_t; ++ ++/* modes */ ++#define TDLS_WFD_IE_TX 0 ++#define TDLS_WFD_IE_RX 1 ++#define TDLS_WFD_IE_SIZE 255 ++/* structure for tdls wfd ie */ ++typedef struct tdls_wfd_ie_iovar { ++ struct ether_addr ea; /* Station address */ ++ uint8 mode; ++ uint8 length; ++ uint8 data[TDLS_WFD_IE_SIZE]; ++} tdls_wfd_ie_iovar_t; ++#endif /* WLTDLS */ ++ ++/* structure for addts/delts arguments */ ++typedef struct tspec_arg { ++ uint16 version; /* see definition of TSPEC_ARG_VERSION */ ++ uint16 length; /* length of entire structure */ ++ uint flag; /* bit field */ ++ /* TSPEC Arguments */ ++ struct tsinfo_arg tsinfo; /* TS Info bit field */ ++ uint16 nom_msdu_size; /* (Nominal or fixed) MSDU Size (bytes) */ ++ uint16 max_msdu_size; /* Maximum MSDU Size (bytes) */ ++ uint min_srv_interval; /* Minimum Service Interval (us) */ ++ uint max_srv_interval; /* Maximum Service Interval (us) */ ++ uint inactivity_interval; /* Inactivity Interval (us) */ ++ uint suspension_interval; /* Suspension Interval (us) */ ++ uint srv_start_time; /* Service Start Time (us) */ ++ uint min_data_rate; /* Minimum Data Rate (bps) */ ++ uint mean_data_rate; /* Mean Data Rate (bps) */ ++ uint peak_data_rate; /* Peak Data Rate (bps) */ ++ uint max_burst_size; /* Maximum Burst Size (bytes) */ ++ uint delay_bound; /* Delay Bound (us) */ ++ uint min_phy_rate; /* Minimum PHY Rate (bps) */ ++ uint16 surplus_bw; /* Surplus Bandwidth Allowance (range 1.0 to 8.0) */ ++ uint16 medium_time; /* Medium Time (32 us/s periods) */ ++ uint8 dialog_token; /* dialog token */ ++} tspec_arg_t; ++ ++/* tspec arg for desired station */ ++typedef struct tspec_per_sta_arg { ++ struct ether_addr ea; ++ struct tspec_arg ts; ++} tspec_per_sta_arg_t; ++ ++/* structure for max bandwidth for each access category */ ++typedef struct wme_max_bandwidth { ++ uint32 ac[AC_COUNT]; /* max bandwidth for each access category */ ++} wme_max_bandwidth_t; ++ ++#define WL_WME_MBW_PARAMS_IO_BYTES (sizeof(wme_max_bandwidth_t)) ++ ++/* current version of wl_tspec_arg_t struct */ ++#define TSPEC_ARG_VERSION 2 /* current version of wl_tspec_arg_t struct */ ++#define TSPEC_ARG_LENGTH 55 /* argument length from tsinfo to medium_time */ ++#define TSPEC_DEFAULT_DIALOG_TOKEN 42 /* default dialog token */ ++#define TSPEC_DEFAULT_SBW_FACTOR 0x3000 /* default surplus bw */ ++ ++ ++#define WL_WOWL_KEEPALIVE_MAX_PACKET_SIZE 80 ++#define WLC_WOWL_MAX_KEEPALIVE 2 ++ ++/* define for flag */ ++#define TSPEC_PENDING 0 /* TSPEC pending */ ++#define TSPEC_ACCEPTED 1 /* TSPEC accepted */ ++#define TSPEC_REJECTED 2 /* TSPEC rejected */ ++#define TSPEC_UNKNOWN 3 /* TSPEC unknown */ ++#define TSPEC_STATUS_MASK 7 /* TSPEC status mask */ ++ ++ ++/* Software feature flag defines used by wlfeatureflag */ ++#ifdef WLAFTERBURNER ++#define WL_SWFL_ABBFL 0x0001 /* Allow Afterburner on systems w/o hardware BFL */ ++#define WL_SWFL_ABENCORE 0x0002 /* Allow AB on non-4318E chips */ ++#endif /* WLAFTERBURNER */ ++#define WL_SWFL_NOHWRADIO 0x0004 ++#define WL_SWFL_FLOWCONTROL 0x0008 /* Enable backpressure to OS stack */ ++#define WL_SWFL_WLBSSSORT 0x0010 /* Per-port supports sorting of BSS */ ++ ++#define WL_LIFETIME_MAX 0xFFFF /* Max value in ms */ ++ ++/* Packet lifetime configuration per ac */ ++typedef struct wl_lifetime { ++ uint32 ac; /* access class */ ++ uint32 lifetime; /* Packet lifetime value in ms */ ++} wl_lifetime_t; ++ ++/* Channel Switch Announcement param */ ++typedef struct wl_chan_switch { ++ uint8 mode; /* value 0 or 1 */ ++ uint8 count; /* count # of beacons before switching */ ++ chanspec_t chspec; /* chanspec */ ++ uint8 reg; /* regulatory class */ ++} wl_chan_switch_t; ++ ++/* Roaming trigger definitions for WLC_SET_ROAM_TRIGGER. ++ * ++ * (-100 < value < 0) value is used directly as a roaming trigger in dBm ++ * (0 <= value) value specifies a logical roaming trigger level from ++ * the list below ++ * ++ * WLC_GET_ROAM_TRIGGER always returns roaming trigger value in dBm, never ++ * the logical roam trigger value. ++ */ ++#define WLC_ROAM_TRIGGER_DEFAULT 0 /* default roaming trigger */ ++#define WLC_ROAM_TRIGGER_BANDWIDTH 1 /* optimize for bandwidth roaming trigger */ ++#define WLC_ROAM_TRIGGER_DISTANCE 2 /* optimize for distance roaming trigger */ ++#define WLC_ROAM_TRIGGER_AUTO 3 /* auto-detect environment */ ++#define WLC_ROAM_TRIGGER_MAX_VALUE 3 /* max. valid value */ ++ ++#define WLC_ROAM_NEVER_ROAM_TRIGGER (-100) /* Avoid Roaming by setting a large value */ ++ ++/* Preferred Network Offload (PNO, formerly PFN) defines */ ++#define WPA_AUTH_PFN_ANY 0xffffffff /* for PFN, match only ssid */ ++ ++enum { ++ PFN_LIST_ORDER, ++ PFN_RSSI ++}; ++ ++enum { ++ DISABLE, ++ ENABLE ++}; ++ ++enum { ++ OFF_ADAPT, ++ SMART_ADAPT, ++ STRICT_ADAPT, ++ SLOW_ADAPT ++}; ++ ++#define SORT_CRITERIA_BIT 0 ++#define AUTO_NET_SWITCH_BIT 1 ++#define ENABLE_BKGRD_SCAN_BIT 2 ++#define IMMEDIATE_SCAN_BIT 3 ++#define AUTO_CONNECT_BIT 4 ++#define ENABLE_BD_SCAN_BIT 5 ++#define ENABLE_ADAPTSCAN_BIT 6 ++#define IMMEDIATE_EVENT_BIT 8 ++#define SUPPRESS_SSID_BIT 9 ++#define ENABLE_NET_OFFLOAD_BIT 10 ++ ++#define SORT_CRITERIA_MASK 0x0001 ++#define AUTO_NET_SWITCH_MASK 0x0002 ++#define ENABLE_BKGRD_SCAN_MASK 0x0004 ++#define IMMEDIATE_SCAN_MASK 0x0008 ++#define AUTO_CONNECT_MASK 0x0010 ++ ++#define ENABLE_BD_SCAN_MASK 0x0020 ++#define ENABLE_ADAPTSCAN_MASK 0x00c0 ++#define IMMEDIATE_EVENT_MASK 0x0100 ++#define SUPPRESS_SSID_MASK 0x0200 ++#define ENABLE_NET_OFFLOAD_MASK 0x0400 ++ ++#define PFN_VERSION 2 ++#define PFN_SCANRESULT_VERSION 1 ++#define MAX_PFN_LIST_COUNT 16 ++ ++#define PFN_COMPLETE 1 ++#define PFN_INCOMPLETE 0 ++ ++#define DEFAULT_BESTN 2 ++#define DEFAULT_MSCAN 0 ++#define DEFAULT_REPEAT 10 ++#define DEFAULT_EXP 2 ++ ++/* PFN network info structure */ ++typedef struct wl_pfn_subnet_info { ++ struct ether_addr BSSID; ++ uint8 channel; /* channel number only */ ++ uint8 SSID_len; ++ uint8 SSID[32]; ++} wl_pfn_subnet_info_t; ++ ++typedef struct wl_pfn_net_info { ++ wl_pfn_subnet_info_t pfnsubnet; ++ int16 RSSI; /* receive signal strength (in dBm) */ ++ uint16 timestamp; /* age in seconds */ ++} wl_pfn_net_info_t; ++ ++typedef struct wl_pfn_scanresults { ++ uint32 version; ++ uint32 status; ++ uint32 count; ++ wl_pfn_net_info_t netinfo[1]; ++} wl_pfn_scanresults_t; ++ ++/* PFN data structure */ ++typedef struct wl_pfn_param { ++ int32 version; /* PNO parameters version */ ++ int32 scan_freq; /* Scan frequency */ ++ int32 lost_network_timeout; /* Timeout in sec. to declare ++ * discovered network as lost ++ */ ++ int16 flags; /* Bit field to control features ++ * of PFN such as sort criteria auto ++ * enable switch and background scan ++ */ ++ int16 rssi_margin; /* Margin to avoid jitter for choosing a ++ * PFN based on RSSI sort criteria ++ */ ++ uint8 bestn; /* number of best networks in each scan */ ++ uint8 mscan; /* number of scans recorded */ ++ uint8 repeat; /* Minimum number of scan intervals ++ *before scan frequency changes in adaptive scan ++ */ ++ uint8 exp; /* Exponent of 2 for maximum scan interval */ ++ int32 slow_freq; /* slow scan period */ ++} wl_pfn_param_t; ++ ++typedef struct wl_pfn_bssid { ++ struct ether_addr macaddr; ++ /* Bit4: suppress_lost, Bit3: suppress_found */ ++ uint16 flags; ++} wl_pfn_bssid_t; ++#define WL_PFN_SUPPRESSFOUND_MASK 0x08 ++#define WL_PFN_SUPPRESSLOST_MASK 0x10 ++ ++typedef struct wl_pfn_cfg { ++ uint32 reporttype; ++ int32 channel_num; ++ uint16 channel_list[WL_NUMCHANNELS]; ++} wl_pfn_cfg_t; ++#define WL_PFN_REPORT_ALLNET 0 ++#define WL_PFN_REPORT_SSIDNET 1 ++#define WL_PFN_REPORT_BSSIDNET 2 ++ ++typedef struct wl_pfn { ++ wlc_ssid_t ssid; /* ssid name and its length */ ++ int32 flags; /* bit2: hidden */ ++ int32 infra; /* BSS Vs IBSS */ ++ int32 auth; /* Open Vs Closed */ ++ int32 wpa_auth; /* WPA type */ ++ int32 wsec; /* wsec value */ ++} wl_pfn_t; ++#define WL_PFN_HIDDEN_BIT 2 ++#define PNO_SCAN_MAX_FW 508*1000 /* max time scan time in msec */ ++#define PNO_SCAN_MAX_FW_SEC PNO_SCAN_MAX_FW/1000 /* max time scan time in SEC */ ++#define PNO_SCAN_MIN_FW_SEC 10 /* min time scan time in SEC */ ++#define WL_PFN_HIDDEN_MASK 0x4 ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* TCP Checksum Offload defines */ ++#define TOE_TX_CSUM_OL 0x00000001 ++#define TOE_RX_CSUM_OL 0x00000002 ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++/* TCP Checksum Offload error injection for testing */ ++#define TOE_ERRTEST_TX_CSUM 0x00000001 ++#define TOE_ERRTEST_RX_CSUM 0x00000002 ++#define TOE_ERRTEST_RX_CSUM2 0x00000004 ++ ++struct toe_ol_stats_t { ++ /* Num of tx packets that don't need to be checksummed */ ++ uint32 tx_summed; ++ ++ /* Num of tx packets where checksum is filled by offload engine */ ++ uint32 tx_iph_fill; ++ uint32 tx_tcp_fill; ++ uint32 tx_udp_fill; ++ uint32 tx_icmp_fill; ++ ++ /* Num of rx packets where toe finds out if checksum is good or bad */ ++ uint32 rx_iph_good; ++ uint32 rx_iph_bad; ++ uint32 rx_tcp_good; ++ uint32 rx_tcp_bad; ++ uint32 rx_udp_good; ++ uint32 rx_udp_bad; ++ uint32 rx_icmp_good; ++ uint32 rx_icmp_bad; ++ ++ /* Num of tx packets in which csum error is injected */ ++ uint32 tx_tcp_errinj; ++ uint32 tx_udp_errinj; ++ uint32 tx_icmp_errinj; ++ ++ /* Num of rx packets in which csum error is injected */ ++ uint32 rx_tcp_errinj; ++ uint32 rx_udp_errinj; ++ uint32 rx_icmp_errinj; ++}; ++ ++/* ARP Offload feature flags for arp_ol iovar */ ++#define ARP_OL_AGENT 0x00000001 ++#define ARP_OL_SNOOP 0x00000002 ++#define ARP_OL_HOST_AUTO_REPLY 0x00000004 ++#define ARP_OL_PEER_AUTO_REPLY 0x00000008 ++ ++/* ARP Offload error injection */ ++#define ARP_ERRTEST_REPLY_PEER 0x1 ++#define ARP_ERRTEST_REPLY_HOST 0x2 ++ ++#define ARP_MULTIHOMING_MAX 8 /* Maximum local host IP addresses */ ++#define ND_MULTIHOMING_MAX 8 /* Maximum local host IP addresses */ ++ ++/* Arp offload statistic counts */ ++struct arp_ol_stats_t { ++ uint32 host_ip_entries; /* Host IP table addresses (more than one if multihomed) */ ++ uint32 host_ip_overflow; /* Host IP table additions skipped due to overflow */ ++ ++ uint32 arp_table_entries; /* ARP table entries */ ++ uint32 arp_table_overflow; /* ARP table additions skipped due to overflow */ ++ ++ uint32 host_request; /* ARP requests from host */ ++ uint32 host_reply; /* ARP replies from host */ ++ uint32 host_service; /* ARP requests from host serviced by ARP Agent */ ++ ++ uint32 peer_request; /* ARP requests received from network */ ++ uint32 peer_request_drop; /* ARP requests from network that were dropped */ ++ uint32 peer_reply; /* ARP replies received from network */ ++ uint32 peer_reply_drop; /* ARP replies from network that were dropped */ ++ uint32 peer_service; /* ARP request from host serviced by ARP Agent */ ++}; ++ ++/* NS offload statistic counts */ ++struct nd_ol_stats_t { ++ uint32 host_ip_entries; /* Host IP table addresses (more than one if multihomed) */ ++ uint32 host_ip_overflow; /* Host IP table additions skipped due to overflow */ ++ uint32 peer_request; /* NS requests received from network */ ++ uint32 peer_request_drop; /* NS requests from network that were dropped */ ++ uint32 peer_reply_drop; /* NA replies from network that were dropped */ ++ uint32 peer_service; /* NS request from host serviced by firmware */ ++}; ++ ++/* ++ * Keep-alive packet offloading. ++ */ ++ ++/* NAT keep-alive packets format: specifies the re-transmission period, the packet ++ * length, and packet contents. ++ */ ++typedef struct wl_keep_alive_pkt { ++ uint32 period_msec; /* Retransmission period (0 to disable packet re-transmits) */ ++ uint16 len_bytes; /* Size of packet to transmit (0 to disable packet re-transmits) */ ++ uint8 data[1]; /* Variable length packet to transmit. Contents should include ++ * entire ethernet packet (enet header, IP header, UDP header, ++ * and UDP payload) in network byte order. ++ */ ++} wl_keep_alive_pkt_t; ++ ++#define WL_KEEP_ALIVE_FIXED_LEN OFFSETOF(wl_keep_alive_pkt_t, data) ++ ++/* ++ * Dongle pattern matching filter. ++ */ ++ ++/* Packet filter types. Currently, only pattern matching is supported. */ ++typedef enum wl_pkt_filter_type { ++ WL_PKT_FILTER_TYPE_PATTERN_MATCH /* Pattern matching filter */ ++} wl_pkt_filter_type_t; ++ ++#define WL_PKT_FILTER_TYPE wl_pkt_filter_type_t ++ ++/* Pattern matching filter. Specifies an offset within received packets to ++ * start matching, the pattern to match, the size of the pattern, and a bitmask ++ * that indicates which bits within the pattern should be matched. ++ */ ++typedef struct wl_pkt_filter_pattern { ++ uint32 offset; /* Offset within received packet to start pattern matching. ++ * Offset '0' is the first byte of the ethernet header. ++ */ ++ uint32 size_bytes; /* Size of the pattern. Bitmask must be the same size. */ ++ uint8 mask_and_pattern[1]; /* Variable length mask and pattern data. mask starts ++ * at offset 0. Pattern immediately follows mask. ++ */ ++} wl_pkt_filter_pattern_t; ++ ++/* IOVAR "pkt_filter_add" parameter. Used to install packet filters. */ ++typedef struct wl_pkt_filter { ++ uint32 id; /* Unique filter id, specified by app. */ ++ uint32 type; /* Filter type (WL_PKT_FILTER_TYPE_xxx). */ ++ uint32 negate_match; /* Negate the result of filter matches */ ++ union { /* Filter definitions */ ++ wl_pkt_filter_pattern_t pattern; /* Pattern matching filter */ ++ } u; ++} wl_pkt_filter_t; ++ ++#define WL_PKT_FILTER_FIXED_LEN OFFSETOF(wl_pkt_filter_t, u) ++#define WL_PKT_FILTER_PATTERN_FIXED_LEN OFFSETOF(wl_pkt_filter_pattern_t, mask_and_pattern) ++ ++/* IOVAR "pkt_filter_enable" parameter. */ ++typedef struct wl_pkt_filter_enable { ++ uint32 id; /* Unique filter id */ ++ uint32 enable; /* Enable/disable bool */ ++} wl_pkt_filter_enable_t; ++ ++/* IOVAR "pkt_filter_list" parameter. Used to retrieve a list of installed filters. */ ++typedef struct wl_pkt_filter_list { ++ uint32 num; /* Number of installed packet filters */ ++ wl_pkt_filter_t filter[1]; /* Variable array of packet filters. */ ++} wl_pkt_filter_list_t; ++ ++#define WL_PKT_FILTER_LIST_FIXED_LEN OFFSETOF(wl_pkt_filter_list_t, filter) ++ ++/* IOVAR "pkt_filter_stats" parameter. Used to retrieve debug statistics. */ ++typedef struct wl_pkt_filter_stats { ++ uint32 num_pkts_matched; /* # filter matches for specified filter id */ ++ uint32 num_pkts_forwarded; /* # packets fwded from dongle to host for all filters */ ++ uint32 num_pkts_discarded; /* # packets discarded by dongle for all filters */ ++} wl_pkt_filter_stats_t; ++ ++/* Sequential Commands ioctl */ ++typedef struct wl_seq_cmd_ioctl { ++ uint32 cmd; /* common ioctl definition */ ++ uint32 len; /* length of user buffer */ ++} wl_seq_cmd_ioctl_t; ++ ++#define WL_SEQ_CMD_ALIGN_BYTES 4 ++ ++/* These are the set of get IOCTLs that should be allowed when using ++ * IOCTL sequence commands. These are issued implicitly by wl.exe each time ++ * it is invoked. We never want to buffer these, or else wl.exe will stop working. ++ */ ++#define WL_SEQ_CMDS_GET_IOCTL_FILTER(cmd) \ ++ (((cmd) == WLC_GET_MAGIC) || \ ++ ((cmd) == WLC_GET_VERSION) || \ ++ ((cmd) == WLC_GET_AP) || \ ++ ((cmd) == WLC_GET_INSTANCE)) ++ ++/* ++ * Packet engine interface ++ */ ++ ++#define WL_PKTENG_PER_TX_START 0x01 ++#define WL_PKTENG_PER_TX_STOP 0x02 ++#define WL_PKTENG_PER_RX_START 0x04 ++#define WL_PKTENG_PER_RX_WITH_ACK_START 0x05 ++#define WL_PKTENG_PER_TX_WITH_ACK_START 0x06 ++#define WL_PKTENG_PER_RX_STOP 0x08 ++#define WL_PKTENG_PER_MASK 0xff ++ ++#define WL_PKTENG_SYNCHRONOUS 0x100 /* synchronous flag */ ++ ++typedef struct wl_pkteng { ++ uint32 flags; ++ uint32 delay; /* Inter-packet delay */ ++ uint32 nframes; /* Number of frames */ ++ uint32 length; /* Packet length */ ++ uint8 seqno; /* Enable/disable sequence no. */ ++ struct ether_addr dest; /* Destination address */ ++ struct ether_addr src; /* Source address */ ++} wl_pkteng_t; ++ ++#define NUM_80211b_RATES 4 ++#define NUM_80211ag_RATES 8 ++#define NUM_80211n_RATES 32 ++#define NUM_80211_RATES (NUM_80211b_RATES+NUM_80211ag_RATES+NUM_80211n_RATES) ++typedef struct wl_pkteng_stats { ++ uint32 lostfrmcnt; /* RX PER test: no of frames lost (skip seqno) */ ++ int32 rssi; /* RSSI */ ++ int32 snr; /* signal to noise ratio */ ++ uint16 rxpktcnt[NUM_80211_RATES+1]; ++} wl_pkteng_stats_t; ++ ++ ++#define WL_WOWL_MAGIC (1 << 0) /* Wakeup on Magic packet */ ++#define WL_WOWL_NET (1 << 1) /* Wakeup on Netpattern */ ++#define WL_WOWL_DIS (1 << 2) /* Wakeup on loss-of-link due to Disassoc/Deauth */ ++#define WL_WOWL_RETR (1 << 3) /* Wakeup on retrograde TSF */ ++#define WL_WOWL_BCN (1 << 4) /* Wakeup on loss of beacon */ ++#define WL_WOWL_TST (1 << 5) /* Wakeup after test */ ++#define WL_WOWL_M1 (1 << 6) /* Wakeup after PTK refresh */ ++#define WL_WOWL_EAPID (1 << 7) /* Wakeup after receipt of EAP-Identity Req */ ++#define WL_WOWL_PME_GPIO (1 << 8) /* Wakeind via PME(0) or GPIO(1) */ ++#define WL_WOWL_NEEDTKIP1 (1 << 9) /* need tkip phase 1 key to be updated by the driver */ ++#define WL_WOWL_GTK_FAILURE (1 << 10) /* enable wakeup if GTK fails */ ++#define WL_WOWL_EXTMAGPAT (1 << 11) /* support extended magic packets */ ++#define WL_WOWL_ARPOFFLOAD (1 << 12) /* support ARP/NS/keepalive offloading */ ++#define WL_WOWL_WPA2 (1 << 13) /* read protocol version for EAPOL frames */ ++#define WL_WOWL_KEYROT (1 << 14) /* If the bit is set, use key rotaton */ ++#define WL_WOWL_BCAST (1 << 15) /* If the bit is set, frm received was bcast frame */ ++ ++#define MAGIC_PKT_MINLEN 102 /* Magic pkt min length is 6 * 0xFF + 16 * ETHER_ADDR_LEN */ ++ ++#define WOWL_PATTEN_TYPE_ARP (1 << 0) /* ARP offload Pattern */ ++#define WOWL_PATTEN_TYPE_NA (1 << 1) /* NA offload Pattern */ ++ ++typedef struct { ++ uint32 masksize; /* Size of the mask in #of bytes */ ++ uint32 offset; /* Offset to start looking for the packet in # of bytes */ ++ uint32 patternoffset; /* Offset of start of pattern in the structure */ ++ uint32 patternsize; /* Size of the pattern itself in #of bytes */ ++ uint32 id; /* id */ ++ uint32 reasonsize; /* Size of the wakeup reason code */ ++ uint32 flags; /* Flags to tell the pattern type and other properties */ ++ /* Mask follows the structure above */ ++ /* Pattern follows the mask is at 'patternoffset' from the start */ ++} wl_wowl_pattern_t; ++ ++typedef struct { ++ uint count; ++ wl_wowl_pattern_t pattern[1]; ++} wl_wowl_pattern_list_t; ++ ++typedef struct { ++ uint8 pci_wakeind; /* Whether PCI PMECSR PMEStatus bit was set */ ++ uint16 ucode_wakeind; /* What wakeup-event indication was set by ucode */ ++} wl_wowl_wakeind_t; ++ ++ ++/* per AC rate control related data structure */ ++typedef struct wl_txrate_class { ++ uint8 init_rate; ++ uint8 min_rate; ++ uint8 max_rate; ++} wl_txrate_class_t; ++ ++ ++ ++/* Overlap BSS Scan parameters default, minimum, maximum */ ++#define WLC_OBSS_SCAN_PASSIVE_DWELL_DEFAULT 20 /* unit TU */ ++#define WLC_OBSS_SCAN_PASSIVE_DWELL_MIN 5 /* unit TU */ ++#define WLC_OBSS_SCAN_PASSIVE_DWELL_MAX 1000 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVE_DWELL_DEFAULT 10 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVE_DWELL_MIN 10 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVE_DWELL_MAX 1000 /* unit TU */ ++#define WLC_OBSS_SCAN_WIDTHSCAN_INTERVAL_DEFAULT 300 /* unit Sec */ ++#define WLC_OBSS_SCAN_WIDTHSCAN_INTERVAL_MIN 10 /* unit Sec */ ++#define WLC_OBSS_SCAN_WIDTHSCAN_INTERVAL_MAX 900 /* unit Sec */ ++#define WLC_OBSS_SCAN_CHANWIDTH_TRANSITION_DLY_DEFAULT 5 ++#define WLC_OBSS_SCAN_CHANWIDTH_TRANSITION_DLY_MIN 5 ++#define WLC_OBSS_SCAN_CHANWIDTH_TRANSITION_DLY_MAX 100 ++#define WLC_OBSS_SCAN_PASSIVE_TOTAL_PER_CHANNEL_DEFAULT 200 /* unit TU */ ++#define WLC_OBSS_SCAN_PASSIVE_TOTAL_PER_CHANNEL_MIN 200 /* unit TU */ ++#define WLC_OBSS_SCAN_PASSIVE_TOTAL_PER_CHANNEL_MAX 10000 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVE_TOTAL_PER_CHANNEL_DEFAULT 20 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVE_TOTAL_PER_CHANNEL_MIN 20 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVE_TOTAL_PER_CHANNEL_MAX 10000 /* unit TU */ ++#define WLC_OBSS_SCAN_ACTIVITY_THRESHOLD_DEFAULT 25 /* unit percent */ ++#define WLC_OBSS_SCAN_ACTIVITY_THRESHOLD_MIN 0 /* unit percent */ ++#define WLC_OBSS_SCAN_ACTIVITY_THRESHOLD_MAX 100 /* unit percent */ ++ ++/* structure for Overlap BSS scan arguments */ ++typedef struct wl_obss_scan_arg { ++ int16 passive_dwell; ++ int16 active_dwell; ++ int16 bss_widthscan_interval; ++ int16 passive_total; ++ int16 active_total; ++ int16 chanwidth_transition_delay; ++ int16 activity_threshold; ++} wl_obss_scan_arg_t; ++ ++#define WL_OBSS_SCAN_PARAM_LEN sizeof(wl_obss_scan_arg_t) ++#define WL_MIN_NUM_OBSS_SCAN_ARG 7 /* minimum number of arguments required for OBSS Scan */ ++ ++#define WL_COEX_INFO_MASK 0x07 ++#define WL_COEX_INFO_REQ 0x01 ++#define WL_COEX_40MHZ_INTOLERANT 0x02 ++#define WL_COEX_WIDTH20 0x04 ++ ++#define WLC_RSSI_INVALID 0 /* invalid RSSI value */ ++ ++#define MAX_RSSI_LEVELS 8 ++ ++/* RSSI event notification configuration. */ ++typedef struct wl_rssi_event { ++ uint32 rate_limit_msec; /* # of events posted to application will be limited to ++ * one per specified period (0 to disable rate limit). ++ */ ++ uint8 num_rssi_levels; /* Number of entries in rssi_levels[] below */ ++ int8 rssi_levels[MAX_RSSI_LEVELS]; /* Variable number of RSSI levels. An event ++ * will be posted each time the RSSI of received ++ * beacons/packets crosses a level. ++ */ ++} wl_rssi_event_t; ++ ++typedef struct wl_action_obss_coex_req { ++ uint8 info; ++ uint8 num; ++ uint8 ch_list[1]; ++} wl_action_obss_coex_req_t; ++ ++ ++/* IOVar parameter block for small MAC address array with type indicator */ ++#define WL_IOV_MAC_PARAM_LEN 4 ++ ++#define WL_IOV_PKTQ_LOG_PRECS 16 ++ ++typedef struct { ++ uint32 num_addrs; ++ char addr_type[WL_IOV_MAC_PARAM_LEN]; ++ struct ether_addr ea[WL_IOV_MAC_PARAM_LEN]; ++} wl_iov_mac_params_t; ++ ++ ++/* Parameter block for PKTQ_LOG statistics */ ++typedef struct { ++ uint32 requested; /* packets requested to be stored */ ++ uint32 stored; /* packets stored */ ++ uint32 saved; /* packets saved, ++ because a lowest priority queue has given away one packet ++ */ ++ uint32 selfsaved; /* packets saved, ++ because an older packet from the same queue has been dropped ++ */ ++ uint32 full_dropped; /* packets dropped, ++ because pktq is full with higher precedence packets ++ */ ++ uint32 dropped; /* packets dropped because pktq per that precedence is full */ ++ uint32 sacrificed; /* packets dropped, ++ in order to save one from a queue of a highest priority ++ */ ++ uint32 busy; /* packets droped because of hardware/transmission error */ ++ uint32 retry; /* packets re-sent because they were not received */ ++ uint32 ps_retry; /* packets retried again prior to moving power save mode */ ++ uint32 retry_drop; /* packets finally dropped after retry limit */ ++ uint32 max_avail; /* the high-water mark of the queue capacity for packets - ++ goes to zero as queue fills ++ */ ++ uint32 max_used; /* the high-water mark of the queue utilisation for packets - ++ increases with use ('inverse' of max_avail) ++ */ ++ uint32 queue_capacity; /* the maximum capacity of the queue */ ++} pktq_log_counters_v01_t; ++ ++#define sacrified sacrificed ++ ++typedef struct { ++ uint8 num_prec[WL_IOV_MAC_PARAM_LEN]; ++ pktq_log_counters_v01_t counters[WL_IOV_MAC_PARAM_LEN][WL_IOV_PKTQ_LOG_PRECS]; ++ char headings[1]; ++} pktq_log_format_v01_t; ++ ++ ++typedef struct { ++ uint32 version; ++ wl_iov_mac_params_t params; ++ union { ++ pktq_log_format_v01_t v01; ++ } pktq_log; ++} wl_iov_pktq_log_t; ++ ++ ++/* **** EXTLOG **** */ ++#define EXTLOG_CUR_VER 0x0100 ++ ++#define MAX_ARGSTR_LEN 18 /* At least big enough for storing ETHER_ADDR_STR_LEN */ ++ ++/* log modules (bitmap) */ ++#define LOG_MODULE_COMMON 0x0001 ++#define LOG_MODULE_ASSOC 0x0002 ++#define LOG_MODULE_EVENT 0x0004 ++#define LOG_MODULE_MAX 3 /* Update when adding module */ ++ ++/* log levels */ ++#define WL_LOG_LEVEL_DISABLE 0 ++#define WL_LOG_LEVEL_ERR 1 ++#define WL_LOG_LEVEL_WARN 2 ++#define WL_LOG_LEVEL_INFO 3 ++#define WL_LOG_LEVEL_MAX WL_LOG_LEVEL_INFO /* Update when adding level */ ++ ++/* flag */ ++#define LOG_FLAG_EVENT 1 ++ ++/* log arg_type */ ++#define LOG_ARGTYPE_NULL 0 ++#define LOG_ARGTYPE_STR 1 /* %s */ ++#define LOG_ARGTYPE_INT 2 /* %d */ ++#define LOG_ARGTYPE_INT_STR 3 /* %d...%s */ ++#define LOG_ARGTYPE_STR_INT 4 /* %s...%d */ ++ ++typedef struct wlc_extlog_cfg { ++ int max_number; ++ uint16 module; /* bitmap */ ++ uint8 level; ++ uint8 flag; ++ uint16 version; ++} wlc_extlog_cfg_t; ++ ++typedef struct log_record { ++ uint32 time; ++ uint16 module; ++ uint16 id; ++ uint8 level; ++ uint8 sub_unit; ++ uint8 seq_num; ++ int32 arg; ++ char str[MAX_ARGSTR_LEN]; ++} log_record_t; ++ ++typedef struct wlc_extlog_req { ++ uint32 from_last; ++ uint32 num; ++} wlc_extlog_req_t; ++ ++typedef struct wlc_extlog_results { ++ uint16 version; ++ uint16 record_len; ++ uint32 num; ++ log_record_t logs[1]; ++} wlc_extlog_results_t; ++ ++typedef struct log_idstr { ++ uint16 id; ++ uint16 flag; ++ uint8 arg_type; ++ const char *fmt_str; ++} log_idstr_t; ++ ++#define FMTSTRF_USER 1 ++ ++/* flat ID definitions ++ * New definitions HAVE TO BE ADDED at the end of the table. Otherwise, it will ++ * affect backward compatibility with pre-existing apps ++ */ ++typedef enum { ++ FMTSTR_DRIVER_UP_ID = 0, ++ FMTSTR_DRIVER_DOWN_ID = 1, ++ FMTSTR_SUSPEND_MAC_FAIL_ID = 2, ++ FMTSTR_NO_PROGRESS_ID = 3, ++ FMTSTR_RFDISABLE_ID = 4, ++ FMTSTR_REG_PRINT_ID = 5, ++ FMTSTR_EXPTIME_ID = 6, ++ FMTSTR_JOIN_START_ID = 7, ++ FMTSTR_JOIN_COMPLETE_ID = 8, ++ FMTSTR_NO_NETWORKS_ID = 9, ++ FMTSTR_SECURITY_MISMATCH_ID = 10, ++ FMTSTR_RATE_MISMATCH_ID = 11, ++ FMTSTR_AP_PRUNED_ID = 12, ++ FMTSTR_KEY_INSERTED_ID = 13, ++ FMTSTR_DEAUTH_ID = 14, ++ FMTSTR_DISASSOC_ID = 15, ++ FMTSTR_LINK_UP_ID = 16, ++ FMTSTR_LINK_DOWN_ID = 17, ++ FMTSTR_RADIO_HW_OFF_ID = 18, ++ FMTSTR_RADIO_HW_ON_ID = 19, ++ FMTSTR_EVENT_DESC_ID = 20, ++ FMTSTR_PNP_SET_POWER_ID = 21, ++ FMTSTR_RADIO_SW_OFF_ID = 22, ++ FMTSTR_RADIO_SW_ON_ID = 23, ++ FMTSTR_PWD_MISMATCH_ID = 24, ++ FMTSTR_FATAL_ERROR_ID = 25, ++ FMTSTR_AUTH_FAIL_ID = 26, ++ FMTSTR_ASSOC_FAIL_ID = 27, ++ FMTSTR_IBSS_FAIL_ID = 28, ++ FMTSTR_EXTAP_FAIL_ID = 29, ++ FMTSTR_MAX_ID ++} log_fmtstr_id_t; ++ ++#ifdef DONGLEOVERLAYS ++typedef struct { ++ uint32 flags_idx; /* lower 8 bits: overlay index; upper 24 bits: flags */ ++ uint32 offset; /* offset into overlay region to write code */ ++ uint32 len; /* overlay code len */ ++ /* overlay code follows this struct */ ++} wl_ioctl_overlay_t; ++ ++#define OVERLAY_IDX_MASK 0x000000ff ++#define OVERLAY_IDX_SHIFT 0 ++#define OVERLAY_FLAGS_MASK 0xffffff00 ++#define OVERLAY_FLAGS_SHIFT 8 ++/* overlay written to device memory immediately after loading the base image */ ++#define OVERLAY_FLAG_POSTLOAD 0x100 ++/* defer overlay download until the device responds w/WLC_E_OVL_DOWNLOAD event */ ++#define OVERLAY_FLAG_DEFER_DL 0x200 ++/* overlay downloaded prior to the host going to sleep */ ++#define OVERLAY_FLAG_PRESLEEP 0x400 ++ ++#define OVERLAY_DOWNLOAD_CHUNKSIZE 1024 ++#endif /* DONGLEOVERLAYS */ ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* no default structure packing */ ++#include ++ ++/* require strict packing */ ++#include ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++ ++/* Structures and constants used for "vndr_ie" IOVar interface */ ++#define VNDR_IE_CMD_LEN 4 /* length of the set command string: ++ * "add", "del" (+ NUL) ++ */ ++ ++/* 802.11 Mgmt Packet flags */ ++#define VNDR_IE_BEACON_FLAG 0x1 ++#define VNDR_IE_PRBRSP_FLAG 0x2 ++#define VNDR_IE_ASSOCRSP_FLAG 0x4 ++#define VNDR_IE_AUTHRSP_FLAG 0x8 ++#define VNDR_IE_PRBREQ_FLAG 0x10 ++#define VNDR_IE_ASSOCREQ_FLAG 0x20 ++#define VNDR_IE_IWAPID_FLAG 0x40 /* vendor IE in IW advertisement protocol ID field */ ++#define VNDR_IE_CUSTOM_FLAG 0x100 /* allow custom IE id */ ++ ++#define VNDR_IE_INFO_HDR_LEN (sizeof(uint32)) ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint32 pktflag; /* bitmask indicating which packet(s) contain this IE */ ++ vndr_ie_t vndr_ie_data; /* vendor IE data */ ++} BWL_POST_PACKED_STRUCT vndr_ie_info_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ int iecount; /* number of entries in the vndr_ie_list[] array */ ++ vndr_ie_info_t vndr_ie_list[1]; /* variable size list of vndr_ie_info_t structs */ ++} BWL_POST_PACKED_STRUCT vndr_ie_buf_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ char cmd[VNDR_IE_CMD_LEN]; /* vndr_ie IOVar set command : "add", "del" + NUL */ ++ vndr_ie_buf_t vndr_ie_buffer; /* buffer containing Vendor IE list information */ ++} BWL_POST_PACKED_STRUCT vndr_ie_setbuf_t; ++ ++/* tag_ID/length/value_buffer tuple */ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint8 id; ++ uint8 len; ++ uint8 data[1]; ++} BWL_POST_PACKED_STRUCT tlv_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint32 pktflag; /* bitmask indicating which packet(s) contain this IE */ ++ tlv_t ie_data; /* IE data */ ++} BWL_POST_PACKED_STRUCT ie_info_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ int iecount; /* number of entries in the ie_list[] array */ ++ ie_info_t ie_list[1]; /* variable size list of ie_info_t structs */ ++} BWL_POST_PACKED_STRUCT ie_buf_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ char cmd[VNDR_IE_CMD_LEN]; /* ie IOVar set command : "add" + NUL */ ++ ie_buf_t ie_buffer; /* buffer containing IE list information */ ++} BWL_POST_PACKED_STRUCT ie_setbuf_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct { ++ uint32 pktflag; /* bitmask indicating which packet(s) contain this IE */ ++ uint8 id; /* IE type */ ++} BWL_POST_PACKED_STRUCT ie_getbuf_t; ++ ++/* structures used to define format of wps ie data from probe requests */ ++/* passed up to applications via iovar "prbreq_wpsie" */ ++typedef BWL_PRE_PACKED_STRUCT struct sta_prbreq_wps_ie_hdr { ++ struct ether_addr staAddr; ++ uint16 ieLen; ++} BWL_POST_PACKED_STRUCT sta_prbreq_wps_ie_hdr_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct sta_prbreq_wps_ie_data { ++ sta_prbreq_wps_ie_hdr_t hdr; ++ uint8 ieData[1]; ++} BWL_POST_PACKED_STRUCT sta_prbreq_wps_ie_data_t; ++ ++typedef BWL_PRE_PACKED_STRUCT struct sta_prbreq_wps_ie_list { ++ uint32 totLen; ++ uint8 ieDataList[1]; ++} BWL_POST_PACKED_STRUCT sta_prbreq_wps_ie_list_t; ++ ++ ++#ifdef WLMEDIA_TXFAILEVENT ++typedef BWL_PRE_PACKED_STRUCT struct { ++ char dest[ETHER_ADDR_LEN]; /* destination MAC */ ++ uint8 prio; /* Packet Priority */ ++ uint8 flags; /* Flags */ ++ uint32 tsf_l; /* TSF timer low */ ++ uint32 tsf_h; /* TSF timer high */ ++ uint16 rates; /* Main Rates */ ++ uint16 txstatus; /* TX Status */ ++} BWL_POST_PACKED_STRUCT txfailinfo_t; ++#endif /* WLMEDIA_TXFAILEVENT */ ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++ ++/* no strict structure packing */ ++#include ++ ++#ifdef BCMWAPI_WAI ++#define IV_LEN 16 /* XXX, same as SMS4_WPI_PN_LEN */ ++struct wapi_sta_msg_t ++{ ++ uint16 msg_type; ++ uint16 datalen; ++ uint8 vap_mac[6]; ++ uint8 reserve_data1[2]; ++ uint8 sta_mac[6]; ++ uint8 reserve_data2[2]; ++ uint8 gsn[IV_LEN]; ++ uint8 wie[256]; ++}; ++#endif /* BCMWAPI_WAI */ ++ ++#ifndef LINUX_POSTMOGRIFY_REMOVAL ++/* Global ASSERT Logging */ ++#define ASSERTLOG_CUR_VER 0x0100 ++#define MAX_ASSRTSTR_LEN 64 ++ ++typedef struct assert_record { ++ uint32 time; ++ uint8 seq_num; ++ char str[MAX_ASSRTSTR_LEN]; ++} assert_record_t; ++ ++typedef struct assertlog_results { ++ uint16 version; ++ uint16 record_len; ++ uint32 num; ++ assert_record_t logs[1]; ++} assertlog_results_t; ++ ++#define LOGRRC_FIX_LEN 8 ++#define IOBUF_ALLOWED_NUM_OF_LOGREC(type, len) ((len - LOGRRC_FIX_LEN)/sizeof(type)) ++ ++ ++/* channel interference measurement (chanim) related defines */ ++ ++/* chanim mode */ ++#define CHANIM_DISABLE 0 /* disabled */ ++#define CHANIM_DETECT 1 /* detection only */ ++#define CHANIM_EXT 2 /* external state machine */ ++#define CHANIM_ACT 3 /* full internal state machine, detect + act */ ++#define CHANIM_MODE_MAX 4 ++ ++/* define for apcs reason code */ ++#define APCS_INIT 0 ++#define APCS_IOCTL 1 ++#define APCS_CHANIM 2 ++#define APCS_CSTIMER 3 ++#define APCS_BTA 4 ++ ++/* number of ACS record entries */ ++#define CHANIM_ACS_RECORD 10 ++ ++/* CHANIM */ ++#define CCASTATS_TXDUR 0 ++#define CCASTATS_INBSS 1 ++#define CCASTATS_OBSS 2 ++#define CCASTATS_NOCTG 3 ++#define CCASTATS_NOPKT 4 ++#define CCASTATS_DOZE 5 ++#define CCASTATS_TXOP 6 ++#define CCASTATS_GDTXDUR 7 ++#define CCASTATS_BDTXDUR 8 ++#define CCASTATS_MAX 9 ++ ++/* chanim acs record */ ++typedef struct { ++ bool valid; ++ uint8 trigger; ++ chanspec_t selected_chspc; ++ int8 bgnoise; ++ uint32 glitch_cnt; ++ uint8 ccastats; ++ uint timestamp; ++} chanim_acs_record_t; ++ ++typedef struct { ++ chanim_acs_record_t acs_record[CHANIM_ACS_RECORD]; ++ uint8 count; ++ uint timestamp; ++} wl_acs_record_t; ++ ++typedef struct chanim_stats { ++ uint32 glitchcnt; /* normalized as per second count */ ++ uint32 badplcp; /* normalized as per second count */ ++ uint8 ccastats[CCASTATS_MAX]; /* normalized as 0-255 */ ++ int8 bgnoise; /* background noise level (in dBm) */ ++ chanspec_t chanspec; ++ uint32 timestamp; ++} chanim_stats_t; ++ ++#define WL_CHANIM_STATS_VERSION 1 ++#define WL_CHANIM_COUNT_ALL 0xff ++#define WL_CHANIM_COUNT_ONE 0x1 ++ ++typedef struct { ++ uint32 buflen; ++ uint32 version; ++ uint32 count; ++ chanim_stats_t stats[1]; ++} wl_chanim_stats_t; ++ ++#define WL_CHANIM_STATS_FIXED_LEN OFFSETOF(wl_chanim_stats_t, stats) ++ ++/* Noise measurement metrics. */ ++#define NOISE_MEASURE_KNOISE 0x1 ++ ++/* scb probe parameter */ ++typedef struct { ++ uint32 scb_timeout; ++ uint32 scb_activity_time; ++ uint32 scb_max_probe; ++} wl_scb_probe_t; ++ ++/* ap tpc modes */ ++#define AP_TPC_OFF 0 ++#define AP_TPC_BSS_PWR 1 /* BSS power control */ ++#define AP_TPC_AP_PWR 2 /* AP power control */ ++#define AP_TPC_AP_BSS_PWR 3 /* Both AP and BSS power control */ ++#define AP_TPC_MAX_LINK_MARGIN 127 ++ ++/* ap tpc modes */ ++#define AP_TPC_OFF 0 ++#define AP_TPC_BSS_PWR 1 /* BSS power control */ ++#define AP_TPC_AP_PWR 2 /* AP power control */ ++#define AP_TPC_AP_BSS_PWR 3 /* Both AP and BSS power control */ ++#define AP_TPC_MAX_LINK_MARGIN 127 ++ ++/* structure/defines for selective mgmt frame (smf) stats support */ ++ ++#define SMFS_VERSION 1 ++/* selected mgmt frame (smf) stats element */ ++typedef struct wl_smfs_elem { ++ uint32 count; ++ uint16 code; /* SC or RC code */ ++} wl_smfs_elem_t; ++ ++typedef struct wl_smf_stats { ++ uint32 version; ++ uint16 length; /* reserved for future usage */ ++ uint8 type; ++ uint8 codetype; ++ uint32 ignored_cnt; ++ uint32 malformed_cnt; ++ uint32 count_total; /* count included the interested group */ ++ wl_smfs_elem_t elem[1]; ++} wl_smf_stats_t; ++ ++#define WL_SMFSTATS_FIXED_LEN OFFSETOF(wl_smf_stats_t, elem); ++ ++enum { ++ SMFS_CODETYPE_SC, ++ SMFS_CODETYPE_RC ++}; ++ ++/* reuse two number in the sc/rc space */ ++#define SMFS_CODE_MALFORMED 0xFFFE ++#define SMFS_CODE_IGNORED 0xFFFD ++ ++typedef enum smfs_type { ++ SMFS_TYPE_AUTH, ++ SMFS_TYPE_ASSOC, ++ SMFS_TYPE_REASSOC, ++ SMFS_TYPE_DISASSOC_TX, ++ SMFS_TYPE_DISASSOC_RX, ++ SMFS_TYPE_DEAUTH_TX, ++ SMFS_TYPE_DEAUTH_RX, ++ SMFS_TYPE_MAX ++} smfs_type_t; ++ ++#ifdef PHYMON ++ ++#define PHYMON_VERSION 1 ++ ++typedef struct wl_phycal_core_state { ++ /* Tx IQ/LO calibration coeffs */ ++ int16 tx_iqlocal_a; ++ int16 tx_iqlocal_b; ++ int8 tx_iqlocal_ci; ++ int8 tx_iqlocal_cq; ++ int8 tx_iqlocal_di; ++ int8 tx_iqlocal_dq; ++ int8 tx_iqlocal_ei; ++ int8 tx_iqlocal_eq; ++ int8 tx_iqlocal_fi; ++ int8 tx_iqlocal_fq; ++ ++ /* Rx IQ calibration coeffs */ ++ int16 rx_iqcal_a; ++ int16 rx_iqcal_b; ++ ++ uint8 tx_iqlocal_pwridx; /* Tx Power Index for Tx IQ/LO calibration */ ++ uint32 papd_epsilon_table[64]; /* PAPD epsilon table */ ++ int16 papd_epsilon_offset; /* PAPD epsilon offset */ ++ uint8 curr_tx_pwrindex; /* Tx power index */ ++ int8 idle_tssi; /* Idle TSSI */ ++ int8 est_tx_pwr; /* Estimated Tx Power (dB) */ ++ int8 est_rx_pwr; /* Estimated Rx Power (dB) from RSSI */ ++ uint16 rx_gaininfo; /* Rx gain applied on last Rx pkt */ ++ uint16 init_gaincode; /* initgain required for ACI */ ++ int8 estirr_tx; ++ int8 estirr_rx; ++ ++} wl_phycal_core_state_t; ++ ++typedef struct wl_phycal_state { ++ int version; ++ int8 num_phy_cores; /* number of cores */ ++ int8 curr_temperature; /* on-chip temperature sensor reading */ ++ chanspec_t chspec; /* channspec for this state */ ++ bool aci_state; /* ACI state: ON/OFF */ ++ uint16 crsminpower; /* crsminpower required for ACI */ ++ uint16 crsminpowerl; /* crsminpowerl required for ACI */ ++ uint16 crsminpoweru; /* crsminpoweru required for ACI */ ++ wl_phycal_core_state_t phycal_core[1]; ++} wl_phycal_state_t; ++ ++#define WL_PHYCAL_STAT_FIXED_LEN OFFSETOF(wl_phycal_state_t, phycal_core) ++#endif /* PHYMON */ ++ ++/* discovery state */ ++typedef struct wl_p2p_disc_st { ++ uint8 state; /* see state */ ++ chanspec_t chspec; /* valid in listen state */ ++ uint16 dwell; /* valid in listen state, in ms */ ++} wl_p2p_disc_st_t; ++ ++/* state */ ++#define WL_P2P_DISC_ST_SCAN 0 ++#define WL_P2P_DISC_ST_LISTEN 1 ++#define WL_P2P_DISC_ST_SEARCH 2 ++ ++/* scan request */ ++typedef struct wl_p2p_scan { ++ uint8 type; /* 'S' for WLC_SCAN, 'E' for "escan" */ ++ uint8 reserved[3]; ++ /* scan or escan parms... */ ++} wl_p2p_scan_t; ++ ++/* i/f request */ ++typedef struct wl_p2p_if { ++ struct ether_addr addr; ++ uint8 type; /* see i/f type */ ++ chanspec_t chspec; /* for p2p_ifadd GO */ ++} wl_p2p_if_t; ++ ++/* i/f type */ ++#define WL_P2P_IF_CLIENT 0 ++#define WL_P2P_IF_GO 1 ++#define WL_P2P_IF_DYNBCN_GO 2 ++#define WL_P2P_IF_DEV 3 ++ ++/* i/f query */ ++typedef struct wl_p2p_ifq { ++ uint bsscfgidx; ++ char ifname[BCM_MSG_IFNAME_MAX]; ++} wl_p2p_ifq_t; ++ ++/* OppPS & CTWindow */ ++typedef struct wl_p2p_ops { ++ uint8 ops; /* 0: disable 1: enable */ ++ uint8 ctw; /* >= 10 */ ++} wl_p2p_ops_t; ++ ++/* absence and presence request */ ++typedef struct wl_p2p_sched_desc { ++ uint32 start; ++ uint32 interval; ++ uint32 duration; ++ uint32 count; /* see count */ ++} wl_p2p_sched_desc_t; ++ ++/* count */ ++#define WL_P2P_SCHED_RSVD 0 ++#define WL_P2P_SCHED_REPEAT 255 /* anything > 255 will be treated as 255 */ ++ ++typedef struct wl_p2p_sched { ++ uint8 type; /* see schedule type */ ++ uint8 action; /* see schedule action */ ++ uint8 option; /* see schedule option */ ++ wl_p2p_sched_desc_t desc[1]; ++} wl_p2p_sched_t; ++#define WL_P2P_SCHED_FIXED_LEN 3 ++ ++/* schedule type */ ++#define WL_P2P_SCHED_TYPE_ABS 0 /* Scheduled Absence */ ++#define WL_P2P_SCHED_TYPE_REQ_ABS 1 /* Requested Absence */ ++ ++/* schedule action during absence periods (for WL_P2P_SCHED_ABS type) */ ++#define WL_P2P_SCHED_ACTION_NONE 0 /* no action */ ++#define WL_P2P_SCHED_ACTION_DOZE 1 /* doze */ ++/* schedule option - WL_P2P_SCHED_TYPE_REQ_ABS */ ++#define WL_P2P_SCHED_ACTION_GOOFF 2 /* turn off GO beacon/prbrsp functions */ ++/* schedule option - WL_P2P_SCHED_TYPE_XXX */ ++#define WL_P2P_SCHED_ACTION_RESET 255 /* reset */ ++ ++/* schedule option - WL_P2P_SCHED_TYPE_ABS */ ++#define WL_P2P_SCHED_OPTION_NORMAL 0 /* normal start/interval/duration/count */ ++#define WL_P2P_SCHED_OPTION_BCNPCT 1 /* percentage of beacon interval */ ++/* schedule option - WL_P2P_SCHED_TYPE_REQ_ABS */ ++#define WL_P2P_SCHED_OPTION_TSFOFS 2 /* normal start/internal/duration/count with ++ * start being an offset of the 'current' TSF ++ */ ++ ++/* feature flags */ ++#define WL_P2P_FEAT_GO_CSA (1 << 0) /* GO moves with the STA using CSA method */ ++#define WL_P2P_FEAT_GO_NOLEGACY (1 << 1) /* GO does not probe respond to non-p2p probe ++ * requests ++ */ ++#define WL_P2P_FEAT_RESTRICT_DEV_RESP (1 << 2) /* Restrict p2p dev interface from responding */ ++ ++#ifdef WLNIC ++/* nic_cnx iovar */ ++typedef struct wl_nic_cnx { ++ uint8 opcode; ++ struct ether_addr addr; ++ /* the following are valid for WL_NIC_CNX_CONN */ ++ uint8 SSID_len; ++ uint8 SSID[32]; ++ struct ether_addr abssid; ++ uint8 join_period; ++} wl_nic_cnx_t; ++ ++/* opcode */ ++#define WL_NIC_CNX_ADD 0 /* add NIC connection */ ++#define WL_NIC_CNX_DEL 1 /* delete NIC connection */ ++#define WL_NIC_CNX_IDX 2 /* query NIC connection index */ ++#define WL_NIC_CNX_CONN 3 /* join/create network */ ++#define WL_NIC_CNX_DIS 4 /* disconnect from network */ ++ ++/* nic_cfg iovar */ ++typedef struct wl_nic_cfg { ++ uint8 version; ++ uint8 beacon_mode; ++ uint16 beacon_interval; ++ uint8 diluted_beacon_period; ++ uint8 repeat_EQC; ++ uint8 scan_length; ++ uint8 scan_interval; ++ uint8 scan_probability; ++ uint8 awake_window_length; ++ int8 TSF_correction; ++ uint8 ASID; ++ uint8 channel_usage_mode; ++} wl_nic_cfg_t; ++ ++/* version */ ++#define WL_NIC_CFG_VER 1 ++ ++/* beacon_mode */ ++#define WL_NIC_BCN_NORM 0 ++#define WL_NIC_BCN_DILUTED 1 ++ ++/* channel_usage_mode */ ++#define WL_NIC_CHAN_STATIC 0 ++#define WL_NIC_CHAN_CYCLE 1 ++ ++/* nic_cfg iovar */ ++typedef struct wl_nic_frm { ++ uint8 type; ++ struct ether_addr da; ++ uint8 body[1]; ++} wl_nic_frm_t; ++ ++/* type */ ++#define WL_NIC_FRM_MYNET 1 ++#define WL_NIC_FRM_ACTION 2 ++ ++/* i/f query */ ++typedef struct wl_nic_ifq { ++ uint bsscfgidx; ++ char ifname[BCM_MSG_IFNAME_MAX]; ++} wl_nic_ifq_t; ++ ++/* data mode */ ++/* nic_dm iovar */ ++typedef struct wl_nic_dm { ++ uint8 enab; ++ chanspec_t chspec; ++} wl_nic_dm_t; ++#endif /* WLNIC */ ++ ++/* RFAWARE def */ ++#define BCM_ACTION_RFAWARE 0x77 ++#define BCM_ACTION_RFAWARE_DCS 0x01 ++ ++/* DCS reason code define */ ++#define BCM_DCS_IOVAR 0x1 ++#define BCM_DCS_UNKNOWN 0xFF ++ ++typedef struct wl_bcmdcs_data { ++ uint reason; ++ chanspec_t chspec; ++} wl_bcmdcs_data_t; ++ ++/* n-mode support capability */ ++/* 2x2 includes both 1x1 & 2x2 devices ++ * reserved #define 2 for future when we want to separate 1x1 & 2x2 and ++ * control it independently ++ */ ++#define WL_11N_2x2 1 ++#define WL_11N_3x3 3 ++#define WL_11N_4x4 4 ++ ++/* define 11n feature disable flags */ ++#define WLFEATURE_DISABLE_11N 0x00000001 ++#define WLFEATURE_DISABLE_11N_STBC_TX 0x00000002 ++#define WLFEATURE_DISABLE_11N_STBC_RX 0x00000004 ++#define WLFEATURE_DISABLE_11N_SGI_TX 0x00000008 ++#define WLFEATURE_DISABLE_11N_SGI_RX 0x00000010 ++#define WLFEATURE_DISABLE_11N_AMPDU_TX 0x00000020 ++#define WLFEATURE_DISABLE_11N_AMPDU_RX 0x00000040 ++#define WLFEATURE_DISABLE_11N_GF 0x00000080 ++ ++/* Proxy STA modes */ ++#define PSTA_MODE_DISABLED 0 ++#define PSTA_MODE_PROXY 1 ++#define PSTA_MODE_REPEATER 2 ++ ++ ++/* NAT configuration */ ++typedef struct { ++ uint32 ipaddr; /* interface ip address */ ++ uint32 ipaddr_mask; /* interface ip address mask */ ++ uint32 ipaddr_gateway; /* gateway ip address */ ++ uint8 mac_gateway[6]; /* gateway mac address */ ++ uint32 ipaddr_dns; /* DNS server ip address, valid only for public if */ ++ uint8 mac_dns[6]; /* DNS server mac address, valid only for public if */ ++ uint8 GUID[38]; /* interface GUID */ ++} nat_if_info_t; ++ ++typedef struct { ++ uint op; /* operation code */ ++ bool pub_if; /* set for public if, clear for private if */ ++ nat_if_info_t if_info; /* interface info */ ++} nat_cfg_t; ++ ++/* op code in nat_cfg */ ++#define NAT_OP_ENABLE 1 /* enable NAT on given interface */ ++#define NAT_OP_DISABLE 2 /* disable NAT on given interface */ ++#define NAT_OP_DISABLE_ALL 3 /* disable NAT on all interfaces */ ++ ++/* NAT state */ ++#define NAT_STATE_ENABLED 1 /* NAT is enabled */ ++#define NAT_STATE_DISABLED 2 /* NAT is disabled */ ++ ++typedef struct { ++ int state; /* NAT state returned */ ++} nat_state_t; ++ ++#ifdef PROP_TXSTATUS ++/* Bit definitions for tlv iovar */ ++/* ++ * enable RSSI signals: ++ * WLFC_CTL_TYPE_RSSI ++ */ ++#define WLFC_FLAGS_RSSI_SIGNALS 0x0001 ++ ++/* enable (if/mac_open, if/mac_close,, mac_add, mac_del) signals: ++ * ++ * WLFC_CTL_TYPE_MAC_OPEN ++ * WLFC_CTL_TYPE_MAC_CLOSE ++ * ++ * WLFC_CTL_TYPE_INTERFACE_OPEN ++ * WLFC_CTL_TYPE_INTERFACE_CLOSE ++ * ++ * WLFC_CTL_TYPE_MACDESC_ADD ++ * WLFC_CTL_TYPE_MACDESC_DEL ++ * ++ */ ++#define WLFC_FLAGS_XONXOFF_SIGNALS 0x0002 ++ ++/* enable (status, fifo_credit, mac_credit) signals ++ * WLFC_CTL_TYPE_MAC_REQUEST_CREDIT ++ * WLFC_CTL_TYPE_TXSTATUS ++ * WLFC_CTL_TYPE_FIFO_CREDITBACK ++ */ ++#define WLFC_FLAGS_CREDIT_STATUS_SIGNALS 0x0004 ++ ++#define WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE 0x0008 ++#define WLFC_FLAGS_PSQ_GENERATIONFSM_ENABLE 0x0010 ++#define WLFC_FLAGS_PSQ_ZERO_BUFFER_ENABLE 0x0020 ++#define WLFC_FLAGS_HOST_RXRERODER_ACTIVE 0x0040 ++#endif /* PROP_TXSTATUS */ ++ ++#define BTA_STATE_LOG_SZ 64 ++ ++/* BTAMP Statemachine states */ ++enum { ++ HCIReset = 1, ++ HCIReadLocalAMPInfo, ++ HCIReadLocalAMPASSOC, ++ HCIWriteRemoteAMPASSOC, ++ HCICreatePhysicalLink, ++ HCIAcceptPhysicalLinkRequest, ++ HCIDisconnectPhysicalLink, ++ HCICreateLogicalLink, ++ HCIAcceptLogicalLink, ++ HCIDisconnectLogicalLink, ++ HCILogicalLinkCancel, ++ HCIAmpStateChange, ++ HCIWriteLogicalLinkAcceptTimeout ++}; ++ ++typedef struct flush_txfifo { ++ uint32 txfifobmp; ++ uint32 hwtxfifoflush; ++ struct ether_addr ea; ++} flush_txfifo_t; ++ ++#define CHANNEL_5G_LOW_START 36 /* 5G low (36..48) CDD enable/disable bit mask */ ++#define CHANNEL_5G_MID_START 52 /* 5G mid (52..64) CDD enable/disable bit mask */ ++#define CHANNEL_5G_HIGH_START 100 /* 5G high (100..140) CDD enable/disable bit mask */ ++#define CHANNEL_5G_UPPER_START 149 /* 5G upper (149..161) CDD enable/disable bit mask */ ++ ++enum { ++ SPATIAL_MODE_2G_IDX = 0, ++ SPATIAL_MODE_5G_LOW_IDX, ++ SPATIAL_MODE_5G_MID_IDX, ++ SPATIAL_MODE_5G_HIGH_IDX, ++ SPATIAL_MODE_5G_UPPER_IDX, ++ SPATIAL_MODE_MAX_IDX ++}; ++ ++/* IOVAR "mempool" parameter. Used to retrieve a list of memory pool statistics. */ ++typedef struct wl_mempool_stats { ++ int num; /* Number of memory pools */ ++ bcm_mp_stats_t s[1]; /* Variable array of memory pool stats. */ ++} wl_mempool_stats_t; ++ ++ ++/* D0 Coalescing */ ++#define IPV4_ARP_FILTER 0x0001 ++#define IPV4_NETBT_FILTER 0x0002 ++#define IPV4_LLMNR_FILTER 0x0004 ++#define IPV4_SSDP_FILTER 0x0008 ++#define IPV4_WSD_FILTER 0x0010 ++#define IPV6_NETBT_FILTER 0x0200 ++#define IPV6_LLMNR_FILTER 0x0400 ++#define IPV6_SSDP_FILTER 0x0800 ++#define IPV6_WSD_FILTER 0x1000 ++ ++/* Network Offload Engine */ ++#define NWOE_OL_ENABLE 0x00000001 ++ ++typedef struct { ++ uint32 ipaddr; ++ uint32 ipaddr_netmask; ++ uint32 ipaddr_gateway; ++} nwoe_ifconfig_t; ++ ++/* ++ * Traffic management structures/defines. ++ */ ++ ++/* Traffic management bandwidth parameters */ ++#define TRF_MGMT_MAX_PRIORITIES 3 ++ ++#define TRF_MGMT_FLAG_ADD_DSCP 0x0001 /* Add DSCP to IP TOS field */ ++#define TRF_MGMT_FLAG_DISABLE_SHAPING 0x0002 /* Only support traffic clasification */ ++#define TRF_MGMT_FLAG_DISABLE_PRIORITY_TAGGING 0x0004 /* Don't override packet's priority */ ++ ++/* Traffic management priority classes */ ++typedef enum trf_mgmt_priority_class { ++ trf_mgmt_priority_low = 0, /* Maps to 802.1p BO */ ++ trf_mgmt_priority_medium = 1, /* Maps to 802.1p BE */ ++ trf_mgmt_priority_high = 2, /* Maps to 802.1p VI */ ++ trf_mgmt_priority_invalid = (trf_mgmt_priority_high + 1) ++} trf_mgmt_priority_class_t; ++ ++/* Traffic management configuration parameters */ ++typedef struct trf_mgmt_config { ++ uint32 trf_mgmt_enabled; /* 0 - disabled, 1 - enabled */ ++ uint32 flags; /* See TRF_MGMT_FLAG_xxx defines */ ++ uint32 host_ip_addr; /* My IP address to determine subnet */ ++ uint32 host_subnet_mask; /* My subnet mask */ ++ uint32 downlink_bandwidth; /* In units of kbps */ ++ uint32 uplink_bandwidth; /* In units of kbps */ ++ uint32 min_tx_bandwidth[TRF_MGMT_MAX_PRIORITIES]; /* Minimum guaranteed tx bandwidth */ ++ uint32 min_rx_bandwidth[TRF_MGMT_MAX_PRIORITIES]; /* Minimum guaranteed rx bandwidth */ ++} trf_mgmt_config_t; ++ ++/* Traffic management filter */ ++typedef struct trf_mgmt_filter { ++ struct ether_addr dst_ether_addr; /* His L2 address */ ++ uint32 dst_ip_addr; /* His IP address */ ++ uint16 dst_port; /* His L4 port */ ++ uint16 src_port; /* My L4 port */ ++ uint16 prot; /* L4 protocol (only TCP or UDP) */ ++ uint16 flags; /* TBD. For now, this must be zero. */ ++ trf_mgmt_priority_class_t priority; /* Priority for filtered packets */ ++} trf_mgmt_filter_t; ++ ++/* Traffic management filter list (variable length) */ ++typedef struct trf_mgmt_filter_list { ++ uint32 num_filters; ++ trf_mgmt_filter_t filter[1]; ++} trf_mgmt_filter_list_t; ++ ++/* Traffic management global info used for all queues */ ++typedef struct trf_mgmt_global_info { ++ uint32 maximum_bytes_per_second; ++ uint32 maximum_bytes_per_sampling_period; ++ uint32 total_bytes_consumed_per_second; ++ uint32 total_bytes_consumed_per_sampling_period; ++ uint32 total_unused_bytes_per_sampling_period; ++} trf_mgmt_global_info_t; ++ ++/* Traffic management shaping info per priority queue */ ++typedef struct trf_mgmt_shaping_info { ++ uint32 gauranteed_bandwidth_percentage; ++ uint32 guaranteed_bytes_per_second; ++ uint32 guaranteed_bytes_per_sampling_period; ++ uint32 num_bytes_produced_per_second; ++ uint32 num_bytes_consumed_per_second; ++ uint32 num_queued_packets; /* Number of packets in queue */ ++ uint32 num_queued_bytes; /* Number of bytes in queue */ ++} trf_mgmt_shaping_info_t; ++ ++/* Traffic management shaping info array */ ++typedef struct trf_mgmt_shaping_info_array { ++ trf_mgmt_global_info_t tx_global_shaping_info; ++ trf_mgmt_shaping_info_t tx_queue_shaping_info[TRF_MGMT_MAX_PRIORITIES]; ++ trf_mgmt_global_info_t rx_global_shaping_info; ++ trf_mgmt_shaping_info_t rx_queue_shaping_info[TRF_MGMT_MAX_PRIORITIES]; ++} trf_mgmt_shaping_info_array_t; ++ ++ ++/* Traffic management statistical counters */ ++typedef struct trf_mgmt_stats { ++ uint32 num_processed_packets; /* Number of packets processed */ ++ uint32 num_processed_bytes; /* Number of bytes processed */ ++ uint32 num_discarded_packets; /* Number of packets discarded from queue */ ++} trf_mgmt_stats_t; ++ ++/* Traffic management statisics array */ ++typedef struct trf_mgmt_stats_array { ++ trf_mgmt_stats_t tx_queue_stats[TRF_MGMT_MAX_PRIORITIES]; ++ trf_mgmt_stats_t rx_queue_stats[TRF_MGMT_MAX_PRIORITIES]; ++} trf_mgmt_stats_array_t; ++ ++typedef struct powersel_params { ++ /* LPC Params exposed via IOVAR */ ++ int32 tp_ratio_thresh; /* Throughput ratio threshold */ ++ uint8 rate_stab_thresh; /* Thresh for rate stability based on nupd */ ++ uint8 pwr_stab_thresh; /* Number of successes before power step down */ ++ uint8 pwr_sel_exp_time; /* Time lapse for expiry of database */ ++} powersel_params_t; ++ ++#endif /* LINUX_POSTMOGRIFY_REMOVAL */ ++#endif /* _wlioctl_h_ */ +diff --git a/drivers/net/wireless/ap6210/linux_osl.c b/drivers/net/wireless/ap6210/linux_osl.c +new file mode 100644 +index 0000000..d74eee3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/linux_osl.c +@@ -0,0 +1,1138 @@ ++/* ++ * Linux OS Independent Layer ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: linux_osl.c 373382 2012-12-07 07:59:52Z $ ++ */ ++ ++#define LINUX_PORT ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++#include ++ ++#define PCI_CFG_RETRY 10 ++ ++#define OS_HANDLE_MAGIC 0x1234abcd /* Magic # to recognize osh */ ++#define BCM_MEM_FILENAME_LEN 24 /* Mem. filename length */ ++ ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++#define DHD_SKB_HDRSIZE 336 ++#define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE) ++#define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE) ++#define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE) ++ ++#define STATIC_BUF_MAX_NUM 16 ++#define STATIC_BUF_SIZE (PAGE_SIZE*2) ++#define STATIC_BUF_TOTAL_LEN (STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE) ++ ++typedef struct bcm_static_buf { ++ struct semaphore static_sem; ++ unsigned char *buf_ptr; ++ unsigned char buf_use[STATIC_BUF_MAX_NUM]; ++} bcm_static_buf_t; ++ ++static bcm_static_buf_t *bcm_static_buf = 0; ++ ++#define STATIC_PKT_MAX_NUM 8 ++#if defined(ENHANCED_STATIC_BUF) ++#define STATIC_PKT_4PAGE_NUM 1 ++#define DHD_SKB_MAX_BUFSIZE DHD_SKB_4PAGE_BUFSIZE ++#else ++#define STATIC_PKT_4PAGE_NUM 0 ++#define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE ++#endif /* ENHANCED_STATIC_BUF */ ++ ++typedef struct bcm_static_pkt { ++ struct sk_buff *skb_4k[STATIC_PKT_MAX_NUM]; ++ struct sk_buff *skb_8k[STATIC_PKT_MAX_NUM]; ++#ifdef ENHANCED_STATIC_BUF ++ struct sk_buff *skb_16k; ++#endif ++ struct semaphore osl_pkt_sem; ++ unsigned char pkt_use[STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM]; ++} bcm_static_pkt_t; ++ ++static bcm_static_pkt_t *bcm_static_skb = 0; ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ ++typedef struct bcm_mem_link { ++ struct bcm_mem_link *prev; ++ struct bcm_mem_link *next; ++ uint size; ++ int line; ++ void *osh; ++ char file[BCM_MEM_FILENAME_LEN]; ++} bcm_mem_link_t; ++ ++struct osl_info { ++ osl_pubinfo_t pub; ++#ifdef CTFPOOL ++ ctfpool_t *ctfpool; ++#endif /* CTFPOOL */ ++ uint magic; ++ void *pdev; ++ atomic_t malloced; ++ uint failed; ++ uint bustype; ++ bcm_mem_link_t *dbgmem_list; ++ spinlock_t dbgmem_lock; ++ spinlock_t pktalloc_lock; ++}; ++ ++/* PCMCIA attribute space access macros */ ++ ++/* Global ASSERT type flag */ ++uint32 g_assert_type = FALSE; ++ ++static int16 linuxbcmerrormap[] = ++{ 0, /* 0 */ ++ -EINVAL, /* BCME_ERROR */ ++ -EINVAL, /* BCME_BADARG */ ++ -EINVAL, /* BCME_BADOPTION */ ++ -EINVAL, /* BCME_NOTUP */ ++ -EINVAL, /* BCME_NOTDOWN */ ++ -EINVAL, /* BCME_NOTAP */ ++ -EINVAL, /* BCME_NOTSTA */ ++ -EINVAL, /* BCME_BADKEYIDX */ ++ -EINVAL, /* BCME_RADIOOFF */ ++ -EINVAL, /* BCME_NOTBANDLOCKED */ ++ -EINVAL, /* BCME_NOCLK */ ++ -EINVAL, /* BCME_BADRATESET */ ++ -EINVAL, /* BCME_BADBAND */ ++ -E2BIG, /* BCME_BUFTOOSHORT */ ++ -E2BIG, /* BCME_BUFTOOLONG */ ++ -EBUSY, /* BCME_BUSY */ ++ -EINVAL, /* BCME_NOTASSOCIATED */ ++ -EINVAL, /* BCME_BADSSIDLEN */ ++ -EINVAL, /* BCME_OUTOFRANGECHAN */ ++ -EINVAL, /* BCME_BADCHAN */ ++ -EFAULT, /* BCME_BADADDR */ ++ -ENOMEM, /* BCME_NORESOURCE */ ++ -EOPNOTSUPP, /* BCME_UNSUPPORTED */ ++ -EMSGSIZE, /* BCME_BADLENGTH */ ++ -EINVAL, /* BCME_NOTREADY */ ++ -EPERM, /* BCME_EPERM */ ++ -ENOMEM, /* BCME_NOMEM */ ++ -EINVAL, /* BCME_ASSOCIATED */ ++ -ERANGE, /* BCME_RANGE */ ++ -EINVAL, /* BCME_NOTFOUND */ ++ -EINVAL, /* BCME_WME_NOT_ENABLED */ ++ -EINVAL, /* BCME_TSPEC_NOTFOUND */ ++ -EINVAL, /* BCME_ACM_NOTSUPPORTED */ ++ -EINVAL, /* BCME_NOT_WME_ASSOCIATION */ ++ -EIO, /* BCME_SDIO_ERROR */ ++ -ENODEV, /* BCME_DONGLE_DOWN */ ++ -EINVAL, /* BCME_VERSION */ ++ -EIO, /* BCME_TXFAIL */ ++ -EIO, /* BCME_RXFAIL */ ++ -ENODEV, /* BCME_NODEVICE */ ++ -EINVAL, /* BCME_NMODE_DISABLED */ ++ -ENODATA, /* BCME_NONRESIDENT */ ++ ++/* When an new error code is added to bcmutils.h, add os ++ * specific error translation here as well ++ */ ++/* check if BCME_LAST changed since the last time this function was updated */ ++#if BCME_LAST != -42 ++#error "You need to add a OS error translation in the linuxbcmerrormap \ ++ for new error code defined in bcmutils.h" ++#endif ++}; ++ ++/* translate bcmerrors into linux errors */ ++int ++osl_error(int bcmerror) ++{ ++ if (bcmerror > 0) ++ bcmerror = 0; ++ else if (bcmerror < BCME_LAST) ++ bcmerror = BCME_ERROR; ++ ++ /* Array bounds covered by ASSERT in osl_attach */ ++ return linuxbcmerrormap[-bcmerror]; ++} ++ ++extern uint8* dhd_os_prealloc(void *osh, int section, int size); ++ ++osl_t * ++osl_attach(void *pdev, uint bustype, bool pkttag) ++{ ++ osl_t *osh; ++ ++ if (!(osh = kmalloc(sizeof(osl_t), GFP_ATOMIC))) ++ return osh; ++ ++ ASSERT(osh); ++ ++ bzero(osh, sizeof(osl_t)); ++ ++ /* Check that error map has the right number of entries in it */ ++ ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(linuxbcmerrormap) - 1)); ++ ++ osh->magic = OS_HANDLE_MAGIC; ++ atomic_set(&osh->malloced, 0); ++ osh->failed = 0; ++ osh->dbgmem_list = NULL; ++ spin_lock_init(&(osh->dbgmem_lock)); ++ osh->pdev = pdev; ++ osh->pub.pkttag = pkttag; ++ osh->bustype = bustype; ++ ++ switch (bustype) { ++ case PCI_BUS: ++ case SI_BUS: ++ case PCMCIA_BUS: ++ osh->pub.mmbus = TRUE; ++ break; ++ case JTAG_BUS: ++ case SDIO_BUS: ++ case USB_BUS: ++ case SPI_BUS: ++ case RPC_BUS: ++ osh->pub.mmbus = FALSE; ++ break; ++ default: ++ ASSERT(FALSE); ++ break; ++ } ++ ++#if defined(CONFIG_DHD_USE_STATIC_BUF) ++ if (!bcm_static_buf) { ++ if (!(bcm_static_buf = (bcm_static_buf_t *)dhd_os_prealloc(osh, 3, STATIC_BUF_SIZE+ ++ STATIC_BUF_TOTAL_LEN))) { ++ AP6210_DEBUG("can not alloc static buf!\n"); ++ } ++ else ++ AP6210_DEBUG("alloc static buf at %x!\n", (unsigned int)bcm_static_buf); ++ ++ ++ sema_init(&bcm_static_buf->static_sem, 1); ++ ++ bcm_static_buf->buf_ptr = (unsigned char *)bcm_static_buf + STATIC_BUF_SIZE; ++ } ++ ++ if (!bcm_static_skb) { ++ int i; ++ void *skb_buff_ptr = 0; ++ bcm_static_skb = (bcm_static_pkt_t *)((char *)bcm_static_buf + 2048); ++ skb_buff_ptr = dhd_os_prealloc(osh, 4, 0); ++ ++ bcopy(skb_buff_ptr, bcm_static_skb, sizeof(struct sk_buff *)* ++ (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM)); ++ for (i = 0; i < (STATIC_PKT_MAX_NUM * 2 + STATIC_PKT_4PAGE_NUM); i++) ++ bcm_static_skb->pkt_use[i] = 0; ++ ++ sema_init(&bcm_static_skb->osl_pkt_sem, 1); ++ } ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ ++ spin_lock_init(&(osh->pktalloc_lock)); ++ ++ return osh; ++} ++ ++void ++osl_detach(osl_t *osh) ++{ ++ if (osh == NULL) ++ return; ++ ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ if (bcm_static_buf) { ++ bcm_static_buf = 0; ++ } ++ if (bcm_static_skb) { ++ bcm_static_skb = 0; ++ } ++#endif ++ ++ ASSERT(osh->magic == OS_HANDLE_MAGIC); ++ kfree(osh); ++} ++ ++static struct sk_buff *osl_alloc_skb(unsigned int len) ++{ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25) ++ return __dev_alloc_skb(len, GFP_ATOMIC); ++#else ++ return dev_alloc_skb(len); ++#endif ++} ++ ++#ifdef CTFPOOL ++ ++#ifdef CTFPOOL_SPINLOCK ++#define CTFPOOL_LOCK(ctfpool, flags) spin_lock_irqsave(&(ctfpool)->lock, flags) ++#define CTFPOOL_UNLOCK(ctfpool, flags) spin_unlock_irqrestore(&(ctfpool)->lock, flags) ++#else ++#define CTFPOOL_LOCK(ctfpool, flags) spin_lock_bh(&(ctfpool)->lock) ++#define CTFPOOL_UNLOCK(ctfpool, flags) spin_unlock_bh(&(ctfpool)->lock) ++#endif /* CTFPOOL_SPINLOCK */ ++/* ++ * Allocate and add an object to packet pool. ++ */ ++void * ++osl_ctfpool_add(osl_t *osh) ++{ ++ struct sk_buff *skb; ++#ifdef CTFPOOL_SPINLOCK ++ unsigned long flags; ++#endif /* CTFPOOL_SPINLOCK */ ++ ++ if ((osh == NULL) || (osh->ctfpool == NULL)) ++ return NULL; ++ ++ CTFPOOL_LOCK(osh->ctfpool, flags); ++ ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj); ++ ++ /* No need to allocate more objects */ ++ if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) { ++ CTFPOOL_UNLOCK(osh->ctfpool, flags); ++ return NULL; ++ } ++ ++ /* Allocate a new skb and add it to the ctfpool */ ++ skb = osl_alloc_skb(osh->ctfpool->obj_size); ++ if (skb == NULL) { ++ AP6210_DEBUG("%s: skb alloc of len %d failed\n", __FUNCTION__, ++ osh->ctfpool->obj_size); ++ CTFPOOL_UNLOCK(osh->ctfpool, flags); ++ return NULL; ++ } ++ ++ /* Add to ctfpool */ ++ skb->next = (struct sk_buff *)osh->ctfpool->head; ++ osh->ctfpool->head = skb; ++ osh->ctfpool->fast_frees++; ++ osh->ctfpool->curr_obj++; ++ ++ /* Hijack a skb member to store ptr to ctfpool */ ++ CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool; ++ ++ /* Use bit flag to indicate skb from fast ctfpool */ ++ PKTFAST(osh, skb) = FASTBUF; ++ ++ CTFPOOL_UNLOCK(osh->ctfpool, flags); ++ ++ return skb; ++} ++ ++/* ++ * Add new objects to the pool. ++ */ ++void ++osl_ctfpool_replenish(osl_t *osh, uint thresh) ++{ ++ if ((osh == NULL) || (osh->ctfpool == NULL)) ++ return; ++ ++ /* Do nothing if no refills are required */ ++ while ((osh->ctfpool->refills > 0) && (thresh--)) { ++ osl_ctfpool_add(osh); ++ osh->ctfpool->refills--; ++ } ++} ++ ++/* ++ * Initialize the packet pool with specified number of objects. ++ */ ++int32 ++osl_ctfpool_init(osl_t *osh, uint numobj, uint size) ++{ ++ osh->ctfpool = kmalloc(sizeof(ctfpool_t), GFP_ATOMIC); ++ ASSERT(osh->ctfpool); ++ bzero(osh->ctfpool, sizeof(ctfpool_t)); ++ ++ osh->ctfpool->max_obj = numobj; ++ osh->ctfpool->obj_size = size; ++ ++ spin_lock_init(&osh->ctfpool->lock); ++ ++ while (numobj--) { ++ if (!osl_ctfpool_add(osh)) ++ return -1; ++ osh->ctfpool->fast_frees--; ++ } ++ ++ return 0; ++} ++ ++/* ++ * Cleanup the packet pool objects. ++ */ ++void ++osl_ctfpool_cleanup(osl_t *osh) ++{ ++ struct sk_buff *skb, *nskb; ++#ifdef CTFPOOL_SPINLOCK ++ unsigned long flags; ++#endif /* CTFPOOL_SPINLOCK */ ++ ++ if ((osh == NULL) || (osh->ctfpool == NULL)) ++ return; ++ ++ CTFPOOL_LOCK(osh->ctfpool, flags); ++ ++ skb = osh->ctfpool->head; ++ ++ while (skb != NULL) { ++ nskb = skb->next; ++ dev_kfree_skb(skb); ++ skb = nskb; ++ osh->ctfpool->curr_obj--; ++ } ++ ++ ASSERT(osh->ctfpool->curr_obj == 0); ++ osh->ctfpool->head = NULL; ++ CTFPOOL_UNLOCK(osh->ctfpool, flags); ++ ++ kfree(osh->ctfpool); ++ osh->ctfpool = NULL; ++} ++ ++void ++osl_ctfpool_stats(osl_t *osh, void *b) ++{ ++ struct bcmstrbuf *bb; ++ ++ if ((osh == NULL) || (osh->ctfpool == NULL)) ++ return; ++ ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ if (bcm_static_buf) { ++ bcm_static_buf = 0; ++ } ++ if (bcm_static_skb) { ++ bcm_static_skb = 0; ++ } ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ ++ bb = b; ++ ++ ASSERT((osh != NULL) && (bb != NULL)); ++ ++ bcm_bprintf(bb, "max_obj %d obj_size %d curr_obj %d refills %d\n", ++ osh->ctfpool->max_obj, osh->ctfpool->obj_size, ++ osh->ctfpool->curr_obj, osh->ctfpool->refills); ++ bcm_bprintf(bb, "fast_allocs %d fast_frees %d slow_allocs %d\n", ++ osh->ctfpool->fast_allocs, osh->ctfpool->fast_frees, ++ osh->ctfpool->slow_allocs); ++} ++ ++static inline struct sk_buff * ++osl_pktfastget(osl_t *osh, uint len) ++{ ++ struct sk_buff *skb; ++#ifdef CTFPOOL_SPINLOCK ++ unsigned long flags; ++#endif /* CTFPOOL_SPINLOCK */ ++ ++ /* Try to do fast allocate. Return null if ctfpool is not in use ++ * or if there are no items in the ctfpool. ++ */ ++ if (osh->ctfpool == NULL) ++ return NULL; ++ ++ CTFPOOL_LOCK(osh->ctfpool, flags); ++ if (osh->ctfpool->head == NULL) { ++ ASSERT(osh->ctfpool->curr_obj == 0); ++ osh->ctfpool->slow_allocs++; ++ CTFPOOL_UNLOCK(osh->ctfpool, flags); ++ return NULL; ++ } ++ ++ ASSERT(len <= osh->ctfpool->obj_size); ++ ++ /* Get an object from ctfpool */ ++ skb = (struct sk_buff *)osh->ctfpool->head; ++ osh->ctfpool->head = (void *)skb->next; ++ ++ osh->ctfpool->fast_allocs++; ++ osh->ctfpool->curr_obj--; ++ ASSERT(CTFPOOLHEAD(osh, skb) == (struct sock *)osh->ctfpool->head); ++ CTFPOOL_UNLOCK(osh->ctfpool, flags); ++ ++ /* Init skb struct */ ++ skb->next = skb->prev = NULL; ++ skb->data = skb->head + 16; ++ skb->tail = skb->head + 16; ++ ++ skb->len = 0; ++ skb->cloned = 0; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) ++ skb->list = NULL; ++#endif ++ atomic_set(&skb->users, 1); ++ ++ return skb; ++} ++#endif /* CTFPOOL */ ++/* Convert a driver packet to native(OS) packet ++ * In the process, packettag is zeroed out before sending up ++ * IP code depends on skb->cb to be setup correctly with various options ++ * In our case, that means it should be 0 ++ */ ++struct sk_buff * BCMFASTPATH ++osl_pkt_tonative(osl_t *osh, void *pkt) ++{ ++#ifndef WL_UMK ++ struct sk_buff *nskb; ++ unsigned long flags; ++#endif ++ ++ if (osh->pub.pkttag) ++ bzero((void*)((struct sk_buff *)pkt)->cb, OSL_PKTTAG_SZ); ++ ++#ifndef WL_UMK ++ /* Decrement the packet counter */ ++ for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { ++ spin_lock_irqsave(&osh->pktalloc_lock, flags); ++ osh->pub.pktalloced--; ++ spin_unlock_irqrestore(&osh->pktalloc_lock, flags); ++ } ++#endif /* WL_UMK */ ++ return (struct sk_buff *)pkt; ++} ++ ++/* Convert a native(OS) packet to driver packet. ++ * In the process, native packet is destroyed, there is no copying ++ * Also, a packettag is zeroed out ++ */ ++void * BCMFASTPATH ++osl_pkt_frmnative(osl_t *osh, void *pkt) ++{ ++#ifndef WL_UMK ++ struct sk_buff *nskb; ++ unsigned long flags; ++#endif ++ ++ if (osh->pub.pkttag) ++ bzero((void*)((struct sk_buff *)pkt)->cb, OSL_PKTTAG_SZ); ++ ++#ifndef WL_UMK ++ /* Increment the packet counter */ ++ for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) { ++ spin_lock_irqsave(&osh->pktalloc_lock, flags); ++ osh->pub.pktalloced++; ++ spin_unlock_irqrestore(&osh->pktalloc_lock, flags); ++ } ++#endif /* WL_UMK */ ++ return (void *)pkt; ++} ++ ++/* Return a new packet. zero out pkttag */ ++void * BCMFASTPATH ++osl_pktget(osl_t *osh, uint len) ++{ ++ struct sk_buff *skb; ++ unsigned long flags; ++ ++#ifdef CTFPOOL ++ /* Allocate from local pool */ ++ skb = osl_pktfastget(osh, len); ++ if ((skb != NULL) || ((skb = osl_alloc_skb(len)) != NULL)) { ++#else /* CTFPOOL */ ++ if ((skb = osl_alloc_skb(len))) { ++#endif /* CTFPOOL */ ++ skb_put(skb, len); ++ skb->priority = 0; ++ ++ ++ spin_lock_irqsave(&osh->pktalloc_lock, flags); ++ osh->pub.pktalloced++; ++ spin_unlock_irqrestore(&osh->pktalloc_lock, flags); ++ } ++ ++ return ((void*) skb); ++} ++ ++#ifdef CTFPOOL ++static inline void ++osl_pktfastfree(osl_t *osh, struct sk_buff *skb) ++{ ++ ctfpool_t *ctfpool; ++#ifdef CTFPOOL_SPINLOCK ++ unsigned long flags; ++#endif /* CTFPOOL_SPINLOCK */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) ++ skb->tstamp.tv.sec = 0; ++#else ++ skb->stamp.tv_sec = 0; ++#endif ++ ++ /* We only need to init the fields that we change */ ++ skb->dev = NULL; ++ skb->dst = NULL; ++ memset(skb->cb, 0, sizeof(skb->cb)); ++ skb->ip_summed = 0; ++ skb->destructor = NULL; ++ ++ ctfpool = (ctfpool_t *)CTFPOOLPTR(osh, skb); ++ ASSERT(ctfpool != NULL); ++ ++ /* Add object to the ctfpool */ ++ CTFPOOL_LOCK(ctfpool, flags); ++ skb->next = (struct sk_buff *)ctfpool->head; ++ ctfpool->head = (void *)skb; ++ ++ ctfpool->fast_frees++; ++ ctfpool->curr_obj++; ++ ++ ASSERT(ctfpool->curr_obj <= ctfpool->max_obj); ++ CTFPOOL_UNLOCK(ctfpool, flags); ++} ++#endif /* CTFPOOL */ ++ ++/* Free the driver packet. Free the tag if present */ ++void BCMFASTPATH ++osl_pktfree(osl_t *osh, void *p, bool send) ++{ ++ struct sk_buff *skb, *nskb; ++ unsigned long flags; ++ ++ skb = (struct sk_buff*) p; ++ ++ if (send && osh->pub.tx_fn) ++ osh->pub.tx_fn(osh->pub.tx_ctx, p, 0); ++ ++ PKTDBG_TRACE(osh, (void *) skb, PKTLIST_PKTFREE); ++ ++ /* perversion: we use skb->next to chain multi-skb packets */ ++ while (skb) { ++ nskb = skb->next; ++ skb->next = NULL; ++ ++ ++ ++#ifdef CTFPOOL ++ if ((PKTISFAST(osh, skb)) && (atomic_read(&skb->users) == 1)) ++ osl_pktfastfree(osh, skb); ++ else { ++#else /* CTFPOOL */ ++ { ++#endif /* CTFPOOL */ ++ ++ if (skb->destructor) ++ /* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if ++ * destructor exists ++ */ ++ dev_kfree_skb_any(skb); ++ else ++ /* can free immediately (even in_irq()) if destructor ++ * does not exist ++ */ ++ dev_kfree_skb(skb); ++ } ++ spin_lock_irqsave(&osh->pktalloc_lock, flags); ++ osh->pub.pktalloced--; ++ spin_unlock_irqrestore(&osh->pktalloc_lock, flags); ++ skb = nskb; ++ } ++} ++ ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++void* ++osl_pktget_static(osl_t *osh, uint len) ++{ ++ int i = 0; ++ struct sk_buff *skb; ++ ++ ++ if (len > DHD_SKB_MAX_BUFSIZE) { ++ AP6210_DEBUG("osl_pktget_static: Do we really need this big skb??" ++ " len=%d\n", len); ++ return osl_pktget(osh, len); ++ } ++ ++ down(&bcm_static_skb->osl_pkt_sem); ++ ++ if (len <= DHD_SKB_1PAGE_BUFSIZE) { ++ for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { ++ if (bcm_static_skb->pkt_use[i] == 0) ++ break; ++ } ++ ++ if (i != STATIC_PKT_MAX_NUM) { ++ bcm_static_skb->pkt_use[i] = 1; ++ ++ skb = bcm_static_skb->skb_4k[i]; ++ skb->tail = skb->data + len; ++ skb->len = len; ++ ++ up(&bcm_static_skb->osl_pkt_sem); ++ return skb; ++ } ++ } ++ ++ if (len <= DHD_SKB_2PAGE_BUFSIZE) { ++ ++ for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { ++ if (bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] ++ == 0) ++ break; ++ } ++ ++ if (i != STATIC_PKT_MAX_NUM) { ++ bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 1; ++ skb = bcm_static_skb->skb_8k[i]; ++ skb->tail = skb->data + len; ++ skb->len = len; ++ ++ up(&bcm_static_skb->osl_pkt_sem); ++ return skb; ++ } ++ } ++ ++#if defined(ENHANCED_STATIC_BUF) ++ if (bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] == 0) { ++ bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM * 2] = 1; ++ ++ skb = bcm_static_skb->skb_16k; ++ skb->tail = skb->data + len; ++ skb->len = len; ++ ++ up(&bcm_static_skb->osl_pkt_sem); ++ return skb; ++ } ++#endif ++ ++ up(&bcm_static_skb->osl_pkt_sem); ++ AP6210_DEBUG("osl_pktget_static: all static pkt in use!\n"); ++ return osl_pktget(osh, len); ++} ++ ++void ++osl_pktfree_static(osl_t *osh, void *p, bool send) ++{ ++ int i; ++ if (!bcm_static_skb) { ++ osl_pktfree(osh, p, send); ++ return; ++ } ++ ++ down(&bcm_static_skb->osl_pkt_sem); ++ for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { ++ if (p == bcm_static_skb->skb_4k[i]) { ++ bcm_static_skb->pkt_use[i] = 0; ++ up(&bcm_static_skb->osl_pkt_sem); ++ return; ++ } ++ } ++ ++ for (i = 0; i < STATIC_PKT_MAX_NUM; i++) { ++ if (p == bcm_static_skb->skb_8k[i]) { ++ bcm_static_skb->pkt_use[i + STATIC_PKT_MAX_NUM] = 0; ++ up(&bcm_static_skb->osl_pkt_sem); ++ return; ++ } ++ } ++#ifdef ENHANCED_STATIC_BUF ++ if (p == bcm_static_skb->skb_16k) { ++ bcm_static_skb->pkt_use[STATIC_PKT_MAX_NUM*2] = 0; ++ up(&bcm_static_skb->osl_pkt_sem); ++ return; ++ } ++#endif ++ up(&bcm_static_skb->osl_pkt_sem); ++ ++ osl_pktfree(osh, p, send); ++ return; ++} ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ ++uint32 ++osl_pci_read_config(osl_t *osh, uint offset, uint size) ++{ ++ uint val = 0; ++ uint retry = PCI_CFG_RETRY; ++ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ ++ /* only 4byte access supported */ ++ ASSERT(size == 4); ++ ++ do { ++ pci_read_config_dword(osh->pdev, offset, &val); ++ if (val != 0xffffffff) ++ break; ++ } while (retry--); ++ ++ ++ return (val); ++} ++ ++void ++osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val) ++{ ++ uint retry = PCI_CFG_RETRY; ++ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ ++ /* only 4byte access supported */ ++ ASSERT(size == 4); ++ ++ do { ++ pci_write_config_dword(osh->pdev, offset, val); ++ if (offset != PCI_BAR0_WIN) ++ break; ++ if (osl_pci_read_config(osh, offset, size) == val) ++ break; ++ } while (retry--); ++ ++} ++ ++/* return bus # for the pci device pointed by osh->pdev */ ++uint ++osl_pci_bus(osl_t *osh) ++{ ++ ASSERT(osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev); ++ ++ return ((struct pci_dev *)osh->pdev)->bus->number; ++} ++ ++/* return slot # for the pci device pointed by osh->pdev */ ++uint ++osl_pci_slot(osl_t *osh) ++{ ++ ASSERT(osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev); ++ ++ return PCI_SLOT(((struct pci_dev *)osh->pdev)->devfn); ++} ++ ++/* return the pci device pointed by osh->pdev */ ++struct pci_dev * ++osl_pci_device(osl_t *osh) ++{ ++ ASSERT(osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev); ++ ++ return osh->pdev; ++} ++ ++static void ++osl_pcmcia_attr(osl_t *osh, uint offset, char *buf, int size, bool write) ++{ ++} ++ ++void ++osl_pcmcia_read_attr(osl_t *osh, uint offset, void *buf, int size) ++{ ++ osl_pcmcia_attr(osh, offset, (char *) buf, size, FALSE); ++} ++ ++void ++osl_pcmcia_write_attr(osl_t *osh, uint offset, void *buf, int size) ++{ ++ osl_pcmcia_attr(osh, offset, (char *) buf, size, TRUE); ++} ++ ++void * ++osl_malloc(osl_t *osh, uint size) ++{ ++ void *addr; ++ ++ /* only ASSERT if osh is defined */ ++ if (osh) ++ ASSERT(osh->magic == OS_HANDLE_MAGIC); ++ ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ if (bcm_static_buf) ++ { ++ int i = 0; ++ if ((size >= PAGE_SIZE)&&(size <= STATIC_BUF_SIZE)) ++ { ++ down(&bcm_static_buf->static_sem); ++ ++ for (i = 0; i < STATIC_BUF_MAX_NUM; i++) ++ { ++ if (bcm_static_buf->buf_use[i] == 0) ++ break; ++ } ++ ++ if (i == STATIC_BUF_MAX_NUM) ++ { ++ up(&bcm_static_buf->static_sem); ++ AP6210_DEBUG("all static buff in use!\n"); ++ goto original; ++ } ++ ++ bcm_static_buf->buf_use[i] = 1; ++ up(&bcm_static_buf->static_sem); ++ ++ bzero(bcm_static_buf->buf_ptr+STATIC_BUF_SIZE*i, size); ++ if (osh) ++ atomic_add(size, &osh->malloced); ++ ++ return ((void *)(bcm_static_buf->buf_ptr+STATIC_BUF_SIZE*i)); ++ } ++ } ++original: ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ ++ if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) { ++ if (osh) ++ osh->failed++; ++ return (NULL); ++ } ++ if (osh) ++ atomic_add(size, &osh->malloced); ++ ++ return (addr); ++} ++ ++void ++osl_mfree(osl_t *osh, void *addr, uint size) ++{ ++#ifdef CONFIG_DHD_USE_STATIC_BUF ++ if (bcm_static_buf) ++ { ++ if ((addr > (void *)bcm_static_buf) && ((unsigned char *)addr ++ <= ((unsigned char *)bcm_static_buf + STATIC_BUF_TOTAL_LEN))) ++ { ++ int buf_idx = 0; ++ ++ buf_idx = ((unsigned char *)addr - bcm_static_buf->buf_ptr)/STATIC_BUF_SIZE; ++ ++ down(&bcm_static_buf->static_sem); ++ bcm_static_buf->buf_use[buf_idx] = 0; ++ up(&bcm_static_buf->static_sem); ++ ++ if (osh) { ++ ASSERT(osh->magic == OS_HANDLE_MAGIC); ++ atomic_sub(size, &osh->malloced); ++ } ++ return; ++ } ++ } ++#endif /* CONFIG_DHD_USE_STATIC_BUF */ ++ if (osh) { ++ ASSERT(osh->magic == OS_HANDLE_MAGIC); ++ atomic_sub(size, &osh->malloced); ++ } ++ kfree(addr); ++} ++ ++uint ++osl_malloced(osl_t *osh) ++{ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ return (atomic_read(&osh->malloced)); ++} ++ ++uint ++osl_malloc_failed(osl_t *osh) ++{ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ return (osh->failed); ++} ++ ++ ++uint ++osl_dma_consistent_align(void) ++{ ++ return (PAGE_SIZE); ++} ++ ++void* ++osl_dma_alloc_consistent(osl_t *osh, uint size, uint16 align_bits, uint *alloced, ulong *pap) ++{ ++ uint16 align = (1 << align_bits); ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ ++ if (!ISALIGNED(DMA_CONSISTENT_ALIGN, align)) ++ size += align; ++ *alloced = size; ++ ++ return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap)); ++} ++ ++void ++osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa) ++{ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ ++ pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa); ++} ++ ++uint BCMFASTPATH ++osl_dma_map(osl_t *osh, void *va, uint size, int direction) ++{ ++ int dir; ++ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; ++ return (pci_map_single(osh->pdev, va, size, dir)); ++} ++ ++void BCMFASTPATH ++osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction) ++{ ++ int dir; ++ ++ ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC))); ++ dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE; ++ pci_unmap_single(osh->pdev, (uint32)pa, size, dir); ++} ++ ++#if defined(BCMASSERT_LOG) ++void ++osl_assert(const char *exp, const char *file, int line) ++{ ++ char tempbuf[256]; ++ const char *basename; ++ ++ basename = strrchr(file, '/'); ++ /* skip the '/' */ ++ if (basename) ++ basename++; ++ ++ if (!basename) ++ basename = file; ++ ++ snprintf(tempbuf, 64, "\"%s\": file \"%s\", line %d\n", ++ exp, basename, line); ++ ++ AP6210_DEBUG("%s", tempbuf); ++ ++ ++} ++#endif ++ ++void ++osl_delay(uint usec) ++{ ++ uint d; ++ ++ while (usec > 0) { ++ d = MIN(usec, 1000); ++ udelay(d); ++ usec -= d; ++ } ++} ++ ++ ++/* Clone a packet. ++ * The pkttag contents are NOT cloned. ++ */ ++void * ++osl_pktdup(osl_t *osh, void *skb) ++{ ++ void * p; ++ unsigned long irqflags; ++ ++ /* clear the CTFBUF flag if set and map the rest of the buffer ++ * before cloning. ++ */ ++ PKTCTFMAP(osh, skb); ++ ++ if ((p = skb_clone((struct sk_buff *)skb, GFP_ATOMIC)) == NULL) ++ return NULL; ++ ++#ifdef CTFPOOL ++ if (PKTISFAST(osh, skb)) { ++ ctfpool_t *ctfpool; ++ ++ /* if the buffer allocated from ctfpool is cloned then ++ * we can't be sure when it will be freed. since there ++ * is a chance that we will be losing a buffer ++ * from our pool, we increment the refill count for the ++ * object to be alloced later. ++ */ ++ ctfpool = (ctfpool_t *)CTFPOOLPTR(osh, skb); ++ ASSERT(ctfpool != NULL); ++ PKTCLRFAST(osh, p); ++ PKTCLRFAST(osh, skb); ++ ctfpool->refills++; ++ } ++#endif /* CTFPOOL */ ++ ++ /* skb_clone copies skb->cb.. we don't want that */ ++ if (osh->pub.pkttag) ++ bzero((void*)((struct sk_buff *)p)->cb, OSL_PKTTAG_SZ); ++ ++ /* Increment the packet counter */ ++ spin_lock_irqsave(&osh->pktalloc_lock, irqflags); ++ osh->pub.pktalloced++; ++ spin_unlock_irqrestore(&osh->pktalloc_lock, irqflags); ++ return (p); ++} ++ ++ ++/* ++ * OSLREGOPS specifies the use of osl_XXX routines to be used for register access ++ */ ++ ++/* ++ * BINOSL selects the slightly slower function-call-based binary compatible osl. ++ */ ++ ++/* Linux Kernel: File Operations: start */ ++void * ++osl_os_open_image(char *filename) ++{ ++ struct file *fp; ++ ++ fp = filp_open(filename, O_RDONLY, 0); ++ /* ++ * 2.6.11 (FC4) supports filp_open() but later revs don't? ++ * Alternative: ++ * fp = open_namei(AT_FDCWD, filename, O_RD, 0); ++ * ??? ++ */ ++ if (IS_ERR(fp)) ++ fp = NULL; ++ ++ return fp; ++} ++ ++int ++osl_os_get_image_block(char *buf, int len, void *image) ++{ ++ struct file *fp = (struct file *)image; ++ int rdlen; ++ ++ if (!image) ++ return 0; ++ ++ rdlen = kernel_read(fp, fp->f_pos, buf, len); ++ if (rdlen > 0) ++ fp->f_pos += rdlen; ++ ++ return rdlen; ++} ++ ++void ++osl_os_close_image(void *image) ++{ ++ if (image) ++ filp_close((struct file *)image, NULL); ++} ++/* Linux Kernel: File Operations: end */ +diff --git a/drivers/net/wireless/ap6210/sbutils.c b/drivers/net/wireless/ap6210/sbutils.c +new file mode 100644 +index 0000000..89f9eb3 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/sbutils.c +@@ -0,0 +1,1003 @@ ++/* ++ * Misc utility routines for accessing chip-specific features ++ * of the SiliconBackplane-based Broadcom chips. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: sbutils.c 310902 2012-01-26 19:45:33Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "siutils_priv.h" ++ ++#include ++ ++ ++/* local prototypes */ ++static uint _sb_coreidx(si_info_t *sii, uint32 sba); ++static uint _sb_scan(si_info_t *sii, uint32 sba, void *regs, uint bus, uint32 sbba, ++ uint ncores); ++static uint32 _sb_coresba(si_info_t *sii); ++static void *_sb_setcoreidx(si_info_t *sii, uint coreidx); ++ ++#define SET_SBREG(sii, r, mask, val) \ ++ W_SBREG((sii), (r), ((R_SBREG((sii), (r)) & ~(mask)) | (val))) ++#define REGS2SB(va) (sbconfig_t*) ((int8*)(va) + SBCONFIGOFF) ++ ++/* sonicsrev */ ++#define SONICS_2_2 (SBIDL_RV_2_2 >> SBIDL_RV_SHIFT) ++#define SONICS_2_3 (SBIDL_RV_2_3 >> SBIDL_RV_SHIFT) ++ ++#define R_SBREG(sii, sbr) sb_read_sbreg((sii), (sbr)) ++#define W_SBREG(sii, sbr, v) sb_write_sbreg((sii), (sbr), (v)) ++#define AND_SBREG(sii, sbr, v) W_SBREG((sii), (sbr), (R_SBREG((sii), (sbr)) & (v))) ++#define OR_SBREG(sii, sbr, v) W_SBREG((sii), (sbr), (R_SBREG((sii), (sbr)) | (v))) ++ ++static uint32 ++sb_read_sbreg(si_info_t *sii, volatile uint32 *sbr) ++{ ++ uint8 tmp; ++ uint32 val, intr_val = 0; ++ ++ ++ /* ++ * compact flash only has 11 bits address, while we needs 12 bits address. ++ * MEM_SEG will be OR'd with other 11 bits address in hardware, ++ * so we program MEM_SEG with 12th bit when necessary(access sb regsiters). ++ * For normal PCMCIA bus(CFTable_regwinsz > 2k), do nothing special ++ */ ++ if (PCMCIA(sii)) { ++ INTR_OFF(sii, intr_val); ++ tmp = 1; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, MEM_SEG, &tmp, 1); ++ sbr = (volatile uint32 *)((uintptr)sbr & ~(1 << 11)); /* mask out bit 11 */ ++ } ++ ++ val = R_REG(sii->osh, sbr); ++ ++ if (PCMCIA(sii)) { ++ tmp = 0; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, MEM_SEG, &tmp, 1); ++ INTR_RESTORE(sii, intr_val); ++ } ++ ++ return (val); ++} ++ ++static void ++sb_write_sbreg(si_info_t *sii, volatile uint32 *sbr, uint32 v) ++{ ++ uint8 tmp; ++ volatile uint32 dummy; ++ uint32 intr_val = 0; ++ ++ ++ /* ++ * compact flash only has 11 bits address, while we needs 12 bits address. ++ * MEM_SEG will be OR'd with other 11 bits address in hardware, ++ * so we program MEM_SEG with 12th bit when necessary(access sb regsiters). ++ * For normal PCMCIA bus(CFTable_regwinsz > 2k), do nothing special ++ */ ++ if (PCMCIA(sii)) { ++ INTR_OFF(sii, intr_val); ++ tmp = 1; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, MEM_SEG, &tmp, 1); ++ sbr = (volatile uint32 *)((uintptr)sbr & ~(1 << 11)); /* mask out bit 11 */ ++ } ++ ++ if (BUSTYPE(sii->pub.bustype) == PCMCIA_BUS) { ++ dummy = R_REG(sii->osh, sbr); ++ BCM_REFERENCE(dummy); ++ W_REG(sii->osh, (volatile uint16 *)sbr, (uint16)(v & 0xffff)); ++ dummy = R_REG(sii->osh, sbr); ++ BCM_REFERENCE(dummy); ++ W_REG(sii->osh, ((volatile uint16 *)sbr + 1), (uint16)((v >> 16) & 0xffff)); ++ } else ++ W_REG(sii->osh, sbr, v); ++ ++ if (PCMCIA(sii)) { ++ tmp = 0; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, MEM_SEG, &tmp, 1); ++ INTR_RESTORE(sii, intr_val); ++ } ++} ++ ++uint ++sb_coreid(si_t *sih) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ return ((R_SBREG(sii, &sb->sbidhigh) & SBIDH_CC_MASK) >> SBIDH_CC_SHIFT); ++} ++ ++uint ++sb_intflag(si_t *sih) ++{ ++ si_info_t *sii; ++ void *corereg; ++ sbconfig_t *sb; ++ uint origidx, intflag, intr_val = 0; ++ ++ sii = SI_INFO(sih); ++ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ corereg = si_setcore(sih, CC_CORE_ID, 0); ++ ASSERT(corereg != NULL); ++ sb = REGS2SB(corereg); ++ intflag = R_SBREG(sii, &sb->sbflagst); ++ sb_setcoreidx(sih, origidx); ++ INTR_RESTORE(sii, intr_val); ++ ++ return intflag; ++} ++ ++uint ++sb_flag(si_t *sih) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ return R_SBREG(sii, &sb->sbtpsflag) & SBTPS_NUM0_MASK; ++} ++ ++void ++sb_setint(si_t *sih, int siflag) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ uint32 vec; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ if (siflag == -1) ++ vec = 0; ++ else ++ vec = 1 << siflag; ++ W_SBREG(sii, &sb->sbintvec, vec); ++} ++ ++/* return core index of the core with address 'sba' */ ++static uint ++_sb_coreidx(si_info_t *sii, uint32 sba) ++{ ++ uint i; ++ ++ for (i = 0; i < sii->numcores; i ++) ++ if (sba == sii->coresba[i]) ++ return i; ++ return BADIDX; ++} ++ ++/* return core address of the current core */ ++static uint32 ++_sb_coresba(si_info_t *sii) ++{ ++ uint32 sbaddr; ++ ++ ++ switch (BUSTYPE(sii->pub.bustype)) { ++ case SI_BUS: { ++ sbconfig_t *sb = REGS2SB(sii->curmap); ++ sbaddr = sb_base(R_SBREG(sii, &sb->sbadmatch0)); ++ break; ++ } ++ ++ case PCI_BUS: ++ sbaddr = OSL_PCI_READ_CONFIG(sii->osh, PCI_BAR0_WIN, sizeof(uint32)); ++ break; ++ ++ case PCMCIA_BUS: { ++ uint8 tmp = 0; ++ OSL_PCMCIA_READ_ATTR(sii->osh, PCMCIA_ADDR0, &tmp, 1); ++ sbaddr = (uint32)tmp << 12; ++ OSL_PCMCIA_READ_ATTR(sii->osh, PCMCIA_ADDR1, &tmp, 1); ++ sbaddr |= (uint32)tmp << 16; ++ OSL_PCMCIA_READ_ATTR(sii->osh, PCMCIA_ADDR2, &tmp, 1); ++ sbaddr |= (uint32)tmp << 24; ++ break; ++ } ++ ++ case SPI_BUS: ++ case SDIO_BUS: ++ sbaddr = (uint32)(uintptr)sii->curmap; ++ break; ++ ++ ++ default: ++ sbaddr = BADCOREADDR; ++ break; ++ } ++ ++ return sbaddr; ++} ++ ++uint ++sb_corevendor(si_t *sih) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ return ((R_SBREG(sii, &sb->sbidhigh) & SBIDH_VC_MASK) >> SBIDH_VC_SHIFT); ++} ++ ++uint ++sb_corerev(si_t *sih) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ uint sbidh; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ sbidh = R_SBREG(sii, &sb->sbidhigh); ++ ++ return (SBCOREREV(sbidh)); ++} ++ ++/* set core-specific control flags */ ++void ++sb_core_cflags_wo(si_t *sih, uint32 mask, uint32 val) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ uint32 w; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ ASSERT((val & ~mask) == 0); ++ ++ /* mask and set */ ++ w = (R_SBREG(sii, &sb->sbtmstatelow) & ~(mask << SBTML_SICF_SHIFT)) | ++ (val << SBTML_SICF_SHIFT); ++ W_SBREG(sii, &sb->sbtmstatelow, w); ++} ++ ++/* set/clear core-specific control flags */ ++uint32 ++sb_core_cflags(si_t *sih, uint32 mask, uint32 val) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ uint32 w; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ ASSERT((val & ~mask) == 0); ++ ++ /* mask and set */ ++ if (mask || val) { ++ w = (R_SBREG(sii, &sb->sbtmstatelow) & ~(mask << SBTML_SICF_SHIFT)) | ++ (val << SBTML_SICF_SHIFT); ++ W_SBREG(sii, &sb->sbtmstatelow, w); ++ } ++ ++ /* return the new value ++ * for write operation, the following readback ensures the completion of write opration. ++ */ ++ return (R_SBREG(sii, &sb->sbtmstatelow) >> SBTML_SICF_SHIFT); ++} ++ ++/* set/clear core-specific status flags */ ++uint32 ++sb_core_sflags(si_t *sih, uint32 mask, uint32 val) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ uint32 w; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ ASSERT((val & ~mask) == 0); ++ ASSERT((mask & ~SISF_CORE_BITS) == 0); ++ ++ /* mask and set */ ++ if (mask || val) { ++ w = (R_SBREG(sii, &sb->sbtmstatehigh) & ~(mask << SBTMH_SISF_SHIFT)) | ++ (val << SBTMH_SISF_SHIFT); ++ W_SBREG(sii, &sb->sbtmstatehigh, w); ++ } ++ ++ /* return the new value */ ++ return (R_SBREG(sii, &sb->sbtmstatehigh) >> SBTMH_SISF_SHIFT); ++} ++ ++bool ++sb_iscoreup(si_t *sih) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ return ((R_SBREG(sii, &sb->sbtmstatelow) & ++ (SBTML_RESET | SBTML_REJ_MASK | (SICF_CLOCK_EN << SBTML_SICF_SHIFT))) == ++ (SICF_CLOCK_EN << SBTML_SICF_SHIFT)); ++} ++ ++/* ++ * Switch to 'coreidx', issue a single arbitrary 32bit register mask&set operation, ++ * switch back to the original core, and return the new value. ++ * ++ * When using the silicon backplane, no fidleing with interrupts or core switches are needed. ++ * ++ * Also, when using pci/pcie, we can optimize away the core switching for pci registers ++ * and (on newer pci cores) chipcommon registers. ++ */ ++uint ++sb_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) ++{ ++ uint origidx = 0; ++ uint32 *r = NULL; ++ uint w; ++ uint intr_val = 0; ++ bool fast = FALSE; ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ ASSERT(GOODIDX(coreidx)); ++ ASSERT(regoff < SI_CORE_SIZE); ++ ASSERT((val & ~mask) == 0); ++ ++ if (coreidx >= SI_MAXCORES) ++ return 0; ++ ++ if (BUSTYPE(sii->pub.bustype) == SI_BUS) { ++ /* If internal bus, we can always get at everything */ ++ fast = TRUE; ++ /* map if does not exist */ ++ if (!sii->regs[coreidx]) { ++ sii->regs[coreidx] = REG_MAP(sii->coresba[coreidx], ++ SI_CORE_SIZE); ++ ASSERT(GOODREGS(sii->regs[coreidx])); ++ } ++ r = (uint32 *)((uchar *)sii->regs[coreidx] + regoff); ++ } else if (BUSTYPE(sii->pub.bustype) == PCI_BUS) { ++ /* If pci/pcie, we can get at pci/pcie regs and on newer cores to chipc */ ++ ++ if ((sii->coreid[coreidx] == CC_CORE_ID) && SI_FAST(sii)) { ++ /* Chipc registers are mapped at 12KB */ ++ ++ fast = TRUE; ++ r = (uint32 *)((char *)sii->curmap + PCI_16KB0_CCREGS_OFFSET + regoff); ++ } else if (sii->pub.buscoreidx == coreidx) { ++ /* pci registers are at either in the last 2KB of an 8KB window ++ * or, in pcie and pci rev 13 at 8KB ++ */ ++ fast = TRUE; ++ if (SI_FAST(sii)) ++ r = (uint32 *)((char *)sii->curmap + ++ PCI_16KB0_PCIREGS_OFFSET + regoff); ++ else ++ r = (uint32 *)((char *)sii->curmap + ++ ((regoff >= SBCONFIGOFF) ? ++ PCI_BAR0_PCISBR_OFFSET : PCI_BAR0_PCIREGS_OFFSET) + ++ regoff); ++ } ++ } ++ ++ if (!fast) { ++ INTR_OFF(sii, intr_val); ++ ++ /* save current core index */ ++ origidx = si_coreidx(&sii->pub); ++ ++ /* switch core */ ++ r = (uint32*) ((uchar*)sb_setcoreidx(&sii->pub, coreidx) + regoff); ++ } ++ ASSERT(r != NULL); ++ ++ /* mask and set */ ++ if (mask || val) { ++ if (regoff >= SBCONFIGOFF) { ++ w = (R_SBREG(sii, r) & ~mask) | val; ++ W_SBREG(sii, r, w); ++ } else { ++ w = (R_REG(sii->osh, r) & ~mask) | val; ++ W_REG(sii->osh, r, w); ++ } ++ } ++ ++ /* readback */ ++ if (regoff >= SBCONFIGOFF) ++ w = R_SBREG(sii, r); ++ else { ++ if ((CHIPID(sii->pub.chip) == BCM5354_CHIP_ID) && ++ (coreidx == SI_CC_IDX) && ++ (regoff == OFFSETOF(chipcregs_t, watchdog))) { ++ w = val; ++ } else ++ w = R_REG(sii->osh, r); ++ } ++ ++ if (!fast) { ++ /* restore core index */ ++ if (origidx != coreidx) ++ sb_setcoreidx(&sii->pub, origidx); ++ ++ INTR_RESTORE(sii, intr_val); ++ } ++ ++ return (w); ++} ++ ++/* Scan the enumeration space to find all cores starting from the given ++ * bus 'sbba'. Append coreid and other info to the lists in 'si'. 'sba' ++ * is the default core address at chip POR time and 'regs' is the virtual ++ * address that the default core is mapped at. 'ncores' is the number of ++ * cores expected on bus 'sbba'. It returns the total number of cores ++ * starting from bus 'sbba', inclusive. ++ */ ++#define SB_MAXBUSES 2 ++static uint ++_sb_scan(si_info_t *sii, uint32 sba, void *regs, uint bus, uint32 sbba, uint numcores) ++{ ++ uint next; ++ uint ncc = 0; ++ uint i; ++ ++ if (bus >= SB_MAXBUSES) { ++ AP6210_ERR("_sb_scan: bus 0x%08x at level %d is too deep to scan\n", sbba, bus); ++ return 0; ++ } ++ AP6210_DEBUG("_sb_scan: scan bus 0x%08x assume %u cores\n", sbba, numcores); ++ ++ /* Scan all cores on the bus starting from core 0. ++ * Core addresses must be contiguous on each bus. ++ */ ++ for (i = 0, next = sii->numcores; i < numcores && next < SB_BUS_MAXCORES; i++, next++) { ++ sii->coresba[next] = sbba + (i * SI_CORE_SIZE); ++ ++ /* keep and reuse the initial register mapping */ ++ if ((BUSTYPE(sii->pub.bustype) == SI_BUS) && (sii->coresba[next] == sba)) { ++ AP6210_DEBUG("_sb_scan: reuse mapped regs %p for core %u\n", regs, next); ++ sii->regs[next] = regs; ++ } ++ ++ /* change core to 'next' and read its coreid */ ++ sii->curmap = _sb_setcoreidx(sii, next); ++ sii->curidx = next; ++ ++ sii->coreid[next] = sb_coreid(&sii->pub); ++ ++ /* core specific processing... */ ++ /* chipc provides # cores */ ++ if (sii->coreid[next] == CC_CORE_ID) { ++ chipcregs_t *cc = (chipcregs_t *)sii->curmap; ++ uint32 ccrev = sb_corerev(&sii->pub); ++ ++ /* determine numcores - this is the total # cores in the chip */ ++ if (((ccrev == 4) || (ccrev >= 6))) ++ numcores = (R_REG(sii->osh, &cc->chipid) & CID_CC_MASK) >> ++ CID_CC_SHIFT; ++ else { ++ /* Older chips */ ++ uint chip = CHIPID(sii->pub.chip); ++ ++ if (chip == BCM4306_CHIP_ID) /* < 4306c0 */ ++ numcores = 6; ++ else if (chip == BCM4704_CHIP_ID) ++ numcores = 9; ++ else if (chip == BCM5365_CHIP_ID) ++ numcores = 7; ++ else { ++ AP6210_ERR("sb_chip2numcores: unsupported chip 0x%x\n", ++ chip); ++ ASSERT(0); ++ numcores = 1; ++ } ++ } ++ AP6210_DEBUG("_sb_scan: there are %u cores in the chip %s\n", numcores, ++ sii->pub.issim ? "QT" : ""); ++ } ++ /* scan bridged SB(s) and add results to the end of the list */ ++ else if (sii->coreid[next] == OCP_CORE_ID) { ++ sbconfig_t *sb = REGS2SB(sii->curmap); ++ uint32 nsbba = R_SBREG(sii, &sb->sbadmatch1); ++ uint nsbcc; ++ ++ sii->numcores = next + 1; ++ ++ if ((nsbba & 0xfff00000) != SI_ENUM_BASE) ++ continue; ++ nsbba &= 0xfffff000; ++ if (_sb_coreidx(sii, nsbba) != BADIDX) ++ continue; ++ ++ nsbcc = (R_SBREG(sii, &sb->sbtmstatehigh) & 0x000f0000) >> 16; ++ nsbcc = _sb_scan(sii, sba, regs, bus + 1, nsbba, nsbcc); ++ if (sbba == SI_ENUM_BASE) ++ numcores -= nsbcc; ++ ncc += nsbcc; ++ } ++ } ++ ++ AP6210_DEBUG("_sb_scan: found %u cores on bus 0x%08x\n", i, sbba); ++ ++ sii->numcores = i + ncc; ++ return sii->numcores; ++} ++ ++/* scan the sb enumerated space to identify all cores */ ++void ++sb_scan(si_t *sih, void *regs, uint devid) ++{ ++ si_info_t *sii; ++ uint32 origsba; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ sii->pub.socirev = (R_SBREG(sii, &sb->sbidlow) & SBIDL_RV_MASK) >> SBIDL_RV_SHIFT; ++ ++ /* Save the current core info and validate it later till we know ++ * for sure what is good and what is bad. ++ */ ++ origsba = _sb_coresba(sii); ++ ++ /* scan all SB(s) starting from SI_ENUM_BASE */ ++ sii->numcores = _sb_scan(sii, origsba, regs, 0, SI_ENUM_BASE, 1); ++} ++ ++/* ++ * This function changes logical "focus" to the indicated core; ++ * must be called with interrupts off. ++ * Moreover, callers should keep interrupts off during switching out of and back to d11 core ++ */ ++void * ++sb_setcoreidx(si_t *sih, uint coreidx) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ if (coreidx >= sii->numcores) ++ return (NULL); ++ ++ /* ++ * If the user has provided an interrupt mask enabled function, ++ * then assert interrupts are disabled before switching the core. ++ */ ++ ASSERT((sii->intrsenabled_fn == NULL) || !(*(sii)->intrsenabled_fn)((sii)->intr_arg)); ++ ++ sii->curmap = _sb_setcoreidx(sii, coreidx); ++ sii->curidx = coreidx; ++ ++ return (sii->curmap); ++} ++ ++/* This function changes the logical "focus" to the indicated core. ++ * Return the current core's virtual address. ++ */ ++static void * ++_sb_setcoreidx(si_info_t *sii, uint coreidx) ++{ ++ uint32 sbaddr = sii->coresba[coreidx]; ++ void *regs; ++ ++ switch (BUSTYPE(sii->pub.bustype)) { ++ case SI_BUS: ++ /* map new one */ ++ if (!sii->regs[coreidx]) { ++ sii->regs[coreidx] = REG_MAP(sbaddr, SI_CORE_SIZE); ++ ASSERT(GOODREGS(sii->regs[coreidx])); ++ } ++ regs = sii->regs[coreidx]; ++ break; ++ ++ case PCI_BUS: ++ /* point bar0 window */ ++ OSL_PCI_WRITE_CONFIG(sii->osh, PCI_BAR0_WIN, 4, sbaddr); ++ regs = sii->curmap; ++ break; ++ ++ case PCMCIA_BUS: { ++ uint8 tmp = (sbaddr >> 12) & 0x0f; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, PCMCIA_ADDR0, &tmp, 1); ++ tmp = (sbaddr >> 16) & 0xff; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, PCMCIA_ADDR1, &tmp, 1); ++ tmp = (sbaddr >> 24) & 0xff; ++ OSL_PCMCIA_WRITE_ATTR(sii->osh, PCMCIA_ADDR2, &tmp, 1); ++ regs = sii->curmap; ++ break; ++ } ++ case SPI_BUS: ++ case SDIO_BUS: ++ /* map new one */ ++ if (!sii->regs[coreidx]) { ++ sii->regs[coreidx] = (void *)(uintptr)sbaddr; ++ ASSERT(GOODREGS(sii->regs[coreidx])); ++ } ++ regs = sii->regs[coreidx]; ++ break; ++ ++ ++ default: ++ ASSERT(0); ++ regs = NULL; ++ break; ++ } ++ ++ return regs; ++} ++ ++/* Return the address of sbadmatch0/1/2/3 register */ ++static volatile uint32 * ++sb_admatch(si_info_t *sii, uint asidx) ++{ ++ sbconfig_t *sb; ++ volatile uint32 *addrm; ++ ++ sb = REGS2SB(sii->curmap); ++ ++ switch (asidx) { ++ case 0: ++ addrm = &sb->sbadmatch0; ++ break; ++ ++ case 1: ++ addrm = &sb->sbadmatch1; ++ break; ++ ++ case 2: ++ addrm = &sb->sbadmatch2; ++ break; ++ ++ case 3: ++ addrm = &sb->sbadmatch3; ++ break; ++ ++ default: ++ AP6210_ERR("%s: Address space index (%d) out of range\n", __FUNCTION__, asidx); ++ return 0; ++ } ++ ++ return (addrm); ++} ++ ++/* Return the number of address spaces in current core */ ++int ++sb_numaddrspaces(si_t *sih) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ sb = REGS2SB(sii->curmap); ++ ++ /* + 1 because of enumeration space */ ++ return ((R_SBREG(sii, &sb->sbidlow) & SBIDL_AR_MASK) >> SBIDL_AR_SHIFT) + 1; ++} ++ ++/* Return the address of the nth address space in the current core */ ++uint32 ++sb_addrspace(si_t *sih, uint asidx) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ return (sb_base(R_SBREG(sii, sb_admatch(sii, asidx)))); ++} ++ ++/* Return the size of the nth address space in the current core */ ++uint32 ++sb_addrspacesize(si_t *sih, uint asidx) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ return (sb_size(R_SBREG(sii, sb_admatch(sii, asidx)))); ++} ++ ++ ++/* do buffered registers update */ ++void ++sb_commit(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ ++ sii = SI_INFO(sih); ++ ++ origidx = sii->curidx; ++ ASSERT(GOODIDX(origidx)); ++ ++ INTR_OFF(sii, intr_val); ++ ++ /* switch over to chipcommon core if there is one, else use pci */ ++ if (sii->pub.ccrev != NOREV) { ++ chipcregs_t *ccregs = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ASSERT(ccregs != NULL); ++ ++ /* do the buffer registers update */ ++ W_REG(sii->osh, &ccregs->broadcastaddress, SB_COMMIT); ++ W_REG(sii->osh, &ccregs->broadcastdata, 0x0); ++ } else ++ ASSERT(0); ++ ++ /* restore core index */ ++ sb_setcoreidx(sih, origidx); ++ INTR_RESTORE(sii, intr_val); ++} ++ ++void ++sb_core_disable(si_t *sih, uint32 bits) ++{ ++ si_info_t *sii; ++ volatile uint32 dummy; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ ++ ASSERT(GOODREGS(sii->curmap)); ++ sb = REGS2SB(sii->curmap); ++ ++ /* if core is already in reset, just return */ ++ if (R_SBREG(sii, &sb->sbtmstatelow) & SBTML_RESET) ++ return; ++ ++ /* if clocks are not enabled, put into reset and return */ ++ if ((R_SBREG(sii, &sb->sbtmstatelow) & (SICF_CLOCK_EN << SBTML_SICF_SHIFT)) == 0) ++ goto disable; ++ ++ /* set target reject and spin until busy is clear (preserve core-specific bits) */ ++ OR_SBREG(sii, &sb->sbtmstatelow, SBTML_REJ); ++ dummy = R_SBREG(sii, &sb->sbtmstatelow); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++ SPINWAIT((R_SBREG(sii, &sb->sbtmstatehigh) & SBTMH_BUSY), 100000); ++ if (R_SBREG(sii, &sb->sbtmstatehigh) & SBTMH_BUSY) ++ AP6210_ERR("%s: target state still busy\n", __FUNCTION__); ++ ++ if (R_SBREG(sii, &sb->sbidlow) & SBIDL_INIT) { ++ OR_SBREG(sii, &sb->sbimstate, SBIM_RJ); ++ dummy = R_SBREG(sii, &sb->sbimstate); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++ SPINWAIT((R_SBREG(sii, &sb->sbimstate) & SBIM_BY), 100000); ++ } ++ ++ /* set reset and reject while enabling the clocks */ ++ W_SBREG(sii, &sb->sbtmstatelow, ++ (((bits | SICF_FGC | SICF_CLOCK_EN) << SBTML_SICF_SHIFT) | ++ SBTML_REJ | SBTML_RESET)); ++ dummy = R_SBREG(sii, &sb->sbtmstatelow); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(10); ++ ++ /* don't forget to clear the initiator reject bit */ ++ if (R_SBREG(sii, &sb->sbidlow) & SBIDL_INIT) ++ AND_SBREG(sii, &sb->sbimstate, ~SBIM_RJ); ++ ++disable: ++ /* leave reset and reject asserted */ ++ W_SBREG(sii, &sb->sbtmstatelow, ((bits << SBTML_SICF_SHIFT) | SBTML_REJ | SBTML_RESET)); ++ OSL_DELAY(1); ++} ++ ++/* reset and re-enable a core ++ * inputs: ++ * bits - core specific bits that are set during and after reset sequence ++ * resetbits - core specific bits that are set only during reset sequence ++ */ ++void ++sb_core_reset(si_t *sih, uint32 bits, uint32 resetbits) ++{ ++ si_info_t *sii; ++ sbconfig_t *sb; ++ volatile uint32 dummy; ++ ++ sii = SI_INFO(sih); ++ ASSERT(GOODREGS(sii->curmap)); ++ sb = REGS2SB(sii->curmap); ++ ++ /* ++ * Must do the disable sequence first to work for arbitrary current core state. ++ */ ++ sb_core_disable(sih, (bits | resetbits)); ++ ++ /* ++ * Now do the initialization sequence. ++ */ ++ ++ /* set reset while enabling the clock and forcing them on throughout the core */ ++ W_SBREG(sii, &sb->sbtmstatelow, ++ (((bits | resetbits | SICF_FGC | SICF_CLOCK_EN) << SBTML_SICF_SHIFT) | ++ SBTML_RESET)); ++ dummy = R_SBREG(sii, &sb->sbtmstatelow); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++ ++ if (R_SBREG(sii, &sb->sbtmstatehigh) & SBTMH_SERR) { ++ W_SBREG(sii, &sb->sbtmstatehigh, 0); ++ } ++ if ((dummy = R_SBREG(sii, &sb->sbimstate)) & (SBIM_IBE | SBIM_TO)) { ++ AND_SBREG(sii, &sb->sbimstate, ~(SBIM_IBE | SBIM_TO)); ++ } ++ ++ /* clear reset and allow it to propagate throughout the core */ ++ W_SBREG(sii, &sb->sbtmstatelow, ++ ((bits | resetbits | SICF_FGC | SICF_CLOCK_EN) << SBTML_SICF_SHIFT)); ++ dummy = R_SBREG(sii, &sb->sbtmstatelow); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++ ++ /* leave clock enabled */ ++ W_SBREG(sii, &sb->sbtmstatelow, ((bits | SICF_CLOCK_EN) << SBTML_SICF_SHIFT)); ++ dummy = R_SBREG(sii, &sb->sbtmstatelow); ++ BCM_REFERENCE(dummy); ++ OSL_DELAY(1); ++} ++ ++/* ++ * Set the initiator timeout for the "master core". ++ * The master core is defined to be the core in control ++ * of the chip and so it issues accesses to non-memory ++ * locations (Because of dma *any* core can access memeory). ++ * ++ * The routine uses the bus to decide who is the master: ++ * SI_BUS => mips ++ * JTAG_BUS => chipc ++ * PCI_BUS => pci or pcie ++ * PCMCIA_BUS => pcmcia ++ * SDIO_BUS => pcmcia ++ * ++ * This routine exists so callers can disable initiator ++ * timeouts so accesses to very slow devices like otp ++ * won't cause an abort. The routine allows arbitrary ++ * settings of the service and request timeouts, though. ++ * ++ * Returns the timeout state before changing it or -1 ++ * on error. ++ */ ++ ++#define TO_MASK (SBIMCL_RTO_MASK | SBIMCL_STO_MASK) ++ ++uint32 ++sb_set_initiator_to(si_t *sih, uint32 to, uint idx) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ uint32 tmp, ret = 0xffffffff; ++ sbconfig_t *sb; ++ ++ sii = SI_INFO(sih); ++ ++ if ((to & ~TO_MASK) != 0) ++ return ret; ++ ++ /* Figure out the master core */ ++ if (idx == BADIDX) { ++ switch (BUSTYPE(sii->pub.bustype)) { ++ case PCI_BUS: ++ idx = sii->pub.buscoreidx; ++ break; ++ case JTAG_BUS: ++ idx = SI_CC_IDX; ++ break; ++ case PCMCIA_BUS: ++ case SDIO_BUS: ++ idx = si_findcoreidx(sih, PCMCIA_CORE_ID, 0); ++ break; ++ case SI_BUS: ++ idx = si_findcoreidx(sih, MIPS33_CORE_ID, 0); ++ break; ++ default: ++ ASSERT(0); ++ } ++ if (idx == BADIDX) ++ return ret; ++ } ++ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ sb = REGS2SB(sb_setcoreidx(sih, idx)); ++ ++ tmp = R_SBREG(sii, &sb->sbimconfiglow); ++ ret = tmp & TO_MASK; ++ W_SBREG(sii, &sb->sbimconfiglow, (tmp & ~TO_MASK) | to); ++ ++ sb_commit(sih); ++ sb_setcoreidx(sih, origidx); ++ INTR_RESTORE(sii, intr_val); ++ return ret; ++} ++ ++uint32 ++sb_base(uint32 admatch) ++{ ++ uint32 base; ++ uint type; ++ ++ type = admatch & SBAM_TYPE_MASK; ++ ASSERT(type < 3); ++ ++ base = 0; ++ ++ if (type == 0) { ++ base = admatch & SBAM_BASE0_MASK; ++ } else if (type == 1) { ++ ASSERT(!(admatch & SBAM_ADNEG)); /* neg not supported */ ++ base = admatch & SBAM_BASE1_MASK; ++ } else if (type == 2) { ++ ASSERT(!(admatch & SBAM_ADNEG)); /* neg not supported */ ++ base = admatch & SBAM_BASE2_MASK; ++ } ++ ++ return (base); ++} ++ ++uint32 ++sb_size(uint32 admatch) ++{ ++ uint32 size; ++ uint type; ++ ++ type = admatch & SBAM_TYPE_MASK; ++ ASSERT(type < 3); ++ ++ size = 0; ++ ++ if (type == 0) { ++ size = 1 << (((admatch & SBAM_ADINT0_MASK) >> SBAM_ADINT0_SHIFT) + 1); ++ } else if (type == 1) { ++ ASSERT(!(admatch & SBAM_ADNEG)); /* neg not supported */ ++ size = 1 << (((admatch & SBAM_ADINT1_MASK) >> SBAM_ADINT1_SHIFT) + 1); ++ } else if (type == 2) { ++ ASSERT(!(admatch & SBAM_ADNEG)); /* neg not supported */ ++ size = 1 << (((admatch & SBAM_ADINT2_MASK) >> SBAM_ADINT2_SHIFT) + 1); ++ } ++ ++ return (size); ++} +diff --git a/drivers/net/wireless/ap6210/siutils.c b/drivers/net/wireless/ap6210/siutils.c +new file mode 100644 +index 0000000..f917c41 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/siutils.c +@@ -0,0 +1,2472 @@ ++/* ++ * Misc utility routines for accessing chip-specific features ++ * of the SiliconBackplane-based Broadcom chips. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: siutils.c 347632 2012-07-27 11:00:35Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "siutils_priv.h" ++ ++#include ++ ++/* local prototypes */ ++static si_info_t *si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs, ++ uint bustype, void *sdh, char **vars, uint *varsz); ++static bool si_buscore_prep(si_info_t *sii, uint bustype, uint devid, void *sdh); ++static bool si_buscore_setup(si_info_t *sii, chipcregs_t *cc, uint bustype, uint32 savewin, ++ uint *origidx, void *regs); ++ ++ ++ ++/* global variable to indicate reservation/release of gpio's */ ++static uint32 si_gpioreservation = 0; ++ ++/* global flag to prevent shared resources from being initialized multiple times in si_attach() */ ++ ++int do_4360_pcie2_war = 0; ++ ++/* ++ * Allocate a si handle. ++ * devid - pci device id (used to determine chip#) ++ * osh - opaque OS handle ++ * regs - virtual address of initial core registers ++ * bustype - pci/pcmcia/sb/sdio/etc ++ * vars - pointer to a pointer area for "environment" variables ++ * varsz - pointer to int to return the size of the vars ++ */ ++si_t * ++si_attach(uint devid, osl_t *osh, void *regs, ++ uint bustype, void *sdh, char **vars, uint *varsz) ++{ ++ si_info_t *sii; ++ ++ /* alloc si_info_t */ ++ if ((sii = MALLOC(osh, sizeof (si_info_t))) == NULL) { ++ AP6210_ERR("si_attach: malloc failed! malloced %d bytes\n", MALLOCED(osh)); ++ return (NULL); ++ } ++ ++ if (si_doattach(sii, devid, osh, regs, bustype, sdh, vars, varsz) == NULL) { ++ MFREE(osh, sii, sizeof(si_info_t)); ++ return (NULL); ++ } ++ sii->vars = vars ? *vars : NULL; ++ sii->varsz = varsz ? *varsz : 0; ++ ++ return (si_t *)sii; ++} ++ ++/* global kernel resource */ ++static si_info_t ksii; ++ ++static uint32 wd_msticks; /* watchdog timer ticks normalized to ms */ ++ ++/* generic kernel variant of si_attach() */ ++si_t * ++si_kattach(osl_t *osh) ++{ ++ static bool ksii_attached = FALSE; ++ ++ if (!ksii_attached) { ++ void *regs = NULL; ++ regs = REG_MAP(SI_ENUM_BASE, SI_CORE_SIZE); ++ ++ if (si_doattach(&ksii, BCM4710_DEVICE_ID, osh, regs, ++ SI_BUS, NULL, ++ osh != SI_OSH ? &ksii.vars : NULL, ++ osh != SI_OSH ? &ksii.varsz : NULL) == NULL) { ++ AP6210_ERR("si_kattach: si_doattach failed\n"); ++ REG_UNMAP(regs); ++ return NULL; ++ } ++ REG_UNMAP(regs); ++ ++ /* save ticks normalized to ms for si_watchdog_ms() */ ++ if (PMUCTL_ENAB(&ksii.pub)) { ++ /* based on 32KHz ILP clock */ ++ wd_msticks = 32; ++ } else { ++ wd_msticks = ALP_CLOCK / 1000; ++ } ++ ++ ksii_attached = TRUE; ++ AP6210_DEBUG("si_kattach done. ccrev = %d, wd_msticks = %d\n", ++ ksii.pub.ccrev, wd_msticks); ++ } ++ ++ return &ksii.pub; ++} ++ ++ ++static bool ++si_buscore_prep(si_info_t *sii, uint bustype, uint devid, void *sdh) ++{ ++ /* need to set memseg flag for CF card first before any sb registers access */ ++ if (BUSTYPE(bustype) == PCMCIA_BUS) ++ sii->memseg = TRUE; ++ ++ ++ if (BUSTYPE(bustype) == SDIO_BUS) { ++ int err; ++ uint8 clkset; ++ ++ /* Try forcing SDIO core to do ALPAvail request only */ ++ clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ; ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err); ++ if (!err) { ++ uint8 clkval; ++ ++ /* If register supported, wait for ALPAvail and then force ALP */ ++ clkval = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, NULL); ++ if ((clkval & ~SBSDIO_AVBITS) == clkset) { ++ SPINWAIT(((clkval = bcmsdh_cfg_read(sdh, SDIO_FUNC_1, ++ SBSDIO_FUNC1_CHIPCLKCSR, NULL)), !SBSDIO_ALPAV(clkval)), ++ PMU_MAX_TRANSITION_DLY); ++ if (!SBSDIO_ALPAV(clkval)) { ++ AP6210_ERR("timeout on ALPAV wait, clkval 0x%02x\n", ++ clkval); ++ return FALSE; ++ } ++ clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP; ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_CHIPCLKCSR, ++ clkset, &err); ++ OSL_DELAY(65); ++ } ++ } ++ ++ /* Also, disable the extra SDIO pull-ups */ ++ bcmsdh_cfg_write(sdh, SDIO_FUNC_1, SBSDIO_FUNC1_SDIOPULLUP, 0, NULL); ++ } ++ ++ ++ return TRUE; ++} ++ ++static bool ++si_buscore_setup(si_info_t *sii, chipcregs_t *cc, uint bustype, uint32 savewin, ++ uint *origidx, void *regs) ++{ ++ bool pci, pcie, pcie_gen2 = FALSE; ++ uint i; ++ uint pciidx, pcieidx, pcirev, pcierev; ++ ++ cc = si_setcoreidx(&sii->pub, SI_CC_IDX); ++ ASSERT((uintptr)cc); ++ ++ /* get chipcommon rev */ ++ sii->pub.ccrev = (int)si_corerev(&sii->pub); ++ ++ /* get chipcommon chipstatus */ ++ if (sii->pub.ccrev >= 11) ++ sii->pub.chipst = R_REG(sii->osh, &cc->chipstatus); ++ ++ /* get chipcommon capabilites */ ++ sii->pub.cccaps = R_REG(sii->osh, &cc->capabilities); ++ /* get chipcommon extended capabilities */ ++ ++ if (sii->pub.ccrev >= 35) ++ sii->pub.cccaps_ext = R_REG(sii->osh, &cc->capabilities_ext); ++ ++ /* get pmu rev and caps */ ++ if (sii->pub.cccaps & CC_CAP_PMU) { ++ sii->pub.pmucaps = R_REG(sii->osh, &cc->pmucapabilities); ++ sii->pub.pmurev = sii->pub.pmucaps & PCAP_REV_MASK; ++ } ++ ++ AP6210_DEBUG("Chipc: rev %d, caps 0x%x, chipst 0x%x pmurev %d, pmucaps 0x%x\n", ++ sii->pub.ccrev, sii->pub.cccaps, sii->pub.chipst, sii->pub.pmurev, ++ sii->pub.pmucaps); ++ ++ /* figure out bus/orignal core idx */ ++ sii->pub.buscoretype = NODEV_CORE_ID; ++ sii->pub.buscorerev = (uint)NOREV; ++ sii->pub.buscoreidx = BADIDX; ++ ++ pci = pcie = FALSE; ++ pcirev = pcierev = (uint)NOREV; ++ pciidx = pcieidx = BADIDX; ++ ++ for (i = 0; i < sii->numcores; i++) { ++ uint cid, crev; ++ ++ si_setcoreidx(&sii->pub, i); ++ cid = si_coreid(&sii->pub); ++ crev = si_corerev(&sii->pub); ++ ++ /* Display cores found */ ++ AP6210_DEBUG("CORE[%d]: id 0x%x rev %d base 0x%x regs 0x%p\n", ++ i, cid, crev, sii->coresba[i], sii->regs[i]); ++ ++ if (BUSTYPE(bustype) == PCI_BUS) { ++ if (cid == PCI_CORE_ID) { ++ pciidx = i; ++ pcirev = crev; ++ pci = TRUE; ++ } else if ((cid == PCIE_CORE_ID) || (cid == PCIE2_CORE_ID)) { ++ pcieidx = i; ++ pcierev = crev; ++ pcie = TRUE; ++ if (cid == PCIE2_CORE_ID) ++ pcie_gen2 = TRUE; ++ } ++ } else if ((BUSTYPE(bustype) == PCMCIA_BUS) && ++ (cid == PCMCIA_CORE_ID)) { ++ sii->pub.buscorerev = crev; ++ sii->pub.buscoretype = cid; ++ sii->pub.buscoreidx = i; ++ } ++ else if (((BUSTYPE(bustype) == SDIO_BUS) || ++ (BUSTYPE(bustype) == SPI_BUS)) && ++ ((cid == PCMCIA_CORE_ID) || ++ (cid == SDIOD_CORE_ID))) { ++ sii->pub.buscorerev = crev; ++ sii->pub.buscoretype = cid; ++ sii->pub.buscoreidx = i; ++ } ++ ++ /* find the core idx before entering this func. */ ++ if ((savewin && (savewin == sii->coresba[i])) || ++ (regs == sii->regs[i])) ++ *origidx = i; ++ } ++ ++ if (pci) { ++ sii->pub.buscoretype = PCI_CORE_ID; ++ sii->pub.buscorerev = pcirev; ++ sii->pub.buscoreidx = pciidx; ++ } else if (pcie) { ++ if (pcie_gen2) ++ sii->pub.buscoretype = PCIE2_CORE_ID; ++ else ++ sii->pub.buscoretype = PCIE_CORE_ID; ++ sii->pub.buscorerev = pcierev; ++ sii->pub.buscoreidx = pcieidx; ++ } ++ ++ AP6210_DEBUG("Buscore id/type/rev %d/0x%x/%d\n", sii->pub.buscoreidx, sii->pub.buscoretype, ++ sii->pub.buscorerev); ++ ++ if (BUSTYPE(sii->pub.bustype) == SI_BUS && (CHIPID(sii->pub.chip) == BCM4712_CHIP_ID) && ++ (sii->pub.chippkg != BCM4712LARGE_PKG_ID) && (CHIPREV(sii->pub.chiprev) <= 3)) ++ OR_REG(sii->osh, &cc->slow_clk_ctl, SCC_SS_XTAL); ++ ++ ++ /* Make sure any on-chip ARM is off (in case strapping is wrong), or downloaded code was ++ * already running. ++ */ ++ if ((BUSTYPE(bustype) == SDIO_BUS) || (BUSTYPE(bustype) == SPI_BUS)) { ++ if (si_setcore(&sii->pub, ARM7S_CORE_ID, 0) || ++ si_setcore(&sii->pub, ARMCM3_CORE_ID, 0)) ++ si_core_disable(&sii->pub, 0); ++ } ++ ++ /* return to the original core */ ++ si_setcoreidx(&sii->pub, *origidx); ++ ++ return TRUE; ++} ++ ++ ++ ++ ++static si_info_t * ++si_doattach(si_info_t *sii, uint devid, osl_t *osh, void *regs, ++ uint bustype, void *sdh, char **vars, uint *varsz) ++{ ++ struct si_pub *sih = &sii->pub; ++ uint32 w, savewin; ++ chipcregs_t *cc; ++ char *pvars = NULL; ++ uint origidx; ++ ++ ASSERT(GOODREGS(regs)); ++ ++ bzero((uchar*)sii, sizeof(si_info_t)); ++ ++ savewin = 0; ++ ++ sih->buscoreidx = BADIDX; ++ ++ sii->curmap = regs; ++ sii->sdh = sdh; ++ sii->osh = osh; ++ ++ ++ ++ /* find Chipcommon address */ ++ if (bustype == PCI_BUS) { ++ savewin = OSL_PCI_READ_CONFIG(sii->osh, PCI_BAR0_WIN, sizeof(uint32)); ++ if (!GOODCOREADDR(savewin, SI_ENUM_BASE)) ++ savewin = SI_ENUM_BASE; ++ OSL_PCI_WRITE_CONFIG(sii->osh, PCI_BAR0_WIN, 4, SI_ENUM_BASE); ++ if (!regs) ++ return NULL; ++ cc = (chipcregs_t *)regs; ++ } else if ((bustype == SDIO_BUS) || (bustype == SPI_BUS)) { ++ cc = (chipcregs_t *)sii->curmap; ++ } else { ++ cc = (chipcregs_t *)REG_MAP(SI_ENUM_BASE, SI_CORE_SIZE); ++ } ++ ++ sih->bustype = bustype; ++ if (bustype != BUSTYPE(bustype)) { ++ AP6210_ERR("si_doattach: bus type %d does not match configured bus type %d\n", ++ bustype, BUSTYPE(bustype)); ++ return NULL; ++ } ++ ++ /* bus/core/clk setup for register access */ ++ if (!si_buscore_prep(sii, bustype, devid, sdh)) { ++ AP6210_ERR("si_doattach: si_core_clk_prep failed %d\n", bustype); ++ return NULL; ++ } ++ ++ /* ChipID recognition. ++ * We assume we can read chipid at offset 0 from the regs arg. ++ * If we add other chiptypes (or if we need to support old sdio hosts w/o chipcommon), ++ * some way of recognizing them needs to be added here. ++ */ ++ if (!cc) { ++ AP6210_ERR("%s: chipcommon register space is null \n", __FUNCTION__); ++ return NULL; ++ } ++ w = R_REG(osh, &cc->chipid); ++ sih->socitype = (w & CID_TYPE_MASK) >> CID_TYPE_SHIFT; ++ /* Might as wll fill in chip id rev & pkg */ ++ sih->chip = w & CID_ID_MASK; ++ sih->chiprev = (w & CID_REV_MASK) >> CID_REV_SHIFT; ++ sih->chippkg = (w & CID_PKG_MASK) >> CID_PKG_SHIFT; ++ ++#if defined(HW_OOB) ++ bcmsdh_config_hw_oob_intr(sdh, sih->chip); ++#endif ++ ++ if ((CHIPID(sih->chip) == BCM4329_CHIP_ID) && (sih->chiprev == 0) && ++ (sih->chippkg != BCM4329_289PIN_PKG_ID)) { ++ sih->chippkg = BCM4329_182PIN_PKG_ID; ++ } ++ sih->issim = IS_SIM(sih->chippkg); ++ ++ /* scan for cores */ ++ if (CHIPTYPE(sii->pub.socitype) == SOCI_SB) { ++ AP6210_DEBUG("Found chip type SB (0x%08x)\n", w); ++ sb_scan(&sii->pub, regs, devid); ++ } else if (CHIPTYPE(sii->pub.socitype) == SOCI_AI) { ++ AP6210_DEBUG("Found chip type AI (0x%08x)\n", w); ++ /* pass chipc address instead of original core base */ ++ ai_scan(&sii->pub, (void *)(uintptr)cc, devid); ++ } else if (CHIPTYPE(sii->pub.socitype) == SOCI_UBUS) { ++ AP6210_DEBUG("Found chip type UBUS (0x%08x), chip id = 0x%4x\n", w, sih->chip); ++ /* pass chipc address instead of original core base */ ++ ub_scan(&sii->pub, (void *)(uintptr)cc, devid); ++ } else { ++ AP6210_ERR("Found chip of unknown type (0x%08x)\n", w); ++ return NULL; ++ } ++ /* no cores found, bail out */ ++ if (sii->numcores == 0) { ++ AP6210_ERR("si_doattach: could not find any cores\n"); ++ return NULL; ++ } ++ /* bus/core/clk setup */ ++ origidx = SI_CC_IDX; ++ if (!si_buscore_setup(sii, cc, bustype, savewin, &origidx, regs)) { ++ AP6210_ERR("si_doattach: si_buscore_setup failed\n"); ++ goto exit; ++ } ++ ++ if (CHIPID(sih->chip) == BCM4322_CHIP_ID && (((sih->chipst & CST4322_SPROM_OTP_SEL_MASK) ++ >> CST4322_SPROM_OTP_SEL_SHIFT) == (CST4322_OTP_PRESENT | ++ CST4322_SPROM_PRESENT))) { ++ AP6210_ERR("%s: Invalid setting: both SPROM and OTP strapped.\n", __FUNCTION__); ++ return NULL; ++ } ++ ++ /* assume current core is CC */ ++ if ((sii->pub.ccrev == 0x25) && ((CHIPID(sih->chip) == BCM43236_CHIP_ID || ++ CHIPID(sih->chip) == BCM43235_CHIP_ID || ++ CHIPID(sih->chip) == BCM43234_CHIP_ID || ++ CHIPID(sih->chip) == BCM43238_CHIP_ID) && ++ (CHIPREV(sii->pub.chiprev) <= 2))) { ++ ++ if ((cc->chipstatus & CST43236_BP_CLK) != 0) { ++ uint clkdiv; ++ clkdiv = R_REG(osh, &cc->clkdiv); ++ /* otp_clk_div is even number, 120/14 < 9mhz */ ++ clkdiv = (clkdiv & ~CLKD_OTP) | (14 << CLKD_OTP_SHIFT); ++ W_REG(osh, &cc->clkdiv, clkdiv); ++ AP6210_ERR("%s: set clkdiv to %x\n", __FUNCTION__, clkdiv); ++ } ++ OSL_DELAY(10); ++ } ++ ++ if (bustype == PCI_BUS) { ++ ++ } ++ ++ pvars = NULL; ++ BCM_REFERENCE(pvars); ++ ++ ++ ++ if (sii->pub.ccrev >= 20) { ++ uint32 gpiopullup = 0, gpiopulldown = 0; ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ASSERT(cc != NULL); ++ ++ /* 4314/43142 has pin muxing, don't clear gpio bits */ ++ if ((CHIPID(sih->chip) == BCM4314_CHIP_ID) || ++ (CHIPID(sih->chip) == BCM43142_CHIP_ID)) { ++ gpiopullup |= 0x402e0; ++ gpiopulldown |= 0x20500; ++ } ++ ++ W_REG(osh, &cc->gpiopullup, gpiopullup); ++ W_REG(osh, &cc->gpiopulldown, gpiopulldown); ++ si_setcoreidx(sih, origidx); ++ } ++ ++ ++ /* clear any previous epidiag-induced target abort */ ++ ASSERT(!si_taclear(sih, FALSE)); ++ ++ return (sii); ++ ++exit: ++ ++ return NULL; ++} ++ ++/* may be called with core in reset */ ++void ++si_detach(si_t *sih) ++{ ++ si_info_t *sii; ++ uint idx; ++ ++ ++ sii = SI_INFO(sih); ++ ++ if (sii == NULL) ++ return; ++ ++ if (BUSTYPE(sih->bustype) == SI_BUS) ++ for (idx = 0; idx < SI_MAXCORES; idx++) ++ if (sii->regs[idx]) { ++ REG_UNMAP(sii->regs[idx]); ++ sii->regs[idx] = NULL; ++ } ++ ++ ++ ++#if !defined(BCMBUSTYPE) || (BCMBUSTYPE == SI_BUS) ++ if (sii != &ksii) ++#endif /* !BCMBUSTYPE || (BCMBUSTYPE == SI_BUS) */ ++ MFREE(sii->osh, sii, sizeof(si_info_t)); ++} ++ ++void * ++si_osh(si_t *sih) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ return sii->osh; ++} ++ ++void ++si_setosh(si_t *sih, osl_t *osh) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ if (sii->osh != NULL) { ++ AP6210_ERR("osh is already set....\n"); ++ ASSERT(!sii->osh); ++ } ++ sii->osh = osh; ++} ++ ++/* register driver interrupt disabling and restoring callback functions */ ++void ++si_register_intr_callback(si_t *sih, void *intrsoff_fn, void *intrsrestore_fn, ++ void *intrsenabled_fn, void *intr_arg) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ sii->intr_arg = intr_arg; ++ sii->intrsoff_fn = (si_intrsoff_t)intrsoff_fn; ++ sii->intrsrestore_fn = (si_intrsrestore_t)intrsrestore_fn; ++ sii->intrsenabled_fn = (si_intrsenabled_t)intrsenabled_fn; ++ /* save current core id. when this function called, the current core ++ * must be the core which provides driver functions(il, et, wl, etc.) ++ */ ++ sii->dev_coreid = sii->coreid[sii->curidx]; ++} ++ ++void ++si_deregister_intr_callback(si_t *sih) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ sii->intrsoff_fn = NULL; ++} ++ ++uint ++si_intflag(si_t *sih) ++{ ++ si_info_t *sii = SI_INFO(sih); ++ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_intflag(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return R_REG(sii->osh, ((uint32 *)(uintptr) ++ (sii->oob_router + OOB_STATUSA))); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++uint ++si_flag(si_t *sih) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_flag(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_flag(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_flag(sih); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++void ++si_setint(si_t *sih, int siflag) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ sb_setint(sih, siflag); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ ai_setint(sih, siflag); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ ub_setint(sih, siflag); ++ else ++ ASSERT(0); ++} ++ ++uint ++si_coreid(si_t *sih) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ return sii->coreid[sii->curidx]; ++} ++ ++uint ++si_coreidx(si_t *sih) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ return sii->curidx; ++} ++ ++/* return the core-type instantiation # of the current core */ ++uint ++si_coreunit(si_t *sih) ++{ ++ si_info_t *sii; ++ uint idx; ++ uint coreid; ++ uint coreunit; ++ uint i; ++ ++ sii = SI_INFO(sih); ++ coreunit = 0; ++ ++ idx = sii->curidx; ++ ++ ASSERT(GOODREGS(sii->curmap)); ++ coreid = si_coreid(sih); ++ ++ /* count the cores of our type */ ++ for (i = 0; i < idx; i++) ++ if (sii->coreid[i] == coreid) ++ coreunit++; ++ ++ return (coreunit); ++} ++ ++uint ++si_corevendor(si_t *sih) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_corevendor(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_corevendor(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_corevendor(sih); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++bool ++si_backplane64(si_t *sih) ++{ ++ return ((sih->cccaps & CC_CAP_BKPLN64) != 0); ++} ++ ++uint ++si_corerev(si_t *sih) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_corerev(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_corerev(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_corerev(sih); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++/* return index of coreid or BADIDX if not found */ ++uint ++si_findcoreidx(si_t *sih, uint coreid, uint coreunit) ++{ ++ si_info_t *sii; ++ uint found; ++ uint i; ++ ++ sii = SI_INFO(sih); ++ ++ found = 0; ++ ++ for (i = 0; i < sii->numcores; i++) ++ if (sii->coreid[i] == coreid) { ++ if (found == coreunit) ++ return (i); ++ found++; ++ } ++ ++ return (BADIDX); ++} ++ ++/* return list of found cores */ ++uint ++si_corelist(si_t *sih, uint coreid[]) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ bcopy((uchar*)sii->coreid, (uchar*)coreid, (sii->numcores * sizeof(uint))); ++ return (sii->numcores); ++} ++ ++/* return current register mapping */ ++void * ++si_coreregs(si_t *sih) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ASSERT(GOODREGS(sii->curmap)); ++ ++ return (sii->curmap); ++} ++ ++/* ++ * This function changes logical "focus" to the indicated core; ++ * must be called with interrupts off. ++ * Moreover, callers should keep interrupts off during switching out of and back to d11 core ++ */ ++void * ++si_setcore(si_t *sih, uint coreid, uint coreunit) ++{ ++ uint idx; ++ ++ idx = si_findcoreidx(sih, coreid, coreunit); ++ if (!GOODIDX(idx)) ++ return (NULL); ++ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_setcoreidx(sih, idx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_setcoreidx(sih, idx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_setcoreidx(sih, idx); ++ else { ++ ASSERT(0); ++ return NULL; ++ } ++} ++ ++void * ++si_setcoreidx(si_t *sih, uint coreidx) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_setcoreidx(sih, coreidx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_setcoreidx(sih, coreidx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_setcoreidx(sih, coreidx); ++ else { ++ ASSERT(0); ++ return NULL; ++ } ++} ++ ++/* Turn off interrupt as required by sb_setcore, before switch core */ ++void * ++si_switch_core(si_t *sih, uint coreid, uint *origidx, uint *intr_val) ++{ ++ void *cc; ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ if (SI_FAST(sii)) { ++ /* Overloading the origidx variable to remember the coreid, ++ * this works because the core ids cannot be confused with ++ * core indices. ++ */ ++ *origidx = coreid; ++ if (coreid == CC_CORE_ID) ++ return (void *)CCREGS_FAST(sii); ++ else if (coreid == sih->buscoretype) ++ return (void *)PCIEREGS(sii); ++ } ++ INTR_OFF(sii, *intr_val); ++ *origidx = sii->curidx; ++ cc = si_setcore(sih, coreid, 0); ++ ASSERT(cc != NULL); ++ ++ return cc; ++} ++ ++/* restore coreidx and restore interrupt */ ++void ++si_restore_core(si_t *sih, uint coreid, uint intr_val) ++{ ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ if (SI_FAST(sii) && ((coreid == CC_CORE_ID) || (coreid == sih->buscoretype))) ++ return; ++ ++ si_setcoreidx(sih, coreid); ++ INTR_RESTORE(sii, intr_val); ++} ++ ++int ++si_numaddrspaces(si_t *sih) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_numaddrspaces(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_numaddrspaces(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_numaddrspaces(sih); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++uint32 ++si_addrspace(si_t *sih, uint asidx) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_addrspace(sih, asidx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_addrspace(sih, asidx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_addrspace(sih, asidx); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++uint32 ++si_addrspacesize(si_t *sih, uint asidx) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_addrspacesize(sih, asidx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_addrspacesize(sih, asidx); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_addrspacesize(sih, asidx); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++void ++si_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size) ++{ ++ /* Only supported for SOCI_AI */ ++ if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ ai_coreaddrspaceX(sih, asidx, addr, size); ++ else ++ *size = 0; ++} ++ ++uint32 ++si_core_cflags(si_t *sih, uint32 mask, uint32 val) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_core_cflags(sih, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_core_cflags(sih, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_core_cflags(sih, mask, val); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++void ++si_core_cflags_wo(si_t *sih, uint32 mask, uint32 val) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ sb_core_cflags_wo(sih, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ ai_core_cflags_wo(sih, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ ub_core_cflags_wo(sih, mask, val); ++ else ++ ASSERT(0); ++} ++ ++uint32 ++si_core_sflags(si_t *sih, uint32 mask, uint32 val) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_core_sflags(sih, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_core_sflags(sih, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_core_sflags(sih, mask, val); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++bool ++si_iscoreup(si_t *sih) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_iscoreup(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_iscoreup(sih); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_iscoreup(sih); ++ else { ++ ASSERT(0); ++ return FALSE; ++ } ++} ++ ++uint ++si_wrapperreg(si_t *sih, uint32 offset, uint32 mask, uint32 val) ++{ ++ /* only for AI back plane chips */ ++ if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return (ai_wrap_reg(sih, offset, mask, val)); ++ return 0; ++} ++ ++uint ++si_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ return sb_corereg(sih, coreidx, regoff, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ return ai_corereg(sih, coreidx, regoff, mask, val); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ return ub_corereg(sih, coreidx, regoff, mask, val); ++ else { ++ ASSERT(0); ++ return 0; ++ } ++} ++ ++void ++si_core_disable(si_t *sih, uint32 bits) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ sb_core_disable(sih, bits); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ ai_core_disable(sih, bits); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ ub_core_disable(sih, bits); ++} ++ ++void ++si_core_reset(si_t *sih, uint32 bits, uint32 resetbits) ++{ ++ if (CHIPTYPE(sih->socitype) == SOCI_SB) ++ sb_core_reset(sih, bits, resetbits); ++ else if (CHIPTYPE(sih->socitype) == SOCI_AI) ++ ai_core_reset(sih, bits, resetbits); ++ else if (CHIPTYPE(sih->socitype) == SOCI_UBUS) ++ ub_core_reset(sih, bits, resetbits); ++} ++ ++/* Run bist on current core. Caller needs to take care of core-specific bist hazards */ ++int ++si_corebist(si_t *sih) ++{ ++ uint32 cflags; ++ int result = 0; ++ ++ /* Read core control flags */ ++ cflags = si_core_cflags(sih, 0, 0); ++ ++ /* Set bist & fgc */ ++ si_core_cflags(sih, ~0, (SICF_BIST_EN | SICF_FGC)); ++ ++ /* Wait for bist done */ ++ SPINWAIT(((si_core_sflags(sih, 0, 0) & SISF_BIST_DONE) == 0), 100000); ++ ++ if (si_core_sflags(sih, 0, 0) & SISF_BIST_ERROR) ++ result = BCME_ERROR; ++ ++ /* Reset core control flags */ ++ si_core_cflags(sih, 0xffff, cflags); ++ ++ return result; ++} ++ ++static uint32 ++factor6(uint32 x) ++{ ++ switch (x) { ++ case CC_F6_2: return 2; ++ case CC_F6_3: return 3; ++ case CC_F6_4: return 4; ++ case CC_F6_5: return 5; ++ case CC_F6_6: return 6; ++ case CC_F6_7: return 7; ++ default: return 0; ++ } ++} ++ ++/* calculate the speed the SI would run at given a set of clockcontrol values */ ++uint32 ++si_clock_rate(uint32 pll_type, uint32 n, uint32 m) ++{ ++ uint32 n1, n2, clock, m1, m2, m3, mc; ++ ++ n1 = n & CN_N1_MASK; ++ n2 = (n & CN_N2_MASK) >> CN_N2_SHIFT; ++ ++ if (pll_type == PLL_TYPE6) { ++ if (m & CC_T6_MMASK) ++ return CC_T6_M1; ++ else ++ return CC_T6_M0; ++ } else if ((pll_type == PLL_TYPE1) || ++ (pll_type == PLL_TYPE3) || ++ (pll_type == PLL_TYPE4) || ++ (pll_type == PLL_TYPE7)) { ++ n1 = factor6(n1); ++ n2 += CC_F5_BIAS; ++ } else if (pll_type == PLL_TYPE2) { ++ n1 += CC_T2_BIAS; ++ n2 += CC_T2_BIAS; ++ ASSERT((n1 >= 2) && (n1 <= 7)); ++ ASSERT((n2 >= 5) && (n2 <= 23)); ++ } else if (pll_type == PLL_TYPE5) { ++ return (100000000); ++ } else ++ ASSERT(0); ++ /* PLL types 3 and 7 use BASE2 (25Mhz) */ ++ if ((pll_type == PLL_TYPE3) || ++ (pll_type == PLL_TYPE7)) { ++ clock = CC_CLOCK_BASE2 * n1 * n2; ++ } else ++ clock = CC_CLOCK_BASE1 * n1 * n2; ++ ++ if (clock == 0) ++ return 0; ++ ++ m1 = m & CC_M1_MASK; ++ m2 = (m & CC_M2_MASK) >> CC_M2_SHIFT; ++ m3 = (m & CC_M3_MASK) >> CC_M3_SHIFT; ++ mc = (m & CC_MC_MASK) >> CC_MC_SHIFT; ++ ++ if ((pll_type == PLL_TYPE1) || ++ (pll_type == PLL_TYPE3) || ++ (pll_type == PLL_TYPE4) || ++ (pll_type == PLL_TYPE7)) { ++ m1 = factor6(m1); ++ if ((pll_type == PLL_TYPE1) || (pll_type == PLL_TYPE3)) ++ m2 += CC_F5_BIAS; ++ else ++ m2 = factor6(m2); ++ m3 = factor6(m3); ++ ++ switch (mc) { ++ case CC_MC_BYPASS: return (clock); ++ case CC_MC_M1: return (clock / m1); ++ case CC_MC_M1M2: return (clock / (m1 * m2)); ++ case CC_MC_M1M2M3: return (clock / (m1 * m2 * m3)); ++ case CC_MC_M1M3: return (clock / (m1 * m3)); ++ default: return (0); ++ } ++ } else { ++ ASSERT(pll_type == PLL_TYPE2); ++ ++ m1 += CC_T2_BIAS; ++ m2 += CC_T2M2_BIAS; ++ m3 += CC_T2_BIAS; ++ ASSERT((m1 >= 2) && (m1 <= 7)); ++ ASSERT((m2 >= 3) && (m2 <= 10)); ++ ASSERT((m3 >= 2) && (m3 <= 7)); ++ ++ if ((mc & CC_T2MC_M1BYP) == 0) ++ clock /= m1; ++ if ((mc & CC_T2MC_M2BYP) == 0) ++ clock /= m2; ++ if ((mc & CC_T2MC_M3BYP) == 0) ++ clock /= m3; ++ ++ return (clock); ++ } ++} ++ ++ ++/* set chip watchdog reset timer to fire in 'ticks' */ ++void ++si_watchdog(si_t *sih, uint ticks) ++{ ++ uint nb, maxt; ++ ++ if (PMUCTL_ENAB(sih)) { ++ ++ if ((CHIPID(sih->chip) == BCM4319_CHIP_ID) && ++ (CHIPREV(sih->chiprev) == 0) && (ticks != 0)) { ++ si_corereg(sih, SI_CC_IDX, OFFSETOF(chipcregs_t, clk_ctl_st), ~0, 0x2); ++ si_setcore(sih, USB20D_CORE_ID, 0); ++ si_core_disable(sih, 1); ++ si_setcore(sih, CC_CORE_ID, 0); ++ } ++ ++ nb = (sih->ccrev < 26) ? 16 : ((sih->ccrev >= 37) ? 32 : 24); ++ /* The mips compiler uses the sllv instruction, ++ * so we specially handle the 32-bit case. ++ */ ++ if (nb == 32) ++ maxt = 0xffffffff; ++ else ++ maxt = ((1 << nb) - 1); ++ ++ if (ticks == 1) ++ ticks = 2; ++ else if (ticks > maxt) ++ ticks = maxt; ++ ++ si_corereg(sih, SI_CC_IDX, OFFSETOF(chipcregs_t, pmuwatchdog), ~0, ticks); ++ } else { ++ maxt = (1 << 28) - 1; ++ if (ticks > maxt) ++ ticks = maxt; ++ ++ si_corereg(sih, SI_CC_IDX, OFFSETOF(chipcregs_t, watchdog), ~0, ticks); ++ } ++} ++ ++/* trigger watchdog reset after ms milliseconds */ ++void ++si_watchdog_ms(si_t *sih, uint32 ms) ++{ ++ si_watchdog(sih, wd_msticks * ms); ++} ++ ++uint32 si_watchdog_msticks(void) ++{ ++ return wd_msticks; ++} ++ ++bool ++si_taclear(si_t *sih, bool details) ++{ ++ return FALSE; ++} ++ ++ ++ ++/* return the slow clock source - LPO, XTAL, or PCI */ ++static uint ++si_slowclk_src(si_info_t *sii) ++{ ++ chipcregs_t *cc; ++ ++ ASSERT(SI_FAST(sii) || si_coreid(&sii->pub) == CC_CORE_ID); ++ ++ if (sii->pub.ccrev < 6) { ++ if ((BUSTYPE(sii->pub.bustype) == PCI_BUS) && ++ (OSL_PCI_READ_CONFIG(sii->osh, PCI_GPIO_OUT, sizeof(uint32)) & ++ PCI_CFG_GPIO_SCS)) ++ return (SCC_SS_PCI); ++ else ++ return (SCC_SS_XTAL); ++ } else if (sii->pub.ccrev < 10) { ++ cc = (chipcregs_t *)si_setcoreidx(&sii->pub, sii->curidx); ++ return (R_REG(sii->osh, &cc->slow_clk_ctl) & SCC_SS_MASK); ++ } else /* Insta-clock */ ++ return (SCC_SS_XTAL); ++} ++ ++/* return the ILP (slowclock) min or max frequency */ ++static uint ++si_slowclk_freq(si_info_t *sii, bool max_freq, chipcregs_t *cc) ++{ ++ uint32 slowclk; ++ uint div; ++ ++ ASSERT(SI_FAST(sii) || si_coreid(&sii->pub) == CC_CORE_ID); ++ ++ /* shouldn't be here unless we've established the chip has dynamic clk control */ ++ ASSERT(R_REG(sii->osh, &cc->capabilities) & CC_CAP_PWR_CTL); ++ ++ slowclk = si_slowclk_src(sii); ++ if (sii->pub.ccrev < 6) { ++ if (slowclk == SCC_SS_PCI) ++ return (max_freq ? (PCIMAXFREQ / 64) : (PCIMINFREQ / 64)); ++ else ++ return (max_freq ? (XTALMAXFREQ / 32) : (XTALMINFREQ / 32)); ++ } else if (sii->pub.ccrev < 10) { ++ div = 4 * ++ (((R_REG(sii->osh, &cc->slow_clk_ctl) & SCC_CD_MASK) >> SCC_CD_SHIFT) + 1); ++ if (slowclk == SCC_SS_LPO) ++ return (max_freq ? LPOMAXFREQ : LPOMINFREQ); ++ else if (slowclk == SCC_SS_XTAL) ++ return (max_freq ? (XTALMAXFREQ / div) : (XTALMINFREQ / div)); ++ else if (slowclk == SCC_SS_PCI) ++ return (max_freq ? (PCIMAXFREQ / div) : (PCIMINFREQ / div)); ++ else ++ ASSERT(0); ++ } else { ++ /* Chipc rev 10 is InstaClock */ ++ div = R_REG(sii->osh, &cc->system_clk_ctl) >> SYCC_CD_SHIFT; ++ div = 4 * (div + 1); ++ return (max_freq ? XTALMAXFREQ : (XTALMINFREQ / div)); ++ } ++ return (0); ++} ++ ++static void ++si_clkctl_setdelay(si_info_t *sii, void *chipcregs) ++{ ++ chipcregs_t *cc = (chipcregs_t *)chipcregs; ++ uint slowmaxfreq, pll_delay, slowclk; ++ uint pll_on_delay, fref_sel_delay; ++ ++ pll_delay = PLL_DELAY; ++ ++ /* If the slow clock is not sourced by the xtal then add the xtal_on_delay ++ * since the xtal will also be powered down by dynamic clk control logic. ++ */ ++ ++ slowclk = si_slowclk_src(sii); ++ if (slowclk != SCC_SS_XTAL) ++ pll_delay += XTAL_ON_DELAY; ++ ++ /* Starting with 4318 it is ILP that is used for the delays */ ++ slowmaxfreq = si_slowclk_freq(sii, (sii->pub.ccrev >= 10) ? FALSE : TRUE, cc); ++ ++ pll_on_delay = ((slowmaxfreq * pll_delay) + 999999) / 1000000; ++ fref_sel_delay = ((slowmaxfreq * FREF_DELAY) + 999999) / 1000000; ++ ++ W_REG(sii->osh, &cc->pll_on_delay, pll_on_delay); ++ W_REG(sii->osh, &cc->fref_sel_delay, fref_sel_delay); ++} ++ ++/* initialize power control delay registers */ ++void ++si_clkctl_init(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx = 0; ++ chipcregs_t *cc; ++ bool fast; ++ ++ if (!CCCTL_ENAB(sih)) ++ return; ++ ++ sii = SI_INFO(sih); ++ fast = SI_FAST(sii); ++ if (!fast) { ++ origidx = sii->curidx; ++ if ((cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0)) == NULL) ++ return; ++ } else if ((cc = (chipcregs_t *)CCREGS_FAST(sii)) == NULL) ++ return; ++ ASSERT(cc != NULL); ++ ++ /* set all Instaclk chip ILP to 1 MHz */ ++ if (sih->ccrev >= 10) ++ SET_REG(sii->osh, &cc->system_clk_ctl, SYCC_CD_MASK, ++ (ILP_DIV_1MHZ << SYCC_CD_SHIFT)); ++ ++ si_clkctl_setdelay(sii, (void *)(uintptr)cc); ++ ++ if (!fast) ++ si_setcoreidx(sih, origidx); ++} ++ ++ ++/* change logical "focus" to the gpio core for optimized access */ ++void * ++si_gpiosetcore(si_t *sih) ++{ ++ return (si_setcoreidx(sih, SI_CC_IDX)); ++} ++ ++/* ++ * mask & set gpiocontrol bits. ++ * If a gpiocontrol bit is set to 0, chipcommon controls the corresponding GPIO pin. ++ * If a gpiocontrol bit is set to 1, the GPIO pin is no longer a GPIO and becomes dedicated ++ * to some chip-specific purpose. ++ */ ++uint32 ++si_gpiocontrol(si_t *sih, uint32 mask, uint32 val, uint8 priority) ++{ ++ uint regoff; ++ ++ regoff = 0; ++ ++ /* gpios could be shared on router platforms ++ * ignore reservation if it's high priority (e.g., test apps) ++ */ ++ if ((priority != GPIO_HI_PRIORITY) && ++ (BUSTYPE(sih->bustype) == SI_BUS) && (val || mask)) { ++ mask = priority ? (si_gpioreservation & mask) : ++ ((si_gpioreservation | mask) & ~(si_gpioreservation)); ++ val &= mask; ++ } ++ ++ regoff = OFFSETOF(chipcregs_t, gpiocontrol); ++ return (si_corereg(sih, SI_CC_IDX, regoff, mask, val)); ++} ++ ++/* mask&set gpio output enable bits */ ++uint32 ++si_gpioouten(si_t *sih, uint32 mask, uint32 val, uint8 priority) ++{ ++ uint regoff; ++ ++ regoff = 0; ++ ++ /* gpios could be shared on router platforms ++ * ignore reservation if it's high priority (e.g., test apps) ++ */ ++ if ((priority != GPIO_HI_PRIORITY) && ++ (BUSTYPE(sih->bustype) == SI_BUS) && (val || mask)) { ++ mask = priority ? (si_gpioreservation & mask) : ++ ((si_gpioreservation | mask) & ~(si_gpioreservation)); ++ val &= mask; ++ } ++ ++ regoff = OFFSETOF(chipcregs_t, gpioouten); ++ return (si_corereg(sih, SI_CC_IDX, regoff, mask, val)); ++} ++ ++/* mask&set gpio output bits */ ++uint32 ++si_gpioout(si_t *sih, uint32 mask, uint32 val, uint8 priority) ++{ ++ uint regoff; ++ ++ regoff = 0; ++ ++ /* gpios could be shared on router platforms ++ * ignore reservation if it's high priority (e.g., test apps) ++ */ ++ if ((priority != GPIO_HI_PRIORITY) && ++ (BUSTYPE(sih->bustype) == SI_BUS) && (val || mask)) { ++ mask = priority ? (si_gpioreservation & mask) : ++ ((si_gpioreservation | mask) & ~(si_gpioreservation)); ++ val &= mask; ++ } ++ ++ regoff = OFFSETOF(chipcregs_t, gpioout); ++ return (si_corereg(sih, SI_CC_IDX, regoff, mask, val)); ++} ++ ++/* reserve one gpio */ ++uint32 ++si_gpioreserve(si_t *sih, uint32 gpio_bitmask, uint8 priority) ++{ ++ /* only cores on SI_BUS share GPIO's and only applcation users need to ++ * reserve/release GPIO ++ */ ++ if ((BUSTYPE(sih->bustype) != SI_BUS) || (!priority)) { ++ ASSERT((BUSTYPE(sih->bustype) == SI_BUS) && (priority)); ++ return 0xffffffff; ++ } ++ /* make sure only one bit is set */ ++ if ((!gpio_bitmask) || ((gpio_bitmask) & (gpio_bitmask - 1))) { ++ ASSERT((gpio_bitmask) && !((gpio_bitmask) & (gpio_bitmask - 1))); ++ return 0xffffffff; ++ } ++ ++ /* already reserved */ ++ if (si_gpioreservation & gpio_bitmask) ++ return 0xffffffff; ++ /* set reservation */ ++ si_gpioreservation |= gpio_bitmask; ++ ++ return si_gpioreservation; ++} ++ ++/* release one gpio */ ++/* ++ * releasing the gpio doesn't change the current value on the GPIO last write value ++ * persists till some one overwrites it ++ */ ++ ++uint32 ++si_gpiorelease(si_t *sih, uint32 gpio_bitmask, uint8 priority) ++{ ++ /* only cores on SI_BUS share GPIO's and only applcation users need to ++ * reserve/release GPIO ++ */ ++ if ((BUSTYPE(sih->bustype) != SI_BUS) || (!priority)) { ++ ASSERT((BUSTYPE(sih->bustype) == SI_BUS) && (priority)); ++ return 0xffffffff; ++ } ++ /* make sure only one bit is set */ ++ if ((!gpio_bitmask) || ((gpio_bitmask) & (gpio_bitmask - 1))) { ++ ASSERT((gpio_bitmask) && !((gpio_bitmask) & (gpio_bitmask - 1))); ++ return 0xffffffff; ++ } ++ ++ /* already released */ ++ if (!(si_gpioreservation & gpio_bitmask)) ++ return 0xffffffff; ++ ++ /* clear reservation */ ++ si_gpioreservation &= ~gpio_bitmask; ++ ++ return si_gpioreservation; ++} ++ ++/* return the current gpioin register value */ ++uint32 ++si_gpioin(si_t *sih) ++{ ++ uint regoff; ++ ++ regoff = OFFSETOF(chipcregs_t, gpioin); ++ return (si_corereg(sih, SI_CC_IDX, regoff, 0, 0)); ++} ++ ++/* mask&set gpio interrupt polarity bits */ ++uint32 ++si_gpiointpolarity(si_t *sih, uint32 mask, uint32 val, uint8 priority) ++{ ++ uint regoff; ++ ++ /* gpios could be shared on router platforms */ ++ if ((BUSTYPE(sih->bustype) == SI_BUS) && (val || mask)) { ++ mask = priority ? (si_gpioreservation & mask) : ++ ((si_gpioreservation | mask) & ~(si_gpioreservation)); ++ val &= mask; ++ } ++ ++ regoff = OFFSETOF(chipcregs_t, gpiointpolarity); ++ return (si_corereg(sih, SI_CC_IDX, regoff, mask, val)); ++} ++ ++/* mask&set gpio interrupt mask bits */ ++uint32 ++si_gpiointmask(si_t *sih, uint32 mask, uint32 val, uint8 priority) ++{ ++ uint regoff; ++ ++ /* gpios could be shared on router platforms */ ++ if ((BUSTYPE(sih->bustype) == SI_BUS) && (val || mask)) { ++ mask = priority ? (si_gpioreservation & mask) : ++ ((si_gpioreservation | mask) & ~(si_gpioreservation)); ++ val &= mask; ++ } ++ ++ regoff = OFFSETOF(chipcregs_t, gpiointmask); ++ return (si_corereg(sih, SI_CC_IDX, regoff, mask, val)); ++} ++ ++/* assign the gpio to an led */ ++uint32 ++si_gpioled(si_t *sih, uint32 mask, uint32 val) ++{ ++ if (sih->ccrev < 16) ++ return 0xffffffff; ++ ++ /* gpio led powersave reg */ ++ return (si_corereg(sih, SI_CC_IDX, OFFSETOF(chipcregs_t, gpiotimeroutmask), mask, val)); ++} ++ ++/* mask&set gpio timer val */ ++uint32 ++si_gpiotimerval(si_t *sih, uint32 mask, uint32 gpiotimerval) ++{ ++ if (sih->ccrev < 16) ++ return 0xffffffff; ++ ++ return (si_corereg(sih, SI_CC_IDX, ++ OFFSETOF(chipcregs_t, gpiotimerval), mask, gpiotimerval)); ++} ++ ++uint32 ++si_gpiopull(si_t *sih, bool updown, uint32 mask, uint32 val) ++{ ++ uint offs; ++ ++ if (sih->ccrev < 20) ++ return 0xffffffff; ++ ++ offs = (updown ? OFFSETOF(chipcregs_t, gpiopulldown) : OFFSETOF(chipcregs_t, gpiopullup)); ++ return (si_corereg(sih, SI_CC_IDX, offs, mask, val)); ++} ++ ++uint32 ++si_gpioevent(si_t *sih, uint regtype, uint32 mask, uint32 val) ++{ ++ uint offs; ++ ++ if (sih->ccrev < 11) ++ return 0xffffffff; ++ ++ if (regtype == GPIO_REGEVT) ++ offs = OFFSETOF(chipcregs_t, gpioevent); ++ else if (regtype == GPIO_REGEVT_INTMSK) ++ offs = OFFSETOF(chipcregs_t, gpioeventintmask); ++ else if (regtype == GPIO_REGEVT_INTPOL) ++ offs = OFFSETOF(chipcregs_t, gpioeventintpolarity); ++ else ++ return 0xffffffff; ++ ++ return (si_corereg(sih, SI_CC_IDX, offs, mask, val)); ++} ++ ++void * ++si_gpio_handler_register(si_t *sih, uint32 event, ++ bool level, gpio_handler_t cb, void *arg) ++{ ++ si_info_t *sii; ++ gpioh_item_t *gi; ++ ++ ASSERT(event); ++ ASSERT(cb != NULL); ++ ++ sii = SI_INFO(sih); ++ if (sih->ccrev < 11) ++ return NULL; ++ ++ if ((gi = MALLOC(sii->osh, sizeof(gpioh_item_t))) == NULL) ++ return NULL; ++ ++ bzero(gi, sizeof(gpioh_item_t)); ++ gi->event = event; ++ gi->handler = cb; ++ gi->arg = arg; ++ gi->level = level; ++ ++ gi->next = sii->gpioh_head; ++ sii->gpioh_head = gi; ++ ++ return (void *)(gi); ++} ++ ++void ++si_gpio_handler_unregister(si_t *sih, void *gpioh) ++{ ++ si_info_t *sii; ++ gpioh_item_t *p, *n; ++ ++ sii = SI_INFO(sih); ++ if (sih->ccrev < 11) ++ return; ++ ++ ASSERT(sii->gpioh_head != NULL); ++ if ((void*)sii->gpioh_head == gpioh) { ++ sii->gpioh_head = sii->gpioh_head->next; ++ MFREE(sii->osh, gpioh, sizeof(gpioh_item_t)); ++ return; ++ } else { ++ p = sii->gpioh_head; ++ n = p->next; ++ while (n) { ++ if ((void*)n == gpioh) { ++ p->next = n->next; ++ MFREE(sii->osh, gpioh, sizeof(gpioh_item_t)); ++ return; ++ } ++ p = n; ++ n = n->next; ++ } ++ } ++ ++ ASSERT(0); /* Not found in list */ ++} ++ ++void ++si_gpio_handler_process(si_t *sih) ++{ ++ si_info_t *sii; ++ gpioh_item_t *h; ++ uint32 level = si_gpioin(sih); ++ uint32 levelp = si_gpiointpolarity(sih, 0, 0, 0); ++ uint32 edge = si_gpioevent(sih, GPIO_REGEVT, 0, 0); ++ uint32 edgep = si_gpioevent(sih, GPIO_REGEVT_INTPOL, 0, 0); ++ ++ sii = SI_INFO(sih); ++ for (h = sii->gpioh_head; h != NULL; h = h->next) { ++ if (h->handler) { ++ uint32 status = (h->level ? level : edge) & h->event; ++ uint32 polarity = (h->level ? levelp : edgep) & h->event; ++ ++ /* polarity bitval is opposite of status bitval */ ++ if (status ^ polarity) ++ h->handler(status, h->arg); ++ } ++ } ++ ++ si_gpioevent(sih, GPIO_REGEVT, edge, edge); /* clear edge-trigger status */ ++} ++ ++uint32 ++si_gpio_int_enable(si_t *sih, bool enable) ++{ ++ uint offs; ++ ++ if (sih->ccrev < 11) ++ return 0xffffffff; ++ ++ offs = OFFSETOF(chipcregs_t, intmask); ++ return (si_corereg(sih, SI_CC_IDX, offs, CI_GPIO, (enable ? CI_GPIO : 0))); ++} ++ ++ ++/* Return the size of the specified SOCRAM bank */ ++static uint ++socram_banksize(si_info_t *sii, sbsocramregs_t *regs, uint8 idx, uint8 mem_type) ++{ ++ uint banksize, bankinfo; ++ uint bankidx = idx | (mem_type << SOCRAM_BANKIDX_MEMTYPE_SHIFT); ++ ++ ASSERT(mem_type <= SOCRAM_MEMTYPE_DEVRAM); ++ ++ W_REG(sii->osh, ®s->bankidx, bankidx); ++ bankinfo = R_REG(sii->osh, ®s->bankinfo); ++ banksize = SOCRAM_BANKINFO_SZBASE * ((bankinfo & SOCRAM_BANKINFO_SZMASK) + 1); ++ return banksize; ++} ++ ++void ++si_socdevram(si_t *sih, bool set, uint8 *enable, uint8 *protect, uint8 *remap) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ sbsocramregs_t *regs; ++ bool wasup; ++ uint corerev; ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ if (!set) ++ *enable = *protect = *remap = 0; ++ ++ /* Switch to SOCRAM core */ ++ if (!(regs = si_setcore(sih, SOCRAM_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, 0, 0); ++ ++ corerev = si_corerev(sih); ++ if (corerev >= 10) { ++ uint32 extcinfo; ++ uint8 nb; ++ uint8 i; ++ uint32 bankidx, bankinfo; ++ ++ extcinfo = R_REG(sii->osh, ®s->extracoreinfo); ++ nb = ((extcinfo & SOCRAM_DEVRAMBANK_MASK) >> SOCRAM_DEVRAMBANK_SHIFT); ++ for (i = 0; i < nb; i++) { ++ bankidx = i | (SOCRAM_MEMTYPE_DEVRAM << SOCRAM_BANKIDX_MEMTYPE_SHIFT); ++ W_REG(sii->osh, ®s->bankidx, bankidx); ++ bankinfo = R_REG(sii->osh, ®s->bankinfo); ++ if (set) { ++ bankinfo &= ~SOCRAM_BANKINFO_DEVRAMSEL_MASK; ++ bankinfo &= ~SOCRAM_BANKINFO_DEVRAMPRO_MASK; ++ bankinfo &= ~SOCRAM_BANKINFO_DEVRAMREMAP_MASK; ++ if (*enable) { ++ bankinfo |= (1 << SOCRAM_BANKINFO_DEVRAMSEL_SHIFT); ++ if (*protect) ++ bankinfo |= (1 << SOCRAM_BANKINFO_DEVRAMPRO_SHIFT); ++ if ((corerev >= 16) && *remap) ++ bankinfo |= ++ (1 << SOCRAM_BANKINFO_DEVRAMREMAP_SHIFT); ++ } ++ W_REG(sii->osh, ®s->bankinfo, bankinfo); ++ } ++ else if (i == 0) { ++ if (bankinfo & SOCRAM_BANKINFO_DEVRAMSEL_MASK) { ++ *enable = 1; ++ if (bankinfo & SOCRAM_BANKINFO_DEVRAMPRO_MASK) ++ *protect = 1; ++ if (bankinfo & SOCRAM_BANKINFO_DEVRAMREMAP_MASK) ++ *remap = 1; ++ } ++ } ++ } ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++} ++ ++bool ++si_socdevram_remap_isenb(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ sbsocramregs_t *regs; ++ bool wasup, remap = FALSE; ++ uint corerev; ++ uint32 extcinfo; ++ uint8 nb; ++ uint8 i; ++ uint32 bankidx, bankinfo; ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ /* Switch to SOCRAM core */ ++ if (!(regs = si_setcore(sih, SOCRAM_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, 0, 0); ++ ++ corerev = si_corerev(sih); ++ if (corerev >= 16) { ++ extcinfo = R_REG(sii->osh, ®s->extracoreinfo); ++ nb = ((extcinfo & SOCRAM_DEVRAMBANK_MASK) >> SOCRAM_DEVRAMBANK_SHIFT); ++ for (i = 0; i < nb; i++) { ++ bankidx = i | (SOCRAM_MEMTYPE_DEVRAM << SOCRAM_BANKIDX_MEMTYPE_SHIFT); ++ W_REG(sii->osh, ®s->bankidx, bankidx); ++ bankinfo = R_REG(sii->osh, ®s->bankinfo); ++ if (bankinfo & SOCRAM_BANKINFO_DEVRAMREMAP_MASK) { ++ remap = TRUE; ++ break; ++ } ++ } ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++ return remap; ++} ++ ++bool ++si_socdevram_pkg(si_t *sih) ++{ ++ if (si_socdevram_size(sih) > 0) ++ return TRUE; ++ else ++ return FALSE; ++} ++ ++uint32 ++si_socdevram_size(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ uint32 memsize = 0; ++ sbsocramregs_t *regs; ++ bool wasup; ++ uint corerev; ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ /* Switch to SOCRAM core */ ++ if (!(regs = si_setcore(sih, SOCRAM_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, 0, 0); ++ ++ corerev = si_corerev(sih); ++ if (corerev >= 10) { ++ uint32 extcinfo; ++ uint8 nb; ++ uint8 i; ++ ++ extcinfo = R_REG(sii->osh, ®s->extracoreinfo); ++ nb = (((extcinfo & SOCRAM_DEVRAMBANK_MASK) >> SOCRAM_DEVRAMBANK_SHIFT)); ++ for (i = 0; i < nb; i++) ++ memsize += socram_banksize(sii, regs, i, SOCRAM_MEMTYPE_DEVRAM); ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++ ++ return memsize; ++} ++ ++uint32 ++si_socdevram_remap_size(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ uint32 memsize = 0, banksz; ++ sbsocramregs_t *regs; ++ bool wasup; ++ uint corerev; ++ uint32 extcinfo; ++ uint8 nb; ++ uint8 i; ++ uint32 bankidx, bankinfo; ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ /* Switch to SOCRAM core */ ++ if (!(regs = si_setcore(sih, SOCRAM_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, 0, 0); ++ ++ corerev = si_corerev(sih); ++ if (corerev >= 16) { ++ extcinfo = R_REG(sii->osh, ®s->extracoreinfo); ++ nb = (((extcinfo & SOCRAM_DEVRAMBANK_MASK) >> SOCRAM_DEVRAMBANK_SHIFT)); ++ ++ /* ++ * FIX: A0 Issue: Max addressable is 512KB, instead 640KB ++ * Only four banks are accessible to ARM ++ */ ++ if ((corerev == 16) && (nb == 5)) ++ nb = 4; ++ ++ for (i = 0; i < nb; i++) { ++ bankidx = i | (SOCRAM_MEMTYPE_DEVRAM << SOCRAM_BANKIDX_MEMTYPE_SHIFT); ++ W_REG(sii->osh, ®s->bankidx, bankidx); ++ bankinfo = R_REG(sii->osh, ®s->bankinfo); ++ if (bankinfo & SOCRAM_BANKINFO_DEVRAMREMAP_MASK) { ++ banksz = socram_banksize(sii, regs, i, SOCRAM_MEMTYPE_DEVRAM); ++ memsize += banksz; ++ } else { ++ /* Account only consecutive banks for now */ ++ break; ++ } ++ } ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++ ++ return memsize; ++} ++ ++/* Return the RAM size of the SOCRAM core */ ++uint32 ++si_socram_size(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ ++ sbsocramregs_t *regs; ++ bool wasup; ++ uint corerev; ++ uint32 coreinfo; ++ uint memsize = 0; ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ /* Switch to SOCRAM core */ ++ if (!(regs = si_setcore(sih, SOCRAM_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, 0, 0); ++ corerev = si_corerev(sih); ++ coreinfo = R_REG(sii->osh, ®s->coreinfo); ++ ++ /* Calculate size from coreinfo based on rev */ ++ if (corerev == 0) ++ memsize = 1 << (16 + (coreinfo & SRCI_MS0_MASK)); ++ else if (corerev < 3) { ++ memsize = 1 << (SR_BSZ_BASE + (coreinfo & SRCI_SRBSZ_MASK)); ++ memsize *= (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT; ++ } else if ((corerev <= 7) || (corerev == 12)) { ++ uint nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT; ++ uint bsz = (coreinfo & SRCI_SRBSZ_MASK); ++ uint lss = (coreinfo & SRCI_LSS_MASK) >> SRCI_LSS_SHIFT; ++ if (lss != 0) ++ nb --; ++ memsize = nb * (1 << (bsz + SR_BSZ_BASE)); ++ if (lss != 0) ++ memsize += (1 << ((lss - 1) + SR_BSZ_BASE)); ++ } else { ++ uint8 i; ++ uint nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT; ++ for (i = 0; i < nb; i++) ++ memsize += socram_banksize(sii, regs, i, SOCRAM_MEMTYPE_RAM); ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++ ++ return memsize; ++} ++ ++ ++/* Return the TCM-RAM size of the ARMCR4 core. */ ++uint32 ++si_tcm_size(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ uint8 *regs; ++ bool wasup; ++ uint32 corecap; ++ uint memsize = 0; ++ uint32 nab = 0; ++ uint32 nbb = 0; ++ uint32 totb = 0; ++ uint32 bxinfo = 0; ++ uint32 idx = 0; ++ uint32 *arm_cap_reg; ++ uint32 *arm_bidx; ++ uint32 *arm_binfo; ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ /* Switch to CR4 core */ ++ if (!(regs = si_setcore(sih, ARMCR4_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size. If in reset, come out of reset, ++ * but remain in halt ++ */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, SICF_CPUHALT, SICF_CPUHALT); ++ ++ arm_cap_reg = (uint32 *)(regs + SI_CR4_CAP); ++ corecap = R_REG(sii->osh, arm_cap_reg); ++ ++ nab = (corecap & ARMCR4_TCBANB_MASK) >> ARMCR4_TCBANB_SHIFT; ++ nbb = (corecap & ARMCR4_TCBBNB_MASK) >> ARMCR4_TCBBNB_SHIFT; ++ totb = nab + nbb; ++ ++ arm_bidx = (uint32 *)(regs + SI_CR4_BANKIDX); ++ arm_binfo = (uint32 *)(regs + SI_CR4_BANKINFO); ++ for (idx = 0; idx < totb; idx++) { ++ W_REG(sii->osh, arm_bidx, idx); ++ ++ bxinfo = R_REG(sii->osh, arm_binfo); ++ memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT; ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++ ++ return memsize; ++} ++ ++uint32 ++si_socram_srmem_size(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ ++ sbsocramregs_t *regs; ++ bool wasup; ++ uint corerev; ++ uint32 coreinfo; ++ uint memsize = 0; ++ ++ if ((CHIPID(sih->chip) == BCM4334_CHIP_ID) && (CHIPREV(sih->chiprev) < 2)) { ++ return (32 * 1024); ++ } ++ ++ sii = SI_INFO(sih); ++ ++ /* Block ints and save current core */ ++ INTR_OFF(sii, intr_val); ++ origidx = si_coreidx(sih); ++ ++ /* Switch to SOCRAM core */ ++ if (!(regs = si_setcore(sih, SOCRAM_CORE_ID, 0))) ++ goto done; ++ ++ /* Get info for determining size */ ++ if (!(wasup = si_iscoreup(sih))) ++ si_core_reset(sih, 0, 0); ++ corerev = si_corerev(sih); ++ coreinfo = R_REG(sii->osh, ®s->coreinfo); ++ ++ /* Calculate size from coreinfo based on rev */ ++ if (corerev >= 16) { ++ uint8 i; ++ uint nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT; ++ for (i = 0; i < nb; i++) { ++ W_REG(sii->osh, ®s->bankidx, i); ++ if (R_REG(sii->osh, ®s->bankinfo) & SOCRAM_BANKINFO_RETNTRAM_MASK) ++ memsize += socram_banksize(sii, regs, i, SOCRAM_MEMTYPE_RAM); ++ } ++ } ++ ++ /* Return to previous state and core */ ++ if (!wasup) ++ si_core_disable(sih, 0); ++ si_setcoreidx(sih, origidx); ++ ++done: ++ INTR_RESTORE(sii, intr_val); ++ ++ return memsize; ++} ++ ++ ++void ++si_btcgpiowar(si_t *sih) ++{ ++ si_info_t *sii; ++ uint origidx; ++ uint intr_val = 0; ++ chipcregs_t *cc; ++ ++ sii = SI_INFO(sih); ++ ++ /* Make sure that there is ChipCommon core present && ++ * UART_TX is strapped to 1 ++ */ ++ if (!(sih->cccaps & CC_CAP_UARTGPIO)) ++ return; ++ ++ /* si_corereg cannot be used as we have to guarantee 8-bit read/writes */ ++ INTR_OFF(sii, intr_val); ++ ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ASSERT(cc != NULL); ++ ++ W_REG(sii->osh, &cc->uart0mcr, R_REG(sii->osh, &cc->uart0mcr) | 0x04); ++ ++ /* restore the original index */ ++ si_setcoreidx(sih, origidx); ++ ++ INTR_RESTORE(sii, intr_val); ++} ++ ++void ++si_chipcontrl_btshd0_4331(si_t *sih, bool on) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ uint32 val; ++ uint intr_val = 0; ++ ++ sii = SI_INFO(sih); ++ ++ INTR_OFF(sii, intr_val); ++ ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ val = R_REG(sii->osh, &cc->chipcontrol); ++ ++ /* bt_shd0 controls are same for 4331 chiprevs 0 and 1, packages 12x9 and 12x12 */ ++ if (on) { ++ /* Enable bt_shd0 on gpio4: */ ++ val |= (CCTRL4331_BT_SHD0_ON_GPIO4); ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } else { ++ val &= ~(CCTRL4331_BT_SHD0_ON_GPIO4); ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } ++ ++ /* restore the original index */ ++ si_setcoreidx(sih, origidx); ++ ++ INTR_RESTORE(sii, intr_val); ++} ++ ++void ++si_chipcontrl_restore(si_t *sih, uint32 val) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ si_setcoreidx(sih, origidx); ++} ++ ++uint32 ++si_chipcontrl_read(si_t *sih) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ uint32 val; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ val = R_REG(sii->osh, &cc->chipcontrol); ++ si_setcoreidx(sih, origidx); ++ return val; ++} ++ ++void ++si_chipcontrl_epa4331(si_t *sih, bool on) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ uint32 val; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ val = R_REG(sii->osh, &cc->chipcontrol); ++ ++ if (on) { ++ if (sih->chippkg == 9 || sih->chippkg == 0xb) { ++ val |= (CCTRL4331_EXTPA_EN | CCTRL4331_EXTPA_ON_GPIO2_5); ++ /* Ext PA Controls for 4331 12x9 Package */ ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } else { ++ /* Ext PA Controls for 4331 12x12 Package */ ++ if (sih->chiprev > 0) { ++ W_REG(sii->osh, &cc->chipcontrol, val | ++ (CCTRL4331_EXTPA_EN) | (CCTRL4331_EXTPA_EN2)); ++ } else { ++ W_REG(sii->osh, &cc->chipcontrol, val | (CCTRL4331_EXTPA_EN)); ++ } ++ } ++ } else { ++ val &= ~(CCTRL4331_EXTPA_EN | CCTRL4331_EXTPA_EN2 | CCTRL4331_EXTPA_ON_GPIO2_5); ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } ++ ++ si_setcoreidx(sih, origidx); ++} ++ ++/* switch muxed pins, on: SROM, off: FEMCTRL */ ++void ++si_chipcontrl_srom4360(si_t *sih, bool on) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ uint32 val; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ val = R_REG(sii->osh, &cc->chipcontrol); ++ ++ if (on) { ++ val &= ~(CCTRL4360_SECI_MODE | ++ CCTRL4360_BTSWCTRL_MODE | ++ CCTRL4360_EXTRA_FEMCTRL_MODE | ++ CCTRL4360_BT_LGCY_MODE | ++ CCTRL4360_CORE2FEMCTRL4_ON); ++ ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } else { ++ } ++ ++ si_setcoreidx(sih, origidx); ++} ++ ++void ++si_chipcontrl_epa4331_wowl(si_t *sih, bool enter_wowl) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ uint32 val; ++ bool sel_chip; ++ ++ sel_chip = (CHIPID(sih->chip) == BCM4331_CHIP_ID) || ++ (CHIPID(sih->chip) == BCM43431_CHIP_ID); ++ sel_chip &= ((sih->chippkg == 9 || sih->chippkg == 0xb)); ++ ++ if (!sel_chip) ++ return; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ val = R_REG(sii->osh, &cc->chipcontrol); ++ ++ if (enter_wowl) { ++ val |= CCTRL4331_EXTPA_EN; ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } else { ++ val |= (CCTRL4331_EXTPA_EN | CCTRL4331_EXTPA_ON_GPIO2_5); ++ W_REG(sii->osh, &cc->chipcontrol, val); ++ } ++ si_setcoreidx(sih, origidx); ++} ++ ++uint ++si_pll_reset(si_t *sih) ++{ ++ uint err = 0; ++ ++ return (err); ++} ++ ++/* Enable BT-COEX & Ex-PA for 4313 */ ++void ++si_epa_4313war(si_t *sih) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ /* EPA Fix */ ++ W_REG(sii->osh, &cc->gpiocontrol, ++ R_REG(sii->osh, &cc->gpiocontrol) | GPIO_CTRL_EPA_EN_MASK); ++ ++ si_setcoreidx(sih, origidx); ++} ++ ++void ++si_clk_pmu_htavail_set(si_t *sih, bool set_clear) ++{ ++} ++ ++/* WL/BT control for 4313 btcombo boards >= P250 */ ++void ++si_btcombo_p250_4313_war(si_t *sih) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ W_REG(sii->osh, &cc->gpiocontrol, ++ R_REG(sii->osh, &cc->gpiocontrol) | GPIO_CTRL_5_6_EN_MASK); ++ ++ W_REG(sii->osh, &cc->gpioouten, ++ R_REG(sii->osh, &cc->gpioouten) | GPIO_CTRL_5_6_EN_MASK); ++ ++ si_setcoreidx(sih, origidx); ++} ++void ++si_btc_enable_chipcontrol(si_t *sih) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ /* BT fix */ ++ W_REG(sii->osh, &cc->chipcontrol, ++ R_REG(sii->osh, &cc->chipcontrol) | CC_BTCOEX_EN_MASK); ++ ++ si_setcoreidx(sih, origidx); ++} ++void ++si_btcombo_43228_war(si_t *sih) ++{ ++ si_info_t *sii; ++ chipcregs_t *cc; ++ uint origidx; ++ ++ sii = SI_INFO(sih); ++ origidx = si_coreidx(sih); ++ ++ cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0); ++ ++ W_REG(sii->osh, &cc->gpioouten, GPIO_CTRL_7_6_EN_MASK); ++ W_REG(sii->osh, &cc->gpioout, GPIO_OUT_7_EN_MASK); ++ ++ si_setcoreidx(sih, origidx); ++} ++ ++/* check if the device is removed */ ++bool ++si_deviceremoved(si_t *sih) ++{ ++ uint32 w; ++ si_info_t *sii; ++ ++ sii = SI_INFO(sih); ++ ++ switch (BUSTYPE(sih->bustype)) { ++ case PCI_BUS: ++ ASSERT(sii->osh != NULL); ++ w = OSL_PCI_READ_CONFIG(sii->osh, PCI_CFG_VID, sizeof(uint32)); ++ if ((w & 0xFFFF) != VENDOR_BROADCOM) ++ return TRUE; ++ break; ++ } ++ return FALSE; ++} ++ ++bool ++si_is_sprom_available(si_t *sih) ++{ ++ if (sih->ccrev >= 31) { ++ si_info_t *sii; ++ uint origidx; ++ chipcregs_t *cc; ++ uint32 sromctrl; ++ ++ if ((sih->cccaps & CC_CAP_SROM) == 0) ++ return FALSE; ++ ++ sii = SI_INFO(sih); ++ origidx = sii->curidx; ++ cc = si_setcoreidx(sih, SI_CC_IDX); ++ sromctrl = R_REG(sii->osh, &cc->sromcontrol); ++ si_setcoreidx(sih, origidx); ++ return (sromctrl & SRC_PRESENT); ++ } ++ ++ switch (CHIPID(sih->chip)) { ++ case BCM4312_CHIP_ID: ++ return ((sih->chipst & CST4312_SPROM_OTP_SEL_MASK) != CST4312_OTP_SEL); ++ case BCM4325_CHIP_ID: ++ return (sih->chipst & CST4325_SPROM_SEL) != 0; ++ case BCM4322_CHIP_ID: case BCM43221_CHIP_ID: case BCM43231_CHIP_ID: ++ case BCM43222_CHIP_ID: case BCM43111_CHIP_ID: case BCM43112_CHIP_ID: ++ case BCM4342_CHIP_ID: { ++ uint32 spromotp; ++ spromotp = (sih->chipst & CST4322_SPROM_OTP_SEL_MASK) >> ++ CST4322_SPROM_OTP_SEL_SHIFT; ++ return (spromotp & CST4322_SPROM_PRESENT) != 0; ++ } ++ case BCM4329_CHIP_ID: ++ return (sih->chipst & CST4329_SPROM_SEL) != 0; ++ case BCM4315_CHIP_ID: ++ return (sih->chipst & CST4315_SPROM_SEL) != 0; ++ case BCM4319_CHIP_ID: ++ return (sih->chipst & CST4319_SPROM_SEL) != 0; ++ case BCM4336_CHIP_ID: ++ case BCM43362_CHIP_ID: ++ return (sih->chipst & CST4336_SPROM_PRESENT) != 0; ++ case BCM4330_CHIP_ID: ++ return (sih->chipst & CST4330_SPROM_PRESENT) != 0; ++ case BCM4313_CHIP_ID: ++ return (sih->chipst & CST4313_SPROM_PRESENT) != 0; ++ case BCM4331_CHIP_ID: ++ case BCM43431_CHIP_ID: ++ return (sih->chipst & CST4331_SPROM_PRESENT) != 0; ++ case BCM43239_CHIP_ID: ++ return ((sih->chipst & CST43239_SPROM_MASK) && ++ !(sih->chipst & CST43239_SFLASH_MASK)); ++ case BCM4324_CHIP_ID: ++ return ((sih->chipst & CST4324_SPROM_MASK) && ++ !(sih->chipst & CST4324_SFLASH_MASK)); ++ case BCM4335_CHIP_ID: ++ return ((sih->chipst & CST4335_SPROM_MASK) && ++ !(sih->chipst & CST4335_SFLASH_MASK)); ++ case BCM43131_CHIP_ID: ++ case BCM43217_CHIP_ID: ++ case BCM43227_CHIP_ID: ++ case BCM43228_CHIP_ID: ++ case BCM43428_CHIP_ID: ++ return (sih->chipst & CST43228_OTP_PRESENT) != CST43228_OTP_PRESENT; ++ default: ++ return TRUE; ++ } ++} ++ ++ ++uint32 si_get_sromctl(si_t *sih) ++{ ++ chipcregs_t *cc; ++ uint origidx; ++ uint32 sromctl; ++ osl_t *osh; ++ ++ osh = si_osh(sih); ++ origidx = si_coreidx(sih); ++ cc = si_setcoreidx(sih, SI_CC_IDX); ++ ASSERT((uintptr)cc); ++ ++ sromctl = R_REG(osh, &cc->sromcontrol); ++ ++ /* return to the original core */ ++ si_setcoreidx(sih, origidx); ++ return sromctl; ++} ++ ++int si_set_sromctl(si_t *sih, uint32 value) ++{ ++ chipcregs_t *cc; ++ uint origidx; ++ osl_t *osh; ++ ++ osh = si_osh(sih); ++ origidx = si_coreidx(sih); ++ cc = si_setcoreidx(sih, SI_CC_IDX); ++ ASSERT((uintptr)cc); ++ ++ /* get chipcommon rev */ ++ if (si_corerev(sih) < 32) ++ return BCME_UNSUPPORTED; ++ ++ W_REG(osh, &cc->sromcontrol, value); ++ ++ /* return to the original core */ ++ si_setcoreidx(sih, origidx); ++ return BCME_OK; ++ ++} +diff --git a/drivers/net/wireless/ap6210/siutils_priv.h b/drivers/net/wireless/ap6210/siutils_priv.h +new file mode 100644 +index 0000000..34fc3fa +--- /dev/null ++++ b/drivers/net/wireless/ap6210/siutils_priv.h +@@ -0,0 +1,236 @@ ++/* ++ * Include file private to the SOC Interconnect support files. ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: siutils_priv.h 309193 2012-01-19 00:03:57Z $ ++ */ ++ ++#ifndef _siutils_priv_h_ ++#define _siutils_priv_h_ ++ ++#define IS_SIM(chippkg) ((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID)) ++ ++typedef uint32 (*si_intrsoff_t)(void *intr_arg); ++typedef void (*si_intrsrestore_t)(void *intr_arg, uint32 arg); ++typedef bool (*si_intrsenabled_t)(void *intr_arg); ++ ++typedef struct gpioh_item { ++ void *arg; ++ bool level; ++ gpio_handler_t handler; ++ uint32 event; ++ struct gpioh_item *next; ++} gpioh_item_t; ++ ++/* misc si info needed by some of the routines */ ++typedef struct si_info { ++ struct si_pub pub; /* back plane public state (must be first field) */ ++ ++ void *osh; /* osl os handle */ ++ void *sdh; /* bcmsdh handle */ ++ ++ uint dev_coreid; /* the core provides driver functions */ ++ void *intr_arg; /* interrupt callback function arg */ ++ si_intrsoff_t intrsoff_fn; /* turns chip interrupts off */ ++ si_intrsrestore_t intrsrestore_fn; /* restore chip interrupts */ ++ si_intrsenabled_t intrsenabled_fn; /* check if interrupts are enabled */ ++ ++ void *pch; /* PCI/E core handle */ ++ ++ gpioh_item_t *gpioh_head; /* GPIO event handlers list */ ++ ++ bool memseg; /* flag to toggle MEM_SEG register */ ++ ++ char *vars; ++ uint varsz; ++ ++ void *curmap; /* current regs va */ ++ void *regs[SI_MAXCORES]; /* other regs va */ ++ ++ uint curidx; /* current core index */ ++ uint numcores; /* # discovered cores */ ++ uint coreid[SI_MAXCORES]; /* id of each core */ ++ uint32 coresba[SI_MAXCORES]; /* backplane address of each core */ ++ void *regs2[SI_MAXCORES]; /* va of each core second register set (usbh20) */ ++ uint32 coresba2[SI_MAXCORES]; /* address of each core second register set (usbh20) */ ++ uint32 coresba_size[SI_MAXCORES]; /* backplane address space size */ ++ uint32 coresba2_size[SI_MAXCORES]; /* second address space size */ ++ ++ void *curwrap; /* current wrapper va */ ++ void *wrappers[SI_MAXCORES]; /* other cores wrapper va */ ++ uint32 wrapba[SI_MAXCORES]; /* address of controlling wrapper */ ++ ++ uint32 cia[SI_MAXCORES]; /* erom cia entry for each core */ ++ uint32 cib[SI_MAXCORES]; /* erom cia entry for each core */ ++ uint32 oob_router; /* oob router registers for axi */ ++} si_info_t; ++ ++#define SI_INFO(sih) (si_info_t *)(uintptr)sih ++ ++#define GOODCOREADDR(x, b) (((x) >= (b)) && ((x) < ((b) + SI_MAXCORES * SI_CORE_SIZE)) && \ ++ ISALIGNED((x), SI_CORE_SIZE)) ++#define GOODREGS(regs) ((regs) != NULL && ISALIGNED((uintptr)(regs), SI_CORE_SIZE)) ++#define BADCOREADDR 0 ++#define GOODIDX(idx) (((uint)idx) < SI_MAXCORES) ++#define NOREV -1 /* Invalid rev */ ++ ++#define PCI(si) ((BUSTYPE((si)->pub.bustype) == PCI_BUS) && \ ++ ((si)->pub.buscoretype == PCI_CORE_ID)) ++ ++#define PCIE_GEN1(si) ((BUSTYPE((si)->pub.bustype) == PCI_BUS) && \ ++ ((si)->pub.buscoretype == PCIE_CORE_ID)) ++ ++#define PCIE_GEN2(si) ((BUSTYPE((si)->pub.bustype) == PCI_BUS) && \ ++ ((si)->pub.buscoretype == PCIE2_CORE_ID)) ++ ++#define PCIE(si) (PCIE_GEN1(si) || PCIE_GEN2(si)) ++ ++#define PCMCIA(si) ((BUSTYPE((si)->pub.bustype) == PCMCIA_BUS) && ((si)->memseg == TRUE)) ++ ++/* Newer chips can access PCI/PCIE and CC core without requiring to change ++ * PCI BAR0 WIN ++ */ ++#define SI_FAST(si) (PCIE(si) || (PCI(si) && ((si)->pub.buscorerev >= 13))) ++ ++#define PCIEREGS(si) (((char *)((si)->curmap) + PCI_16KB0_PCIREGS_OFFSET)) ++#define CCREGS_FAST(si) (((char *)((si)->curmap) + PCI_16KB0_CCREGS_OFFSET)) ++ ++/* ++ * Macros to disable/restore function core(D11, ENET, ILINE20, etc) interrupts before/ ++ * after core switching to avoid invalid register accesss inside ISR. ++ */ ++#define INTR_OFF(si, intr_val) \ ++ if ((si)->intrsoff_fn && (si)->coreid[(si)->curidx] == (si)->dev_coreid) { \ ++ intr_val = (*(si)->intrsoff_fn)((si)->intr_arg); } ++#define INTR_RESTORE(si, intr_val) \ ++ if ((si)->intrsrestore_fn && (si)->coreid[(si)->curidx] == (si)->dev_coreid) { \ ++ (*(si)->intrsrestore_fn)((si)->intr_arg, intr_val); } ++ ++/* dynamic clock control defines */ ++#define LPOMINFREQ 25000 /* low power oscillator min */ ++#define LPOMAXFREQ 43000 /* low power oscillator max */ ++#define XTALMINFREQ 19800000 /* 20 MHz - 1% */ ++#define XTALMAXFREQ 20200000 /* 20 MHz + 1% */ ++#define PCIMINFREQ 25000000 /* 25 MHz */ ++#define PCIMAXFREQ 34000000 /* 33 MHz + fudge */ ++ ++#define ILP_DIV_5MHZ 0 /* ILP = 5 MHz */ ++#define ILP_DIV_1MHZ 4 /* ILP = 1 MHz */ ++ ++#define PCI_FORCEHT(si) \ ++ (((PCIE_GEN1(si)) && (si->pub.chip == BCM4311_CHIP_ID) && ((si->pub.chiprev <= 1))) || \ ++ ((PCI(si) || PCIE_GEN1(si)) && (si->pub.chip == BCM4321_CHIP_ID)) || \ ++ (PCIE_GEN1(si) && (si->pub.chip == BCM4716_CHIP_ID)) || \ ++ (PCIE_GEN1(si) && (si->pub.chip == BCM4748_CHIP_ID))) ++ ++/* GPIO Based LED powersave defines */ ++#define DEFAULT_GPIO_ONTIME 10 /* Default: 10% on */ ++#define DEFAULT_GPIO_OFFTIME 90 /* Default: 10% on */ ++ ++#ifndef DEFAULT_GPIOTIMERVAL ++#define DEFAULT_GPIOTIMERVAL ((DEFAULT_GPIO_ONTIME << GPIO_ONTIME_SHIFT) | DEFAULT_GPIO_OFFTIME) ++#endif ++ ++/* Silicon Backplane externs */ ++extern void sb_scan(si_t *sih, void *regs, uint devid); ++extern uint sb_coreid(si_t *sih); ++extern uint sb_intflag(si_t *sih); ++extern uint sb_flag(si_t *sih); ++extern void sb_setint(si_t *sih, int siflag); ++extern uint sb_corevendor(si_t *sih); ++extern uint sb_corerev(si_t *sih); ++extern uint sb_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val); ++extern bool sb_iscoreup(si_t *sih); ++extern void *sb_setcoreidx(si_t *sih, uint coreidx); ++extern uint32 sb_core_cflags(si_t *sih, uint32 mask, uint32 val); ++extern void sb_core_cflags_wo(si_t *sih, uint32 mask, uint32 val); ++extern uint32 sb_core_sflags(si_t *sih, uint32 mask, uint32 val); ++extern void sb_commit(si_t *sih); ++extern uint32 sb_base(uint32 admatch); ++extern uint32 sb_size(uint32 admatch); ++extern void sb_core_reset(si_t *sih, uint32 bits, uint32 resetbits); ++extern void sb_core_disable(si_t *sih, uint32 bits); ++extern uint32 sb_addrspace(si_t *sih, uint asidx); ++extern uint32 sb_addrspacesize(si_t *sih, uint asidx); ++extern int sb_numaddrspaces(si_t *sih); ++ ++extern uint32 sb_set_initiator_to(si_t *sih, uint32 to, uint idx); ++ ++extern bool sb_taclear(si_t *sih, bool details); ++ ++ ++/* Wake-on-wireless-LAN (WOWL) */ ++extern bool sb_pci_pmecap(si_t *sih); ++struct osl_info; ++extern bool sb_pci_fastpmecap(struct osl_info *osh); ++extern bool sb_pci_pmeclr(si_t *sih); ++extern void sb_pci_pmeen(si_t *sih); ++extern uint sb_pcie_readreg(void *sih, uint addrtype, uint offset); ++ ++/* AMBA Interconnect exported externs */ ++extern si_t *ai_attach(uint pcidev, osl_t *osh, void *regs, uint bustype, ++ void *sdh, char **vars, uint *varsz); ++extern si_t *ai_kattach(osl_t *osh); ++extern void ai_scan(si_t *sih, void *regs, uint devid); ++ ++extern uint ai_flag(si_t *sih); ++extern void ai_setint(si_t *sih, int siflag); ++extern uint ai_coreidx(si_t *sih); ++extern uint ai_corevendor(si_t *sih); ++extern uint ai_corerev(si_t *sih); ++extern bool ai_iscoreup(si_t *sih); ++extern void *ai_setcoreidx(si_t *sih, uint coreidx); ++extern uint32 ai_core_cflags(si_t *sih, uint32 mask, uint32 val); ++extern void ai_core_cflags_wo(si_t *sih, uint32 mask, uint32 val); ++extern uint32 ai_core_sflags(si_t *sih, uint32 mask, uint32 val); ++extern uint ai_corereg(si_t *sih, uint coreidx, uint regoff, uint mask, uint val); ++extern void ai_core_reset(si_t *sih, uint32 bits, uint32 resetbits); ++extern void ai_core_disable(si_t *sih, uint32 bits); ++extern int ai_numaddrspaces(si_t *sih); ++extern uint32 ai_addrspace(si_t *sih, uint asidx); ++extern uint32 ai_addrspacesize(si_t *sih, uint asidx); ++extern void ai_coreaddrspaceX(si_t *sih, uint asidx, uint32 *addr, uint32 *size); ++extern uint ai_wrap_reg(si_t *sih, uint32 offset, uint32 mask, uint32 val); ++ ++ ++ ++#define ub_scan(a, b, c) do {} while (0) ++#define ub_flag(a) (0) ++#define ub_setint(a, b) do {} while (0) ++#define ub_coreidx(a) (0) ++#define ub_corevendor(a) (0) ++#define ub_corerev(a) (0) ++#define ub_iscoreup(a) (0) ++#define ub_setcoreidx(a, b) (0) ++#define ub_core_cflags(a, b, c) (0) ++#define ub_core_cflags_wo(a, b, c) do {} while (0) ++#define ub_core_sflags(a, b, c) (0) ++#define ub_corereg(a, b, c, d, e) (0) ++#define ub_core_reset(a, b, c) do {} while (0) ++#define ub_core_disable(a, b) do {} while (0) ++#define ub_numaddrspaces(a) (0) ++#define ub_addrspace(a, b) (0) ++#define ub_addrspacesize(a, b) (0) ++#define ub_view(a, b) do {} while (0) ++#define ub_dumpregs(a, b) do {} while (0) ++ ++#endif /* _siutils_priv_h_ */ +diff --git a/drivers/net/wireless/ap6210/uamp_api.h b/drivers/net/wireless/ap6210/uamp_api.h +new file mode 100644 +index 0000000..673dce0 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/uamp_api.h +@@ -0,0 +1,176 @@ ++/* ++ * Name: uamp_api.h ++ * ++ * Description: Universal AMP API ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: uamp_api.h 294267 2011-11-04 23:41:52Z $ ++ * ++ */ ++#ifndef UAMP_API_H ++#define UAMP_API_H ++ ++ ++#include "typedefs.h" ++ ++ ++/***************************************************************************** ++** Constant and Type Definitions ++****************************************************************************** ++*/ ++ ++#define BT_API ++ ++/* Types. */ ++typedef bool BOOLEAN; ++typedef uint8 UINT8; ++typedef uint16 UINT16; ++ ++ ++/* UAMP identifiers */ ++#define UAMP_ID_1 1 ++#define UAMP_ID_2 2 ++typedef UINT8 tUAMP_ID; ++ ++/* UAMP event ids (used by UAMP_CBACK) */ ++#define UAMP_EVT_RX_READY 0 /* Data from AMP controller is ready to be read */ ++#define UAMP_EVT_CTLR_REMOVED 1 /* Controller removed */ ++#define UAMP_EVT_CTLR_READY 2 /* Controller added/ready */ ++typedef UINT8 tUAMP_EVT; ++ ++ ++/* UAMP Channels */ ++#define UAMP_CH_HCI_CMD 0 /* HCI Command channel */ ++#define UAMP_CH_HCI_EVT 1 /* HCI Event channel */ ++#define UAMP_CH_HCI_DATA 2 /* HCI ACL Data channel */ ++typedef UINT8 tUAMP_CH; ++ ++/* tUAMP_EVT_DATA: union for event-specific data, used by UAMP_CBACK */ ++typedef union { ++ tUAMP_CH channel; /* UAMP_EVT_RX_READY: channel for which rx occured */ ++} tUAMP_EVT_DATA; ++ ++ ++/***************************************************************************** ++** ++** Function: UAMP_CBACK ++** ++** Description: Callback for events. Register callback using UAMP_Init. ++** ++** Parameters amp_id: AMP device identifier that generated the event ++** amp_evt: event id ++** p_amp_evt_data: pointer to event-specific data ++** ++****************************************************************************** ++*/ ++typedef void (*tUAMP_CBACK)(tUAMP_ID amp_id, tUAMP_EVT amp_evt, tUAMP_EVT_DATA *p_amp_evt_data); ++ ++/***************************************************************************** ++** external function declarations ++****************************************************************************** ++*/ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++ ++/***************************************************************************** ++** ++** Function: UAMP_Init ++** ++** Description: Initialize UAMP driver ++** ++** Parameters p_cback: Callback function for UAMP event notification ++** ++****************************************************************************** ++*/ ++BT_API BOOLEAN UAMP_Init(tUAMP_CBACK p_cback); ++ ++ ++/***************************************************************************** ++** ++** Function: UAMP_Open ++** ++** Description: Open connection to local AMP device. ++** ++** Parameters app_id: Application specific AMP identifer. This value ++** will be included in AMP messages sent to the ++** BTU task, to identify source of the message ++** ++****************************************************************************** ++*/ ++BT_API BOOLEAN UAMP_Open(tUAMP_ID amp_id); ++ ++/***************************************************************************** ++** ++** Function: UAMP_Close ++** ++** Description: Close connection to local AMP device. ++** ++** Parameters app_id: Application specific AMP identifer. ++** ++****************************************************************************** ++*/ ++BT_API void UAMP_Close(tUAMP_ID amp_id); ++ ++ ++/***************************************************************************** ++** ++** Function: UAMP_Write ++** ++** Description: Send buffer to AMP device. Frees GKI buffer when done. ++** ++** ++** Parameters: app_id: AMP identifer. ++** p_buf: pointer to buffer to write ++** num_bytes: number of bytes to write ++** channel: UAMP_CH_HCI_ACL, or UAMP_CH_HCI_CMD ++** ++** Returns: number of bytes written ++** ++****************************************************************************** ++*/ ++BT_API UINT16 UAMP_Write(tUAMP_ID amp_id, UINT8 *p_buf, UINT16 num_bytes, tUAMP_CH channel); ++ ++/***************************************************************************** ++** ++** Function: UAMP_Read ++** ++** Description: Read incoming data from AMP. Call after receiving a ++** UAMP_EVT_RX_READY callback event. ++** ++** Parameters: app_id: AMP identifer. ++** p_buf: pointer to buffer for holding incoming AMP data ++** buf_size: size of p_buf ++** channel: UAMP_CH_HCI_ACL, or UAMP_CH_HCI_EVT ++** ++** Returns: number of bytes read ++** ++****************************************************************************** ++*/ ++BT_API UINT16 UAMP_Read(tUAMP_ID amp_id, UINT8 *p_buf, UINT16 buf_size, tUAMP_CH channel); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* UAMP_API_H */ +diff --git a/drivers/net/wireless/ap6210/wl_android.c b/drivers/net/wireless/ap6210/wl_android.c +new file mode 100644 +index 0000000..7e8b724 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_android.c +@@ -0,0 +1,1448 @@ ++/* ++ * Linux cfg80211 driver - Android related functions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_android.c 372668 2012-12-04 14:07:12Z $ ++ */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef WL_CFG80211 ++#include ++#endif ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++#include ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) ++#include ++#else ++#include ++#endif ++#endif /* CONFIG_WIFI_CONTROL_FUNC */ ++ ++#include ++ ++#ifndef WL_CFG80211 ++#define htod32(i) i ++#define htod16(i) i ++#define dtoh32(i) i ++#define dtoh16(i) i ++#define htodchanspec(i) i ++#define dtohchanspec(i) i ++#endif ++ ++/* ++ * Android private command strings, PLEASE define new private commands here ++ * so they can be updated easily in the future (if needed) ++ */ ++ ++#define CMD_START "START" ++#define CMD_STOP "STOP" ++#define CMD_SCAN_ACTIVE "SCAN-ACTIVE" ++#define CMD_SCAN_PASSIVE "SCAN-PASSIVE" ++#define CMD_RSSI "RSSI" ++#define CMD_LINKSPEED "LINKSPEED" ++#define CMD_RXFILTER_START "RXFILTER-START" ++#define CMD_RXFILTER_STOP "RXFILTER-STOP" ++#define CMD_RXFILTER_ADD "RXFILTER-ADD" ++#define CMD_RXFILTER_REMOVE "RXFILTER-REMOVE" ++#define CMD_BTCOEXSCAN_START "BTCOEXSCAN-START" ++#define CMD_BTCOEXSCAN_STOP "BTCOEXSCAN-STOP" ++#define CMD_BTCOEXMODE "BTCOEXMODE" ++#define CMD_SETSUSPENDOPT "SETSUSPENDOPT" ++#define CMD_SETSUSPENDMODE "SETSUSPENDMODE" ++#define CMD_P2P_DEV_ADDR "P2P_DEV_ADDR" ++#define CMD_SETFWPATH "SETFWPATH" ++#define CMD_SETBAND "SETBAND" ++#define CMD_GETBAND "GETBAND" ++#define CMD_COUNTRY "COUNTRY" ++#define CMD_P2P_SET_NOA "P2P_SET_NOA" ++#if !defined WL_ENABLE_P2P_IF ++#define CMD_P2P_GET_NOA "P2P_GET_NOA" ++#endif ++#define CMD_P2P_SD_OFFLOAD "P2P_SD_" ++#define CMD_P2P_SET_PS "P2P_SET_PS" ++#define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE" ++#define CMD_SETROAMMODE "SETROAMMODE" ++ ++ ++/* CCX Private Commands */ ++ ++#ifdef PNO_SUPPORT ++#define CMD_PNOSSIDCLR_SET "PNOSSIDCLR" ++#define CMD_PNOSETUP_SET "PNOSETUP " ++#define CMD_PNOENABLE_SET "PNOFORCE" ++#define CMD_PNODEBUG_SET "PNODEBUG" ++ ++#define PNO_TLV_PREFIX 'S' ++#define PNO_TLV_VERSION '1' ++#define PNO_TLV_SUBVERSION '2' ++#define PNO_TLV_RESERVED '0' ++#define PNO_TLV_TYPE_SSID_IE 'S' ++#define PNO_TLV_TYPE_TIME 'T' ++#define PNO_TLV_FREQ_REPEAT 'R' ++#define PNO_TLV_FREQ_EXPO_MAX 'M' ++ ++typedef struct cmd_tlv { ++ char prefix; ++ char version; ++ char subver; ++ char reserved; ++} cmd_tlv_t; ++#endif /* PNO_SUPPORT */ ++ ++#define CMD_OKC_SET_PMK "SET_PMK" ++#define CMD_OKC_ENABLE "OKC_ENABLE" ++ ++ ++typedef struct android_wifi_priv_cmd { ++ char *buf; ++ int used_len; ++ int total_len; ++} android_wifi_priv_cmd; ++ ++/** ++ * Extern function declarations (TODO: move them to dhd_linux.h) ++ */ ++void dhd_customer_gpio_wlan_ctrl(int onoff); ++int dhd_dev_reset(struct net_device *dev, uint8 flag); ++int dhd_dev_init_ioctl(struct net_device *dev); ++#ifdef WL_CFG80211 ++int wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr); ++int wl_cfg80211_set_btcoex_dhcp(struct net_device *dev, char *command); ++#else ++int wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr) ++{ return 0; } ++int wl_cfg80211_set_p2p_noa(struct net_device *net, char* buf, int len) ++{ return 0; } ++int wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len) ++{ return 0; } ++int wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len) ++{ return 0; } ++#endif /* WL_CFG80211 */ ++ ++extern int dhd_os_check_wakelock(void *dhdp); ++extern int dhd_os_check_if_up(void *dhdp); ++extern void *bcmsdh_get_drvdata(void); ++#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) ++extern int dhd_wlfc_init(dhd_pub_t *dhd); ++extern void dhd_wlfc_deinit(dhd_pub_t *dhd); ++#endif ++ ++extern bool ap_fw_loaded; ++extern char iface_name[IFNAMSIZ]; ++ ++#define WIFI_TURNOFF_DELAY 0 ++/** ++ * Local (static) functions and variables ++ */ ++ ++/* Initialize g_wifi_on to 1 so dhd_bus_start will be called for the first ++ * time (only) in dhd_open, subsequential wifi on will be handled by ++ * wl_android_wifi_on ++ */ ++static int g_wifi_on = TRUE; ++ ++/** ++ * Local (static) function definitions ++ */ ++static int wl_android_get_link_speed(struct net_device *net, char *command, int total_len) ++{ ++ int link_speed; ++ int bytes_written; ++ int error; ++ ++ error = wldev_get_link_speed(net, &link_speed); ++ if (error) ++ return -1; ++ ++ /* Convert Kbps to Android Mbps */ ++ link_speed = link_speed / 1000; ++ bytes_written = snprintf(command, total_len, "LinkSpeed %d", link_speed); ++ AP6210_DEBUG("%s: command result is %s\n", __FUNCTION__, command); ++ return bytes_written; ++} ++ ++static int wl_android_get_rssi(struct net_device *net, char *command, int total_len) ++{ ++ wlc_ssid_t ssid = {0}; ++ int rssi; ++ int bytes_written = 0; ++ int error; ++ ++ error = wldev_get_rssi(net, &rssi); ++ if (error) ++ return -1; ++#if defined(RSSIOFFSET) ++ rssi = wl_update_rssi_offset(rssi); ++#endif ++ ++ error = wldev_get_ssid(net, &ssid); ++ if (error) ++ return -1; ++ if ((ssid.SSID_len == 0) || (ssid.SSID_len > DOT11_MAX_SSID_LEN)) { ++ AP6210_ERR("%s: wldev_get_ssid failed\n", __FUNCTION__); ++ } else { ++ memcpy(command, ssid.SSID, ssid.SSID_len); ++ bytes_written = ssid.SSID_len; ++ } ++ bytes_written += snprintf(&command[bytes_written], total_len, " rssi %d", rssi); ++ AP6210_DEBUG("%s: command result is %s (%d)\n", __FUNCTION__, command, bytes_written); ++ return bytes_written; ++} ++ ++static int wl_android_set_suspendopt(struct net_device *dev, char *command, int total_len) ++{ ++ int suspend_flag; ++ int ret_now; ++ int ret = 0; ++ ++ suspend_flag = *(command + strlen(CMD_SETSUSPENDOPT) + 1) - '0'; ++ ++ if (suspend_flag != 0) ++ suspend_flag = 1; ++ ret_now = net_os_set_suspend_disable(dev, suspend_flag); ++ ++ if (ret_now != suspend_flag) { ++ if (!(ret = net_os_set_suspend(dev, ret_now, 1))) ++ AP6210_DEBUG("%s: Suspend Flag %d -> %d\n", ++ __FUNCTION__, ret_now, suspend_flag); ++ else ++ AP6210_ERR("%s: failed %d\n", __FUNCTION__, ret); ++ } ++ return ret; ++} ++ ++static int wl_android_set_suspendmode(struct net_device *dev, char *command, int total_len) ++{ ++ int ret = 0; ++ ++#if !defined(CONFIG_HAS_EARLYSUSPEND) || !defined(DHD_USE_EARLYSUSPEND) ++ int suspend_flag; ++ ++ suspend_flag = *(command + strlen(CMD_SETSUSPENDMODE) + 1) - '0'; ++ ++ if (suspend_flag != 0) ++ suspend_flag = 1; ++ ++ if (!(ret = net_os_set_suspend(dev, suspend_flag, 0))) ++ AP6210_DEBUG("%s: Suspend Mode %d\n",__FUNCTION__,suspend_flag); ++ else ++ AP6210_ERR("%s: failed %d\n",__FUNCTION__,ret); ++#endif ++ return ret; ++} ++ ++static int wl_android_get_band(struct net_device *dev, char *command, int total_len) ++{ ++ uint band; ++ int bytes_written; ++ int error; ++ ++ error = wldev_get_band(dev, &band); ++ if (error) ++ return -1; ++ bytes_written = snprintf(command, total_len, "Band %d", band); ++ return bytes_written; ++} ++ ++#if defined(PNO_SUPPORT) && !defined(WL_SCHED_SCAN) ++static int wl_android_set_pno_setup(struct net_device *dev, char *command, int total_len) ++{ ++ wlc_ssid_t ssids_local[MAX_PFN_LIST_COUNT]; ++ int res = -1; ++ int nssid = 0; ++ cmd_tlv_t *cmd_tlv_temp; ++ char *str_ptr; ++ int tlv_size_left; ++ int pno_time = 0; ++ int pno_repeat = 0; ++ int pno_freq_expo_max = 0; ++ ++#ifdef PNO_SET_DEBUG ++ int i; ++ char pno_in_example[] = { ++ 'P', 'N', 'O', 'S', 'E', 'T', 'U', 'P', ' ', ++ 'S', '1', '2', '0', ++ 'S', ++ 0x05, ++ 'd', 'l', 'i', 'n', 'k', ++ 'S', ++ 0x04, ++ 'G', 'O', 'O', 'G', ++ 'T', ++ '0', 'B', ++ 'R', ++ '2', ++ 'M', ++ '2', ++ 0x00 ++ }; ++#endif /* PNO_SET_DEBUG */ ++ ++ AP6210_DEBUG("%s: command=%s, len=%d\n", __FUNCTION__, command, total_len); ++ ++ if (total_len < (strlen(CMD_PNOSETUP_SET) + sizeof(cmd_tlv_t))) { ++ AP6210_ERR("%s argument=%d less min size\n", __FUNCTION__, total_len); ++ goto exit_proc; ++ } ++ ++ ++#ifdef PNO_SET_DEBUG ++ memcpy(command, pno_in_example, sizeof(pno_in_example)); ++ for (i = 0; i < sizeof(pno_in_example); i++) ++ AP6210_DUMP("%02X ", command[i]); ++ AP6210_DUMP("\n"); ++ total_len = sizeof(pno_in_example); ++#endif ++ ++ str_ptr = command + strlen(CMD_PNOSETUP_SET); ++ tlv_size_left = total_len - strlen(CMD_PNOSETUP_SET); ++ ++ cmd_tlv_temp = (cmd_tlv_t *)str_ptr; ++ memset(ssids_local, 0, sizeof(ssids_local)); ++ ++ if ((cmd_tlv_temp->prefix == PNO_TLV_PREFIX) && ++ (cmd_tlv_temp->version == PNO_TLV_VERSION) && ++ (cmd_tlv_temp->subver == PNO_TLV_SUBVERSION)) { ++ ++ str_ptr += sizeof(cmd_tlv_t); ++ tlv_size_left -= sizeof(cmd_tlv_t); ++ ++ if ((nssid = wl_iw_parse_ssid_list_tlv(&str_ptr, ssids_local, ++ MAX_PFN_LIST_COUNT, &tlv_size_left)) <= 0) { ++ AP6210_ERR("SSID is not presented or corrupted ret=%d\n", nssid); ++ goto exit_proc; ++ } else { ++ if ((str_ptr[0] != PNO_TLV_TYPE_TIME) || (tlv_size_left <= 1)) { ++ AP6210_ERR("%s scan duration corrupted field size %d\n", ++ __FUNCTION__, tlv_size_left); ++ goto exit_proc; ++ } ++ str_ptr++; ++ pno_time = simple_strtoul(str_ptr, &str_ptr, 16); ++ AP6210_DEBUG("%s: pno_time=%d\n", __FUNCTION__, pno_time); ++ ++ if (str_ptr[0] != 0) { ++ if ((str_ptr[0] != PNO_TLV_FREQ_REPEAT)) { ++ AP6210_ERR("%s pno repeat : corrupted field\n", ++ __FUNCTION__); ++ goto exit_proc; ++ } ++ str_ptr++; ++ pno_repeat = simple_strtoul(str_ptr, &str_ptr, 16); ++ AP6210_DEBUG("%s :got pno_repeat=%d\n", __FUNCTION__, pno_repeat); ++ if (str_ptr[0] != PNO_TLV_FREQ_EXPO_MAX) { ++ AP6210_ERR("%s FREQ_EXPO_MAX corrupted field size\n", ++ __FUNCTION__); ++ goto exit_proc; ++ } ++ str_ptr++; ++ pno_freq_expo_max = simple_strtoul(str_ptr, &str_ptr, 16); ++ AP6210_DEBUG("%s: pno_freq_expo_max=%d\n", ++ __FUNCTION__, pno_freq_expo_max); ++ } ++ } ++ } else { ++ AP6210_ERR("%s get wrong TLV command\n", __FUNCTION__); ++ goto exit_proc; ++ } ++ ++ res = dhd_dev_pno_set(dev, ssids_local, nssid, pno_time, pno_repeat, pno_freq_expo_max); ++ ++exit_proc: ++ return res; ++} ++#endif /* PNO_SUPPORT && !WL_SCHED_SCAN */ ++ ++static int wl_android_get_p2p_dev_addr(struct net_device *ndev, char *command, int total_len) ++{ ++ int ret; ++ int bytes_written = 0; ++ ++ ret = wl_cfg80211_get_p2p_dev_addr(ndev, (struct ether_addr*)command); ++ if (ret) ++ return 0; ++ bytes_written = sizeof(struct ether_addr); ++ return bytes_written; ++} ++ ++/** ++ * Global function definitions (declared in wl_android.h) ++ */ ++ ++int wl_android_wifi_on(struct net_device *dev) ++{ ++ int ret = 0; ++ int retry = POWERUP_MAX_RETRY; ++ ++ AP6210_DEBUG("%s in\n", __FUNCTION__); ++ if (!dev) { ++ AP6210_ERR("%s: dev is null\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ dhd_net_if_lock(dev); ++ if (!g_wifi_on) { ++ do { ++ dhd_customer_gpio_wlan_ctrl(WLAN_RESET_ON); ++ ret = sdioh_start(NULL, 0); ++ if (ret == 0) ++ break; ++ AP6210_ERR("failed to power up wifi chip, retry again (%d left) **\n\n", ++ retry+1); ++ dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); ++ } while (retry-- >= 0); ++ if (ret != 0) { ++ AP6210_ERR("failed to power up wifi chip, max retry reached **\n\n"); ++ goto exit; ++ } ++ ret = dhd_dev_reset(dev, FALSE); ++ if (ret) ++ goto err; ++ sdioh_start(NULL, 1); ++ if (!ret) { ++ if (dhd_dev_init_ioctl(dev) < 0) { ++ ret = -EFAULT; ++ goto err; ++ } ++ } ++#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) ++ dhd_wlfc_init(bcmsdh_get_drvdata()); ++#endif ++ g_wifi_on = TRUE; ++ } ++ ++exit: ++ dhd_net_if_unlock(dev); ++ AP6210_DEBUG("%s: Success\n", __FUNCTION__); ++ return ret; ++err: ++ dhd_dev_reset(dev, TRUE); ++ sdioh_stop(NULL); ++ dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); ++ dhd_net_if_unlock(dev); ++ AP6210_DEBUG("%s: Failed\n", __FUNCTION__); ++ ++ return ret; ++} ++ ++int wl_android_wifi_off(struct net_device *dev) ++{ ++ int ret = 0; ++ ++ AP6210_DEBUG("%s in\n", __FUNCTION__); ++ if (!dev) { ++ AP6210_DEBUG("%s: dev is null\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ dhd_net_if_lock(dev); ++ if (g_wifi_on) { ++#if defined(PROP_TXSTATUS) && !defined(PROP_TXSTATUS_VSDB) ++ dhd_wlfc_deinit(bcmsdh_get_drvdata()); ++#endif ++ ret = dhd_dev_reset(dev, TRUE); ++ sdioh_stop(NULL); ++ dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); ++ g_wifi_on = FALSE; ++ } ++ dhd_net_if_unlock(dev); ++ ++ return ret; ++} ++ ++static int wl_android_set_fwpath(struct net_device *net, char *command, int total_len) ++{ ++ if ((strlen(command) - strlen(CMD_SETFWPATH)) > MOD_PARAM_PATHLEN) ++ return -1; ++ bcm_strncpy_s(fw_path, sizeof(fw_path), ++ command + strlen(CMD_SETFWPATH) + 1, MOD_PARAM_PATHLEN - 1); ++ if (strstr(fw_path, "apsta") != NULL) { ++ AP6210_DEBUG("GOT APSTA FIRMWARE\n"); ++ ap_fw_loaded = TRUE; ++ } else { ++ AP6210_DEBUG("GOT STA FIRMWARE\n"); ++ ap_fw_loaded = FALSE; ++ } ++ return 0; ++} ++ ++static int ++wl_android_set_pmk(struct net_device *dev, char *command, int total_len) ++{ ++ uchar pmk[33]; ++ int error = 0; ++ char smbuf[WLC_IOCTL_SMLEN]; ++#ifdef OKC_DEBUG ++ int i = 0; ++#endif ++ ++ bzero(pmk, sizeof(pmk)); ++ memcpy((char *)pmk, command + strlen("SET_PMK "), 32); ++ error = wldev_iovar_setbuf(dev, "okc_info_pmk", pmk, 32, smbuf, sizeof(smbuf), NULL); ++ if (error) { ++ AP6210_ERR("Failed to set PMK for OKC, error = %d\n", error); ++ } ++#ifdef OKC_DEBUG ++ AP6210_ERR("PMK is "); ++ for (i = 0; i < 32; i++) ++ AP6210_ERR("%02X ", pmk[i]); ++ ++ AP6210_ERR("\n"); ++#endif ++ return error; ++} ++ ++static int ++wl_android_okc_enable(struct net_device *dev, char *command, int total_len) ++{ ++ int error = 0; ++ char okc_enable = 0; ++ ++ okc_enable = command[strlen(CMD_OKC_ENABLE) + 1] - '0'; ++ error = wldev_iovar_setint(dev, "okc_enable", okc_enable); ++ if (error) { ++ AP6210_ERR("Failed to %s OKC, error = %d\n", ++ okc_enable ? "enable" : "disable", error); ++ } ++ ++ return error; ++} ++ ++int wl_android_set_roam_mode(struct net_device *dev, char *command, int total_len) ++{ ++ int error = 0; ++ int mode = 0; ++ ++ if (sscanf(command, "%*s %d", &mode) != 1) { ++ AP6210_ERR("%s: Failed to get Parameter\n", __FUNCTION__); ++ return -1; ++ } ++ ++ error = wldev_iovar_setint(dev, "roam_off", mode); ++ if (error) { ++ AP6210_ERR("%s: Failed to set roaming Mode %d, error = %d\n", ++ __FUNCTION__, mode, error); ++ return -1; ++ } ++ else ++ AP6210_ERR("%s: succeeded to set roaming Mode %d, error = %d\n", ++ __FUNCTION__, mode, error); ++ return 0; ++} ++ ++int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) ++{ ++#define PRIVATE_COMMAND_MAX_LEN 8192 ++ int ret = 0; ++ char *command = NULL; ++ int bytes_written = 0; ++ android_wifi_priv_cmd priv_cmd; ++ ++ net_os_wake_lock(net); ++ ++ if (!ifr->ifr_data) { ++ ret = -EINVAL; ++ goto exit; ++ } ++ if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(android_wifi_priv_cmd))) { ++ ret = -EFAULT; ++ goto exit; ++ } ++ if (priv_cmd.total_len > PRIVATE_COMMAND_MAX_LEN) ++ { ++ AP6210_ERR("%s: too long priavte command\n", __FUNCTION__); ++ ret = -EINVAL; ++ } ++ command = kmalloc(priv_cmd.total_len, GFP_KERNEL); ++ if (!command) ++ { ++ AP6210_ERR("%s: failed to allocate memory\n", __FUNCTION__); ++ ret = -ENOMEM; ++ goto exit; ++ } ++ if (copy_from_user(command, priv_cmd.buf, priv_cmd.total_len)) { ++ ret = -EFAULT; ++ goto exit; ++ } ++ ++ AP6210_DEBUG("%s: Android private cmd \"%s\" on %s\n", __FUNCTION__, command, ifr->ifr_name); ++ ++ if (strnicmp(command, CMD_START, strlen(CMD_START)) == 0) { ++ AP6210_DEBUG("%s, Received regular START command\n", __FUNCTION__); ++ bytes_written = wl_android_wifi_on(net); ++ } ++ else if (strnicmp(command, CMD_SETFWPATH, strlen(CMD_SETFWPATH)) == 0) { ++ bytes_written = wl_android_set_fwpath(net, command, priv_cmd.total_len); ++ } ++ ++ if (!g_wifi_on) { ++ AP6210_ERR("%s: Ignore private cmd \"%s\" - iface %s is down\n", ++ __FUNCTION__, command, ifr->ifr_name); ++ ret = 0; ++ goto exit; ++ } ++ ++ if (strnicmp(command, CMD_STOP, strlen(CMD_STOP)) == 0) { ++ bytes_written = wl_android_wifi_off(net); ++ } ++ else if (strnicmp(command, CMD_SCAN_ACTIVE, strlen(CMD_SCAN_ACTIVE)) == 0) { ++ /* TBD: SCAN-ACTIVE */ ++ } ++ else if (strnicmp(command, CMD_SCAN_PASSIVE, strlen(CMD_SCAN_PASSIVE)) == 0) { ++ /* TBD: SCAN-PASSIVE */ ++ } ++ else if (strnicmp(command, CMD_RSSI, strlen(CMD_RSSI)) == 0) { ++ bytes_written = wl_android_get_rssi(net, command, priv_cmd.total_len); ++ } ++ else if (strnicmp(command, CMD_LINKSPEED, strlen(CMD_LINKSPEED)) == 0) { ++ bytes_written = wl_android_get_link_speed(net, command, priv_cmd.total_len); ++ } ++#ifdef PKT_FILTER_SUPPORT ++ else if (strnicmp(command, CMD_RXFILTER_START, strlen(CMD_RXFILTER_START)) == 0) { ++ bytes_written = net_os_enable_packet_filter(net, 1); ++ } ++ else if (strnicmp(command, CMD_RXFILTER_STOP, strlen(CMD_RXFILTER_STOP)) == 0) { ++ bytes_written = net_os_enable_packet_filter(net, 0); ++ } ++ else if (strnicmp(command, CMD_RXFILTER_ADD, strlen(CMD_RXFILTER_ADD)) == 0) { ++ int filter_num = *(command + strlen(CMD_RXFILTER_ADD) + 1) - '0'; ++ bytes_written = net_os_rxfilter_add_remove(net, TRUE, filter_num); ++ } ++ else if (strnicmp(command, CMD_RXFILTER_REMOVE, strlen(CMD_RXFILTER_REMOVE)) == 0) { ++ int filter_num = *(command + strlen(CMD_RXFILTER_REMOVE) + 1) - '0'; ++ bytes_written = net_os_rxfilter_add_remove(net, FALSE, filter_num); ++ } ++#endif /* PKT_FILTER_SUPPORT */ ++ else if (strnicmp(command, CMD_BTCOEXSCAN_START, strlen(CMD_BTCOEXSCAN_START)) == 0) { ++ /* TBD: BTCOEXSCAN-START */ ++ } ++ else if (strnicmp(command, CMD_BTCOEXSCAN_STOP, strlen(CMD_BTCOEXSCAN_STOP)) == 0) { ++ /* TBD: BTCOEXSCAN-STOP */ ++ } ++ else if (strnicmp(command, CMD_BTCOEXMODE, strlen(CMD_BTCOEXMODE)) == 0) { ++#ifdef WL_CFG80211 ++ bytes_written = wl_cfg80211_set_btcoex_dhcp(net, command); ++#else ++#ifdef PKT_FILTER_SUPPORT ++ uint mode = *(command + strlen(CMD_BTCOEXMODE) + 1) - '0'; ++ ++ if (mode == 1) ++ net_os_enable_packet_filter(net, 0); /* DHCP starts */ ++ else ++ net_os_enable_packet_filter(net, 1); /* DHCP ends */ ++#endif /* PKT_FILTER_SUPPORT */ ++#endif /* WL_CFG80211 */ ++ } ++ else if (strnicmp(command, CMD_SETSUSPENDOPT, strlen(CMD_SETSUSPENDOPT)) == 0) { ++ bytes_written = wl_android_set_suspendopt(net, command, priv_cmd.total_len); ++ } ++ else if (strnicmp(command, CMD_SETSUSPENDMODE, strlen(CMD_SETSUSPENDMODE)) == 0) { ++ bytes_written = wl_android_set_suspendmode(net, command, priv_cmd.total_len); ++ } ++ else if (strnicmp(command, CMD_SETBAND, strlen(CMD_SETBAND)) == 0) { ++ uint band = *(command + strlen(CMD_SETBAND) + 1) - '0'; ++#ifdef WL_HOST_BAND_MGMT ++ if (wl_cfg80211_set_band(net, band) < 0) { ++ bytes_written = -1; ++ goto exit; ++ } ++ if (band == WLC_BAND_AUTO) ++ bytes_written = wldev_set_band(net, band); ++#else ++ bytes_written = wldev_set_band(net, band); ++#endif /* WL_HOST_BAND_MGMT */ ++ } ++ else if (strnicmp(command, CMD_GETBAND, strlen(CMD_GETBAND)) == 0) { ++ bytes_written = wl_android_get_band(net, command, priv_cmd.total_len); ++ } ++#ifdef WL_CFG80211 ++ /* CUSTOMER_SET_COUNTRY feature is define for only GGSM model */ ++ else if (strnicmp(command, CMD_COUNTRY, strlen(CMD_COUNTRY)) == 0) { ++ char *country_code = command + strlen(CMD_COUNTRY) + 1; ++ bytes_written = wldev_set_country(net, country_code); ++ } ++#endif /* WL_CFG80211 */ ++#if defined(PNO_SUPPORT) && !defined(WL_SCHED_SCAN) ++ else if (strnicmp(command, CMD_PNOSSIDCLR_SET, strlen(CMD_PNOSSIDCLR_SET)) == 0) { ++ bytes_written = dhd_dev_pno_reset(net); ++ } ++ else if (strnicmp(command, CMD_PNOSETUP_SET, strlen(CMD_PNOSETUP_SET)) == 0) { ++ bytes_written = wl_android_set_pno_setup(net, command, priv_cmd.total_len); ++ } ++ else if (strnicmp(command, CMD_PNOENABLE_SET, strlen(CMD_PNOENABLE_SET)) == 0) { ++ uint pfn_enabled = *(command + strlen(CMD_PNOENABLE_SET) + 1) - '0'; ++ bytes_written = dhd_dev_pno_enable(net, pfn_enabled); ++ } ++#endif /* PNO_SUPPORT && !WL_SCHED_SCAN */ ++ else if (strnicmp(command, CMD_P2P_DEV_ADDR, strlen(CMD_P2P_DEV_ADDR)) == 0) { ++ bytes_written = wl_android_get_p2p_dev_addr(net, command, priv_cmd.total_len); ++ } ++ else if (strnicmp(command, CMD_P2P_SET_NOA, strlen(CMD_P2P_SET_NOA)) == 0) { ++ int skip = strlen(CMD_P2P_SET_NOA) + 1; ++ bytes_written = wl_cfg80211_set_p2p_noa(net, command + skip, ++ priv_cmd.total_len - skip); ++ } ++#if !defined WL_ENABLE_P2P_IF ++ else if (strnicmp(command, CMD_P2P_GET_NOA, strlen(CMD_P2P_GET_NOA)) == 0) { ++ bytes_written = wl_cfg80211_get_p2p_noa(net, command, priv_cmd.total_len); ++ } ++#endif /* WL_ENABLE_P2P_IF */ ++ else if (strnicmp(command, CMD_P2P_SET_PS, strlen(CMD_P2P_SET_PS)) == 0) { ++ int skip = strlen(CMD_P2P_SET_PS) + 1; ++ bytes_written = wl_cfg80211_set_p2p_ps(net, command + skip, ++ priv_cmd.total_len - skip); ++ } ++#ifdef WL_CFG80211 ++ else if (strnicmp(command, CMD_SET_AP_WPS_P2P_IE, ++ strlen(CMD_SET_AP_WPS_P2P_IE)) == 0) { ++ int skip = strlen(CMD_SET_AP_WPS_P2P_IE) + 3; ++ bytes_written = wl_cfg80211_set_wps_p2p_ie(net, command + skip, ++ priv_cmd.total_len - skip, *(command + skip - 2) - '0'); ++ } ++#endif /* WL_CFG80211 */ ++ else if (strnicmp(command, CMD_OKC_SET_PMK, strlen(CMD_OKC_SET_PMK)) == 0) ++ bytes_written = wl_android_set_pmk(net, command, priv_cmd.total_len); ++ else if (strnicmp(command, CMD_OKC_ENABLE, strlen(CMD_OKC_ENABLE)) == 0) ++ bytes_written = wl_android_okc_enable(net, command, priv_cmd.total_len); ++ else if (strnicmp(command, CMD_SETROAMMODE, strlen(CMD_SETROAMMODE)) == 0) ++ bytes_written = wl_android_set_roam_mode(net, command, priv_cmd.total_len); ++ else { ++ AP6210_ERR("Unknown PRIVATE command %s - ignored\n", command); ++ snprintf(command, 3, "OK"); ++ bytes_written = strlen("OK"); ++ } ++ ++ if (bytes_written >= 0) { ++ if ((bytes_written == 0) && (priv_cmd.total_len > 0)) ++ command[0] = '\0'; ++ if (bytes_written >= priv_cmd.total_len) { ++ AP6210_ERR("%s: bytes_written = %d\n", __FUNCTION__, bytes_written); ++ bytes_written = priv_cmd.total_len; ++ } else { ++ bytes_written++; ++ } ++ priv_cmd.used_len = bytes_written; ++ if (copy_to_user(priv_cmd.buf, command, bytes_written)) { ++ AP6210_ERR("%s: failed to copy data to user buffer\n", __FUNCTION__); ++ ret = -EFAULT; ++ } ++ } ++ else { ++ ret = bytes_written; ++ } ++ ++exit: ++ net_os_wake_unlock(net); ++ if (command) { ++ kfree(command); ++ } ++ ++ return ret; ++} ++ ++int wl_android_init(void) ++{ ++ int ret = 0; ++ ++ dhd_msg_level |= DHD_ERROR_VAL; ++#ifdef ENABLE_INSMOD_NO_FW_LOAD ++ dhd_download_fw_on_driverload = FALSE; ++#endif /* ENABLE_INSMOD_NO_FW_LOAD */ ++ if (!iface_name[0]) { ++ memset(iface_name, 0, IFNAMSIZ); ++ bcm_strncpy_s(iface_name, IFNAMSIZ, "wlan", IFNAMSIZ); ++ } ++ return ret; ++} ++ ++int wl_android_exit(void) ++{ ++ int ret = 0; ++ ++ return ret; ++} ++ ++void wl_android_post_init(void) ++{ ++ if (!dhd_download_fw_on_driverload) { ++ /* Call customer gpio to turn off power with WL_REG_ON signal */ ++ dhd_customer_gpio_wlan_ctrl(WLAN_RESET_OFF); ++ g_wifi_on = 0; ++ } ++} ++ ++#if defined(RSSIAVG) ++void ++wl_free_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl) ++{ ++ wl_rssi_cache_t *node, *cur, **rssi_head; ++ int i=0; ++ ++ rssi_head = &rssi_cache_ctrl->m_cache_head; ++ node = *rssi_head; ++ ++ for (;node;) { ++ AP6210_DEBUG("%s: Free %d with BSSID %pM\n", ++ __FUNCTION__, i, &node->BSSID); ++ cur = node; ++ node = cur->next; ++ kfree(cur); ++ i++; ++ } ++ *rssi_head = NULL; ++} ++ ++void ++wl_delete_dirty_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl) ++{ ++ wl_rssi_cache_t *node, *prev, **rssi_head; ++ int i = -1, tmp = 0; ++#if defined(BSSCACHE) ++ int max = BSSCACHE_LEN; ++#else ++ int max = RSSICACHE_LEN; ++#endif ++ ++ rssi_head = &rssi_cache_ctrl->m_cache_head; ++ node = *rssi_head; ++ prev = node; ++ for (;node;) { ++ i++; ++ if (node->dirty >= max || node->dirty >= RSSICACHE_LEN) { ++ if (node == *rssi_head) { ++ tmp = 1; ++ *rssi_head = node->next; ++ } else { ++ tmp = 0; ++ prev->next = node->next; ++ } ++ AP6210_DEBUG("%s: Del %d with BSSID %pM\n", ++ __FUNCTION__, i, &node->BSSID); ++ kfree(node); ++ if (tmp == 1) { ++ node = *rssi_head; ++ prev = node; ++ } else { ++ node = prev->next; ++ } ++ continue; ++ } ++ prev = node; ++ node = node->next; ++ } ++} ++ ++void ++wl_reset_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl) ++{ ++ wl_rssi_cache_t *node, **rssi_head; ++ ++ rssi_head = &rssi_cache_ctrl->m_cache_head; ++ ++ /* reset dirty */ ++ node = *rssi_head; ++ for (;node;) { ++ node->dirty += 1; ++ node = node->next; ++ } ++} ++ ++void ++wl_update_connected_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, struct net_device *net) ++{ ++ wl_rssi_cache_t *node, *prev, **rssi_head; ++ int j, k=0; ++ int rssi, error; ++ struct ether_addr bssid; ++ ++ error = wldev_ioctl(net, WLC_GET_BSSID, &bssid, sizeof(bssid), false); ++ if (error) ++ return; ++ error = wldev_get_rssi(net, &rssi); ++ if (error) ++ return; ++ ++ /* update RSSI */ ++ rssi_head = &rssi_cache_ctrl->m_cache_head; ++ node = *rssi_head; ++ for (;node;) { ++ if (!memcmp(&node->BSSID, &bssid, ETHER_ADDR_LEN)) { ++ AP6210_DEBUG("%s: Update %d with BSSID %pM, RSSI=%d\n", ++ __FUNCTION__, k, &bssid, rssi); ++ for(j=0; jRSSI[j] = node->RSSI[j+1]; ++ node->RSSI[j] = rssi; ++ node->dirty = 0; ++ break; ++ } ++ prev = node; ++ node = node->next; ++ k++; ++ } ++} ++ ++void ++wl_update_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, wl_scan_results_t *ss_list) ++{ ++ wl_rssi_cache_t *node, *prev, *leaf, **rssi_head; ++ wl_bss_info_t *bi = NULL; ++ int i, j, k; ++ ++ if (!ss_list->count) ++ return; ++ ++ rssi_head = &rssi_cache_ctrl->m_cache_head; ++ ++ /* update RSSI */ ++ for (i = 0; i < ss_list->count; i++) { ++ node = *rssi_head; ++ prev = NULL; ++ k = 0; ++ bi = bi ? (wl_bss_info_t *)((uintptr)bi + dtoh32(bi->length)) : ss_list->bss_info; ++ for (;node;) { ++ if (!memcmp(&node->BSSID, &bi->BSSID, ETHER_ADDR_LEN)) { ++ AP6210_DEBUG("%s: Update %d with BSSID %pM, RSSI=%d, SSID \"%s\"\n", ++ __FUNCTION__, k, &bi->BSSID, dtoh16(bi->RSSI), bi->SSID); ++ for(j=0; jRSSI[j] = node->RSSI[j+1]; ++ node->RSSI[j] = dtoh16(bi->RSSI); ++ node->dirty = 0; ++ break; ++ } ++ prev = node; ++ node = node->next; ++ k++; ++ } ++ ++ if (node) ++ continue; ++ ++ leaf = kmalloc(sizeof(wl_rssi_cache_t), GFP_KERNEL); ++ if (!leaf) { ++ AP6210_ERR("%s: Memory alloc failure %d\n", ++ __FUNCTION__, sizeof(wl_rssi_cache_t)); ++ return; ++ } ++ AP6210_DEBUG("%s: Add %d with cached BSSID %pM, RSSI=%d, SSID \"%s\" in the leaf\n", ++ __FUNCTION__, k, &bi->BSSID, dtoh16(bi->RSSI), bi->SSID); ++ ++ leaf->next = NULL; ++ leaf->dirty = 0; ++ memcpy(&leaf->BSSID, &bi->BSSID, ETHER_ADDR_LEN); ++ for (j=0; jRSSI[j] = dtoh16(bi->RSSI); ++ ++ if (!prev) ++ *rssi_head = leaf; ++ else ++ prev->next = leaf; ++ } ++} ++ ++int16 ++wl_get_avg_rssi(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, void *addr) ++{ ++ wl_rssi_cache_t *node, **rssi_head; ++ int j, rssi_sum, rssi=-200; ++ ++ rssi_head = &rssi_cache_ctrl->m_cache_head; ++ ++ /* reset dirty */ ++ node = *rssi_head; ++ for (;node;) { ++ if (!memcmp(&node->BSSID, addr, ETHER_ADDR_LEN)) { ++ rssi_sum = 0; ++ rssi = 0; ++ for (j=0; jRSSI[RSSIAVG_LEN-j-1]; ++ rssi = rssi_sum / j; ++ break; ++ } ++ node = node->next; ++ } ++ if (rssi >= -2) ++ rssi = -2; ++ if (rssi == -200) { ++ AP6210_ERR("%s: BSSID %pM does not in RSSI cache\n", ++ __FUNCTION__, addr); ++ } ++ return (int16)rssi; ++} ++#endif ++ ++#if defined(RSSIOFFSET) ++int ++wl_update_rssi_offset(int rssi) ++{ ++ uint chip, chiprev; ++ ++ chip = dhd_bus_chip_id(bcmsdh_get_drvdata()); ++ chiprev = dhd_bus_chiprev_id(bcmsdh_get_drvdata()); ++ if (chip == BCM4330_CHIP_ID && chiprev == BCM4330B2_CHIP_REV) { ++#if defined(RSSIOFFSET_NEW) ++ int j; ++ for (j=0; j= -2) ++ rssi = -2; ++ return rssi; ++} ++#endif ++ ++#if defined(BSSCACHE) ++#define WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN 32 ++ ++void ++wl_free_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl) ++{ ++ wl_bss_cache_t *node, *cur, **bss_head; ++ int i=0; ++ ++ AP6210_DEBUG("%s called\n", __FUNCTION__); ++ ++ bss_head = &bss_cache_ctrl->m_cache_head; ++ node = *bss_head; ++ ++ for (;node;) { ++ AP6210_DEBUG("%s: Free %d with BSSID %pM\n", ++ __FUNCTION__, i, &node->results.bss_info->BSSID); ++ cur = node; ++ node = cur->next; ++ kfree(cur); ++ i++; ++ } ++ *bss_head = NULL; ++} ++ ++void ++wl_delete_dirty_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl) ++{ ++ wl_bss_cache_t *node, *prev, **bss_head; ++ int i = -1, tmp = 0; ++ ++ bss_head = &bss_cache_ctrl->m_cache_head; ++ node = *bss_head; ++ prev = node; ++ for (;node;) { ++ i++; ++ if (node->dirty >= BSSCACHE_LEN) { ++ if (node == *bss_head) { ++ tmp = 1; ++ *bss_head = node->next; ++ } else { ++ tmp = 0; ++ prev->next = node->next; ++ } ++ AP6210_DEBUG("%s: Del %d with BSSID %pM, RSSI=%d, SSID \"%s\"\n", ++ __FUNCTION__, i, &node->results.bss_info->BSSID, ++ dtoh16(node->results.bss_info->RSSI), node->results.bss_info->SSID); ++ kfree(node); ++ if (tmp == 1) { ++ node = *bss_head; ++ prev = node; ++ } else { ++ node = prev->next; ++ } ++ continue; ++ } ++ prev = node; ++ node = node->next; ++ } ++} ++ ++void ++wl_reset_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl) ++{ ++ wl_bss_cache_t *node, **bss_head; ++ ++ bss_head = &bss_cache_ctrl->m_cache_head; ++ ++ /* reset dirty */ ++ node = *bss_head; ++ for (;node;) { ++ node->dirty += 1; ++ node = node->next; ++ } ++} ++ ++void ++wl_update_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl, wl_scan_results_t *ss_list) ++{ ++ wl_bss_cache_t *node, *prev, *leaf, *tmp, **bss_head; ++ wl_bss_info_t *bi = NULL; ++ int i, k=0; ++ ++ if (!ss_list->count) ++ return; ++ ++ bss_head = &bss_cache_ctrl->m_cache_head; ++ ++ for (i=0; i < ss_list->count; i++) { ++ node = *bss_head; ++ prev = NULL; ++ bi = bi ? (wl_bss_info_t *)((uintptr)bi + dtoh32(bi->length)) : ss_list->bss_info; ++ ++ for (;node;) { ++ if (!memcmp(&node->results.bss_info->BSSID, &bi->BSSID, ETHER_ADDR_LEN)) { ++ tmp = node; ++ leaf = kmalloc(dtoh32(bi->length) + WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN, GFP_KERNEL); ++ if (!leaf) { ++ AP6210_ERR("%s: Memory alloc failure %d and keep old BSS info\n", ++ __FUNCTION__, dtoh32(bi->length) + WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN); ++ break; ++ } ++ ++ memcpy(leaf->results.bss_info, bi, dtoh32(bi->length)); ++ leaf->next = node->next; ++ leaf->dirty = 0; ++ leaf->results.count = 1; ++ leaf->results.version = ss_list->version; ++ AP6210_DEBUG("%s: Update %d with BSSID %pM, RSSI=%d, SSID \"%s\"\n", ++ __FUNCTION__, k, &bi->BSSID, dtoh16(bi->RSSI), bi->SSID); ++ if (!prev) ++ *bss_head = leaf; ++ else ++ prev->next = leaf; ++ node = leaf; ++ prev = node; ++ ++ kfree(tmp); ++ k++; ++ break; ++ } ++ prev = node; ++ node = node->next; ++ } ++ ++ if (node) ++ continue; ++ ++ leaf = kmalloc(dtoh32(bi->length) + WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN, GFP_KERNEL); ++ if (!leaf) { ++ AP6210_ERR("%s: Memory alloc failure %d\n", __FUNCTION__, ++ dtoh32(bi->length) + WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN); ++ return; ++ } ++ AP6210_DEBUG("%s: Add %d with cached BSSID %pM, RSSI=%d, SSID \"%s\" in the leaf\n", ++ __FUNCTION__, k, &bi->BSSID, dtoh16(bi->RSSI), bi->SSID); ++ ++ memcpy(leaf->results.bss_info, bi, dtoh32(bi->length)); ++ leaf->next = NULL; ++ leaf->dirty = 0; ++ leaf->results.count = 1; ++ leaf->results.version = ss_list->version; ++ k++; ++ ++ if (!prev) ++ *bss_head = leaf; ++ else ++ prev->next = leaf; ++ } ++} ++ ++void ++wl_run_bss_cache_timer(wl_bss_cache_ctrl_t *bss_cache_ctrl, int kick_off) ++{ ++ struct timer_list **timer; ++ ++ timer = &bss_cache_ctrl->m_timer; ++ ++ if (*timer) { ++ if (kick_off) { ++ (*timer)->expires = jiffies + BSSCACHE_TIME * HZ / 1000; ++ add_timer(*timer); ++ AP6210_DEBUG("%s: timer starts\n", __FUNCTION__); ++ } else { ++ del_timer_sync(*timer); ++ AP6210_DEBUG("%s: timer stops\n", __FUNCTION__); ++ } ++ } ++} ++ ++void ++wl_set_bss_cache_timer_flag(ulong data) ++{ ++ wl_bss_cache_ctrl_t *bss_cache_ctrl = (wl_bss_cache_ctrl_t *)data; ++ ++ bss_cache_ctrl->m_timer_expired = 1; ++ AP6210_DEBUG("%s called\n", __FUNCTION__); ++} ++ ++void ++wl_release_bss_cache_ctrl(wl_bss_cache_ctrl_t *bss_cache_ctrl) ++{ ++ AP6210_DEBUG("%s:\n", __FUNCTION__); ++ wl_free_bss_cache(bss_cache_ctrl); ++ wl_run_bss_cache_timer(bss_cache_ctrl, 0); ++ if (bss_cache_ctrl->m_timer) { ++ kfree(bss_cache_ctrl->m_timer); ++ } ++} ++ ++void ++wl_init_bss_cache_ctrl(wl_bss_cache_ctrl_t *bss_cache_ctrl) ++{ ++ AP6210_DEBUG("%s:\n", __FUNCTION__); ++ bss_cache_ctrl->m_timer_expired = 0; ++ ++ bss_cache_ctrl->m_timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL); ++ if (!bss_cache_ctrl->m_timer) { ++ AP6210_ERR("%s: Memory alloc failure\n", __FUNCTION__ ); ++ return; ++ } ++ init_timer(bss_cache_ctrl->m_timer); ++ bss_cache_ctrl->m_timer->function = (void *)wl_set_bss_cache_timer_flag; ++ bss_cache_ctrl->m_timer->data = (ulong)bss_cache_ctrl; ++} ++#endif ++ ++/** ++ * Functions for Android WiFi card detection ++ */ ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++ ++static int g_wifidev_registered = 0; ++static struct semaphore wifi_control_sem; ++static struct wifi_platform_data *wifi_control_data = NULL; ++static struct resource *wifi_irqres = NULL; ++ ++static int wifi_add_dev(void); ++static void wifi_del_dev(void); ++ ++int wl_android_wifictrl_func_add(void) ++{ ++ int ret = 0; ++ sema_init(&wifi_control_sem, 0); ++ ++ ret = wifi_add_dev(); ++ if (ret) { ++ AP6210_ERR("%s: platform_driver_register failed\n", __FUNCTION__); ++ return ret; ++ } ++ g_wifidev_registered = 1; ++ ++ /* Waiting callback after platform_driver_register is done or exit with error */ ++ if (down_timeout(&wifi_control_sem, msecs_to_jiffies(1000)) != 0) { ++ ret = -EINVAL; ++ AP6210_ERR("%s: platform_driver_register timeout\n", __FUNCTION__); ++ } ++ ++ return ret; ++} ++ ++void wl_android_wifictrl_func_del(void) ++{ ++ if (g_wifidev_registered) ++ { ++ wifi_del_dev(); ++ g_wifidev_registered = 0; ++ } ++} ++ ++void* wl_android_prealloc(int section, unsigned long size) ++{ ++ void *alloc_ptr = NULL; ++ if (wifi_control_data && wifi_control_data->mem_prealloc) { ++ alloc_ptr = wifi_control_data->mem_prealloc(section, size); ++ if (alloc_ptr) { ++ AP6210_DEBUG("success alloc section %d\n", section); ++ if (size != 0L) ++ bzero(alloc_ptr, size); ++ return alloc_ptr; ++ } ++ } ++ ++ AP6210_ERR("can't alloc section %d\n", section); ++ return NULL; ++} ++ ++int wifi_get_irq_number(unsigned long *irq_flags_ptr) ++{ ++ if (wifi_irqres) { ++ *irq_flags_ptr = wifi_irqres->flags & IRQF_TRIGGER_MASK; ++ return (int)wifi_irqres->start; ++ } ++#ifdef CUSTOM_OOB_GPIO_NUM ++ return CUSTOM_OOB_GPIO_NUM; ++#else ++ return -1; ++#endif ++} ++ ++int wifi_set_power(int on, unsigned long msec) ++{ ++ AP6210_ERR("%s = %d\n", __FUNCTION__, on); ++ if (wifi_control_data && wifi_control_data->set_power) { ++ wifi_control_data->set_power(on); ++ } ++ if (msec) ++ msleep(msec); ++ return 0; ++} ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) ++int wifi_get_mac_addr(unsigned char *buf) ++{ ++ AP6210_ERR("%s\n", __FUNCTION__); ++ if (!buf) ++ return -EINVAL; ++ if (wifi_control_data && wifi_control_data->get_mac_addr) { ++ return wifi_control_data->get_mac_addr(buf); ++ } ++ return -EOPNOTSUPP; ++} ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) */ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) ++void *wifi_get_country_code(char *ccode) ++{ ++ AP6210_DEBUG("%s\n", __FUNCTION__); ++ if (!ccode) ++ return NULL; ++ if (wifi_control_data && wifi_control_data->get_country_code) { ++ return wifi_control_data->get_country_code(ccode); ++ } ++ return NULL; ++} ++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) */ ++ ++static int wifi_set_carddetect(int on) ++{ ++ AP6210_ERR("%s = %d\n", __FUNCTION__, on); ++ if (wifi_control_data && wifi_control_data->set_carddetect) { ++ wifi_control_data->set_carddetect(on); ++ } ++ return 0; ++} ++ ++static int wifi_probe(struct platform_device *pdev) ++{ ++ struct wifi_platform_data *wifi_ctrl = ++ (struct wifi_platform_data *)(pdev->dev.platform_data); ++ ++ wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); ++ if (wifi_irqres == NULL) ++ wifi_irqres = platform_get_resource_byname(pdev, ++ IORESOURCE_IRQ, "bcm4329_wlan_irq"); ++ wifi_control_data = wifi_ctrl; ++ wifi_set_power(1, 0); /* Power On */ ++ wifi_set_carddetect(1); /* CardDetect (0->1) */ ++ ++ up(&wifi_control_sem); ++ return 0; ++} ++ ++static int wifi_remove(struct platform_device *pdev) ++{ ++ struct wifi_platform_data *wifi_ctrl = ++ (struct wifi_platform_data *)(pdev->dev.platform_data); ++ ++ AP6210_ERR("## %s\n", __FUNCTION__); ++ wifi_control_data = wifi_ctrl; ++ ++ wifi_set_power(0, WIFI_TURNOFF_DELAY); /* Power Off */ ++ wifi_set_carddetect(0); /* CardDetect (1->0) */ ++ ++ up(&wifi_control_sem); ++ return 0; ++} ++ ++static int wifi_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ AP6210_DEBUG("##> %s\n", __FUNCTION__); ++#if defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) ++ if (dhd_os_check_wakelock(bcmsdh_get_drvdata())) ++ return -EBUSY; ++#endif /* defined(CONFIG_ARCH_RHEA) || defined(CONFIG_ARCH_CAPRI) */ ++#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY) && 1 ++ bcmsdh_oob_intr_set(0); ++#endif /* (OOB_INTR_ONLY) */ ++ return 0; ++} ++ ++static int wifi_resume(struct platform_device *pdev) ++{ ++ AP6210_DEBUG("##> %s\n", __FUNCTION__); ++#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY) && 1 ++ if (dhd_os_check_if_up(bcmsdh_get_drvdata())) ++ bcmsdh_oob_intr_set(1); ++#endif /* (OOB_INTR_ONLY) */ ++ return 0; ++} ++ ++static struct platform_driver wifi_device = { ++ .probe = wifi_probe, ++ .remove = wifi_remove, ++ .suspend = wifi_suspend, ++ .resume = wifi_resume, ++ .driver = { ++ .name = "bcmdhd_wlan", ++ } ++}; ++ ++static struct platform_driver wifi_device_legacy = { ++ .probe = wifi_probe, ++ .remove = wifi_remove, ++ .suspend = wifi_suspend, ++ .resume = wifi_resume, ++ .driver = { ++ .name = "bcm4329_wlan", ++ } ++}; ++ ++static int wifi_add_dev(void) ++{ ++ int ret = 0; ++ AP6210_DEBUG("## Calling platform_driver_register\n"); ++ ret = platform_driver_register(&wifi_device); ++ if (ret) ++ return ret; ++ ++ ret = platform_driver_register(&wifi_device_legacy); ++ return ret; ++} ++ ++static void wifi_del_dev(void) ++{ ++ AP6210_DEBUG("## Unregister platform_driver_register\n"); ++ platform_driver_unregister(&wifi_device); ++ platform_driver_unregister(&wifi_device_legacy); ++} ++#endif /* defined(CONFIG_WIFI_CONTROL_FUNC) */ +diff --git a/drivers/net/wireless/ap6210/wl_android.h b/drivers/net/wireless/ap6210/wl_android.h +new file mode 100644 +index 0000000..d933e06 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_android.h +@@ -0,0 +1,124 @@ ++/* ++ * Linux cfg80211 driver - Android related functions ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_android.h 367273 2012-11-07 09:58:55Z $ ++ */ ++ ++#include ++#include ++#include ++ ++/* If any feature uses the Generic Netlink Interface, put it here to enable WL_GENL ++ * automatically ++ */ ++ ++/** ++ * Android platform dependent functions, feel free to add Android specific functions here ++ * (save the macros in dhd). Please do NOT declare functions that are NOT exposed to dhd ++ * or cfg, define them as static in wl_android.c ++ */ ++ ++/** ++ * wl_android_init will be called from module init function (dhd_module_init now), similarly ++ * wl_android_exit will be called from module exit function (dhd_module_cleanup now) ++ */ ++int wl_android_init(void); ++int wl_android_exit(void); ++void wl_android_post_init(void); ++int wl_android_wifi_on(struct net_device *dev); ++int wl_android_wifi_off(struct net_device *dev); ++int wl_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd); ++ ++#define BSSCACHE ++#define RSSIAVG ++#define RSSIOFFSET ++//#define RSSIOFFSET_NEW ++ ++#if defined(RSSIAVG) ++#define RSSIAVG_LEN 8 ++#define RSSICACHE_LEN 8 ++ ++typedef struct wl_rssi_cache { ++ struct wl_rssi_cache *next; ++ int dirty; ++ struct ether_addr BSSID; ++ int16 RSSI[RSSIAVG_LEN]; ++} wl_rssi_cache_t; ++ ++typedef struct wl_rssi_cache_ctrl { ++ wl_rssi_cache_t *m_cache_head; ++} wl_rssi_cache_ctrl_t; ++ ++void wl_free_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl); ++void wl_delete_dirty_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl); ++void wl_reset_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl); ++void wl_update_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, wl_scan_results_t *ss_list); ++void wl_update_connected_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, struct net_device *net); ++int16 wl_get_avg_rssi(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, void *addr); ++#endif ++ ++#if defined(RSSIOFFSET) ++#define RSSI_OFFSET 5 ++#define RSSI_MAX -80 ++#define RSSI_MIN -94 ++#define RSSI_INT ((RSSI_MAX-RSSI_MIN)/RSSI_OFFSET) ++#define BCM4330_CHIP_ID 0x4330 ++#define BCM4330B2_CHIP_REV 4 ++int wl_update_rssi_offset(int rssi); ++#endif ++ ++#if defined(BSSCACHE) ++#define BSSCACHE_LEN 8 ++#define BSSCACHE_TIME 15000 ++ ++typedef struct wl_bss_cache { ++ struct wl_bss_cache *next; ++ int dirty; ++ wl_scan_results_t results; ++} wl_bss_cache_t; ++ ++typedef struct wl_bss_cache_ctrl { ++ wl_bss_cache_t *m_cache_head; ++ struct timer_list *m_timer; ++ int m_timer_expired; ++} wl_bss_cache_ctrl_t; ++ ++void wl_free_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl); ++void wl_delete_dirty_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl); ++void wl_reset_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl); ++void wl_update_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl, wl_scan_results_t *ss_list); ++void wl_run_bss_cache_timer(wl_bss_cache_ctrl_t *bss_cache_ctrl, int kick_off); ++void wl_release_bss_cache_ctrl(wl_bss_cache_ctrl_t *bss_cache_ctrl); ++void wl_init_bss_cache_ctrl(wl_bss_cache_ctrl_t *bss_cache_ctrl); ++#endif ++ ++#if defined(CONFIG_WIFI_CONTROL_FUNC) ++int wl_android_wifictrl_func_add(void); ++void wl_android_wifictrl_func_del(void); ++void* wl_android_prealloc(int section, unsigned long size); ++ ++int wifi_get_irq_number(unsigned long *irq_flags_ptr); ++int wifi_set_power(int on, unsigned long msec); ++int wifi_get_mac_addr(unsigned char *buf); ++void *wifi_get_country_code(char *ccode); ++#endif /* CONFIG_WIFI_CONTROL_FUNC */ +diff --git a/drivers/net/wireless/ap6210/wl_cfg80211.c b/drivers/net/wireless/ap6210/wl_cfg80211.c +new file mode 100644 +index 0000000..1ebce14 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_cfg80211.c +@@ -0,0 +1,10129 @@ ++/* ++ * Linux cfg80211 driver ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_cfg80211.c 374275 2012-12-12 11:44:18Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#ifdef PROP_TXSTATUS ++#include ++#endif ++#ifdef BCMWAPI_WPI ++/* these items should evetually go into wireless.h of the linux system headfile dir */ ++#ifndef IW_ENCODE_ALG_SM4 ++#define IW_ENCODE_ALG_SM4 0x20 ++#endif ++ ++#ifndef IW_AUTH_WAPI_ENABLED ++#define IW_AUTH_WAPI_ENABLED 0x20 ++#endif ++ ++#ifndef IW_AUTH_WAPI_VERSION_1 ++#define IW_AUTH_WAPI_VERSION_1 0x00000008 ++#endif ++ ++#ifndef IW_AUTH_CIPHER_SMS4 ++#define IW_AUTH_CIPHER_SMS4 0x00000020 ++#endif ++ ++#ifndef IW_AUTH_KEY_MGMT_WAPI_PSK ++#define IW_AUTH_KEY_MGMT_WAPI_PSK 4 ++#endif ++ ++#ifndef IW_AUTH_KEY_MGMT_WAPI_CERT ++#define IW_AUTH_KEY_MGMT_WAPI_CERT 8 ++#endif ++#endif /* BCMWAPI_WPI */ ++ ++#ifdef BCMWAPI_WPI ++#define IW_WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED | SMS4_ENABLED)) ++#else /* BCMWAPI_WPI */ ++#define IW_WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED)) ++#endif /* BCMWAPI_WPI */ ++#ifdef WL11U ++#ifndef WL_ENABLE_P2P_IF ++#error "You should enable WL_ENABLE_P2P_IF and Only supported in JB" ++#endif ++#endif /* WL11U */ ++ ++#define IW_WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED)) ++ ++static struct device *cfg80211_parent_dev = NULL; ++struct wl_priv *wlcfg_drv_priv = NULL; ++u32 wl_dbg_level = WL_DBG_ERR; ++ ++#define MAX_WAIT_TIME 1500 ++ ++#ifdef VSDB ++/* sleep time to keep STA's connecting or connection for continuous af tx or finding a peer */ ++#define DEFAULT_SLEEP_TIME_VSDB 200 ++#define OFF_CHAN_TIME_THRESHOLD_MS 200 ++ ++/* if sta is connected or connecting, sleep for a while before retry af tx or finding a peer */ ++#define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl) \ ++ do { \ ++ if (wl_get_drv_status(wl, CONNECTED, wl_to_prmry_ndev(wl)) || \ ++ wl_get_drv_status(wl, CONNECTING, wl_to_prmry_ndev(wl))) { \ ++ msleep(DEFAULT_SLEEP_TIME_VSDB); \ ++ } \ ++ } while (0) ++#else /* VSDB */ ++/* if not VSDB, do nothing */ ++#define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl) ++#endif /* VSDB */ ++ ++#ifdef WL_CFG80211_SYNC_GON ++#define WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl) \ ++ (wl_get_drv_status_all(wl, SENDING_ACT_FRM) || \ ++ wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) ++#else ++#define WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl) wl_get_drv_status_all(wl, SENDING_ACT_FRM) ++#endif /* WL_CFG80211_SYNC_GON */ ++ ++#define WL_CHANSPEC_CTL_SB_NONE WL_CHANSPEC_CTL_SB_LLL ++ ++ ++#define DNGL_FUNC(func, parameters) func parameters; ++#define COEX_DHCP ++ ++#define WLAN_EID_SSID 0 ++#define CH_MIN_5G_CHANNEL 34 ++#define CH_MIN_2G_CHANNEL 1 ++ ++/* This is to override regulatory domains defined in cfg80211 module (reg.c) ++ * By default world regulatory domain defined in reg.c puts the flags NL80211_RRF_PASSIVE_SCAN ++ * and NL80211_RRF_NO_IBSS for 5GHz channels (for 36..48 and 149..165). ++ * With respect to these flags, wpa_supplicant doesn't start p2p operations on 5GHz channels. ++ * All the chnages in world regulatory domain are to be done here. ++ */ ++static const struct ieee80211_regdomain brcm_regdom = { ++ .n_reg_rules = 4, ++ .alpha2 = "99", ++ .reg_rules = { ++ /* IEEE 802.11b/g, channels 1..11 */ ++ REG_RULE(2412-10, 2472+10, 40, 6, 20, 0), ++ /* If any */ ++ /* IEEE 802.11 channel 14 - Only JP enables ++ * this and for 802.11b only ++ */ ++ REG_RULE(2484-10, 2484+10, 20, 6, 20, 0), ++ /* IEEE 802.11a, channel 36..64 */ ++ REG_RULE(5150-10, 5350+10, 40, 6, 20, 0), ++ /* IEEE 802.11a, channel 100..165 */ ++ REG_RULE(5470-10, 5850+10, 40, 6, 20, 0), } ++}; ++ ++ ++/* Data Element Definitions */ ++#define WPS_ID_CONFIG_METHODS 0x1008 ++#define WPS_ID_REQ_TYPE 0x103A ++#define WPS_ID_DEVICE_NAME 0x1011 ++#define WPS_ID_VERSION 0x104A ++#define WPS_ID_DEVICE_PWD_ID 0x1012 ++#define WPS_ID_REQ_DEV_TYPE 0x106A ++#define WPS_ID_SELECTED_REGISTRAR_CONFIG_METHODS 0x1053 ++#define WPS_ID_PRIM_DEV_TYPE 0x1054 ++ ++/* Device Password ID */ ++#define DEV_PW_DEFAULT 0x0000 ++#define DEV_PW_USER_SPECIFIED 0x0001, ++#define DEV_PW_MACHINE_SPECIFIED 0x0002 ++#define DEV_PW_REKEY 0x0003 ++#define DEV_PW_PUSHBUTTON 0x0004 ++#define DEV_PW_REGISTRAR_SPECIFIED 0x0005 ++ ++/* Config Methods */ ++#define WPS_CONFIG_USBA 0x0001 ++#define WPS_CONFIG_ETHERNET 0x0002 ++#define WPS_CONFIG_LABEL 0x0004 ++#define WPS_CONFIG_DISPLAY 0x0008 ++#define WPS_CONFIG_EXT_NFC_TOKEN 0x0010 ++#define WPS_CONFIG_INT_NFC_TOKEN 0x0020 ++#define WPS_CONFIG_NFC_INTERFACE 0x0040 ++#define WPS_CONFIG_PUSHBUTTON 0x0080 ++#define WPS_CONFIG_KEYPAD 0x0100 ++#define WPS_CONFIG_VIRT_PUSHBUTTON 0x0280 ++#define WPS_CONFIG_PHY_PUSHBUTTON 0x0480 ++#define WPS_CONFIG_VIRT_DISPLAY 0x2008 ++#define WPS_CONFIG_PHY_DISPLAY 0x4008 ++ ++#define PM_BLOCK 1 ++#define PM_ENABLE 0 ++/* ++ * cfg80211_ops api/callback list ++ */ ++static s32 wl_frame_get_mgmt(u16 fc, const struct ether_addr *da, ++ const struct ether_addr *sa, const struct ether_addr *bssid, ++ u8 **pheader, u32 *body_len, u8 *pbody); ++static s32 __wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ++ struct cfg80211_scan_request *request, ++ struct cfg80211_ssid *this_ssid); ++static s32 wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ++ struct cfg80211_scan_request *request); ++static s32 wl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed); ++static s32 wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_ibss_params *params); ++static s32 wl_cfg80211_leave_ibss(struct wiphy *wiphy, ++ struct net_device *dev); ++static s32 wl_cfg80211_get_station(struct wiphy *wiphy, ++ struct net_device *dev, u8 *mac, ++ struct station_info *sinfo); ++static s32 wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, ++ struct net_device *dev, bool enabled, ++ s32 timeout); ++static int wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++static s32 wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, ++ u16 reason_code); ++static s32 wl_cfg80211_set_tx_power(struct wiphy *wiphy, ++ enum nl80211_tx_power_setting type, ++ s32 dbm); ++static s32 wl_cfg80211_get_tx_power(struct wiphy *wiphy, s32 *dbm); ++static s32 wl_cfg80211_config_default_key(struct wiphy *wiphy, ++ struct net_device *dev, ++ u8 key_idx, bool unicast, bool multicast); ++static s32 wl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool pairwise, const u8 *mac_addr, ++ struct key_params *params); ++static s32 wl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool pairwise, const u8 *mac_addr); ++static s32 wl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool pairwise, const u8 *mac_addr, ++ void *cookie, void (*callback) (void *cookie, ++ struct key_params *params)); ++static s32 wl_cfg80211_config_default_mgmt_key(struct wiphy *wiphy, ++ struct net_device *dev, u8 key_idx); ++static s32 wl_cfg80211_resume(struct wiphy *wiphy); ++#if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ ++ 2, 0)) ++static s32 wl_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, ++ struct net_device *dev, u64 cookie); ++static s32 wl_cfg80211_del_station(struct wiphy *wiphy, ++ struct net_device *ndev, u8* mac_addr); ++#endif ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) ++static s32 wl_cfg80211_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow); ++#else ++static s32 wl_cfg80211_suspend(struct wiphy *wiphy); ++#endif ++static s32 wl_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_pmksa *pmksa); ++static s32 wl_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_pmksa *pmksa); ++static s32 wl_cfg80211_flush_pmksa(struct wiphy *wiphy, ++ struct net_device *dev); ++static s32 wl_notify_escan_complete(struct wl_priv *wl, ++ struct net_device *ndev, bool aborted, bool fw_abort); ++/* ++ * event & event Q handlers for cfg80211 interfaces ++ */ ++static s32 wl_create_event_handler(struct wl_priv *wl); ++static void wl_destroy_event_handler(struct wl_priv *wl); ++static s32 wl_event_handler(void *data); ++static void wl_init_eq(struct wl_priv *wl); ++static void wl_flush_eq(struct wl_priv *wl); ++static unsigned long wl_lock_eq(struct wl_priv *wl); ++static void wl_unlock_eq(struct wl_priv *wl, unsigned long flags); ++static void wl_init_eq_lock(struct wl_priv *wl); ++static void wl_init_event_handler(struct wl_priv *wl); ++static struct wl_event_q *wl_deq_event(struct wl_priv *wl); ++static s32 wl_enq_event(struct wl_priv *wl, struct net_device *ndev, u32 type, ++ const wl_event_msg_t *msg, void *data); ++static void wl_put_event(struct wl_event_q *e); ++static void wl_wakeup_event(struct wl_priv *wl); ++static s32 wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++static s32 wl_notify_connect_status(struct wl_priv *wl, ++ struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++static s32 wl_notify_roaming_status(struct wl_priv *wl, ++ struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++static s32 wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++static s32 wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data, bool completed); ++static s32 wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++static s32 wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++#ifdef WL_SCHED_SCAN ++static s32 ++wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++#endif /* WL_SCHED_SCAN */ ++#ifdef PNO_SUPPORT ++static s32 wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++#endif /* PNO_SUPPORT */ ++static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, ++ enum wl_status state, bool set); ++/* ++ * register/deregister parent device ++ */ ++static void wl_cfg80211_clear_parent_dev(void); ++ ++/* ++ * ioctl utilites ++ */ ++ ++/* ++ * cfg80211 set_wiphy_params utilities ++ */ ++static s32 wl_set_frag(struct net_device *dev, u32 frag_threshold); ++static s32 wl_set_rts(struct net_device *dev, u32 frag_threshold); ++static s32 wl_set_retry(struct net_device *dev, u32 retry, bool l); ++ ++/* ++ * wl profile utilities ++ */ ++static s32 wl_update_prof(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data, s32 item); ++static void *wl_read_prof(struct wl_priv *wl, struct net_device *ndev, s32 item); ++static void wl_init_prof(struct wl_priv *wl, struct net_device *ndev); ++ ++/* ++ * cfg80211 connect utilites ++ */ ++static s32 wl_set_wpa_version(struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++static s32 wl_set_auth_type(struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++static s32 wl_set_set_cipher(struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++static s32 wl_set_key_mgmt(struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++static s32 wl_set_set_sharedkey(struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++#ifdef BCMWAPI_WPI ++static s32 wl_set_set_wapi_ie(struct net_device *dev, ++ struct cfg80211_connect_params *sme); ++#endif ++static s32 wl_get_assoc_ies(struct wl_priv *wl, struct net_device *ndev); ++static void wl_ch_to_chanspec(int ch, ++ struct wl_join_params *join_params, size_t *join_params_size); ++ ++/* ++ * information element utilities ++ */ ++static void wl_rst_ie(struct wl_priv *wl); ++static __used s32 wl_add_ie(struct wl_priv *wl, u8 t, u8 l, u8 *v); ++static s32 wl_mrg_ie(struct wl_priv *wl, u8 *ie_stream, u16 ie_size); ++static s32 wl_cp_ie(struct wl_priv *wl, u8 *dst, u16 dst_size); ++static u32 wl_get_ielen(struct wl_priv *wl); ++ ++#ifdef WL11U ++bcm_tlv_t * ++wl_cfg80211_find_interworking_ie(u8 *parse, u32 len); ++static s32 ++wl_cfg80211_add_iw_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, s32 pktflag, ++ uint8 ie_id, uint8 *data, uint8 data_len); ++#endif /* WL11U */ ++ ++static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *dev); ++static void wl_free_wdev(struct wl_priv *wl); ++static int ++wl_cfg80211_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request); ++ ++static s32 wl_inform_bss(struct wl_priv *wl); ++static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done); ++static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done); ++static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy); ++s32 wl_cfg80211_channel_to_freq(u32 channel); ++ ++#if defined(DHCP_SCAN_SUPPRESS) ++static void wl_cfg80211_work_handler(struct work_struct *work); ++static void wl_cfg80211_scan_supp_timerfunc(ulong data); ++#endif /* DHCP_SCAN_SUPPRESS */ ++ ++static s32 wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, const u8 *mac_addr, ++ struct key_params *params); ++/* ++ * key indianess swap utilities ++ */ ++static void swap_key_from_BE(struct wl_wsec_key *key); ++static void swap_key_to_BE(struct wl_wsec_key *key); ++ ++/* ++ * wl_priv memory init/deinit utilities ++ */ ++static s32 wl_init_priv_mem(struct wl_priv *wl); ++static void wl_deinit_priv_mem(struct wl_priv *wl); ++ ++static void wl_delay(u32 ms); ++ ++/* ++ * ibss mode utilities ++ */ ++static bool wl_is_ibssmode(struct wl_priv *wl, struct net_device *ndev); ++static __used bool wl_is_ibssstarter(struct wl_priv *wl); ++ ++/* ++ * link up/down , default configuration utilities ++ */ ++static s32 __wl_cfg80211_up(struct wl_priv *wl); ++static s32 __wl_cfg80211_down(struct wl_priv *wl); ++static bool wl_is_linkdown(struct wl_priv *wl, const wl_event_msg_t *e); ++static bool wl_is_linkup(struct wl_priv *wl, const wl_event_msg_t *e, struct net_device *ndev); ++static bool wl_is_nonetwork(struct wl_priv *wl, const wl_event_msg_t *e); ++static void wl_link_up(struct wl_priv *wl); ++static void wl_link_down(struct wl_priv *wl); ++static s32 wl_config_ifmode(struct wl_priv *wl, struct net_device *ndev, s32 iftype); ++static void wl_init_conf(struct wl_conf *conf); ++ ++/* ++ * iscan handler ++ */ ++static void wl_iscan_timer(unsigned long data); ++static void wl_term_iscan(struct wl_priv *wl); ++static s32 wl_init_scan(struct wl_priv *wl); ++static s32 wl_iscan_thread(void *data); ++static s32 wl_run_iscan(struct wl_iscan_ctrl *iscan, struct cfg80211_scan_request *request, ++ u16 action); ++static s32 wl_do_iscan(struct wl_priv *wl, struct cfg80211_scan_request *request); ++static s32 wl_wakeup_iscan(struct wl_iscan_ctrl *iscan); ++static s32 wl_invoke_iscan(struct wl_priv *wl); ++static s32 wl_get_iscan_results(struct wl_iscan_ctrl *iscan, u32 *status, ++ struct wl_scan_results **bss_list); ++static void wl_notify_iscan_complete(struct wl_iscan_ctrl *iscan, bool aborted); ++static void wl_init_iscan_handler(struct wl_iscan_ctrl *iscan); ++static s32 wl_iscan_done(struct wl_priv *wl); ++static s32 wl_iscan_pending(struct wl_priv *wl); ++static s32 wl_iscan_inprogress(struct wl_priv *wl); ++static s32 wl_iscan_aborted(struct wl_priv *wl); ++ ++/* ++ * find most significant bit set ++ */ ++static __used u32 wl_find_msb(u16 bit16); ++ ++/* ++ * rfkill support ++ */ ++static int wl_setup_rfkill(struct wl_priv *wl, bool setup); ++static int wl_rfkill_set(void *data, bool blocked); ++ ++static wl_scan_params_t *wl_cfg80211_scan_alloc_params(int channel, ++ int nprobes, int *out_params_size); ++static void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac); ++ ++/* ++ * Some external functions, TODO: move them to dhd_linux.h ++ */ ++int dhd_add_monitor(char *name, struct net_device **new_ndev); ++int dhd_del_monitor(struct net_device *ndev); ++int dhd_monitor_init(void *dhd_pub); ++int dhd_monitor_uninit(void); ++int dhd_start_xmit(struct sk_buff *skb, struct net_device *net); ++ ++ ++ ++#define CHECK_SYS_UP(wlpriv) \ ++do { \ ++ struct net_device *ndev = wl_to_prmry_ndev(wlpriv); \ ++ if (unlikely(!wl_get_drv_status(wlpriv, READY, ndev))) { \ ++ AP6210_DEBUG("device is not ready\n"); \ ++ return -EIO; \ ++ } \ ++} while (0) ++ ++ ++#define IS_WPA_AKM(akm) ((akm) == RSN_AKM_NONE || \ ++ (akm) == RSN_AKM_UNSPECIFIED || \ ++ (akm) == RSN_AKM_PSK) ++ ++ ++extern int dhd_wait_pend8021x(struct net_device *dev); ++#ifdef PROP_TXSTATUS_VSDB ++extern int disable_proptx; ++extern int dhd_wlfc_init(dhd_pub_t *dhd); ++extern void dhd_wlfc_deinit(dhd_pub_t *dhd); ++#endif /* PROP_TXSTATUS_VSDB */ ++ ++#if (WL_DBG_LEVEL > 0) ++#define WL_DBG_ESTR_MAX 50 ++static s8 wl_dbg_estr[][WL_DBG_ESTR_MAX] = { ++ "SET_SSID", "JOIN", "START", "AUTH", "AUTH_IND", ++ "DEAUTH", "DEAUTH_IND", "ASSOC", "ASSOC_IND", "REASSOC", ++ "REASSOC_IND", "DISASSOC", "DISASSOC_IND", "QUIET_START", "QUIET_END", ++ "BEACON_RX", "LINK", "MIC_ERROR", "NDIS_LINK", "ROAM", ++ "TXFAIL", "PMKID_CACHE", "RETROGRADE_TSF", "PRUNE", "AUTOAUTH", ++ "EAPOL_MSG", "SCAN_COMPLETE", "ADDTS_IND", "DELTS_IND", "BCNSENT_IND", ++ "BCNRX_MSG", "BCNLOST_MSG", "ROAM_PREP", "PFN_NET_FOUND", ++ "PFN_NET_LOST", ++ "RESET_COMPLETE", "JOIN_START", "ROAM_START", "ASSOC_START", ++ "IBSS_ASSOC", ++ "RADIO", "PSM_WATCHDOG", "WLC_E_CCX_ASSOC_START", "WLC_E_CCX_ASSOC_ABORT", ++ "PROBREQ_MSG", ++ "SCAN_CONFIRM_IND", "PSK_SUP", "COUNTRY_CODE_CHANGED", ++ "EXCEEDED_MEDIUM_TIME", "ICV_ERROR", ++ "UNICAST_DECODE_ERROR", "MULTICAST_DECODE_ERROR", "TRACE", ++ "WLC_E_BTA_HCI_EVENT", "IF", "WLC_E_P2P_DISC_LISTEN_COMPLETE", ++ "RSSI", "PFN_SCAN_COMPLETE", "WLC_E_EXTLOG_MSG", ++ "ACTION_FRAME", "ACTION_FRAME_COMPLETE", "WLC_E_PRE_ASSOC_IND", ++ "WLC_E_PRE_REASSOC_IND", "WLC_E_CHANNEL_ADOPTED", "WLC_E_AP_STARTED", ++ "WLC_E_DFS_AP_STOP", "WLC_E_DFS_AP_RESUME", "WLC_E_WAI_STA_EVENT", ++ "WLC_E_WAI_MSG", "WLC_E_ESCAN_RESULT", "WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE", ++ "WLC_E_PROBRESP_MSG", "WLC_E_P2P_PROBREQ_MSG", "WLC_E_DCS_REQUEST", "WLC_E_FIFO_CREDIT_MAP", ++ "WLC_E_ACTION_FRAME_RX", "WLC_E_WAKE_EVENT", "WLC_E_RM_COMPLETE" ++}; ++#endif /* WL_DBG_LEVEL */ ++ ++#define CHAN2G(_channel, _freq, _flags) { \ ++ .band = IEEE80211_BAND_2GHZ, \ ++ .center_freq = (_freq), \ ++ .hw_value = (_channel), \ ++ .flags = (_flags), \ ++ .max_antenna_gain = 0, \ ++ .max_power = 30, \ ++} ++ ++#define CHAN5G(_channel, _flags) { \ ++ .band = IEEE80211_BAND_5GHZ, \ ++ .center_freq = 5000 + (5 * (_channel)), \ ++ .hw_value = (_channel), \ ++ .flags = (_flags), \ ++ .max_antenna_gain = 0, \ ++ .max_power = 30, \ ++} ++ ++#define RATE_TO_BASE100KBPS(rate) (((rate) * 10) / 2) ++#define RATETAB_ENT(_rateid, _flags) \ ++ { \ ++ .bitrate = RATE_TO_BASE100KBPS(_rateid), \ ++ .hw_value = (_rateid), \ ++ .flags = (_flags), \ ++ } ++ ++static struct ieee80211_rate __wl_rates[] = { ++ RATETAB_ENT(WLC_RATE_1M, 0), ++ RATETAB_ENT(WLC_RATE_2M, IEEE80211_RATE_SHORT_PREAMBLE), ++ RATETAB_ENT(WLC_RATE_5M5, IEEE80211_RATE_SHORT_PREAMBLE), ++ RATETAB_ENT(WLC_RATE_11M, IEEE80211_RATE_SHORT_PREAMBLE), ++ RATETAB_ENT(WLC_RATE_6M, 0), ++ RATETAB_ENT(WLC_RATE_9M, 0), ++ RATETAB_ENT(WLC_RATE_12M, 0), ++ RATETAB_ENT(WLC_RATE_18M, 0), ++ RATETAB_ENT(WLC_RATE_24M, 0), ++ RATETAB_ENT(WLC_RATE_36M, 0), ++ RATETAB_ENT(WLC_RATE_48M, 0), ++ RATETAB_ENT(WLC_RATE_54M, 0) ++}; ++ ++#define wl_a_rates (__wl_rates + 4) ++#define wl_a_rates_size 8 ++#define wl_g_rates (__wl_rates + 0) ++#define wl_g_rates_size 12 ++ ++static struct ieee80211_channel __wl_2ghz_channels[] = { ++ CHAN2G(1, 2412, 0), ++ CHAN2G(2, 2417, 0), ++ CHAN2G(3, 2422, 0), ++ CHAN2G(4, 2427, 0), ++ CHAN2G(5, 2432, 0), ++ CHAN2G(6, 2437, 0), ++ CHAN2G(7, 2442, 0), ++ CHAN2G(8, 2447, 0), ++ CHAN2G(9, 2452, 0), ++ CHAN2G(10, 2457, 0), ++ CHAN2G(11, 2462, 0), ++ CHAN2G(12, 2467, 0), ++ CHAN2G(13, 2472, 0), ++ CHAN2G(14, 2484, 0) ++}; ++ ++static struct ieee80211_channel __wl_5ghz_a_channels[] = { ++ CHAN5G(34, 0), CHAN5G(36, 0), ++ CHAN5G(38, 0), CHAN5G(40, 0), ++ CHAN5G(42, 0), CHAN5G(44, 0), ++ CHAN5G(46, 0), CHAN5G(48, 0), ++ CHAN5G(52, 0), CHAN5G(56, 0), ++ CHAN5G(60, 0), CHAN5G(64, 0), ++ CHAN5G(100, 0), CHAN5G(104, 0), ++ CHAN5G(108, 0), CHAN5G(112, 0), ++ CHAN5G(116, 0), CHAN5G(120, 0), ++ CHAN5G(124, 0), CHAN5G(128, 0), ++ CHAN5G(132, 0), CHAN5G(136, 0), ++ CHAN5G(140, 0), CHAN5G(149, 0), ++ CHAN5G(153, 0), CHAN5G(157, 0), ++ CHAN5G(161, 0), CHAN5G(165, 0) ++}; ++ ++static struct ieee80211_supported_band __wl_band_2ghz = { ++ .band = IEEE80211_BAND_2GHZ, ++ .channels = __wl_2ghz_channels, ++ .n_channels = ARRAY_SIZE(__wl_2ghz_channels), ++ .bitrates = wl_g_rates, ++ .n_bitrates = wl_g_rates_size ++}; ++ ++static struct ieee80211_supported_band __wl_band_5ghz_a = { ++ .band = IEEE80211_BAND_5GHZ, ++ .channels = __wl_5ghz_a_channels, ++ .n_channels = ARRAY_SIZE(__wl_5ghz_a_channels), ++ .bitrates = wl_a_rates, ++ .n_bitrates = wl_a_rates_size ++}; ++ ++static const u32 __wl_cipher_suites[] = { ++ WLAN_CIPHER_SUITE_WEP40, ++ WLAN_CIPHER_SUITE_WEP104, ++ WLAN_CIPHER_SUITE_TKIP, ++ WLAN_CIPHER_SUITE_CCMP, ++ WLAN_CIPHER_SUITE_AES_CMAC, ++#ifdef BCMWAPI_WPI ++ WLAN_CIPHER_SUITE_SMS4 ++#endif ++}; ++ ++ ++/* IOCtl version read from targeted driver */ ++static int ioctl_version; ++ ++/* Return a new chanspec given a legacy chanspec ++ * Returns INVCHANSPEC on error ++ */ ++static chanspec_t ++wl_chspec_from_legacy(chanspec_t legacy_chspec) ++{ ++ chanspec_t chspec; ++ ++ /* get the channel number */ ++ chspec = LCHSPEC_CHANNEL(legacy_chspec); ++ ++ /* convert the band */ ++ if (LCHSPEC_IS2G(legacy_chspec)) { ++ chspec |= WL_CHANSPEC_BAND_2G; ++ } else { ++ chspec |= WL_CHANSPEC_BAND_5G; ++ } ++ ++ /* convert the bw and sideband */ ++ if (LCHSPEC_IS20(legacy_chspec)) { ++ chspec |= WL_CHANSPEC_BW_20; ++ } else { ++ chspec |= WL_CHANSPEC_BW_40; ++ if (LCHSPEC_CTL_SB(legacy_chspec) == WL_LCHANSPEC_CTL_SB_LOWER) { ++ chspec |= WL_CHANSPEC_CTL_SB_L; ++ } else { ++ chspec |= WL_CHANSPEC_CTL_SB_U; ++ } ++ } ++ ++ if (wf_chspec_malformed(chspec)) { ++ AP6210_ERR("wl_chspec_from_legacy: output chanspec (0x%04X) malformed\n", ++ chspec); ++ return INVCHANSPEC; ++ } ++ ++ return chspec; ++} ++ ++/* Return a legacy chanspec given a new chanspec ++ * Returns INVCHANSPEC on error ++ */ ++static chanspec_t ++wl_chspec_to_legacy(chanspec_t chspec) ++{ ++ chanspec_t lchspec; ++ ++ if (wf_chspec_malformed(chspec)) { ++ AP6210_ERR("wl_chspec_to_legacy: input chanspec (0x%04X) malformed\n", ++ chspec); ++ return INVCHANSPEC; ++ } ++ ++ /* get the channel number */ ++ lchspec = CHSPEC_CHANNEL(chspec); ++ ++ /* convert the band */ ++ if (CHSPEC_IS2G(chspec)) { ++ lchspec |= WL_LCHANSPEC_BAND_2G; ++ } else { ++ lchspec |= WL_LCHANSPEC_BAND_5G; ++ } ++ ++ /* convert the bw and sideband */ ++ if (CHSPEC_IS20(chspec)) { ++ lchspec |= WL_LCHANSPEC_BW_20; ++ lchspec |= WL_LCHANSPEC_CTL_SB_NONE; ++ } else if (CHSPEC_IS40(chspec)) { ++ lchspec |= WL_LCHANSPEC_BW_40; ++ if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_L) { ++ lchspec |= WL_LCHANSPEC_CTL_SB_LOWER; ++ } else { ++ lchspec |= WL_LCHANSPEC_CTL_SB_UPPER; ++ } ++ } else { ++ /* cannot express the bandwidth */ ++ char chanbuf[CHANSPEC_STR_LEN]; ++ AP6210_ERR( ++ "wl_chspec_to_legacy: unable to convert chanspec %s (0x%04X) " ++ "to pre-11ac format\n", ++ wf_chspec_ntoa(chspec, chanbuf), chspec); ++ return INVCHANSPEC; ++ } ++ ++ return lchspec; ++} ++ ++/* given a chanspec value, do the endian and chanspec version conversion to ++ * a chanspec_t value ++ * Returns INVCHANSPEC on error ++ */ ++static chanspec_t ++wl_chspec_host_to_driver(chanspec_t chanspec) ++{ ++ if (ioctl_version == 1) { ++ chanspec = wl_chspec_to_legacy(chanspec); ++ if (chanspec == INVCHANSPEC) { ++ return chanspec; ++ } ++ } ++ chanspec = htodchanspec(chanspec); ++ ++ return chanspec; ++} ++ ++/* given a channel value, do the endian and chanspec version conversion to ++ * a chanspec_t value ++ * Returns INVCHANSPEC on error ++ */ ++chanspec_t ++wl_ch_host_to_driver(u16 channel) ++{ ++ ++ chanspec_t chanspec; ++ ++ chanspec = channel & WL_CHANSPEC_CHAN_MASK; ++ ++ if (channel <= CH_MAX_2G_CHANNEL) ++ chanspec |= WL_CHANSPEC_BAND_2G; ++ else ++ chanspec |= WL_CHANSPEC_BAND_5G; ++ ++ chanspec |= WL_CHANSPEC_BW_20; ++ chanspec |= WL_CHANSPEC_CTL_SB_NONE; ++ ++ return wl_chspec_host_to_driver(chanspec); ++} ++ ++/* given a chanspec value from the driver, do the endian and chanspec version conversion to ++ * a chanspec_t value ++ * Returns INVCHANSPEC on error ++ */ ++static chanspec_t ++wl_chspec_driver_to_host(chanspec_t chanspec) ++{ ++ chanspec = dtohchanspec(chanspec); ++ if (ioctl_version == 1) { ++ chanspec = wl_chspec_from_legacy(chanspec); ++ } ++ ++ return chanspec; ++} ++ ++/* There isn't a lot of sense in it, but you can transmit anything you like */ ++static const struct ieee80211_txrx_stypes ++wl_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { ++ [NL80211_IFTYPE_ADHOC] = { ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ACTION >> 4) ++ }, ++ [NL80211_IFTYPE_STATION] = { ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | ++ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) ++ }, ++ [NL80211_IFTYPE_AP] = { ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | ++ BIT(IEEE80211_STYPE_DISASSOC >> 4) | ++ BIT(IEEE80211_STYPE_AUTH >> 4) | ++ BIT(IEEE80211_STYPE_DEAUTH >> 4) | ++ BIT(IEEE80211_STYPE_ACTION >> 4) ++ }, ++ [NL80211_IFTYPE_AP_VLAN] = { ++ /* copy AP */ ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | ++ BIT(IEEE80211_STYPE_DISASSOC >> 4) | ++ BIT(IEEE80211_STYPE_AUTH >> 4) | ++ BIT(IEEE80211_STYPE_DEAUTH >> 4) | ++ BIT(IEEE80211_STYPE_ACTION >> 4) ++ }, ++ [NL80211_IFTYPE_P2P_CLIENT] = { ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | ++ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) ++ }, ++ [NL80211_IFTYPE_P2P_GO] = { ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | ++ BIT(IEEE80211_STYPE_DISASSOC >> 4) | ++ BIT(IEEE80211_STYPE_AUTH >> 4) | ++ BIT(IEEE80211_STYPE_DEAUTH >> 4) | ++ BIT(IEEE80211_STYPE_ACTION >> 4) ++ } ++}; ++ ++static void swap_key_from_BE(struct wl_wsec_key *key) ++{ ++ key->index = htod32(key->index); ++ key->len = htod32(key->len); ++ key->algo = htod32(key->algo); ++ key->flags = htod32(key->flags); ++ key->rxiv.hi = htod32(key->rxiv.hi); ++ key->rxiv.lo = htod16(key->rxiv.lo); ++ key->iv_initialized = htod32(key->iv_initialized); ++} ++ ++static void swap_key_to_BE(struct wl_wsec_key *key) ++{ ++ key->index = dtoh32(key->index); ++ key->len = dtoh32(key->len); ++ key->algo = dtoh32(key->algo); ++ key->flags = dtoh32(key->flags); ++ key->rxiv.hi = dtoh32(key->rxiv.hi); ++ key->rxiv.lo = dtoh16(key->rxiv.lo); ++ key->iv_initialized = dtoh32(key->iv_initialized); ++} ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) ++/* For debug: Dump the contents of the encoded wps ie buffe */ ++static void ++wl_validate_wps_ie(char *wps_ie, s32 wps_ie_len, bool *pbc) ++{ ++ #define WPS_IE_FIXED_LEN 6 ++ u16 len; ++ u8 *subel = NULL; ++ u16 subelt_id; ++ u16 subelt_len; ++ u16 val; ++ u8 *valptr = (uint8*) &val; ++ if (wps_ie == NULL || wps_ie_len < WPS_IE_FIXED_LEN) { ++ AP6210_ERR("invalid argument : NULL\n")); ++ return; ++ } ++ len = (u16)wps_ie[TLV_LEN_OFF]; ++ ++ if (len > wps_ie_len) { ++ AP6210_ERR("invalid length len %d, wps ie len %d\n", len, wps_ie_len); ++ return; ++ } ++ AP6210_DEBUG("wps_ie len=%d\n", len); ++ len -= 4; /* for the WPS IE's OUI, oui_type fields */ ++ subel = wps_ie + WPS_IE_FIXED_LEN; ++ while (len >= 4) { /* must have attr id, attr len fields */ ++ valptr[0] = *subel++; ++ valptr[1] = *subel++; ++ subelt_id = HTON16(val); ++ ++ valptr[0] = *subel++; ++ valptr[1] = *subel++; ++ subelt_len = HTON16(val); ++ ++ len -= 4; /* for the attr id, attr len fields */ ++ len -= subelt_len; /* for the remaining fields in this attribute */ ++ AP6210_DEBUG(" subel=%p, subelt_id=0x%x subelt_len=%u\n", ++ subel, subelt_id, subelt_len); ++ ++ if (subelt_id == WPS_ID_VERSION) { ++ AP6210_DEBUG(" attr WPS_ID_VERSION: %u\n", *subel); ++ } else if (subelt_id == WPS_ID_REQ_TYPE) { ++ AP6210_DEBUG(" attr WPS_ID_REQ_TYPE: %u\n", *subel); ++ } else if (subelt_id == WPS_ID_CONFIG_METHODS) { ++ valptr[0] = *subel; ++ valptr[1] = *(subel + 1); ++ AP6210_DEBUG(" attr WPS_ID_CONFIG_METHODS: %x\n", HTON16(val)); ++ } else if (subelt_id == WPS_ID_DEVICE_NAME) { ++ char devname[100]; ++ memcpy(devname, subel, subelt_len); ++ devname[subelt_len] = '\0'; ++ AP6210_DEBUG(" attr WPS_ID_DEVICE_NAME: %s (len %u)\n", ++ devname, subelt_len); ++ } else if (subelt_id == WPS_ID_DEVICE_PWD_ID) { ++ valptr[0] = *subel; ++ valptr[1] = *(subel + 1); ++ AP6210_DEBUG(" attr WPS_ID_DEVICE_PWD_ID: %u\n", HTON16(val)); ++ *pbc = (HTON16(val) == DEV_PW_PUSHBUTTON) ? true : false; ++ } else if (subelt_id == WPS_ID_PRIM_DEV_TYPE) { ++ valptr[0] = *subel; ++ valptr[1] = *(subel + 1); ++ AP6210_DEBUG(" attr WPS_ID_PRIM_DEV_TYPE: cat=%u \n", HTON16(val)); ++ valptr[0] = *(subel + 6); ++ valptr[1] = *(subel + 7); ++ AP6210_DEBUG(" attr WPS_ID_PRIM_DEV_TYPE: subcat=%u\n", HTON16(val)); ++ } else if (subelt_id == WPS_ID_REQ_DEV_TYPE) { ++ valptr[0] = *subel; ++ valptr[1] = *(subel + 1); ++ AP6210_DEBUG(" attr WPS_ID_REQ_DEV_TYPE: cat=%u\n", HTON16(val)); ++ valptr[0] = *(subel + 6); ++ valptr[1] = *(subel + 7); ++ AP6210_DEBUG(" attr WPS_ID_REQ_DEV_TYPE: subcat=%u\n", HTON16(val)); ++ } else if (subelt_id == WPS_ID_SELECTED_REGISTRAR_CONFIG_METHODS) { ++ valptr[0] = *subel; ++ valptr[1] = *(subel + 1); ++ AP6210_DEBUG(" attr WPS_ID_SELECTED_REGISTRAR_CONFIG_METHODS" ++ ": cat=%u\n", HTON16(val)); ++ } else { ++ AP6210_DEBUG(" unknown attr 0x%x\n", subelt_id); ++ } ++ ++ subel += subelt_len; ++ } ++} ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ ++ ++static chanspec_t wl_cfg80211_get_shared_freq(struct wiphy *wiphy) ++{ ++ chanspec_t chspec; ++ int err = 0; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_device *dev = wl_to_prmry_ndev(wl); ++ struct ether_addr bssid; ++ struct wl_bss_info *bss = NULL; ++ ++ if ((err = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, sizeof(bssid), false))) { ++ /* STA interface is not associated. So start the new interface on a temp ++ * channel . Later proper channel will be applied by the above framework ++ * via set_channel (cfg80211 API). ++ */ ++ AP6210_DEBUG("Not associated. Return a temp channel. \n"); ++ return wl_ch_host_to_driver(WL_P2P_TEMP_CHAN); ++ } ++ ++ ++ *(u32 *) wl->extra_buf = htod32(WL_EXTRA_BUF_MAX); ++ if ((err = wldev_ioctl(dev, WLC_GET_BSS_INFO, wl->extra_buf, ++ WL_EXTRA_BUF_MAX, false))) { ++ AP6210_ERR("Failed to get associated bss info, use temp channel \n"); ++ chspec = wl_ch_host_to_driver(WL_P2P_TEMP_CHAN); ++ } ++ else { ++ bss = (struct wl_bss_info *) (wl->extra_buf + 4); ++ chspec = bss->chanspec; ++ AP6210_DEBUG("Valid BSS Found. chanspec:%d \n", chspec); ++ } ++ return chspec; ++} ++ ++static struct net_device* wl_cfg80211_add_monitor_if(char *name) ++{ ++#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) ++ AP6210_DEBUG("wl_cfg80211_add_monitor_if: No more support monitor interface\n"); ++ return ERR_PTR(-EOPNOTSUPP); ++#else ++ struct net_device* ndev = NULL; ++ ++ dhd_add_monitor(name, &ndev); ++ AP6210_DEBUG("wl_cfg80211_add_monitor_if net device returned: 0x%p\n", ndev); ++ return ndev; ++#endif /* defined(WLP2P) && defined(WL_ENABLE_P2P_IF) */ ++} ++ ++static struct net_device * ++wl_cfg80211_add_virtual_iface(struct wiphy *wiphy, char *name, ++ enum nl80211_iftype type, u32 *flags, ++ struct vif_params *params) ++{ ++ s32 err; ++ s32 timeout = -1; ++ s32 wlif_type = -1; ++ s32 mode = 0; ++ s32 val = 0; ++ s32 dhd_mode = 0; ++ chanspec_t chspec; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_device *_ndev; ++ struct ether_addr primary_mac; ++ int (*net_attach)(void *dhdp, int ifidx); ++ bool rollback_lock = false; ++#ifdef PROP_TXSTATUS_VSDB ++ s32 up = 1; ++ dhd_pub_t *dhd; ++#endif /* PROP_TXSTATUS_VSDB */ ++ ++ if (!wl) ++ return ERR_PTR(-EINVAL); ++ ++#ifdef PROP_TXSTATUS_VSDB ++ dhd = (dhd_pub_t *)(wl->pub); ++#endif /* PROP_TXSTATUS_VSDB */ ++ ++ ++ /* Use primary I/F for sending cmds down to firmware */ ++ _ndev = wl_to_prmry_ndev(wl); ++ ++ AP6210_DEBUG("if name: %s, type: %d\n", name, type); ++ switch (type) { ++ case NL80211_IFTYPE_ADHOC: ++ case NL80211_IFTYPE_AP_VLAN: ++ case NL80211_IFTYPE_WDS: ++ case NL80211_IFTYPE_MESH_POINT: ++ AP6210_ERR("Unsupported interface type\n"); ++ mode = WL_MODE_IBSS; ++ return NULL; ++ case NL80211_IFTYPE_MONITOR: ++ return wl_cfg80211_add_monitor_if(name); ++ case NL80211_IFTYPE_P2P_CLIENT: ++ case NL80211_IFTYPE_STATION: ++ wlif_type = WL_P2P_IF_CLIENT; ++ mode = WL_MODE_BSS; ++ break; ++ case NL80211_IFTYPE_P2P_GO: ++ case NL80211_IFTYPE_AP: ++ wlif_type = WL_P2P_IF_GO; ++ mode = WL_MODE_AP; ++ break; ++ default: ++ AP6210_ERR("Unsupported interface type\n"); ++ return NULL; ++ break; ++ } ++ ++ if (!name) { ++ AP6210_ERR("name is NULL\n"); ++ return NULL; ++ } ++ if (wl->p2p_supported && (wlif_type != -1)) { ++ if (wl_get_p2p_status(wl, IF_DELETING)) { ++ /* wait till IF_DEL is complete ++ * release the lock for the unregister to proceed ++ */ ++ if (rtnl_is_locked()) { ++ rtnl_unlock(); ++ rollback_lock = true; ++ } ++ AP6210_DEBUG("%s: Released the lock and wait till IF_DEL is complete\n", ++ __func__); ++ timeout = wait_event_interruptible_timeout(wl->netif_change_event, ++ (wl_get_p2p_status(wl, IF_DELETING) == false), ++ msecs_to_jiffies(MAX_WAIT_TIME)); ++ ++ /* put back the rtnl_lock again */ ++ if (rollback_lock) { ++ rtnl_lock(); ++ rollback_lock = false; ++ } ++ if (timeout > 0) { ++ AP6210_ERR("IF DEL is Success\n"); ++ ++ } else { ++ AP6210_ERR("timeount < 0, return -EAGAIN\n"); ++ return ERR_PTR(-EAGAIN); ++ } ++ /* It should be now be safe to put this check here since we are sure ++ * by now netdev_notifier (unregister) would have been called ++ */ ++ if (wl->iface_cnt == IFACE_MAX_CNT) ++ return ERR_PTR(-ENOMEM); ++ } ++ ++#ifdef PROP_TXSTATUS_VSDB ++ if (!dhd) ++ return ERR_PTR(-ENODEV); ++#endif /* PROP_TXSTATUS_VSDB */ ++ if (!wl->p2p) ++ return ERR_PTR(-ENODEV); ++ ++ if (wl->p2p && !wl->p2p->on && strstr(name, WL_P2P_INTERFACE_PREFIX)) { ++ p2p_on(wl) = true; ++ wl_cfgp2p_set_firm_p2p(wl); ++ wl_cfgp2p_init_discovery(wl); ++ get_primary_mac(wl, &primary_mac); ++ wl_cfgp2p_generate_bss_mac(&primary_mac, ++ &wl->p2p->dev_addr, &wl->p2p->int_addr); ++ } ++ ++ memset(wl->p2p->vir_ifname, 0, IFNAMSIZ); ++ strncpy(wl->p2p->vir_ifname, name, IFNAMSIZ - 1); ++ ++ wl_notify_escan_complete(wl, _ndev, true, true); ++#ifdef PROP_TXSTATUS_VSDB ++ if (!wl->wlfc_on && !disable_proptx) { ++ dhd->wlfc_enabled = true; ++ dhd_wlfc_init(dhd); ++ err = wldev_ioctl(_ndev, WLC_UP, &up, sizeof(s32), true); ++ if (err < 0) ++ AP6210_ERR("WLC_UP return err:%d\n", err); ++ wl->wlfc_on = true; ++ } ++#endif /* PROP_TXSTATUS_VSDB */ ++ ++ /* In concurrency case, STA may be already associated in a particular channel. ++ * so retrieve the current channel of primary interface and then start the virtual ++ * interface on that. ++ */ ++ chspec = wl_cfg80211_get_shared_freq(wiphy); ++ ++ /* For P2P mode, use P2P-specific driver features to create the ++ * bss: "wl p2p_ifadd" ++ */ ++ wl_set_p2p_status(wl, IF_ADD); ++ if (wlif_type == WL_P2P_IF_GO) ++ wldev_iovar_setint(_ndev, "mpc", 0); ++ err = wl_cfgp2p_ifadd(wl, &wl->p2p->int_addr, htod32(wlif_type), chspec); ++ ++ if (unlikely(err)) { ++ AP6210_ERR(" virtual iface add failed (%d) \n", err); ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ timeout = wait_event_interruptible_timeout(wl->netif_change_event, ++ (wl_get_p2p_status(wl, IF_ADD) == false), ++ msecs_to_jiffies(MAX_WAIT_TIME)); ++ if (timeout > 0 && (!wl_get_p2p_status(wl, IF_ADD))) { ++ ++ struct wireless_dev *vwdev; ++ vwdev = kzalloc(sizeof(*vwdev), GFP_KERNEL); ++ if (unlikely(!vwdev)) { ++ AP6210_ERR("Could not allocate wireless device\n"); ++ return ERR_PTR(-ENOMEM); ++ } ++ vwdev->wiphy = wl->wdev->wiphy; ++ AP6210_DEBUG(" virtual interface(%s) is created memalloc done \n", ++ wl->p2p->vir_ifname); ++ vwdev->iftype = type; ++ _ndev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION); ++ _ndev->ieee80211_ptr = vwdev; ++ SET_NETDEV_DEV(_ndev, wiphy_dev(vwdev->wiphy)); ++ vwdev->netdev = _ndev; ++ wl_set_drv_status(wl, READY, _ndev); ++ wl->p2p->vif_created = true; ++ wl_set_mode_by_netdev(wl, _ndev, mode); ++ net_attach = wl_to_p2p_bss_private(wl, P2PAPI_BSSCFG_CONNECTION); ++ if (rtnl_is_locked()) { ++ rtnl_unlock(); ++ rollback_lock = true; ++ } ++ if (net_attach && !net_attach(wl->pub, _ndev->ifindex)) { ++ wl_alloc_netinfo(wl, _ndev, vwdev, mode, PM_ENABLE); ++ val = 1; ++ /* Disable firmware roaming for P2P interface */ ++ wldev_iovar_setint(_ndev, "roam_off", val); ++ AP6210_ERR(" virtual interface(%s) is " ++ "created net attach done\n", wl->p2p->vir_ifname); ++ if (mode == WL_MODE_AP) ++ wl_set_drv_status(wl, CONNECTED, _ndev); ++ if (type == NL80211_IFTYPE_P2P_CLIENT) ++ dhd_mode = DHD_FLAG_P2P_GC_MODE; ++ else if (type == NL80211_IFTYPE_P2P_GO) ++ dhd_mode = DHD_FLAG_P2P_GO_MODE; ++ DNGL_FUNC(dhd_cfg80211_set_p2p_info, (wl, dhd_mode)); ++ } else { ++ /* put back the rtnl_lock again */ ++ if (rollback_lock) ++ rtnl_lock(); ++ goto fail; ++ } ++ /* put back the rtnl_lock again */ ++ if (rollback_lock) ++ rtnl_lock(); ++ return _ndev; ++ ++ } else { ++ wl_clr_p2p_status(wl, IF_ADD); ++ AP6210_ERR(" virtual interface(%s) is not created \n", wl->p2p->vir_ifname); ++ memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); ++ wl->p2p->vif_created = false; ++#ifdef PROP_TXSTATUS_VSDB ++ if (dhd->wlfc_enabled && wl->wlfc_on) { ++ dhd->wlfc_enabled = false; ++ dhd_wlfc_deinit(dhd); ++ wl->wlfc_on = false; ++ } ++#endif /* PROP_TXSTATUS_VSDB */ ++ } ++ } ++fail: ++ if (wlif_type == WL_P2P_IF_GO) ++ wldev_iovar_setint(_ndev, "mpc", 1); ++ return ERR_PTR(-ENODEV); ++} ++ ++static s32 ++wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev) ++{ ++ struct ether_addr p2p_mac; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 timeout = -1; ++ s32 ret = 0; ++ AP6210_DEBUG("Enter\n"); ++ ++ if (wl->p2p_net == dev) { ++ /* Since there is no ifidx corresponding to p2p0, cmds to ++ * firmware should be routed through primary I/F ++ */ ++ dev = wl_to_prmry_ndev(wl); ++ } ++ ++ if (wl->p2p_supported) { ++ memcpy(p2p_mac.octet, wl->p2p->int_addr.octet, ETHER_ADDR_LEN); ++ ++ /* Clear GO_NEG_PHASE bit to take care of GO-NEG-FAIL cases ++ */ ++ AP6210_DEBUG("P2P: GO_NEG_PHASE status cleared "); ++ wl_clr_p2p_status(wl, GO_NEG_PHASE); ++ if (wl->p2p->vif_created) { ++ if (wl_get_drv_status(wl, SCANNING, dev)) { ++ wl_notify_escan_complete(wl, dev, true, true); ++ } ++ wldev_iovar_setint(dev, "mpc", 1); ++ ++ /* for GC */ ++ if (wl_get_drv_status(wl, DISCONNECTING, dev) && ++ (wl_get_mode_by_netdev(wl, dev) != WL_MODE_AP)) { ++ AP6210_ERR("Wait for Link Down event for GC !\n"); ++ wait_for_completion_timeout ++ (&wl->iface_disable, msecs_to_jiffies(500)); ++ } ++ wl_set_p2p_status(wl, IF_DELETING); ++ DNGL_FUNC(dhd_cfg80211_clean_p2p_info, (wl)); ++ ++ /* for GO */ ++ if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { ++ wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, false); ++ /* disable interface before bsscfg free */ ++ ret = wl_cfgp2p_ifdisable(wl, &p2p_mac); ++ /* if fw doesn't support "ifdis", ++ do not wait for link down of ap mode ++ */ ++ if (ret == 0) { ++ AP6210_ERR("Wait for Link Down event for GO !!!\n"); ++ wait_for_completion_timeout(&wl->iface_disable, ++ msecs_to_jiffies(500)); ++ } else { ++ msleep(300); ++ } ++ } ++ wl_cfgp2p_clear_management_ie(wl, wl_cfgp2p_find_idx(wl, dev)); ++ /* delete interface after link down */ ++ ret = wl_cfgp2p_ifdel(wl, &p2p_mac); ++ /* Firmware could not delete the interface so we will not get WLC_E_IF ++ * event for cleaning the dhd virtual nw interace ++ * So lets do it here. Failures from fw will ensure the application to do ++ * ifconfig down and up sequnce, which will reload the fw ++ * however we should cleanup the linux network virtual interfaces ++ */ ++ /* Request framework to RESET and clean up */ ++ if (ret) { ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ AP6210_ERR("Firmware returned an error (%d) from p2p_ifdel" ++ "HANG Notification sent to %s\n", ret, ndev->name); ++ net_os_send_hang_message(ndev); ++ } ++ /* Wait for IF_DEL operation to be finished in firmware */ ++ timeout = wait_event_interruptible_timeout(wl->netif_change_event, ++ (wl->p2p->vif_created == false), ++ msecs_to_jiffies(MAX_WAIT_TIME)); ++ if (timeout > 0 && (wl->p2p->vif_created == false)) { ++ AP6210_DEBUG("IFDEL operation done\n"); ++ } else { ++ AP6210_ERR("IFDEL didn't complete properly\n"); ++ } ++ ret = dhd_del_monitor(dev); ++ } ++ } ++ return ret; ++} ++ ++static s32 ++wl_cfg80211_change_virtual_iface(struct wiphy *wiphy, struct net_device *ndev, ++ enum nl80211_iftype type, u32 *flags, ++ struct vif_params *params) ++{ ++ s32 ap = 0; ++ s32 infra = 0; ++ s32 wlif_type; ++ s32 mode = 0; ++ chanspec_t chspec; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++ AP6210_DEBUG("Enter type %d\n", type); ++ switch (type) { ++ case NL80211_IFTYPE_MONITOR: ++ case NL80211_IFTYPE_WDS: ++ case NL80211_IFTYPE_MESH_POINT: ++ ap = 1; ++ AP6210_ERR("type (%d) : currently we do not support this type\n", ++ type); ++ break; ++ case NL80211_IFTYPE_ADHOC: ++ mode = WL_MODE_IBSS; ++ break; ++ case NL80211_IFTYPE_STATION: ++ case NL80211_IFTYPE_P2P_CLIENT: ++ mode = WL_MODE_BSS; ++ infra = 1; ++ break; ++ case NL80211_IFTYPE_AP: ++ case NL80211_IFTYPE_AP_VLAN: ++ case NL80211_IFTYPE_P2P_GO: ++ mode = WL_MODE_AP; ++ ap = 1; ++ break; ++ default: ++ return -EINVAL; ++ } ++ if (!dhd) ++ return -EINVAL; ++ if (ap) { ++ wl_set_mode_by_netdev(wl, ndev, mode); ++ if (wl->p2p_supported && wl->p2p->vif_created) { ++ AP6210_DEBUG("p2p_vif_created (%d) p2p_on (%d)\n", wl->p2p->vif_created, ++ p2p_on(wl)); ++ wldev_iovar_setint(ndev, "mpc", 0); ++ wl_notify_escan_complete(wl, ndev, true, true); ++ ++ /* In concurrency case, STA may be already associated in a particular ++ * channel. so retrieve the current channel of primary interface and ++ * then start the virtual interface on that. ++ */ ++ chspec = wl_cfg80211_get_shared_freq(wiphy); ++ ++ wlif_type = WL_P2P_IF_GO; ++ AP6210_ERR("%s : ap (%d), infra (%d), iftype: (%d)\n", ++ ndev->name, ap, infra, type); ++ wl_set_p2p_status(wl, IF_CHANGING); ++ wl_clr_p2p_status(wl, IF_CHANGED); ++ wl_cfgp2p_ifchange(wl, &wl->p2p->int_addr, htod32(wlif_type), chspec); ++ wait_event_interruptible_timeout(wl->netif_change_event, ++ (wl_get_p2p_status(wl, IF_CHANGED) == true), ++ msecs_to_jiffies(MAX_WAIT_TIME)); ++ wl_set_mode_by_netdev(wl, ndev, mode); ++ dhd->op_mode &= ~DHD_FLAG_P2P_GC_MODE; ++ dhd->op_mode |= DHD_FLAG_P2P_GO_MODE; ++ wl_clr_p2p_status(wl, IF_CHANGING); ++ wl_clr_p2p_status(wl, IF_CHANGED); ++ if (mode == WL_MODE_AP) ++ wl_set_drv_status(wl, CONNECTED, ndev); ++ } else if (ndev == wl_to_prmry_ndev(wl) && ++ !wl_get_drv_status(wl, AP_CREATED, ndev)) { ++ wl_set_drv_status(wl, AP_CREATING, ndev); ++ if (!wl->ap_info && ++ !(wl->ap_info = kzalloc(sizeof(struct ap_info), GFP_KERNEL))) { ++ AP6210_ERR("struct ap_saved_ie allocation failed\n"); ++ return -ENOMEM; ++ } ++ } else { ++ AP6210_ERR("Cannot change the interface for GO or SOFTAP\n"); ++ return -EINVAL; ++ } ++ } else { ++ AP6210_DEBUG("Change_virtual_iface for transition from GO/AP to client/STA"); ++ } ++ ++ ndev->ieee80211_ptr->iftype = type; ++ return 0; ++} ++ ++s32 ++wl_cfg80211_notify_ifadd(struct net_device *ndev, s32 idx, s32 bssidx, ++ void* _net_attach) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ s32 ret = BCME_OK; ++ AP6210_DEBUG("Enter"); ++ if (!ndev) { ++ AP6210_ERR("net is NULL\n"); ++ return 0; ++ } ++ if (wl->p2p_supported && wl_get_p2p_status(wl, IF_ADD)) { ++ AP6210_DEBUG("IF_ADD event called from dongle, old interface name: %s," ++ "new name: %s\n", ndev->name, wl->p2p->vir_ifname); ++ /* Assign the net device to CONNECT BSSCFG */ ++ strncpy(ndev->name, wl->p2p->vir_ifname, IFNAMSIZ - 1); ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION) = ndev; ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_CONNECTION) = bssidx; ++ wl_to_p2p_bss_private(wl, P2PAPI_BSSCFG_CONNECTION) = _net_attach; ++ ndev->ifindex = idx; ++ wl_clr_p2p_status(wl, IF_ADD); ++ ++ wake_up_interruptible(&wl->netif_change_event); ++ } else { ++ ret = BCME_NOTREADY; ++ } ++ return ret; ++} ++ ++s32 ++wl_cfg80211_notify_ifdel(void) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ AP6210_DEBUG("Enter \n"); ++ wl_clr_p2p_status(wl, IF_DELETING); ++ wake_up_interruptible(&wl->netif_change_event); ++ return 0; ++} ++ ++s32 ++wl_cfg80211_ifdel_ops(struct net_device *ndev) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ bool rollback_lock = false; ++ s32 index = 0; ++#ifdef PROP_TXSTATUS_VSDB ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++#endif /* PROP_TXSTATUS_VSDB */ ++ if (!ndev || (strlen(ndev->name) == 0)) { ++ AP6210_ERR("net is NULL\n"); ++ return 0; ++ } ++ ++ if (p2p_is_on(wl) && wl->p2p->vif_created && ++ wl_get_p2p_status(wl, IF_DELETING)) { ++ if (wl->scan_request && ++ (wl->escan_info.ndev == ndev)) { ++ /* Abort any pending scan requests */ ++ wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; ++ if (!rtnl_is_locked()) { ++ rtnl_lock(); ++ rollback_lock = true; ++ } ++ AP6210_DEBUG("ESCAN COMPLETED\n"); ++ wl_notify_escan_complete(wl, ndev, true, false); ++ if (rollback_lock) ++ rtnl_unlock(); ++ } ++ AP6210_ERR("IF_DEL event called from dongle, net %x, vif name: %s\n", ++ (unsigned int)ndev, wl->p2p->vir_ifname); ++ ++ memset(wl->p2p->vir_ifname, '\0', IFNAMSIZ); ++ index = wl_cfgp2p_find_idx(wl, ndev); ++ wl_to_p2p_bss_ndev(wl, index) = NULL; ++ wl_to_p2p_bss_bssidx(wl, index) = WL_INVALID; ++ wl->p2p->vif_created = false; ++ ++ AP6210_DEBUG("index : %d\n", index); ++#ifdef PROP_TXSTATUS_VSDB ++ if (dhd->wlfc_enabled && wl->wlfc_on) { ++ dhd->wlfc_enabled = false; ++ dhd_wlfc_deinit(dhd); ++ wl->wlfc_on = false; ++ } ++#endif /* PROP_TXSTATUS_VSDB */ ++ wl_clr_drv_status(wl, CONNECTED, ndev); ++ } ++ /* Wake up any waiting thread */ ++ wake_up_interruptible(&wl->netif_change_event); ++ ++ return 0; ++} ++ ++s32 ++wl_cfg80211_is_progress_ifadd(void) ++{ ++ s32 is_progress = 0; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ if (wl_get_p2p_status(wl, IF_ADD)) ++ is_progress = 1; ++ return is_progress; ++} ++ ++s32 ++wl_cfg80211_is_progress_ifchange(void) ++{ ++ s32 is_progress = 0; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ if (wl_get_p2p_status(wl, IF_CHANGING)) ++ is_progress = 1; ++ return is_progress; ++} ++ ++ ++s32 ++wl_cfg80211_notify_ifchange(void) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ if (wl_get_p2p_status(wl, IF_CHANGING)) { ++ wl_set_p2p_status(wl, IF_CHANGED); ++ wake_up_interruptible(&wl->netif_change_event); ++ } ++ return 0; ++} ++ ++/* Find listen channel */ ++static s32 wl_find_listen_channel(struct wl_priv *wl, ++ u8 *ie, u32 ie_len) ++{ ++ wifi_p2p_ie_t *p2p_ie; ++ u8 *end, *pos; ++ s32 listen_channel; ++ ++ p2p_ie = wl_cfgp2p_find_p2pie(ie, ie_len); ++ ++ if (p2p_ie == NULL) ++ return 0; ++ ++ pos = p2p_ie->subelts; ++ end = p2p_ie->subelts + (p2p_ie->len - 4); ++ ++ AP6210_DEBUG(" found p2p ie ! lenth %d \n", ++ p2p_ie->len); ++ ++ while (pos < end) { ++ uint16 attr_len; ++ if (pos + 2 >= end) { ++ AP6210_DEBUG(" -- Invalid P2P attribute"); ++ return 0; ++ } ++ attr_len = ((uint16) (((pos + 1)[1] << 8) | (pos + 1)[0])); ++ ++ if (pos + 3 + attr_len > end) { ++ AP6210_DEBUG("P2P: Attribute underflow " ++ "(len=%u left=%d)", ++ attr_len, (int) (end - pos - 3)); ++ return 0; ++ } ++ ++ /* if Listen Channel att id is 6 and the vailue is valid, ++ * return the listen channel ++ */ ++ if (pos[0] == 6) { ++ /* listen channel subel length format ++ * 1(id) + 2(len) + 3(country) + 1(op. class) + 1(chan num) ++ */ ++ listen_channel = pos[1 + 2 + 3 + 1]; ++ ++ if (listen_channel == SOCIAL_CHAN_1 || ++ listen_channel == SOCIAL_CHAN_2 || ++ listen_channel == SOCIAL_CHAN_3) { ++ AP6210_DEBUG(" Found my Listen Channel %d \n", listen_channel); ++ return listen_channel; ++ } ++ } ++ pos += 3 + attr_len; ++ } ++ return 0; ++} ++ ++static void wl_scan_prep(struct wl_scan_params *params, struct cfg80211_scan_request *request) ++{ ++ u32 n_ssids; ++ u32 n_channels; ++ u16 channel; ++ chanspec_t chanspec; ++ s32 i = 0, j = 0, offset; ++ char *ptr; ++ wlc_ssid_t ssid; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ memcpy(¶ms->bssid, ðer_bcast, ETHER_ADDR_LEN); ++ params->bss_type = DOT11_BSSTYPE_ANY; ++ params->scan_type = 0; ++ params->nprobes = -1; ++ params->active_time = -1; ++ params->passive_time = -1; ++ params->home_time = -1; ++ params->channel_num = 0; ++ memset(¶ms->ssid, 0, sizeof(wlc_ssid_t)); ++ ++ AP6210_DEBUG("Preparing Scan request\n"); ++ AP6210_DEBUG("nprobes=%d\n", params->nprobes); ++ AP6210_DEBUG("active_time=%d\n", params->active_time); ++ AP6210_DEBUG("passive_time=%d\n", params->passive_time); ++ AP6210_DEBUG("home_time=%d\n", params->home_time); ++ AP6210_DEBUG("scan_type=%d\n", params->scan_type); ++ ++ params->nprobes = htod32(params->nprobes); ++ params->active_time = htod32(params->active_time); ++ params->passive_time = htod32(params->passive_time); ++ params->home_time = htod32(params->home_time); ++ ++ /* if request is null just exit so it will be all channel broadcast scan */ ++ if (!request) ++ return; ++ ++ n_ssids = request->n_ssids; ++ n_channels = request->n_channels; ++ ++ /* Copy channel array if applicable */ ++ AP6210_DEBUG("### List of channelspecs to scan ###\n"); ++ if (n_channels > 0) { ++ for (i = 0; i < n_channels; i++) { ++ chanspec = 0; ++ channel = ieee80211_frequency_to_channel(request->channels[i]->center_freq); ++ /* SKIP DFS channels for Secondary interface */ ++ if ((wl->escan_info.ndev != wl_to_prmry_ndev(wl)) && ++ (request->channels[i]->flags & ++ (IEEE80211_CHAN_RADAR | IEEE80211_CHAN_PASSIVE_SCAN))) ++ continue; ++ ++ if (request->channels[i]->band == IEEE80211_BAND_2GHZ) { ++#ifdef WL_HOST_BAND_MGMT ++ if (wl->curr_band == WLC_BAND_5G) { ++ AP6210_DEBUG("In 5G only mode, omit 2G channel:%d\n", channel); ++ continue; ++ } ++#endif /* WL_HOST_BAND_MGMT */ ++ chanspec |= WL_CHANSPEC_BAND_2G; ++ } else { ++#ifdef WL_HOST_BAND_MGMT ++ if (wl->curr_band == WLC_BAND_2G) { ++ AP6210_DEBUG("In 2G only mode, omit 5G channel:%d\n", channel); ++ continue; ++ } ++#endif /* WL_HOST_BAND_MGMT */ ++ chanspec |= WL_CHANSPEC_BAND_5G; ++ } ++ ++ chanspec |= WL_CHANSPEC_BW_20; ++ chanspec |= WL_CHANSPEC_CTL_SB_NONE; ++ ++ params->channel_list[j] = channel; ++ params->channel_list[j] &= WL_CHANSPEC_CHAN_MASK; ++ params->channel_list[j] |= chanspec; ++ AP6210_DEBUG("Chan : %d, Channel spec: %x \n", ++ channel, params->channel_list[j]); ++ params->channel_list[j] = wl_chspec_host_to_driver(params->channel_list[j]); ++ j++; ++ } ++ } else { ++ AP6210_DEBUG("Scanning all channels\n"); ++ } ++ n_channels = j; ++ /* Copy ssid array if applicable */ ++ AP6210_DEBUG("### List of SSIDs to scan ###\n"); ++ if (n_ssids > 0) { ++ offset = offsetof(wl_scan_params_t, channel_list) + n_channels * sizeof(u16); ++ offset = roundup(offset, sizeof(u32)); ++ ptr = (char*)params + offset; ++ for (i = 0; i < n_ssids; i++) { ++ memset(&ssid, 0, sizeof(wlc_ssid_t)); ++ ssid.SSID_len = request->ssids[i].ssid_len; ++ memcpy(ssid.SSID, request->ssids[i].ssid, ssid.SSID_len); ++ if (!ssid.SSID_len) ++ AP6210_DEBUG("%d: Broadcast scan\n", i); ++ else ++ AP6210_DEBUG("%d: scan for %s size =%d\n", i, ++ ssid.SSID, ssid.SSID_len); ++ memcpy(ptr, &ssid, sizeof(wlc_ssid_t)); ++ ptr += sizeof(wlc_ssid_t); ++ } ++ } else { ++ AP6210_DEBUG("Broadcast scan\n"); ++ } ++ /* Adding mask to channel numbers */ ++ params->channel_num = ++ htod32((n_ssids << WL_SCAN_PARAMS_NSSID_SHIFT) | ++ (n_channels & WL_SCAN_PARAMS_COUNT_MASK)); ++ ++ if (n_channels == 1 && wl_get_drv_status_all(wl, CONNECTED)) { ++ params->active_time = WL_SCAN_CONNECT_DWELL_TIME_MS; ++ } ++} ++ ++static s32 ++wl_run_iscan(struct wl_iscan_ctrl *iscan, struct cfg80211_scan_request *request, u16 action) ++{ ++ u32 n_channels; ++ u32 n_ssids; ++ s32 params_size = ++ (WL_SCAN_PARAMS_FIXED_SIZE + offsetof(wl_iscan_params_t, params)); ++ struct wl_iscan_params *params = NULL; ++ s32 err = 0; ++ ++ if (request != NULL) { ++ n_channels = request->n_channels; ++ n_ssids = request->n_ssids; ++ /* Allocate space for populating ssids in wl_iscan_params struct */ ++ if (n_channels % 2) ++ /* If n_channels is odd, add a padd of u16 */ ++ params_size += sizeof(u16) * (n_channels + 1); ++ else ++ params_size += sizeof(u16) * n_channels; ++ ++ /* Allocate space for populating ssids in wl_iscan_params struct */ ++ params_size += sizeof(struct wlc_ssid) * n_ssids; ++ } ++ params = (struct wl_iscan_params *)kzalloc(params_size, GFP_KERNEL); ++ if (!params) { ++ err = -ENOMEM; ++ goto done; ++ } ++ wl_scan_prep(¶ms->params, request); ++ ++ params->version = htod32(ISCAN_REQ_VERSION); ++ params->action = htod16(action); ++ params->scan_duration = htod16(0); ++ ++ if (params_size + sizeof("iscan") >= WLC_IOCTL_MEDLEN) { ++ AP6210_ERR("ioctl buffer length is not sufficient\n"); ++ err = -ENOMEM; ++ goto done; ++ } ++ err = wldev_iovar_setbuf(iscan->dev, "iscan", params, params_size, ++ iscan->ioctl_buf, WLC_IOCTL_MEDLEN, NULL); ++ if (unlikely(err)) { ++ if (err == -EBUSY) { ++ AP6210_ERR("system busy : iscan canceled\n"); ++ } else { ++ AP6210_ERR("error (%d)\n", err); ++ } ++ } ++ ++done: ++ if (params) ++ kfree(params); ++ return err; ++} ++ ++static s32 wl_do_iscan(struct wl_priv *wl, struct cfg80211_scan_request *request) ++{ ++ struct wl_iscan_ctrl *iscan = wl_to_iscan(wl); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ s32 passive_scan; ++ s32 err = 0; ++ ++ iscan->state = WL_ISCAN_STATE_SCANING; ++ ++ passive_scan = wl->active_scan ? 0 : 1; ++ err = wldev_ioctl(ndev, WLC_SET_PASSIVE_SCAN, ++ &passive_scan, sizeof(passive_scan), true); ++ if (unlikely(err)) { ++ AP6210_DEBUG("error (%d)\n", err); ++ return err; ++ } ++ wl->iscan_kickstart = true; ++ wl_run_iscan(iscan, request, WL_SCAN_ACTION_START); ++ mod_timer(&iscan->timer, jiffies + msecs_to_jiffies(iscan->timer_ms)); ++ iscan->timer_on = 1; ++ ++ return err; ++} ++ ++static s32 ++wl_get_valid_channels(struct net_device *ndev, u8 *valid_chan_list, s32 size) ++{ ++ wl_uint32_list_t *list; ++ s32 err = BCME_OK; ++ if (valid_chan_list == NULL || size <= 0) ++ return -ENOMEM; ++ ++ memset(valid_chan_list, 0, size); ++ list = (wl_uint32_list_t *)(void *) valid_chan_list; ++ list->count = htod32(WL_NUMCHANNELS); ++ err = wldev_ioctl(ndev, WLC_GET_VALID_CHANNELS, valid_chan_list, size, false); ++ if (err != 0) { ++ AP6210_ERR("get channels failed with %d\n", err); ++ } ++ ++ return err; ++} ++ ++static s32 ++wl_run_escan(struct wl_priv *wl, struct net_device *ndev, ++ struct cfg80211_scan_request *request, uint16 action) ++{ ++ s32 err = BCME_OK; ++ u32 n_channels; ++ u32 n_ssids; ++ s32 params_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_escan_params_t, params)); ++ wl_escan_params_t *params = NULL; ++ u8 chan_buf[sizeof(u32)*(WL_NUMCHANNELS + 1)]; ++ u32 num_chans = 0; ++ s32 channel; ++ s32 n_valid_chan; ++ s32 search_state = WL_P2P_DISC_ST_SCAN; ++ u32 i, j, n_nodfs = 0; ++ u16 *default_chan_list = NULL; ++ wl_uint32_list_t *list; ++ struct net_device *dev = NULL; ++ ++ AP6210_DEBUG("Enter \n"); ++ ++ if (!wl) { ++ err = -EINVAL; ++ goto exit; ++ } ++ if (!wl->p2p_supported || !p2p_scan(wl)) { ++ /* LEGACY SCAN TRIGGER */ ++ AP6210_DEBUG(" LEGACY E-SCAN START\n"); ++ ++ /* if scan request is not empty parse scan request paramters */ ++ if (request != NULL) { ++ n_channels = request->n_channels; ++ n_ssids = request->n_ssids; ++ /* Allocate space for populating ssids in wl_iscan_params struct */ ++ if (n_channels % 2) ++ /* If n_channels is odd, add a padd of u16 */ ++ params_size += sizeof(u16) * (n_channels + 1); ++ else ++ params_size += sizeof(u16) * n_channels; ++ ++ /* Allocate space for populating ssids in wl_iscan_params struct */ ++ params_size += sizeof(struct wlc_ssid) * n_ssids; ++ } ++ params = (wl_escan_params_t *) kzalloc(params_size, GFP_KERNEL); ++ if (params == NULL) { ++ err = -ENOMEM; ++ goto exit; ++ } ++ ++ wl_scan_prep(¶ms->params, request); ++ ++ params->version = htod32(ESCAN_REQ_VERSION); ++ params->action = htod16(action); ++ params->sync_id = htod16(0x1234); ++ if (params_size + sizeof("escan") >= WLC_IOCTL_MEDLEN) { ++ AP6210_ERR("ioctl buffer length not sufficient\n"); ++ kfree(params); ++ err = -ENOMEM; ++ goto exit; ++ } ++ err = wldev_iovar_setbuf(ndev, "escan", params, params_size, ++ wl->escan_ioctl_buf, WLC_IOCTL_MEDLEN, NULL); ++ if (unlikely(err)) { ++ if (err == BCME_EPERM) ++ /* Scan Not permitted at this point of time */ ++ AP6210_DEBUG(" Escan not permitted at this time (%d)\n", err); ++ else ++ AP6210_ERR(" Escan set error (%d)\n", err); ++ } ++ kfree(params); ++ } ++ else if (p2p_is_on(wl) && p2p_scan(wl)) { ++ /* P2P SCAN TRIGGER */ ++ s32 _freq = 0; ++ n_nodfs = 0; ++ if (request && request->n_channels) { ++ num_chans = request->n_channels; ++ AP6210_DEBUG(" chann number : %d\n", num_chans); ++ default_chan_list = kzalloc(num_chans * sizeof(*default_chan_list), ++ GFP_KERNEL); ++ if (default_chan_list == NULL) { ++ AP6210_ERR("channel list allocation failed \n"); ++ err = -ENOMEM; ++ goto exit; ++ } ++ if (!wl_get_valid_channels(ndev, chan_buf, sizeof(chan_buf))) { ++ list = (wl_uint32_list_t *) chan_buf; ++ n_valid_chan = dtoh32(list->count); ++ for (i = 0; i < num_chans; i++) ++ { ++#ifdef WL_HOST_BAND_MGMT ++ int channel_band = 0; ++#endif /* WL_HOST_BAND_MGMT */ ++ _freq = request->channels[i]->center_freq; ++ channel = ieee80211_frequency_to_channel(_freq); ++#ifdef WL_HOST_BAND_MGMT ++ channel_band = (channel > CH_MAX_2G_CHANNEL) ? ++ WLC_BAND_5G : WLC_BAND_2G; ++ if ((wl->curr_band != WLC_BAND_AUTO) && ++ (wl->curr_band != channel_band) && ++ !IS_P2P_SOCIAL_CHANNEL(channel)) ++ continue; ++#endif /* WL_HOST_BAND_MGMT */ ++ ++ /* ignore DFS channels */ ++ if (request->channels[i]->flags & ++ (IEEE80211_CHAN_RADAR ++ | IEEE80211_CHAN_PASSIVE_SCAN)) ++ continue; ++ ++ for (j = 0; j < n_valid_chan; j++) { ++ /* allows only supported channel on ++ * current reguatory ++ */ ++ if (channel == (dtoh32(list->element[j]))) ++ default_chan_list[n_nodfs++] = ++ channel; ++ } ++ ++ } ++ } ++ if (num_chans == 3 && ( ++ (default_chan_list[0] == SOCIAL_CHAN_1) && ++ (default_chan_list[1] == SOCIAL_CHAN_2) && ++ (default_chan_list[2] == SOCIAL_CHAN_3))) { ++ /* SOCIAL CHANNELS 1, 6, 11 */ ++ search_state = WL_P2P_DISC_ST_SEARCH; ++ AP6210_DEBUG("P2P SEARCH PHASE START \n"); ++ } else if ((dev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION)) && ++ (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP)) { ++ /* If you are already a GO, then do SEARCH only */ ++ AP6210_DEBUG("Already a GO. Do SEARCH Only"); ++ search_state = WL_P2P_DISC_ST_SEARCH; ++ num_chans = n_nodfs; ++ ++ } else { ++ AP6210_DEBUG("P2P SCAN STATE START \n"); ++ num_chans = n_nodfs; ++ } ++ ++ } ++ err = wl_cfgp2p_escan(wl, ndev, wl->active_scan, num_chans, default_chan_list, ++ search_state, action, ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ kfree(default_chan_list); ++ } ++exit: ++ if (unlikely(err)) { ++ /* Don't print Error incase of Scan suppress */ ++ if ((err == BCME_EPERM) && wl->scan_suppressed) ++ AP6210_DEBUG("Escan failed: Scan Suppressed \n"); ++ else ++ AP6210_ERR("error (%d)\n", err); ++ } ++ return err; ++} ++ ++ ++static s32 ++wl_do_escan(struct wl_priv *wl, struct wiphy *wiphy, struct net_device *ndev, ++ struct cfg80211_scan_request *request) ++{ ++ s32 err = BCME_OK; ++ s32 passive_scan; ++ wl_scan_results_t *results; ++ AP6210_DEBUG("Enter \n"); ++ mutex_lock(&wl->usr_sync); ++ results = (wl_scan_results_t *) wl->escan_info.escan_buf; ++ results->version = 0; ++ results->count = 0; ++ results->buflen = WL_SCAN_RESULTS_FIXED_SIZE; ++ ++ wl->escan_info.ndev = ndev; ++ wl->escan_info.wiphy = wiphy; ++ wl->escan_info.escan_state = WL_ESCAN_STATE_SCANING; ++ passive_scan = wl->active_scan ? 0 : 1; ++ err = wldev_ioctl(ndev, WLC_SET_PASSIVE_SCAN, ++ &passive_scan, sizeof(passive_scan), true); ++ if (unlikely(err)) { ++ AP6210_ERR("error (%d)\n", err); ++ goto exit; ++ } ++ ++ err = wl_run_escan(wl, ndev, request, WL_SCAN_ACTION_START); ++exit: ++ mutex_unlock(&wl->usr_sync); ++ return err; ++} ++ ++static s32 ++__wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ++ struct cfg80211_scan_request *request, ++ struct cfg80211_ssid *this_ssid) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct cfg80211_ssid *ssids; ++ struct wl_scan_req *sr = wl_to_sr(wl); ++ struct ether_addr primary_mac; ++ s32 passive_scan; ++ bool iscan_req; ++ bool escan_req = false; ++ bool p2p_ssid; ++#ifdef WL11U ++ bcm_tlv_t *interworking_ie; ++ u32 ie_len; ++#endif ++ s32 err = 0; ++ s32 bssidx = -1; ++ s32 i; ++ ++ unsigned long flags; ++ static s32 busy_count = 0; ++ ++ /* If scan req comes for p2p0, send it over primary I/F ++ * Scan results will be delivered corresponding to cfg80211_scan_request ++ */ ++ if (ndev == wl->p2p_net) { ++ ndev = wl_to_prmry_ndev(wl); ++ } ++ ++ if (WL_DRV_STATUS_SENDING_AF_FRM_EXT(wl)) { ++ AP6210_ERR("Sending Action Frames. Try it again.\n"); ++ return -EAGAIN; ++ } ++ ++ AP6210_DEBUG("Enter wiphy (%p)\n", wiphy); ++ if (wl_get_drv_status_all(wl, SCANNING)) { ++ if (wl->scan_request == NULL) { ++ wl_clr_drv_status_all(wl, SCANNING); ++ AP6210_DEBUG("<<<<<<<<<<>>>>>>>>>>\n"); ++ } else { ++ AP6210_ERR("Scanning already\n"); ++ return -EAGAIN; ++ } ++ } ++ if (wl_get_drv_status(wl, SCAN_ABORTING, ndev)) { ++ AP6210_ERR("Scanning being aborted\n"); ++ return -EAGAIN; ++ } ++ if (request && request->n_ssids > WL_SCAN_PARAMS_SSID_MAX) { ++ AP6210_ERR("request null or n_ssids > WL_SCAN_PARAMS_SSID_MAX\n"); ++ return -EOPNOTSUPP; ++ } ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL)) { ++ AP6210_DEBUG("Remain_on_channel bit is set, somehow it didn't get cleared\n"); ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ ++ /* Arm scan timeout timer */ ++ mod_timer(&wl->scan_timeout, jiffies + msecs_to_jiffies(WL_SCAN_TIMER_INTERVAL_MS)); ++ iscan_req = false; ++ if (request) { /* scan bss */ ++ ssids = request->ssids; ++ if (wl->iscan_on && (!ssids || !ssids->ssid_len || request->n_ssids != 1)) { ++ iscan_req = true; ++ } else if (wl->escan_on) { ++ escan_req = true; ++ p2p_ssid = false; ++ for (i = 0; i < request->n_ssids; i++) { ++ if (ssids[i].ssid_len && ++ IS_P2P_SSID(ssids[i].ssid, ssids[i].ssid_len)) { ++ p2p_ssid = true; ++ break; ++ } ++ } ++ if (p2p_ssid) { ++ if (wl->p2p_supported) { ++ /* p2p scan trigger */ ++ if (p2p_on(wl) == false) { ++ /* p2p on at the first time */ ++ p2p_on(wl) = true; ++ wl_cfgp2p_set_firm_p2p(wl); ++ get_primary_mac(wl, &primary_mac); ++ wl_cfgp2p_generate_bss_mac(&primary_mac, ++ &wl->p2p->dev_addr, &wl->p2p->int_addr); ++ } ++ wl_clr_p2p_status(wl, GO_NEG_PHASE); ++ AP6210_DEBUG("P2P: GO_NEG_PHASE status cleared \n"); ++ p2p_scan(wl) = true; ++ } ++ } else { ++ /* legacy scan trigger ++ * So, we have to disable p2p discovery if p2p discovery is on ++ */ ++ if (wl->p2p_supported) { ++ p2p_scan(wl) = false; ++ /* If Netdevice is not equals to primary and p2p is on ++ * , we will do p2p scan using P2PAPI_BSSCFG_DEVICE. ++ */ ++ ++ if (p2p_scan(wl) == false) { ++ if (wl_get_p2p_status(wl, DISCOVERY_ON)) { ++ err = wl_cfgp2p_discover_enable_search(wl, ++ false); ++ if (unlikely(err)) { ++ goto scan_out; ++ } ++ ++ } ++ } ++ } ++ if (!wl->p2p_supported || !p2p_scan(wl)) { ++ bssidx = wl_cfgp2p_find_idx(wl, ndev); ++ ++#ifdef WL11U ++ if ((interworking_ie = wl_cfg80211_find_interworking_ie( ++ (u8 *)request->ie, request->ie_len)) != NULL) { ++ ie_len = interworking_ie->len; ++ ++ err = wl_cfg80211_add_iw_ie(wl, ndev, bssidx, ++ VNDR_IE_CUSTOM_FLAG, interworking_ie->id, ++ interworking_ie->data, interworking_ie->len); ++ ++ if (unlikely(err)) { ++ goto scan_out; ++ } ++ } else if (wl->iw_ie_len != 0) { ++ /* we have to clear IW IE and disable gratuitous APR */ ++ wl_cfg80211_add_iw_ie(wl, ndev, bssidx, ++ VNDR_IE_CUSTOM_FLAG, ++ DOT11_MNG_INTERWORKING_ID, ++ 0, 0); ++ ++ wldev_iovar_setint_bsscfg(ndev, "grat_arp", 0, ++ bssidx); ++ /* we don't care about error */ ++ } ++#endif /* WL11U */ ++ err = wl_cfgp2p_set_management_ie(wl, ndev, bssidx, ++ VNDR_IE_PRBREQ_FLAG, (u8 *)request->ie, ++ request->ie_len); ++ ++ if (unlikely(err)) { ++ goto scan_out; ++ } ++ ++ } ++ } ++ } ++ } else { /* scan in ibss */ ++ /* we don't do iscan in ibss */ ++ ssids = this_ssid; ++ } ++ wl->scan_request = request; ++ wl_set_drv_status(wl, SCANNING, ndev); ++ if (iscan_req) { ++ err = wl_do_iscan(wl, request); ++ if (likely(!err)) ++ goto scan_success; ++ else ++ goto scan_out; ++ } else if (escan_req) { ++ if (wl->p2p_supported) { ++ if (p2p_on(wl) && p2p_scan(wl)) { ++ ++ /* find my listen channel */ ++ wl->afx_hdl->my_listen_chan = ++ wl_find_listen_channel(wl, (u8 *)request->ie, ++ request->ie_len); ++ err = wl_cfgp2p_enable_discovery(wl, ndev, ++ request->ie, request->ie_len); ++ ++ if (unlikely(err)) { ++ goto scan_out; ++ } ++ } ++ } ++ err = wl_do_escan(wl, wiphy, ndev, request); ++ if (likely(!err)) ++ goto scan_success; ++ else ++ goto scan_out; ++ ++ ++ } else { ++ memset(&sr->ssid, 0, sizeof(sr->ssid)); ++ sr->ssid.SSID_len = ++ min_t(u8, sizeof(sr->ssid.SSID), ssids->ssid_len); ++ if (sr->ssid.SSID_len) { ++ memcpy(sr->ssid.SSID, ssids->ssid, sr->ssid.SSID_len); ++ sr->ssid.SSID_len = htod32(sr->ssid.SSID_len); ++ AP6210_DEBUG("Specific scan ssid=\"%s\" len=%d\n", ++ sr->ssid.SSID, sr->ssid.SSID_len); ++ } else { ++ AP6210_DEBUG("Broadcast scan\n"); ++ } ++ AP6210_DEBUG("sr->ssid.SSID_len (%d)\n", sr->ssid.SSID_len); ++ passive_scan = wl->active_scan ? 0 : 1; ++ err = wldev_ioctl(ndev, WLC_SET_PASSIVE_SCAN, ++ &passive_scan, sizeof(passive_scan), true); ++ if (unlikely(err)) { ++ AP6210_DEBUG("WLC_SET_PASSIVE_SCAN error (%d)\n", err); ++ goto scan_out; ++ } ++ err = wldev_ioctl(ndev, WLC_SCAN, &sr->ssid, ++ sizeof(sr->ssid), false); ++ if (err) { ++ if (err == -EBUSY) { ++ AP6210_ERR("system busy : scan for \"%s\" " ++ "canceled\n", sr->ssid.SSID); ++ } else { ++ AP6210_ERR("WLC_SCAN error (%d)\n", err); ++ } ++ goto scan_out; ++ } ++ } ++ ++scan_success: ++ ++ busy_count = 0; ++ ++ return 0; ++ ++scan_out: ++ ++ if (err == BCME_BUSY || err == BCME_NOTREADY) { ++ AP6210_ERR("Scan err = (%d), busy?%d", err, -EBUSY); ++ err = -EBUSY; ++ } ++ ++#define SCAN_EBUSY_RETRY_LIMIT 10 ++ if (err == -EBUSY) { ++ if (busy_count++ > SCAN_EBUSY_RETRY_LIMIT) { ++ struct ether_addr bssid; ++ s32 ret = 0; ++ busy_count = 0; ++ AP6210_ERR("Unusual continuous EBUSY error, %d %d %d %d %d %d %d %d %d\n", ++ wl_get_drv_status(wl, SCANNING, ndev), ++ wl_get_drv_status(wl, SCAN_ABORTING, ndev), ++ wl_get_drv_status(wl, CONNECTING, ndev), ++ wl_get_drv_status(wl, CONNECTED, ndev), ++ wl_get_drv_status(wl, DISCONNECTING, ndev), ++ wl_get_drv_status(wl, AP_CREATING, ndev), ++ wl_get_drv_status(wl, AP_CREATED, ndev), ++ wl_get_drv_status(wl, SENDING_ACT_FRM, ndev), ++ wl_get_drv_status(wl, SENDING_ACT_FRM, ndev)); ++ ++ bzero(&bssid, sizeof(bssid)); ++ if ((ret = wldev_ioctl(ndev, WLC_GET_BSSID, ++ &bssid, ETHER_ADDR_LEN, false)) == 0) ++ AP6210_ERR("FW is connected with " MACDBG "/n", ++ MAC2STRDBG(bssid.octet)); ++ else ++ AP6210_ERR("GET BSSID failed with %d\n", ret); ++ ++ wl_cfg80211_disconnect(wiphy, ndev, DOT11_RC_DISASSOC_LEAVING); ++ } ++ } else { ++ busy_count = 0; ++ } ++ wl_clr_drv_status(wl, SCANNING, ndev); ++ if (timer_pending(&wl->scan_timeout)) ++ del_timer_sync(&wl->scan_timeout); ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ wl->scan_request = NULL; ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ return err; ++} ++ ++static s32 ++wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ++ struct cfg80211_scan_request *request) ++{ ++ s32 err = 0; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ ++ AP6210_DEBUG("Enter \n"); ++ CHECK_SYS_UP(wl); ++ ++ err = __wl_cfg80211_scan(wiphy, ndev, request, NULL); ++ if (unlikely(err)) { ++ if ((err == BCME_EPERM) && wl->scan_suppressed) ++ AP6210_DEBUG("scan not permitted at this time (%d)\n", err); ++ else ++ AP6210_ERR("scan error (%d)\n", err); ++ return err; ++ } ++ ++ return err; ++} ++ ++static s32 wl_set_rts(struct net_device *dev, u32 rts_threshold) ++{ ++ s32 err = 0; ++ ++ err = wldev_iovar_setint(dev, "rtsthresh", rts_threshold); ++ if (unlikely(err)) { ++ AP6210_ERR("Error (%d)\n", err); ++ return err; ++ } ++ return err; ++} ++ ++static s32 wl_set_frag(struct net_device *dev, u32 frag_threshold) ++{ ++ s32 err = 0; ++ ++ err = wldev_iovar_setint_bsscfg(dev, "fragthresh", frag_threshold, 0); ++ if (unlikely(err)) { ++ AP6210_ERR("Error (%d)\n", err); ++ return err; ++ } ++ return err; ++} ++ ++static s32 wl_set_retry(struct net_device *dev, u32 retry, bool l) ++{ ++ s32 err = 0; ++ u32 cmd = (l ? WLC_SET_LRL : WLC_SET_SRL); ++ ++ retry = htod32(retry); ++ err = wldev_ioctl(dev, cmd, &retry, sizeof(retry), true); ++ if (unlikely(err)) { ++ AP6210_ERR("cmd (%d) , error (%d)\n", cmd, err); ++ return err; ++ } ++ return err; ++} ++ ++static s32 wl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed) ++{ ++ struct wl_priv *wl = (struct wl_priv *)wiphy_priv(wiphy); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ s32 err = 0; ++ ++ CHECK_SYS_UP(wl); ++ AP6210_DEBUG("Enter\n"); ++ if (changed & WIPHY_PARAM_RTS_THRESHOLD && ++ (wl->conf->rts_threshold != wiphy->rts_threshold)) { ++ wl->conf->rts_threshold = wiphy->rts_threshold; ++ err = wl_set_rts(ndev, wl->conf->rts_threshold); ++ if (!err) ++ return err; ++ } ++ if (changed & WIPHY_PARAM_FRAG_THRESHOLD && ++ (wl->conf->frag_threshold != wiphy->frag_threshold)) { ++ wl->conf->frag_threshold = wiphy->frag_threshold; ++ err = wl_set_frag(ndev, wl->conf->frag_threshold); ++ if (!err) ++ return err; ++ } ++ if (changed & WIPHY_PARAM_RETRY_LONG && ++ (wl->conf->retry_long != wiphy->retry_long)) { ++ wl->conf->retry_long = wiphy->retry_long; ++ err = wl_set_retry(ndev, wl->conf->retry_long, true); ++ if (!err) ++ return err; ++ } ++ if (changed & WIPHY_PARAM_RETRY_SHORT && ++ (wl->conf->retry_short != wiphy->retry_short)) { ++ wl->conf->retry_short = wiphy->retry_short; ++ err = wl_set_retry(ndev, wl->conf->retry_short, false); ++ if (!err) { ++ return err; ++ } ++ } ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_ibss_params *params) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct cfg80211_bss *bss; ++ struct ieee80211_channel *chan; ++ struct wl_join_params join_params; ++ struct cfg80211_ssid ssid; ++ s32 scan_retry = 0; ++ s32 err = 0; ++ bool rollback_lock = false; ++ ++ AP6210_DEBUG("In\n"); ++ CHECK_SYS_UP(wl); ++ if (params->bssid) { ++ AP6210_ERR("Invalid bssid\n"); ++ return -EOPNOTSUPP; ++ } ++ bss = cfg80211_get_ibss(wiphy, NULL, params->ssid, params->ssid_len); ++ if (!bss) { ++ memcpy(ssid.ssid, params->ssid, params->ssid_len); ++ ssid.ssid_len = params->ssid_len; ++ do { ++ if (unlikely ++ (__wl_cfg80211_scan(wiphy, dev, NULL, &ssid) == ++ -EBUSY)) { ++ wl_delay(150); ++ } else { ++ break; ++ } ++ } while (++scan_retry < WL_SCAN_RETRY_MAX); ++ /* to allow scan_inform to propagate to cfg80211 plane */ ++ if (rtnl_is_locked()) { ++ rtnl_unlock(); ++ rollback_lock = true; ++ } ++ ++ /* wait 4 secons till scan done.... */ ++ schedule_timeout_interruptible(msecs_to_jiffies(4000)); ++ if (rollback_lock) ++ rtnl_lock(); ++ bss = cfg80211_get_ibss(wiphy, NULL, ++ params->ssid, params->ssid_len); ++ } ++ if (bss) { ++ wl->ibss_starter = false; ++ AP6210_DEBUG("Found IBSS\n"); ++ } else { ++ wl->ibss_starter = true; ++ } ++ chan = params->channel; ++ if (chan) ++ wl->channel = ieee80211_frequency_to_channel(chan->center_freq); ++ /* ++ * Join with specific BSSID and cached SSID ++ * If SSID is zero join based on BSSID only ++ */ ++ memset(&join_params, 0, sizeof(join_params)); ++ memcpy((void *)join_params.ssid.SSID, (void *)params->ssid, ++ params->ssid_len); ++ join_params.ssid.SSID_len = htod32(params->ssid_len); ++ if (params->bssid) ++ memcpy(&join_params.params.bssid, params->bssid, ++ ETHER_ADDR_LEN); ++ else ++ memset(&join_params.params.bssid, 0, ETHER_ADDR_LEN); ++ ++ err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, ++ sizeof(join_params), true); ++ if (unlikely(err)) { ++ AP6210_ERR("Error (%d)\n", err); ++ return err; ++ } ++ return err; ++} ++ ++static s32 wl_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 err = 0; ++ ++ CHECK_SYS_UP(wl); ++ wl_link_down(wl); ++ ++ return err; ++} ++ ++static s32 ++wl_set_wpa_version(struct net_device *dev, struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wl_security *sec; ++ s32 val = 0; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) ++ val = WPA_AUTH_PSK | ++ WPA_AUTH_UNSPECIFIED; ++ else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2) ++ val = WPA2_AUTH_PSK| ++ WPA2_AUTH_UNSPECIFIED; ++ else ++ val = WPA_AUTH_DISABLED; ++ ++ if (is_wps_conn(sme)) ++ val = WPA_AUTH_DISABLED; ++ ++#ifdef BCMWAPI_WPI ++ if (sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) { ++ AP6210_DEBUG(" * wl_set_wpa_version, set wpa_auth" ++ " to WPA_AUTH_WAPI 0x400"); ++ val = WAPI_AUTH_PSK; /* | WAPI_AUTH_UNSPECIFIED; */ ++ } ++#endif ++ AP6210_DEBUG("setting wpa_auth to 0x%0x\n", val); ++ err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", val, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("set wpa_auth failed (%d)\n", err); ++ return err; ++ } ++ sec = wl_read_prof(wl, dev, WL_PROF_SEC); ++ sec->wpa_versions = sme->crypto.wpa_versions; ++ return err; ++} ++ ++#ifdef BCMWAPI_WPI ++static s32 ++wl_set_set_wapi_ie(struct net_device *dev, struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ AP6210_DEBUG(" %s \n", __FUNCTION__); ++ ++ if (sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) { ++ err = wldev_iovar_setbuf_bsscfg(dev, "wapiie", sme->ie, ++ sme->ie_len, wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (unlikely(err)) { ++ AP6210_ERR("===> set_wapi_ie Error (%d)\n", err); ++ return err; ++ } ++ } else ++ AP6210_DEBUG(" * skip \n"); ++ return err; ++} ++#endif /* BCMWAPI_WPI */ ++ ++static s32 ++wl_set_auth_type(struct net_device *dev, struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wl_security *sec; ++ s32 val = 0; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ switch (sme->auth_type) { ++ case NL80211_AUTHTYPE_OPEN_SYSTEM: ++ val = WL_AUTH_OPEN_SYSTEM; ++ AP6210_DEBUG("open system\n"); ++ break; ++ case NL80211_AUTHTYPE_SHARED_KEY: ++ val = WL_AUTH_SHARED_KEY; ++ AP6210_DEBUG("shared key\n"); ++ break; ++ case NL80211_AUTHTYPE_AUTOMATIC: ++ val = WL_AUTH_OPEN_SHARED; ++ AP6210_DEBUG("automatic\n"); ++ break; ++ default: ++ val = WL_AUTH_OPEN_SHARED; ++ AP6210_ERR("invalid auth type (%d)\n", sme->auth_type); ++ break; ++ } ++ ++ err = wldev_iovar_setint_bsscfg(dev, "auth", val, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("set auth failed (%d)\n", err); ++ return err; ++ } ++ sec = wl_read_prof(wl, dev, WL_PROF_SEC); ++ sec->auth_type = sme->auth_type; ++ return err; ++} ++ ++static s32 ++wl_set_set_cipher(struct net_device *dev, struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wl_security *sec; ++ s32 pval = 0; ++ s32 gval = 0; ++ s32 err = 0; ++#ifdef BCMWAPI_WPI ++ s32 val = 0; ++#endif ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ if (sme->crypto.n_ciphers_pairwise) { ++ switch (sme->crypto.ciphers_pairwise[0]) { ++ case WLAN_CIPHER_SUITE_WEP40: ++ case WLAN_CIPHER_SUITE_WEP104: ++ pval = WEP_ENABLED; ++ break; ++ case WLAN_CIPHER_SUITE_TKIP: ++ pval = TKIP_ENABLED; ++ break; ++ case WLAN_CIPHER_SUITE_CCMP: ++ pval = AES_ENABLED; ++ break; ++ case WLAN_CIPHER_SUITE_AES_CMAC: ++ pval = AES_ENABLED; ++ break; ++#ifdef BCMWAPI_WPI ++ case WLAN_CIPHER_SUITE_SMS4: ++ val = SMS4_ENABLED; ++ pval = SMS4_ENABLED; ++ break; ++#endif ++ default: ++ AP6210_ERR("invalid cipher pairwise (%d)\n", ++ sme->crypto.ciphers_pairwise[0]); ++ return -EINVAL; ++ } ++ } ++ if (sme->crypto.cipher_group) { ++ switch (sme->crypto.cipher_group) { ++ case WLAN_CIPHER_SUITE_WEP40: ++ case WLAN_CIPHER_SUITE_WEP104: ++ gval = WEP_ENABLED; ++ break; ++ case WLAN_CIPHER_SUITE_TKIP: ++ gval = TKIP_ENABLED; ++ break; ++ case WLAN_CIPHER_SUITE_CCMP: ++ gval = AES_ENABLED; ++ break; ++ case WLAN_CIPHER_SUITE_AES_CMAC: ++ gval = AES_ENABLED; ++ break; ++#ifdef BCMWAPI_WPI ++ case WLAN_CIPHER_SUITE_SMS4: ++ val = SMS4_ENABLED; ++ gval = SMS4_ENABLED; ++ break; ++#endif ++ default: ++ AP6210_ERR("invalid cipher group (%d)\n", ++ sme->crypto.cipher_group); ++ return -EINVAL; ++ } ++ } ++ ++ AP6210_DEBUG("pval (%d) gval (%d)\n", pval, gval); ++ ++ if (is_wps_conn(sme)) { ++ if (sme->privacy) ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", 4, bssidx); ++#ifdef BCMWAPI_WPI ++ else if (sme->crypto.cipher_group == WLAN_CIPHER_SUITE_SMS4) { ++ AP6210_DEBUG(" NO, is_wps_conn, WAPI set to SMS4_ENABLED"); ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", val, bssidx); ++ } ++#endif ++ else ++ /* WPS-2.0 allows no security */ ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", 0, bssidx); ++ } else { ++ AP6210_DEBUG(" NO, is_wps_conn, Set pval | gval to WSEC"); ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", ++ pval | gval, bssidx); ++ } ++ if (unlikely(err)) { ++ AP6210_ERR("error (%d)\n", err); ++ return err; ++ } ++ ++ sec = wl_read_prof(wl, dev, WL_PROF_SEC); ++ sec->cipher_pairwise = sme->crypto.ciphers_pairwise[0]; ++ sec->cipher_group = sme->crypto.cipher_group; ++ ++ return err; ++} ++ ++static s32 ++wl_set_key_mgmt(struct net_device *dev, struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wl_security *sec; ++ s32 val = 0; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ if (sme->crypto.n_akm_suites) { ++ err = wldev_iovar_getint(dev, "wpa_auth", &val); ++ if (unlikely(err)) { ++ AP6210_ERR("could not get wpa_auth (%d)\n", err); ++ return err; ++ } ++ if (val & (WPA_AUTH_PSK | ++ WPA_AUTH_UNSPECIFIED)) { ++ switch (sme->crypto.akm_suites[0]) { ++ case WLAN_AKM_SUITE_8021X: ++ val = WPA_AUTH_UNSPECIFIED; ++ break; ++ case WLAN_AKM_SUITE_PSK: ++ val = WPA_AUTH_PSK; ++ break; ++ default: ++ AP6210_ERR("invalid cipher group (%d)\n", ++ sme->crypto.cipher_group); ++ return -EINVAL; ++ } ++ } else if (val & (WPA2_AUTH_PSK | ++ WPA2_AUTH_UNSPECIFIED)) { ++ switch (sme->crypto.akm_suites[0]) { ++ case WLAN_AKM_SUITE_8021X: ++ val = WPA2_AUTH_UNSPECIFIED; ++ break; ++ case WLAN_AKM_SUITE_PSK: ++ val = WPA2_AUTH_PSK; ++ break; ++ default: ++ AP6210_ERR("invalid cipher group (%d)\n", ++ sme->crypto.cipher_group); ++ return -EINVAL; ++ } ++ } ++#ifdef BCMWAPI_WPI ++ else if (val & (WAPI_AUTH_PSK | WAPI_AUTH_UNSPECIFIED)) { ++ switch (sme->crypto.akm_suites[0]) { ++ case WLAN_AKM_SUITE_WAPI_CERT: ++ val = WAPI_AUTH_UNSPECIFIED; ++ break; ++ case WLAN_AKM_SUITE_WAPI_PSK: ++ val = WAPI_AUTH_PSK; ++ break; ++ default: ++ AP6210_ERR("invalid cipher group (%d)\n", ++ sme->crypto.cipher_group); ++ return -EINVAL; ++ } ++ } ++#endif ++ AP6210_DEBUG("setting wpa_auth to %d\n", val); ++ ++ err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", val, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("could not set wpa_auth (%d)\n", err); ++ return err; ++ } ++ } ++ sec = wl_read_prof(wl, dev, WL_PROF_SEC); ++ sec->wpa_auth = sme->crypto.akm_suites[0]; ++ ++ return err; ++} ++ ++static s32 ++wl_set_set_sharedkey(struct net_device *dev, ++ struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wl_security *sec; ++ struct wl_wsec_key key; ++ s32 val; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ AP6210_DEBUG("key len (%d)\n", sme->key_len); ++ if (sme->key_len) { ++ sec = wl_read_prof(wl, dev, WL_PROF_SEC); ++ AP6210_DEBUG("wpa_versions 0x%x cipher_pairwise 0x%x\n", ++ sec->wpa_versions, sec->cipher_pairwise); ++ if (!(sec->wpa_versions & (NL80211_WPA_VERSION_1 | ++ NL80211_WPA_VERSION_2 ++#ifdef BCMWAPI_WPI ++ | NL80211_WAPI_VERSION_1 ++#endif ++ )) && ++ (sec->cipher_pairwise & (WLAN_CIPHER_SUITE_WEP40 | ++ WLAN_CIPHER_SUITE_WEP104 ++#ifdef BCMWAPI_WPI ++ | WLAN_CIPHER_SUITE_SMS4 ++#endif ++ ))) ++ { ++ memset(&key, 0, sizeof(key)); ++ key.len = (u32) sme->key_len; ++ key.index = (u32) sme->key_idx; ++ if (unlikely(key.len > sizeof(key.data))) { ++ AP6210_ERR("Too long key length (%u)\n", key.len); ++ return -EINVAL; ++ } ++ memcpy(key.data, sme->key, key.len); ++ key.flags = WL_PRIMARY_KEY; ++ switch (sec->cipher_pairwise) { ++ case WLAN_CIPHER_SUITE_WEP40: ++ key.algo = CRYPTO_ALGO_WEP1; ++ break; ++ case WLAN_CIPHER_SUITE_WEP104: ++ key.algo = CRYPTO_ALGO_WEP128; ++ break; ++#ifdef BCMWAPI_WPI ++ case WLAN_CIPHER_SUITE_SMS4: ++ key.algo = CRYPTO_ALGO_SMS4; ++ break; ++#endif ++ default: ++ AP6210_ERR("Invalid algorithm (%d)\n", ++ sme->crypto.ciphers_pairwise[0]); ++ return -EINVAL; ++ } ++ /* Set the new key/index */ ++ AP6210_DEBUG("key length (%d) key index (%d) algo (%d)\n", ++ key.len, key.index, key.algo); ++ AP6210_DEBUG("key \"%s\"\n", key.data); ++ swap_key_from_BE(&key); ++ err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_SET_KEY error (%d)\n", err); ++ return err; ++ } ++ if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { ++ AP6210_DEBUG("set auth_type to shared key\n"); ++ val = WL_AUTH_SHARED_KEY; /* shared key */ ++ err = wldev_iovar_setint_bsscfg(dev, "auth", val, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("set auth failed (%d)\n", err); ++ return err; ++ } ++ } ++ } ++ } ++ return err; ++} ++ ++#ifdef ESCAN_RESULT_PATCH ++static u8 connect_req_bssid[6]; ++static u8 broad_bssid[6]; ++#endif ++ ++ ++static s32 ++wl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_connect_params *sme) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct ieee80211_channel *chan = sme->channel; ++ wl_extjoin_params_t *ext_join_params; ++ struct wl_join_params join_params; ++ size_t join_params_size; ++ s32 err = 0; ++ wpa_ie_fixed_t *wpa_ie; ++ bcm_tlv_t *wpa2_ie; ++ u8* wpaie = 0; ++ u32 wpaie_len = 0; ++ u32 chan_cnt = 0; ++ struct ether_addr bssid; ++ int ret; ++ ++ AP6210_DEBUG("In\n"); ++ ++ if (unlikely(!sme->ssid)) { ++ AP6210_ERR("Invalid ssid\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ CHECK_SYS_UP(wl); ++ ++ /* ++ * Cancel ongoing scan to sync up with sme state machine of cfg80211. ++ */ ++#if !defined(ESCAN_RESULT_PATCH) ++ if (wl->scan_request) { ++ wl_notify_escan_complete(wl, dev, true, true); ++ } ++#endif ++#ifdef ESCAN_RESULT_PATCH ++ if (sme->bssid) { ++ memcpy(connect_req_bssid, sme->bssid, ETHER_ADDR_LEN); ++ } ++ else { ++ bzero(connect_req_bssid, ETHER_ADDR_LEN); ++ } ++ bzero(broad_bssid, ETHER_ADDR_LEN); ++#endif ++ ++ bzero(&bssid, sizeof(bssid)); ++ if (!wl_get_drv_status(wl, CONNECTED, dev)&& ++ (ret = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false)) == 0) { ++ if (!ETHER_ISNULLADDR(&bssid)) { ++ scb_val_t scbval; ++ wl_set_drv_status(wl, DISCONNECTING, dev); ++ scbval.val = DOT11_RC_DISASSOC_LEAVING; ++ memcpy(&scbval.ea, &bssid, ETHER_ADDR_LEN); ++ scbval.val = htod32(scbval.val); ++ ++ AP6210_DEBUG("drv status CONNECTED is not set, but connected in FW!" MACDBG "\n", ++ MAC2STRDBG(bssid.octet)); ++ err = wldev_ioctl(dev, WLC_DISASSOC, &scbval, ++ sizeof(scb_val_t), true); ++ if (unlikely(err)) { ++ wl_clr_drv_status(wl, DISCONNECTING, dev); ++ AP6210_ERR("error (%d)\n", err); ++ return err; ++ } ++ while (wl_get_drv_status(wl, DISCONNECTING, dev)) { ++ AP6210_ERR("Waiting for disconnection terminated.\n"); ++ msleep(20); ++ } ++ } else ++ AP6210_DEBUG("Currently not associated!\n"); ++ } ++ ++ /* Clean BSSID */ ++ bzero(&bssid, sizeof(bssid)); ++ if (!wl_get_drv_status(wl, DISCONNECTING, dev)) ++ wl_update_prof(wl, dev, NULL, (void *)&bssid, WL_PROF_BSSID); ++ ++ if (p2p_is_on(wl) && (dev != wl_to_prmry_ndev(wl))) { ++ /* we only allow to connect using virtual interface in case of P2P */ ++ wl_cfgp2p_set_management_ie(wl, dev, wl_cfgp2p_find_idx(wl, dev), ++ VNDR_IE_ASSOCREQ_FLAG, sme->ie, sme->ie_len); ++ } else if (dev == wl_to_prmry_ndev(wl)) { ++ /* find the RSN_IE */ ++ if ((wpa2_ie = bcm_parse_tlvs((u8 *)sme->ie, sme->ie_len, ++ DOT11_MNG_RSN_ID)) != NULL) { ++ AP6210_DEBUG(" WPA2 IE is found\n"); ++ } ++ /* find the WPA_IE */ ++ if ((wpa_ie = wl_cfgp2p_find_wpaie((u8 *)sme->ie, ++ sme->ie_len)) != NULL) { ++ AP6210_DEBUG(" WPA IE is found\n"); ++ } ++ if (wpa_ie != NULL || wpa2_ie != NULL) { ++ wpaie = (wpa_ie != NULL) ? (u8 *)wpa_ie : (u8 *)wpa2_ie; ++ wpaie_len = (wpa_ie != NULL) ? wpa_ie->length : wpa2_ie->len; ++ wpaie_len += WPA_RSN_IE_TAG_FIXED_LEN; ++ wldev_iovar_setbuf(dev, "wpaie", wpaie, wpaie_len, ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ } else { ++ wldev_iovar_setbuf(dev, "wpaie", NULL, 0, ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ } ++ ++ err = wl_cfgp2p_set_management_ie(wl, dev, wl_cfgp2p_find_idx(wl, dev), ++ VNDR_IE_ASSOCREQ_FLAG, (u8 *)sme->ie, sme->ie_len); ++ if (unlikely(err)) { ++ return err; ++ } ++ } ++ ++ if (chan) { ++ wl->channel = ieee80211_frequency_to_channel(chan->center_freq); ++ chan_cnt = 1; ++ AP6210_DEBUG("channel (%d), center_req (%d), %d channels\n", wl->channel, ++ chan->center_freq, chan_cnt); ++ } else ++ wl->channel = 0; ++ ++#ifdef BCMWAPI_WPI ++ AP6210_DEBUG("1. enable wapi auth\n"); ++ if (sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) { ++ AP6210_DEBUG("2. set wapi ie \n"); ++ err = wl_set_set_wapi_ie(dev, sme); ++ if (unlikely(err)) ++ return err; ++ } else ++ AP6210_DEBUG("2. Not wapi ie \n"); ++#endif ++ AP6210_DEBUG("ie (%p), ie_len (%zd)\n", sme->ie, sme->ie_len); ++ AP6210_DEBUG("3. set wapi version \n"); ++ err = wl_set_wpa_version(dev, sme); ++ if (unlikely(err)) { ++ AP6210_ERR("Invalid wpa_version\n"); ++ return err; ++ } ++#ifdef BCMWAPI_WPI ++ if (sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) ++ AP6210_DEBUG("4. WAPI Dont Set wl_set_auth_type\n"); ++ else { ++ AP6210_DEBUG("4. wl_set_auth_type\n"); ++#endif ++ err = wl_set_auth_type(dev, sme); ++ if (unlikely(err)) { ++ AP6210_ERR("Invalid auth type\n"); ++ return err; ++ } ++#ifdef BCMWAPI_WPI ++ ++ } ++#endif ++ ++ err = wl_set_set_cipher(dev, sme); ++ if (unlikely(err)) { ++ AP6210_ERR("Invalid ciper\n"); ++ return err; ++ } ++ ++ err = wl_set_key_mgmt(dev, sme); ++ if (unlikely(err)) { ++ AP6210_ERR("Invalid key mgmt\n"); ++ return err; ++ } ++ ++ err = wl_set_set_sharedkey(dev, sme); ++ if (unlikely(err)) { ++ AP6210_ERR("Invalid shared key\n"); ++ return err; ++ } ++ ++ /* ++ * Join with specific BSSID and cached SSID ++ * If SSID is zero join based on BSSID only ++ */ ++ join_params_size = WL_EXTJOIN_PARAMS_FIXED_SIZE + ++ chan_cnt * sizeof(chanspec_t); ++ ext_join_params = (wl_extjoin_params_t*)kzalloc(join_params_size, GFP_KERNEL); ++ if (ext_join_params == NULL) { ++ err = -ENOMEM; ++ wl_clr_drv_status(wl, CONNECTING, dev); ++ goto exit; ++ } ++ ext_join_params->ssid.SSID_len = min(sizeof(ext_join_params->ssid.SSID), sme->ssid_len); ++ memcpy(&ext_join_params->ssid.SSID, sme->ssid, ext_join_params->ssid.SSID_len); ++ wl_update_prof(wl, dev, NULL, &ext_join_params->ssid, WL_PROF_SSID); ++ ext_join_params->ssid.SSID_len = htod32(ext_join_params->ssid.SSID_len); ++ /* increate dwell time to receive probe response or detect Beacon ++ * from target AP at a noisy air only during connect command ++ */ ++ ext_join_params->scan.active_time = WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS; ++ ext_join_params->scan.passive_time = WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS; ++ /* Set up join scan parameters */ ++ ext_join_params->scan.scan_type = -1; ++ ext_join_params->scan.nprobes ++ = (ext_join_params->scan.active_time/WL_SCAN_JOIN_PROBE_INTERVAL_MS); ++ ext_join_params->scan.home_time = -1; ++ ++ if (sme->bssid) ++ memcpy(&ext_join_params->assoc.bssid, sme->bssid, ETH_ALEN); ++ else ++ memcpy(&ext_join_params->assoc.bssid, ðer_bcast, ETH_ALEN); ++ ext_join_params->assoc.chanspec_num = chan_cnt; ++ if (chan_cnt) { ++ u16 channel, band, bw, ctl_sb; ++ chanspec_t chspec; ++ channel = wl->channel; ++ band = (channel <= CH_MAX_2G_CHANNEL) ? WL_CHANSPEC_BAND_2G ++ : WL_CHANSPEC_BAND_5G; ++ bw = WL_CHANSPEC_BW_20; ++ ctl_sb = WL_CHANSPEC_CTL_SB_NONE; ++ chspec = (channel | band | bw | ctl_sb); ++ ext_join_params->assoc.chanspec_list[0] &= WL_CHANSPEC_CHAN_MASK; ++ ext_join_params->assoc.chanspec_list[0] |= chspec; ++ ext_join_params->assoc.chanspec_list[0] = ++ wl_chspec_host_to_driver(ext_join_params->assoc.chanspec_list[0]); ++ } ++ ext_join_params->assoc.chanspec_num = htod32(ext_join_params->assoc.chanspec_num); ++ if (ext_join_params->ssid.SSID_len < IEEE80211_MAX_SSID_LEN) { ++ AP6210_DEBUG("ssid \"%s\", len (%d)\n", ext_join_params->ssid.SSID, ++ ext_join_params->ssid.SSID_len); ++ } ++ wl_set_drv_status(wl, CONNECTING, dev); ++ err = wldev_iovar_setbuf_bsscfg(dev, "join", ext_join_params, join_params_size, ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, wl_cfgp2p_find_idx(wl, dev), &wl->ioctl_buf_sync); ++ kfree(ext_join_params); ++ if (err) { ++ wl_clr_drv_status(wl, CONNECTING, dev); ++ if (err == BCME_UNSUPPORTED) { ++ AP6210_DEBUG("join iovar is not supported\n"); ++ goto set_ssid; ++ } else ++ AP6210_ERR("error (%d)\n", err); ++ } else ++ goto exit; ++ ++set_ssid: ++ memset(&join_params, 0, sizeof(join_params)); ++ join_params_size = sizeof(join_params.ssid); ++ ++ join_params.ssid.SSID_len = min(sizeof(join_params.ssid.SSID), sme->ssid_len); ++ memcpy(&join_params.ssid.SSID, sme->ssid, join_params.ssid.SSID_len); ++ join_params.ssid.SSID_len = htod32(join_params.ssid.SSID_len); ++ wl_update_prof(wl, dev, NULL, &join_params.ssid, WL_PROF_SSID); ++ if (sme->bssid) ++ memcpy(&join_params.params.bssid, sme->bssid, ETH_ALEN); ++ else ++ memcpy(&join_params.params.bssid, ðer_bcast, ETH_ALEN); ++ ++ wl_ch_to_chanspec(wl->channel, &join_params, &join_params_size); ++ AP6210_DEBUG("join_param_size %d\n", join_params_size); ++ ++ if (join_params.ssid.SSID_len < IEEE80211_MAX_SSID_LEN) { ++ AP6210_DEBUG("ssid \"%s\", len (%d)\n", join_params.ssid.SSID, ++ join_params.ssid.SSID_len); ++ } ++ wl_set_drv_status(wl, CONNECTING, dev); ++ err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, join_params_size, true); ++ if (err) { ++ AP6210_ERR("error (%d)\n", err); ++ wl_clr_drv_status(wl, CONNECTING, dev); ++ } ++exit: ++ return err; ++} ++ ++static s32 ++wl_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, ++ u16 reason_code) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ scb_val_t scbval; ++ bool act = false; ++ s32 err = 0; ++ u8 *curbssid; ++ AP6210_ERR("Reason %d\n", reason_code); ++ CHECK_SYS_UP(wl); ++ act = *(bool *) wl_read_prof(wl, dev, WL_PROF_ACT); ++ curbssid = wl_read_prof(wl, dev, WL_PROF_BSSID); ++ if (act) { ++ /* ++ * Cancel ongoing scan to sync up with sme state machine of cfg80211. ++ */ ++#if !defined(ESCAN_RESULT_PATCH) ++ /* Let scan aborted by F/W */ ++ if (wl->scan_request) { ++ wl_notify_escan_complete(wl, dev, true, true); ++ } ++#endif /* ESCAN_RESULT_PATCH */ ++ wl_set_drv_status(wl, DISCONNECTING, dev); ++ scbval.val = reason_code; ++ memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); ++ scbval.val = htod32(scbval.val); ++ err = wldev_ioctl(dev, WLC_DISASSOC, &scbval, ++ sizeof(scb_val_t), true); ++ if (unlikely(err)) { ++ wl_clr_drv_status(wl, DISCONNECTING, dev); ++ AP6210_ERR("error (%d)\n", err); ++ return err; ++ } ++ } ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_set_tx_power(struct wiphy *wiphy, ++ enum nl80211_tx_power_setting type, s32 dbm) ++{ ++ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ u16 txpwrmw; ++ s32 err = 0; ++ s32 disable = 0; ++ ++ CHECK_SYS_UP(wl); ++ switch (type) { ++ case NL80211_TX_POWER_AUTOMATIC: ++ break; ++ case NL80211_TX_POWER_LIMITED: ++ if (dbm < 0) { ++ AP6210_ERR("TX_POWER_LIMITTED - dbm is negative\n"); ++ return -EINVAL; ++ } ++ break; ++ case NL80211_TX_POWER_FIXED: ++ if (dbm < 0) { ++ AP6210_ERR("TX_POWER_FIXED - dbm is negative..\n"); ++ return -EINVAL; ++ } ++ break; ++ } ++ /* Make sure radio is off or on as far as software is concerned */ ++ disable = WL_RADIO_SW_DISABLE << 16; ++ disable = htod32(disable); ++ err = wldev_ioctl(ndev, WLC_SET_RADIO, &disable, sizeof(disable), true); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_SET_RADIO error (%d)\n", err); ++ return err; ++ } ++ ++ if (dbm > 0xffff) ++ txpwrmw = 0xffff; ++ else ++ txpwrmw = (u16) dbm; ++ err = wldev_iovar_setint(ndev, "qtxpower", ++ (s32) (bcm_mw_to_qdbm(txpwrmw))); ++ if (unlikely(err)) { ++ AP6210_ERR("qtxpower error (%d)\n", err); ++ return err; ++ } ++ wl->conf->tx_power = dbm; ++ ++ return err; ++} ++ ++static s32 wl_cfg80211_get_tx_power(struct wiphy *wiphy, s32 *dbm) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ s32 txpwrdbm; ++ u8 result; ++ s32 err = 0; ++ ++ CHECK_SYS_UP(wl); ++ err = wldev_iovar_getint(ndev, "qtxpower", &txpwrdbm); ++ if (unlikely(err)) { ++ AP6210_ERR("error (%d)\n", err); ++ return err; ++ } ++ result = (u8) (txpwrdbm & ~WL_TXPWR_OVERRIDE); ++ *dbm = (s32) bcm_qdbm_to_mw(result); ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool unicast, bool multicast) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ u32 index; ++ s32 wsec; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ AP6210_DEBUG("key index (%d)\n", key_idx); ++ CHECK_SYS_UP(wl); ++ err = wldev_iovar_getint_bsscfg(dev, "wsec", &wsec, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_GET_WSEC error (%d)\n", err); ++ return err; ++ } ++ if (wsec & WEP_ENABLED) { ++ /* Just select a new current key */ ++ index = (u32) key_idx; ++ index = htod32(index); ++ err = wldev_ioctl(dev, WLC_SET_KEY_PRIMARY, &index, ++ sizeof(index), true); ++ if (unlikely(err)) { ++ AP6210_ERR("error (%d)\n", err); ++ } ++ } ++ return err; ++} ++ ++static s32 ++wl_add_keyext(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, const u8 *mac_addr, struct key_params *params) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct wl_wsec_key key; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ s32 mode = wl_get_mode_by_netdev(wl, dev); ++ memset(&key, 0, sizeof(key)); ++ key.index = (u32) key_idx; ++ ++ if (!ETHER_ISMULTI(mac_addr)) ++ memcpy((char *)&key.ea, (void *)mac_addr, ETHER_ADDR_LEN); ++ key.len = (u32) params->key_len; ++ ++ /* check for key index change */ ++ if (key.len == 0) { ++ /* key delete */ ++ swap_key_from_BE(&key); ++ err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (unlikely(err)) { ++ AP6210_ERR("key delete error (%d)\n", err); ++ return err; ++ } ++ } else { ++ if (key.len > sizeof(key.data)) { ++ AP6210_ERR("Invalid key length (%d)\n", key.len); ++ return -EINVAL; ++ } ++ AP6210_DEBUG("Setting the key index %d\n", key.index); ++ memcpy(key.data, params->key, key.len); ++ ++ if ((mode == WL_MODE_BSS) && ++ (params->cipher == WLAN_CIPHER_SUITE_TKIP)) { ++ u8 keybuf[8]; ++ memcpy(keybuf, &key.data[24], sizeof(keybuf)); ++ memcpy(&key.data[24], &key.data[16], sizeof(keybuf)); ++ memcpy(&key.data[16], keybuf, sizeof(keybuf)); ++ } ++ ++ /* if IW_ENCODE_EXT_RX_SEQ_VALID set */ ++ if (params->seq && params->seq_len == 6) { ++ /* rx iv */ ++ u8 *ivptr; ++ ivptr = (u8 *) params->seq; ++ key.rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | ++ (ivptr[3] << 8) | ivptr[2]; ++ key.rxiv.lo = (ivptr[1] << 8) | ivptr[0]; ++ key.iv_initialized = true; ++ } ++ ++ switch (params->cipher) { ++ case WLAN_CIPHER_SUITE_WEP40: ++ key.algo = CRYPTO_ALGO_WEP1; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_WEP40\n"); ++ break; ++ case WLAN_CIPHER_SUITE_WEP104: ++ key.algo = CRYPTO_ALGO_WEP128; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_WEP104\n"); ++ break; ++ case WLAN_CIPHER_SUITE_TKIP: ++ key.algo = CRYPTO_ALGO_TKIP; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_TKIP\n"); ++ break; ++ case WLAN_CIPHER_SUITE_AES_CMAC: ++ key.algo = CRYPTO_ALGO_AES_CCM; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_AES_CMAC\n"); ++ break; ++ case WLAN_CIPHER_SUITE_CCMP: ++ key.algo = CRYPTO_ALGO_AES_CCM; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_CCMP\n"); ++ break; ++#ifdef BCMWAPI_WPI ++ case WLAN_CIPHER_SUITE_SMS4: ++ key.algo = CRYPTO_ALGO_SMS4; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_SMS4\n"); ++ break; ++#endif ++ default: ++ AP6210_ERR("Invalid cipher (0x%x)\n", params->cipher); ++ return -EINVAL; ++ } ++ swap_key_from_BE(&key); ++ /* need to guarantee EAPOL 4/4 send out before set key */ ++ dhd_wait_pend8021x(dev); ++ err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_SET_KEY error (%d)\n", err); ++ return err; ++ } ++ } ++ return err; ++} ++ ++static s32 ++wl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool pairwise, const u8 *mac_addr, ++ struct key_params *params) ++{ ++ struct wl_wsec_key key; ++ s32 val = 0; ++ s32 wsec = 0; ++ s32 err = 0; ++ u8 keybuf[8]; ++ s32 bssidx = 0; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 mode = wl_get_mode_by_netdev(wl, dev); ++ AP6210_DEBUG("key index (%d)\n", key_idx); ++ CHECK_SYS_UP(wl); ++ ++ bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ if (mac_addr) { ++ wl_add_keyext(wiphy, dev, key_idx, mac_addr, params); ++ goto exit; ++ } ++ memset(&key, 0, sizeof(key)); ++ ++ key.len = (u32) params->key_len; ++ key.index = (u32) key_idx; ++ ++ if (unlikely(key.len > sizeof(key.data))) { ++ AP6210_ERR("Too long key length (%u)\n", key.len); ++ return -EINVAL; ++ } ++ memcpy(key.data, params->key, key.len); ++ ++ key.flags = WL_PRIMARY_KEY; ++ switch (params->cipher) { ++ case WLAN_CIPHER_SUITE_WEP40: ++ key.algo = CRYPTO_ALGO_WEP1; ++ val = WEP_ENABLED; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_WEP40\n"); ++ break; ++ case WLAN_CIPHER_SUITE_WEP104: ++ key.algo = CRYPTO_ALGO_WEP128; ++ val = WEP_ENABLED; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_WEP104\n"); ++ break; ++ case WLAN_CIPHER_SUITE_TKIP: ++ key.algo = CRYPTO_ALGO_TKIP; ++ val = TKIP_ENABLED; ++ /* wpa_supplicant switches the third and fourth quarters of the TKIP key */ ++ if (mode == WL_MODE_BSS) { ++ bcopy(&key.data[24], keybuf, sizeof(keybuf)); ++ bcopy(&key.data[16], &key.data[24], sizeof(keybuf)); ++ bcopy(keybuf, &key.data[16], sizeof(keybuf)); ++ } ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_TKIP\n"); ++ break; ++ case WLAN_CIPHER_SUITE_AES_CMAC: ++ key.algo = CRYPTO_ALGO_AES_CCM; ++ val = AES_ENABLED; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_AES_CMAC\n"); ++ break; ++ case WLAN_CIPHER_SUITE_CCMP: ++ key.algo = CRYPTO_ALGO_AES_CCM; ++ val = AES_ENABLED; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_CCMP\n"); ++ break; ++#ifdef BCMWAPI_WPI ++ case WLAN_CIPHER_SUITE_SMS4: ++ key.algo = CRYPTO_ALGO_SMS4; ++ val = SMS4_ENABLED; ++ AP6210_DEBUG(" * wl_cfg80211_add_key, set key " ++ " to WLAN_CIPHER_SUITE_SMS4\n"); ++ break; ++#endif /* BCMWAPI_WPI */ ++ default: ++ AP6210_ERR("Invalid cipher (0x%x)\n", params->cipher); ++ return -EINVAL; ++ } ++ ++ /* Set the new key/index */ ++ swap_key_from_BE(&key); ++ err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), wl->ioctl_buf, ++ WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_SET_KEY error (%d)\n", err); ++ return err; ++ } ++ ++exit: ++ err = wldev_iovar_getint_bsscfg(dev, "wsec", &wsec, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("get wsec error (%d)\n", err); ++ return err; ++ } ++ ++ wsec |= val; ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", wsec, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("set wsec error (%d)\n", err); ++ return err; ++ } ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool pairwise, const u8 *mac_addr) ++{ ++ struct wl_wsec_key key; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ AP6210_DEBUG("Enter\n"); ++#ifndef IEEE80211W ++ if ((key_idx >= DOT11_MAX_DEFAULT_KEYS) && (key_idx < DOT11_MAX_DEFAULT_KEYS+2)) ++ return -EINVAL; ++#endif ++ CHECK_SYS_UP(wl); ++ memset(&key, 0, sizeof(key)); ++ ++ key.flags = WL_PRIMARY_KEY; ++ key.algo = CRYPTO_ALGO_OFF; ++ key.index = (u32) key_idx; ++ ++ AP6210_DEBUG("key index (%d)\n", key_idx); ++ /* Set the new key/index */ ++ swap_key_from_BE(&key); ++ err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), wl->ioctl_buf, ++ WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (unlikely(err)) { ++ if (err == -EINVAL) { ++ if (key.index >= DOT11_MAX_DEFAULT_KEYS) { ++ /* we ignore this key index in this case */ ++ AP6210_DEBUG("invalid key index (%d)\n", key_idx); ++ } ++ } else { ++ AP6210_ERR("WLC_SET_KEY error (%d)\n", err); ++ } ++ return err; ++ } ++ return err; ++} ++ ++static s32 ++wl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *dev, ++ u8 key_idx, bool pairwise, const u8 *mac_addr, void *cookie, ++ void (*callback) (void *cookie, struct key_params * params)) ++{ ++ struct key_params params; ++ struct wl_wsec_key key; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct wl_security *sec; ++ s32 wsec; ++ s32 err = 0; ++ s32 bssidx = wl_cfgp2p_find_idx(wl, dev); ++ ++ AP6210_DEBUG("key index (%d)\n", key_idx); ++ CHECK_SYS_UP(wl); ++ memset(&key, 0, sizeof(key)); ++ key.index = key_idx; ++ swap_key_to_BE(&key); ++ memset(¶ms, 0, sizeof(params)); ++ params.key_len = (u8) min_t(u8, DOT11_MAX_KEY_SIZE, key.len); ++ memcpy(params.key, key.data, params.key_len); ++ ++ wldev_iovar_getint_bsscfg(dev, "wsec", &wsec, bssidx); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_GET_WSEC error (%d)\n", err); ++ return err; ++ } ++ switch (wsec & ~SES_OW_ENABLED) { ++ case WEP_ENABLED: ++ sec = wl_read_prof(wl, dev, WL_PROF_SEC); ++ if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) { ++ params.cipher = WLAN_CIPHER_SUITE_WEP40; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_WEP40\n"); ++ } else if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP104) { ++ params.cipher = WLAN_CIPHER_SUITE_WEP104; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_WEP104\n"); ++ } ++ break; ++ case TKIP_ENABLED: ++ params.cipher = WLAN_CIPHER_SUITE_TKIP; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_TKIP\n"); ++ break; ++ case AES_ENABLED: ++ params.cipher = WLAN_CIPHER_SUITE_AES_CMAC; ++ AP6210_DEBUG("WLAN_CIPHER_SUITE_AES_CMAC\n"); ++ break; ++#ifdef BCMWAPI_WPI ++ case WLAN_CIPHER_SUITE_SMS4: ++ key.algo = CRYPTO_ALGO_SMS4; ++ AP6210_DEBUG(" * wl_cfg80211_add_key, set key" ++ "to WLAN_CIPHER_SUITE_SMS4\n"); ++ break; ++#endif ++ default: ++ AP6210_ERR("Invalid algo (0x%x)\n", wsec); ++ return -EINVAL; ++ } ++ ++ callback(cookie, ¶ms); ++ return err; ++} ++ ++static s32 ++wl_cfg80211_config_default_mgmt_key(struct wiphy *wiphy, ++ struct net_device *dev, u8 key_idx) ++{ ++ AP6210_DEBUG("Not supported\n"); ++ return -EOPNOTSUPP; ++} ++ ++static s32 ++wl_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, ++ u8 *mac, struct station_info *sinfo) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ scb_val_t scb_val; ++ s32 rssi; ++ s32 rate; ++ s32 err = 0; ++ sta_info_t *sta; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) ++ s8 eabuf[ETHER_ADDR_STR_LEN]; ++#endif ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++ CHECK_SYS_UP(wl); ++ if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_AP) { ++ err = wldev_iovar_getbuf(dev, "sta_info", (struct ether_addr *)mac, ++ ETHER_ADDR_LEN, wl->ioctl_buf, WLC_IOCTL_SMLEN, &wl->ioctl_buf_sync); ++ if (err < 0) { ++ AP6210_ERR("GET STA INFO failed, %d\n", err); ++ return err; ++ } ++ sinfo->filled = STATION_INFO_INACTIVE_TIME; ++ sta = (sta_info_t *)wl->ioctl_buf; ++ sta->len = dtoh16(sta->len); ++ sta->cap = dtoh16(sta->cap); ++ sta->flags = dtoh32(sta->flags); ++ sta->idle = dtoh32(sta->idle); ++ sta->in = dtoh32(sta->in); ++ sinfo->inactive_time = sta->idle * 1000; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) ++ if (sta->flags & WL_STA_ASSOC) { ++ sinfo->filled |= STATION_INFO_CONNECTED_TIME; ++ sinfo->connected_time = sta->in; ++ } ++ AP6210_DEBUG("STA %s : idle time : %d sec, connected time :%d ms\n", ++ bcm_ether_ntoa((const struct ether_addr *)mac, eabuf), sinfo->inactive_time, ++ sta->idle * 1000); ++#endif ++ } else if (wl_get_mode_by_netdev(wl, dev) == WL_MODE_BSS) { ++ get_pktcnt_t pktcnt; ++ u8 *curmacp = wl_read_prof(wl, dev, WL_PROF_BSSID); ++ if (!wl_get_drv_status(wl, CONNECTED, dev) || ++ (dhd_is_associated(dhd, NULL, &err) == FALSE)) { ++ AP6210_ERR("NOT assoc\n"); ++ if (err == -ERESTARTSYS) ++ return err; ++ err = -ENODEV; ++ return err; ++ } ++ if (memcmp(mac, curmacp, ETHER_ADDR_LEN)) { ++ AP6210_ERR("Wrong Mac address: "MACDBG" != "MACDBG"\n", ++ MAC2STRDBG(mac), MAC2STRDBG(curmacp)); ++ } ++ ++ /* Report the current tx rate */ ++ err = wldev_ioctl(dev, WLC_GET_RATE, &rate, sizeof(rate), false); ++ if (err) { ++ AP6210_ERR("Could not get rate (%d)\n", err); ++ } else { ++ rate = dtoh32(rate); ++ sinfo->filled |= STATION_INFO_TX_BITRATE; ++ sinfo->txrate.legacy = rate * 5; ++ AP6210_DEBUG("Rate %d Mbps\n", (rate / 2)); ++ } ++ ++ memset(&scb_val, 0, sizeof(scb_val)); ++ scb_val.val = 0; ++ err = wldev_ioctl(dev, WLC_GET_RSSI, &scb_val, ++ sizeof(scb_val_t), false); ++ if (err) { ++ AP6210_ERR("Could not get rssi (%d)\n", err); ++ goto get_station_err; ++ } ++ rssi = dtoh32(scb_val.val); ++#if defined(RSSIOFFSET) ++ rssi = wl_update_rssi_offset(rssi); ++#endif ++ sinfo->filled |= STATION_INFO_SIGNAL; ++ sinfo->signal = rssi; ++ AP6210_DEBUG("RSSI %d dBm\n", rssi); ++ err = wldev_ioctl(dev, WLC_GET_PKTCNTS, &pktcnt, ++ sizeof(pktcnt), false); ++ if (!err) { ++ sinfo->filled |= (STATION_INFO_RX_PACKETS | ++ STATION_INFO_RX_DROP_MISC | ++ STATION_INFO_TX_PACKETS | ++ STATION_INFO_TX_FAILED); ++ sinfo->rx_packets = pktcnt.rx_good_pkt; ++ sinfo->rx_dropped_misc = pktcnt.rx_bad_pkt; ++ sinfo->tx_packets = pktcnt.tx_good_pkt; ++ sinfo->tx_failed = pktcnt.tx_bad_pkt; ++ } ++get_station_err: ++ if (err && (err != -ERESTARTSYS)) { ++ /* Disconnect due to zero BSSID or error to get RSSI */ ++ AP6210_ERR("force cfg80211_disconnected\n"); ++ wl_clr_drv_status(wl, CONNECTED, dev); ++ cfg80211_disconnected(dev, 0, NULL, 0, GFP_KERNEL); ++ wl_link_down(wl); ++ } ++ } ++ ++ return err; ++} ++ ++/* Function to update sta power save mode for Kernel wifi stack */ ++int wl_cfg80211_update_power_mode(struct net_device *dev) ++{ ++ int pm = -1; ++ int err; ++ ++ err = wldev_ioctl(dev, WLC_GET_PM, &pm, sizeof(pm), false); ++ if (err || (pm == -1)) { ++ AP6210_ERR("error (%d)\n", err); ++ } else { ++ pm = (pm == PM_OFF) ? false : true; ++ AP6210_DEBUG("%s: %d\n", __func__, pm); ++ if (dev->ieee80211_ptr) ++ dev->ieee80211_ptr->ps = pm; ++ } ++ return err; ++} ++ ++static s32 ++wl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, ++ bool enabled, s32 timeout) ++{ ++ s32 pm; ++ s32 err = 0; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_info *_net_info = wl_get_netinfo_by_netdev(wl, dev); ++#if !defined(SUPPORT_PM2_ONLY) ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++#endif /* (OEM_ANDROID) */ ++ CHECK_SYS_UP(wl); ++ ++ if (wl->p2p_net == dev || _net_info == NULL) { ++ return err; ++ } ++ AP6210_DEBUG("%s: Enter power save enabled %d\n", dev->name, enabled); ++ ++#if !defined(SUPPORT_PM2_ONLY) ++ /* android has special hooks to change pm when kernel suspended */ ++ pm = enabled ? ((dhd->in_suspend) ? PM_MAX : PM_FAST) : PM_OFF; ++#else ++ pm = enabled ? PM_FAST : PM_OFF; ++#endif /* SUPPORT_PM2_ONLY */ ++ ++ if (_net_info->pm_block || wl->vsdb_mode) { ++ /* Do not enable the power save if it is p2p interface or vsdb mode is set */ ++ AP6210_DEBUG("%s:Do not enable the power save for pm_block %d or vsdb_mode %d\n", ++ dev->name, _net_info->pm_block, wl->vsdb_mode); ++ pm = PM_OFF; ++ } ++ pm = htod32(pm); ++ AP6210_DEBUG("%s:power save %s\n", dev->name, (pm ? "enabled" : "disabled")); ++ err = wldev_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm), true); ++ if (unlikely(err)) { ++ if (err == -ENODEV) ++ AP6210_DEBUG("net_device is not ready yet\n"); ++ else ++ AP6210_ERR("error (%d)\n", err); ++ return err; ++ } ++ return err; ++} ++ ++static __used u32 wl_find_msb(u16 bit16) ++{ ++ u32 ret = 0; ++ ++ if (bit16 & 0xff00) { ++ ret += 8; ++ bit16 >>= 8; ++ } ++ ++ if (bit16 & 0xf0) { ++ ret += 4; ++ bit16 >>= 4; ++ } ++ ++ if (bit16 & 0xc) { ++ ret += 2; ++ bit16 >>= 2; ++ } ++ ++ if (bit16 & 2) ++ ret += bit16 & 2; ++ else if (bit16) ++ ret += bit16; ++ ++ return ret; ++} ++ ++static s32 wl_cfg80211_resume(struct wiphy *wiphy) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ s32 err = 0; ++ ++ if (unlikely(!wl_get_drv_status(wl, READY, ndev))) { ++ AP6210_DEBUG("device is not ready\n"); ++ return 0; ++ } ++ ++ wl_invoke_iscan(wl); ++ ++ return err; ++} ++ ++static s32 ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) ++wl_cfg80211_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow) ++#else ++wl_cfg80211_suspend(struct wiphy *wiphy) ++#endif ++{ ++#ifdef DHD_CLEAR_ON_SUSPEND ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_info *iter, *next; ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ unsigned long flags; ++ if (unlikely(!wl_get_drv_status(wl, READY, ndev))) { ++ AP6210_DEBUG("device is not ready : status (%d)\n", ++ (int)wl->status); ++ return 0; ++ } ++ for_each_ndev(wl, iter, next) ++ wl_set_drv_status(wl, SCAN_ABORTING, iter->ndev); ++ wl_term_iscan(wl); ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ if (wl->scan_request) { ++ cfg80211_scan_done(wl->scan_request, true); ++ wl->scan_request = NULL; ++ } ++ for_each_ndev(wl, iter, next) { ++ wl_clr_drv_status(wl, SCANNING, iter->ndev); ++ wl_clr_drv_status(wl, SCAN_ABORTING, iter->ndev); ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ for_each_ndev(wl, iter, next) { ++ if (wl_get_drv_status(wl, CONNECTING, iter->ndev)) { ++ wl_bss_connect_done(wl, iter->ndev, NULL, NULL, false); ++ } ++ } ++#endif /* DHD_CLEAR_ON_SUSPEND */ ++ return 0; ++} ++ ++static s32 ++wl_update_pmklist(struct net_device *dev, struct wl_pmk_list *pmk_list, ++ s32 err) ++{ ++ int i, j; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct net_device *primary_dev = wl_to_prmry_ndev(wl); ++ ++ if (!pmk_list) { ++ AP6210_DEBUG("pmk_list is NULL\n"); ++ return -EINVAL; ++ } ++ /* pmk list is supported only for STA interface i.e. primary interface ++ * Refer code wlc_bsscfg.c->wlc_bsscfg_sta_init ++ */ ++ if (primary_dev != dev) { ++ AP6210_DEBUG("Not supporting Flushing pmklist on virtual" ++ " interfaces than primary interface\n"); ++ return err; ++ } ++ ++ AP6210_DEBUG("No of elements %d\n", pmk_list->pmkids.npmkid); ++ for (i = 0; i < pmk_list->pmkids.npmkid; i++) { ++ AP6210_DEBUG("PMKID[%d]: %pM =\n", i, ++ &pmk_list->pmkids.pmkid[i].BSSID); ++ for (j = 0; j < WPA2_PMKID_LEN; j++) { ++ AP6210_DEBUG("%02x\n", pmk_list->pmkids.pmkid[i].PMKID[j]); ++ } ++ } ++ if (likely(!err)) { ++ err = wldev_iovar_setbuf(dev, "pmkid_info", (char *)pmk_list, ++ sizeof(*pmk_list), wl->ioctl_buf, WLC_IOCTL_MAXLEN, NULL); ++ } ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_pmksa *pmksa) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 err = 0; ++ int i; ++ ++ CHECK_SYS_UP(wl); ++ for (i = 0; i < wl->pmk_list->pmkids.npmkid; i++) ++ if (!memcmp(pmksa->bssid, &wl->pmk_list->pmkids.pmkid[i].BSSID, ++ ETHER_ADDR_LEN)) ++ break; ++ if (i < WL_NUM_PMKIDS_MAX) { ++ memcpy(&wl->pmk_list->pmkids.pmkid[i].BSSID, pmksa->bssid, ++ ETHER_ADDR_LEN); ++ memcpy(&wl->pmk_list->pmkids.pmkid[i].PMKID, pmksa->pmkid, ++ WPA2_PMKID_LEN); ++ if (i == wl->pmk_list->pmkids.npmkid) ++ wl->pmk_list->pmkids.npmkid++; ++ } else { ++ err = -EINVAL; ++ } ++ AP6210_DEBUG("set_pmksa,IW_PMKSA_ADD - PMKID: %pM =\n", ++ &wl->pmk_list->pmkids.pmkid[wl->pmk_list->pmkids.npmkid - 1].BSSID); ++ for (i = 0; i < WPA2_PMKID_LEN; i++) { ++ AP6210_DEBUG("%02x\n", ++ wl->pmk_list->pmkids.pmkid[wl->pmk_list->pmkids.npmkid - 1]. ++ PMKID[i]); ++ } ++ ++ err = wl_update_pmklist(dev, wl->pmk_list, err); ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *dev, ++ struct cfg80211_pmksa *pmksa) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct _pmkid_list pmkid; ++ s32 err = 0; ++ int i; ++ ++ CHECK_SYS_UP(wl); ++ memcpy(&pmkid.pmkid[0].BSSID, pmksa->bssid, ETHER_ADDR_LEN); ++ memcpy(pmkid.pmkid[0].PMKID, pmksa->pmkid, WPA2_PMKID_LEN); ++ ++ AP6210_DEBUG("del_pmksa,IW_PMKSA_REMOVE - PMKID: %pM =\n", ++ &pmkid.pmkid[0].BSSID); ++ for (i = 0; i < WPA2_PMKID_LEN; i++) { ++ AP6210_DEBUG("%02x\n", pmkid.pmkid[0].PMKID[i]); ++ } ++ ++ for (i = 0; i < wl->pmk_list->pmkids.npmkid; i++) ++ if (!memcmp ++ (pmksa->bssid, &wl->pmk_list->pmkids.pmkid[i].BSSID, ++ ETHER_ADDR_LEN)) ++ break; ++ ++ if ((wl->pmk_list->pmkids.npmkid > 0) && ++ (i < wl->pmk_list->pmkids.npmkid)) { ++ memset(&wl->pmk_list->pmkids.pmkid[i], 0, sizeof(pmkid_t)); ++ for (; i < (wl->pmk_list->pmkids.npmkid - 1); i++) { ++ memcpy(&wl->pmk_list->pmkids.pmkid[i].BSSID, ++ &wl->pmk_list->pmkids.pmkid[i + 1].BSSID, ++ ETHER_ADDR_LEN); ++ memcpy(&wl->pmk_list->pmkids.pmkid[i].PMKID, ++ &wl->pmk_list->pmkids.pmkid[i + 1].PMKID, ++ WPA2_PMKID_LEN); ++ } ++ wl->pmk_list->pmkids.npmkid--; ++ } else { ++ err = -EINVAL; ++ } ++ ++ err = wl_update_pmklist(dev, wl->pmk_list, err); ++ ++ return err; ++ ++} ++ ++static s32 ++wl_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *dev) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 err = 0; ++ CHECK_SYS_UP(wl); ++ memset(wl->pmk_list, 0, sizeof(*wl->pmk_list)); ++ err = wl_update_pmklist(dev, wl->pmk_list, err); ++ return err; ++ ++} ++ ++static wl_scan_params_t * ++wl_cfg80211_scan_alloc_params(int channel, int nprobes, int *out_params_size) ++{ ++ wl_scan_params_t *params; ++ int params_size; ++ int num_chans; ++ ++ *out_params_size = 0; ++ ++ /* Our scan params only need space for 1 channel and 0 ssids */ ++ params_size = WL_SCAN_PARAMS_FIXED_SIZE + 1 * sizeof(uint16); ++ params = (wl_scan_params_t*) kzalloc(params_size, GFP_KERNEL); ++ if (params == NULL) { ++ AP6210_ERR("%s: mem alloc failed (%d bytes)\n", __func__, params_size); ++ return params; ++ } ++ memset(params, 0, params_size); ++ params->nprobes = nprobes; ++ ++ num_chans = (channel == 0) ? 0 : 1; ++ ++ memcpy(¶ms->bssid, ðer_bcast, ETHER_ADDR_LEN); ++ params->bss_type = DOT11_BSSTYPE_ANY; ++ params->scan_type = DOT11_SCANTYPE_ACTIVE; ++ params->nprobes = htod32(1); ++ params->active_time = htod32(-1); ++ params->passive_time = htod32(-1); ++ params->home_time = htod32(10); ++ if (channel == -1) ++ params->channel_list[0] = htodchanspec(channel); ++ else ++ params->channel_list[0] = wl_ch_host_to_driver(channel); ++ ++ /* Our scan params have 1 channel and 0 ssids */ ++ params->channel_num = htod32((0 << WL_SCAN_PARAMS_NSSID_SHIFT) | ++ (num_chans & WL_SCAN_PARAMS_COUNT_MASK)); ++ ++ *out_params_size = params_size; /* rtn size to the caller */ ++ return params; ++} ++ ++static s32 ++wl_cfg80211_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, ++ struct ieee80211_channel * channel, ++ enum nl80211_channel_type channel_type, ++ unsigned int duration, u64 *cookie) ++{ ++ s32 target_channel; ++ u32 id; ++ struct ether_addr primary_mac; ++ struct net_device *ndev = NULL; ++ ++ s32 err = BCME_OK; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ ++ AP6210_DEBUG("Enter, ifindex: %d, channel: %d, duration ms (%d) SCANNING ?? %s \n", ++ dev->ifindex, ieee80211_frequency_to_channel(channel->center_freq), ++ duration, (wl_get_drv_status(wl, SCANNING, ndev)) ? "YES":"NO"); ++ ++ if (wl->p2p_net == dev) { ++ ndev = wl_to_prmry_ndev(wl); ++ } else { ++ ndev = dev; ++ } ++ ++ if (!wl->p2p) { ++ AP6210_ERR("wl->p2p is not initialized\n"); ++ err = BCME_ERROR; ++ goto exit; ++ } ++ ++#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ if (wl_get_drv_status(wl, SCANNING, ndev)) { ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } ++#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ ++ target_channel = ieee80211_frequency_to_channel(channel->center_freq); ++ memcpy(&wl->remain_on_chan, channel, sizeof(struct ieee80211_channel)); ++ wl->remain_on_chan_type = channel_type; ++ id = ++wl->last_roc_id; ++ if (id == 0) ++ id = ++wl->last_roc_id; ++ *cookie = id; ++ ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ if (wl_get_drv_status(wl, SCANNING, ndev)) { ++ struct timer_list *_timer; ++ AP6210_DEBUG("scan is running. go to fake listen state\n"); ++ ++ wl_set_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); ++ ++ if (timer_pending(&wl->p2p->listen_timer)) { ++ AP6210_DEBUG("cancel current listen timer \n"); ++ del_timer_sync(&wl->p2p->listen_timer); ++ } ++ ++ _timer = &wl->p2p->listen_timer; ++ wl_clr_p2p_status(wl, LISTEN_EXPIRED); ++ ++ INIT_TIMER(_timer, wl_cfgp2p_listen_expired, duration, 0); ++ ++ err = BCME_OK; ++ goto exit; ++ } ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ ++#ifdef WL_CFG80211_SYNC_GON ++ if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { ++ /* do not enter listen mode again if we are in listen mode already for next af. ++ * remain on channel completion will be returned by waiting next af completion. ++ */ ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ wl_set_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); ++#else ++ wl_set_drv_status(wl, REMAINING_ON_CHANNEL, ndev); ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ goto exit; ++ } ++#endif /* WL_CFG80211_SYNC_GON */ ++ if (wl->p2p && !wl->p2p->on) { ++ /* In case of p2p_listen command, supplicant send remain_on_channel ++ * without turning on P2P ++ */ ++ get_primary_mac(wl, &primary_mac); ++ wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, &wl->p2p->int_addr); ++ p2p_on(wl) = true; ++ } ++ ++ if (p2p_is_on(wl)) { ++ err = wl_cfgp2p_enable_discovery(wl, ndev, NULL, 0); ++ if (unlikely(err)) { ++ goto exit; ++ } ++#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ wl_set_drv_status(wl, REMAINING_ON_CHANNEL, ndev); ++#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ err = wl_cfgp2p_discover_listen(wl, target_channel, duration); ++ ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ if (err == BCME_OK) { ++ wl_set_drv_status(wl, REMAINING_ON_CHANNEL, ndev); ++ } else { ++ /* if failed, firmware may be internal scanning state. ++ * so other scan request shall not abort it ++ */ ++ wl_set_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, ndev); ++ } ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ /* WAR: set err = ok to prevent cookie mismatch in wpa_supplicant ++ * and expire timer will send a completion to the upper layer ++ */ ++ err = BCME_OK; ++ } ++ ++exit: ++ if (err == BCME_OK) { ++ AP6210_DEBUG("Success\n"); ++ cfg80211_ready_on_channel(dev, *cookie, channel, ++ channel_type, duration, GFP_KERNEL); ++ } else { ++ AP6210_ERR("Fail to Set (err=%d cookie:%llu)\n", err, *cookie); ++ } ++ return err; ++} ++ ++static s32 ++wl_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy, struct net_device *dev, ++ u64 cookie) ++{ ++ s32 err = 0; ++ AP6210_DEBUG(" enter ) netdev_ifidx: %d \n", dev->ifindex); ++ return err; ++} ++ ++static void ++wl_cfg80211_afx_handler(struct work_struct *work) ++{ ++ struct afx_hdl *afx_instance; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ s32 ret = BCME_OK; ++ ++ afx_instance = container_of(work, struct afx_hdl, work); ++ if (afx_instance != NULL && wl->afx_hdl->is_active) { ++ if (wl->afx_hdl->is_listen && wl->afx_hdl->my_listen_chan) { ++ ret = wl_cfgp2p_discover_listen(wl, wl->afx_hdl->my_listen_chan, ++ (100 * (1 + (random32() % 3)))); /* 100ms ~ 300ms */ ++ } else { ++ ret = wl_cfgp2p_act_frm_search(wl, wl->afx_hdl->dev, ++ wl->afx_hdl->bssidx, wl->afx_hdl->peer_listen_chan); ++ } ++ if (unlikely(ret != BCME_OK)) { ++ AP6210_ERR("ERROR occurred! returned value is (%d)\n", ret); ++ if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) ++ complete(&wl->act_frm_scan); ++ } ++ } ++} ++ ++static s32 ++wl_cfg80211_af_searching_channel(struct wl_priv *wl, struct net_device *dev) ++{ ++ u32 max_retry = WL_CHANNEL_SYNC_RETRY; ++ ++ if (dev == NULL) ++ return -1; ++ ++ AP6210_DEBUG(" enter ) \n"); ++ ++ wl_set_drv_status(wl, FINDING_COMMON_CHANNEL, dev); ++ wl->afx_hdl->is_active = TRUE; ++ ++ /* Loop to wait until we find a peer's channel or the ++ * pending action frame tx is cancelled. ++ */ ++ while ((wl->afx_hdl->retry < max_retry) && ++ (wl->afx_hdl->peer_chan == WL_INVALID)) { ++ wl->afx_hdl->is_listen = FALSE; ++ wl_set_drv_status(wl, SCANNING, dev); ++ AP6210_DEBUG("Scheduling the action frame for sending.. retry %d\n", ++ wl->afx_hdl->retry); ++ /* search peer on peer's listen channel */ ++ schedule_work(&wl->afx_hdl->work); ++ wait_for_completion_timeout(&wl->act_frm_scan, ++ msecs_to_jiffies(MAX_WAIT_TIME)); ++ ++ if ((wl->afx_hdl->peer_chan != WL_INVALID) || ++ !(wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev))) ++ break; ++ ++ if (wl->afx_hdl->my_listen_chan) { ++ AP6210_DEBUG("Scheduling Listen peer in my listen channel = %d\n", ++ wl->afx_hdl->my_listen_chan); ++ /* listen on my listen channel */ ++ wl->afx_hdl->is_listen = TRUE; ++ schedule_work(&wl->afx_hdl->work); ++ wait_for_completion_timeout(&wl->act_frm_scan, ++ msecs_to_jiffies(MAX_WAIT_TIME)); ++ } ++ if (!wl_get_drv_status(wl, FINDING_COMMON_CHANNEL, dev)) ++ break; ++ wl->afx_hdl->retry++; ++ ++ WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl); ++ } ++ ++ wl->afx_hdl->is_active = FALSE; ++ ++ wl_clr_drv_status(wl, SCANNING, dev); ++ wl_clr_drv_status(wl, FINDING_COMMON_CHANNEL, dev); ++ ++ return (wl->afx_hdl->peer_chan); ++} ++ ++struct p2p_config_af_params { ++ s32 max_tx_retry; /* max tx retry count if tx no ack */ ++ /* To make sure to send successfully action frame, we have to turn off mpc ++ * 0: off, 1: on, (-1): do nothing ++ */ ++ s32 mpc_onoff; ++#ifdef WL_CFG80211_SYNC_GON ++ bool extra_listen; ++#endif ++ bool search_channel; /* 1: search peer's channel to send af */ ++}; ++ ++static s32 ++wl_cfg80211_config_p2p_pub_af_tx(struct wiphy *wiphy, ++ wl_action_frame_t *action_frame, wl_af_params_t *af_params, ++ struct p2p_config_af_params *config_af_params) ++{ ++ s32 err = BCME_OK; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ wifi_p2p_pub_act_frame_t *act_frm = ++ (wifi_p2p_pub_act_frame_t *) (action_frame->data); ++ ++ /* initialize default value */ ++#ifdef WL_CFG80211_SYNC_GON ++ config_af_params->extra_listen = true; ++#endif ++ config_af_params->search_channel = false; ++ config_af_params->max_tx_retry = WL_AF_TX_MAX_RETRY; ++ config_af_params->mpc_onoff = -1; ++ ++ switch (act_frm->subtype) { ++ case P2P_PAF_GON_REQ: { ++ AP6210_DEBUG("P2P: GO_NEG_PHASE status set \n"); ++ wl_set_p2p_status(wl, GO_NEG_PHASE); ++ ++ config_af_params->mpc_onoff = 0; ++ config_af_params->search_channel = true; ++ wl->next_af_subtype = act_frm->subtype + 1; ++ ++ /* increase dwell time to wait for RESP frame */ ++ af_params->dwell_time = WL_MED_DWELL_TIME; ++ ++ break; ++ } ++ case P2P_PAF_GON_RSP: { ++ wl->next_af_subtype = act_frm->subtype + 1; ++ /* increase dwell time to wait for CONF frame */ ++ af_params->dwell_time = WL_MED_DWELL_TIME; ++ break; ++ } ++ case P2P_PAF_GON_CONF: { ++ /* If we reached till GO Neg confirmation reset the filter */ ++ AP6210_DEBUG("P2P: GO_NEG_PHASE status cleared \n"); ++ wl_clr_p2p_status(wl, GO_NEG_PHASE); ++ ++ /* turn on mpc again if go nego is done */ ++ config_af_params->mpc_onoff = 1; ++ ++ /* minimize dwell time */ ++ af_params->dwell_time = WL_MIN_DWELL_TIME; ++ ++#ifdef WL_CFG80211_SYNC_GON ++ config_af_params->extra_listen = false; ++#endif /* WL_CFG80211_SYNC_GON */ ++ break; ++ } ++ case P2P_PAF_INVITE_REQ: { ++ config_af_params->search_channel = true; ++ wl->next_af_subtype = act_frm->subtype + 1; ++ ++ /* increase dwell time */ ++ af_params->dwell_time = WL_MED_DWELL_TIME; ++ break; ++ } ++ case P2P_PAF_INVITE_RSP: ++ /* minimize dwell time */ ++ af_params->dwell_time = WL_MIN_DWELL_TIME; ++#ifdef WL_CFG80211_SYNC_GON ++ config_af_params->extra_listen = false; ++#endif /* WL_CFG80211_SYNC_GON */ ++ break; ++ case P2P_PAF_DEVDIS_REQ: { ++ config_af_params->search_channel = true; ++ ++ wl->next_af_subtype = act_frm->subtype + 1; ++ /* maximize dwell time to wait for RESP frame */ ++ af_params->dwell_time = WL_LONG_DWELL_TIME; ++ break; ++ } ++ case P2P_PAF_DEVDIS_RSP: ++ /* minimize dwell time */ ++ af_params->dwell_time = WL_MIN_DWELL_TIME; ++#ifdef WL_CFG80211_SYNC_GON ++ config_af_params->extra_listen = false; ++#endif /* WL_CFG80211_SYNC_GON */ ++ break; ++ case P2P_PAF_PROVDIS_REQ: { ++ if (IS_PROV_DISC_WITHOUT_GROUP_ID(&act_frm->elts[0], ++ action_frame->len)) { ++ config_af_params->search_channel = true; ++ } ++ ++ config_af_params->mpc_onoff = 0; ++ wl->next_af_subtype = act_frm->subtype + 1; ++ /* increase dwell time to wait for RESP frame */ ++ af_params->dwell_time = WL_MED_DWELL_TIME; ++ break; ++ } ++ case P2P_PAF_PROVDIS_RSP: { ++ wl->next_af_subtype = P2P_PAF_GON_REQ; ++ /* increase dwell time to MED level */ ++ af_params->dwell_time = WL_MED_DWELL_TIME; ++#ifdef WL_CFG80211_SYNC_GON ++ config_af_params->extra_listen = false; ++#endif /* WL_CFG80211_SYNC_GON */ ++ break; ++ } ++ default: ++ AP6210_DEBUG("Unknown p2p pub act frame subtype: %d\n", ++ act_frm->subtype); ++ err = BCME_BADARG; ++ } ++ return err; ++} ++ ++ ++static bool ++wl_cfg80211_send_action_frame(struct wiphy *wiphy, struct net_device *dev, ++ struct net_device *ndev, wl_af_params_t *af_params, ++ wl_action_frame_t *action_frame, u16 action_frame_len, s32 bssidx) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ bool ack = false; ++ u8 category, action; ++ s32 tx_retry; ++ struct p2p_config_af_params config_af_params; ++#ifdef VSDB ++ ulong off_chan_started_jiffies = 0; ++#endif ++ dhd_pub_t *dhd = (dhd_pub_t *)(wl->pub); ++ ++ wl_cfgp2p_print_actframe(true, action_frame->data, action_frame->len); ++ ++ category = action_frame->data[DOT11_ACTION_CAT_OFF]; ++ action = action_frame->data[DOT11_ACTION_ACT_OFF]; ++ ++ /* initialize variables */ ++ tx_retry = 0; ++ wl->next_af_subtype = P2P_PAF_SUBTYPE_INVALID; ++ config_af_params.max_tx_retry = WL_AF_TX_MAX_RETRY; ++ config_af_params.mpc_onoff = -1; ++ config_af_params.search_channel = false; ++#ifdef WL_CFG80211_SYNC_GON ++ config_af_params.extra_listen = false; ++#endif ++ ++ /* config parameters */ ++ /* Public Action Frame Process - DOT11_ACTION_CAT_PUBLIC */ ++ if (category == DOT11_ACTION_CAT_PUBLIC) { ++ if ((action == P2P_PUB_AF_ACTION) && ++ (action_frame_len >= sizeof(wifi_p2p_pub_act_frame_t))) { ++ /* p2p public action frame process */ ++ if (BCME_OK != wl_cfg80211_config_p2p_pub_af_tx(wiphy, ++ action_frame, af_params, &config_af_params)) { ++ AP6210_DEBUG("Unknown subtype.\n"); ++ } ++ ++ } else if (action_frame_len >= sizeof(wifi_p2psd_gas_pub_act_frame_t)) { ++ /* service discovery process */ ++ if (action == P2PSD_ACTION_ID_GAS_IREQ || ++ action == P2PSD_ACTION_ID_GAS_CREQ) { ++ /* configure service discovery query frame */ ++ ++ config_af_params.search_channel = true; ++ ++ /* save next af suptype to cancel remained dwell time */ ++ wl->next_af_subtype = action + 1; ++ ++ af_params->dwell_time = WL_MED_DWELL_TIME; ++ } else if (action == P2PSD_ACTION_ID_GAS_IRESP || ++ action == P2PSD_ACTION_ID_GAS_CRESP) { ++ /* configure service discovery response frame */ ++ af_params->dwell_time = WL_MIN_DWELL_TIME; ++ } else { ++ AP6210_DEBUG("Unknown action type: %d\n", action); ++ } ++ } else { ++ AP6210_DEBUG("Unknown Frame: category 0x%x, action 0x%x, length %d\n", ++ category, action, action_frame_len); ++ } ++ } else if (category == P2P_AF_CATEGORY) { ++ /* do not configure anything. it will be sent with a default configuration */ ++ } else { ++ AP6210_DEBUG("Unknown Frame: category 0x%x, action 0x%x\n", ++ category, action); ++ if (dhd->op_mode & DHD_FLAG_HOSTAP_MODE) { ++ wl_clr_drv_status(wl, SENDING_ACT_FRM, dev); ++ return false; ++ } ++ } ++ ++ /* To make sure to send successfully action frame, we have to turn off mpc */ ++ if (config_af_params.mpc_onoff == 0) { ++ wldev_iovar_setint(dev, "mpc", 0); ++ } ++ ++ /* validate channel and p2p ies */ ++ if (config_af_params.search_channel && IS_P2P_SOCIAL(af_params->channel) && ++ wl_to_p2p_bss_saved_ie(wl, P2PAPI_BSSCFG_DEVICE).p2p_probe_req_ie_len) { ++ config_af_params.search_channel = true; ++ } else { ++ config_af_params.search_channel = false; ++ } ++ ++#ifdef WL11U ++ if (ndev == wl_to_prmry_ndev(wl)) ++ config_af_params.search_channel = false; ++#endif /* WL11U */ ++ ++#ifdef VSDB ++ /* if connecting on primary iface, sleep for a while before sending af tx for VSDB */ ++ if (wl_get_drv_status(wl, CONNECTING, wl_to_prmry_ndev(wl))) { ++ msleep(50); ++ } ++#endif ++ ++ /* if scan is ongoing, abort current scan. */ ++ if (wl_get_drv_status_all(wl, SCANNING)) { ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } ++ ++ /* set status and destination address before sending af */ ++ if (wl->next_af_subtype != P2P_PAF_SUBTYPE_INVALID) { ++ /* set this status to cancel the remained dwell time in rx process */ ++ wl_set_drv_status(wl, WAITING_NEXT_ACT_FRM, dev); ++ } ++ wl_set_drv_status(wl, SENDING_ACT_FRM, dev); ++ memcpy(wl->afx_hdl->tx_dst_addr.octet, ++ af_params->action_frame.da.octet, ++ sizeof(wl->afx_hdl->tx_dst_addr.octet)); ++ ++ /* save af_params for rx process */ ++ wl->afx_hdl->pending_tx_act_frm = af_params; ++ ++ /* search peer's channel */ ++ if (config_af_params.search_channel) { ++ /* initialize afx_hdl */ ++ wl->afx_hdl->bssidx = wl_cfgp2p_find_idx(wl, dev); ++ wl->afx_hdl->dev = dev; ++ wl->afx_hdl->retry = 0; ++ wl->afx_hdl->peer_chan = WL_INVALID; ++ ++ if (wl_cfg80211_af_searching_channel(wl, dev) == WL_INVALID) { ++ AP6210_ERR("couldn't find peer's channel.\n"); ++ goto exit; ++ } ++ ++ /* Suspend P2P discovery's search-listen to prevent it from ++ * starting a scan or changing the channel. ++ */ ++ wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); ++/* Do not abort scan for VSDB. Scan will be aborted in firmware if necessary */ ++#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ wl_notify_escan_complete(wl, dev, true, true); ++#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ wl_cfgp2p_discover_enable_search(wl, false); ++ ++ /* update channel */ ++ af_params->channel = wl->afx_hdl->peer_chan; ++ } ++ ++#ifdef VSDB ++ off_chan_started_jiffies = jiffies; ++#endif /* VSDB */ ++ ++ /* Now send a tx action frame */ ++ ack = wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx) ? false : true; ++ ++ /* if failed, retry it. tx_retry_max value is configure by .... */ ++ while ((ack == false) && (tx_retry++ < config_af_params.max_tx_retry)) { ++#ifdef VSDB ++ if (af_params->channel) { ++ if (jiffies_to_msecs(jiffies - off_chan_started_jiffies) > ++ OFF_CHAN_TIME_THRESHOLD_MS) { ++ WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(wl); ++ off_chan_started_jiffies = jiffies; ++ } ++ } ++#endif /* VSDB */ ++ ack = wl_cfgp2p_tx_action_frame(wl, dev, af_params, bssidx) ? ++ false : true; ++ } ++ if (ack == false) { ++ AP6210_ERR("Failed to send Action Frame(retry %d)\n", tx_retry); ++ } ++exit: ++ /* Clear SENDING_ACT_FRM after all sending af is done */ ++ wl_clr_drv_status(wl, SENDING_ACT_FRM, dev); ++ ++#ifdef WL_CFG80211_SYNC_GON ++ /* WAR: sometimes dongle does not keep the dwell time of 'actframe'. ++ * if we coundn't get the next action response frame and dongle does not keep ++ * the dwell time, go to listen state again to get next action response frame. ++ */ ++ if (ack && config_af_params.extra_listen && ++ wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM) && ++ wl->af_sent_channel == wl->afx_hdl->my_listen_chan) { ++ s32 extar_listen_time; ++ ++ extar_listen_time = af_params->dwell_time - ++ jiffies_to_msecs(jiffies - wl->af_tx_sent_jiffies); ++ ++ if (extar_listen_time > 50) { ++ wl_set_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, dev); ++ AP6210_DEBUG("Wait more time! actual af time:%d," ++ "calculated extar listen:%d\n", ++ af_params->dwell_time, extar_listen_time); ++ if (wl_cfgp2p_discover_listen(wl, wl->af_sent_channel, ++ extar_listen_time + 100) == BCME_OK) { ++ wait_for_completion_timeout(&wl->wait_next_af, ++ msecs_to_jiffies(extar_listen_time + 100 + 300)); ++ } ++ wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, dev); ++ } ++ } ++#endif /* WL_CFG80211_SYNC_GON */ ++ wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, dev); ++ ++ if (wl->afx_hdl->pending_tx_act_frm) ++ wl->afx_hdl->pending_tx_act_frm = NULL; ++ ++ AP6210_DEBUG("-- sending Action Frame is %s, listen chan: %d\n", ++ (ack) ? "Succeeded!!":"Failed!!", wl->afx_hdl->my_listen_chan); ++ ++ ++ /* if all done, turn mpc on again */ ++ if (config_af_params.mpc_onoff == 1) { ++ wldev_iovar_setint(dev, "mpc", 1); ++ } ++ ++ return ack; ++} ++ ++static s32 ++wl_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *ndev, ++ struct ieee80211_channel *channel, bool offchan, ++ enum nl80211_channel_type channel_type, ++ bool channel_type_valid, unsigned int wait, ++ const u8* buf, size_t len, ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) ++ bool no_cck, ++#endif ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) ++ bool dont_wait_for_ack, ++#endif ++ u64 *cookie) ++{ ++ wl_action_frame_t *action_frame; ++ wl_af_params_t *af_params; ++ scb_val_t scb_val; ++ const struct ieee80211_mgmt *mgmt; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct net_device *dev = NULL; ++ s32 err = BCME_OK; ++ s32 bssidx = 0; ++ u32 id; ++ bool ack = false; ++ s8 eabuf[ETHER_ADDR_STR_LEN]; ++ ++ AP6210_DEBUG("Enter \n"); ++ ++ if (ndev == wl->p2p_net) { ++ dev = wl_to_prmry_ndev(wl); ++ } else { ++ /* If TX req is for any valid ifidx. Use as is */ ++ dev = ndev; ++ } ++ ++ /* find bssidx based on ndev */ ++ bssidx = wl_cfgp2p_find_idx(wl, dev); ++ if (bssidx == -1) { ++ ++ AP6210_ERR("Can not find the bssidx for dev( %p )\n", dev); ++ return -ENODEV; ++ } ++ if (p2p_is_on(wl)) { ++ /* Suspend P2P discovery search-listen to prevent it from changing the ++ * channel. ++ */ ++ if ((err = wl_cfgp2p_discover_enable_search(wl, false)) < 0) { ++ AP6210_ERR("Can not disable discovery mode\n"); ++ return -EFAULT; ++ } ++ } ++ *cookie = 0; ++ id = wl->send_action_id++; ++ if (id == 0) ++ id = wl->send_action_id++; ++ *cookie = id; ++ mgmt = (const struct ieee80211_mgmt *)buf; ++ if (ieee80211_is_mgmt(mgmt->frame_control)) { ++ if (ieee80211_is_probe_resp(mgmt->frame_control)) { ++ s32 ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; ++ s32 ie_len = len - ie_offset; ++ if (dev == wl_to_prmry_ndev(wl)) ++ bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); ++ wl_cfgp2p_set_management_ie(wl, dev, bssidx, ++ VNDR_IE_PRBRSP_FLAG, (u8 *)(buf + ie_offset), ie_len); ++ cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); ++ goto exit; ++ } else if (ieee80211_is_disassoc(mgmt->frame_control) || ++ ieee80211_is_deauth(mgmt->frame_control)) { ++ memcpy(scb_val.ea.octet, mgmt->da, ETH_ALEN); ++ scb_val.val = mgmt->u.disassoc.reason_code; ++ err = wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, ++ sizeof(scb_val_t), true); ++ if (err < 0) ++ AP6210_ERR("WLC_SCB_DEAUTHENTICATE_FOR_REASON error %d\n", err); ++ AP6210_DEBUG("Disconnect STA : %s scb_val.val %d\n", ++ bcm_ether_ntoa((const struct ether_addr *)mgmt->da, eabuf), ++ scb_val.val); ++ wl_delay(400); ++ cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, true, GFP_KERNEL); ++ goto exit; ++ ++ } else if (ieee80211_is_action(mgmt->frame_control)) { ++ /* Abort the dwell time of any previous off-channel ++ * action frame that may be still in effect. Sending ++ * off-channel action frames relies on the driver's ++ * scan engine. If a previous off-channel action frame ++ * tx is still in progress (including the dwell time), ++ * then this new action frame will not be sent out. ++ */ ++/* Do not abort scan for VSDB. Scan will be aborted in firmware if necessary. ++ * And previous off-channel action frame must be ended before new af tx. ++ */ ++#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ wl_notify_escan_complete(wl, dev, true, true); ++#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ } ++ ++ } else { ++ AP6210_ERR("Driver only allows MGMT packet type\n"); ++ goto exit; ++ } ++ ++ af_params = (wl_af_params_t *) kzalloc(WL_WIFI_AF_PARAMS_SIZE, GFP_KERNEL); ++ ++ if (af_params == NULL) ++ { ++ AP6210_ERR("unable to allocate frame\n"); ++ return -ENOMEM; ++ } ++ ++ action_frame = &af_params->action_frame; ++ ++ /* Add the packet Id */ ++ action_frame->packetId = *cookie; ++ AP6210_DEBUG("action frame %d\n", action_frame->packetId); ++ /* Add BSSID */ ++ memcpy(&action_frame->da, &mgmt->da[0], ETHER_ADDR_LEN); ++ memcpy(&af_params->BSSID, &mgmt->bssid[0], ETHER_ADDR_LEN); ++ ++ /* Add the length exepted for 802.11 header */ ++ action_frame->len = len - DOT11_MGMT_HDR_LEN; ++ AP6210_DEBUG("action_frame->len: %d\n", action_frame->len); ++ ++ /* Add the channel */ ++ af_params->channel = ++ ieee80211_frequency_to_channel(channel->center_freq); ++ ++ /* Save listen_chan for searching common channel */ ++ wl->afx_hdl->peer_listen_chan = af_params->channel; ++ AP6210_DEBUG("channel from upper layer %d\n", wl->afx_hdl->peer_listen_chan); ++ ++ /* Add the default dwell time ++ * Dwell time to stay off-channel to wait for a response action frame ++ * after transmitting an GO Negotiation action frame ++ */ ++ af_params->dwell_time = WL_DWELL_TIME; ++ ++ memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], action_frame->len); ++ ++ ack = wl_cfg80211_send_action_frame(wiphy, dev, ndev, af_params, ++ action_frame, action_frame->len, bssidx); ++ ++ cfg80211_mgmt_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); ++ ++ kfree(af_params); ++exit: ++ return err; ++} ++ ++ ++static void ++wl_cfg80211_mgmt_frame_register(struct wiphy *wiphy, struct net_device *dev, ++ u16 frame_type, bool reg) ++{ ++ ++ AP6210_DEBUG("%s: frame_type: %x, reg: %d\n", __func__, frame_type, reg); ++ ++ if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) ++ return; ++ ++ return; ++} ++ ++ ++static s32 ++wl_cfg80211_change_bss(struct wiphy *wiphy, ++ struct net_device *dev, ++ struct bss_parameters *params) ++{ ++ if (params->use_cts_prot >= 0) { ++ } ++ ++ if (params->use_short_preamble >= 0) { ++ } ++ ++ if (params->use_short_slot_time >= 0) { ++ } ++ ++ if (params->basic_rates) { ++ } ++ ++ if (params->ap_isolate >= 0) { ++ } ++ ++ if (params->ht_opmode >= 0) { ++ } ++ ++ return 0; ++} ++ ++static s32 ++wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, ++ struct ieee80211_channel *chan, ++ enum nl80211_channel_type channel_type) ++{ ++ s32 _chan; ++ chanspec_t chspec = 0; ++ chanspec_t fw_chspec = 0; ++ u32 bw = WL_CHANSPEC_BW_20; ++ ++ s32 err = BCME_OK; ++ s32 bw_cap = 0; ++ struct { ++ u32 band; ++ u32 bw_cap; ++ } param = {0, 0}; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ ++ if (wl->p2p_net == dev) { ++ dev = wl_to_prmry_ndev(wl); ++ } ++ _chan = ieee80211_frequency_to_channel(chan->center_freq); ++ AP6210_ERR("netdev_ifidx(%d), chan_type(%d) target channel(%d) \n", ++ dev->ifindex, channel_type, _chan); ++ ++ ++ if (chan->band == IEEE80211_BAND_5GHZ) { ++ param.band = WLC_BAND_5G; ++ err = wldev_iovar_getbuf(dev, "bw_cap", ¶m, sizeof(param), ++ wl->ioctl_buf, WLC_IOCTL_SMLEN, &wl->ioctl_buf_sync); ++ if (err) { ++ if (err != BCME_UNSUPPORTED) { ++ AP6210_ERR("bw_cap failed, %d\n", err); ++ return err; ++ } else { ++ err = wldev_iovar_getint(dev, "mimo_bw_cap", &bw_cap); ++ if (err) { ++ AP6210_ERR("error get mimo_bw_cap (%d)\n", err); ++ } ++ if (bw_cap != WLC_N_BW_20ALL) ++ bw = WL_CHANSPEC_BW_40; ++ } ++ } else { ++ if (WL_BW_CAP_80MHZ(wl->ioctl_buf[0])) ++ bw = WL_CHANSPEC_BW_80; ++ else if (WL_BW_CAP_40MHZ(wl->ioctl_buf[0])) ++ bw = WL_CHANSPEC_BW_40; ++ else ++ bw = WL_CHANSPEC_BW_20; ++ ++ } ++ ++ } else if (chan->band == IEEE80211_BAND_2GHZ) ++ bw = WL_CHANSPEC_BW_20; ++set_channel: ++ chspec = wf_channel2chspec(_chan, bw); ++ if (wf_chspec_valid(chspec)) { ++ fw_chspec = wl_chspec_host_to_driver(chspec); ++ if (fw_chspec != INVCHANSPEC) { ++ if ((err = wldev_iovar_setint(dev, "chanspec", ++ fw_chspec)) == BCME_BADCHAN) { ++ if (bw == WL_CHANSPEC_BW_80) ++ goto change_bw; ++ err = wldev_ioctl(dev, WLC_SET_CHANNEL, ++ &_chan, sizeof(_chan), true); ++ if (err < 0) { ++ AP6210_ERR("WLC_SET_CHANNEL error %d" ++ "chip may not be supporting this channel\n", err); ++ } ++ } else if (err) { ++ AP6210_ERR("failed to set chanspec error %d\n", err); ++ } ++ } else { ++ AP6210_ERR("failed to convert host chanspec to fw chanspec\n"); ++ err = BCME_ERROR; ++ } ++ } else { ++change_bw: ++ if (bw == WL_CHANSPEC_BW_80) ++ bw = WL_CHANSPEC_BW_40; ++ else if (bw == WL_CHANSPEC_BW_40) ++ bw = WL_CHANSPEC_BW_20; ++ else ++ bw = 0; ++ if (bw) ++ goto set_channel; ++ AP6210_ERR("Invalid chanspec 0x%x\n", chspec); ++ err = BCME_ERROR; ++ } ++ return err; ++} ++ ++static s32 ++wl_validate_opensecurity(struct net_device *dev, s32 bssidx) ++{ ++ s32 err = BCME_OK; ++ ++ /* set auth */ ++ err = wldev_iovar_setint_bsscfg(dev, "auth", 0, bssidx); ++ if (err < 0) { ++ AP6210_ERR("auth error %d\n", err); ++ return BCME_ERROR; ++ } ++ /* set wsec */ ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", 0, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wsec error %d\n", err); ++ return BCME_ERROR; ++ } ++ /* set upper-layer auth */ ++ err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", WPA_AUTH_NONE, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wpa_auth error %d\n", err); ++ return BCME_ERROR; ++ } ++ ++ return 0; ++} ++ ++static s32 ++wl_validate_wpa2ie(struct net_device *dev, bcm_tlv_t *wpa2ie, s32 bssidx) ++{ ++ s32 len = 0; ++ s32 err = BCME_OK; ++ u16 auth = 0; /* d11 open authentication */ ++ u32 wsec; ++ u32 pval = 0; ++ u32 gval = 0; ++ u32 wpa_auth = 0; ++ wpa_suite_mcast_t *mcast; ++ wpa_suite_ucast_t *ucast; ++ wpa_suite_auth_key_mgmt_t *mgmt; ++ ++ u16 suite_count; ++ u8 rsn_cap[2]; ++ u32 wme_bss_disable; ++ ++ if (wpa2ie == NULL) ++ goto exit; ++ ++ AP6210_DEBUG("Enter \n"); ++ len = wpa2ie->len; ++ /* check the mcast cipher */ ++ mcast = (wpa_suite_mcast_t *)&wpa2ie->data[WPA2_VERSION_LEN]; ++ switch (mcast->type) { ++ case WPA_CIPHER_NONE: ++ gval = 0; ++ break; ++ case WPA_CIPHER_WEP_40: ++ case WPA_CIPHER_WEP_104: ++ gval = WEP_ENABLED; ++ break; ++ case WPA_CIPHER_TKIP: ++ gval = TKIP_ENABLED; ++ break; ++ case WPA_CIPHER_AES_CCM: ++ gval = AES_ENABLED; ++ break; ++#ifdef BCMWAPI_WPI ++ case WAPI_CIPHER_SMS4: ++ gval = SMS4_ENABLED; ++ break; ++#endif ++ default: ++ AP6210_ERR("No Security Info\n"); ++ break; ++ } ++ if ((len -= WPA_SUITE_LEN) <= 0) ++ return BCME_BADLEN; ++ ++ /* check the unicast cipher */ ++ ucast = (wpa_suite_ucast_t *)&mcast[1]; ++ suite_count = ltoh16_ua(&ucast->count); ++ switch (ucast->list[0].type) { ++ case WPA_CIPHER_NONE: ++ pval = 0; ++ break; ++ case WPA_CIPHER_WEP_40: ++ case WPA_CIPHER_WEP_104: ++ pval = WEP_ENABLED; ++ break; ++ case WPA_CIPHER_TKIP: ++ pval = TKIP_ENABLED; ++ break; ++ case WPA_CIPHER_AES_CCM: ++ pval = AES_ENABLED; ++ break; ++#ifdef BCMWAPI_WPI ++ case WAPI_CIPHER_SMS4: ++ pval = SMS4_ENABLED; ++ break; ++#endif ++ default: ++ AP6210_ERR("No Security Info\n"); ++ } ++ if ((len -= (WPA_IE_SUITE_COUNT_LEN + (WPA_SUITE_LEN * suite_count))) <= 0) ++ return BCME_BADLEN; ++ ++ /* FOR WPS , set SEC_OW_ENABLED */ ++ wsec = (pval | gval | SES_OW_ENABLED); ++ /* check the AKM */ ++ mgmt = (wpa_suite_auth_key_mgmt_t *)&ucast->list[suite_count]; ++ suite_count = ltoh16_ua(&mgmt->count); ++ switch (mgmt->list[0].type) { ++ case RSN_AKM_NONE: ++ wpa_auth = WPA_AUTH_NONE; ++ break; ++ case RSN_AKM_UNSPECIFIED: ++ wpa_auth = WPA2_AUTH_UNSPECIFIED; ++ break; ++ case RSN_AKM_PSK: ++ wpa_auth = WPA2_AUTH_PSK; ++ break; ++ default: ++ AP6210_ERR("No Key Mgmt Info\n"); ++ } ++ ++ if ((len -= (WPA_IE_SUITE_COUNT_LEN + (WPA_SUITE_LEN * suite_count))) >= RSN_CAP_LEN) { ++ rsn_cap[0] = *(u8 *)&mgmt->list[suite_count]; ++ rsn_cap[1] = *((u8 *)&mgmt->list[suite_count] + 1); ++ ++ if (rsn_cap[0] & (RSN_CAP_16_REPLAY_CNTRS << RSN_CAP_PTK_REPLAY_CNTR_SHIFT)) { ++ wme_bss_disable = 0; ++ } else { ++ wme_bss_disable = 1; ++ } ++ ++ /* set wme_bss_disable to sync RSN Capabilities */ ++ err = wldev_iovar_setint_bsscfg(dev, "wme_bss_disable", wme_bss_disable, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wme_bss_disable error %d\n", err); ++ return BCME_ERROR; ++ } ++ } else { ++ AP6210_DEBUG("There is no RSN Capabilities. remained len %d\n", len); ++ } ++ ++ /* set auth */ ++ err = wldev_iovar_setint_bsscfg(dev, "auth", auth, bssidx); ++ if (err < 0) { ++ AP6210_ERR("auth error %d\n", err); ++ return BCME_ERROR; ++ } ++ /* set wsec */ ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", wsec, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wsec error %d\n", err); ++ return BCME_ERROR; ++ } ++ /* set upper-layer auth */ ++ err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", wpa_auth, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wpa_auth error %d\n", err); ++ return BCME_ERROR; ++ } ++exit: ++ return 0; ++} ++ ++static s32 ++wl_validate_wpaie(struct net_device *dev, wpa_ie_fixed_t *wpaie, s32 bssidx) ++{ ++ wpa_suite_mcast_t *mcast; ++ wpa_suite_ucast_t *ucast; ++ wpa_suite_auth_key_mgmt_t *mgmt; ++ u16 auth = 0; /* d11 open authentication */ ++ u16 count; ++ s32 err = BCME_OK; ++ s32 len = 0; ++ u32 i; ++ u32 wsec; ++ u32 pval = 0; ++ u32 gval = 0; ++ u32 wpa_auth = 0; ++ u32 tmp = 0; ++ ++ if (wpaie == NULL) ++ goto exit; ++ AP6210_DEBUG("Enter \n"); ++ len = wpaie->length; /* value length */ ++ len -= WPA_IE_TAG_FIXED_LEN; ++ /* check for multicast cipher suite */ ++ if (len < WPA_SUITE_LEN) { ++ AP6210_DEBUG("no multicast cipher suite\n"); ++ goto exit; ++ } ++ ++ /* pick up multicast cipher */ ++ mcast = (wpa_suite_mcast_t *)&wpaie[1]; ++ len -= WPA_SUITE_LEN; ++ if (!bcmp(mcast->oui, WPA_OUI, WPA_OUI_LEN)) { ++ if (IS_WPA_CIPHER(mcast->type)) { ++ tmp = 0; ++ switch (mcast->type) { ++ case WPA_CIPHER_NONE: ++ tmp = 0; ++ break; ++ case WPA_CIPHER_WEP_40: ++ case WPA_CIPHER_WEP_104: ++ tmp = WEP_ENABLED; ++ break; ++ case WPA_CIPHER_TKIP: ++ tmp = TKIP_ENABLED; ++ break; ++ case WPA_CIPHER_AES_CCM: ++ tmp = AES_ENABLED; ++ break; ++ default: ++ AP6210_ERR("No Security Info\n"); ++ } ++ gval |= tmp; ++ } ++ } ++ /* Check for unicast suite(s) */ ++ if (len < WPA_IE_SUITE_COUNT_LEN) { ++ AP6210_DEBUG("no unicast suite\n"); ++ goto exit; ++ } ++ /* walk thru unicast cipher list and pick up what we recognize */ ++ ucast = (wpa_suite_ucast_t *)&mcast[1]; ++ count = ltoh16_ua(&ucast->count); ++ len -= WPA_IE_SUITE_COUNT_LEN; ++ for (i = 0; i < count && len >= WPA_SUITE_LEN; ++ i++, len -= WPA_SUITE_LEN) { ++ if (!bcmp(ucast->list[i].oui, WPA_OUI, WPA_OUI_LEN)) { ++ if (IS_WPA_CIPHER(ucast->list[i].type)) { ++ tmp = 0; ++ switch (ucast->list[i].type) { ++ case WPA_CIPHER_NONE: ++ tmp = 0; ++ break; ++ case WPA_CIPHER_WEP_40: ++ case WPA_CIPHER_WEP_104: ++ tmp = WEP_ENABLED; ++ break; ++ case WPA_CIPHER_TKIP: ++ tmp = TKIP_ENABLED; ++ break; ++ case WPA_CIPHER_AES_CCM: ++ tmp = AES_ENABLED; ++ break; ++ default: ++ AP6210_ERR("No Security Info\n"); ++ } ++ pval |= tmp; ++ } ++ } ++ } ++ len -= (count - i) * WPA_SUITE_LEN; ++ /* Check for auth key management suite(s) */ ++ if (len < WPA_IE_SUITE_COUNT_LEN) { ++ AP6210_DEBUG(" no auth key mgmt suite\n"); ++ goto exit; ++ } ++ /* walk thru auth management suite list and pick up what we recognize */ ++ mgmt = (wpa_suite_auth_key_mgmt_t *)&ucast->list[count]; ++ count = ltoh16_ua(&mgmt->count); ++ len -= WPA_IE_SUITE_COUNT_LEN; ++ for (i = 0; i < count && len >= WPA_SUITE_LEN; ++ i++, len -= WPA_SUITE_LEN) { ++ if (!bcmp(mgmt->list[i].oui, WPA_OUI, WPA_OUI_LEN)) { ++ if (IS_WPA_AKM(mgmt->list[i].type)) { ++ tmp = 0; ++ switch (mgmt->list[i].type) { ++ case RSN_AKM_NONE: ++ tmp = WPA_AUTH_NONE; ++ break; ++ case RSN_AKM_UNSPECIFIED: ++ tmp = WPA_AUTH_UNSPECIFIED; ++ break; ++ case RSN_AKM_PSK: ++ tmp = WPA_AUTH_PSK; ++ break; ++ default: ++ AP6210_ERR("No Key Mgmt Info\n"); ++ } ++ wpa_auth |= tmp; ++ } ++ } ++ ++ } ++ /* FOR WPS , set SEC_OW_ENABLED */ ++ wsec = (pval | gval | SES_OW_ENABLED); ++ /* set auth */ ++ err = wldev_iovar_setint_bsscfg(dev, "auth", auth, bssidx); ++ if (err < 0) { ++ AP6210_ERR("auth error %d\n", err); ++ return BCME_ERROR; ++ } ++ /* set wsec */ ++ err = wldev_iovar_setint_bsscfg(dev, "wsec", wsec, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wsec error %d\n", err); ++ return BCME_ERROR; ++ } ++ /* set upper-layer auth */ ++ err = wldev_iovar_setint_bsscfg(dev, "wpa_auth", wpa_auth, bssidx); ++ if (err < 0) { ++ AP6210_ERR("wpa_auth error %d\n", err); ++ return BCME_ERROR; ++ } ++exit: ++ return 0; ++} ++ ++static s32 ++wl_cfg80211_bcn_validate_sec( ++ struct net_device *dev, ++ struct parsed_ies *ies, ++ u32 dev_role, ++ s32 bssidx) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ if (dev_role == NL80211_IFTYPE_P2P_GO && (ies->wpa2_ie)) { ++ /* For P2P GO, the sec type is WPA2-PSK */ ++ AP6210_DEBUG("P2P GO: validating wpa2_ie"); ++ if (wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0) ++ return BCME_ERROR; ++ ++ } else if (dev_role == NL80211_IFTYPE_AP) { ++ ++ AP6210_DEBUG("SoftAP: validating security"); ++ /* If wpa2_ie or wpa_ie is present validate it */ ++ if ((ies->wpa2_ie || ies->wpa_ie) && ++ ((wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0 || ++ wl_validate_wpaie(dev, ies->wpa_ie, bssidx) < 0))) { ++ wl->ap_info->security_mode = false; ++ return BCME_ERROR; ++ } ++ ++ wl->ap_info->security_mode = true; ++ if (wl->ap_info->rsn_ie) { ++ kfree(wl->ap_info->rsn_ie); ++ wl->ap_info->rsn_ie = NULL; ++ } ++ if (wl->ap_info->wpa_ie) { ++ kfree(wl->ap_info->wpa_ie); ++ wl->ap_info->wpa_ie = NULL; ++ } ++ if (wl->ap_info->wps_ie) { ++ kfree(wl->ap_info->wps_ie); ++ wl->ap_info->wps_ie = NULL; ++ } ++ if (ies->wpa_ie != NULL) { ++ /* WPAIE */ ++ wl->ap_info->rsn_ie = NULL; ++ wl->ap_info->wpa_ie = kmemdup(ies->wpa_ie, ++ ies->wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, ++ GFP_KERNEL); ++ } else if (ies->wpa2_ie != NULL) { ++ /* RSNIE */ ++ wl->ap_info->wpa_ie = NULL; ++ wl->ap_info->rsn_ie = kmemdup(ies->wpa2_ie, ++ ies->wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, ++ GFP_KERNEL); ++ } ++ ++ if (!ies->wpa2_ie && !ies->wpa_ie) { ++ wl_validate_opensecurity(dev, bssidx); ++ wl->ap_info->security_mode = false; ++ } ++ ++ if (ies->wps_ie) { ++ wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); ++ } ++ } ++ ++ return 0; ++ ++} ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++static s32 wl_cfg80211_bcn_set_params( ++ struct cfg80211_ap_settings *info, ++ struct net_device *dev, ++ u32 dev_role, s32 bssidx) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ s32 err = BCME_OK; ++ ++ AP6210_DEBUG("interval (%d) \ndtim_period (%d) \n", ++ info->beacon_interval, info->dtim_period); ++ ++ if (info->beacon_interval) { ++ if ((err = wldev_ioctl(dev, WLC_SET_BCNPRD, ++ &info->beacon_interval, sizeof(s32), true)) < 0) { ++ AP6210_ERR("Beacon Interval Set Error, %d\n", err); ++ return err; ++ } ++ } ++ ++ if (info->dtim_period) { ++ if ((err = wldev_ioctl(dev, WLC_SET_DTIMPRD, ++ &info->dtim_period, sizeof(s32), true)) < 0) { ++ AP6210_ERR("DTIM Interval Set Error, %d\n", err); ++ return err; ++ } ++ } ++ ++ if ((info->ssid) && (info->ssid_len > 0) && ++ (info->ssid_len <= 32)) { ++ AP6210_DEBUG("SSID (%s) len:%d \n", info->ssid, info->ssid_len); ++ if (dev_role == NL80211_IFTYPE_AP) { ++ /* Store the hostapd SSID */ ++ memset(wl->hostapd_ssid.SSID, 0x00, 32); ++ memcpy(wl->hostapd_ssid.SSID, info->ssid, info->ssid_len); ++ wl->hostapd_ssid.SSID_len = info->ssid_len; ++ } else { ++ /* P2P GO */ ++ memset(wl->p2p->ssid.SSID, 0x00, 32); ++ memcpy(wl->p2p->ssid.SSID, info->ssid, info->ssid_len); ++ wl->p2p->ssid.SSID_len = info->ssid_len; ++ } ++ } ++ ++ if (info->hidden_ssid) { ++ if ((err = wldev_iovar_setint(dev, "closednet", 1)) < 0) ++ AP6210_ERR("failed to set hidden : %d\n", err); ++ AP6210_DEBUG("hidden_ssid_enum_val: %d \n", info->hidden_ssid); ++ } ++ ++ return err; ++} ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ ++ ++static s32 ++wl_cfg80211_parse_ies(u8 *ptr, u32 len, struct parsed_ies *ies) ++{ ++ s32 err = BCME_OK; ++ ++ memset(ies, 0, sizeof(struct parsed_ies)); ++ ++ /* find the WPSIE */ ++ if ((ies->wps_ie = wl_cfgp2p_find_wpsie(ptr, len)) != NULL) { ++ AP6210_DEBUG("WPSIE in beacon \n"); ++ ies->wps_ie_len = ies->wps_ie->length + WPA_RSN_IE_TAG_FIXED_LEN; ++ } else { ++ AP6210_ERR("No WPSIE in beacon \n"); ++ } ++ ++ /* find the RSN_IE */ ++ if ((ies->wpa2_ie = bcm_parse_tlvs(ptr, len, ++ DOT11_MNG_RSN_ID)) != NULL) { ++ AP6210_DEBUG(" WPA2 IE found\n"); ++ ies->wpa2_ie_len = ies->wpa2_ie->len; ++ } ++ ++ /* find the WPA_IE */ ++ if ((ies->wpa_ie = wl_cfgp2p_find_wpaie(ptr, len)) != NULL) { ++ AP6210_DEBUG(" WPA found\n"); ++ ies->wpa_ie_len = ies->wpa_ie->length; ++ } ++ ++ return err; ++ ++} ++ ++static s32 ++wl_cfg80211_bcn_bringup_ap( ++ struct net_device *dev, ++ struct parsed_ies *ies, ++ u32 dev_role, s32 bssidx) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wl_join_params join_params; ++ bool is_bssup = false; ++ s32 infra = 1; ++ s32 join_params_size = 0; ++ s32 ap = 1; ++ s32 err = BCME_OK; ++ ++ AP6210_DEBUG("Enter dev_role: %d\n", dev_role); ++ ++ /* Common code for SoftAP and P2P GO */ ++ wldev_iovar_setint(dev, "mpc", 0); ++ ++ if (dev_role == NL80211_IFTYPE_P2P_GO) { ++ is_bssup = wl_cfgp2p_bss_isup(dev, bssidx); ++ if (!is_bssup && (ies->wpa2_ie != NULL)) { ++ ++ err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); ++ if (err < 0) { ++ AP6210_ERR("SET INFRA error %d\n", err); ++ goto exit; ++ } ++ ++ err = wldev_iovar_setbuf_bsscfg(dev, "ssid", &wl->p2p->ssid, ++ sizeof(wl->p2p->ssid), wl->ioctl_buf, WLC_IOCTL_MAXLEN, ++ bssidx, &wl->ioctl_buf_sync); ++ if (err < 0) { ++ AP6210_ERR("GO SSID setting error %d\n", err); ++ goto exit; ++ } ++ ++ if ((err = wl_cfgp2p_bss(wl, dev, bssidx, 1)) < 0) { ++ AP6210_ERR("GO Bring up error %d\n", err); ++ goto exit; ++ } ++ } else ++ AP6210_DEBUG("Bss is already up\n"); ++ } else if ((dev_role == NL80211_IFTYPE_AP) && ++ (wl_get_drv_status(wl, AP_CREATING, dev))) { ++ /* Device role SoftAP */ ++ err = wldev_ioctl(dev, WLC_DOWN, &ap, sizeof(s32), true); ++ if (err < 0) { ++ AP6210_ERR("WLC_DOWN error %d\n", err); ++ goto exit; ++ } ++ err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); ++ if (err < 0) { ++ AP6210_ERR("SET INFRA error %d\n", err); ++ goto exit; ++ } ++ if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { ++ AP6210_ERR("setting AP mode failed %d \n", err); ++ goto exit; ++ } ++ ++ err = wldev_ioctl(dev, WLC_UP, &ap, sizeof(s32), true); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_UP error (%d)\n", err); ++ goto exit; ++ } ++ ++ memset(&join_params, 0, sizeof(join_params)); ++ /* join parameters starts with ssid */ ++ join_params_size = sizeof(join_params.ssid); ++ memcpy(join_params.ssid.SSID, wl->hostapd_ssid.SSID, ++ wl->hostapd_ssid.SSID_len); ++ join_params.ssid.SSID_len = htod32(wl->hostapd_ssid.SSID_len); ++ ++ /* create softap */ ++ if ((err = wldev_ioctl(dev, WLC_SET_SSID, &join_params, ++ join_params_size, true)) == 0) { ++ AP6210_DEBUG("SoftAP set SSID (%s) success\n", join_params.ssid.SSID); ++ wl_clr_drv_status(wl, AP_CREATING, dev); ++ wl_set_drv_status(wl, AP_CREATED, dev); ++ } ++ } ++ ++ ++exit: ++ return err; ++} ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++s32 ++wl_cfg80211_parse_set_ies( ++ struct net_device *dev, ++ struct cfg80211_beacon_data *info, ++ struct parsed_ies *ies, ++ u32 dev_role, ++ s32 bssidx) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct parsed_ies prb_ies; ++ s32 err = BCME_OK; ++ ++ memset(ies, 0, sizeof(struct parsed_ies)); ++ memset(&prb_ies, 0, sizeof(struct parsed_ies)); ++ ++ /* Parse Beacon IEs */ ++ if (wl_cfg80211_parse_ies((u8 *)info->tail, ++ info->tail_len, ies) < 0) { ++ AP6210_ERR("Beacon get IEs failed \n"); ++ err = -EINVAL; ++ goto fail; ++ } ++ ++ /* Set Beacon IEs to FW */ ++ if ((err = wl_cfgp2p_set_management_ie(wl, dev, bssidx, ++ VNDR_IE_BEACON_FLAG, (u8 *)info->tail, ++ info->tail_len)) < 0) { ++ AP6210_ERR("Set Beacon IE Failed \n"); ++ } else { ++ AP6210_DEBUG("Applied Vndr IEs for Beacon \n"); ++ } ++ ++ /* Parse Probe Response IEs */ ++ if (wl_cfg80211_parse_ies((u8 *)info->proberesp_ies, ++ info->proberesp_ies_len, &prb_ies) < 0) { ++ AP6210_ERR("PRB RESP get IEs failed \n"); ++ err = -EINVAL; ++ goto fail; ++ } ++ ++ /* Set Probe Response IEs to FW */ ++ if ((err = wl_cfgp2p_set_management_ie(wl, dev, bssidx, ++ VNDR_IE_PRBRSP_FLAG, (u8 *)info->proberesp_ies, ++ info->proberesp_ies_len)) < 0) { ++ AP6210_ERR("Set Probe Resp IE Failed \n"); ++ } else { ++ AP6210_DEBUG("Applied Vndr IEs for Probe Resp \n"); ++ } ++ ++fail: ++ ++ return err; ++} ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ ++ ++static s32 wl_cfg80211_hostapd_sec( ++ struct net_device *dev, ++ struct parsed_ies *ies, ++ s32 bssidx) ++{ ++ bool update_bss = 0; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ ++ if (ies->wps_ie) { ++ if (wl->ap_info->wps_ie && ++ memcmp(wl->ap_info->wps_ie, ies->wps_ie, ies->wps_ie_len)) { ++ AP6210_DEBUG(" WPS IE is changed\n"); ++ kfree(wl->ap_info->wps_ie); ++ wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); ++ } else if (wl->ap_info->wps_ie == NULL) { ++ AP6210_DEBUG(" WPS IE is added\n"); ++ wl->ap_info->wps_ie = kmemdup(ies->wps_ie, ies->wps_ie_len, GFP_KERNEL); ++ } ++ if ((ies->wpa_ie != NULL || ies->wpa2_ie != NULL)) { ++ if (!wl->ap_info->security_mode) { ++ /* change from open mode to security mode */ ++ update_bss = true; ++ if (ies->wpa_ie != NULL) { ++ wl->ap_info->wpa_ie = kmemdup(ies->wpa_ie, ++ ies->wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, ++ GFP_KERNEL); ++ } else { ++ wl->ap_info->rsn_ie = kmemdup(ies->wpa2_ie, ++ ies->wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, ++ GFP_KERNEL); ++ } ++ } else if (wl->ap_info->wpa_ie) { ++ /* change from WPA2 mode to WPA mode */ ++ if (ies->wpa_ie != NULL) { ++ update_bss = true; ++ kfree(wl->ap_info->rsn_ie); ++ wl->ap_info->rsn_ie = NULL; ++ wl->ap_info->wpa_ie = kmemdup(ies->wpa_ie, ++ ies->wpa_ie->length + WPA_RSN_IE_TAG_FIXED_LEN, ++ GFP_KERNEL); ++ } else if (memcmp(wl->ap_info->rsn_ie, ++ ies->wpa2_ie, ies->wpa2_ie->len ++ + WPA_RSN_IE_TAG_FIXED_LEN)) { ++ update_bss = true; ++ kfree(wl->ap_info->rsn_ie); ++ wl->ap_info->rsn_ie = kmemdup(ies->wpa2_ie, ++ ies->wpa2_ie->len + WPA_RSN_IE_TAG_FIXED_LEN, ++ GFP_KERNEL); ++ wl->ap_info->wpa_ie = NULL; ++ } ++ } ++ if (update_bss) { ++ wl->ap_info->security_mode = true; ++ wl_cfgp2p_bss(wl, dev, bssidx, 0); ++ if (wl_validate_wpa2ie(dev, ies->wpa2_ie, bssidx) < 0 || ++ wl_validate_wpaie(dev, ies->wpa_ie, bssidx) < 0) { ++ return BCME_ERROR; ++ } ++ wl_cfgp2p_bss(wl, dev, bssidx, 1); ++ } ++ } ++ } else { ++ AP6210_ERR("No WPSIE in beacon \n"); ++ } ++ return 0; ++} ++ ++#if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ ++ 2, 0)) ++static s32 ++wl_cfg80211_del_station( ++ struct wiphy *wiphy, ++ struct net_device *ndev, ++ u8* mac_addr) ++{ ++ struct net_device *dev; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ scb_val_t scb_val; ++ s8 eabuf[ETHER_ADDR_STR_LEN]; ++ ++ AP6210_DEBUG("Entry\n"); ++ if (mac_addr == NULL) { ++ AP6210_DEBUG("mac_addr is NULL ignore it\n"); ++ return 0; ++ } ++ ++ if (ndev == wl->p2p_net) { ++ dev = wl_to_prmry_ndev(wl); ++ } else { ++ dev = ndev; ++ } ++ ++ if (p2p_is_on(wl)) { ++ /* Suspend P2P discovery search-listen to prevent it from changing the ++ * channel. ++ */ ++ if ((wl_cfgp2p_discover_enable_search(wl, false)) < 0) { ++ AP6210_ERR("Can not disable discovery mode\n"); ++ return -EFAULT; ++ } ++ } ++ ++ memcpy(scb_val.ea.octet, mac_addr, ETHER_ADDR_LEN); ++ scb_val.val = DOT11_RC_DEAUTH_LEAVING; ++ if (wldev_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scb_val, ++ sizeof(scb_val_t), true)) ++ AP6210_ERR("WLC_SCB_DEAUTHENTICATE_FOR_REASON failed\n"); ++ AP6210_DEBUG("Disconnect STA : %s scb_val.val %d\n", ++ bcm_ether_ntoa((const struct ether_addr *)mac_addr, eabuf), ++ scb_val.val); ++ wl_delay(400); ++ return 0; ++} ++#endif /* WL_SUPPORT_BACKPORTED_KPATCHES || KERNEL_VER >= KERNEL_VERSION(3, 2, 0)) */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++static s32 ++wl_cfg80211_start_ap( ++ struct wiphy *wiphy, ++ struct net_device *dev, ++ struct cfg80211_ap_settings *info) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 err = BCME_OK; ++ struct parsed_ies ies; ++ s32 bssidx = 0; ++ u32 dev_role = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ if (dev == wl_to_prmry_ndev(wl)) { ++ AP6210_DEBUG("Start AP req on primary iface: Softap\n"); ++ dev_role = NL80211_IFTYPE_AP; ++ } else if (dev == wl->p2p_net) { ++ /* Group Add request on p2p0 */ ++ AP6210_DEBUG("Start AP req on P2P iface: GO\n"); ++ dev = wl_to_prmry_ndev(wl); ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ ++ bssidx = wl_cfgp2p_find_idx(wl, dev); ++ if (p2p_is_on(wl) && ++ (bssidx == wl_to_p2p_bss_bssidx(wl, ++ P2PAPI_BSSCFG_CONNECTION))) { ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ AP6210_DEBUG("Start AP req on P2P connection iface\n"); ++ } ++ ++ if ((err = wl_cfg80211_bcn_set_params(info, dev, ++ dev_role, bssidx)) < 0) { ++ AP6210_ERR("Beacon params set failed \n"); ++ goto fail; ++ } ++ ++ /* Set IEs to FW */ ++ if ((err = wl_cfg80211_parse_set_ies(dev, &info->beacon, ++ &ies, dev_role, bssidx) < 0)) { ++ AP6210_ERR("Set IEs failed \n"); ++ goto fail; ++ } ++ ++ if ((wl_cfg80211_bcn_validate_sec(dev, &ies, ++ dev_role, bssidx)) < 0) ++ { ++ AP6210_ERR("Beacon set security failed \n"); ++ goto fail; ++ } ++ ++ if ((err = wl_cfg80211_bcn_bringup_ap(dev, &ies, ++ dev_role, bssidx)) < 0) { ++ AP6210_ERR("Beacon bring up AP/GO failed \n"); ++ goto fail; ++ } ++ ++ AP6210_DEBUG("** AP/GO Created **\n"); ++ ++fail: ++ if (err) { ++ AP6210_ERR("ADD/SET beacon failed\n"); ++ wldev_iovar_setint(dev, "mpc", 1); ++ } ++ ++ return err; ++} ++ ++static s32 ++wl_cfg80211_stop_ap( ++ struct wiphy *wiphy, ++ struct net_device *dev) ++{ ++ int err = 0; ++ u32 dev_role = 0; ++ int infra = 0; ++ int ap = 0; ++ s32 bssidx = 0; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ ++ AP6210_DEBUG("Enter \n"); ++ if (dev == wl_to_prmry_ndev(wl)) { ++ dev_role = NL80211_IFTYPE_AP; ++ } else if (dev == wl->p2p_net) { ++ /* Group Add request on p2p0 */ ++ dev = wl_to_prmry_ndev(wl); ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ bssidx = wl_cfgp2p_find_idx(wl, dev); ++ if (p2p_is_on(wl) && ++ (bssidx == wl_to_p2p_bss_bssidx(wl, ++ P2PAPI_BSSCFG_CONNECTION))) { ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ ++ if (dev_role == NL80211_IFTYPE_AP) { ++ /* SoftAp on primary Interface. ++ * Shut down AP and turn on MPC ++ */ ++ err = wldev_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(s32), true); ++ if (err < 0) { ++ AP6210_ERR("SET INFRA error %d\n", err); ++ err = -ENOTSUPP; ++ goto exit; ++ } ++ if ((err = wldev_ioctl(dev, WLC_SET_AP, &ap, sizeof(s32), true)) < 0) { ++ AP6210_ERR("setting AP mode failed %d \n", err); ++ err = -ENOTSUPP; ++ goto exit; ++ } ++ ++ err = wldev_ioctl(dev, WLC_UP, &ap, sizeof(s32), true); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_UP error (%d)\n", err); ++ err = -EINVAL; ++ goto exit; ++ } ++ ++ wl_clr_drv_status(wl, AP_CREATED, dev); ++ /* Turn on the MPC */ ++ wldev_iovar_setint(dev, "mpc", 1); ++ } else { ++ AP6210_DEBUG("Stopping P2P GO \n"); ++ } ++ ++exit: ++ return err; ++} ++ ++static s32 ++wl_cfg80211_change_beacon( ++ struct wiphy *wiphy, ++ struct net_device *dev, ++ struct cfg80211_beacon_data *info) ++{ ++ s32 err = BCME_OK; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct parsed_ies ies; ++ u32 dev_role = 0; ++ s32 bssidx = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ ++ if (dev == wl_to_prmry_ndev(wl)) { ++ dev_role = NL80211_IFTYPE_AP; ++ } else if (dev == wl->p2p_net) { ++ /* Group Add request on p2p0 */ ++ dev = wl_to_prmry_ndev(wl); ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ ++ bssidx = wl_cfgp2p_find_idx(wl, dev); ++ if (p2p_is_on(wl) && ++ (bssidx == wl_to_p2p_bss_bssidx(wl, ++ P2PAPI_BSSCFG_CONNECTION))) { ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ ++ /* Set IEs to FW */ ++ if ((err = wl_cfg80211_parse_set_ies(dev, info, ++ &ies, dev_role, bssidx) < 0)) { ++ AP6210_ERR("Set IEs failed \n"); ++ goto fail; ++ } ++ ++ if (dev_role == NL80211_IFTYPE_AP) { ++ if (wl_cfg80211_hostapd_sec(dev, &ies, bssidx) < 0) { ++ AP6210_ERR("Hostapd update sec failed \n"); ++ err = -EINVAL; ++ goto fail; ++ } ++ } ++ ++fail: ++ return err; ++} ++#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ ++static s32 ++wl_cfg80211_add_set_beacon(struct wiphy *wiphy, struct net_device *dev, ++ struct beacon_parameters *info) ++{ ++ s32 err = BCME_OK; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ s32 ie_offset = 0; ++ s32 bssidx = 0; ++ u32 dev_role = NL80211_IFTYPE_AP; ++ struct parsed_ies ies; ++ bcm_tlv_t *ssid_ie; ++ bool pbc = 0; ++ ++ AP6210_DEBUG("interval (%d) dtim_period (%d) head_len (%d) tail_len (%d)\n", ++ info->interval, info->dtim_period, info->head_len, info->tail_len); ++ ++ if (dev == wl_to_prmry_ndev(wl)) { ++ dev_role = NL80211_IFTYPE_AP; ++ } else if (dev == wl->p2p_net) { ++ /* Group Add request on p2p0 */ ++ dev = wl_to_prmry_ndev(wl); ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ ++ bssidx = wl_cfgp2p_find_idx(wl, dev); ++ if (p2p_is_on(wl) && ++ (bssidx == wl_to_p2p_bss_bssidx(wl, ++ P2PAPI_BSSCFG_CONNECTION))) { ++ dev_role = NL80211_IFTYPE_P2P_GO; ++ } ++ ++ ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; ++ /* find the SSID */ ++ if ((ssid_ie = bcm_parse_tlvs((u8 *)&info->head[ie_offset], ++ info->head_len - ie_offset, ++ DOT11_MNG_SSID_ID)) != NULL) { ++ if (dev_role == NL80211_IFTYPE_AP) { ++ /* Store the hostapd SSID */ ++ memset(&wl->hostapd_ssid.SSID[0], 0x00, 32); ++ memcpy(&wl->hostapd_ssid.SSID[0], ssid_ie->data, ssid_ie->len); ++ wl->hostapd_ssid.SSID_len = ssid_ie->len; ++ } else { ++ /* P2P GO */ ++ memset(&wl->p2p->ssid.SSID[0], 0x00, 32); ++ memcpy(wl->p2p->ssid.SSID, ssid_ie->data, ssid_ie->len); ++ wl->p2p->ssid.SSID_len = ssid_ie->len; ++ } ++ } ++ ++ if (wl_cfg80211_parse_ies((u8 *)info->tail, ++ info->tail_len, &ies) < 0) { ++ AP6210_ERR("Beacon get IEs failed \n"); ++ err = -EINVAL; ++ goto fail; ++ } ++ ++ if (wl_cfgp2p_set_management_ie(wl, dev, bssidx, ++ VNDR_IE_BEACON_FLAG, (u8 *)info->tail, ++ info->tail_len) < 0) { ++ AP6210_ERR("Beacon set IEs failed \n"); ++ goto fail; ++ } else { ++ AP6210_DEBUG("Applied Vndr IEs for Beacon \n"); ++ } ++ if (!wl_cfgp2p_bss_isup(dev, bssidx) && ++ (wl_cfg80211_bcn_validate_sec(dev, &ies, dev_role, bssidx) < 0)) ++ { ++ AP6210_ERR("Beacon set security failed \n"); ++ goto fail; ++ } ++ ++ /* Set BI and DTIM period */ ++ if (info->interval) { ++ if ((err = wldev_ioctl(dev, WLC_SET_BCNPRD, ++ &info->interval, sizeof(s32), true)) < 0) { ++ AP6210_ERR("Beacon Interval Set Error, %d\n", err); ++ return err; ++ } ++ } ++ if (info->dtim_period) { ++ if ((err = wldev_ioctl(dev, WLC_SET_DTIMPRD, ++ &info->dtim_period, sizeof(s32), true)) < 0) { ++ AP6210_ERR("DTIM Interval Set Error, %d\n", err); ++ return err; ++ } ++ } ++ ++ if (wl_cfg80211_bcn_bringup_ap(dev, &ies, dev_role, bssidx) < 0) { ++ AP6210_ERR("Beacon bring up AP/GO failed \n"); ++ goto fail; ++ } ++ ++ if (wl_get_drv_status(wl, AP_CREATED, dev)) { ++ /* Soft AP already running. Update changed params */ ++ if (wl_cfg80211_hostapd_sec(dev, &ies, bssidx) < 0) { ++ AP6210_ERR("Hostapd update sec failed \n"); ++ err = -EINVAL; ++ goto fail; ++ } ++ } ++ ++ /* Enable Probe Req filter */ ++ if (((dev_role == NL80211_IFTYPE_P2P_GO) || ++ (dev_role == NL80211_IFTYPE_AP)) && (ies.wps_ie != NULL)) { ++ wl_validate_wps_ie((char *) ies.wps_ie, ies.wps_ie_len, &pbc); ++ if (pbc) ++ wl_add_remove_eventmsg(dev, WLC_E_PROBREQ_MSG, true); ++ } ++ ++ AP6210_DEBUG("** ADD/SET beacon done **\n"); ++ ++fail: ++ if (err) { ++ AP6210_ERR("ADD/SET beacon failed\n"); ++ wldev_iovar_setint(dev, "mpc", 1); ++ } ++ return err; ++ ++} ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ ++ ++#ifdef WL_SCHED_SCAN ++#define PNO_TIME 30 ++#define PNO_REPEAT 4 ++#define PNO_FREQ_EXPO_MAX 2 ++int wl_cfg80211_sched_scan_start(struct wiphy *wiphy, ++ struct net_device *dev, ++ struct cfg80211_sched_scan_request *request) ++{ ++ ushort pno_time = PNO_TIME; ++ int pno_repeat = PNO_REPEAT; ++ int pno_freq_expo_max = PNO_FREQ_EXPO_MAX; ++ wlc_ssid_t ssids_local[MAX_PFN_LIST_COUNT]; ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ struct cfg80211_ssid *ssid = NULL; ++ int ssid_count = 0; ++ int i; ++ int ret = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ AP6210_DEBUG(">>> SCHED SCAN START\n"); ++ AP6210_DEBUG("Enter n_match_sets:%d n_ssids:%d \n", ++ request->n_match_sets, request->n_ssids); ++ AP6210_DEBUG("ssids:%d pno_time:%d pno_repeat:%d pno_freq:%d \n", ++ request->n_ssids, pno_time, pno_repeat, pno_freq_expo_max); ++ ++ ++ if (!request || !request->n_ssids || !request->n_match_sets) { ++ AP6210_ERR("Invalid sched scan req!! n_ssids:%d \n", request->n_ssids); ++ return -EINVAL; ++ } ++ ++ memset(&ssids_local, 0, sizeof(ssids_local)); ++ ++ if (request->n_match_sets > 0) { ++ for (i = 0; i < request->n_match_sets; i++) { ++ ssid = &request->match_sets[i].ssid; ++ memcpy(ssids_local[i].SSID, ssid->ssid, ssid->ssid_len); ++ ssids_local[i].SSID_len = ssid->ssid_len; ++ AP6210_DEBUG(">>> PNO filter set for ssid (%s) \n", ssid->ssid); ++ ssid_count++; ++ } ++ } ++ ++ if (request->n_ssids > 0) { ++ for (i = 0; i < request->n_ssids; i++) { ++ /* Active scan req for ssids */ ++ AP6210_DEBUG(">>> Active scan req for ssid (%s) \n", request->ssids[i].ssid); ++ ++ /* match_set ssids is a supert set of n_ssid list, so we need ++ * not add these set seperately ++ */ ++ } ++ } ++ ++ if (ssid_count) { ++ if ((ret = dhd_dev_pno_set(dev, ssids_local, request->n_match_sets, ++ pno_time, pno_repeat, pno_freq_expo_max)) < 0) { ++ AP6210_ERR("PNO setup failed!! ret=%d \n", ret); ++ return -EINVAL; ++ } ++ ++ /* Enable the PNO */ ++ if (dhd_dev_pno_enable(dev, 1) < 0) { ++ AP6210_ERR("PNO enable failed!! ret=%d \n", ret); ++ return -EINVAL; ++ } ++ wl->sched_scan_req = request; ++ } else { ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++int wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev) ++{ ++ struct wl_priv *wl = wiphy_priv(wiphy); ++ ++ AP6210_DEBUG("Enter \n"); ++ AP6210_DEBUG(">>> SCHED SCAN STOP\n"); ++ ++ if (dhd_dev_pno_enable(dev, 0) < 0) ++ AP6210_ERR("PNO disable failed"); ++ ++ if (dhd_dev_pno_reset(dev) < 0) ++ AP6210_ERR("PNO reset failed"); ++ ++ if (wl->scan_request && wl->sched_scan_running) { ++ AP6210_DEBUG(">>> Sched scan running. Aborting it..\n"); ++ wl_notify_escan_complete(wl, dev, true, true); ++ } ++ ++ wl->sched_scan_req = NULL; ++ wl->sched_scan_running = FALSE; ++ ++ return 0; ++} ++#endif /* WL_SCHED_SCAN */ ++ ++static struct cfg80211_ops wl_cfg80211_ops = { ++ .add_virtual_intf = wl_cfg80211_add_virtual_iface, ++ .del_virtual_intf = wl_cfg80211_del_virtual_iface, ++ .change_virtual_intf = wl_cfg80211_change_virtual_iface, ++ .scan = wl_cfg80211_scan, ++ .set_wiphy_params = wl_cfg80211_set_wiphy_params, ++ .join_ibss = wl_cfg80211_join_ibss, ++ .leave_ibss = wl_cfg80211_leave_ibss, ++ .get_station = wl_cfg80211_get_station, ++ .set_tx_power = wl_cfg80211_set_tx_power, ++ .get_tx_power = wl_cfg80211_get_tx_power, ++ .add_key = wl_cfg80211_add_key, ++ .del_key = wl_cfg80211_del_key, ++ .get_key = wl_cfg80211_get_key, ++ .set_default_key = wl_cfg80211_config_default_key, ++ .set_default_mgmt_key = wl_cfg80211_config_default_mgmt_key, ++ .set_power_mgmt = wl_cfg80211_set_power_mgmt, ++ .connect = wl_cfg80211_connect, ++ .disconnect = wl_cfg80211_disconnect, ++ .suspend = wl_cfg80211_suspend, ++ .resume = wl_cfg80211_resume, ++ .set_pmksa = wl_cfg80211_set_pmksa, ++ .del_pmksa = wl_cfg80211_del_pmksa, ++ .flush_pmksa = wl_cfg80211_flush_pmksa, ++ .remain_on_channel = wl_cfg80211_remain_on_channel, ++ .cancel_remain_on_channel = wl_cfg80211_cancel_remain_on_channel, ++ .mgmt_tx = wl_cfg80211_mgmt_tx, ++ .mgmt_frame_register = wl_cfg80211_mgmt_frame_register, ++ .change_bss = wl_cfg80211_change_bss, ++ .set_channel = wl_cfg80211_set_channel, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) ++ .set_beacon = wl_cfg80211_add_set_beacon, ++ .add_beacon = wl_cfg80211_add_set_beacon, ++#else ++ .change_beacon = wl_cfg80211_change_beacon, ++ .start_ap = wl_cfg80211_start_ap, ++ .stop_ap = wl_cfg80211_stop_ap, ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0) */ ++#ifdef WL_SCHED_SCAN ++ .sched_scan_start = wl_cfg80211_sched_scan_start, ++ .sched_scan_stop = wl_cfg80211_sched_scan_stop, ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) */ ++#if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ ++ 2, 0)) ++ .del_station = wl_cfg80211_del_station, ++ .mgmt_tx_cancel_wait = wl_cfg80211_mgmt_tx_cancel_wait, ++#endif /* WL_SUPPORT_BACKPORTED_KPATCHES || KERNEL_VERSION >= (3,2,0) */ ++}; ++ ++s32 wl_mode_to_nl80211_iftype(s32 mode) ++{ ++ s32 err = 0; ++ ++ switch (mode) { ++ case WL_MODE_BSS: ++ return NL80211_IFTYPE_STATION; ++ case WL_MODE_IBSS: ++ return NL80211_IFTYPE_ADHOC; ++ case WL_MODE_AP: ++ return NL80211_IFTYPE_AP; ++ default: ++ return NL80211_IFTYPE_UNSPECIFIED; ++ } ++ ++ return err; ++} ++ ++static int ++wl_cfg80211_reg_notifier( ++ struct wiphy *wiphy, ++ struct regulatory_request *request) ++{ ++ struct wl_priv *wl = (struct wl_priv *)wiphy_priv(wiphy); ++ wl_country_t cspec = {{0}, 0, {0} }; ++ int ret = 0; ++ ++ if (!request || !wl) { ++ AP6210_ERR("Invalid arg\n"); ++ return -EINVAL; ++ } ++ ++ AP6210_DEBUG("ccode: %c%c Initiator: %d\n", ++ request->alpha2[0], request->alpha2[1], request->initiator); ++ ++ /* We support only REGDOM_SET_BY_USER as of now */ ++ if (request->initiator != NL80211_REGDOM_SET_BY_USER) { ++ AP6210_ERR("reg_notifier for intiator:%d not supported \n", ++ request->initiator); ++ return -ENOTSUPP; ++ } ++ ++ if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { ++ /* world domain */ ++ AP6210_ERR("World domain. Setting XY/4 \n"); ++ strncpy(cspec.country_abbrev, "XY", strlen("XY")); ++ cspec.rev = 4; ++ } else { ++ memcpy(cspec.country_abbrev, request->alpha2, 2); ++ cspec.country_abbrev[3] = '\0'; ++ cspec.rev = -1; /* Unspecified */ ++ } ++ ++ if ((ret = wldev_iovar_setbuf(wl_to_prmry_ndev(wl), "country", (char *)&cspec, ++ sizeof(cspec), wl->ioctl_buf, WLC_IOCTL_SMLEN, NULL)) < 0) { ++ AP6210_ERR("set country Failed :%d\n", ret); ++ goto exit; ++ } ++ ++ if ((ret = wl_update_wiphybands(wl, false)) < 0) { ++ AP6210_ERR("wl_update_wiphybands failed\n"); ++ goto exit; ++ } ++ ++ AP6210_DEBUG("%s: set country '%s/%d' done\n", ++ __FUNCTION__, cspec.country_abbrev, cspec.rev); ++ ++exit: ++ return ret; ++} ++ ++static s32 wl_setup_wiphy(struct wireless_dev *wdev, struct device *sdiofunc_dev) ++{ ++ s32 err = 0; ++ wdev->wiphy = ++ wiphy_new(&wl_cfg80211_ops, sizeof(struct wl_priv)); ++ if (unlikely(!wdev->wiphy)) { ++ AP6210_ERR("Couldn not allocate wiphy device\n"); ++ err = -ENOMEM; ++ return err; ++ } ++ set_wiphy_dev(wdev->wiphy, sdiofunc_dev); ++ wdev->wiphy->max_scan_ie_len = WL_SCAN_IE_LEN_MAX; ++ /* Report how many SSIDs Driver can support per Scan request */ ++ wdev->wiphy->max_scan_ssids = WL_SCAN_PARAMS_SSID_MAX; ++ wdev->wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX; ++#ifdef WL_SCHED_SCAN ++ wdev->wiphy->max_sched_scan_ssids = MAX_PFN_LIST_COUNT; ++ wdev->wiphy->max_match_sets = MAX_PFN_LIST_COUNT; ++ wdev->wiphy->max_sched_scan_ie_len = WL_SCAN_IE_LEN_MAX; ++ wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; ++#endif /* WL_SCHED_SCAN */ ++ wdev->wiphy->interface_modes = ++ BIT(NL80211_IFTYPE_STATION) ++#if !(defined(WLP2P) && defined(WL_ENABLE_P2P_IF)) ++ | BIT(NL80211_IFTYPE_MONITOR) ++#endif ++ | BIT(NL80211_IFTYPE_AP); ++ ++ wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; ++ ++ wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; ++ wdev->wiphy->cipher_suites = __wl_cipher_suites; ++ wdev->wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites); ++ wdev->wiphy->max_remain_on_channel_duration = 5000; ++ wdev->wiphy->mgmt_stypes = wl_cfg80211_default_mgmt_stypes; ++#ifndef WL_POWERSAVE_DISABLED ++ wdev->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; ++#else ++ wdev->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; ++#endif /* !WL_POWERSAVE_DISABLED */ ++ wdev->wiphy->flags |= WIPHY_FLAG_NETNS_OK | ++ WIPHY_FLAG_4ADDR_AP | ++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39) ++ WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS | ++#endif ++ WIPHY_FLAG_4ADDR_STATION; ++ /* If driver advertises FW_ROAM, the supplicant wouldn't ++ * send the BSSID & Freq in the connect command allowing the ++ * the driver to choose the AP to connect to. But unless we ++ * support ROAM_CACHE in firware this will delay the ASSOC as ++ * as the FW need to do a full scan before attempting to connect ++ * So that feature will just increase assoc. The better approach ++ * to let Supplicant to provide channel info and FW letter may roam ++ * if needed so DON'T advertise that featur eto Supplicant. ++ */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) ++ /* wdev->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; */ ++#endif ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) ++ wdev->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | ++ WIPHY_FLAG_OFFCHAN_TX; ++#endif ++#if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ ++ 4, 0)) ++ /* From 3.4 kernel ownards AP_SME flag can be advertised ++ * to remove the patch from supplicant ++ */ ++ wdev->wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; ++#endif ++ ++ wdev->wiphy->reg_notifier = wl_cfg80211_reg_notifier; ++ ++ AP6210_DEBUG("Registering custom regulatory)\n"); ++ wdev->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; ++ wiphy_apply_custom_regulatory(wdev->wiphy, &brcm_regdom); ++ /* Now we can register wiphy with cfg80211 module */ ++ err = wiphy_register(wdev->wiphy); ++ if (unlikely(err < 0)) { ++ AP6210_ERR("Couldn not register wiphy device (%d)\n", err); ++ wiphy_free(wdev->wiphy); ++ } ++ return err; ++} ++ ++static void wl_free_wdev(struct wl_priv *wl) ++{ ++ struct wireless_dev *wdev = wl->wdev; ++ struct wiphy *wiphy; ++ if (!wdev) { ++ AP6210_ERR("wdev is invalid\n"); ++ return; ++ } ++ wiphy = wdev->wiphy; ++ wiphy_unregister(wdev->wiphy); ++ wdev->wiphy->dev.parent = NULL; ++ ++ wl_delete_all_netinfo(wl); ++ wiphy_free(wiphy); ++ /* PLEASE do NOT call any function after wiphy_free, the driver's private structure "wl", ++ * which is the private part of wiphy, has been freed in wiphy_free !!!!!!!!!!! ++ */ ++} ++ ++#if defined(RSSIAVG) ++static wl_rssi_cache_ctrl_t g_rssi_cache_ctrl; ++#endif ++#if defined(BSSCACHE) ++static wl_bss_cache_ctrl_t g_bss_cache_ctrl; ++#endif ++ ++static s32 wl_inform_bss(struct wl_priv *wl) ++{ ++ struct wl_scan_results *bss_list; ++ struct wl_bss_info *bi = NULL; /* must be initialized */ ++ s32 err = 0; ++ s32 i; ++#if defined(RSSIAVG) ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++#endif ++#if defined(BSSCACHE) ++ wl_bss_cache_t *node; ++#endif ++ ++ bss_list = wl->bss_list; ++#if defined(BSSCACHE) ++ if (g_bss_cache_ctrl.m_timer_expired || (p2p_is_on(wl) && p2p_scan(wl))) { ++#if defined(RSSIAVG) ++ wl_free_rssi_cache(&g_rssi_cache_ctrl); ++#endif ++ wl_free_bss_cache(&g_bss_cache_ctrl); ++ g_bss_cache_ctrl.m_timer_expired ^= 1; ++ } ++ wl_update_bss_cache(&g_bss_cache_ctrl, bss_list); ++ wl_delete_dirty_bss_cache(&g_bss_cache_ctrl); ++ wl_reset_bss_cache(&g_bss_cache_ctrl); ++#endif ++ ++#if defined(RSSIAVG) ++#if defined(BSSCACHE) ++ node = g_bss_cache_ctrl.m_cache_head; ++ for (;node;) { ++ wl_update_rssi_cache(&g_rssi_cache_ctrl, &node->results); ++ node = node->next; ++ } ++#else ++ wl_update_rssi_cache(&g_rssi_cache_ctrl, bss_list); ++#endif ++ if (!in_atomic()) ++ wl_update_connected_rssi_cache(&g_rssi_cache_ctrl, ndev); ++ wl_delete_dirty_rssi_cache(&g_rssi_cache_ctrl); ++ wl_reset_rssi_cache(&g_rssi_cache_ctrl); ++#endif ++ ++ AP6210_DEBUG("scanned AP count (%d)\n", bss_list->count); ++ ++#if defined(BSSCACHE) ++ node = g_bss_cache_ctrl.m_cache_head; ++ for (i=0; node && iresults.bss_info; ++ err = wl_inform_single_bss(wl, bi, 0); ++ if (unlikely(err)) ++ break; ++ node = node->next; ++ } ++ wl_run_bss_cache_timer(&g_bss_cache_ctrl, 0); ++ wl_run_bss_cache_timer(&g_bss_cache_ctrl, 1); ++#else ++ bi = next_bss(bss_list, bi); ++ for_each_bss(bss_list, bi, i) { ++ err = wl_inform_single_bss(wl, bi, 0); ++ if (unlikely(err)) ++ break; ++ } ++#endif ++ return err; ++} ++ ++static s32 wl_inform_single_bss(struct wl_priv *wl, struct wl_bss_info *bi, u8 is_roam_done) ++{ ++ struct wiphy *wiphy = wl_to_wiphy(wl); ++ struct ieee80211_mgmt *mgmt; ++ struct ieee80211_channel *channel; ++ struct ieee80211_supported_band *band; ++ struct wl_cfg80211_bss_info *notif_bss_info; ++ struct wl_scan_req *sr = wl_to_sr(wl); ++ struct beacon_proberesp *beacon_proberesp; ++ struct cfg80211_bss *cbss = NULL; ++ s32 mgmt_type; ++ s32 signal; ++ u32 freq; ++ s32 err = 0; ++ gfp_t aflags; ++ u8 *ie_offset = NULL; ++ ++ if (unlikely(dtoh32(bi->length) > WL_BSS_INFO_MAX)) { ++ AP6210_DEBUG("Beacon is larger than buffer. Discarding\n"); ++ return err; ++ } ++ aflags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; ++ notif_bss_info = kzalloc(sizeof(*notif_bss_info) + sizeof(*mgmt) ++ - sizeof(u8) + WL_BSS_INFO_MAX, aflags); ++ if (unlikely(!notif_bss_info)) { ++ AP6210_ERR("notif_bss_info alloc failed\n"); ++ return -ENOMEM; ++ } ++ mgmt = (struct ieee80211_mgmt *)notif_bss_info->frame_buf; ++ notif_bss_info->channel = ++ bi->ctl_ch ? bi->ctl_ch : CHSPEC_CHANNEL(wl_chspec_driver_to_host(bi->chanspec)); ++ ++ if (notif_bss_info->channel <= CH_MAX_2G_CHANNEL) ++ band = wiphy->bands[IEEE80211_BAND_2GHZ]; ++ else ++ band = wiphy->bands[IEEE80211_BAND_5GHZ]; ++ if (!band) { ++ AP6210_ERR("No valid band"); ++ kfree(notif_bss_info); ++ return -EINVAL; ++ } ++ notif_bss_info->rssi = dtoh16(bi->RSSI); ++#if defined(RSSIAVG) ++ notif_bss_info->rssi = wl_get_avg_rssi(&g_rssi_cache_ctrl, &bi->BSSID); ++#endif ++#if defined(RSSIOFFSET) ++ notif_bss_info->rssi = wl_update_rssi_offset(notif_bss_info->rssi); ++#endif ++ memcpy(mgmt->bssid, &bi->BSSID, ETHER_ADDR_LEN); ++ mgmt_type = wl->active_scan ? ++ IEEE80211_STYPE_PROBE_RESP : IEEE80211_STYPE_BEACON; ++ if (!memcmp(bi->SSID, sr->ssid.SSID, bi->SSID_len)) { ++ mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | mgmt_type); ++ } ++ beacon_proberesp = wl->active_scan ? ++ (struct beacon_proberesp *)&mgmt->u.probe_resp : ++ (struct beacon_proberesp *)&mgmt->u.beacon; ++ beacon_proberesp->timestamp = 0; ++ beacon_proberesp->beacon_int = cpu_to_le16(bi->beacon_period); ++ beacon_proberesp->capab_info = cpu_to_le16(bi->capability); ++ wl_rst_ie(wl); ++ ++ ie_offset = ((u8 *) bi) + bi->ie_offset; ++ ++ if (is_roam_done && ((int)(*(ie_offset)) == WLAN_EID_SSID && ++ ((int)(*(ie_offset+1)) == 0 || (int)(*(ie_offset+2)) == 0))) { ++ u8 *ie_new_offset = NULL; ++ uint8 ie_new_length; ++ ++ AP6210_ERR("WAR trace: Changing the SSID Info, from beacon %d\n", ++ bi->flags & WL_BSS_FLAGS_FROM_BEACON); ++ ++ ie_new_offset = (u8 *)kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); ++ if (ie_new_offset) { ++ *(ie_new_offset) = WLAN_EID_SSID; ++ *(ie_new_offset+1) = bi->SSID_len; ++ memcpy(ie_new_offset+2, bi->SSID, bi->SSID_len); ++ ie_new_length = bi->ie_length - *(ie_offset+1) + bi->SSID_len; ++ ++ /* Copy the remaining IE apart from SSID IE from bi */ ++ memcpy(ie_new_offset+2 + bi->SSID_len, ++ ie_offset+2 + *(ie_offset+1), ++ bi->ie_length - 2 - *(ie_offset+1)); ++ wl_mrg_ie(wl, ie_new_offset, ie_new_length); ++ kfree(ie_new_offset); ++ } else { ++ wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); ++ } ++ } else { ++ wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length); ++ } ++ ++ wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX - ++ offsetof(struct wl_cfg80211_bss_info, frame_buf)); ++ notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, ++ u.beacon.variable) + wl_get_ielen(wl); ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) ++ freq = ieee80211_channel_to_frequency(notif_bss_info->channel); ++ (void)band->band; ++#else ++ freq = ieee80211_channel_to_frequency(notif_bss_info->channel, band->band); ++#endif ++ if (freq == 0) { ++ AP6210_ERR("Invalid channel, fail to chcnage channel to freq\n"); ++ kfree(notif_bss_info); ++ return -EINVAL; ++ } ++ channel = ieee80211_get_channel(wiphy, freq); ++ if (unlikely(!channel)) { ++ AP6210_ERR("ieee80211_get_channel error\n"); ++ kfree(notif_bss_info); ++ return -EINVAL; ++ } ++ AP6210_DEBUG("BSSID %pM, channel %d, rssi %d, capability 0x04%x, mgmt_type %d, " ++ "frame_len %d, SSID \"%s\"\n", &bi->BSSID, notif_bss_info->channel, ++ notif_bss_info->rssi, mgmt->u.beacon.capab_info, mgmt_type, ++ notif_bss_info->frame_len, bi->SSID); ++ ++ signal = notif_bss_info->rssi * 100; ++ if (!mgmt->u.probe_resp.timestamp) { ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) ++ struct timespec ts; ++ get_monotonic_boottime(&ts); ++ mgmt->u.probe_resp.timestamp = ((u64)ts.tv_sec*1000000) ++ + ts.tv_nsec / 1000; ++#else ++ struct timeval tv; ++ do_gettimeofday(&tv); ++ mgmt->u.probe_resp.timestamp = ((u64)tv.tv_sec*1000000) ++ + tv.tv_usec; ++#endif ++ } ++ ++ cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt, ++ le16_to_cpu(notif_bss_info->frame_len), signal, aflags); ++ if (unlikely(!cbss)) { ++ AP6210_ERR("cfg80211_inform_bss_frame error\n"); ++ kfree(notif_bss_info); ++ return -EINVAL; ++ } ++ ++ cfg80211_put_bss(cbss); ++ kfree(notif_bss_info); ++ return err; ++} ++ ++static bool wl_is_linkup(struct wl_priv *wl, const wl_event_msg_t *e, struct net_device *ndev) ++{ ++ u32 event = ntoh32(e->event_type); ++ u32 status = ntoh32(e->status); ++ u16 flags = ntoh16(e->flags); ++ ++ AP6210_DEBUG("event %d, status %d flags %x\n", event, status, flags); ++ if (event == WLC_E_SET_SSID) { ++ if (status == WLC_E_STATUS_SUCCESS) { ++ if (!wl_is_ibssmode(wl, ndev)) ++ return true; ++ } ++ } else if (event == WLC_E_LINK) { ++ if (flags & WLC_EVENT_MSG_LINK) ++ return true; ++ } ++ ++ AP6210_DEBUG("wl_is_linkup false\n"); ++ return false; ++} ++ ++static bool wl_is_linkdown(struct wl_priv *wl, const wl_event_msg_t *e) ++{ ++ u32 event = ntoh32(e->event_type); ++ u16 flags = ntoh16(e->flags); ++ ++ if (event == WLC_E_DEAUTH_IND || ++ event == WLC_E_DISASSOC_IND || ++ event == WLC_E_DISASSOC || ++ event == WLC_E_DEAUTH) { ++#if (WL_DBG_LEVEL > 0) ++ AP6210_ERR("Link down Reason : WLC_E_%s\n", wl_dbg_estr[event]); ++#endif /* (WL_DBG_LEVEL > 0) */ ++ return true; ++ } else if (event == WLC_E_LINK) { ++ if (!(flags & WLC_EVENT_MSG_LINK)) { ++#if (WL_DBG_LEVEL > 0) ++ AP6210_ERR("Link down Reason : WLC_E_%s\n", wl_dbg_estr[event]); ++#endif /* (WL_DBG_LEVEL > 0) */ ++ return true; ++ } ++ } ++ ++ return false; ++} ++ ++static bool wl_is_nonetwork(struct wl_priv *wl, const wl_event_msg_t *e) ++{ ++ u32 event = ntoh32(e->event_type); ++ u32 status = ntoh32(e->status); ++ ++ if (event == WLC_E_LINK && status == WLC_E_STATUS_NO_NETWORKS) ++ return true; ++ if (event == WLC_E_SET_SSID && status != WLC_E_STATUS_SUCCESS) ++ return true; ++ ++ return false; ++} ++ ++/* The mainline kernel >= 3.2.0 has support for indicating new/del station ++ * to AP/P2P GO via events. If this change is backported to kernel for which ++ * this driver is being built, then define WL_CFG80211_STA_EVENT. You ++ * should use this new/del sta event mechanism for BRCM supplicant >= 22. ++ */ ++static s32 ++wl_notify_connect_status_ap(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ s32 err = 0; ++ u32 event = ntoh32(e->event_type); ++ u32 reason = ntoh32(e->reason); ++ u32 len = ntoh32(e->datalen); ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) ++ bool isfree = false; ++ u8 *mgmt_frame; ++ u8 bsscfgidx = e->bsscfgidx; ++ s32 freq; ++ s32 channel; ++ u8 *body = NULL; ++ u16 fc = 0; ++ ++ struct ieee80211_supported_band *band; ++ struct ether_addr da; ++ struct ether_addr bssid; ++ struct wiphy *wiphy = wl_to_wiphy(wl); ++ channel_info_t ci; ++#else ++ struct station_info sinfo; ++#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !WL_CFG80211_STA_EVENT */ ++ ++ AP6210_DEBUG("event %d status %d reason %d\n", event, ntoh32(e->status), reason); ++ /* if link down, bsscfg is disabled. */ ++ if (event == WLC_E_LINK && reason == WLC_E_LINK_BSSCFG_DIS && ++ wl_get_p2p_status(wl, IF_DELETING) && (ndev != wl_to_prmry_ndev(wl))) { ++ wl_add_remove_eventmsg(ndev, WLC_E_PROBREQ_MSG, false); ++ AP6210_DEBUG("AP mode link down !! \n"); ++ complete(&wl->iface_disable); ++ return 0; ++ } ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) && !defined(WL_CFG80211_STA_EVENT) ++ AP6210_DEBUG("Enter \n"); ++ if (!len && (event == WLC_E_DEAUTH)) { ++ len = 2; /* reason code field */ ++ data = &reason; ++ } ++ if (len) { ++ body = kzalloc(len, GFP_KERNEL); ++ ++ if (body == NULL) { ++ AP6210_ERR("wl_notify_connect_status: Failed to allocate body\n"); ++ return WL_INVALID; ++ } ++ } ++ memset(&bssid, 0, ETHER_ADDR_LEN); ++ AP6210_DEBUG("Enter event %d ndev %p\n", event, ndev); ++ if (wl_get_mode_by_netdev(wl, ndev) == WL_INVALID) { ++ kfree(body); ++ return WL_INVALID; ++ } ++ if (len) ++ memcpy(body, data, len); ++ ++ wldev_iovar_getbuf_bsscfg(ndev, "cur_etheraddr", ++ NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &wl->ioctl_buf_sync); ++ memcpy(da.octet, wl->ioctl_buf, ETHER_ADDR_LEN); ++ err = wldev_ioctl(ndev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); ++ switch (event) { ++ case WLC_E_ASSOC_IND: ++ fc = FC_ASSOC_REQ; ++ break; ++ case WLC_E_REASSOC_IND: ++ fc = FC_REASSOC_REQ; ++ break; ++ case WLC_E_DISASSOC_IND: ++ fc = FC_DISASSOC; ++ break; ++ case WLC_E_DEAUTH_IND: ++ fc = FC_DISASSOC; ++ break; ++ case WLC_E_DEAUTH: ++ fc = FC_DISASSOC; ++ break; ++ default: ++ fc = 0; ++ goto exit; ++ } ++ if ((err = wldev_ioctl(ndev, WLC_GET_CHANNEL, &ci, sizeof(ci), false))) { ++ kfree(body); ++ return err; ++ } ++ ++ channel = dtoh32(ci.hw_channel); ++ if (channel <= CH_MAX_2G_CHANNEL) ++ band = wiphy->bands[IEEE80211_BAND_2GHZ]; ++ else ++ band = wiphy->bands[IEEE80211_BAND_5GHZ]; ++ if (!band) { ++ AP6210_ERR("No valid band"); ++ if (body) ++ kfree(body); ++ return -EINVAL; ++ } ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) ++ freq = ieee80211_channel_to_frequency(channel); ++ (void)band->band; ++#else ++ freq = ieee80211_channel_to_frequency(channel, band->band); ++#endif ++ ++ err = wl_frame_get_mgmt(fc, &da, &e->addr, &bssid, ++ &mgmt_frame, &len, body); ++ if (err < 0) ++ goto exit; ++ isfree = true; ++ ++ if (event == WLC_E_ASSOC_IND && reason == DOT11_SC_SUCCESS) { ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++ cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); ++#else ++ cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ ++ } else if (event == WLC_E_DISASSOC_IND) { ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++ cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); ++#else ++ cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ ++ } else if ((event == WLC_E_DEAUTH_IND) || (event == WLC_E_DEAUTH)) { ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++ cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, len, GFP_ATOMIC); ++#else ++ cfg80211_rx_mgmt(ndev, freq, mgmt_frame, len, GFP_ATOMIC); ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ ++ } ++ ++exit: ++ if (isfree) ++ kfree(mgmt_frame); ++ if (body) ++ kfree(body); ++ return err; ++#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !WL_CFG80211_STA_EVENT */ ++ sinfo.filled = 0; ++ if (((event == WLC_E_ASSOC_IND) || (event == WLC_E_REASSOC_IND)) && ++ reason == DOT11_SC_SUCCESS) { ++ sinfo.filled = STATION_INFO_ASSOC_REQ_IES; ++ if (!data) { ++ AP6210_ERR("No IEs present in ASSOC/REASSOC_IND"); ++ return -EINVAL; ++ } ++ sinfo.assoc_req_ies = data; ++ sinfo.assoc_req_ies_len = len; ++ cfg80211_new_sta(ndev, e->addr.octet, &sinfo, GFP_ATOMIC); ++ } else if (event == WLC_E_DISASSOC_IND) { ++ cfg80211_del_sta(ndev, e->addr.octet, GFP_ATOMIC); ++ } else if ((event == WLC_E_DEAUTH_IND) || (event == WLC_E_DEAUTH)) { ++ cfg80211_del_sta(ndev, e->addr.octet, GFP_ATOMIC); ++ } ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0) && !WL_CFG80211_STA_EVENT */ ++ return err; ++} ++ ++static s32 ++wl_get_auth_assoc_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e) ++{ ++ u32 reason = ntoh32(e->reason); ++ u32 event = ntoh32(e->event_type); ++ struct wl_security *sec = wl_read_prof(wl, ndev, WL_PROF_SEC); ++ AP6210_DEBUG("event type : %d, reason : %d\n", event, reason); ++ if (sec) { ++ switch (event) { ++ case WLC_E_ASSOC: ++ case WLC_E_AUTH: ++ sec->auth_assoc_res_status = reason; ++ default: ++ break; ++ } ++ } else ++ AP6210_ERR("sec is NULL\n"); ++ return 0; ++} ++ ++static s32 ++wl_notify_connect_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ bool act; ++ s32 err = 0; ++ u32 event = ntoh32(e->event_type); ++ ++ if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_AP) { ++ wl_notify_connect_status_ap(wl, ndev, e, data); ++ } else { ++ AP6210_DEBUG("wl_notify_connect_status : event %d status : %d ndev %p\n", ++ ntoh32(e->event_type), ntoh32(e->status), ndev); ++ if (event == WLC_E_ASSOC || event == WLC_E_AUTH) { ++ wl_get_auth_assoc_status(wl, ndev, e); ++ return err; ++ } ++ if (wl_is_linkup(wl, e, ndev)) { ++ wl_link_up(wl); ++ act = true; ++ if (wl_is_ibssmode(wl, ndev)) { ++ AP6210_DEBUG("cfg80211_ibss_joined\n"); ++ cfg80211_ibss_joined(ndev, (s8 *)&e->addr, ++ GFP_KERNEL); ++ AP6210_DEBUG("joined in IBSS network\n"); ++ } else { ++ if (!wl_get_drv_status(wl, DISCONNECTING, ndev)) { ++ AP6210_DEBUG("wl_bss_connect_done succeeded with " MACDBG "\n", ++ MAC2STRDBG((u8*)(&e->addr))); ++ wl_bss_connect_done(wl, ndev, e, data, true); ++ AP6210_DEBUG("joined in BSS network \"%s\"\n", ++ ((struct wlc_ssid *) ++ wl_read_prof(wl, ndev, WL_PROF_SSID))->SSID); ++ } ++ } ++ wl_update_prof(wl, ndev, e, &act, WL_PROF_ACT); ++ wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID); ++ ++ } else if (wl_is_linkdown(wl, e)) { ++ if (wl->scan_request) { ++ if (wl->escan_on) { ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } else { ++ del_timer_sync(&wl->scan_timeout); ++ wl_iscan_aborted(wl); ++ } ++ } ++ if (wl_get_drv_status(wl, CONNECTED, ndev)) { ++ scb_val_t scbval; ++ u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); ++ s32 reason = 0; ++ if (event == WLC_E_DEAUTH_IND || event == WLC_E_DISASSOC_IND) ++ reason = ntoh32(e->reason); ++ /* WLAN_REASON_UNSPECIFIED is used for hang up event in Android */ ++ reason = (reason == WLAN_REASON_UNSPECIFIED)? 0 : reason; ++ ++ AP6210_DEBUG("link down if %s may call cfg80211_disconnected. " ++ "event : %d, reason=%d from " MACDBG "\n", ++ ndev->name, event, ntoh32(e->reason), ++ MAC2STRDBG((u8*)(&e->addr))); ++ if (memcmp(curbssid, &e->addr, ETHER_ADDR_LEN) != 0) { ++ AP6210_ERR("BSSID of event is not the connected BSSID" ++ "(ignore it) cur: " MACDBG " event: " MACDBG"\n", ++ MAC2STRDBG(curbssid), MAC2STRDBG((u8*)(&e->addr))); ++ return 0; ++ } ++ wl_clr_drv_status(wl, CONNECTED, ndev); ++ if (! wl_get_drv_status(wl, DISCONNECTING, ndev)) { ++ /* To make sure disconnect, explictly send dissassoc ++ * for BSSID 00:00:00:00:00:00 issue ++ */ ++ scbval.val = WLAN_REASON_DEAUTH_LEAVING; ++ ++ memcpy(&scbval.ea, curbssid, ETHER_ADDR_LEN); ++ scbval.val = htod32(scbval.val); ++ err = wldev_ioctl(ndev, WLC_DISASSOC, &scbval, ++ sizeof(scb_val_t), true); ++ if (err < 0) { ++ AP6210_ERR("WLC_DISASSOC error %d\n", err); ++ err = 0; ++ } ++ cfg80211_disconnected(ndev, reason, NULL, 0, GFP_KERNEL); ++ wl_link_down(wl); ++ wl_init_prof(wl, ndev); ++ } ++ } ++ else if (wl_get_drv_status(wl, CONNECTING, ndev)) { ++ AP6210_DEBUG("link down, during connecting\n"); ++#ifdef ESCAN_RESULT_PATCH ++ if ((memcmp(connect_req_bssid, broad_bssid, ETHER_ADDR_LEN) == 0) || ++ (memcmp(&e->addr, broad_bssid, ETHER_ADDR_LEN) == 0) || ++ (memcmp(&e->addr, connect_req_bssid, ETHER_ADDR_LEN) == 0)) ++ /* In case this event comes while associating another AP */ ++#endif /* ESCAN_RESULT_PATCH */ ++ wl_bss_connect_done(wl, ndev, e, data, false); ++ } ++ wl_clr_drv_status(wl, DISCONNECTING, ndev); ++ ++ /* if link down, bsscfg is diabled */ ++ if (ndev != wl_to_prmry_ndev(wl)) ++ complete(&wl->iface_disable); ++ ++ } else if (wl_is_nonetwork(wl, e)) { ++ AP6210_DEBUG("connect failed event=%d e->status %d e->reason %d \n", ++ event, (int)ntoh32(e->status), (int)ntoh32(e->reason)); ++ /* Clean up any pending scan request */ ++ if (wl->scan_request) { ++ if (wl->escan_on) { ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } else { ++ del_timer_sync(&wl->scan_timeout); ++ wl_iscan_aborted(wl); ++ } ++ } ++ if (wl_get_drv_status(wl, CONNECTING, ndev)) ++ wl_bss_connect_done(wl, ndev, e, data, false); ++ } else { ++ AP6210_DEBUG("%s nothing\n", __FUNCTION__); ++ } ++ } ++ return err; ++} ++ ++static s32 ++wl_notify_roaming_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ bool act; ++ s32 err = 0; ++ u32 event = be32_to_cpu(e->event_type); ++ u32 status = be32_to_cpu(e->status); ++ AP6210_DEBUG("Enter \n"); ++ if (event == WLC_E_ROAM && status == WLC_E_STATUS_SUCCESS) { ++ if (wl_get_drv_status(wl, CONNECTED, ndev)) ++ wl_bss_roaming_done(wl, ndev, e, data); ++ else ++ wl_bss_connect_done(wl, ndev, e, data, true); ++ act = true; ++ wl_update_prof(wl, ndev, e, &act, WL_PROF_ACT); ++ wl_update_prof(wl, ndev, NULL, (void *)&e->addr, WL_PROF_BSSID); ++ } ++ return err; ++} ++ ++static s32 wl_get_assoc_ies(struct wl_priv *wl, struct net_device *ndev) ++{ ++ wl_assoc_info_t assoc_info; ++ struct wl_connect_info *conn_info = wl_to_conn(wl); ++ s32 err = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ err = wldev_iovar_getbuf(ndev, "assoc_info", NULL, 0, wl->extra_buf, ++ WL_ASSOC_INFO_MAX, NULL); ++ if (unlikely(err)) { ++ AP6210_ERR("could not get assoc info (%d)\n", err); ++ return err; ++ } ++ memcpy(&assoc_info, wl->extra_buf, sizeof(wl_assoc_info_t)); ++ assoc_info.req_len = htod32(assoc_info.req_len); ++ assoc_info.resp_len = htod32(assoc_info.resp_len); ++ assoc_info.flags = htod32(assoc_info.flags); ++ if (conn_info->req_ie_len) { ++ conn_info->req_ie_len = 0; ++ bzero(conn_info->req_ie, sizeof(conn_info->req_ie)); ++ } ++ if (conn_info->resp_ie_len) { ++ conn_info->resp_ie_len = 0; ++ bzero(conn_info->resp_ie, sizeof(conn_info->resp_ie)); ++ } ++ if (assoc_info.req_len) { ++ err = wldev_iovar_getbuf(ndev, "assoc_req_ies", NULL, 0, wl->extra_buf, ++ WL_ASSOC_INFO_MAX, NULL); ++ if (unlikely(err)) { ++ AP6210_ERR("could not get assoc req (%d)\n", err); ++ return err; ++ } ++ conn_info->req_ie_len = assoc_info.req_len - sizeof(struct dot11_assoc_req); ++ if (assoc_info.flags & WLC_ASSOC_REQ_IS_REASSOC) { ++ conn_info->req_ie_len -= ETHER_ADDR_LEN; ++ } ++ if (conn_info->req_ie_len <= MAX_REQ_LINE) ++ memcpy(conn_info->req_ie, wl->extra_buf, conn_info->req_ie_len); ++ else { ++ AP6210_ERR("%s IE size %d above max %d size \n", ++ __FUNCTION__, conn_info->req_ie_len, MAX_REQ_LINE); ++ return err; ++ } ++ } else { ++ conn_info->req_ie_len = 0; ++ } ++ if (assoc_info.resp_len) { ++ err = wldev_iovar_getbuf(ndev, "assoc_resp_ies", NULL, 0, wl->extra_buf, ++ WL_ASSOC_INFO_MAX, NULL); ++ if (unlikely(err)) { ++ AP6210_ERR("could not get assoc resp (%d)\n", err); ++ return err; ++ } ++ conn_info->resp_ie_len = assoc_info.resp_len -sizeof(struct dot11_assoc_resp); ++ if (conn_info->resp_ie_len <= MAX_REQ_LINE) ++ memcpy(conn_info->resp_ie, wl->extra_buf, conn_info->resp_ie_len); ++ else { ++ AP6210_ERR("%s IE size %d above max %d size \n", ++ __FUNCTION__, conn_info->resp_ie_len, MAX_REQ_LINE); ++ return err; ++ } ++ } else { ++ conn_info->resp_ie_len = 0; ++ } ++ AP6210_DEBUG("req len (%d) resp len (%d)\n", conn_info->req_ie_len, ++ conn_info->resp_ie_len); ++ ++ return err; ++} ++ ++static void wl_ch_to_chanspec(int ch, struct wl_join_params *join_params, ++ size_t *join_params_size) ++{ ++ chanspec_t chanspec = 0; ++ if (ch != 0) { ++ join_params->params.chanspec_num = 1; ++ join_params->params.chanspec_list[0] = ch; ++ ++ if (join_params->params.chanspec_list[0] <= CH_MAX_2G_CHANNEL) ++ chanspec |= WL_CHANSPEC_BAND_2G; ++ else ++ chanspec |= WL_CHANSPEC_BAND_5G; ++ ++ chanspec |= WL_CHANSPEC_BW_20; ++ chanspec |= WL_CHANSPEC_CTL_SB_NONE; ++ ++ *join_params_size += WL_ASSOC_PARAMS_FIXED_SIZE + ++ join_params->params.chanspec_num * sizeof(chanspec_t); ++ ++ join_params->params.chanspec_list[0] &= WL_CHANSPEC_CHAN_MASK; ++ join_params->params.chanspec_list[0] |= chanspec; ++ join_params->params.chanspec_list[0] = ++ wl_chspec_host_to_driver(join_params->params.chanspec_list[0]); ++ ++ join_params->params.chanspec_num = ++ htod32(join_params->params.chanspec_num); ++ AP6210_DEBUG("join_params->params.chanspec_list[0]= %X, %d channels\n", ++ join_params->params.chanspec_list[0], ++ join_params->params.chanspec_num); ++ } ++} ++ ++static s32 wl_update_bss_info(struct wl_priv *wl, struct net_device *ndev, u8 is_roam_done) ++{ ++ struct cfg80211_bss *bss; ++ struct wl_bss_info *bi; ++ struct wlc_ssid *ssid; ++ struct bcm_tlv *tim; ++ s32 beacon_interval; ++ s32 dtim_period; ++ size_t ie_len; ++ u8 *ie; ++ u8 *ssidie; ++ u8 *curbssid; ++ s32 err = 0; ++ struct wiphy *wiphy; ++ ++ wiphy = wl_to_wiphy(wl); ++ ++ if (wl_is_ibssmode(wl, ndev)) ++ return err; ++ ++ ssid = (struct wlc_ssid *)wl_read_prof(wl, ndev, WL_PROF_SSID); ++ curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); ++ bss = cfg80211_get_bss(wiphy, NULL, curbssid, ++ ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, ++ WLAN_CAPABILITY_ESS); ++ ++ mutex_lock(&wl->usr_sync); ++ if (!bss) { ++ AP6210_DEBUG("Could not find the AP\n"); ++ *(u32 *) wl->extra_buf = htod32(WL_EXTRA_BUF_MAX); ++ err = wldev_ioctl(ndev, WLC_GET_BSS_INFO, ++ wl->extra_buf, WL_EXTRA_BUF_MAX, false); ++ if (unlikely(err)) { ++ AP6210_ERR("Could not get bss info %d\n", err); ++ goto update_bss_info_out; ++ } ++ bi = (struct wl_bss_info *)(wl->extra_buf + 4); ++ if (memcmp(bi->BSSID.octet, curbssid, ETHER_ADDR_LEN)) { ++ err = -EIO; ++ goto update_bss_info_out; ++ } ++ ++ ie = ((u8 *)bi) + bi->ie_offset; ++ ie_len = bi->ie_length; ++ ssidie = (u8 *)cfg80211_find_ie(WLAN_EID_SSID, ie, ie_len); ++ if (ssidie && ssidie[1] == bi->SSID_len && !ssidie[2] && bi->SSID[0]) ++ memcpy(ssidie + 2, bi->SSID, bi->SSID_len); ++ ++ err = wl_inform_single_bss(wl, bi, is_roam_done); ++ if (unlikely(err)) ++ goto update_bss_info_out; ++ ++ ie = ((u8 *)bi) + bi->ie_offset; ++ ie_len = bi->ie_length; ++ beacon_interval = cpu_to_le16(bi->beacon_period); ++ } else { ++ AP6210_DEBUG("Found the AP in the list - BSSID %pM\n", bss->bssid); ++ ie = bss->information_elements; ++ ie_len = bss->len_information_elements; ++ beacon_interval = bss->beacon_interval; ++ cfg80211_put_bss(bss); ++ } ++ ++ tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM); ++ if (tim) { ++ dtim_period = tim->data[1]; ++ } else { ++ /* ++ * active scan was done so we could not get dtim ++ * information out of probe response. ++ * so we speficially query dtim information. ++ */ ++ err = wldev_ioctl(ndev, WLC_GET_DTIMPRD, ++ &dtim_period, sizeof(dtim_period), false); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_GET_DTIMPRD error (%d)\n", err); ++ goto update_bss_info_out; ++ } ++ } ++ ++ wl_update_prof(wl, ndev, NULL, &beacon_interval, WL_PROF_BEACONINT); ++ wl_update_prof(wl, ndev, NULL, &dtim_period, WL_PROF_DTIMPERIOD); ++ ++update_bss_info_out: ++ mutex_unlock(&wl->usr_sync); ++ return err; ++} ++ ++static s32 ++wl_bss_roaming_done(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ struct wl_connect_info *conn_info = wl_to_conn(wl); ++ s32 err = 0; ++ u8 *curbssid; ++ ++ wl_get_assoc_ies(wl, ndev); ++ wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); ++ curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); ++ wl_update_bss_info(wl, ndev, 1); ++ wl_update_pmklist(ndev, wl->pmk_list, err); ++ AP6210_DEBUG("wl_bss_roaming_done succeeded to " MACDBG "\n", ++ MAC2STRDBG((u8*)(&e->addr))); ++ ++ cfg80211_roamed(ndev, ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) ++ NULL, /* struct cfg80211_bss *bss */ ++#elif LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) ++ NULL, ++#endif ++ curbssid, ++ conn_info->req_ie, conn_info->req_ie_len, ++ conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL); ++ AP6210_DEBUG("Report roaming result\n"); ++ ++ wl_set_drv_status(wl, CONNECTED, ndev); ++ ++ return err; ++} ++ ++static s32 ++wl_bss_connect_done(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data, bool completed) ++{ ++ struct wl_connect_info *conn_info = wl_to_conn(wl); ++ struct wl_security *sec = wl_read_prof(wl, ndev, WL_PROF_SEC); ++ s32 err = 0; ++ u8 *curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); ++ if (!sec) { ++ AP6210_ERR("sec is NULL\n"); ++ return -ENODEV; ++ } ++ AP6210_DEBUG(" enter\n"); ++#ifdef ESCAN_RESULT_PATCH ++ if (wl_get_drv_status(wl, CONNECTED, ndev)) { ++ if (memcmp(curbssid, connect_req_bssid, ETHER_ADDR_LEN) == 0) { ++ AP6210_DEBUG(" Connected event of connected device e=%d s=%d, ignore it\n", ++ ntoh32(e->event_type), ntoh32(e->status)); ++ return err; ++ } ++ } ++ if (memcmp(curbssid, broad_bssid, ETHER_ADDR_LEN) == 0 && ++ memcmp(broad_bssid, connect_req_bssid, ETHER_ADDR_LEN) != 0) { ++ AP6210_DEBUG("copy bssid\n"); ++ memcpy(curbssid, connect_req_bssid, ETHER_ADDR_LEN); ++ } ++ ++#else ++ if (wl->scan_request) { ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } ++#endif /* ESCAN_RESULT_PATCH */ ++ if (wl_get_drv_status(wl, CONNECTING, ndev)) { ++ wl_clr_drv_status(wl, CONNECTING, ndev); ++ if (completed) { ++ wl_get_assoc_ies(wl, ndev); ++ wl_update_prof(wl, ndev, NULL, (void *)(e->addr.octet), WL_PROF_BSSID); ++ curbssid = wl_read_prof(wl, ndev, WL_PROF_BSSID); ++ wl_update_bss_info(wl, ndev, 0); ++ wl_update_pmklist(ndev, wl->pmk_list, err); ++ wl_set_drv_status(wl, CONNECTED, ndev); ++ } ++ cfg80211_connect_result(ndev, ++ curbssid, ++ conn_info->req_ie, ++ conn_info->req_ie_len, ++ conn_info->resp_ie, ++ conn_info->resp_ie_len, ++ completed ? WLAN_STATUS_SUCCESS : ++ (sec->auth_assoc_res_status) ? ++ sec->auth_assoc_res_status : ++ WLAN_STATUS_UNSPECIFIED_FAILURE, ++ GFP_KERNEL); ++ if (completed) ++ AP6210_DEBUG("Report connect result - connection succeeded\n"); ++ else ++ AP6210_ERR("Report connect result - connection failed\n"); ++ } ++ return err; ++} ++ ++static s32 ++wl_notify_mic_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ u16 flags = ntoh16(e->flags); ++ enum nl80211_key_type key_type; ++ ++ mutex_lock(&wl->usr_sync); ++ if (flags & WLC_EVENT_MSG_GROUP) ++ key_type = NL80211_KEYTYPE_GROUP; ++ else ++ key_type = NL80211_KEYTYPE_PAIRWISE; ++ ++ cfg80211_michael_mic_failure(ndev, (u8 *)&e->addr, key_type, -1, ++ NULL, GFP_KERNEL); ++ mutex_unlock(&wl->usr_sync); ++ ++ return 0; ++} ++ ++#ifdef PNO_SUPPORT ++static s32 ++wl_notify_pfn_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ AP6210_ERR(">>> PNO Event\n"); ++ ++#ifndef WL_SCHED_SCAN ++ mutex_lock(&wl->usr_sync); ++ /* TODO: Use cfg80211_sched_scan_results(wiphy); */ ++ cfg80211_disconnected(ndev, 0, NULL, 0, GFP_KERNEL); ++ mutex_unlock(&wl->usr_sync); ++#else ++ /* If cfg80211 scheduled scan is supported, report the pno results via sched ++ * scan results ++ */ ++ wl_notify_sched_scan_results(wl, ndev, e, data); ++#endif /* WL_SCHED_SCAN */ ++ return 0; ++} ++#endif /* PNO_SUPPORT */ ++ ++static s32 ++wl_notify_scan_status(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ struct channel_info channel_inform; ++ struct wl_scan_results *bss_list; ++ u32 len = WL_SCAN_BUF_MAX; ++ s32 err = 0; ++ unsigned long flags; ++ ++ AP6210_DEBUG("Enter \n"); ++ if (!wl_get_drv_status(wl, SCANNING, ndev)) { ++ AP6210_ERR("scan is not ready \n"); ++ return err; ++ } ++ if (wl->iscan_on && wl->iscan_kickstart) ++ return wl_wakeup_iscan(wl_to_iscan(wl)); ++ ++ mutex_lock(&wl->usr_sync); ++ wl_clr_drv_status(wl, SCANNING, ndev); ++ err = wldev_ioctl(ndev, WLC_GET_CHANNEL, &channel_inform, ++ sizeof(channel_inform), false); ++ if (unlikely(err)) { ++ AP6210_ERR("scan busy (%d)\n", err); ++ goto scan_done_out; ++ } ++ channel_inform.scan_channel = dtoh32(channel_inform.scan_channel); ++ if (unlikely(channel_inform.scan_channel)) { ++ ++ AP6210_DEBUG("channel_inform.scan_channel (%d)\n", ++ channel_inform.scan_channel); ++ } ++ wl->bss_list = wl->scan_results; ++ bss_list = wl->bss_list; ++ memset(bss_list, 0, len); ++ bss_list->buflen = htod32(len); ++ err = wldev_ioctl(ndev, WLC_SCAN_RESULTS, bss_list, len, false); ++ if (unlikely(err) && unlikely(!wl->scan_suppressed)) { ++ AP6210_ERR("%s Scan_results error (%d)\n", ndev->name, err); ++ err = -EINVAL; ++ goto scan_done_out; ++ } ++ bss_list->buflen = dtoh32(bss_list->buflen); ++ bss_list->version = dtoh32(bss_list->version); ++ bss_list->count = dtoh32(bss_list->count); ++ ++ err = wl_inform_bss(wl); ++ ++scan_done_out: ++ del_timer_sync(&wl->scan_timeout); ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ if (wl->scan_request) { ++ cfg80211_scan_done(wl->scan_request, false); ++ wl->scan_request = NULL; ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ AP6210_DEBUG("cfg80211_scan_done\n"); ++ mutex_unlock(&wl->usr_sync); ++ return err; ++} ++static s32 ++wl_frame_get_mgmt(u16 fc, const struct ether_addr *da, ++ const struct ether_addr *sa, const struct ether_addr *bssid, ++ u8 **pheader, u32 *body_len, u8 *pbody) ++{ ++ struct dot11_management_header *hdr; ++ u32 totlen = 0; ++ s32 err = 0; ++ u8 *offset; ++ u32 prebody_len = *body_len; ++ switch (fc) { ++ case FC_ASSOC_REQ: ++ /* capability , listen interval */ ++ totlen = DOT11_ASSOC_REQ_FIXED_LEN; ++ *body_len += DOT11_ASSOC_REQ_FIXED_LEN; ++ break; ++ ++ case FC_REASSOC_REQ: ++ /* capability, listen inteval, ap address */ ++ totlen = DOT11_REASSOC_REQ_FIXED_LEN; ++ *body_len += DOT11_REASSOC_REQ_FIXED_LEN; ++ break; ++ } ++ totlen += DOT11_MGMT_HDR_LEN + prebody_len; ++ *pheader = kzalloc(totlen, GFP_KERNEL); ++ if (*pheader == NULL) { ++ AP6210_ERR("memory alloc failed \n"); ++ return -ENOMEM; ++ } ++ hdr = (struct dot11_management_header *) (*pheader); ++ hdr->fc = htol16(fc); ++ hdr->durid = 0; ++ hdr->seq = 0; ++ offset = (u8*)(hdr + 1) + (totlen - DOT11_MGMT_HDR_LEN - prebody_len); ++ bcopy((const char*)da, (u8*)&hdr->da, ETHER_ADDR_LEN); ++ bcopy((const char*)sa, (u8*)&hdr->sa, ETHER_ADDR_LEN); ++ bcopy((const char*)bssid, (u8*)&hdr->bssid, ETHER_ADDR_LEN); ++ if ((pbody != NULL) && prebody_len) ++ bcopy((const char*)pbody, offset, prebody_len); ++ *body_len = totlen; ++ return err; ++} ++ ++ ++void ++wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev) ++{ ++ if (wl_get_drv_status_all(wl, SENDING_ACT_FRM) && ++ (wl_get_p2p_status(wl, ACTION_TX_COMPLETED) || ++ wl_get_p2p_status(wl, ACTION_TX_NOACK))) { ++ AP6210_DEBUG("*** Wake UP ** abort actframe iovar\n"); ++ /* if channel is not zero, "actfame" uses off channel scan. ++ * So abort scan for off channel completion. ++ */ ++ if (wl->af_sent_channel) ++ /* wl_cfg80211_scan_abort(wl, ndev); */ ++ wl_notify_escan_complete(wl, ++ (ndev == wl->p2p_net) ? wl_to_prmry_ndev(wl) : ndev, true, true); ++ } ++#ifdef WL_CFG80211_SYNC_GON ++ else if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { ++ AP6210_DEBUG("*** Wake UP ** abort listen for next af frame\n"); ++ /* So abort scan to cancel listen */ ++ wl_notify_escan_complete(wl, ++ (ndev == wl->p2p_net) ? wl_to_prmry_ndev(wl) : ndev, true, true); ++ } ++#endif /* WL_CFG80211_SYNC_GON */ ++} ++ ++static s32 ++wl_notify_rx_mgmt_frame(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ struct ieee80211_supported_band *band; ++ struct wiphy *wiphy = wl_to_wiphy(wl); ++ struct ether_addr da; ++ struct ether_addr bssid; ++ bool isfree = false; ++ s32 err = 0; ++ s32 freq; ++ struct net_device *dev = NULL; ++ wifi_p2p_pub_act_frame_t *act_frm = NULL; ++ wifi_p2p_action_frame_t *p2p_act_frm = NULL; ++ wifi_p2psd_gas_pub_act_frame_t *sd_act_frm = NULL; ++ wl_event_rx_frame_data_t *rxframe = ++ (wl_event_rx_frame_data_t*)data; ++ u32 event = ntoh32(e->event_type); ++ u8 *mgmt_frame; ++ u8 bsscfgidx = e->bsscfgidx; ++ u32 mgmt_frame_len = ntoh32(e->datalen) - sizeof(wl_event_rx_frame_data_t); ++ u16 channel = ((ntoh16(rxframe->channel) & WL_CHANSPEC_CHAN_MASK)); ++ ++ memset(&bssid, 0, ETHER_ADDR_LEN); ++ ++ if (wl->p2p_net == ndev) { ++ dev = wl_to_prmry_ndev(wl); ++ } else { ++ dev = ndev; ++ } ++ ++ if (channel <= CH_MAX_2G_CHANNEL) ++ band = wiphy->bands[IEEE80211_BAND_2GHZ]; ++ else ++ band = wiphy->bands[IEEE80211_BAND_5GHZ]; ++ if (!band) { ++ AP6210_ERR("No valid band"); ++ return -EINVAL; ++ } ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) ++ freq = ieee80211_channel_to_frequency(channel); ++ (void)band->band; ++#else ++ freq = ieee80211_channel_to_frequency(channel, band->band); ++#endif ++ if (event == WLC_E_ACTION_FRAME_RX) { ++ wldev_iovar_getbuf_bsscfg(dev, "cur_etheraddr", ++ NULL, 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &wl->ioctl_buf_sync); ++ ++ err = wldev_ioctl(dev, WLC_GET_BSSID, &bssid, ETHER_ADDR_LEN, false); ++ if (err < 0) ++ AP6210_ERR("WLC_GET_BSSID error %d\n", err); ++ memcpy(da.octet, wl->ioctl_buf, ETHER_ADDR_LEN); ++ err = wl_frame_get_mgmt(FC_ACTION, &da, &e->addr, &bssid, ++ &mgmt_frame, &mgmt_frame_len, ++ (u8 *)((wl_event_rx_frame_data_t *)rxframe + 1)); ++ if (err < 0) { ++ AP6210_ERR("%s: Error in receiving action frame len %d channel %d freq %d\n", ++ __func__, mgmt_frame_len, channel, freq); ++ goto exit; ++ } ++ isfree = true; ++ if (wl_cfgp2p_is_pub_action(&mgmt_frame[DOT11_MGMT_HDR_LEN], ++ mgmt_frame_len - DOT11_MGMT_HDR_LEN)) { ++ act_frm = (wifi_p2p_pub_act_frame_t *) ++ (&mgmt_frame[DOT11_MGMT_HDR_LEN]); ++ } else if (wl_cfgp2p_is_p2p_action(&mgmt_frame[DOT11_MGMT_HDR_LEN], ++ mgmt_frame_len - DOT11_MGMT_HDR_LEN)) { ++ p2p_act_frm = (wifi_p2p_action_frame_t *) ++ (&mgmt_frame[DOT11_MGMT_HDR_LEN]); ++ (void) p2p_act_frm; ++ } else if (wl_cfgp2p_is_gas_action(&mgmt_frame[DOT11_MGMT_HDR_LEN], ++ mgmt_frame_len - DOT11_MGMT_HDR_LEN)) { ++ sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *) ++ (&mgmt_frame[DOT11_MGMT_HDR_LEN]); ++ if (sd_act_frm && wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) { ++ if (wl->next_af_subtype == sd_act_frm->action) { ++ AP6210_DEBUG("We got a right next frame of SD!(%d)\n", ++ sd_act_frm->action); ++ wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ++ (ndev == wl->p2p_net) ? ++ wl_to_prmry_ndev(wl) : ndev); ++ ++ /* Stop waiting for next AF. */ ++ wl_stop_wait_next_action_frame(wl, ndev); ++ } ++ } ++ (void) sd_act_frm; ++ } else { ++ /* ++ * if we got normal action frame and ndev is p2p0, ++ * we have to change ndev from p2p0 to wlan0 ++ */ ++ if (wl->p2p_net == ndev) ++ ndev = wl_to_prmry_ndev(wl); ++ } ++ ++ if (act_frm) { ++ ++ if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) { ++ if (wl->next_af_subtype == act_frm->subtype) { ++ AP6210_DEBUG("We got a right next frame!(%d)\n", ++ act_frm->subtype); ++ wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, ++ (ndev == wl->p2p_net) ? ++ wl_to_prmry_ndev(wl) : ndev); ++ ++ /* Stop waiting for next AF. */ ++ wl_stop_wait_next_action_frame(wl, ndev); ++ } ++ } ++ } ++ ++ wl_cfgp2p_print_actframe(false, &mgmt_frame[DOT11_MGMT_HDR_LEN], ++ mgmt_frame_len - DOT11_MGMT_HDR_LEN); ++ /* ++ * After complete GO Negotiation, roll back to mpc mode ++ */ ++ if (act_frm && ((act_frm->subtype == P2P_PAF_GON_CONF) || ++ (act_frm->subtype == P2P_PAF_PROVDIS_RSP))) { ++ wldev_iovar_setint(dev, "mpc", 1); ++ } ++ if (act_frm && (act_frm->subtype == P2P_PAF_GON_CONF)) { ++ AP6210_DEBUG("P2P: GO_NEG_PHASE status cleared \n"); ++ wl_clr_p2p_status(wl, GO_NEG_PHASE); ++ } ++ } else { ++ mgmt_frame = (u8 *)((wl_event_rx_frame_data_t *)rxframe + 1); ++ ++ /* wpa supplicant use probe request event for restarting another GON Req. ++ * but it makes GON Req repetition. ++ * so if src addr of prb req is same as my target device, ++ * do not send probe request event during sending action frame. ++ */ ++ if (event == WLC_E_P2P_PROBREQ_MSG) { ++ AP6210_DEBUG(" Event %s\n", (event == WLC_E_P2P_PROBREQ_MSG) ? ++ "WLC_E_P2P_PROBREQ_MSG":"WLC_E_PROBREQ_MSG"); ++ ++ ++ /* Filter any P2P probe reqs arriving during the ++ * GO-NEG Phase ++ */ ++ if (wl->p2p && ++ wl_get_p2p_status(wl, GO_NEG_PHASE)) { ++ AP6210_DEBUG("Filtering P2P probe_req while " ++ "being in GO-Neg state\n"); ++ return 0; ++ } ++ } ++ } ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) ++ cfg80211_rx_mgmt(ndev, freq, 0, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); ++#else ++ cfg80211_rx_mgmt(ndev, freq, mgmt_frame, mgmt_frame_len, GFP_ATOMIC); ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) */ ++ ++ AP6210_DEBUG("%s: mgmt_frame_len (%d) , e->datalen (%d), channel (%d), freq (%d)\n", __func__, ++ mgmt_frame_len, ntoh32(e->datalen), channel, freq); ++exit: ++ if (isfree) ++ kfree(mgmt_frame); ++ return 0; ++} ++ ++#ifdef WL_SCHED_SCAN ++/* If target scan is not reliable, set the below define to "1" to do a ++ * full escan ++ */ ++#define FULL_ESCAN_ON_PFN_NET_FOUND 0 ++static s32 ++wl_notify_sched_scan_results(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ wl_pfn_net_info_t *netinfo, *pnetinfo; ++ struct cfg80211_scan_request request; ++ struct wiphy *wiphy = wl_to_wiphy(wl); ++ int err = 0; ++ struct cfg80211_ssid ssid[MAX_PFN_LIST_COUNT]; ++ struct ieee80211_channel *channel = NULL; ++ int channel_req = 0; ++ int band = 0; ++ struct wl_pfn_scanresults *pfn_result = (struct wl_pfn_scanresults *)data; ++ ++ AP6210_DEBUG("Enter\n"); ++ ++ if (e->event_type == WLC_E_PFN_NET_LOST) { ++ AP6210_DEBUG("PFN NET LOST event. Do Nothing \n"); ++ return 0; ++ } ++ AP6210_DEBUG(">>> PFN NET FOUND event. count:%d \n", pfn_result->count); ++ if (pfn_result->count > 0) { ++ int i; ++ ++ memset(&request, 0x00, sizeof(struct cfg80211_scan_request)); ++ memset(&ssid, 0x00, sizeof(ssid)); ++ request.wiphy = wiphy; ++ ++ pnetinfo = (wl_pfn_net_info_t *)(data + sizeof(wl_pfn_scanresults_t) ++ - sizeof(wl_pfn_net_info_t)); ++ channel = (struct ieee80211_channel *)kzalloc( ++ (sizeof(struct ieee80211_channel) * MAX_PFN_LIST_COUNT), ++ GFP_KERNEL); ++ if (!channel) { ++ AP6210_ERR("No memory"); ++ err = -ENOMEM; ++ goto out_err; ++ } ++ ++ for (i = 0; i < pfn_result->count; i++) { ++ netinfo = &pnetinfo[i]; ++ if (!netinfo) { ++ AP6210_ERR("Invalid netinfo ptr. index:%d", i); ++ err = -EINVAL; ++ goto out_err; ++ } ++ AP6210_DEBUG(">>> SSID:%s Channel:%d \n", ++ netinfo->pfnsubnet.SSID, netinfo->pfnsubnet.channel); ++ /* PFN result doesn't have all the info which are required by the supplicant ++ * (For e.g IEs) Do a target Escan so that sched scan results are reported ++ * via wl_inform_single_bss in the required format. Escan does require the ++ * scan request in the form of cfg80211_scan_request. For timebeing, create ++ * cfg80211_scan_request one out of the received PNO event. ++ */ ++ memcpy(ssid[i].ssid, netinfo->pfnsubnet.SSID, ++ netinfo->pfnsubnet.SSID_len); ++ ssid[i].ssid_len = netinfo->pfnsubnet.SSID_len; ++ request.n_ssids++; ++ ++ channel_req = netinfo->pfnsubnet.channel; ++ band = (channel_req <= CH_MAX_2G_CHANNEL) ? NL80211_BAND_2GHZ ++ : NL80211_BAND_5GHZ; ++ channel[i].center_freq = ieee80211_channel_to_frequency(channel_req, band); ++ channel[i].band = band; ++ channel[i].flags |= IEEE80211_CHAN_NO_HT40; ++ request.channels[i] = &channel[i]; ++ request.n_channels++; ++ } ++ ++ /* assign parsed ssid array */ ++ if (request.n_ssids) ++ request.ssids = &ssid[0]; ++ ++ if (wl_get_drv_status_all(wl, SCANNING)) { ++ /* Abort any on-going scan */ ++ wl_notify_escan_complete(wl, ndev, true, true); ++ } ++ ++ if (wl_get_p2p_status(wl, DISCOVERY_ON)) { ++ AP6210_DEBUG(">>> P2P discovery was ON. Disabling it\n"); ++ err = wl_cfgp2p_discover_enable_search(wl, false); ++ if (unlikely(err)) { ++ wl_clr_drv_status(wl, SCANNING, ndev); ++ goto out_err; ++ } ++ } ++ ++ wl_set_drv_status(wl, SCANNING, ndev); ++#if FULL_ESCAN_ON_PFN_NET_FOUND ++ AP6210_DEBUG(">>> Doing Full ESCAN on PNO event\n"); ++ err = wl_do_escan(wl, wiphy, ndev, NULL); ++#else ++ AP6210_DEBUG(">>> Doing targeted ESCAN on PNO event\n"); ++ err = wl_do_escan(wl, wiphy, ndev, &request); ++#endif ++ if (err) { ++ wl_clr_drv_status(wl, SCANNING, ndev); ++ goto out_err; ++ } ++ wl->sched_scan_running = TRUE; ++ } ++ else { ++ AP6210_ERR("FALSE PNO Event. (pfn_count == 0) \n"); ++ } ++out_err: ++ if (channel) ++ kfree(channel); ++ return err; ++} ++#endif /* WL_SCHED_SCAN */ ++ ++static void wl_init_conf(struct wl_conf *conf) ++{ ++ AP6210_DEBUG("Enter \n"); ++ conf->frag_threshold = (u32)-1; ++ conf->rts_threshold = (u32)-1; ++ conf->retry_short = (u32)-1; ++ conf->retry_long = (u32)-1; ++ conf->tx_power = -1; ++} ++ ++static void wl_init_prof(struct wl_priv *wl, struct net_device *ndev) ++{ ++ unsigned long flags; ++ struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev); ++ ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ memset(profile, 0, sizeof(struct wl_profile)); ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++} ++ ++static void wl_init_event_handler(struct wl_priv *wl) ++{ ++ memset(wl->evt_handler, 0, sizeof(wl->evt_handler)); ++ ++ wl->evt_handler[WLC_E_SCAN_COMPLETE] = wl_notify_scan_status; ++ wl->evt_handler[WLC_E_AUTH] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_ASSOC] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_LINK] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_DEAUTH_IND] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_DEAUTH] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_DISASSOC_IND] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_ASSOC_IND] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_REASSOC_IND] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_ROAM] = wl_notify_roaming_status; ++ wl->evt_handler[WLC_E_MIC_ERROR] = wl_notify_mic_status; ++ wl->evt_handler[WLC_E_SET_SSID] = wl_notify_connect_status; ++ wl->evt_handler[WLC_E_ACTION_FRAME_RX] = wl_notify_rx_mgmt_frame; ++ wl->evt_handler[WLC_E_PROBREQ_MSG] = wl_notify_rx_mgmt_frame; ++ wl->evt_handler[WLC_E_P2P_PROBREQ_MSG] = wl_notify_rx_mgmt_frame; ++ wl->evt_handler[WLC_E_P2P_DISC_LISTEN_COMPLETE] = wl_cfgp2p_listen_complete; ++ wl->evt_handler[WLC_E_ACTION_FRAME_COMPLETE] = wl_cfgp2p_action_tx_complete; ++ wl->evt_handler[WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE] = wl_cfgp2p_action_tx_complete; ++#ifdef PNO_SUPPORT ++ wl->evt_handler[WLC_E_PFN_NET_FOUND] = wl_notify_pfn_status; ++#endif /* PNO_SUPPORT */ ++} ++ ++static s32 wl_init_priv_mem(struct wl_priv *wl) ++{ ++ AP6210_DEBUG("Enter \n"); ++ wl->scan_results = (void *)kzalloc(WL_SCAN_BUF_MAX, GFP_KERNEL); ++ if (unlikely(!wl->scan_results)) { ++ AP6210_ERR("Scan results alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->conf = (void *)kzalloc(sizeof(*wl->conf), GFP_KERNEL); ++ if (unlikely(!wl->conf)) { ++ AP6210_ERR("wl_conf alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->scan_req_int = ++ (void *)kzalloc(sizeof(*wl->scan_req_int), GFP_KERNEL); ++ if (unlikely(!wl->scan_req_int)) { ++ AP6210_ERR("Scan req alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->ioctl_buf = (void *)kzalloc(WLC_IOCTL_MAXLEN, GFP_KERNEL); ++ if (unlikely(!wl->ioctl_buf)) { ++ AP6210_ERR("Ioctl buf alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->escan_ioctl_buf = (void *)kzalloc(WLC_IOCTL_MAXLEN, GFP_KERNEL); ++ if (unlikely(!wl->escan_ioctl_buf)) { ++ AP6210_ERR("Ioctl buf alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->extra_buf = (void *)kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); ++ if (unlikely(!wl->extra_buf)) { ++ AP6210_ERR("Extra buf alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->iscan = (void *)kzalloc(sizeof(*wl->iscan), GFP_KERNEL); ++ if (unlikely(!wl->iscan)) { ++ AP6210_ERR("Iscan buf alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->pmk_list = (void *)kzalloc(sizeof(*wl->pmk_list), GFP_KERNEL); ++ if (unlikely(!wl->pmk_list)) { ++ AP6210_ERR("pmk list alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->sta_info = (void *)kzalloc(sizeof(*wl->sta_info), GFP_KERNEL); ++ if (unlikely(!wl->sta_info)) { ++ AP6210_ERR("sta info alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ ++#if defined(STATIC_WL_PRIV_STRUCT) ++ wl->conn_info = (void *)kzalloc(sizeof(*wl->conn_info), GFP_KERNEL); ++ if (unlikely(!wl->conn_info)) { ++ AP6210_ERR("wl->conn_info alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->ie = (void *)kzalloc(sizeof(*wl->ie), GFP_KERNEL); ++ if (unlikely(!wl->ie)) { ++ AP6210_ERR("wl->ie alloc failed\n"); ++ goto init_priv_mem_out; ++ } ++ wl->escan_info.escan_buf = dhd_os_prealloc(NULL, DHD_PREALLOC_WIPHY_ESCAN0, 0); ++ bzero(wl->escan_info.escan_buf, ESCAN_BUF_SIZE); ++#endif /* STATIC_WL_PRIV_STRUCT */ ++ wl->afx_hdl = (void *)kzalloc(sizeof(*wl->afx_hdl), GFP_KERNEL); ++ if (unlikely(!wl->afx_hdl)) { ++ AP6210_ERR("afx hdl alloc failed\n"); ++ goto init_priv_mem_out; ++ } else { ++ init_completion(&wl->act_frm_scan); ++ init_completion(&wl->wait_next_af); ++ ++ INIT_WORK(&wl->afx_hdl->work, wl_cfg80211_afx_handler); ++ } ++ return 0; ++ ++init_priv_mem_out: ++ wl_deinit_priv_mem(wl); ++ ++ return -ENOMEM; ++} ++ ++static void wl_deinit_priv_mem(struct wl_priv *wl) ++{ ++ kfree(wl->scan_results); ++ wl->scan_results = NULL; ++ kfree(wl->conf); ++ wl->conf = NULL; ++ kfree(wl->scan_req_int); ++ wl->scan_req_int = NULL; ++ kfree(wl->ioctl_buf); ++ wl->ioctl_buf = NULL; ++ kfree(wl->escan_ioctl_buf); ++ wl->escan_ioctl_buf = NULL; ++ kfree(wl->extra_buf); ++ wl->extra_buf = NULL; ++ kfree(wl->iscan); ++ wl->iscan = NULL; ++ kfree(wl->pmk_list); ++ wl->pmk_list = NULL; ++ kfree(wl->sta_info); ++ wl->sta_info = NULL; ++#if defined(STATIC_WL_PRIV_STRUCT) ++ kfree(wl->conn_info); ++ wl->conn_info = NULL; ++ kfree(wl->ie); ++ wl->ie = NULL; ++ wl->escan_info.escan_buf = NULL; ++#endif /* STATIC_WL_PRIV_STRUCT */ ++ if (wl->afx_hdl) { ++ cancel_work_sync(&wl->afx_hdl->work); ++ kfree(wl->afx_hdl); ++ wl->afx_hdl = NULL; ++ } ++ ++ if (wl->ap_info) { ++ kfree(wl->ap_info->wpa_ie); ++ kfree(wl->ap_info->rsn_ie); ++ kfree(wl->ap_info->wps_ie); ++ kfree(wl->ap_info); ++ wl->ap_info = NULL; ++ } ++} ++ ++static s32 wl_create_event_handler(struct wl_priv *wl) ++{ ++ int ret = 0; ++ AP6210_DEBUG("Enter \n"); ++ ++ /* Do not use DHD in cfg driver */ ++ wl->event_tsk.thr_pid = -1; ++ ++#ifdef USE_KTHREAD_API ++ PROC_START2(wl_event_handler, wl, &wl->event_tsk, 0, "wl_event_handler"); ++#else ++ PROC_START(wl_event_handler, wl, &wl->event_tsk, 0); ++#endif ++ if (wl->event_tsk.thr_pid < 0) ++ ret = -ENOMEM; ++ return ret; ++} ++ ++static void wl_destroy_event_handler(struct wl_priv *wl) ++{ ++ if (wl->event_tsk.thr_pid >= 0) ++ PROC_STOP(&wl->event_tsk); ++} ++ ++static void wl_term_iscan(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl_to_iscan(wl); ++ AP6210_DEBUG("In\n"); ++ if (wl->iscan_on && iscan->tsk) { ++ iscan->state = WL_ISCAN_STATE_IDLE; ++ AP6210_DEBUG("SIGTERM\n"); ++ send_sig(SIGTERM, iscan->tsk, 1); ++ AP6210_DEBUG("kthread_stop\n"); ++ kthread_stop(iscan->tsk); ++ iscan->tsk = NULL; ++ } ++} ++ ++static void wl_notify_iscan_complete(struct wl_iscan_ctrl *iscan, bool aborted) ++{ ++ struct wl_priv *wl = iscan_to_wl(iscan); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ unsigned long flags; ++ ++ AP6210_DEBUG("Enter \n"); ++ if (!wl_get_drv_status(wl, SCANNING, ndev)) { ++ wl_clr_drv_status(wl, SCANNING, ndev); ++ AP6210_ERR("Scan complete while device not scanning\n"); ++ return; ++ } ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ wl_clr_drv_status(wl, SCANNING, ndev); ++ if (likely(wl->scan_request)) { ++ cfg80211_scan_done(wl->scan_request, aborted); ++ wl->scan_request = NULL; ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ wl->iscan_kickstart = false; ++} ++ ++static s32 wl_wakeup_iscan(struct wl_iscan_ctrl *iscan) ++{ ++ if (likely(iscan->state != WL_ISCAN_STATE_IDLE)) { ++ AP6210_DEBUG("wake up iscan\n"); ++ up(&iscan->sync); ++ return 0; ++ } ++ ++ return -EIO; ++} ++ ++static s32 ++wl_get_iscan_results(struct wl_iscan_ctrl *iscan, u32 *status, ++ struct wl_scan_results **bss_list) ++{ ++ struct wl_iscan_results list; ++ struct wl_scan_results *results; ++ struct wl_iscan_results *list_buf; ++ s32 err = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ memset(iscan->scan_buf, 0, WL_ISCAN_BUF_MAX); ++ list_buf = (struct wl_iscan_results *)iscan->scan_buf; ++ results = &list_buf->results; ++ results->buflen = WL_ISCAN_RESULTS_FIXED_SIZE; ++ results->version = 0; ++ results->count = 0; ++ ++ memset(&list, 0, sizeof(list)); ++ list.results.buflen = htod32(WL_ISCAN_BUF_MAX); ++ err = wldev_iovar_getbuf(iscan->dev, "iscanresults", &list, ++ WL_ISCAN_RESULTS_FIXED_SIZE, iscan->scan_buf, ++ WL_ISCAN_BUF_MAX, NULL); ++ if (unlikely(err)) { ++ AP6210_ERR("error (%d)\n", err); ++ return err; ++ } ++ results->buflen = dtoh32(results->buflen); ++ results->version = dtoh32(results->version); ++ results->count = dtoh32(results->count); ++ AP6210_DEBUG("results->count = %d\n", results->count); ++ AP6210_DEBUG("results->buflen = %d\n", results->buflen); ++ *status = dtoh32(list_buf->status); ++ *bss_list = results; ++ ++ return err; ++} ++ ++static s32 wl_iscan_done(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl->iscan; ++ s32 err = 0; ++ ++ iscan->state = WL_ISCAN_STATE_IDLE; ++ mutex_lock(&wl->usr_sync); ++ wl_inform_bss(wl); ++ wl_notify_iscan_complete(iscan, false); ++ mutex_unlock(&wl->usr_sync); ++ ++ return err; ++} ++ ++static s32 wl_iscan_pending(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl->iscan; ++ s32 err = 0; ++ ++ /* Reschedule the timer */ ++ mod_timer(&iscan->timer, jiffies + msecs_to_jiffies(iscan->timer_ms)); ++ iscan->timer_on = 1; ++ ++ return err; ++} ++ ++static s32 wl_iscan_inprogress(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl->iscan; ++ s32 err = 0; ++ ++ mutex_lock(&wl->usr_sync); ++ wl_inform_bss(wl); ++ wl_run_iscan(iscan, NULL, WL_SCAN_ACTION_CONTINUE); ++ mutex_unlock(&wl->usr_sync); ++ /* Reschedule the timer */ ++ mod_timer(&iscan->timer, jiffies + msecs_to_jiffies(iscan->timer_ms)); ++ iscan->timer_on = 1; ++ ++ return err; ++} ++ ++static s32 wl_iscan_aborted(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl->iscan; ++ s32 err = 0; ++ ++ iscan->state = WL_ISCAN_STATE_IDLE; ++ mutex_lock(&wl->usr_sync); ++ wl_notify_iscan_complete(iscan, true); ++ mutex_unlock(&wl->usr_sync); ++ ++ return err; ++} ++ ++static s32 wl_iscan_thread(void *data) ++{ ++ struct wl_iscan_ctrl *iscan = (struct wl_iscan_ctrl *)data; ++ struct wl_priv *wl = iscan_to_wl(iscan); ++ u32 status; ++ int err = 0; ++ ++ allow_signal(SIGTERM); ++ status = WL_SCAN_RESULTS_PARTIAL; ++ while (likely(!down_interruptible(&iscan->sync))) { ++ if (kthread_should_stop()) ++ break; ++ if (iscan->timer_on) { ++ del_timer_sync(&iscan->timer); ++ iscan->timer_on = 0; ++ } ++ mutex_lock(&wl->usr_sync); ++ err = wl_get_iscan_results(iscan, &status, &wl->bss_list); ++ if (unlikely(err)) { ++ status = WL_SCAN_RESULTS_ABORTED; ++ AP6210_ERR("Abort iscan\n"); ++ } ++ mutex_unlock(&wl->usr_sync); ++ iscan->iscan_handler[status] (wl); ++ } ++ if (iscan->timer_on) { ++ del_timer_sync(&iscan->timer); ++ iscan->timer_on = 0; ++ } ++ AP6210_DEBUG("%s was terminated\n", __func__); ++ ++ return 0; ++} ++ ++static void wl_scan_timeout(unsigned long data) ++{ ++ wl_event_msg_t msg; ++ struct wl_priv *wl = (struct wl_priv *)data; ++ ++ if (!(wl->scan_request)) { ++ AP6210_ERR("timer expired but no scan request\n"); ++ return; ++ } ++ bzero(&msg, sizeof(wl_event_msg_t)); ++ AP6210_ERR("timer expired\n"); ++ if (wl->escan_on) { ++ msg.event_type = hton32(WLC_E_ESCAN_RESULT); ++ msg.status = hton32(WLC_E_STATUS_TIMEOUT); ++ msg.reason = 0xFFFFFFFF; ++ wl_cfg80211_event(wl_to_prmry_ndev(wl), &msg, NULL); ++ } else { ++ AP6210_ERR("SCAN Timeout(ISCAN)\n"); ++ wl_notify_iscan_complete(wl_to_iscan(wl), true); ++ } ++} ++static void wl_iscan_timer(unsigned long data) ++{ ++ struct wl_iscan_ctrl *iscan = (struct wl_iscan_ctrl *)data; ++ ++ if (iscan) { ++ iscan->timer_on = 0; ++ AP6210_DEBUG("timer expired\n"); ++ wl_wakeup_iscan(iscan); ++ } ++} ++ ++static s32 wl_invoke_iscan(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl_to_iscan(wl); ++ int err = 0; ++ ++ if (wl->iscan_on && !iscan->tsk) { ++ iscan->state = WL_ISCAN_STATE_IDLE; ++ sema_init(&iscan->sync, 0); ++ iscan->tsk = kthread_run(wl_iscan_thread, iscan, "wl_iscan"); ++ if (IS_ERR(iscan->tsk)) { ++ AP6210_ERR("Could not create iscan thread\n"); ++ iscan->tsk = NULL; ++ return -ENOMEM; ++ } ++ } ++ ++ return err; ++} ++ ++static void wl_init_iscan_handler(struct wl_iscan_ctrl *iscan) ++{ ++ memset(iscan->iscan_handler, 0, sizeof(iscan->iscan_handler)); ++ iscan->iscan_handler[WL_SCAN_RESULTS_SUCCESS] = wl_iscan_done; ++ iscan->iscan_handler[WL_SCAN_RESULTS_PARTIAL] = wl_iscan_inprogress; ++ iscan->iscan_handler[WL_SCAN_RESULTS_PENDING] = wl_iscan_pending; ++ iscan->iscan_handler[WL_SCAN_RESULTS_ABORTED] = wl_iscan_aborted; ++ iscan->iscan_handler[WL_SCAN_RESULTS_NO_MEM] = wl_iscan_aborted; ++} ++ ++static s32 ++wl_cfg80211_netdev_notifier_call(struct notifier_block * nb, ++ unsigned long state, ++ void *ndev) ++{ ++ struct net_device *dev = ndev; ++ struct wireless_dev *wdev = dev->ieee80211_ptr; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ int refcnt = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ if (!wdev || !wl || dev == wl_to_prmry_ndev(wl)) ++ return NOTIFY_DONE; ++ switch (state) { ++ case NETDEV_DOWN: ++ while (work_pending(&wdev->cleanup_work) && refcnt < 100) { ++ if (refcnt%5 == 0) ++ AP6210_ERR("%s : [NETDEV_DOWN] work_pending (%d th)\n", ++ __FUNCTION__, refcnt); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(100); ++ set_current_state(TASK_RUNNING); ++ refcnt++; ++ } ++ break; ++ ++ case NETDEV_UNREGISTER: ++ /* after calling list_del_rcu(&wdev->list) */ ++ wl_dealloc_netinfo(wl, ndev); ++ break; ++ case NETDEV_GOING_DOWN: ++ /* At NETDEV_DOWN state, wdev_cleanup_work work will be called. ++ * In front of door, the function checks ++ * whether current scan is working or not. ++ * If the scanning is still working, wdev_cleanup_work call WARN_ON and ++ * make the scan done forcibly. ++ */ ++ if (wl_get_drv_status(wl, SCANNING, dev)) { ++ if (wl->escan_on) { ++ wl_notify_escan_complete(wl, dev, true, true); ++ } ++ } ++ break; ++ } ++ return NOTIFY_DONE; ++} ++static struct notifier_block wl_cfg80211_netdev_notifier = { ++ .notifier_call = wl_cfg80211_netdev_notifier_call, ++}; ++ ++static s32 wl_notify_escan_complete(struct wl_priv *wl, ++ struct net_device *ndev, ++ bool aborted, bool fw_abort) ++{ ++ wl_scan_params_t *params = NULL; ++ s32 params_size = 0; ++ s32 err = BCME_OK; ++ unsigned long flags; ++ struct net_device *dev; ++ ++ AP6210_DEBUG("Enter \n"); ++ ++ if (wl->escan_info.ndev != ndev) ++ { ++ AP6210_ERR("ndev is different %p %p\n", wl->escan_info.ndev, ndev); ++ return err; ++ } ++ ++ if (wl->scan_request) { ++ if (wl->scan_request->dev == wl->p2p_net) ++ dev = wl_to_prmry_ndev(wl); ++ else ++ dev = wl->scan_request->dev; ++ } ++ else { ++ AP6210_DEBUG("wl->scan_request is NULL may be internal scan." ++ "doing scan_abort for ndev %p primary %p p2p_net %p", ++ ndev, wl_to_prmry_ndev(wl), wl->p2p_net); ++ dev = ndev; ++ } ++ if (fw_abort && !in_atomic()) { ++ /* Our scan params only need space for 1 channel and 0 ssids */ ++ params = wl_cfg80211_scan_alloc_params(-1, 0, ¶ms_size); ++ if (params == NULL) { ++ AP6210_ERR("scan params allocation failed \n"); ++ err = -ENOMEM; ++ } else { ++ /* Do a scan abort to stop the driver's scan engine */ ++ err = wldev_ioctl(dev, WLC_SCAN, params, params_size, true); ++ if (err < 0) { ++ AP6210_ERR("scan abort failed \n"); ++ } ++ } ++ } ++ if (timer_pending(&wl->scan_timeout)) ++ del_timer_sync(&wl->scan_timeout); ++#if defined(ESCAN_RESULT_PATCH) ++ if (likely(wl->scan_request)) { ++ wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; ++ wl_inform_bss(wl); ++ } ++#endif /* ESCAN_RESULT_PATCH */ ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++#ifdef WL_SCHED_SCAN ++ if (wl->sched_scan_req && !wl->scan_request) { ++ AP6210_DEBUG(">>> REPORTING SCHED SCAN RESULTS \n"); ++ if (aborted) ++ cfg80211_sched_scan_stopped(wl->sched_scan_req->wiphy); ++ else ++ cfg80211_sched_scan_results(wl->sched_scan_req->wiphy); ++ wl->sched_scan_running = FALSE; ++ wl->sched_scan_req = NULL; ++ } ++#endif /* WL_SCHED_SCAN */ ++ if (likely(wl->scan_request)) { ++ cfg80211_scan_done(wl->scan_request, aborted); ++ wl->scan_request = NULL; ++ } ++ if (p2p_is_on(wl)) ++ wl_clr_p2p_status(wl, SCANNING); ++ wl_clr_drv_status(wl, SCANNING, dev); ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ if (params) ++ kfree(params); ++ ++ return err; ++} ++ ++static s32 wl_escan_handler(struct wl_priv *wl, ++ struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ s32 err = BCME_OK; ++ s32 status = ntoh32(e->status); ++ wl_bss_info_t *bi; ++ wl_escan_result_t *escan_result; ++ wl_bss_info_t *bss = NULL; ++ wl_scan_results_t *list; ++ wifi_p2p_ie_t * p2p_ie; ++ u32 bi_length; ++ u32 i; ++ u8 *p2p_dev_addr = NULL; ++ ++ AP6210_DEBUG(" enter event type : %d, status : %d \n", ++ ntoh32(e->event_type), ntoh32(e->status)); ++ ++ mutex_lock(&wl->usr_sync); ++ /* P2P SCAN is coming from primary interface */ ++ if (wl_get_p2p_status(wl, SCANNING)) { ++ if (wl_get_drv_status_all(wl, SENDING_ACT_FRM)) ++ ndev = wl->afx_hdl->dev; ++ else ++ ndev = wl->escan_info.ndev; ++ ++ } ++ if (!ndev || !wl->escan_on || ++ (!wl_get_drv_status(wl, SCANNING, ndev) && ++ !wl->sched_scan_running)) { ++ AP6210_ERR("escan is not ready ndev %p wl->escan_on %d drv_status 0x%x\n", ++ ndev, wl->escan_on, wl_get_drv_status(wl, SCANNING, ndev)); ++ goto exit; ++ } ++ if (status == WLC_E_STATUS_PARTIAL) { ++ AP6210_DEBUG("WLC_E_STATUS_PARTIAL \n"); ++ escan_result = (wl_escan_result_t *) data; ++ if (!escan_result) { ++ AP6210_ERR("Invalid escan result (NULL pointer)\n"); ++ goto exit; ++ } ++ if (dtoh16(escan_result->bss_count) != 1) { ++ AP6210_ERR("Invalid bss_count %d: ignoring\n", escan_result->bss_count); ++ goto exit; ++ } ++ bi = escan_result->bss_info; ++ if (!bi) { ++ AP6210_ERR("Invalid escan bss info (NULL pointer)\n"); ++ goto exit; ++ } ++ bi_length = dtoh32(bi->length); ++ if (bi_length != (dtoh32(escan_result->buflen) - WL_ESCAN_RESULTS_FIXED_SIZE)) { ++ AP6210_ERR("Invalid bss_info length %d: ignoring\n", bi_length); ++ goto exit; ++ } ++ ++ if (!(wl_to_wiphy(wl)->interface_modes & BIT(NL80211_IFTYPE_ADHOC))) { ++ if (dtoh16(bi->capability) & DOT11_CAP_IBSS) { ++ AP6210_DEBUG("Ignoring IBSS result\n"); ++ goto exit; ++ } ++ } ++ ++ if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { ++ p2p_dev_addr = wl_cfgp2p_retreive_p2p_dev_addr(bi, bi_length); ++ if (p2p_dev_addr && !memcmp(p2p_dev_addr, ++ wl->afx_hdl->tx_dst_addr.octet, ETHER_ADDR_LEN)) { ++ s32 channel = CHSPEC_CHANNEL( ++ wl_chspec_driver_to_host(bi->chanspec)); ++ AP6210_DEBUG("ACTION FRAME SCAN : Peer " MACDBG " found, channel : %d\n", ++ MAC2STRDBG(wl->afx_hdl->tx_dst_addr.octet), channel); ++ wl_clr_p2p_status(wl, SCANNING); ++ wl->afx_hdl->peer_chan = channel; ++ complete(&wl->act_frm_scan); ++ goto exit; ++ } ++ ++ } else { ++ int cur_len = WL_SCAN_RESULTS_FIXED_SIZE; ++ list = (wl_scan_results_t *)wl->escan_info.escan_buf; ++#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) ++ if (wl->p2p_net && wl->scan_request && ++ wl->scan_request->dev == wl->p2p_net) ++#else ++ if (p2p_is_on(wl) && p2p_scan(wl)) ++#endif ++ { ++#ifdef WL_HOST_BAND_MGMT ++ s32 channel = 0; ++ s32 channel_band = 0; ++#endif /* WL_HOST_BAND_MGMT */ ++ /* p2p scan && allow only probe response */ ++ if (bi->flags & WL_BSS_FLAGS_FROM_BEACON) ++ goto exit; ++ if ((p2p_ie = wl_cfgp2p_find_p2pie(((u8 *) bi) + bi->ie_offset, ++ bi->ie_length)) == NULL) { ++ AP6210_ERR("Couldn't find P2PIE in probe" ++ " response/beacon\n"); ++ goto exit; ++ } ++#ifdef WL_HOST_BAND_MGMT ++ channel = CHSPEC_CHANNEL(wl_chspec_driver_to_host(bi->chanspec)); ++ channel_band = (channel > CH_MAX_2G_CHANNEL) ? ++ WLC_BAND_5G : WLC_BAND_2G; ++ ++ ++ if ((wl->curr_band == WLC_BAND_5G) && ++ (channel_band == WLC_BAND_2G)) { ++ /* Avoid sending the GO results in band conflict */ ++ if (wl_cfgp2p_retreive_p2pattrib(p2p_ie, ++ P2P_SEID_GROUP_ID) != NULL) ++ goto exit; ++ } ++#endif /* WL_HOST_BAND_MGMT */ ++ } ++ for (i = 0; i < list->count; i++) { ++ bss = bss ? (wl_bss_info_t *)((uintptr)bss + dtoh32(bss->length)) ++ : list->bss_info; ++ ++ if (!bcmp(&bi->BSSID, &bss->BSSID, ETHER_ADDR_LEN) && ++ (CHSPEC_BAND(wl_chspec_driver_to_host(bi->chanspec)) ++ == CHSPEC_BAND(wl_chspec_driver_to_host(bss->chanspec))) && ++ bi->SSID_len == bss->SSID_len && ++ !bcmp(bi->SSID, bss->SSID, bi->SSID_len)) { ++ ++ /* do not allow beacon data to update ++ *the data recd from a probe response ++ */ ++ if (!(bss->flags & WL_BSS_FLAGS_FROM_BEACON) && ++ (bi->flags & WL_BSS_FLAGS_FROM_BEACON)) ++ goto exit; ++ ++ AP6210_DEBUG("%s("MACDBG"), i=%d prev: RSSI %d" ++ " flags 0x%x, new: RSSI %d flags 0x%x\n", ++ bss->SSID, MAC2STRDBG(bi->BSSID.octet), i, ++ bss->RSSI, bss->flags, bi->RSSI, bi->flags); ++ ++ if ((bss->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) == ++ (bi->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL)) { ++ /* preserve max RSSI if the measurements are ++ * both on-channel or both off-channel ++ */ ++ AP6210_DEBUG("%s("MACDBG"), same onchan" ++ ", RSSI: prev %d new %d\n", ++ bss->SSID, MAC2STRDBG(bi->BSSID.octet), ++ bss->RSSI, bi->RSSI); ++ bi->RSSI = MAX(bss->RSSI, bi->RSSI); ++ } else if ((bss->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) && ++ (bi->flags & WL_BSS_FLAGS_RSSI_ONCHANNEL) == 0) { ++ /* preserve the on-channel rssi measurement ++ * if the new measurement is off channel ++ */ ++ AP6210_DEBUG("%s("MACDBG"), prev onchan" ++ ", RSSI: prev %d new %d\n", ++ bss->SSID, MAC2STRDBG(bi->BSSID.octet), ++ bss->RSSI, bi->RSSI); ++ bi->RSSI = bss->RSSI; ++ bi->flags |= WL_BSS_FLAGS_RSSI_ONCHANNEL; ++ } ++ if (dtoh32(bss->length) != bi_length) { ++ u32 prev_len = dtoh32(bss->length); ++ ++ AP6210_DEBUG("bss info replacement" ++ " is occured(bcast:%d->probresp%d)\n", ++ bss->ie_length, bi->ie_length); ++ AP6210_DEBUG("%s("MACDBG"), replacement!(%d -> %d)\n", ++ bss->SSID, MAC2STRDBG(bi->BSSID.octet), ++ prev_len, bi_length); ++ ++ if (list->buflen - prev_len + bi_length ++ > ESCAN_BUF_SIZE) { ++ AP6210_ERR("Buffer is too small: keep the" ++ " previous result of this AP\n"); ++ /* Only update RSSI */ ++ bss->RSSI = bi->RSSI; ++ bss->flags |= (bi->flags ++ & WL_BSS_FLAGS_RSSI_ONCHANNEL); ++ goto exit; ++ } ++ ++ if (i < list->count - 1) { ++ /* memory copy required by this case only */ ++ memmove((u8 *)bss + bi_length, ++ (u8 *)bss + prev_len, ++ list->buflen - cur_len - prev_len); ++ } ++ list->buflen -= prev_len; ++ list->buflen += bi_length; ++ } ++ list->version = dtoh32(bi->version); ++ memcpy((u8 *)bss, (u8 *)bi, bi_length); ++ goto exit; ++ } ++ cur_len += dtoh32(bss->length); ++ } ++ if (bi_length > ESCAN_BUF_SIZE - list->buflen) { ++ AP6210_ERR("Buffer is too small: ignoring\n"); ++ goto exit; ++ } ++ if (strlen(bi->SSID) == 0) { // terence: fix for hidden SSID ++ AP6210_DEBUG("Skip hidden SSID %pM\n", &bi->BSSID); ++ goto exit; ++ } ++ memcpy(&(wl->escan_info.escan_buf[list->buflen]), bi, bi_length); ++ list->version = dtoh32(bi->version); ++ list->buflen += bi_length; ++ list->count++; ++ } ++ ++ } ++ else if (status == WLC_E_STATUS_SUCCESS) { ++ wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; ++ if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { ++ AP6210_DEBUG("ACTION FRAME SCAN DONE\n"); ++ wl_clr_p2p_status(wl, SCANNING); ++ wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); ++ if (wl->afx_hdl->peer_chan == WL_INVALID) ++ complete(&wl->act_frm_scan); ++ } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { ++ AP6210_DEBUG("ESCAN COMPLETED\n"); ++ wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; ++ wl_inform_bss(wl); ++ wl_notify_escan_complete(wl, ndev, false, false); ++ } ++ } ++ else if (status == WLC_E_STATUS_ABORT) { ++ wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; ++ if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { ++ AP6210_DEBUG("ACTION FRAME SCAN DONE\n"); ++ wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); ++ wl_clr_p2p_status(wl, SCANNING); ++ if (wl->afx_hdl->peer_chan == WL_INVALID) ++ complete(&wl->act_frm_scan); ++ } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { ++ AP6210_DEBUG("ESCAN ABORTED\n"); ++ wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; ++ wl_inform_bss(wl); ++ wl_notify_escan_complete(wl, ndev, true, false); ++ } ++ } ++ else if (status == WLC_E_STATUS_NEWSCAN) ++ { ++ escan_result = (wl_escan_result_t *) data; ++ AP6210_ERR("WLC_E_STATUS_NEWSCAN : scan_request[%p]\n", wl->scan_request); ++ AP6210_ERR("sync_id[%d], bss_count[%d]\n", escan_result->sync_id, ++ escan_result->bss_count); ++ } else if (status == WLC_E_STATUS_TIMEOUT) { ++ AP6210_ERR("WLC_E_STATUS_TIMEOUT : scan_request[%p]\n", wl->scan_request); ++ AP6210_ERR("escan_on[%d], reason[0x%x]\n", wl->escan_on, e->reason); ++ if (e->reason == 0xFFFFFFFF) { ++ wl_notify_escan_complete(wl, wl->escan_info.ndev, true, true); ++ } ++ } else { ++ AP6210_ERR("unexpected Escan Event %d : abort\n", status); ++ wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; ++ if (wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { ++ AP6210_DEBUG("ACTION FRAME SCAN DONE\n"); ++ wl_clr_p2p_status(wl, SCANNING); ++ wl_clr_drv_status(wl, SCANNING, wl->afx_hdl->dev); ++ if (wl->afx_hdl->peer_chan == WL_INVALID) ++ complete(&wl->act_frm_scan); ++ } else if ((likely(wl->scan_request)) || (wl->sched_scan_running)) { ++ wl->bss_list = (wl_scan_results_t *)wl->escan_info.escan_buf; ++ wl_inform_bss(wl); ++ wl_notify_escan_complete(wl, ndev, true, false); ++ } ++ } ++exit: ++ mutex_unlock(&wl->usr_sync); ++ return err; ++} ++static void wl_cfg80211_concurrent_roam(struct wl_priv *wl, int enable) ++{ ++ u32 connected_cnt = wl_get_drv_status_all(wl, CONNECTED); ++ struct net_info *iter, *next; ++ int err; ++ ++ if (!wl->roamoff_on_concurrent) ++ return; ++ if (enable && connected_cnt > 1) { ++ for_each_ndev(wl, iter, next) { ++ /* Save the current roam setting */ ++ if ((err = wldev_iovar_getint(iter->ndev, "roam_off", ++ (s32 *)&iter->roam_off)) != BCME_OK) { ++ AP6210_ERR("%s:Failed to get current roam setting err %d\n", ++ iter->ndev->name, err); ++ continue; ++ } ++ if ((err = wldev_iovar_setint(iter->ndev, "roam_off", 1)) != BCME_OK) { ++ AP6210_ERR(" %s:failed to set roam_off : %d\n", ++ iter->ndev->name, err); ++ } ++ } ++ } ++ else if (!enable) { ++ for_each_ndev(wl, iter, next) { ++ if (iter->roam_off != WL_INVALID) { ++ if ((err = wldev_iovar_setint(iter->ndev, "roam_off", ++ iter->roam_off)) == BCME_OK) ++ iter->roam_off = WL_INVALID; ++ else { ++ AP6210_ERR(" %s:failed to set roam_off : %d\n", ++ iter->ndev->name, err); ++ } ++ } ++ } ++ } ++ return; ++} ++ ++static void wl_cfg80211_determine_vsdb_mode(struct wl_priv *wl) ++{ ++ struct net_info *iter, *next; ++ u32 chan = 0; ++ u32 chanspec = 0; ++ u32 prev_chan = 0; ++ u32 connected_cnt = wl_get_drv_status_all(wl, CONNECTED); ++ wl->vsdb_mode = false; ++ ++ if (connected_cnt <= 1) { ++ return; ++ } ++ for_each_ndev(wl, iter, next) { ++ chanspec = 0; ++ chan = 0; ++ if (wl_get_drv_status(wl, CONNECTED, iter->ndev)) { ++ if (wldev_iovar_getint(iter->ndev, "chanspec", ++ (s32 *)&chanspec) == BCME_OK) { ++ chan = CHSPEC_CHANNEL(chanspec); ++ if (CHSPEC_IS40(chanspec)) { ++ if (CHSPEC_SB_UPPER(chanspec)) ++ chan += CH_10MHZ_APART; ++ else ++ chan -= CH_10MHZ_APART; ++ } ++ wl_update_prof(wl, iter->ndev, NULL, ++ &chan, WL_PROF_CHAN); ++ } ++ if (!prev_chan && chan) ++ prev_chan = chan; ++ else if (prev_chan && (prev_chan != chan)) ++ wl->vsdb_mode = true; ++ } ++ } ++ return; ++} ++static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_info, ++ enum wl_status state, bool set) ++{ ++ s32 pm = PM_FAST; ++ s32 err = BCME_OK; ++ u32 chan = 0; ++ struct net_info *iter, *next; ++ struct net_device *primary_dev = wl_to_prmry_ndev(wl); ++ AP6210_DEBUG("Enter state %d set %d _net_info->pm_restore %d iface %s\n", ++ state, set, _net_info->pm_restore, _net_info->ndev->name); ++ ++ if (state != WL_STATUS_CONNECTED) ++ return 0; ++ ++ if (set) { ++ wl_cfg80211_concurrent_roam(wl, 1); ++ ++ if (wl_get_mode_by_netdev(wl, _net_info->ndev) == WL_MODE_AP) { ++ pm = PM_OFF; ++ AP6210_DEBUG("%s:AP power save %s\n", _net_info->ndev->name, ++ pm ? "enabled" : "disabled"); ++ if ((err = wldev_ioctl(_net_info->ndev, WLC_SET_PM, ++ &pm, sizeof(pm), true)) != 0) { ++ if (err == -ENODEV) ++ AP6210_DEBUG("%s:net_device is not ready\n", ++ _net_info->ndev->name); ++ else ++ AP6210_ERR("%s:error (%d)\n", _net_info->ndev->name, err); ++ } ++ if (wl_add_remove_eventmsg(primary_dev, WLC_E_P2P_PROBREQ_MSG, false)) ++ AP6210_ERR(" failed to unset WLC_E_P2P_PROPREQ_MSG\n"); ++ return 0; ++ } ++ wl_cfg80211_determine_vsdb_mode(wl); ++ pm = PM_OFF; ++ for_each_ndev(wl, iter, next) { ++ if ((!wl->vsdb_mode) && (iter->ndev != _net_info->ndev)) { ++ /* Do not touch the other interfaces power save ++ * if we are not in vsdb mode ++ */ ++ continue; ++ } ++ /* Save the current power mode */ ++ iter->pm_restore = true; ++ err = wldev_ioctl(iter->ndev, WLC_GET_PM, &iter->pm, ++ sizeof(iter->pm), false); ++ AP6210_DEBUG("%s:power save %s\n", iter->ndev->name, ++ iter->pm ? "enabled" : "disabled"); ++ if ((err = wldev_ioctl(iter->ndev, WLC_SET_PM, &pm, ++ sizeof(pm), true)) != 0) { ++ if (err == -ENODEV) ++ AP6210_DEBUG("%s:netdev not ready\n", iter->ndev->name); ++ else ++ AP6210_ERR("%s:error (%d)\n", iter->ndev->name, err); ++ iter->ndev->ieee80211_ptr->ps = pm ? true: false; ++ } ++ } ++ } ++ else { /* clear */ ++ chan = 0; ++ /* clear chan information when the net device is disconnected */ ++ wl_update_prof(wl, _net_info->ndev, NULL, &chan, WL_PROF_CHAN); ++ wl_cfg80211_determine_vsdb_mode(wl); ++ for_each_ndev(wl, iter, next) { ++ if (iter->pm_restore) { ++ AP6210_DEBUG("%s:restoring power save %s\n", ++ iter->ndev->name, (iter->pm ? "enabled" : "disabled")); ++ err = wldev_ioctl(iter->ndev, ++ WLC_SET_PM, &iter->pm, sizeof(iter->pm), true); ++ if (unlikely(err)) { ++ if (err == -ENODEV) ++ AP6210_DEBUG("%s:netdev not ready\n", iter->ndev->name); ++ else ++ AP6210_ERR("%s:error(%d)\n", iter->ndev->name, err); ++ break; ++ } ++ iter->pm_restore = 0; ++ } ++ } ++ wl_cfg80211_concurrent_roam(wl, 0); ++ } ++ return err; ++} ++ ++static s32 wl_init_scan(struct wl_priv *wl) ++{ ++ struct wl_iscan_ctrl *iscan = wl_to_iscan(wl); ++ int err = 0; ++ ++ if (wl->iscan_on) { ++ iscan->dev = wl_to_prmry_ndev(wl); ++ iscan->state = WL_ISCAN_STATE_IDLE; ++ wl_init_iscan_handler(iscan); ++ iscan->timer_ms = WL_ISCAN_TIMER_INTERVAL_MS; ++ init_timer(&iscan->timer); ++ iscan->timer.data = (unsigned long) iscan; ++ iscan->timer.function = wl_iscan_timer; ++ sema_init(&iscan->sync, 0); ++ iscan->tsk = kthread_run(wl_iscan_thread, iscan, "wl_iscan"); ++ if (IS_ERR(iscan->tsk)) { ++ AP6210_ERR("Could not create iscan thread\n"); ++ iscan->tsk = NULL; ++ return -ENOMEM; ++ } ++ iscan->data = wl; ++ } else if (wl->escan_on) { ++ wl->evt_handler[WLC_E_ESCAN_RESULT] = wl_escan_handler; ++ wl->escan_info.escan_state = WL_ESCAN_STATE_IDLE; ++ } ++ /* Init scan_timeout timer */ ++ init_timer(&wl->scan_timeout); ++ wl->scan_timeout.data = (unsigned long) wl; ++ wl->scan_timeout.function = wl_scan_timeout; ++ ++ return err; ++} ++ ++static s32 wl_init_priv(struct wl_priv *wl) ++{ ++ struct wiphy *wiphy = wl_to_wiphy(wl); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ s32 err = 0; ++ ++ wl->scan_request = NULL; ++ wl->pwr_save = !!(wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT); ++ wl->iscan_on = false; ++ wl->escan_on = true; ++ wl->roam_on = false; ++ wl->iscan_kickstart = false; ++ wl->active_scan = true; ++ wl->rf_blocked = false; ++ wl->vsdb_mode = false; ++ wl->wlfc_on = false; ++ wl->roamoff_on_concurrent = true; ++ /* register interested state */ ++ set_bit(WL_STATUS_CONNECTED, &wl->interrested_state); ++ spin_lock_init(&wl->cfgdrv_lock); ++ mutex_init(&wl->ioctl_buf_sync); ++ init_waitqueue_head(&wl->netif_change_event); ++ init_completion(&wl->send_af_done); ++ init_completion(&wl->iface_disable); ++ wl_init_eq(wl); ++ err = wl_init_priv_mem(wl); ++ if (err) ++ return err; ++ if (wl_create_event_handler(wl)) ++ return -ENOMEM; ++ wl_init_event_handler(wl); ++ mutex_init(&wl->usr_sync); ++ mutex_init(&wl->event_sync); ++ err = wl_init_scan(wl); ++ if (err) ++ return err; ++ wl_init_conf(wl->conf); ++ wl_init_prof(wl, ndev); ++ wl_link_down(wl); ++ DNGL_FUNC(dhd_cfg80211_init, (wl)); ++ ++ return err; ++} ++ ++static void wl_deinit_priv(struct wl_priv *wl) ++{ ++ DNGL_FUNC(dhd_cfg80211_deinit, (wl)); ++ wl_destroy_event_handler(wl); ++ wl_flush_eq(wl); ++ wl_link_down(wl); ++ del_timer_sync(&wl->scan_timeout); ++ wl_term_iscan(wl); ++ wl_deinit_priv_mem(wl); ++ unregister_netdevice_notifier(&wl_cfg80211_netdev_notifier); ++} ++ ++#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) ++static s32 wl_cfg80211_attach_p2p(void) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ AP6210_DEBUG("Enter \n"); ++ ++ if (wl_cfgp2p_register_ndev(wl) < 0) { ++ AP6210_ERR("%s: P2P attach failed. \n", __func__); ++ return -ENODEV; ++ } ++ ++ return 0; ++} ++ ++static s32 wl_cfg80211_detach_p2p(void) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct wireless_dev *wdev = wl->p2p_wdev; ++ ++ AP6210_DEBUG("Enter \n"); ++ if (!wdev || !wl) { ++ AP6210_ERR("Invalid Ptr\n"); ++ return -EINVAL; ++ } ++ ++ wl_cfgp2p_unregister_ndev(wl); ++ ++ wl->p2p_wdev = NULL; ++ wl->p2p_net = NULL; ++ AP6210_DEBUG("Freeing 0x%08x \n", (unsigned int)wdev); ++ kfree(wdev); ++ ++ return 0; ++} ++#endif /* defined(WLP2P) && defined(WL_ENABLE_P2P_IF) */ ++ ++s32 wl_cfg80211_attach_post(struct net_device *ndev) ++{ ++ struct wl_priv * wl = NULL; ++ s32 err = 0; ++ AP6210_DEBUG("In\n"); ++ if (unlikely(!ndev)) { ++ AP6210_ERR("ndev is invaild\n"); ++ return -ENODEV; ++ } ++ wl = wlcfg_drv_priv; ++ if (unlikely(!wl)) { ++ AP6210_ERR("wl is invaild\n"); ++ return -EINVAL; ++ } ++ if (!wl_get_drv_status(wl, READY, ndev)) { ++ if (wl->wdev && ++ wl_cfgp2p_supported(wl, ndev)) { ++#if !defined(WL_ENABLE_P2P_IF) ++ wl->wdev->wiphy->interface_modes |= ++ (BIT(NL80211_IFTYPE_P2P_CLIENT)| ++ BIT(NL80211_IFTYPE_P2P_GO)); ++#endif ++ if ((err = wl_cfgp2p_init_priv(wl)) != 0) ++ goto fail; ++ ++#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) ++ if (wl->p2p_net) { ++ /* Update MAC addr for p2p0 interface here. */ ++ memcpy(wl->p2p_net->dev_addr, ndev->dev_addr, ETH_ALEN); ++ wl->p2p_net->dev_addr[0] |= 0x02; ++ AP6210_ERR("%s: p2p_dev_addr="MACDBG "\n", ++ wl->p2p_net->name, ++ MAC2STRDBG(wl->p2p_net->dev_addr)); ++ } else { ++ AP6210_ERR("p2p_net not yet populated." ++ " Couldn't update the MAC Address for p2p0 \n"); ++ return -ENODEV; ++ } ++#endif /* defined(WLP2P) && (WL_ENABLE_P2P_IF) */ ++ ++ wl->p2p_supported = true; ++ } ++ } ++ wl_set_drv_status(wl, READY, ndev); ++fail: ++ return err; ++} ++ ++s32 wl_cfg80211_attach(struct net_device *ndev, void *data) ++{ ++ struct wireless_dev *wdev; ++ struct wl_priv *wl; ++ s32 err = 0; ++ struct device *dev; ++ ++ AP6210_DEBUG("In\n"); ++ if (!ndev) { ++ AP6210_ERR("ndev is invaild\n"); ++ return -ENODEV; ++ } ++ AP6210_DEBUG("func %p\n", wl_cfg80211_get_parent_dev()); ++ dev = wl_cfg80211_get_parent_dev(); ++ ++ wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); ++ if (unlikely(!wdev)) { ++ AP6210_ERR("Could not allocate wireless device\n"); ++ return -ENOMEM; ++ } ++ err = wl_setup_wiphy(wdev, dev); ++ if (unlikely(err)) { ++ kfree(wdev); ++ return -ENOMEM; ++ } ++ wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS); ++ wl = (struct wl_priv *)wiphy_priv(wdev->wiphy); ++ wl->wdev = wdev; ++ wl->pub = data; ++ INIT_LIST_HEAD(&wl->net_list); ++ ndev->ieee80211_ptr = wdev; ++ SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy)); ++ wdev->netdev = ndev; ++ wl->state_notifier = wl_notifier_change_state; ++ err = wl_alloc_netinfo(wl, ndev, wdev, WL_MODE_BSS, PM_ENABLE); ++ if (err) { ++ AP6210_ERR("Failed to alloc net_info (%d)\n", err); ++ goto cfg80211_attach_out; ++ } ++ err = wl_init_priv(wl); ++ if (err) { ++ AP6210_ERR("Failed to init iwm_priv (%d)\n", err); ++ goto cfg80211_attach_out; ++ } ++ ++ err = wl_setup_rfkill(wl, TRUE); ++ if (err) { ++ AP6210_ERR("Failed to setup rfkill %d\n", err); ++ goto cfg80211_attach_out; ++ } ++ err = register_netdevice_notifier(&wl_cfg80211_netdev_notifier); ++ if (err) { ++ AP6210_ERR("Failed to register notifierl %d\n", err); ++ goto cfg80211_attach_out; ++ } ++#if defined(COEX_DHCP) ++ if (wl_cfg80211_btcoex_init(wl)) ++ goto cfg80211_attach_out; ++#endif ++#if defined(BSSCACHE) ++ wl_init_bss_cache_ctrl(&g_bss_cache_ctrl); ++#endif ++ ++ wlcfg_drv_priv = wl; ++ ++#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) ++ err = wl_cfg80211_attach_p2p(); ++ if (err) ++ goto cfg80211_attach_out; ++#endif ++ ++ return err; ++ ++cfg80211_attach_out: ++ err = wl_setup_rfkill(wl, FALSE); ++ wl_free_wdev(wl); ++ return err; ++} ++ ++void wl_cfg80211_detach(void *para) ++{ ++ struct wl_priv *wl; ++ ++ (void)para; ++ wl = wlcfg_drv_priv; ++ ++ AP6210_DEBUG("In\n"); ++ ++#if defined(COEX_DHCP) ++ wl_cfg80211_btcoex_deinit(wl); ++#endif ++ ++ wl_setup_rfkill(wl, FALSE); ++ if (wl->p2p_supported) { ++ if (timer_pending(&wl->p2p->listen_timer)) ++ del_timer_sync(&wl->p2p->listen_timer); ++ wl_cfgp2p_deinit_priv(wl); ++ } ++ ++#if defined(WLP2P) && defined(WL_ENABLE_P2P_IF) ++ wl_cfg80211_detach_p2p(); ++#endif ++ wl_deinit_priv(wl); ++ wlcfg_drv_priv = NULL; ++ wl_cfg80211_clear_parent_dev(); ++ wl_free_wdev(wl); ++#if defined(RSSIAVG) ++ wl_free_rssi_cache(&g_rssi_cache_ctrl); ++#endif ++#if defined(BSSCACHE) ++ wl_release_bss_cache_ctrl(&g_bss_cache_ctrl); ++#endif ++ /* PLEASE do NOT call any function after wl_free_wdev, the driver's private structure "wl", ++ * which is the private part of wiphy, has been freed in wl_free_wdev !!!!!!!!!!! ++ */ ++} ++ ++static void wl_wakeup_event(struct wl_priv *wl) ++{ ++ if (wl->event_tsk.thr_pid >= 0) { ++ DHD_OS_WAKE_LOCK(wl->pub); ++ up(&wl->event_tsk.sema); ++ } ++} ++ ++static int wl_is_p2p_event(struct wl_event_q *e) ++{ ++ switch (e->etype) { ++ /* We have to seperate out the P2P events received ++ * on primary interface so that it can be send up ++ * via p2p0 interface. ++ */ ++ case WLC_E_P2P_PROBREQ_MSG: ++ case WLC_E_P2P_DISC_LISTEN_COMPLETE: ++ case WLC_E_ACTION_FRAME_RX: ++ case WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE: ++ case WLC_E_ACTION_FRAME_COMPLETE: ++ ++ if (e->emsg.ifidx != 0) { ++ AP6210_DEBUG("P2P Event on Virtual I/F (ifidx:%d) \n", ++ e->emsg.ifidx); ++ /* We are only bothered about the P2P events received ++ * on primary interface. For rest of them return false ++ * so that it is sent over the interface corresponding ++ * to the ifidx. ++ */ ++ return FALSE; ++ } else { ++ AP6210_DEBUG("P2P Event on Primary I/F (ifidx:%d)." ++ " Sent it to p2p0 \n", e->emsg.ifidx); ++ return TRUE; ++ } ++ break; ++ ++ default: ++ AP6210_DEBUG("NON-P2P Event %d on ifidx (ifidx:%d) \n", ++ e->etype, e->emsg.ifidx); ++ return FALSE; ++ } ++} ++ ++static s32 wl_event_handler(void *data) ++{ ++ struct net_device *netdev; ++ struct wl_priv *wl = NULL; ++ struct wl_event_q *e; ++ tsk_ctl_t *tsk = (tsk_ctl_t *)data; ++ ++ wl = (struct wl_priv *)tsk->parent; ++#ifndef USE_KTHREAD_API ++ DAEMONIZE("dhd_cfg80211_event"); ++ complete(&tsk->completed); ++#else ++ AP6210_ERR("tsk Enter, tsk = 0x%08x\n", (unsigned int)tsk); ++#endif ++ ++ while (down_interruptible (&tsk->sema) == 0) { ++ SMP_RD_BARRIER_DEPENDS(); ++ if (tsk->terminated) ++ break; ++ while ((e = wl_deq_event(wl))) { ++ AP6210_DEBUG("event type (%d), if idx: %d\n", e->etype, e->emsg.ifidx); ++ /* All P2P device address related events comes on primary interface since ++ * there is no corresponding bsscfg for P2P interface. Map it to p2p0 ++ * interface. ++ */ ++ if ((wl_is_p2p_event(e) == TRUE) && (wl->p2p_net)) { ++ netdev = wl->p2p_net; ++ } else { ++ netdev = dhd_idx2net((struct dhd_pub *)(wl->pub), e->emsg.ifidx); ++ } ++ if (!netdev) ++ netdev = wl_to_prmry_ndev(wl); ++ if (e->etype < WLC_E_LAST && wl->evt_handler[e->etype]) { ++ wl->evt_handler[e->etype] (wl, netdev, &e->emsg, e->edata); ++ } else { ++ AP6210_DEBUG("Unknown Event (%d): ignoring\n", e->etype); ++ } ++ wl_put_event(e); ++ } ++ DHD_OS_WAKE_UNLOCK(wl->pub); ++ } ++ AP6210_ERR("%s was terminated\n", __func__); ++ complete_and_exit(&tsk->completed, 0); ++ return 0; ++} ++ ++void ++wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t * e, void *data) ++{ ++ u32 event_type = ntoh32(e->event_type); ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++#if (WL_DBG_LEVEL > 0) ++ s8 *estr = (event_type <= sizeof(wl_dbg_estr) / WL_DBG_ESTR_MAX - 1) ? ++ wl_dbg_estr[event_type] : (s8 *) "Unknown"; ++ AP6210_DEBUG("event_type (%d):" "WLC_E_" "%s\n", event_type, estr); ++#endif /* (WL_DBG_LEVEL > 0) */ ++ ++ if (event_type == WLC_E_PFN_NET_FOUND) { ++ AP6210_DEBUG(" PNOEVENT: PNO_NET_FOUND\n"); ++ } ++ else if (event_type == WLC_E_PFN_NET_LOST) { ++ AP6210_DEBUG(" PNOEVENT: PNO_NET_LOST\n"); ++ } ++ ++ if (likely(!wl_enq_event(wl, ndev, event_type, e, data))) ++ wl_wakeup_event(wl); ++} ++ ++static void wl_init_eq(struct wl_priv *wl) ++{ ++ wl_init_eq_lock(wl); ++ INIT_LIST_HEAD(&wl->eq_list); ++} ++ ++static void wl_flush_eq(struct wl_priv *wl) ++{ ++ struct wl_event_q *e; ++ unsigned long flags; ++ ++ flags = wl_lock_eq(wl); ++ while (!list_empty(&wl->eq_list)) { ++ e = list_first_entry(&wl->eq_list, struct wl_event_q, eq_list); ++ list_del(&e->eq_list); ++ kfree(e); ++ } ++ wl_unlock_eq(wl, flags); ++} ++ ++/* ++* retrieve first queued event from head ++*/ ++ ++static struct wl_event_q *wl_deq_event(struct wl_priv *wl) ++{ ++ struct wl_event_q *e = NULL; ++ unsigned long flags; ++ ++ flags = wl_lock_eq(wl); ++ if (likely(!list_empty(&wl->eq_list))) { ++ e = list_first_entry(&wl->eq_list, struct wl_event_q, eq_list); ++ list_del(&e->eq_list); ++ } ++ wl_unlock_eq(wl, flags); ++ ++ return e; ++} ++ ++/* ++ * push event to tail of the queue ++ */ ++ ++static s32 ++wl_enq_event(struct wl_priv *wl, struct net_device *ndev, u32 event, const wl_event_msg_t *msg, ++ void *data) ++{ ++ struct wl_event_q *e; ++ s32 err = 0; ++ uint32 evtq_size; ++ uint32 data_len; ++ unsigned long flags; ++ gfp_t aflags; ++ ++ data_len = 0; ++ if (data) ++ data_len = ntoh32(msg->datalen); ++ evtq_size = sizeof(struct wl_event_q) + data_len; ++ aflags = (in_atomic()) ? GFP_ATOMIC : GFP_KERNEL; ++ e = kzalloc(evtq_size, aflags); ++ if (unlikely(!e)) { ++ AP6210_ERR("event alloc failed\n"); ++ return -ENOMEM; ++ } ++ e->etype = event; ++ memcpy(&e->emsg, msg, sizeof(wl_event_msg_t)); ++ if (data) ++ memcpy(e->edata, data, data_len); ++ flags = wl_lock_eq(wl); ++ list_add_tail(&e->eq_list, &wl->eq_list); ++ wl_unlock_eq(wl, flags); ++ ++ return err; ++} ++ ++static void wl_put_event(struct wl_event_q *e) ++{ ++ kfree(e); ++} ++ ++static s32 wl_config_ifmode(struct wl_priv *wl, struct net_device *ndev, s32 iftype) ++{ ++ s32 infra = 0; ++ s32 err = 0; ++ s32 mode = 0; ++ switch (iftype) { ++ case NL80211_IFTYPE_MONITOR: ++ case NL80211_IFTYPE_WDS: ++ AP6210_ERR("type (%d) : currently we do not support this mode\n", ++ iftype); ++ err = -EINVAL; ++ return err; ++ case NL80211_IFTYPE_ADHOC: ++ mode = WL_MODE_IBSS; ++ break; ++ case NL80211_IFTYPE_STATION: ++ case NL80211_IFTYPE_P2P_CLIENT: ++ mode = WL_MODE_BSS; ++ infra = 1; ++ break; ++ case NL80211_IFTYPE_AP: ++ case NL80211_IFTYPE_P2P_GO: ++ mode = WL_MODE_AP; ++ infra = 1; ++ break; ++ default: ++ err = -EINVAL; ++ AP6210_ERR("invalid type (%d)\n", iftype); ++ return err; ++ } ++ infra = htod32(infra); ++ err = wldev_ioctl(ndev, WLC_SET_INFRA, &infra, sizeof(infra), true); ++ if (unlikely(err)) { ++ AP6210_ERR("WLC_SET_INFRA error (%d)\n", err); ++ return err; ++ } ++ ++ wl_set_mode_by_netdev(wl, ndev, mode); ++ ++ return 0; ++} ++ ++void wl_cfg80211_add_to_eventbuffer(struct wl_eventmsg_buf *ev, u16 event, bool set) ++{ ++ if (!ev || (event > WLC_E_LAST)) ++ return; ++ ++ if (ev->num < MAX_EVENT_BUF_NUM) { ++ ev->event[ev->num].type = event; ++ ev->event[ev->num].set = set; ++ ev->num++; ++ } else { ++ AP6210_ERR("evenbuffer doesn't support > %u events. Update" ++ " the define MAX_EVENT_BUF_NUM \n", MAX_EVENT_BUF_NUM); ++ ASSERT(0); ++ } ++} ++ ++s32 wl_cfg80211_apply_eventbuffer( ++ struct net_device *ndev, ++ struct wl_priv *wl, ++ wl_eventmsg_buf_t *ev) ++{ ++ char eventmask[WL_EVENTING_MASK_LEN]; ++ int i, ret = 0; ++ s8 iovbuf[WL_EVENTING_MASK_LEN + 12]; ++ ++ if (!ev || (!ev->num)) ++ return -EINVAL; ++ ++ mutex_lock(&wl->event_sync); ++ ++ /* Read event_msgs mask */ ++ bcm_mkiovar("event_msgs", NULL, 0, iovbuf, ++ sizeof(iovbuf)); ++ ret = wldev_ioctl(ndev, WLC_GET_VAR, iovbuf, sizeof(iovbuf), false); ++ if (unlikely(ret)) { ++ AP6210_ERR("Get event_msgs error (%d)\n", ret); ++ goto exit; ++ } ++ memcpy(eventmask, iovbuf, WL_EVENTING_MASK_LEN); ++ ++ /* apply the set bits */ ++ for (i = 0; i < ev->num; i++) { ++ if (ev->event[i].set) ++ setbit(eventmask, ev->event[i].type); ++ else ++ clrbit(eventmask, ev->event[i].type); ++ } ++ ++ /* Write updated Event mask */ ++ bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, ++ sizeof(iovbuf)); ++ ret = wldev_ioctl(ndev, WLC_SET_VAR, iovbuf, sizeof(iovbuf), true); ++ if (unlikely(ret)) { ++ AP6210_ERR("Set event_msgs error (%d)\n", ret); ++ } ++ ++exit: ++ mutex_unlock(&wl->event_sync); ++ return ret; ++} ++ ++s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add) ++{ ++ s8 iovbuf[WL_EVENTING_MASK_LEN + 12]; ++ s8 eventmask[WL_EVENTING_MASK_LEN]; ++ s32 err = 0; ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ if (!ndev || !wl) ++ return -ENODEV; ++ ++ mutex_lock(&wl->event_sync); ++ ++ /* Setup event_msgs */ ++ bcm_mkiovar("event_msgs", NULL, 0, iovbuf, ++ sizeof(iovbuf)); ++ err = wldev_ioctl(ndev, WLC_GET_VAR, iovbuf, sizeof(iovbuf), false); ++ if (unlikely(err)) { ++ AP6210_ERR("Get event_msgs error (%d)\n", err); ++ goto eventmsg_out; ++ } ++ memcpy(eventmask, iovbuf, WL_EVENTING_MASK_LEN); ++ if (add) { ++ setbit(eventmask, event); ++ } else { ++ clrbit(eventmask, event); ++ } ++ bcm_mkiovar("event_msgs", eventmask, WL_EVENTING_MASK_LEN, iovbuf, ++ sizeof(iovbuf)); ++ err = wldev_ioctl(ndev, WLC_SET_VAR, iovbuf, sizeof(iovbuf), true); ++ if (unlikely(err)) { ++ AP6210_ERR("Set event_msgs error (%d)\n", err); ++ goto eventmsg_out; ++ } ++ ++eventmsg_out: ++ mutex_unlock(&wl->event_sync); ++ return err; ++} ++ ++static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap) ++{ ++ struct net_device *dev = wl_to_prmry_ndev(wl); ++ struct ieee80211_channel *band_chan_arr = NULL; ++ wl_uint32_list_t *list; ++ u32 i, j, index, n_2g, n_5g, band, channel, array_size; ++ u32 *n_cnt = NULL; ++ chanspec_t c = 0; ++ s32 err = BCME_OK; ++ bool update; ++ bool ht40_allowed; ++ u8 *pbuf = NULL; ++ ++#define LOCAL_BUF_LEN 1024 ++ pbuf = kzalloc(LOCAL_BUF_LEN, GFP_KERNEL); ++ ++ if (pbuf == NULL) { ++ AP6210_ERR("failed to allocate local buf\n"); ++ return -ENOMEM; ++ } ++ list = (wl_uint32_list_t *)(void *) pbuf; ++ list->count = htod32(WL_NUMCHANSPECS); ++ ++ ++ err = wldev_iovar_getbuf_bsscfg(dev, "chanspecs", NULL, ++ 0, pbuf, LOCAL_BUF_LEN, 0, &wl->ioctl_buf_sync); ++ if (err != 0) { ++ AP6210_ERR("get chanspecs failed with %d\n", err); ++ kfree(pbuf); ++ return err; ++ } ++#undef LOCAL_BUF_LEN ++ ++ list = (wl_uint32_list_t *)(void *)pbuf; ++ band = array_size = n_2g = n_5g = 0; ++ for (i = 0; i < dtoh32(list->count); i++) { ++ index = 0; ++ update = false; ++ ht40_allowed = false; ++ c = (chanspec_t)dtoh32(list->element[i]); ++ c = wl_chspec_driver_to_host(c); ++ channel = CHSPEC_CHANNEL(c); ++ if (CHSPEC_IS40(c)) { ++ if (CHSPEC_SB_UPPER(c)) ++ channel += CH_10MHZ_APART; ++ else ++ channel -= CH_10MHZ_APART; ++ } else if (CHSPEC_IS80(c)) { ++ AP6210_DEBUG("HT80 center channel : %d\n", channel); ++ continue; ++ } ++ if (CHSPEC_IS2G(c) && (channel >= CH_MIN_2G_CHANNEL) && ++ (channel <= CH_MAX_2G_CHANNEL)) { ++ band_chan_arr = __wl_2ghz_channels; ++ array_size = ARRAYSIZE(__wl_2ghz_channels); ++ n_cnt = &n_2g; ++ band = IEEE80211_BAND_2GHZ; ++ ht40_allowed = (bw_cap == WLC_N_BW_40ALL)? true : false; ++ } else if (CHSPEC_IS5G(c) && channel >= CH_MIN_5G_CHANNEL) { ++ band_chan_arr = __wl_5ghz_a_channels; ++ array_size = ARRAYSIZE(__wl_5ghz_a_channels); ++ n_cnt = &n_5g; ++ band = IEEE80211_BAND_5GHZ; ++ ht40_allowed = (bw_cap == WLC_N_BW_20ALL)? false : true; ++ } else { ++ AP6210_ERR("Invalid channel Sepc. 0x%x.\n", c); ++ continue; ++ } ++ if (!ht40_allowed && CHSPEC_IS40(c)) ++ continue; ++ for (j = 0; (j < *n_cnt && (*n_cnt < array_size)); j++) { ++ if (band_chan_arr[j].hw_value == channel) { ++ update = true; ++ break; ++ } ++ } ++ if (update) ++ index = j; ++ else ++ index = *n_cnt; ++ if (index < array_size) { ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) ++ band_chan_arr[index].center_freq = ++ ieee80211_channel_to_frequency(channel); ++#else ++ band_chan_arr[index].center_freq = ++ ieee80211_channel_to_frequency(channel, band); ++#endif ++ band_chan_arr[index].hw_value = channel; ++ ++ if (CHSPEC_IS40(c) && ht40_allowed) { ++ /* assuming the order is HT20, HT40 Upper, ++ HT40 lower from chanspecs ++ */ ++ u32 ht40_flag = band_chan_arr[index].flags & IEEE80211_CHAN_NO_HT40; ++ if (CHSPEC_SB_UPPER(c)) { ++ if (ht40_flag == IEEE80211_CHAN_NO_HT40) ++ band_chan_arr[index].flags &= ++ ~IEEE80211_CHAN_NO_HT40; ++ band_chan_arr[index].flags |= IEEE80211_CHAN_NO_HT40PLUS; ++ } else { ++ /* It should be one of ++ IEEE80211_CHAN_NO_HT40 or IEEE80211_CHAN_NO_HT40PLUS ++ */ ++ band_chan_arr[index].flags &= ~IEEE80211_CHAN_NO_HT40; ++ if (ht40_flag == IEEE80211_CHAN_NO_HT40) ++ band_chan_arr[index].flags |= ++ IEEE80211_CHAN_NO_HT40MINUS; ++ } ++ } else { ++ band_chan_arr[index].flags = IEEE80211_CHAN_NO_HT40; ++ if (band == IEEE80211_BAND_2GHZ) ++ channel |= WL_CHANSPEC_BAND_2G; ++ else ++ channel |= WL_CHANSPEC_BAND_5G; ++ channel |= WL_CHANSPEC_BW_20; ++ channel = wl_chspec_host_to_driver(channel); ++ err = wldev_iovar_getint(dev, "per_chan_info", &channel); ++ if (!err) { ++ if (channel & WL_CHAN_RADAR) ++ band_chan_arr[index].flags |= ++ (IEEE80211_CHAN_RADAR | ++ IEEE80211_CHAN_NO_IBSS); ++ if (channel & WL_CHAN_PASSIVE) ++ band_chan_arr[index].flags |= ++ IEEE80211_CHAN_PASSIVE_SCAN; ++ } ++ } ++ if (!update) ++ (*n_cnt)++; ++ } ++ ++ } ++ __wl_band_2ghz.n_channels = n_2g; ++ __wl_band_5ghz_a.n_channels = n_5g; ++ kfree(pbuf); ++ return err; ++} ++ ++s32 wl_update_wiphybands(struct wl_priv *wl, bool notify) ++{ ++ struct wiphy *wiphy; ++ struct net_device *dev; ++ u32 bandlist[3]; ++ u32 nband = 0; ++ u32 i = 0; ++ s32 err = 0; ++ s32 index = 0; ++ s32 nmode = 0; ++ bool rollback_lock = false; ++ s32 bw_cap = 0; ++ s32 cur_band = -1; ++ struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS] = {NULL, }; ++ ++ if (wl == NULL) { ++ wl = wlcfg_drv_priv; ++ mutex_lock(&wl->usr_sync); ++ rollback_lock = true; ++ } ++ dev = wl_to_prmry_ndev(wl); ++ ++ memset(bandlist, 0, sizeof(bandlist)); ++ err = wldev_ioctl(dev, WLC_GET_BANDLIST, bandlist, ++ sizeof(bandlist), false); ++ if (unlikely(err)) { ++ AP6210_ERR("error read bandlist (%d)\n", err); ++ goto end_bands; ++ } ++ ++ wiphy = wl_to_wiphy(wl); ++ ++ err = wldev_ioctl(dev, WLC_GET_BAND, &cur_band, ++ sizeof(s32), false); ++ if (unlikely(err)) { ++ AP6210_ERR("error (%d)\n", err); ++ goto end_bands; ++ } ++ ++ err = wldev_iovar_getint(dev, "nmode", &nmode); ++ if (unlikely(err)) { ++ AP6210_ERR("error reading nmode (%d)\n", err); ++ } else { ++ /* For nmodeonly check bw cap */ ++ err = wldev_iovar_getint(dev, "mimo_bw_cap", &bw_cap); ++ if (unlikely(err)) { ++ AP6210_ERR("error get mimo_bw_cap (%d)\n", err); ++ } ++ } ++ ++ err = wl_construct_reginfo(wl, bw_cap); ++ if (err) { ++ AP6210_ERR("wl_construct_reginfo() fails err=%d\n", err); ++ if (err != BCME_UNSUPPORTED) ++ goto end_bands; ++ err = 0; ++ } ++ ++ nband = bandlist[0]; ++ ++ for (i = 1; i <= nband && i < ARRAYSIZE(bandlist); i++) { ++ index = -1; ++ if (bandlist[i] == WLC_BAND_5G && __wl_band_5ghz_a.n_channels > 0) { ++ bands[IEEE80211_BAND_5GHZ] = ++ &__wl_band_5ghz_a; ++ index = IEEE80211_BAND_5GHZ; ++ if (bw_cap == WLC_N_BW_40ALL || bw_cap == WLC_N_BW_20IN2G_40IN5G) ++ bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; ++ } ++ else if (bandlist[i] == WLC_BAND_2G && __wl_band_2ghz.n_channels > 0) { ++ bands[IEEE80211_BAND_2GHZ] = ++ &__wl_band_2ghz; ++ index = IEEE80211_BAND_2GHZ; ++ if (bw_cap == WLC_N_BW_40ALL) ++ bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; ++ } ++ ++ if ((index >= 0) && nmode) { ++ bands[index]->ht_cap.cap |= ++ (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_DSSSCCK40); ++ bands[index]->ht_cap.ht_supported = TRUE; ++ bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; ++ bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; ++ /* An HT shall support all EQM rates for one spatial stream */ ++ bands[index]->ht_cap.mcs.rx_mask[0] = 0xff; ++ } ++ ++ } ++ ++ wiphy->bands[IEEE80211_BAND_2GHZ] = bands[IEEE80211_BAND_2GHZ]; ++ wiphy->bands[IEEE80211_BAND_5GHZ] = bands[IEEE80211_BAND_5GHZ]; ++ ++ if (notify) ++ wiphy_apply_custom_regulatory(wiphy, &brcm_regdom); ++ ++end_bands: ++ if (rollback_lock) ++ mutex_unlock(&wl->usr_sync); ++ return err; ++} ++ ++static s32 __wl_cfg80211_up(struct wl_priv *wl) ++{ ++ s32 err = 0; ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ struct wireless_dev *wdev = ndev->ieee80211_ptr; ++ ++ AP6210_DEBUG("In\n"); ++ ++ err = dhd_config_dongle(wl, false); ++ if (unlikely(err)) ++ return err; ++ ++ err = wl_config_ifmode(wl, ndev, wdev->iftype); ++ if (unlikely(err && err != -EINPROGRESS)) { ++ AP6210_ERR("wl_config_ifmode failed\n"); ++ } ++ err = wl_update_wiphybands(wl, true); ++ if (unlikely(err)) { ++ AP6210_ERR("wl_update_wiphybands failed\n"); ++ } ++ ++ err = dhd_monitor_init(wl->pub); ++ err = wl_invoke_iscan(wl); ++ ++#ifdef WL_HOST_BAND_MGMT ++ /* By default the curr_band is initialized to BAND_AUTO */ ++ if (wl_cfg80211_set_band(ndev, WLC_BAND_AUTO) < 0) { ++ AP6210_ERR("roam_band set failed\n"); ++ err = -1; ++ } ++#endif /* WL_HOST_BAND_MGMT */ ++ ++#if defined(DHCP_SCAN_SUPPRESS) ++ /* wlan scan_supp timer and work thread info */ ++ init_timer(&wl->scan_supp_timer); ++ wl->scan_supp_timer.data = (ulong)wl; ++ wl->scan_supp_timer.function = wl_cfg80211_scan_supp_timerfunc; ++ INIT_WORK(&wl->wlan_work, wl_cfg80211_work_handler); ++#endif /* DHCP_SCAN_SUPPRESS */ ++ ++ wl_set_drv_status(wl, READY, ndev); ++ return err; ++} ++ ++static s32 __wl_cfg80211_down(struct wl_priv *wl) ++{ ++ s32 err = 0; ++ unsigned long flags; ++ struct net_info *iter, *next; ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ struct net_device *p2p_net = wl->p2p_net; ++ u32 bssidx = wl_cfgp2p_find_idx(wl, ndev); ++ AP6210_DEBUG("In\n"); ++ ++#if defined(DHCP_SCAN_SUPPRESS) ++ /* Force clear of scan_suppress */ ++ if (wl->scan_suppressed) ++ wl_cfg80211_scan_suppress(ndev, 0); ++ if (timer_pending(&wl->scan_supp_timer)) ++ del_timer_sync(&wl->scan_supp_timer); ++ cancel_work_sync(&wl->wlan_work); ++#endif /* DHCP_SCAN_SUPPRESS */ ++ ++ /* If BSS is operational (e.g SoftAp), bring it down */ ++ if (wl_cfgp2p_bss_isup(ndev, bssidx)) { ++ if (wl_cfgp2p_bss(wl, ndev, bssidx, 0) < 0) ++ AP6210_ERR("BSS down failed \n"); ++ } ++ ++ /* Check if cfg80211 interface is already down */ ++ if (!wl_get_drv_status(wl, READY, ndev)) ++ return err; /* it is even not ready */ ++ ++ for_each_ndev(wl, iter, next) ++ wl_set_drv_status(wl, SCAN_ABORTING, iter->ndev); ++ ++ wl_term_iscan(wl); ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ if (wl->scan_request) { ++ cfg80211_scan_done(wl->scan_request, true); ++ wl->scan_request = NULL; ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ ++ for_each_ndev(wl, iter, next) { ++ wl_clr_drv_status(wl, READY, iter->ndev); ++ wl_clr_drv_status(wl, SCANNING, iter->ndev); ++ wl_clr_drv_status(wl, SCAN_ABORTING, iter->ndev); ++ wl_clr_drv_status(wl, CONNECTING, iter->ndev); ++ wl_clr_drv_status(wl, CONNECTED, iter->ndev); ++ wl_clr_drv_status(wl, DISCONNECTING, iter->ndev); ++ wl_clr_drv_status(wl, AP_CREATED, iter->ndev); ++ wl_clr_drv_status(wl, AP_CREATING, iter->ndev); ++ } ++ wl_to_prmry_ndev(wl)->ieee80211_ptr->iftype = ++ NL80211_IFTYPE_STATION; ++ if (p2p_net) ++ dev_close(p2p_net); ++ DNGL_FUNC(dhd_cfg80211_down, (wl)); ++ wl_flush_eq(wl); ++ wl_link_down(wl); ++ if (wl->p2p_supported) ++ wl_cfgp2p_down(wl); ++ dhd_monitor_uninit(); ++ ++ return err; ++} ++ ++s32 wl_cfg80211_up(void *para) ++{ ++ struct wl_priv *wl; ++ s32 err = 0; ++ int val = 1; ++ dhd_pub_t *dhd; ++ ++ (void)para; ++ AP6210_DEBUG("In\n"); ++ wl = wlcfg_drv_priv; ++ ++ if ((err = wldev_ioctl(wl_to_prmry_ndev(wl), WLC_GET_VERSION, &val, ++ sizeof(int), false) < 0)) { ++ AP6210_ERR("WLC_GET_VERSION failed, err=%d\n", err); ++ return err; ++ } ++ val = dtoh32(val); ++ if (val != WLC_IOCTL_VERSION && val != 1) { ++ AP6210_ERR("Version mismatch, please upgrade. Got %d, expected %d or 1\n", ++ val, WLC_IOCTL_VERSION); ++ return BCME_VERSION; ++ } ++ ioctl_version = val; ++ AP6210_DEBUG("WLC_GET_VERSION=%d\n", ioctl_version); ++ ++ mutex_lock(&wl->usr_sync); ++ dhd = (dhd_pub_t *)(wl->pub); ++ if (!(dhd->op_mode & DHD_FLAG_HOSTAP_MODE)) { ++ err = wl_cfg80211_attach_post(wl_to_prmry_ndev(wl)); ++ if (unlikely(err)) ++ return err; ++ } ++ err = __wl_cfg80211_up(wl); ++ if (unlikely(err)) ++ AP6210_ERR("__wl_cfg80211_up failed\n"); ++ mutex_unlock(&wl->usr_sync); ++ return err; ++} ++ ++/* Private Event to Supplicant with indication that chip hangs */ ++int wl_cfg80211_hang(struct net_device *dev, u16 reason) ++{ ++ struct wl_priv *wl; ++ wl = wlcfg_drv_priv; ++ ++ AP6210_ERR("In : chip crash eventing\n"); ++ cfg80211_disconnected(dev, reason, NULL, 0, GFP_KERNEL); ++#if defined(RSSIAVG) ++ wl_free_rssi_cache(&g_rssi_cache_ctrl); ++#endif ++#if defined(BSSCACHE) ++ wl_free_bss_cache(&g_bss_cache_ctrl); ++ wl_run_bss_cache_timer(&g_bss_cache_ctrl, 0); ++#endif ++ if (wl != NULL) { ++ wl_link_down(wl); ++ } ++ return 0; ++} ++ ++s32 wl_cfg80211_down(void *para) ++{ ++ struct wl_priv *wl; ++ s32 err = 0; ++ ++ (void)para; ++ AP6210_DEBUG("In\n"); ++ wl = wlcfg_drv_priv; ++ mutex_lock(&wl->usr_sync); ++#if defined(RSSIAVG) ++ wl_free_rssi_cache(&g_rssi_cache_ctrl); ++#endif ++#if defined(BSSCACHE) ++ wl_free_bss_cache(&g_bss_cache_ctrl); ++ wl_run_bss_cache_timer(&g_bss_cache_ctrl, 0); ++#endif ++ err = __wl_cfg80211_down(wl); ++ mutex_unlock(&wl->usr_sync); ++ ++ return err; ++} ++ ++static void *wl_read_prof(struct wl_priv *wl, struct net_device *ndev, s32 item) ++{ ++ unsigned long flags; ++ void *rptr = NULL; ++ struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev); ++ ++ if (!profile) ++ return NULL; ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ switch (item) { ++ case WL_PROF_SEC: ++ rptr = &profile->sec; ++ break; ++ case WL_PROF_ACT: ++ rptr = &profile->active; ++ break; ++ case WL_PROF_BSSID: ++ rptr = profile->bssid; ++ break; ++ case WL_PROF_SSID: ++ rptr = &profile->ssid; ++ break; ++ case WL_PROF_CHAN: ++ rptr = &profile->channel; ++ break; ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ if (!rptr) ++ AP6210_ERR("invalid item (%d)\n", item); ++ return rptr; ++} ++ ++static s32 ++wl_update_prof(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data, s32 item) ++{ ++ s32 err = 0; ++ struct wlc_ssid *ssid; ++ unsigned long flags; ++ struct wl_profile *profile = wl_get_profile_by_netdev(wl, ndev); ++ ++ if (!profile) ++ return WL_INVALID; ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ switch (item) { ++ case WL_PROF_SSID: ++ ssid = (wlc_ssid_t *) data; ++ memset(profile->ssid.SSID, 0, ++ sizeof(profile->ssid.SSID)); ++ memcpy(profile->ssid.SSID, ssid->SSID, ssid->SSID_len); ++ profile->ssid.SSID_len = ssid->SSID_len; ++ break; ++ case WL_PROF_BSSID: ++ if (data) ++ memcpy(profile->bssid, data, ETHER_ADDR_LEN); ++ else ++ memset(profile->bssid, 0, ETHER_ADDR_LEN); ++ break; ++ case WL_PROF_SEC: ++ memcpy(&profile->sec, data, sizeof(profile->sec)); ++ break; ++ case WL_PROF_ACT: ++ profile->active = *(bool *)data; ++ break; ++ case WL_PROF_BEACONINT: ++ profile->beacon_interval = *(u16 *)data; ++ break; ++ case WL_PROF_DTIMPERIOD: ++ profile->dtim_period = *(u8 *)data; ++ break; ++ case WL_PROF_CHAN: ++ profile->channel = *(u32*)data; ++ default: ++ err = -EOPNOTSUPP; ++ break; ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ ++ if (err == EOPNOTSUPP) ++ AP6210_ERR("unsupported item (%d)\n", item); ++ ++ return err; ++} ++ ++void wl_cfg80211_dbg_level(u32 level) ++{ ++ /* ++ * prohibit to change debug level ++ * by insmod parameter. ++ * eventually debug level will be configured ++ * in compile time by using CONFIG_XXX ++ */ ++ /* wl_dbg_level = level; */ ++} ++ ++static bool wl_is_ibssmode(struct wl_priv *wl, struct net_device *ndev) ++{ ++ return wl_get_mode_by_netdev(wl, ndev) == WL_MODE_IBSS; ++} ++ ++static __used bool wl_is_ibssstarter(struct wl_priv *wl) ++{ ++ return wl->ibss_starter; ++} ++ ++static void wl_rst_ie(struct wl_priv *wl) ++{ ++ struct wl_ie *ie = wl_to_ie(wl); ++ ++ ie->offset = 0; ++} ++ ++static __used s32 wl_add_ie(struct wl_priv *wl, u8 t, u8 l, u8 *v) ++{ ++ struct wl_ie *ie = wl_to_ie(wl); ++ s32 err = 0; ++ ++ if (unlikely(ie->offset + l + 2 > WL_TLV_INFO_MAX)) { ++ AP6210_ERR("ei crosses buffer boundary\n"); ++ return -ENOSPC; ++ } ++ ie->buf[ie->offset] = t; ++ ie->buf[ie->offset + 1] = l; ++ memcpy(&ie->buf[ie->offset + 2], v, l); ++ ie->offset += l + 2; ++ ++ return err; ++} ++ ++static s32 wl_mrg_ie(struct wl_priv *wl, u8 *ie_stream, u16 ie_size) ++{ ++ struct wl_ie *ie = wl_to_ie(wl); ++ s32 err = 0; ++ ++ if (unlikely(ie->offset + ie_size > WL_TLV_INFO_MAX)) { ++ AP6210_ERR("ei_stream crosses buffer boundary\n"); ++ return -ENOSPC; ++ } ++ memcpy(&ie->buf[ie->offset], ie_stream, ie_size); ++ ie->offset += ie_size; ++ ++ return err; ++} ++ ++static s32 wl_cp_ie(struct wl_priv *wl, u8 *dst, u16 dst_size) ++{ ++ struct wl_ie *ie = wl_to_ie(wl); ++ s32 err = 0; ++ ++ if (unlikely(ie->offset > dst_size)) { ++ AP6210_ERR("dst_size is not enough\n"); ++ return -ENOSPC; ++ } ++ memcpy(dst, &ie->buf[0], ie->offset); ++ ++ return err; ++} ++ ++static u32 wl_get_ielen(struct wl_priv *wl) ++{ ++ struct wl_ie *ie = wl_to_ie(wl); ++ ++ return ie->offset; ++} ++ ++static void wl_link_up(struct wl_priv *wl) ++{ ++ wl->link_up = true; ++} ++ ++static void wl_link_down(struct wl_priv *wl) ++{ ++ struct wl_connect_info *conn_info = wl_to_conn(wl); ++ ++ AP6210_DEBUG("In\n"); ++ wl->link_up = false; ++ conn_info->req_ie_len = 0; ++ conn_info->resp_ie_len = 0; ++} ++ ++static unsigned long wl_lock_eq(struct wl_priv *wl) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&wl->eq_lock, flags); ++ return flags; ++} ++ ++static void wl_unlock_eq(struct wl_priv *wl, unsigned long flags) ++{ ++ spin_unlock_irqrestore(&wl->eq_lock, flags); ++} ++ ++static void wl_init_eq_lock(struct wl_priv *wl) ++{ ++ spin_lock_init(&wl->eq_lock); ++} ++ ++static void wl_delay(u32 ms) ++{ ++ if (in_atomic() || (ms < jiffies_to_msecs(1))) { ++ mdelay(ms); ++ } else { ++ msleep(ms); ++ } ++} ++ ++s32 wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ struct ether_addr p2pif_addr; ++ struct ether_addr primary_mac; ++ if (!wl->p2p) ++ return -1; ++ if (!p2p_is_on(wl)) { ++ get_primary_mac(wl, &primary_mac); ++ wl_cfgp2p_generate_bss_mac(&primary_mac, p2pdev_addr, &p2pif_addr); ++ } else { ++ memcpy(p2pdev_addr->octet, ++ wl->p2p->dev_addr.octet, ETHER_ADDR_LEN); ++ } ++ ++ ++ return 0; ++} ++s32 wl_cfg80211_set_p2p_noa(struct net_device *net, char* buf, int len) ++{ ++ struct wl_priv *wl; ++ ++ wl = wlcfg_drv_priv; ++ ++ return wl_cfgp2p_set_p2p_noa(wl, net, buf, len); ++} ++ ++s32 wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len) ++{ ++ struct wl_priv *wl; ++ wl = wlcfg_drv_priv; ++ ++ return wl_cfgp2p_get_p2p_noa(wl, net, buf, len); ++} ++ ++s32 wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len) ++{ ++ struct wl_priv *wl; ++ wl = wlcfg_drv_priv; ++ ++ return wl_cfgp2p_set_p2p_ps(wl, net, buf, len); ++} ++ ++s32 wl_cfg80211_channel_to_freq(u32 channel) ++{ ++ int freq = 0; ++ ++#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 38) && !defined(WL_COMPAT_WIRELESS) ++ freq = ieee80211_channel_to_frequency(channel); ++#else ++ { ++ u16 band = 0; ++ if (channel <= CH_MAX_2G_CHANNEL) ++ band = IEEE80211_BAND_2GHZ; ++ else ++ band = IEEE80211_BAND_5GHZ; ++ freq = ieee80211_channel_to_frequency(channel, band); ++ } ++#endif ++ return freq; ++} ++ ++s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, ++ enum wl_management_type type) ++{ ++ struct wl_priv *wl; ++ struct net_device *ndev = NULL; ++ struct ether_addr primary_mac; ++ s32 ret = 0; ++ s32 bssidx = 0; ++ s32 pktflag = 0; ++ wl = wlcfg_drv_priv; ++ ++ if (wl_get_drv_status(wl, AP_CREATING, net) || ++ wl_get_drv_status(wl, AP_CREATED, net)) { ++ ndev = net; ++ bssidx = 0; ++ } else if (wl->p2p) { ++ if (net == wl->p2p_net) { ++ net = wl_to_prmry_ndev(wl); ++ } ++ if (!wl->p2p->on) { ++ get_primary_mac(wl, &primary_mac); ++ wl_cfgp2p_generate_bss_mac(&primary_mac, &wl->p2p->dev_addr, ++ &wl->p2p->int_addr); ++ /* In case of p2p_listen command, supplicant send remain_on_channel ++ * without turning on P2P ++ */ ++ ++ p2p_on(wl) = true; ++ ret = wl_cfgp2p_enable_discovery(wl, net, NULL, 0); ++ ++ if (unlikely(ret)) { ++ goto exit; ++ } ++ } ++ if (net != wl_to_prmry_ndev(wl)) { ++ if (wl_get_mode_by_netdev(wl, net) == WL_MODE_AP) { ++ ndev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION); ++ bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_CONNECTION); ++ } ++ } else { ++ ndev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_PRIMARY); ++ bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); ++ } ++ } ++ if (ndev != NULL) { ++ switch (type) { ++ case WL_BEACON: ++ pktflag = VNDR_IE_BEACON_FLAG; ++ break; ++ case WL_PROBE_RESP: ++ pktflag = VNDR_IE_PRBRSP_FLAG; ++ break; ++ case WL_ASSOC_RESP: ++ pktflag = VNDR_IE_ASSOCRSP_FLAG; ++ break; ++ } ++ if (pktflag) ++ ret = wl_cfgp2p_set_management_ie(wl, ndev, bssidx, pktflag, buf, len); ++ } ++exit: ++ return ret; ++} ++ ++static const struct rfkill_ops wl_rfkill_ops = { ++ .set_block = wl_rfkill_set ++}; ++ ++static int wl_rfkill_set(void *data, bool blocked) ++{ ++ struct wl_priv *wl = (struct wl_priv *)data; ++ ++ AP6210_DEBUG("Enter \n"); ++ AP6210_DEBUG("RF %s\n", blocked ? "blocked" : "unblocked"); ++ ++ if (!wl) ++ return -EINVAL; ++ ++ wl->rf_blocked = blocked; ++ ++ return 0; ++} ++ ++static int wl_setup_rfkill(struct wl_priv *wl, bool setup) ++{ ++ s32 err = 0; ++ ++ AP6210_DEBUG("Enter \n"); ++ if (!wl) ++ return -EINVAL; ++ if (setup) { ++ wl->rfkill = rfkill_alloc("brcmfmac-wifi", ++ wl_cfg80211_get_parent_dev(), ++ RFKILL_TYPE_WLAN, &wl_rfkill_ops, (void *)wl); ++ ++ if (!wl->rfkill) { ++ err = -ENOMEM; ++ goto err_out; ++ } ++ ++ err = rfkill_register(wl->rfkill); ++ ++ if (err) ++ rfkill_destroy(wl->rfkill); ++ } else { ++ if (!wl->rfkill) { ++ err = -ENOMEM; ++ goto err_out; ++ } ++ ++ rfkill_unregister(wl->rfkill); ++ rfkill_destroy(wl->rfkill); ++ } ++ ++err_out: ++ return err; ++} ++ ++struct device *wl_cfg80211_get_parent_dev(void) ++{ ++ return cfg80211_parent_dev; ++} ++ ++void wl_cfg80211_set_parent_dev(void *dev) ++{ ++ cfg80211_parent_dev = dev; ++} ++ ++static void wl_cfg80211_clear_parent_dev(void) ++{ ++ cfg80211_parent_dev = NULL; ++} ++ ++static void get_primary_mac(struct wl_priv *wl, struct ether_addr *mac) ++{ ++ wldev_iovar_getbuf_bsscfg(wl_to_prmry_ndev(wl), "cur_etheraddr", NULL, ++ 0, wl->ioctl_buf, WLC_IOCTL_SMLEN, 0, &wl->ioctl_buf_sync); ++ memcpy(mac->octet, wl->ioctl_buf, ETHER_ADDR_LEN); ++} ++ ++int wl_cfg80211_do_driver_init(struct net_device *net) ++{ ++ struct wl_priv *wl = *(struct wl_priv **)netdev_priv(net); ++ ++ if (!wl || !wl->wdev) ++ return -EINVAL; ++ ++ if (dhd_do_driver_init(wl->wdev->netdev) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++void wl_cfg80211_enable_trace(u32 level) ++{ ++ wl_dbg_level = level; ++ AP6210_DEBUG("%s: wl_dbg_level = 0x%x\n", __FUNCTION__, wl_dbg_level); ++} ++ ++#if defined(WL_SUPPORT_BACKPORTED_KPATCHES) || (LINUX_VERSION_CODE >= KERNEL_VERSION(3, \ ++ 2, 0)) ++static s32 ++wl_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, ++ struct net_device *dev, u64 cookie) ++{ ++ /* CFG80211 checks for tx_cancel_wait callback when ATTR_DURATION ++ * is passed with CMD_FRAME. This callback is supposed to cancel ++ * the OFFCHANNEL Wait. Since we are already taking care of that ++ * with the tx_mgmt logic, do nothing here. ++ */ ++ ++ return 0; ++} ++#endif /* WL_SUPPORT_BACKPORTED_KPATCHES || KERNEL >= 3.2.0 */ ++ ++#ifdef WL11U ++bcm_tlv_t * ++wl_cfg80211_find_interworking_ie(u8 *parse, u32 len) ++{ ++ bcm_tlv_t *ie; ++ ++ while ((ie = bcm_parse_tlvs(parse, (u32)len, DOT11_MNG_INTERWORKING_ID))) { ++ return (bcm_tlv_t *)ie; ++ } ++ return NULL; ++} ++ ++static s32 ++wl_cfg80211_add_iw_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, s32 pktflag, ++ uint8 ie_id, uint8 *data, uint8 data_len) ++{ ++ s32 err = BCME_OK; ++ s32 buf_len; ++ s32 iecount; ++ ie_setbuf_t *ie_setbuf; ++ ++ if (ie_id != DOT11_MNG_INTERWORKING_ID) ++ return BCME_UNSUPPORTED; ++ ++ /* Validate the pktflag parameter */ ++ if ((pktflag & ~(VNDR_IE_BEACON_FLAG | VNDR_IE_PRBRSP_FLAG | ++ VNDR_IE_ASSOCRSP_FLAG | VNDR_IE_AUTHRSP_FLAG | ++ VNDR_IE_PRBREQ_FLAG | VNDR_IE_ASSOCREQ_FLAG| ++ VNDR_IE_CUSTOM_FLAG))) { ++ AP6210_ERR("cfg80211 Add IE: Invalid packet flag 0x%x\n", pktflag); ++ return -1; ++ } ++ ++ /* use VNDR_IE_CUSTOM_FLAG flags for none vendor IE . currently fixed value */ ++ pktflag = htod32(pktflag); ++ ++ buf_len = sizeof(ie_setbuf_t) + data_len - 1; ++ ie_setbuf = (ie_setbuf_t *) kzalloc(buf_len, GFP_KERNEL); ++ ++ if (!ie_setbuf) { ++ AP6210_ERR("Error allocating buffer for IE\n"); ++ return -ENOMEM; ++ } ++ ++ if (wl->iw_ie_len == data_len && !memcmp(wl->iw_ie, data, data_len)) { ++ AP6210_ERR("Previous IW IE is equals to current IE\n"); ++ return err; ++ } ++ ++ strncpy(ie_setbuf->cmd, "add", VNDR_IE_CMD_LEN - 1); ++ ie_setbuf->cmd[VNDR_IE_CMD_LEN - 1] = '\0'; ++ ++ /* Buffer contains only 1 IE */ ++ iecount = htod32(1); ++ memcpy((void *)&ie_setbuf->ie_buffer.iecount, &iecount, sizeof(int)); ++ memcpy((void *)&ie_setbuf->ie_buffer.ie_list[0].pktflag, &pktflag, sizeof(uint32)); ++ ++ /* Now, add the IE to the buffer */ ++ ie_setbuf->ie_buffer.ie_list[0].ie_data.id = ie_id; ++ ++ /* if already set with previous values, delete it first */ ++ if (wl->iw_ie_len != 0) { ++ AP6210_DEBUG("Different IW_IE was already set. clear first\n"); ++ ++ ie_setbuf->ie_buffer.ie_list[0].ie_data.len = 0; ++ ++ err = wldev_iovar_setbuf_bsscfg(ndev, "ie", ie_setbuf, buf_len, ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ ++ if (err != BCME_OK) ++ return err; ++ } ++ ++ ie_setbuf->ie_buffer.ie_list[0].ie_data.len = data_len; ++ memcpy((uchar *)&ie_setbuf->ie_buffer.ie_list[0].ie_data.data[0], data, data_len); ++ ++ err = wldev_iovar_setbuf_bsscfg(ndev, "ie", ie_setbuf, buf_len, ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ ++ if (err == BCME_OK) { ++ memcpy(wl->iw_ie, data, data_len); ++ wl->iw_ie_len = data_len; ++ wl->wl11u = TRUE; ++ ++ err = wldev_iovar_setint_bsscfg(ndev, "grat_arp", 1, bssidx); ++ } ++ ++ kfree(ie_setbuf); ++ return err; ++} ++#endif /* WL11U */ ++ ++#ifdef WL_HOST_BAND_MGMT ++s32 ++wl_cfg80211_set_band(struct net_device *ndev, int band) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ int ret = 0; ++ char ioctl_buf[50]; ++ ++ if ((band < WLC_BAND_AUTO) || (band > WLC_BAND_2G)) { ++ AP6210_ERR("Invalid band\n"); ++ return -EINVAL; ++ } ++ ++ if ((ret = wldev_iovar_setbuf(ndev, "roam_band", &band, ++ sizeof(int), ioctl_buf, sizeof(ioctl_buf), NULL)) < 0) { ++ AP6210_ERR("seting roam_band failed code=%d\n", ret); ++ return ret; ++ } ++ ++ AP6210_DEBUG("Setting band to %d\n", band); ++ wl->curr_band = band; ++ ++ return 0; ++} ++#endif /* WL_HOST_BAND_MGMT */ ++ ++#if defined(DHCP_SCAN_SUPPRESS) ++static void wl_cfg80211_scan_supp_timerfunc(ulong data) ++{ ++ struct wl_priv *wl = (struct wl_priv *)data; ++ ++ AP6210_DEBUG("Enter \n"); ++ schedule_work(&wl->wlan_work); ++} ++ ++static void wl_cfg80211_work_handler(struct work_struct *work) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ ++ wl = container_of(work, struct wl_priv, wlan_work); ++ ++ if (!wl) { ++ AP6210_ERR("wl_priv ptr NULL\n"); ++ return; ++ } ++ ++ if (wl->scan_suppressed) { ++ /* There is pending scan_suppress. Clean it */ ++ AP6210_ERR("Clean up from timer after %d msec\n", WL_SCAN_SUPPRESS_TIMEOUT); ++ wl_cfg80211_scan_suppress(wl_to_prmry_ndev(wl), 0); ++ } ++} ++ ++int wl_cfg80211_scan_suppress(struct net_device *dev, int suppress) ++{ ++ struct wl_priv *wl = wlcfg_drv_priv; ++ int ret = 0; ++ ++ if (!dev || !wl || ((suppress != 0) && (suppress != 1))) ++ return -EINVAL; ++ ++ if (suppress == wl->scan_suppressed) { ++ AP6210_DEBUG("No change in scan_suppress state. Ignoring cmd..\n"); ++ return 0; ++ } ++ ++ if (timer_pending(&wl->scan_supp_timer)) ++ del_timer_sync(&wl->scan_supp_timer); ++ ++ if ((ret = wldev_ioctl(dev, WLC_SET_SCANSUPPRESS, ++ &suppress, sizeof(int), true)) < 0) { ++ AP6210_ERR("Scan suppress setting failed ret:%d \n", ret); ++ } else { ++ AP6210_DEBUG("Scan suppress %s \n", suppress ? "Enabled" : "Disabled"); ++ wl->scan_suppressed = suppress; ++ } ++ ++ /* If scan_suppress is set, Start a timer to monitor it (just incase) */ ++ if (wl->scan_suppressed) { ++ if (ret) { ++ AP6210_ERR("Retry scan_suppress reset at a later time \n"); ++ mod_timer(&wl->scan_supp_timer, ++ jiffies + msecs_to_jiffies(WL_SCAN_SUPPRESS_RETRY)); ++ } else { ++ AP6210_DEBUG("Start wlan_timer to clear of scan_suppress \n"); ++ mod_timer(&wl->scan_supp_timer, ++ jiffies + msecs_to_jiffies(WL_SCAN_SUPPRESS_TIMEOUT)); ++ } ++ } ++ ++ return ret; ++} ++#endif /* DHCP_SCAN_SUPPRESS */ +diff --git a/drivers/net/wireless/ap6210/wl_cfg80211.h b/drivers/net/wireless/ap6210/wl_cfg80211.h +new file mode 100644 +index 0000000..01dd136 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_cfg80211.h +@@ -0,0 +1,791 @@ ++/* ++ * Linux cfg80211 driver ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_cfg80211.h 374275 2012-12-12 11:44:18Z $ ++ */ ++ ++#ifndef _wl_cfg80211_h_ ++#define _wl_cfg80211_h_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++struct wl_conf; ++struct wl_iface; ++struct wl_priv; ++struct wl_security; ++struct wl_ibss; ++ ++ ++#define htod32(i) i ++#define htod16(i) i ++#define dtoh32(i) i ++#define dtoh16(i) i ++#define htodchanspec(i) i ++#define dtohchanspec(i) i ++ ++#define WL_DBG_NONE 0 ++#define WL_DBG_P2P_ACTION (1 << 5) ++#define WL_DBG_TRACE (1 << 4) ++#define WL_DBG_SCAN (1 << 3) ++#define WL_DBG_DBG (1 << 2) ++#define WL_DBG_INFO (1 << 1) ++#define WL_DBG_ERR (1 << 0) ++ ++/* 0 invalidates all debug messages. default is 1 */ ++#define WL_DBG_LEVEL 0xFF ++ ++#define WL_SCAN_RETRY_MAX 3 ++#define WL_NUM_PMKIDS_MAX MAXPMKID ++#define WL_SCAN_BUF_MAX (1024 * 8) ++#define WL_TLV_INFO_MAX 1500 ++#define WL_SCAN_IE_LEN_MAX 2048 ++#define WL_BSS_INFO_MAX 2048 ++#define WL_ASSOC_INFO_MAX 512 ++#define WL_IOCTL_LEN_MAX 1024 ++#define WL_EXTRA_BUF_MAX 2048 ++#define WL_ISCAN_BUF_MAX 2048 ++#define WL_ISCAN_TIMER_INTERVAL_MS 3000 ++#define WL_SCAN_ERSULTS_LAST (WL_SCAN_RESULTS_NO_MEM+1) ++#define WL_AP_MAX 256 ++#define WL_FILE_NAME_MAX 256 ++#define WL_DWELL_TIME 200 ++#define WL_MED_DWELL_TIME 400 ++#define WL_MIN_DWELL_TIME 100 ++#define WL_LONG_DWELL_TIME 1000 ++#define IFACE_MAX_CNT 2 ++#define WL_SCAN_CONNECT_DWELL_TIME_MS 200 ++#define WL_SCAN_JOIN_PROBE_INTERVAL_MS 20 ++#define WL_SCAN_JOIN_ACTIVE_DWELL_TIME_MS 320 ++#define WL_SCAN_JOIN_PASSIVE_DWELL_TIME_MS 400 ++#define WL_AF_TX_MAX_RETRY 5 ++ ++#define WL_SCAN_TIMER_INTERVAL_MS 8000 /* Scan timeout */ ++#define WL_CHANNEL_SYNC_RETRY 5 ++#define WL_INVALID -1 ++ ++/* Bring down SCB Timeout to 20secs from 60secs default */ ++#ifndef WL_SCB_TIMEOUT ++#define WL_SCB_TIMEOUT 20 ++#endif ++ ++/* SCAN_SUPPRESS timer values in ms */ ++#define WL_SCAN_SUPPRESS_TIMEOUT 31000 /* default Framwork DHCP timeout is 30 sec */ ++#define WL_SCAN_SUPPRESS_RETRY 3000 ++ ++/* driver status */ ++enum wl_status { ++ WL_STATUS_READY = 0, ++ WL_STATUS_SCANNING, ++ WL_STATUS_SCAN_ABORTING, ++ WL_STATUS_CONNECTING, ++ WL_STATUS_CONNECTED, ++ WL_STATUS_DISCONNECTING, ++ WL_STATUS_AP_CREATING, ++ WL_STATUS_AP_CREATED, ++ /* whole sending action frame procedure: ++ * includes a) 'finding common channel' for public action request frame ++ * and b) 'sending af via 'actframe' iovar' ++ */ ++ WL_STATUS_SENDING_ACT_FRM, ++ /* find a peer to go to a common channel before sending public action req frame */ ++ WL_STATUS_FINDING_COMMON_CHANNEL, ++ /* waiting for next af to sync time of supplicant. ++ * it includes SENDING_ACT_FRM and WAITING_NEXT_ACT_FRM_LISTEN ++ */ ++ WL_STATUS_WAITING_NEXT_ACT_FRM, ++#ifdef WL_CFG80211_SYNC_GON ++ /* go to listen state to wait for next af after SENDING_ACT_FRM */ ++ WL_STATUS_WAITING_NEXT_ACT_FRM_LISTEN, ++#endif /* WL_CFG80211_SYNC_GON */ ++ /* it will be set when upper layer requests listen and succeed in setting listen mode. ++ * if set, other scan request can abort current listen state ++ */ ++ WL_STATUS_REMAINING_ON_CHANNEL, ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ /* it's fake listen state to keep current scan state. ++ * it will be set when upper layer requests listen but scan is running. then just run ++ * a expire timer without actual listen state. ++ * if set, other scan request does not need to abort scan. ++ */ ++ WL_STATUS_FAKE_REMAINING_ON_CHANNEL ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++}; ++ ++/* wi-fi mode */ ++enum wl_mode { ++ WL_MODE_BSS, ++ WL_MODE_IBSS, ++ WL_MODE_AP ++}; ++ ++/* driver profile list */ ++enum wl_prof_list { ++ WL_PROF_MODE, ++ WL_PROF_SSID, ++ WL_PROF_SEC, ++ WL_PROF_IBSS, ++ WL_PROF_BAND, ++ WL_PROF_CHAN, ++ WL_PROF_BSSID, ++ WL_PROF_ACT, ++ WL_PROF_BEACONINT, ++ WL_PROF_DTIMPERIOD ++}; ++ ++/* driver iscan state */ ++enum wl_iscan_state { ++ WL_ISCAN_STATE_IDLE, ++ WL_ISCAN_STATE_SCANING ++}; ++ ++/* donlge escan state */ ++enum wl_escan_state { ++ WL_ESCAN_STATE_IDLE, ++ WL_ESCAN_STATE_SCANING ++}; ++/* fw downloading status */ ++enum wl_fw_status { ++ WL_FW_LOADING_DONE, ++ WL_NVRAM_LOADING_DONE ++}; ++ ++enum wl_management_type { ++ WL_BEACON = 0x1, ++ WL_PROBE_RESP = 0x2, ++ WL_ASSOC_RESP = 0x4 ++}; ++/* beacon / probe_response */ ++struct beacon_proberesp { ++ __le64 timestamp; ++ __le16 beacon_int; ++ __le16 capab_info; ++ u8 variable[0]; ++} __attribute__ ((packed)); ++ ++/* driver configuration */ ++struct wl_conf { ++ u32 frag_threshold; ++ u32 rts_threshold; ++ u32 retry_short; ++ u32 retry_long; ++ s32 tx_power; ++ struct ieee80211_channel channel; ++}; ++ ++typedef s32(*EVENT_HANDLER) (struct wl_priv *wl, ++ struct net_device *ndev, const wl_event_msg_t *e, void *data); ++ ++/* bss inform structure for cfg80211 interface */ ++struct wl_cfg80211_bss_info { ++ u16 band; ++ u16 channel; ++ s16 rssi; ++ u16 frame_len; ++ u8 frame_buf[1]; ++}; ++ ++/* basic structure of scan request */ ++struct wl_scan_req { ++ struct wlc_ssid ssid; ++}; ++ ++/* basic structure of information element */ ++struct wl_ie { ++ u16 offset; ++ u8 buf[WL_TLV_INFO_MAX]; ++}; ++ ++/* event queue for cfg80211 main event */ ++struct wl_event_q { ++ struct list_head eq_list; ++ u32 etype; ++ wl_event_msg_t emsg; ++ s8 edata[1]; ++}; ++ ++/* security information with currently associated ap */ ++struct wl_security { ++ u32 wpa_versions; ++ u32 auth_type; ++ u32 cipher_pairwise; ++ u32 cipher_group; ++ u32 wpa_auth; ++ u32 auth_assoc_res_status; ++}; ++ ++/* ibss information for currently joined ibss network */ ++struct wl_ibss { ++ u8 beacon_interval; /* in millisecond */ ++ u8 atim; /* in millisecond */ ++ s8 join_only; ++ u8 band; ++ u8 channel; ++}; ++ ++/* wl driver profile */ ++struct wl_profile { ++ u32 mode; ++ s32 band; ++ u32 channel; ++ struct wlc_ssid ssid; ++ struct wl_security sec; ++ struct wl_ibss ibss; ++ u8 bssid[ETHER_ADDR_LEN]; ++ u16 beacon_interval; ++ u8 dtim_period; ++ bool active; ++}; ++ ++struct net_info { ++ struct net_device *ndev; ++ struct wireless_dev *wdev; ++ struct wl_profile profile; ++ s32 mode; ++ s32 roam_off; ++ unsigned long sme_state; ++ bool pm_restore; ++ bool pm_block; ++ s32 pm; ++ struct list_head list; /* list of all net_info structure */ ++}; ++typedef s32(*ISCAN_HANDLER) (struct wl_priv *wl); ++ ++/* iscan controller */ ++struct wl_iscan_ctrl { ++ struct net_device *dev; ++ struct timer_list timer; ++ u32 timer_ms; ++ u32 timer_on; ++ s32 state; ++ struct task_struct *tsk; ++ struct semaphore sync; ++ ISCAN_HANDLER iscan_handler[WL_SCAN_ERSULTS_LAST]; ++ void *data; ++ s8 ioctl_buf[WLC_IOCTL_SMLEN]; ++ s8 scan_buf[WL_ISCAN_BUF_MAX]; ++}; ++ ++/* association inform */ ++#define MAX_REQ_LINE 1024 ++struct wl_connect_info { ++ u8 req_ie[MAX_REQ_LINE]; ++ s32 req_ie_len; ++ u8 resp_ie[MAX_REQ_LINE]; ++ s32 resp_ie_len; ++}; ++ ++/* firmware /nvram downloading controller */ ++struct wl_fw_ctrl { ++ const struct firmware *fw_entry; ++ unsigned long status; ++ u32 ptr; ++ s8 fw_name[WL_FILE_NAME_MAX]; ++ s8 nvram_name[WL_FILE_NAME_MAX]; ++}; ++ ++/* assoc ie length */ ++struct wl_assoc_ielen { ++ u32 req_len; ++ u32 resp_len; ++}; ++ ++/* wpa2 pmk list */ ++struct wl_pmk_list { ++ pmkid_list_t pmkids; ++ pmkid_t foo[MAXPMKID - 1]; ++}; ++ ++ ++#define ESCAN_BUF_SIZE (64 * 1024) ++ ++struct escan_info { ++ u32 escan_state; ++#if defined(STATIC_WL_PRIV_STRUCT) ++#ifndef CONFIG_DHD_USE_STATIC_BUF ++#error STATIC_WL_PRIV_STRUCT should be used with CONFIG_DHD_USE_STATIC_BUF ++#endif ++ u8 *escan_buf; ++#else ++ u8 escan_buf[ESCAN_BUF_SIZE]; ++#endif /* STATIC_WL_PRIV_STRUCT */ ++ struct wiphy *wiphy; ++ struct net_device *ndev; ++}; ++ ++struct ap_info { ++/* Structure to hold WPS, WPA IEs for a AP */ ++ u8 probe_res_ie[VNDR_IES_MAX_BUF_LEN]; ++ u8 beacon_ie[VNDR_IES_MAX_BUF_LEN]; ++ u32 probe_res_ie_len; ++ u32 beacon_ie_len; ++ u8 *wpa_ie; ++ u8 *rsn_ie; ++ u8 *wps_ie; ++ bool security_mode; ++}; ++struct btcoex_info { ++ struct timer_list timer; ++ u32 timer_ms; ++ u32 timer_on; ++ u32 ts_dhcp_start; /* ms ts ecord time stats */ ++ u32 ts_dhcp_ok; /* ms ts ecord time stats */ ++ bool dhcp_done; /* flag, indicates that host done with ++ * dhcp before t1/t2 expiration ++ */ ++ s32 bt_state; ++ struct work_struct work; ++ struct net_device *dev; ++}; ++ ++struct sta_info { ++ /* Structure to hold WPS IE for a STA */ ++ u8 probe_req_ie[VNDR_IES_BUF_LEN]; ++ u8 assoc_req_ie[VNDR_IES_BUF_LEN]; ++ u32 probe_req_ie_len; ++ u32 assoc_req_ie_len; ++}; ++ ++struct afx_hdl { ++ wl_af_params_t *pending_tx_act_frm; ++ struct ether_addr tx_dst_addr; ++ struct net_device *dev; ++ struct work_struct work; ++ u32 bssidx; ++ u32 retry; ++ s32 peer_chan; ++ s32 peer_listen_chan; /* search channel: configured by upper layer */ ++ s32 my_listen_chan; /* listen chanel: extract it from prb req or gon req */ ++ bool is_listen; ++ bool ack_recv; ++ bool is_active; ++}; ++ ++struct parsed_ies { ++ wpa_ie_fixed_t *wps_ie; ++ u32 wps_ie_len; ++ wpa_ie_fixed_t *wpa_ie; ++ u32 wpa_ie_len; ++ bcm_tlv_t *wpa2_ie; ++ u32 wpa2_ie_len; ++}; ++ ++ ++#ifdef WL11U ++/* Max length of Interworking element */ ++#define IW_IES_MAX_BUF_LEN 9 ++#endif ++ ++#define MAX_EVENT_BUF_NUM 16 ++typedef struct wl_eventmsg_buf { ++ u16 num; ++ struct { ++ u16 type; ++ bool set; ++ } event [MAX_EVENT_BUF_NUM]; ++} wl_eventmsg_buf_t; ++ ++/* private data of cfg80211 interface */ ++struct wl_priv { ++ struct wireless_dev *wdev; /* representing wl cfg80211 device */ ++ ++ struct wireless_dev *p2p_wdev; /* representing wl cfg80211 device for P2P */ ++ struct net_device *p2p_net; /* reference to p2p0 interface */ ++ ++ struct wl_conf *conf; ++ struct cfg80211_scan_request *scan_request; /* scan request object */ ++ EVENT_HANDLER evt_handler[WLC_E_LAST]; ++ struct list_head eq_list; /* used for event queue */ ++ struct list_head net_list; /* used for struct net_info */ ++ spinlock_t eq_lock; /* for event queue synchronization */ ++ spinlock_t cfgdrv_lock; /* to protect scan status (and others if needed) */ ++ struct completion act_frm_scan; ++ struct completion iface_disable; ++ struct completion wait_next_af; ++ struct mutex usr_sync; /* maily for up/down synchronization */ ++ struct wl_scan_results *bss_list; ++ struct wl_scan_results *scan_results; ++ ++ /* scan request object for internal purpose */ ++ struct wl_scan_req *scan_req_int; ++ /* information element object for internal purpose */ ++#if defined(STATIC_WL_PRIV_STRUCT) ++ struct wl_ie *ie; ++#else ++ struct wl_ie ie; ++#endif ++ struct wl_iscan_ctrl *iscan; /* iscan controller */ ++ ++ /* association information container */ ++#if defined(STATIC_WL_PRIV_STRUCT) ++ struct wl_connect_info *conn_info; ++#else ++ struct wl_connect_info conn_info; ++#endif ++ ++ struct wl_pmk_list *pmk_list; /* wpa2 pmk list */ ++ tsk_ctl_t event_tsk; /* task of main event handler thread */ ++ void *pub; ++ u32 iface_cnt; ++ u32 channel; /* current channel */ ++ u32 af_sent_channel; /* channel action frame is sent */ ++ /* next af subtype to cancel the remained dwell time in rx process */ ++ u8 next_af_subtype; ++#ifdef WL_CFG80211_SYNC_GON ++ ulong af_tx_sent_jiffies; ++#endif /* WL_CFG80211_SYNC_GON */ ++ bool iscan_on; /* iscan on/off switch */ ++ bool iscan_kickstart; /* indicate iscan already started */ ++ bool escan_on; /* escan on/off switch */ ++ struct escan_info escan_info; /* escan information */ ++ bool active_scan; /* current scan mode */ ++ bool ibss_starter; /* indicates this sta is ibss starter */ ++ bool link_up; /* link/connection up flag */ ++ ++ /* indicate whether chip to support power save mode */ ++ bool pwr_save; ++ bool roam_on; /* on/off switch for self-roaming */ ++ bool scan_tried; /* indicates if first scan attempted */ ++ bool wlfc_on; ++ bool vsdb_mode; ++ bool roamoff_on_concurrent; ++ u8 *ioctl_buf; /* ioctl buffer */ ++ struct mutex ioctl_buf_sync; ++ u8 *escan_ioctl_buf; ++ u8 *extra_buf; /* maily to grab assoc information */ ++ struct dentry *debugfsdir; ++ struct rfkill *rfkill; ++ bool rf_blocked; ++ struct ieee80211_channel remain_on_chan; ++ enum nl80211_channel_type remain_on_chan_type; ++ u64 send_action_id; ++ u64 last_roc_id; ++ wait_queue_head_t netif_change_event; ++ struct completion send_af_done; ++ struct afx_hdl *afx_hdl; ++ struct ap_info *ap_info; ++ struct sta_info *sta_info; ++ struct p2p_info *p2p; ++ bool p2p_supported; ++ struct btcoex_info *btcoex_info; ++ struct timer_list scan_timeout; /* Timer for catch scan event timeout */ ++ s32(*state_notifier) (struct wl_priv *wl, ++ struct net_info *_net_info, enum wl_status state, bool set); ++ unsigned long interrested_state; ++ wlc_ssid_t hostapd_ssid; ++#ifdef WL11U ++ bool wl11u; ++ u8 iw_ie[IW_IES_MAX_BUF_LEN]; ++ u32 iw_ie_len; ++#endif /* WL11U */ ++ bool sched_scan_running; /* scheduled scan req status */ ++#ifdef WL_SCHED_SCAN ++ struct cfg80211_sched_scan_request *sched_scan_req; /* scheduled scan req */ ++#endif /* WL_SCHED_SCAN */ ++#ifdef WL_HOST_BAND_MGMT ++ u8 curr_band; ++#endif /* WL_HOST_BAND_MGMT */ ++ bool scan_suppressed; ++ struct timer_list scan_supp_timer; ++ struct work_struct wlan_work; ++ struct mutex event_sync; /* maily for up/down synchronization */ ++}; ++ ++ ++static inline struct wl_bss_info *next_bss(struct wl_scan_results *list, struct wl_bss_info *bss) ++{ ++ return bss = bss ? ++ (struct wl_bss_info *)((uintptr) bss + dtoh32(bss->length)) : list->bss_info; ++} ++static inline s32 ++wl_alloc_netinfo(struct wl_priv *wl, struct net_device *ndev, ++ struct wireless_dev * wdev, s32 mode, bool pm_block) ++{ ++ struct net_info *_net_info; ++ s32 err = 0; ++ if (wl->iface_cnt == IFACE_MAX_CNT) ++ return -ENOMEM; ++ _net_info = kzalloc(sizeof(struct net_info), GFP_KERNEL); ++ if (!_net_info) ++ err = -ENOMEM; ++ else { ++ _net_info->mode = mode; ++ _net_info->ndev = ndev; ++ _net_info->wdev = wdev; ++ _net_info->pm_restore = 0; ++ _net_info->pm = 0; ++ _net_info->pm_block = pm_block; ++ _net_info->roam_off = WL_INVALID; ++ wl->iface_cnt++; ++ list_add(&_net_info->list, &wl->net_list); ++ } ++ return err; ++} ++static inline void ++wl_dealloc_netinfo(struct wl_priv *wl, struct net_device *ndev) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) { ++ list_del(&_net_info->list); ++ wl->iface_cnt--; ++ if (_net_info->wdev) { ++ kfree(_net_info->wdev); ++ ndev->ieee80211_ptr = NULL; ++ } ++ kfree(_net_info); ++ } ++ } ++ ++} ++static inline void ++wl_delete_all_netinfo(struct wl_priv *wl) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ list_del(&_net_info->list); ++ if (_net_info->wdev) ++ kfree(_net_info->wdev); ++ kfree(_net_info); ++ } ++ wl->iface_cnt = 0; ++} ++static inline u32 ++wl_get_status_all(struct wl_priv *wl, s32 status) ++ ++{ ++ struct net_info *_net_info, *next; ++ u32 cnt = 0; ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (_net_info->ndev && ++ test_bit(status, &_net_info->sme_state)) ++ cnt++; ++ } ++ return cnt; ++} ++static inline void ++wl_set_status_all(struct wl_priv *wl, s32 status, u32 op) ++{ ++ struct net_info *_net_info, *next; ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ switch (op) { ++ case 1: ++ return; /* set all status is not allowed */ ++ case 2: ++ clear_bit(status, &_net_info->sme_state); ++ if (wl->state_notifier && ++ test_bit(status, &(wl->interrested_state))) ++ wl->state_notifier(wl, _net_info, status, false); ++ break; ++ case 4: ++ return; /* change all status is not allowed */ ++ default: ++ return; /* unknown operation */ ++ } ++ } ++} ++static inline void ++wl_set_status_by_netdev(struct wl_priv *wl, s32 status, ++ struct net_device *ndev, u32 op) ++{ ++ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) { ++ switch (op) { ++ case 1: ++ set_bit(status, &_net_info->sme_state); ++ if (wl->state_notifier && ++ test_bit(status, &(wl->interrested_state))) ++ wl->state_notifier(wl, _net_info, status, true); ++ break; ++ case 2: ++ clear_bit(status, &_net_info->sme_state); ++ if (wl->state_notifier && ++ test_bit(status, &(wl->interrested_state))) ++ wl->state_notifier(wl, _net_info, status, false); ++ break; ++ case 4: ++ change_bit(status, &_net_info->sme_state); ++ break; ++ } ++ } ++ ++ } ++ ++} ++ ++static inline u32 ++wl_get_status_by_netdev(struct wl_priv *wl, s32 status, ++ struct net_device *ndev) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) ++ return test_bit(status, &_net_info->sme_state); ++ } ++ return 0; ++} ++ ++static inline s32 ++wl_get_mode_by_netdev(struct wl_priv *wl, struct net_device *ndev) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) ++ return _net_info->mode; ++ } ++ return -1; ++} ++ ++ ++static inline void ++wl_set_mode_by_netdev(struct wl_priv *wl, struct net_device *ndev, ++ s32 mode) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) ++ _net_info->mode = mode; ++ } ++} ++static inline struct wl_profile * ++wl_get_profile_by_netdev(struct wl_priv *wl, struct net_device *ndev) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) ++ return &_net_info->profile; ++ } ++ return NULL; ++} ++static inline struct net_info * ++wl_get_netinfo_by_netdev(struct wl_priv *wl, struct net_device *ndev) ++{ ++ struct net_info *_net_info, *next; ++ ++ list_for_each_entry_safe(_net_info, next, &wl->net_list, list) { ++ if (ndev && (_net_info->ndev == ndev)) ++ return _net_info; ++ } ++ return NULL; ++} ++#define wl_to_wiphy(w) (w->wdev->wiphy) ++#define wl_to_prmry_ndev(w) (w->wdev->netdev) ++#define ndev_to_wl(n) (wdev_to_wl(n->ieee80211_ptr)) ++#define wl_to_sr(w) (w->scan_req_int) ++#if defined(STATIC_WL_PRIV_STRUCT) ++#define wl_to_ie(w) (w->ie) ++#define wl_to_conn(w) (w->conn_info) ++#else ++#define wl_to_ie(w) (&w->ie) ++#define wl_to_conn(w) (&w->conn_info) ++#endif ++#define iscan_to_wl(i) ((struct wl_priv *)(i->data)) ++#define wl_to_iscan(w) (w->iscan) ++#define wiphy_from_scan(w) (w->escan_info.wiphy) ++#define wl_get_drv_status_all(wl, stat) \ ++ (wl_get_status_all(wl, WL_STATUS_ ## stat)) ++#define wl_get_drv_status(wl, stat, ndev) \ ++ (wl_get_status_by_netdev(wl, WL_STATUS_ ## stat, ndev)) ++#define wl_set_drv_status(wl, stat, ndev) \ ++ (wl_set_status_by_netdev(wl, WL_STATUS_ ## stat, ndev, 1)) ++#define wl_clr_drv_status(wl, stat, ndev) \ ++ (wl_set_status_by_netdev(wl, WL_STATUS_ ## stat, ndev, 2)) ++#define wl_clr_drv_status_all(wl, stat) \ ++ (wl_set_status_all(wl, WL_STATUS_ ## stat, 2)) ++#define wl_chg_drv_status(wl, stat, ndev) \ ++ (wl_set_status_by_netdev(wl, WL_STATUS_ ## stat, ndev, 4)) ++ ++#define for_each_bss(list, bss, __i) \ ++ for (__i = 0; __i < list->count && __i < WL_AP_MAX; __i++, bss = next_bss(list, bss)) ++ ++#define for_each_ndev(wl, iter, next) \ ++ list_for_each_entry_safe(iter, next, &wl->net_list, list) ++ ++ ++/* In case of WPS from wpa_supplicant, pairwise siute and group suite is 0. ++ * In addtion to that, wpa_version is WPA_VERSION_1 ++ */ ++#define is_wps_conn(_sme) \ ++ ((wl_cfgp2p_find_wpsie((u8 *)_sme->ie, _sme->ie_len) != NULL) && \ ++ (!_sme->crypto.n_ciphers_pairwise) && \ ++ (!_sme->crypto.cipher_group)) ++extern s32 wl_cfg80211_attach(struct net_device *ndev, void *data); ++extern s32 wl_cfg80211_attach_post(struct net_device *ndev); ++extern void wl_cfg80211_detach(void *para); ++ ++extern void wl_cfg80211_event(struct net_device *ndev, const wl_event_msg_t *e, ++ void *data); ++void wl_cfg80211_set_parent_dev(void *dev); ++struct device *wl_cfg80211_get_parent_dev(void); ++ ++extern s32 wl_cfg80211_up(void *para); ++extern s32 wl_cfg80211_down(void *para); ++extern s32 wl_cfg80211_notify_ifadd(struct net_device *ndev, s32 idx, s32 bssidx, ++ void* _net_attach); ++extern s32 wl_cfg80211_ifdel_ops(struct net_device *net); ++extern s32 wl_cfg80211_notify_ifdel(void); ++extern s32 wl_cfg80211_is_progress_ifadd(void); ++extern s32 wl_cfg80211_is_progress_ifchange(void); ++extern s32 wl_cfg80211_is_progress_ifadd(void); ++extern s32 wl_cfg80211_notify_ifchange(void); ++extern void wl_cfg80211_dbg_level(u32 level); ++extern s32 wl_cfg80211_get_p2p_dev_addr(struct net_device *net, struct ether_addr *p2pdev_addr); ++extern s32 wl_cfg80211_set_p2p_noa(struct net_device *net, char* buf, int len); ++extern s32 wl_cfg80211_get_p2p_noa(struct net_device *net, char* buf, int len); ++extern s32 wl_cfg80211_set_wps_p2p_ie(struct net_device *net, char *buf, int len, ++ enum wl_management_type type); ++extern s32 wl_cfg80211_set_p2p_ps(struct net_device *net, char* buf, int len); ++extern int wl_cfg80211_hang(struct net_device *dev, u16 reason); ++extern s32 wl_mode_to_nl80211_iftype(s32 mode); ++int wl_cfg80211_do_driver_init(struct net_device *net); ++void wl_cfg80211_enable_trace(u32 level); ++extern s32 wl_update_wiphybands(struct wl_priv *wl, bool notify); ++extern s32 wl_cfg80211_if_is_group_owner(void); ++extern chanspec_t wl_ch_host_to_driver(u16 channel); ++extern s32 wl_add_remove_eventmsg(struct net_device *ndev, u16 event, bool add); ++extern void wl_stop_wait_next_action_frame(struct wl_priv *wl, struct net_device *ndev); ++extern s32 wl_cfg80211_set_band(struct net_device *ndev, int band); ++extern int wl_cfg80211_update_power_mode(struct net_device *dev); ++#if defined(DHCP_SCAN_SUPPRESS) ++extern int wl_cfg80211_scan_suppress(struct net_device *dev, int suppress); ++#endif /* OEM_ANDROID */ ++extern void wl_cfg80211_add_to_eventbuffer(wl_eventmsg_buf_t *ev, u16 event, bool set); ++extern s32 wl_cfg80211_apply_eventbuffer(struct net_device *ndev, ++ struct wl_priv *wl, wl_eventmsg_buf_t *ev); ++#endif /* _wl_cfg80211_h_ */ +diff --git a/drivers/net/wireless/ap6210/wl_cfgp2p.c b/drivers/net/wireless/ap6210/wl_cfgp2p.c +new file mode 100644 +index 0000000..eb7df08 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_cfgp2p.c +@@ -0,0 +1,2393 @@ ++/* ++ * Linux cfgp2p driver ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_cfgp2p.c 372668 2012-12-04 14:07:12Z $ ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++static s8 scanparambuf[WLC_IOCTL_SMLEN]; ++static s8 g_mgmt_ie_buf[2048]; ++static bool ++wl_cfgp2p_has_ie(u8 *ie, u8 **tlvs, u32 *tlvs_len, const u8 *oui, u32 oui_len, u8 type); ++ ++static u32 ++wl_cfgp2p_vndr_ie(struct wl_priv *wl, u8 *iebuf, s32 bssidx, s32 pktflag, ++ s8 *oui, s32 ie_id, s8 *data, s32 datalen, const s8* add_del_cmd); ++ ++static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev); ++static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd); ++static int wl_cfgp2p_if_open(struct net_device *net); ++static int wl_cfgp2p_if_stop(struct net_device *net); ++static s32 wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, ++ bool notify); ++ ++static const struct net_device_ops wl_cfgp2p_if_ops = { ++ .ndo_open = wl_cfgp2p_if_open, ++ .ndo_stop = wl_cfgp2p_if_stop, ++ .ndo_do_ioctl = wl_cfgp2p_do_ioctl, ++ .ndo_start_xmit = wl_cfgp2p_start_xmit, ++}; ++ ++bool wl_cfgp2p_is_pub_action(void *frame, u32 frame_len) ++{ ++ wifi_p2p_pub_act_frame_t *pact_frm; ++ ++ if (frame == NULL) ++ return false; ++ pact_frm = (wifi_p2p_pub_act_frame_t *)frame; ++ if (frame_len < sizeof(wifi_p2p_pub_act_frame_t) -1) ++ return false; ++ ++ if (pact_frm->category == P2P_PUB_AF_CATEGORY && ++ pact_frm->action == P2P_PUB_AF_ACTION && ++ pact_frm->oui_type == P2P_VER && ++ memcmp(pact_frm->oui, P2P_OUI, sizeof(pact_frm->oui)) == 0) { ++ return true; ++ } ++ ++ return false; ++} ++ ++bool wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len) ++{ ++ wifi_p2p_action_frame_t *act_frm; ++ ++ if (frame == NULL) ++ return false; ++ act_frm = (wifi_p2p_action_frame_t *)frame; ++ if (frame_len < sizeof(wifi_p2p_action_frame_t) -1) ++ return false; ++ ++ if (act_frm->category == P2P_AF_CATEGORY && ++ act_frm->type == P2P_VER && ++ memcmp(act_frm->OUI, P2P_OUI, DOT11_OUI_LEN) == 0) { ++ return true; ++ } ++ ++ return false; ++} ++ ++/* ++* Currently Action frame just pass to P2P interface regardless real dst. ++* but GAS Action can be used for Hotspot2.0 as well ++* Need to distingush that it's for P2P or HS20 ++*/ ++#ifdef WL11U ++#define GAS_RESP_LEN 2 ++#define DOUBLE_TLV_BODY_OFF 4 ++#define GAS_RESP_OFFSET 4 ++#define GAS_CRESP_OFFSET 5 ++ ++bool wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len) ++{ ++ bcm_tlv_t *ie = (bcm_tlv_t *)data; ++ u8 *frame = NULL; ++ u16 id, flen; ++ ++ /* Skipped first ANQP Element, if frame has anqp elemnt */ ++ ie = bcm_parse_tlvs(ie, (int)len, DOT11_MNG_ADVERTISEMENT_ID); ++ ++ if (ie == NULL) ++ return false; ++ ++ frame = (uint8 *)ie + ie->len + TLV_HDR_LEN + GAS_RESP_LEN; ++ id = ((u16) (((frame)[1] << 8) | (frame)[0])); ++ flen = ((u16) (((frame)[3] << 8) | (frame)[2])); ++ ++ /* If the contents match the OUI and the type */ ++ if (flen >= WFA_OUI_LEN + 1 && ++ id == P2PSD_GAS_NQP_INFOID && ++ !bcmp(&frame[DOUBLE_TLV_BODY_OFF], (const uint8*)WFA_OUI, WFA_OUI_LEN) && ++ subtype == frame[DOUBLE_TLV_BODY_OFF+WFA_OUI_LEN]) { ++ return true; ++ } ++ ++ return false; ++} ++#endif /* WL11U */ ++ ++bool wl_cfgp2p_is_gas_action(void *frame, u32 frame_len) ++{ ++ ++ wifi_p2psd_gas_pub_act_frame_t *sd_act_frm; ++ ++ if (frame == NULL) ++ return false; ++ ++ sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *)frame; ++ if (frame_len < sizeof(wifi_p2psd_gas_pub_act_frame_t) - 1) ++ return false; ++ if (sd_act_frm->category != P2PSD_ACTION_CATEGORY) ++ return false; ++ ++#ifdef WL11U ++ if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IRESP) ++ return wl_cfgp2p_find_gas_subtype(P2PSD_GAS_OUI_SUBTYPE, ++ (u8 *)sd_act_frm->query_data + GAS_RESP_OFFSET, ++ frame_len); ++ ++ else if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_CRESP) ++ return wl_cfgp2p_find_gas_subtype(P2PSD_GAS_OUI_SUBTYPE, ++ (u8 *)sd_act_frm->query_data + GAS_CRESP_OFFSET, ++ frame_len); ++ else if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IREQ || ++ sd_act_frm->action == P2PSD_ACTION_ID_GAS_CREQ) ++ return true; ++ else ++ return false; ++#else ++ if (sd_act_frm->action == P2PSD_ACTION_ID_GAS_IREQ || ++ sd_act_frm->action == P2PSD_ACTION_ID_GAS_IRESP || ++ sd_act_frm->action == P2PSD_ACTION_ID_GAS_CREQ || ++ sd_act_frm->action == P2PSD_ACTION_ID_GAS_CRESP) ++ return true; ++ else ++ return false; ++#endif /* WLC11U */ ++} ++void wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len) ++{ ++ wifi_p2p_pub_act_frame_t *pact_frm; ++ wifi_p2p_action_frame_t *act_frm; ++ wifi_p2psd_gas_pub_act_frame_t *sd_act_frm; ++ if (!frame || frame_len <= 2) ++ return; ++ ++ if (wl_cfgp2p_is_pub_action(frame, frame_len)) { ++ pact_frm = (wifi_p2p_pub_act_frame_t *)frame; ++ switch (pact_frm->subtype) { ++ case P2P_PAF_GON_REQ: ++ AP6210_DEBUG("%s P2P Group Owner Negotiation Req Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_GON_RSP: ++ AP6210_DEBUG("%s P2P Group Owner Negotiation Rsp Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_GON_CONF: ++ AP6210_DEBUG("%s P2P Group Owner Negotiation Confirm Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_INVITE_REQ: ++ AP6210_DEBUG("%s P2P Invitation Request Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_INVITE_RSP: ++ AP6210_DEBUG("%s P2P Invitation Response Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_DEVDIS_REQ: ++ AP6210_DEBUG("%s P2P Device Discoverability Request Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_DEVDIS_RSP: ++ AP6210_DEBUG("%s P2P Device Discoverability Response Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_PROVDIS_REQ: ++ AP6210_DEBUG("%s P2P Provision Discovery Request Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_PAF_PROVDIS_RSP: ++ AP6210_DEBUG("%s P2P Provision Discovery Response Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ default: ++ AP6210_DEBUG("%s Unknown P2P Public Action Frame\n", ++ (tx)? "TX": "RX"); ++ ++ } ++ ++ } else if (wl_cfgp2p_is_p2p_action(frame, frame_len)) { ++ act_frm = (wifi_p2p_action_frame_t *)frame; ++ switch (act_frm->subtype) { ++ case P2P_AF_NOTICE_OF_ABSENCE: ++ AP6210_DEBUG("%s P2P Notice of Absence Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_AF_PRESENCE_REQ: ++ AP6210_DEBUG("%s P2P Presence Request Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_AF_PRESENCE_RSP: ++ AP6210_DEBUG("%s P2P Presence Response Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ case P2P_AF_GO_DISC_REQ: ++ AP6210_DEBUG("%s P2P Discoverability Request Frame\n", ++ (tx)? "TX": "RX"); ++ break; ++ default: ++ AP6210_DEBUG("%s Unknown P2P Action Frame\n", ++ (tx)? "TX": "RX"); ++ } ++ ++ } else if (wl_cfgp2p_is_gas_action(frame, frame_len)) { ++ sd_act_frm = (wifi_p2psd_gas_pub_act_frame_t *)frame; ++ switch (sd_act_frm->action) { ++ case P2PSD_ACTION_ID_GAS_IREQ: ++ AP6210_DEBUG("%s P2P GAS Initial Request\n", ++ (tx)? "TX" : "RX"); ++ break; ++ case P2PSD_ACTION_ID_GAS_IRESP: ++ AP6210_DEBUG("%s P2P GAS Initial Response\n", ++ (tx)? "TX" : "RX"); ++ break; ++ case P2PSD_ACTION_ID_GAS_CREQ: ++ AP6210_DEBUG("%s P2P GAS Comback Request\n", ++ (tx)? "TX" : "RX"); ++ break; ++ case P2PSD_ACTION_ID_GAS_CRESP: ++ AP6210_DEBUG("%s P2P GAS Comback Response\n", ++ (tx)? "TX" : "RX"); ++ break; ++ default: ++ AP6210_DEBUG("%s Unknown P2P GAS Frame\n", ++ (tx)? "TX" : "RX"); ++ } ++ ++ ++ } ++} ++ ++/* ++ * Initialize variables related to P2P ++ * ++ */ ++s32 ++wl_cfgp2p_init_priv(struct wl_priv *wl) ++{ ++ if (!(wl->p2p = kzalloc(sizeof(struct p2p_info), GFP_KERNEL))) { ++ AP6210_ERR("struct p2p_info allocation failed\n"); ++ return -ENOMEM; ++ } ++#define INIT_IE(IE_TYPE, BSS_TYPE) \ ++ do { \ ++ memset(wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie, 0, \ ++ sizeof(wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie)); \ ++ wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie_len = 0; \ ++ } while (0); ++ ++ INIT_IE(probe_req, P2PAPI_BSSCFG_PRIMARY); ++ INIT_IE(probe_res, P2PAPI_BSSCFG_PRIMARY); ++ INIT_IE(assoc_req, P2PAPI_BSSCFG_PRIMARY); ++ INIT_IE(assoc_res, P2PAPI_BSSCFG_PRIMARY); ++ INIT_IE(beacon, P2PAPI_BSSCFG_PRIMARY); ++ INIT_IE(probe_req, P2PAPI_BSSCFG_DEVICE); ++ INIT_IE(probe_res, P2PAPI_BSSCFG_DEVICE); ++ INIT_IE(assoc_req, P2PAPI_BSSCFG_DEVICE); ++ INIT_IE(assoc_res, P2PAPI_BSSCFG_DEVICE); ++ INIT_IE(beacon, P2PAPI_BSSCFG_DEVICE); ++ INIT_IE(probe_req, P2PAPI_BSSCFG_CONNECTION); ++ INIT_IE(probe_res, P2PAPI_BSSCFG_CONNECTION); ++ INIT_IE(assoc_req, P2PAPI_BSSCFG_CONNECTION); ++ INIT_IE(assoc_res, P2PAPI_BSSCFG_CONNECTION); ++ INIT_IE(beacon, P2PAPI_BSSCFG_CONNECTION); ++#undef INIT_IE ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_PRIMARY) = wl_to_prmry_ndev(wl); ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_PRIMARY) = 0; ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE) = NULL; ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = 0; ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION) = NULL; ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_CONNECTION) = 0; ++ return BCME_OK; ++ ++} ++/* ++ * Deinitialize variables related to P2P ++ * ++ */ ++void ++wl_cfgp2p_deinit_priv(struct wl_priv *wl) ++{ ++ AP6210_DEBUG("In\n"); ++ if (wl->p2p) { ++ kfree(wl->p2p); ++ wl->p2p = NULL; ++ } ++ wl->p2p_supported = 0; ++} ++/* ++ * Set P2P functions into firmware ++ */ ++s32 ++wl_cfgp2p_set_firm_p2p(struct wl_priv *wl) ++{ ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ struct ether_addr null_eth_addr = { { 0, 0, 0, 0, 0, 0 } }; ++ s32 ret = BCME_OK; ++ s32 val = 0; ++ /* Do we have to check whether APSTA is enabled or not ? */ ++ wldev_iovar_getint(ndev, "apsta", &val); ++ if (val == 0) { ++ val = 1; ++ ret = wldev_ioctl(ndev, WLC_DOWN, &val, sizeof(s32), true); ++ if (ret < 0) { ++ AP6210_ERR("WLC_DOWN error %d\n", ret); ++ return ret; ++ } ++ wldev_iovar_setint(ndev, "apsta", val); ++ ret = wldev_ioctl(ndev, WLC_UP, &val, sizeof(s32), true); ++ if (ret < 0) { ++ AP6210_ERR("WLC_UP error %d\n", ret); ++ return ret; ++ } ++ } ++ ++ /* In case of COB type, firmware has default mac address ++ * After Initializing firmware, we have to set current mac address to ++ * firmware for P2P device address ++ */ ++ ret = wldev_iovar_setbuf_bsscfg(ndev, "p2p_da_override", &null_eth_addr, ++ sizeof(null_eth_addr), wl->ioctl_buf, WLC_IOCTL_MAXLEN, 0, &wl->ioctl_buf_sync); ++ if (ret && ret != BCME_UNSUPPORTED) { ++ AP6210_ERR("failed to update device address ret %d\n", ret); ++ } ++ return ret; ++} ++ ++/* Create a new P2P BSS. ++ * Parameters: ++ * @mac : MAC address of the BSS to create ++ * @if_type : interface type: WL_P2P_IF_GO or WL_P2P_IF_CLIENT ++ * @chspec : chspec to use if creating a GO BSS. ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_ifadd(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, ++ chanspec_t chspec) ++{ ++ wl_p2p_if_t ifreq; ++ s32 err; ++ u32 scb_timeout = WL_SCB_TIMEOUT; ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ ++ ifreq.type = if_type; ++ ifreq.chspec = chspec; ++ memcpy(ifreq.addr.octet, mac->octet, sizeof(ifreq.addr.octet)); ++ ++ AP6210_DEBUG("---wl p2p_ifadd "MACDBG" %s %u\n", ++ MAC2STRDBG(ifreq.addr.octet), ++ (if_type == WL_P2P_IF_GO) ? "go" : "client", ++ (chspec & WL_CHANSPEC_CHAN_MASK) >> WL_CHANSPEC_CHAN_SHIFT); ++ ++ err = wldev_iovar_setbuf(ndev, "p2p_ifadd", &ifreq, sizeof(ifreq), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ ++ if (unlikely(err < 0)) ++ AP6210_DEBUG("'wl p2p_ifadd' error %d\n", err); ++ else if (if_type == WL_P2P_IF_GO) { ++ err = wldev_ioctl(ndev, WLC_SET_SCB_TIMEOUT, &scb_timeout, sizeof(u32), true); ++ if (unlikely(err < 0)) ++ AP6210_DEBUG("'wl scb_timeout' error %d\n", err); ++ } ++ return err; ++} ++ ++/* Disable a P2P BSS. ++ * Parameters: ++ * @mac : MAC address of the BSS to create ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_ifdisable(struct wl_priv *wl, struct ether_addr *mac) ++{ ++ s32 ret; ++ struct net_device *netdev = wl_to_prmry_ndev(wl); ++ ++ AP6210_DEBUG("------primary idx %d : wl p2p_ifdis "MACDBG"\n", ++ netdev->ifindex, MAC2STRDBG(mac->octet)); ++ ret = wldev_iovar_setbuf(netdev, "p2p_ifdis", mac, sizeof(*mac), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ if (unlikely(ret < 0)) { ++ AP6210_DEBUG("'wl p2p_ifdis' error %d\n", ret); ++ } ++ return ret; ++} ++ ++/* Delete a P2P BSS. ++ * Parameters: ++ * @mac : MAC address of the BSS to create ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_ifdel(struct wl_priv *wl, struct ether_addr *mac) ++{ ++ s32 ret; ++ struct net_device *netdev = wl_to_prmry_ndev(wl); ++ ++ AP6210_DEBUG("------primary idx %d : wl p2p_ifdel "MACDBG"\n", ++ netdev->ifindex, MAC2STRDBG(mac->octet)); ++ ret = wldev_iovar_setbuf(netdev, "p2p_ifdel", mac, sizeof(*mac), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ if (unlikely(ret < 0)) { ++ AP6210_DEBUG("'wl p2p_ifdel' error %d\n", ret); ++ } ++ return ret; ++} ++ ++/* Change a P2P Role. ++ * Parameters: ++ * @mac : MAC address of the BSS to change a role ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_ifchange(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, ++ chanspec_t chspec) ++{ ++ wl_p2p_if_t ifreq; ++ s32 err; ++ u32 scb_timeout = WL_SCB_TIMEOUT; ++ ++ struct net_device *netdev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION); ++ ++ ifreq.type = if_type; ++ ifreq.chspec = chspec; ++ memcpy(ifreq.addr.octet, mac->octet, sizeof(ifreq.addr.octet)); ++ ++ AP6210_DEBUG("---wl p2p_ifchange "MACDBG" %s %u" ++ " chanspec 0x%04x\n", MAC2STRDBG(ifreq.addr.octet), ++ (if_type == WL_P2P_IF_GO) ? "go" : "client", ++ (chspec & WL_CHANSPEC_CHAN_MASK) >> WL_CHANSPEC_CHAN_SHIFT, ++ ifreq.chspec); ++ ++ err = wldev_iovar_setbuf(netdev, "p2p_ifupd", &ifreq, sizeof(ifreq), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ ++ if (unlikely(err < 0)) { ++ AP6210_DEBUG("'wl p2p_ifupd' error %d\n", err); ++ } else if (if_type == WL_P2P_IF_GO) { ++ err = wldev_ioctl(netdev, WLC_SET_SCB_TIMEOUT, &scb_timeout, sizeof(u32), true); ++ if (unlikely(err < 0)) ++ AP6210_DEBUG("'wl scb_timeout' error %d\n", err); ++ } ++ return err; ++} ++ ++ ++/* Get the index of a created P2P BSS. ++ * Parameters: ++ * @mac : MAC address of the created BSS ++ * @index : output: index of created BSS ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_ifidx(struct wl_priv *wl, struct ether_addr *mac, s32 *index) ++{ ++ s32 ret; ++ u8 getbuf[64]; ++ struct net_device *dev = wl_to_prmry_ndev(wl); ++ ++ AP6210_DEBUG("---wl p2p_if "MACDBG"\n", MAC2STRDBG(mac->octet)); ++ ++ ret = wldev_iovar_getbuf_bsscfg(dev, "p2p_if", mac, sizeof(*mac), getbuf, ++ sizeof(getbuf), wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_PRIMARY), NULL); ++ ++ if (ret == 0) { ++ memcpy(index, getbuf, sizeof(s32)); ++ AP6210_DEBUG("---wl p2p_if ==> %d\n", *index); ++ } ++ ++ return ret; ++} ++ ++static s32 ++wl_cfgp2p_set_discovery(struct wl_priv *wl, s32 on) ++{ ++ s32 ret = BCME_OK; ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ AP6210_DEBUG("enter\n"); ++ ++ ret = wldev_iovar_setint(ndev, "p2p_disc", on); ++ ++ if (unlikely(ret < 0)) { ++ AP6210_ERR("p2p_disc %d error %d\n", on, ret); ++ } ++ ++ return ret; ++} ++ ++/* Set the WL driver's P2P mode. ++ * Parameters : ++ * @mode : is one of WL_P2P_DISC_ST_{SCAN,LISTEN,SEARCH}. ++ * @channel : the channel to listen ++ * @listen_ms : the time (milli seconds) to wait ++ * @bssidx : bss index for BSSCFG ++ * Returns 0 if success ++ */ ++ ++s32 ++wl_cfgp2p_set_p2p_mode(struct wl_priv *wl, u8 mode, u32 channel, u16 listen_ms, int bssidx) ++{ ++ wl_p2p_disc_st_t discovery_mode; ++ s32 ret; ++ struct net_device *dev; ++ AP6210_DEBUG("enter\n"); ++ ++ if (unlikely(bssidx == WL_INVALID || bssidx >= P2PAPI_BSSCFG_MAX)) { ++ AP6210_ERR(" %d index out of range\n", bssidx); ++ return -1; ++ } ++ ++ dev = wl_to_p2p_bss_ndev(wl, bssidx); ++ if (unlikely(dev == NULL)) { ++ AP6210_ERR("bssidx %d is not assigned\n", bssidx); ++ return BCME_NOTFOUND; ++ } ++ ++ /* Put the WL driver into P2P Listen Mode to respond to P2P probe reqs */ ++ discovery_mode.state = mode; ++ discovery_mode.chspec = wl_ch_host_to_driver(channel); ++ discovery_mode.dwell = listen_ms; ++ ret = wldev_iovar_setbuf_bsscfg(dev, "p2p_state", &discovery_mode, ++ sizeof(discovery_mode), wl->ioctl_buf, WLC_IOCTL_MAXLEN, ++ bssidx, &wl->ioctl_buf_sync); ++ ++ return ret; ++} ++ ++/* Get the index of the P2P Discovery BSS */ ++static s32 ++wl_cfgp2p_get_disc_idx(struct wl_priv *wl, s32 *index) ++{ ++ s32 ret; ++ struct net_device *dev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_PRIMARY); ++ ++ ret = wldev_iovar_getint(dev, "p2p_dev", index); ++ AP6210_DEBUG("p2p_dev bsscfg_idx=%d ret=%d\n", *index, ret); ++ ++ if (unlikely(ret < 0)) { ++ AP6210_ERR("'p2p_dev' error %d\n", ret); ++ return ret; ++ } ++ return ret; ++} ++ ++s32 ++wl_cfgp2p_init_discovery(struct wl_priv *wl) ++{ ++ ++ s32 index = 0; ++ s32 ret = BCME_OK; ++ ++ AP6210_DEBUG("enter\n"); ++ ++ if (wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) != 0) { ++ AP6210_ERR("do nothing, already initialized\n"); ++ return ret; ++ } ++ ++ ret = wl_cfgp2p_set_discovery(wl, 1); ++ if (ret < 0) { ++ AP6210_ERR("set discover error\n"); ++ return ret; ++ } ++ /* Enable P2P Discovery in the WL Driver */ ++ ret = wl_cfgp2p_get_disc_idx(wl, &index); ++ ++ if (ret < 0) { ++ return ret; ++ } ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE) = ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_PRIMARY); ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = index; ++ ++ /* Set the initial discovery state to SCAN */ ++ ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ ++ if (unlikely(ret != 0)) { ++ AP6210_ERR("unable to set WL_P2P_DISC_ST_SCAN\n"); ++ wl_cfgp2p_set_discovery(wl, 0); ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = 0; ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE) = NULL; ++ return 0; ++ } ++ return ret; ++} ++ ++/* Deinitialize P2P Discovery ++ * Parameters : ++ * @wl : wl_private data ++ * Returns 0 if succes ++ */ ++static s32 ++wl_cfgp2p_deinit_discovery(struct wl_priv *wl) ++{ ++ s32 ret = BCME_OK; ++ AP6210_DEBUG("enter\n"); ++ ++ if (wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) == 0) { ++ AP6210_ERR("do nothing, not initialized\n"); ++ return -1; ++ } ++ /* Set the discovery state to SCAN */ ++ ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ /* Disable P2P discovery in the WL driver (deletes the discovery BSSCFG) */ ++ ret = wl_cfgp2p_set_discovery(wl, 0); ++ ++ /* Clear our saved WPS and P2P IEs for the discovery BSS. The driver ++ * deleted these IEs when wl_cfgp2p_set_discovery() deleted the discovery ++ * BSS. ++ */ ++ ++ /* Clear the saved bsscfg index of the discovery BSSCFG to indicate we ++ * have no discovery BSS. ++ */ ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) = WL_INVALID; ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE) = NULL; ++ ++ return ret; ++ ++} ++/* Enable P2P Discovery ++ * Parameters: ++ * @wl : wl_private data ++ * @ie : probe request ie (WPS IE + P2P IE) ++ * @ie_len : probe request ie length ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_enable_discovery(struct wl_priv *wl, struct net_device *dev, ++ const u8 *ie, u32 ie_len) ++{ ++ s32 ret = BCME_OK; ++ s32 bssidx = (wl_to_prmry_ndev(wl) == dev) ? ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) : wl_cfgp2p_find_idx(wl, dev); ++ if (wl_get_p2p_status(wl, DISCOVERY_ON)) { ++ AP6210_DEBUG(" DISCOVERY is already initialized, we have nothing to do\n"); ++ goto set_ie; ++ } ++ ++ wl_set_p2p_status(wl, DISCOVERY_ON); ++ ++ AP6210_DEBUG("enter\n"); ++ ++ ret = wl_cfgp2p_init_discovery(wl); ++ if (unlikely(ret < 0)) { ++ AP6210_ERR(" init discovery error %d\n", ret); ++ goto exit; ++ } ++ /* Set wsec to any non-zero value in the discovery bsscfg to ensure our ++ * P2P probe responses have the privacy bit set in the 802.11 WPA IE. ++ * Some peer devices may not initiate WPS with us if this bit is not set. ++ */ ++ ret = wldev_iovar_setint_bsscfg(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE), ++ "wsec", AES_ENABLED, wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ if (unlikely(ret < 0)) { ++ AP6210_ERR(" wsec error %d\n", ret); ++ } ++set_ie: ++ if (ie_len) { ++ ret = wl_cfgp2p_set_management_ie(wl, dev, ++ bssidx, ++ VNDR_IE_PRBREQ_FLAG, ie, ie_len); ++ ++ if (unlikely(ret < 0)) { ++ AP6210_ERR("set probreq ie occurs error %d\n", ret); ++ goto exit; ++ } ++ } ++exit: ++ return ret; ++} ++ ++/* Disable P2P Discovery ++ * Parameters: ++ * @wl : wl_private_data ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_disable_discovery(struct wl_priv *wl) ++{ ++ s32 ret = BCME_OK; ++ AP6210_DEBUG(" enter\n"); ++ wl_clr_p2p_status(wl, DISCOVERY_ON); ++ ++ if (wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE) == 0) { ++ AP6210_ERR(" do nothing, not initialized\n"); ++ goto exit; ++ } ++ ++ ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ ++ if (unlikely(ret < 0)) { ++ ++ AP6210_ERR("unable to set WL_P2P_DISC_ST_SCAN\n"); ++ } ++ /* Do a scan abort to stop the driver's scan engine in case it is still ++ * waiting out an action frame tx dwell time. ++ */ ++ wl_clr_p2p_status(wl, DISCOVERY_ON); ++ ret = wl_cfgp2p_deinit_discovery(wl); ++ ++exit: ++ return ret; ++} ++ ++s32 ++wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, ++ u32 num_chans, u16 *channels, ++ s32 search_state, u16 action, u32 bssidx) ++{ ++ s32 ret = BCME_OK; ++ s32 memsize; ++ s32 eparams_size; ++ u32 i; ++ s8 *memblk; ++ wl_p2p_scan_t *p2p_params; ++ wl_escan_params_t *eparams; ++ wlc_ssid_t ssid; ++ /* Scan parameters */ ++#define P2PAPI_SCAN_NPROBES 1 ++#define P2PAPI_SCAN_DWELL_TIME_MS 80 ++#define P2PAPI_SCAN_SOCIAL_DWELL_TIME_MS 40 ++#define P2PAPI_SCAN_HOME_TIME_MS 60 ++#define P2PAPI_SCAN_NPROBS_TIME_MS 30 ++#define P2PAPI_SCAN_AF_SEARCH_DWELL_TIME_MS 100 ++ ++ struct net_device *pri_dev = wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_PRIMARY); ++ /* Allocate scan params which need space for 3 channels and 0 ssids */ ++ eparams_size = (WL_SCAN_PARAMS_FIXED_SIZE + ++ OFFSETOF(wl_escan_params_t, params)) + ++ num_chans * sizeof(eparams->params.channel_list[0]); ++ ++ memsize = sizeof(wl_p2p_scan_t) + eparams_size; ++ memblk = scanparambuf; ++ if (memsize > sizeof(scanparambuf)) { ++ AP6210_ERR(" scanpar buf too small (%u > %u)\n", ++ memsize, sizeof(scanparambuf)); ++ return -1; ++ } ++ memset(memblk, 0, memsize); ++ memset(wl->ioctl_buf, 0, WLC_IOCTL_MAXLEN); ++ if (search_state == WL_P2P_DISC_ST_SEARCH) { ++ /* ++ * If we in SEARCH STATE, we don't need to set SSID explictly ++ * because dongle use P2P WILDCARD internally by default ++ */ ++ wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SEARCH, 0, 0, bssidx); ++ ssid.SSID_len = htod32(0); ++ ++ } else if (search_state == WL_P2P_DISC_ST_SCAN) { ++ /* SCAN STATE 802.11 SCAN ++ * WFD Supplicant has p2p_find command with (type=progressive, type= full) ++ * So if P2P_find command with type=progressive, ++ * we have to set ssid to P2P WILDCARD because ++ * we just do broadcast scan unless setting SSID ++ */ ++ strncpy(ssid.SSID, WL_P2P_WILDCARD_SSID, sizeof(ssid.SSID) - 1); ++ ssid.SSID[sizeof(ssid.SSID) - 1] = 0; ++ ssid.SSID_len = htod32(WL_P2P_WILDCARD_SSID_LEN); ++ wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, bssidx); ++ } ++ else { ++ AP6210_ERR(" invalid search state %d\n", search_state); ++ return -1; ++ } ++ ++ ++ /* Fill in the P2P scan structure at the start of the iovar param block */ ++ p2p_params = (wl_p2p_scan_t*) memblk; ++ p2p_params->type = 'E'; ++ /* Fill in the Scan structure that follows the P2P scan structure */ ++ eparams = (wl_escan_params_t*) (p2p_params + 1); ++ eparams->params.bss_type = DOT11_BSSTYPE_ANY; ++ if (active) ++ eparams->params.scan_type = DOT11_SCANTYPE_ACTIVE; ++ else ++ eparams->params.scan_type = DOT11_SCANTYPE_PASSIVE; ++ ++ memcpy(&eparams->params.bssid, ðer_bcast, ETHER_ADDR_LEN); ++ if (ssid.SSID_len) ++ memcpy(&eparams->params.ssid, &ssid, sizeof(wlc_ssid_t)); ++ ++ eparams->params.home_time = htod32(P2PAPI_SCAN_HOME_TIME_MS); ++ ++ /* SOCIAL_CHAN_CNT + 1 takes care of the Progressive scan supported by ++ * the supplicant ++ */ ++ if ((num_chans == SOCIAL_CHAN_CNT) || (num_chans == SOCIAL_CHAN_CNT + 1)) ++ eparams->params.active_time = htod32(P2PAPI_SCAN_SOCIAL_DWELL_TIME_MS); ++ else if (num_chans == AF_PEER_SEARCH_CNT) ++ eparams->params.active_time = htod32(P2PAPI_SCAN_AF_SEARCH_DWELL_TIME_MS); ++ else if (wl_get_drv_status_all(wl, CONNECTED)) ++ eparams->params.active_time = -1; ++ else ++ eparams->params.active_time = htod32(P2PAPI_SCAN_DWELL_TIME_MS); ++ eparams->params.nprobes = htod32((eparams->params.active_time / ++ P2PAPI_SCAN_NPROBS_TIME_MS)); ++ ++ /* Override scan params to find a peer for a connection */ ++ if (num_chans == 1) { ++ eparams->params.active_time = htod32(WL_SCAN_CONNECT_DWELL_TIME_MS); ++ eparams->params.nprobes = htod32(eparams->params.active_time / ++ WL_SCAN_JOIN_PROBE_INTERVAL_MS); ++ } ++ ++ if (eparams->params.nprobes <= 0) ++ eparams->params.nprobes = 1; ++ AP6210_DEBUG("nprobes # %d, active_time %d\n", ++ eparams->params.nprobes, eparams->params.active_time); ++ eparams->params.passive_time = htod32(-1); ++ eparams->params.channel_num = htod32((0 << WL_SCAN_PARAMS_NSSID_SHIFT) | ++ (num_chans & WL_SCAN_PARAMS_COUNT_MASK)); ++ ++ for (i = 0; i < num_chans; i++) { ++ eparams->params.channel_list[i] = wl_ch_host_to_driver(channels[i]); ++ } ++ eparams->version = htod32(ESCAN_REQ_VERSION); ++ eparams->action = htod16(action); ++ eparams->sync_id = htod16(0x1234); ++ AP6210_DEBUG("SCAN CHANNELS : "); ++ ++ for (i = 0; i < num_chans; i++) { ++ if (i == 0) AP6210_DEBUG("%d", channels[i]); ++ else AP6210_DEBUG(",%d", channels[i]); ++ } ++ ++ AP6210_DEBUG("\n"); ++ ++ ret = wldev_iovar_setbuf_bsscfg(pri_dev, "p2p_scan", ++ memblk, memsize, wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ if (ret == BCME_OK) ++ wl_set_p2p_status(wl, SCANNING); ++ return ret; ++} ++ ++/* search function to reach at common channel to send action frame ++ * Parameters: ++ * @wl : wl_private data ++ * @ndev : net device for bssidx ++ * @bssidx : bssidx for BSS ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_act_frm_search(struct wl_priv *wl, struct net_device *ndev, ++ s32 bssidx, s32 channel) ++{ ++ s32 ret = 0; ++ u32 chan_cnt = 0; ++ u16 *default_chan_list = NULL; ++ if (!p2p_is_on(wl) || ndev == NULL || bssidx == WL_INVALID) ++ return -BCME_ERROR; ++ AP6210_DEBUG(" Enter\n"); ++ if (bssidx == P2PAPI_BSSCFG_PRIMARY) ++ bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); ++ if (channel) ++ chan_cnt = AF_PEER_SEARCH_CNT; ++ else ++ chan_cnt = SOCIAL_CHAN_CNT; ++ default_chan_list = kzalloc(chan_cnt * sizeof(*default_chan_list), GFP_KERNEL); ++ if (default_chan_list == NULL) { ++ AP6210_ERR("channel list allocation failed \n"); ++ ret = -ENOMEM; ++ goto exit; ++ } ++ if (channel) { ++ u32 i; ++ /* insert same channel to the chan_list */ ++ for (i = 0; i < chan_cnt; i++) { ++ default_chan_list[i] = channel; ++ } ++ } else { ++ default_chan_list[0] = SOCIAL_CHAN_1; ++ default_chan_list[1] = SOCIAL_CHAN_2; ++ default_chan_list[2] = SOCIAL_CHAN_3; ++ } ++ ret = wl_cfgp2p_escan(wl, ndev, true, chan_cnt, ++ default_chan_list, WL_P2P_DISC_ST_SEARCH, ++ WL_SCAN_ACTION_START, bssidx); ++ kfree(default_chan_list); ++exit: ++ return ret; ++} ++ ++/* Check whether pointed-to IE looks like WPA. */ ++#define wl_cfgp2p_is_wpa_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ ++ (const uint8 *)WPS_OUI, WPS_OUI_LEN, WPA_OUI_TYPE) ++/* Check whether pointed-to IE looks like WPS. */ ++#define wl_cfgp2p_is_wps_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ ++ (const uint8 *)WPS_OUI, WPS_OUI_LEN, WPS_OUI_TYPE) ++/* Check whether the given IE looks like WFA P2P IE. */ ++#define wl_cfgp2p_is_p2p_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ ++ (const uint8 *)WFA_OUI, WFA_OUI_LEN, WFA_OUI_TYPE_P2P) ++/* Check whether the given IE looks like WFA WFDisplay IE. */ ++#define WFA_OUI_TYPE_WFD 0x0a /* WiFi Display OUI TYPE */ ++#define wl_cfgp2p_is_wfd_ie(ie, tlvs, len) wl_cfgp2p_has_ie(ie, tlvs, len, \ ++ (const uint8 *)WFA_OUI, WFA_OUI_LEN, WFA_OUI_TYPE_WFD) ++ ++static s32 ++wl_cfgp2p_parse_vndr_ies(u8 *parse, u32 len, ++ struct parsed_vndr_ies *vndr_ies) ++{ ++ s32 err = BCME_OK; ++ vndr_ie_t *vndrie; ++ bcm_tlv_t *ie; ++ struct parsed_vndr_ie_info *parsed_info; ++ u32 count = 0; ++ s32 remained_len; ++ ++ remained_len = (s32)len; ++ memset(vndr_ies, 0, sizeof(*vndr_ies)); ++ ++ AP6210_DEBUG("---> len %d\n", len); ++ ie = (bcm_tlv_t *) parse; ++ if (!bcm_valid_tlv(ie, remained_len)) ++ ie = NULL; ++ while (ie) { ++ if (count >= MAX_VNDR_IE_NUMBER) ++ break; ++ if (ie->id == DOT11_MNG_VS_ID) { ++ vndrie = (vndr_ie_t *) ie; ++ /* len should be bigger than OUI length + one data length at least */ ++ if (vndrie->len < (VNDR_IE_MIN_LEN + 1)) { ++ AP6210_ERR("%s: invalid vndr ie. length is too small %d\n", ++ __FUNCTION__, vndrie->len); ++ goto end; ++ } ++ /* if wpa or wme ie, do not add ie */ ++ if (!bcmp(vndrie->oui, (u8*)WPA_OUI, WPA_OUI_LEN) && ++ ((vndrie->data[0] == WPA_OUI_TYPE) || ++ (vndrie->data[0] == WME_OUI_TYPE))) { ++ AP6210_DEBUG("Found WPA/WME oui. Do not add it\n"); ++ goto end; ++ } ++ ++ parsed_info = &vndr_ies->ie_info[count++]; ++ ++ /* save vndr ie information */ ++ parsed_info->ie_ptr = (char *)vndrie; ++ parsed_info->ie_len = (vndrie->len + TLV_HDR_LEN); ++ memcpy(&parsed_info->vndrie, vndrie, sizeof(vndr_ie_t)); ++ ++ vndr_ies->count = count; ++ ++ AP6210_DEBUG("\t ** OUI %02x %02x %02x, type 0x%02x \n", ++ parsed_info->vndrie.oui[0], parsed_info->vndrie.oui[1], ++ parsed_info->vndrie.oui[2], parsed_info->vndrie.data[0]); ++ } ++end: ++ ie = bcm_next_tlv(ie, &remained_len); ++ } ++ return err; ++} ++ ++ ++/* Delete and Set a management vndr ie to firmware ++ * Parameters: ++ * @wl : wl_private data ++ * @ndev : net device for bssidx ++ * @bssidx : bssidx for BSS ++ * @pktflag : packet flag for IE (VNDR_IE_PRBREQ_FLAG,VNDR_IE_PRBRSP_FLAG, VNDR_IE_ASSOCRSP_FLAG, ++ * VNDR_IE_ASSOCREQ_FLAG) ++ * @ie : VNDR IE (such as P2P IE , WPS IE) ++ * @ie_len : VNDR IE Length ++ * Returns 0 if success. ++ */ ++ ++s32 ++wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, ++ s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len) ++{ ++ s32 ret = BCME_OK; ++ u8 *curr_ie_buf = NULL; ++ u8 *mgmt_ie_buf = NULL; ++ u32 mgmt_ie_buf_len = 0; ++ u32 *mgmt_ie_len = 0; ++ u32 del_add_ie_buf_len = 0; ++ u32 total_ie_buf_len = 0; ++ u32 parsed_ie_buf_len = 0; ++ struct parsed_vndr_ies old_vndr_ies; ++ struct parsed_vndr_ies new_vndr_ies; ++ s32 i; ++ u8 *ptr; ++ s32 remained_buf_len; ++ ++#define IE_TYPE(type, bsstype) (wl_to_p2p_bss_saved_ie(wl, bsstype).p2p_ ## type ## _ie) ++#define IE_TYPE_LEN(type, bsstype) (wl_to_p2p_bss_saved_ie(wl, bsstype).p2p_ ## type ## _ie_len) ++ memset(g_mgmt_ie_buf, 0, sizeof(g_mgmt_ie_buf)); ++ curr_ie_buf = g_mgmt_ie_buf; ++ AP6210_DEBUG(" bssidx %d, pktflag : 0x%02X\n", bssidx, pktflag); ++ if (wl->p2p != NULL) { ++ switch (pktflag) { ++ case VNDR_IE_PRBREQ_FLAG : ++ mgmt_ie_buf = IE_TYPE(probe_req, bssidx); ++ mgmt_ie_len = &IE_TYPE_LEN(probe_req, bssidx); ++ mgmt_ie_buf_len = sizeof(IE_TYPE(probe_req, bssidx)); ++ break; ++ case VNDR_IE_PRBRSP_FLAG : ++ mgmt_ie_buf = IE_TYPE(probe_res, bssidx); ++ mgmt_ie_len = &IE_TYPE_LEN(probe_res, bssidx); ++ mgmt_ie_buf_len = sizeof(IE_TYPE(probe_res, bssidx)); ++ break; ++ case VNDR_IE_ASSOCREQ_FLAG : ++ mgmt_ie_buf = IE_TYPE(assoc_req, bssidx); ++ mgmt_ie_len = &IE_TYPE_LEN(assoc_req, bssidx); ++ mgmt_ie_buf_len = sizeof(IE_TYPE(assoc_req, bssidx)); ++ break; ++ case VNDR_IE_ASSOCRSP_FLAG : ++ mgmt_ie_buf = IE_TYPE(assoc_res, bssidx); ++ mgmt_ie_len = &IE_TYPE_LEN(assoc_res, bssidx); ++ mgmt_ie_buf_len = sizeof(IE_TYPE(assoc_res, bssidx)); ++ break; ++ case VNDR_IE_BEACON_FLAG : ++ mgmt_ie_buf = IE_TYPE(beacon, bssidx); ++ mgmt_ie_len = &IE_TYPE_LEN(beacon, bssidx); ++ mgmt_ie_buf_len = sizeof(IE_TYPE(beacon, bssidx)); ++ break; ++ default: ++ mgmt_ie_buf = NULL; ++ mgmt_ie_len = NULL; ++ AP6210_ERR("not suitable type\n"); ++ return -1; ++ } ++ } else if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_AP) { ++ switch (pktflag) { ++ case VNDR_IE_PRBRSP_FLAG : ++ mgmt_ie_buf = wl->ap_info->probe_res_ie; ++ mgmt_ie_len = &wl->ap_info->probe_res_ie_len; ++ mgmt_ie_buf_len = sizeof(wl->ap_info->probe_res_ie); ++ break; ++ case VNDR_IE_BEACON_FLAG : ++ mgmt_ie_buf = wl->ap_info->beacon_ie; ++ mgmt_ie_len = &wl->ap_info->beacon_ie_len; ++ mgmt_ie_buf_len = sizeof(wl->ap_info->beacon_ie); ++ break; ++ default: ++ mgmt_ie_buf = NULL; ++ mgmt_ie_len = NULL; ++ AP6210_ERR("not suitable type\n"); ++ return -1; ++ } ++ bssidx = 0; ++ } else if (wl_get_mode_by_netdev(wl, ndev) == WL_MODE_BSS) { ++ switch (pktflag) { ++ case VNDR_IE_PRBREQ_FLAG : ++ mgmt_ie_buf = wl->sta_info->probe_req_ie; ++ mgmt_ie_len = &wl->sta_info->probe_req_ie_len; ++ mgmt_ie_buf_len = sizeof(wl->sta_info->probe_req_ie); ++ break; ++ case VNDR_IE_ASSOCREQ_FLAG : ++ mgmt_ie_buf = wl->sta_info->assoc_req_ie; ++ mgmt_ie_len = &wl->sta_info->assoc_req_ie_len; ++ mgmt_ie_buf_len = sizeof(wl->sta_info->assoc_req_ie); ++ break; ++ default: ++ mgmt_ie_buf = NULL; ++ mgmt_ie_len = NULL; ++ AP6210_ERR("not suitable type\n"); ++ return -1; ++ } ++ bssidx = 0; ++ } else { ++ AP6210_ERR("not suitable type\n"); ++ return -1; ++ } ++ ++ if (vndr_ie_len > mgmt_ie_buf_len) { ++ AP6210_ERR("extra IE size too big\n"); ++ ret = -ENOMEM; ++ } else { ++ /* parse and save new vndr_ie in curr_ie_buff before comparing it */ ++ if (vndr_ie && vndr_ie_len && curr_ie_buf) { ++ ptr = curr_ie_buf; ++ ++ wl_cfgp2p_parse_vndr_ies((u8*)vndr_ie, ++ vndr_ie_len, &new_vndr_ies); ++ ++ for (i = 0; i < new_vndr_ies.count; i++) { ++ struct parsed_vndr_ie_info *vndrie_info = ++ &new_vndr_ies.ie_info[i]; ++ ++ memcpy(ptr + parsed_ie_buf_len, vndrie_info->ie_ptr, ++ vndrie_info->ie_len); ++ parsed_ie_buf_len += vndrie_info->ie_len; ++ } ++ } ++ ++ if (mgmt_ie_buf != NULL) { ++ if (parsed_ie_buf_len && (parsed_ie_buf_len == *mgmt_ie_len) && ++ (memcmp(mgmt_ie_buf, curr_ie_buf, parsed_ie_buf_len) == 0)) { ++ AP6210_DEBUG("Previous mgmt IE is equals to current IE"); ++ goto exit; ++ } ++ ++ /* parse old vndr_ie */ ++ wl_cfgp2p_parse_vndr_ies(mgmt_ie_buf, *mgmt_ie_len, ++ &old_vndr_ies); ++ ++ /* make a command to delete old ie */ ++ for (i = 0; i < old_vndr_ies.count; i++) { ++ struct parsed_vndr_ie_info *vndrie_info = ++ &old_vndr_ies.ie_info[i]; ++ ++ AP6210_DEBUG("DELETED ID : %d, Len: %d , OUI:%02x:%02x:%02x\n", ++ vndrie_info->vndrie.id, vndrie_info->vndrie.len, ++ vndrie_info->vndrie.oui[0], vndrie_info->vndrie.oui[1], ++ vndrie_info->vndrie.oui[2]); ++ ++ del_add_ie_buf_len = wl_cfgp2p_vndr_ie(wl, curr_ie_buf, ++ bssidx, pktflag, vndrie_info->vndrie.oui, ++ vndrie_info->vndrie.id, ++ vndrie_info->ie_ptr + VNDR_IE_FIXED_LEN, ++ vndrie_info->ie_len - VNDR_IE_FIXED_LEN, ++ "del"); ++ ++ curr_ie_buf += del_add_ie_buf_len; ++ total_ie_buf_len += del_add_ie_buf_len; ++ } ++ } ++ ++ *mgmt_ie_len = 0; ++ /* Add if there is any extra IE */ ++ if (mgmt_ie_buf && parsed_ie_buf_len) { ++ ptr = mgmt_ie_buf; ++ ++ remained_buf_len = mgmt_ie_buf_len; ++ ++ /* make a command to add new ie */ ++ for (i = 0; i < new_vndr_ies.count; i++) { ++ struct parsed_vndr_ie_info *vndrie_info = ++ &new_vndr_ies.ie_info[i]; ++ ++ AP6210_DEBUG("ADDED ID : %d, Len: %d(%d), OUI:%02x:%02x:%02x\n", ++ vndrie_info->vndrie.id, vndrie_info->vndrie.len, ++ vndrie_info->ie_len - 2, ++ vndrie_info->vndrie.oui[0], vndrie_info->vndrie.oui[1], ++ vndrie_info->vndrie.oui[2]); ++ ++ del_add_ie_buf_len = wl_cfgp2p_vndr_ie(wl, curr_ie_buf, ++ bssidx, pktflag, vndrie_info->vndrie.oui, ++ vndrie_info->vndrie.id, ++ vndrie_info->ie_ptr + VNDR_IE_FIXED_LEN, ++ vndrie_info->ie_len - VNDR_IE_FIXED_LEN, ++ "add"); ++ ++ /* verify remained buf size before copy data */ ++ if (remained_buf_len >= vndrie_info->ie_len) { ++ remained_buf_len -= vndrie_info->ie_len; ++ } else { ++ AP6210_ERR("no space in mgmt_ie_buf: pktflag = %d, " ++ "found vndr ies # = %d(cur %d), remained len %d, " ++ "cur mgmt_ie_len %d, new ie len = %d\n", ++ pktflag, new_vndr_ies.count, i, remained_buf_len, ++ *mgmt_ie_len, vndrie_info->ie_len); ++ break; ++ } ++ ++ /* save the parsed IE in wl struct */ ++ memcpy(ptr + (*mgmt_ie_len), vndrie_info->ie_ptr, ++ vndrie_info->ie_len); ++ *mgmt_ie_len += vndrie_info->ie_len; ++ ++ curr_ie_buf += del_add_ie_buf_len; ++ total_ie_buf_len += del_add_ie_buf_len; ++ } ++ } ++ if (total_ie_buf_len) { ++ ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf, ++ total_ie_buf_len, wl->ioctl_buf, WLC_IOCTL_MAXLEN, ++ bssidx, &wl->ioctl_buf_sync); ++ if (ret) ++ AP6210_ERR("vndr ie set error : %d\n", ret); ++ } ++ } ++#undef IE_TYPE ++#undef IE_TYPE_LEN ++exit: ++ return ret; ++} ++ ++/* Clear the manament IE buffer of BSSCFG ++ * Parameters: ++ * @wl : wl_private data ++ * @bssidx : bssidx for BSS ++ * ++ * Returns 0 if success. ++ */ ++s32 ++wl_cfgp2p_clear_management_ie(struct wl_priv *wl, s32 bssidx) ++{ ++ s32 vndrie_flag[] = {VNDR_IE_BEACON_FLAG, VNDR_IE_PRBRSP_FLAG, VNDR_IE_ASSOCRSP_FLAG, ++ VNDR_IE_PRBREQ_FLAG, VNDR_IE_ASSOCREQ_FLAG}; ++ s32 index = -1; ++ struct net_device *ndev = wl_cfgp2p_find_ndev(wl, bssidx); ++#define INIT_IE(IE_TYPE, BSS_TYPE) \ ++ do { \ ++ memset(wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie, 0, \ ++ sizeof(wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie)); \ ++ wl_to_p2p_bss_saved_ie(wl, BSS_TYPE).p2p_ ## IE_TYPE ## _ie_len = 0; \ ++ } while (0); ++ ++ if (bssidx < 0 || ndev == NULL) { ++ AP6210_ERR("invalid %s\n", (bssidx < 0) ? "bssidx" : "ndev"); ++ return BCME_BADARG; ++ } ++ for (index = 0; index < ARRAYSIZE(vndrie_flag); index++) { ++ /* clean up vndr ies in dongle */ ++ wl_cfgp2p_set_management_ie(wl, ndev, bssidx, vndrie_flag[index], NULL, 0); ++ } ++ INIT_IE(probe_req, bssidx); ++ INIT_IE(probe_res, bssidx); ++ INIT_IE(assoc_req, bssidx); ++ INIT_IE(assoc_res, bssidx); ++ INIT_IE(beacon, bssidx); ++ return BCME_OK; ++} ++ ++ ++/* Is any of the tlvs the expected entry? If ++ * not update the tlvs buffer pointer/length. ++ */ ++static bool ++wl_cfgp2p_has_ie(u8 *ie, u8 **tlvs, u32 *tlvs_len, const u8 *oui, u32 oui_len, u8 type) ++{ ++ /* If the contents match the OUI and the type */ ++ if (ie[TLV_LEN_OFF] >= oui_len + 1 && ++ !bcmp(&ie[TLV_BODY_OFF], oui, oui_len) && ++ type == ie[TLV_BODY_OFF + oui_len]) { ++ return TRUE; ++ } ++ ++ if (tlvs == NULL) ++ return FALSE; ++ /* point to the next ie */ ++ ie += ie[TLV_LEN_OFF] + TLV_HDR_LEN; ++ /* calculate the length of the rest of the buffer */ ++ *tlvs_len -= (int)(ie - *tlvs); ++ /* update the pointer to the start of the buffer */ ++ *tlvs = ie; ++ ++ return FALSE; ++} ++ ++wpa_ie_fixed_t * ++wl_cfgp2p_find_wpaie(u8 *parse, u32 len) ++{ ++ bcm_tlv_t *ie; ++ ++ while ((ie = bcm_parse_tlvs(parse, (u32)len, DOT11_MNG_VS_ID))) { ++ if (wl_cfgp2p_is_wpa_ie((u8*)ie, &parse, &len)) { ++ return (wpa_ie_fixed_t *)ie; ++ } ++ } ++ return NULL; ++} ++ ++wpa_ie_fixed_t * ++wl_cfgp2p_find_wpsie(u8 *parse, u32 len) ++{ ++ bcm_tlv_t *ie; ++ ++ while ((ie = bcm_parse_tlvs(parse, (u32)len, DOT11_MNG_VS_ID))) { ++ if (wl_cfgp2p_is_wps_ie((u8*)ie, &parse, &len)) { ++ return (wpa_ie_fixed_t *)ie; ++ } ++ } ++ return NULL; ++} ++ ++wifi_p2p_ie_t * ++wl_cfgp2p_find_p2pie(u8 *parse, u32 len) ++{ ++ bcm_tlv_t *ie; ++ ++ while ((ie = bcm_parse_tlvs(parse, (int)len, DOT11_MNG_VS_ID))) { ++ if (wl_cfgp2p_is_p2p_ie((uint8*)ie, &parse, &len)) { ++ return (wifi_p2p_ie_t *)ie; ++ } ++ } ++ return NULL; ++} ++ ++wifi_wfd_ie_t * ++wl_cfgp2p_find_wfdie(u8 *parse, u32 len) ++{ ++ bcm_tlv_t *ie; ++ ++ while ((ie = bcm_parse_tlvs(parse, (int)len, DOT11_MNG_VS_ID))) { ++ if (wl_cfgp2p_is_wfd_ie((uint8*)ie, &parse, &len)) { ++ return (wifi_wfd_ie_t *)ie; ++ } ++ } ++ return NULL; ++} ++static u32 ++wl_cfgp2p_vndr_ie(struct wl_priv *wl, u8 *iebuf, s32 bssidx, s32 pktflag, ++ s8 *oui, s32 ie_id, s8 *data, s32 datalen, const s8* add_del_cmd) ++{ ++ vndr_ie_setbuf_t hdr; /* aligned temporary vndr_ie buffer header */ ++ s32 iecount; ++ u32 data_offset; ++ ++ /* Validate the pktflag parameter */ ++ if ((pktflag & ~(VNDR_IE_BEACON_FLAG | VNDR_IE_PRBRSP_FLAG | ++ VNDR_IE_ASSOCRSP_FLAG | VNDR_IE_AUTHRSP_FLAG | ++ VNDR_IE_PRBREQ_FLAG | VNDR_IE_ASSOCREQ_FLAG))) { ++ AP6210_ERR("p2pwl_vndr_ie: Invalid packet flag 0x%x\n", pktflag); ++ return -1; ++ } ++ ++ /* Copy the vndr_ie SET command ("add"/"del") to the buffer */ ++ strncpy(hdr.cmd, add_del_cmd, VNDR_IE_CMD_LEN - 1); ++ hdr.cmd[VNDR_IE_CMD_LEN - 1] = '\0'; ++ ++ /* Set the IE count - the buffer contains only 1 IE */ ++ iecount = htod32(1); ++ memcpy((void *)&hdr.vndr_ie_buffer.iecount, &iecount, sizeof(s32)); ++ ++ /* Copy packet flags that indicate which packets will contain this IE */ ++ pktflag = htod32(pktflag); ++ memcpy((void *)&hdr.vndr_ie_buffer.vndr_ie_list[0].pktflag, &pktflag, ++ sizeof(u32)); ++ ++ /* Add the IE ID to the buffer */ ++ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.id = ie_id; ++ ++ /* Add the IE length to the buffer */ ++ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.len = ++ (uint8) VNDR_IE_MIN_LEN + datalen; ++ ++ /* Add the IE OUI to the buffer */ ++ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui[0] = oui[0]; ++ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui[1] = oui[1]; ++ hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui[2] = oui[2]; ++ ++ /* Copy the aligned temporary vndr_ie buffer header to the IE buffer */ ++ memcpy(iebuf, &hdr, sizeof(hdr) - 1); ++ ++ /* Copy the IE data to the IE buffer */ ++ data_offset = ++ (u8*)&hdr.vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.data[0] - ++ (u8*)&hdr; ++ memcpy(iebuf + data_offset, data, datalen); ++ return data_offset + datalen; ++ ++} ++ ++/* ++ * Search the bssidx based on dev argument ++ * Parameters: ++ * @wl : wl_private data ++ * @ndev : net device to search bssidx ++ * Returns bssidx for ndev ++ */ ++s32 ++wl_cfgp2p_find_idx(struct wl_priv *wl, struct net_device *ndev) ++{ ++ u32 i; ++ s32 index = -1; ++ ++ if (ndev == NULL) { ++ AP6210_ERR(" ndev is NULL\n"); ++ goto exit; ++ } ++ if (!wl->p2p_supported) { ++ return P2PAPI_BSSCFG_PRIMARY; ++ } ++ for (i = 0; i < P2PAPI_BSSCFG_MAX; i++) { ++ if (ndev == wl_to_p2p_bss_ndev(wl, i)) { ++ index = wl_to_p2p_bss_bssidx(wl, i); ++ break; ++ } ++ } ++ if (index == -1) ++ return P2PAPI_BSSCFG_PRIMARY; ++exit: ++ return index; ++} ++ ++struct net_device * ++wl_cfgp2p_find_ndev(struct wl_priv *wl, s32 bssidx) ++{ ++ u32 i; ++ struct net_device *ndev = NULL; ++ if (bssidx < 0) { ++ AP6210_ERR(" bsscfg idx is invalid\n"); ++ goto exit; ++ } ++ ++ for (i = 0; i < P2PAPI_BSSCFG_MAX; i++) { ++ if (bssidx == wl_to_p2p_bss_bssidx(wl, i)) { ++ ndev = wl_to_p2p_bss_ndev(wl, i); ++ break; ++ } ++ } ++ ++exit: ++ return ndev; ++} ++ ++/* ++ * Callback function for WLC_E_P2P_DISC_LISTEN_COMPLETE ++ */ ++s32 ++wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ s32 ret = BCME_OK; ++ struct net_device *netdev; ++ if (!wl || !wl->p2p) ++ return BCME_ERROR; ++ if (wl->p2p_net == ndev) { ++ netdev = wl_to_prmry_ndev(wl); ++ } else { ++ netdev = ndev; ++ } ++ AP6210_DEBUG(" Enter\n"); ++ if (wl_get_p2p_status(wl, LISTEN_EXPIRED) == 0) { ++ wl_set_p2p_status(wl, LISTEN_EXPIRED); ++ if (timer_pending(&wl->p2p->listen_timer)) { ++ del_timer_sync(&wl->p2p->listen_timer); ++ } ++ ++ if (wl->afx_hdl->is_listen == TRUE && ++ wl_get_drv_status_all(wl, FINDING_COMMON_CHANNEL)) { ++ AP6210_DEBUG("Listen DONE for action frame\n"); ++ complete(&wl->act_frm_scan); ++ } ++#ifdef WL_CFG80211_SYNC_GON ++ else if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM_LISTEN)) { ++ wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM_LISTEN, netdev); ++ AP6210_DEBUG("Listen DONE and wake up wait_next_af !!(%d)\n", ++ jiffies_to_msecs(jiffies - wl->af_tx_sent_jiffies)); ++ ++ if (wl_get_drv_status_all(wl, WAITING_NEXT_ACT_FRM)) ++ wl_clr_drv_status(wl, WAITING_NEXT_ACT_FRM, netdev); ++ ++ complete(&wl->wait_next_af); ++ } ++#endif /* WL_CFG80211_SYNC_GON */ ++ ++#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL)) { ++#else ++ if (wl_get_drv_status_all(wl, REMAINING_ON_CHANNEL) || ++ wl_get_drv_status_all(wl, FAKE_REMAINING_ON_CHANNEL)) { ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ AP6210_DEBUG("Listen DONE for ramain on channel expired\n"); ++ wl_clr_drv_status(wl, REMAINING_ON_CHANNEL, netdev); ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ wl_clr_drv_status(wl, FAKE_REMAINING_ON_CHANNEL, netdev); ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ if (ndev && (ndev->ieee80211_ptr != NULL)) { ++ cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, ++ &wl->remain_on_chan, wl->remain_on_chan_type, GFP_KERNEL); ++ } ++ } ++ if (wl_add_remove_eventmsg(wl_to_prmry_ndev(wl), ++ WLC_E_P2P_PROBREQ_MSG, false) != BCME_OK) { ++ AP6210_ERR(" failed to unset WLC_E_P2P_PROPREQ_MSG\n"); ++ } ++ } else ++ wl_clr_p2p_status(wl, LISTEN_EXPIRED); ++ ++ return ret; ++ ++} ++ ++/* ++ * Timer expire callback function for LISTEN ++ * We can't report cfg80211_remain_on_channel_expired from Timer ISR context, ++ * so lets do it from thread context. ++ */ ++void ++wl_cfgp2p_listen_expired(unsigned long data) ++{ ++ wl_event_msg_t msg; ++ struct wl_priv *wl = (struct wl_priv *) data; ++ AP6210_DEBUG(" Enter\n"); ++ bzero(&msg, sizeof(wl_event_msg_t)); ++ msg.event_type = hton32(WLC_E_P2P_DISC_LISTEN_COMPLETE); ++ wl_cfg80211_event(wl->p2p_net ? wl->p2p_net : ++ wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_DEVICE), &msg, NULL); ++} ++/* ++ * Routine for cancelling the P2P LISTEN ++ */ ++static s32 ++wl_cfgp2p_cancel_listen(struct wl_priv *wl, struct net_device *ndev, ++ bool notify) ++{ ++ AP6210_DEBUG("Enter \n"); ++ /* Irrespective of whether timer is running or not, reset ++ * the LISTEN state. ++ */ ++ if (timer_pending(&wl->p2p->listen_timer)) { ++ del_timer_sync(&wl->p2p->listen_timer); ++ if (notify) ++ if (ndev && ndev->ieee80211_ptr) { ++ cfg80211_remain_on_channel_expired(ndev, wl->last_roc_id, ++ &wl->remain_on_chan, wl->remain_on_chan_type, ++ GFP_KERNEL); ++ } ++ } ++ return 0; ++} ++/* ++ * Do a P2P Listen on the given channel for the given duration. ++ * A listen consists of sitting idle and responding to P2P probe requests ++ * with a P2P probe response. ++ * ++ * This fn assumes dongle p2p device discovery is already enabled. ++ * Parameters : ++ * @wl : wl_private data ++ * @channel : channel to listen ++ * @duration_ms : the time (milli seconds) to wait ++ */ ++s32 ++wl_cfgp2p_discover_listen(struct wl_priv *wl, s32 channel, u32 duration_ms) ++{ ++#define EXTRA_DELAY_TIME 100 ++ s32 ret = BCME_OK; ++ struct timer_list *_timer; ++ s32 extra_delay; ++ struct net_device *netdev = wl_to_prmry_ndev(wl); ++ ++ AP6210_DEBUG(" Enter Listen Channel : %d, Duration : %d\n", channel, duration_ms); ++ if (unlikely(wl_get_p2p_status(wl, DISCOVERY_ON) == 0)) { ++ ++ AP6210_ERR(" Discovery is not set, so we have noting to do\n"); ++ ++ ret = BCME_NOTREADY; ++ goto exit; ++ } ++ if (timer_pending(&wl->p2p->listen_timer)) { ++ AP6210_DEBUG("previous LISTEN is not completed yet\n"); ++ goto exit; ++ ++ } ++#ifndef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ else ++ wl_clr_p2p_status(wl, LISTEN_EXPIRED); ++#endif /* not WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ if (wl_add_remove_eventmsg(netdev, WLC_E_P2P_PROBREQ_MSG, true) != BCME_OK) { ++ AP6210_ERR(" failed to set WLC_E_P2P_PROPREQ_MSG\n"); ++ } ++ ++ ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_LISTEN, channel, (u16) duration_ms, ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ _timer = &wl->p2p->listen_timer; ++ ++ /* We will wait to receive WLC_E_P2P_DISC_LISTEN_COMPLETE from dongle , ++ * otherwise we will wait up to duration_ms + 100ms + duration / 10 ++ */ ++ if (ret == BCME_OK) { ++ extra_delay = EXTRA_DELAY_TIME + (duration_ms / 10); ++ } else { ++ /* if failed to set listen, it doesn't need to wait whole duration. */ ++ duration_ms = 100 + duration_ms / 20; ++ extra_delay = 0; ++ } ++ ++ INIT_TIMER(_timer, wl_cfgp2p_listen_expired, duration_ms, extra_delay); ++#ifdef WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST ++ wl_clr_p2p_status(wl, LISTEN_EXPIRED); ++#endif /* WL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST */ ++ ++#undef EXTRA_DELAY_TIME ++exit: ++ return ret; ++} ++ ++ ++s32 ++wl_cfgp2p_discover_enable_search(struct wl_priv *wl, u8 enable) ++{ ++ s32 ret = BCME_OK; ++ AP6210_DEBUG(" Enter\n"); ++ if (!wl_get_p2p_status(wl, DISCOVERY_ON)) { ++ ++ AP6210_DEBUG(" do nothing, discovery is off\n"); ++ return ret; ++ } ++ if (wl_get_p2p_status(wl, SEARCH_ENABLED) == enable) { ++ AP6210_DEBUG("already : %d\n", enable); ++ return ret; ++ } ++ ++ wl_chg_p2p_status(wl, SEARCH_ENABLED); ++ /* When disabling Search, reset the WL driver's p2p discovery state to ++ * WL_P2P_DISC_ST_SCAN. ++ */ ++ if (!enable) { ++ wl_clr_p2p_status(wl, SCANNING); ++ ret = wl_cfgp2p_set_p2p_mode(wl, WL_P2P_DISC_ST_SCAN, 0, 0, ++ wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE)); ++ } ++ ++ return ret; ++} ++ ++/* ++ * Callback function for WLC_E_ACTION_FRAME_COMPLETE, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE ++ */ ++s32 ++wl_cfgp2p_action_tx_complete(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data) ++{ ++ s32 ret = BCME_OK; ++ u32 event_type = ntoh32(e->event_type); ++ u32 status = ntoh32(e->status); ++ AP6210_DEBUG(" Enter\n"); ++ if (event_type == WLC_E_ACTION_FRAME_COMPLETE) { ++ ++ AP6210_DEBUG(" WLC_E_ACTION_FRAME_COMPLETE is received : %d\n", status); ++ if (status == WLC_E_STATUS_SUCCESS) { ++ wl_set_p2p_status(wl, ACTION_TX_COMPLETED); ++ AP6210_DEBUG("WLC_E_ACTION_FRAME_COMPLETE : ACK\n"); ++ } ++ else { ++ wl_set_p2p_status(wl, ACTION_TX_NOACK); ++ AP6210_DEBUG("WLC_E_ACTION_FRAME_COMPLETE : NO ACK\n"); ++ wl_stop_wait_next_action_frame(wl, ndev); ++ } ++ } else { ++ AP6210_DEBUG(" WLC_E_ACTION_FRAME_OFFCHAN_COMPLETE is received," ++ "status : %d\n", status); ++ ++ if (wl_get_drv_status_all(wl, SENDING_ACT_FRM)) ++ complete(&wl->send_af_done); ++ } ++ return ret; ++} ++/* Send an action frame immediately without doing channel synchronization. ++ * ++ * This function does not wait for a completion event before returning. ++ * The WLC_E_ACTION_FRAME_COMPLETE event will be received when the action ++ * frame is transmitted. ++ * The WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE event will be received when an ++ * 802.11 ack has been received for the sent action frame. ++ */ ++s32 ++wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, ++ wl_af_params_t *af_params, s32 bssidx) ++{ ++ s32 ret = BCME_OK; ++ s32 timeout = 0; ++ wl_eventmsg_buf_t buf; ++ ++ ++ AP6210_DEBUG("\n"); ++ AP6210_DEBUG("channel : %u , dwell time : %u\n", ++ af_params->channel, af_params->dwell_time); ++ ++ wl_clr_p2p_status(wl, ACTION_TX_COMPLETED); ++ wl_clr_p2p_status(wl, ACTION_TX_NOACK); ++ ++ bzero(&buf, sizeof(wl_eventmsg_buf_t)); ++ wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE, true); ++ wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_COMPLETE, true); ++ if ((ret = wl_cfg80211_apply_eventbuffer(wl_to_prmry_ndev(wl), wl, &buf)) < 0) ++ return ret; ++ ++#define MAX_WAIT_TIME 2000 ++ if (bssidx == P2PAPI_BSSCFG_PRIMARY) ++ bssidx = wl_to_p2p_bss_bssidx(wl, P2PAPI_BSSCFG_DEVICE); ++ ++ wl->af_sent_channel = af_params->channel; ++#ifdef WL_CFG80211_SYNC_GON ++ wl->af_tx_sent_jiffies = jiffies; ++#endif /* WL_CFG80211_SYNC_GON */ ++ ++ ret = wldev_iovar_setbuf_bsscfg(dev, "actframe", af_params, sizeof(*af_params), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &wl->ioctl_buf_sync); ++ ++ if (ret < 0) { ++ AP6210_ERR(" sending action frame is failed\n"); ++ goto exit; ++ } ++ ++ timeout = wait_for_completion_timeout(&wl->send_af_done, msecs_to_jiffies(MAX_WAIT_TIME)); ++ ++ if (timeout > 0 && wl_get_p2p_status(wl, ACTION_TX_COMPLETED)) { ++ AP6210_DEBUG("tx action frame operation is completed\n"); ++ ret = BCME_OK; ++ } else { ++ ret = BCME_ERROR; ++ AP6210_DEBUG("tx action frame operation is failed\n"); ++ } ++ /* clear status bit for action tx */ ++ wl_clr_p2p_status(wl, ACTION_TX_COMPLETED); ++ wl_clr_p2p_status(wl, ACTION_TX_NOACK); ++ ++exit: ++ AP6210_DEBUG(" via act frame iovar : status = %d\n", ret); ++ ++ bzero(&buf, sizeof(wl_eventmsg_buf_t)); ++ wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE, false); ++ wl_cfg80211_add_to_eventbuffer(&buf, WLC_E_ACTION_FRAME_COMPLETE, false); ++ if ((ret = wl_cfg80211_apply_eventbuffer(wl_to_prmry_ndev(wl), wl, &buf)) < 0) ++ AP6210_ERR("TX frame events revert back failed \n"); ++ ++#undef MAX_WAIT_TIME ++ return ret; ++} ++ ++/* Generate our P2P Device Address and P2P Interface Address from our primary ++ * MAC address. ++ */ ++void ++wl_cfgp2p_generate_bss_mac(struct ether_addr *primary_addr, ++ struct ether_addr *out_dev_addr, struct ether_addr *out_int_addr) ++{ ++ memset(out_dev_addr, 0, sizeof(*out_dev_addr)); ++ memset(out_int_addr, 0, sizeof(*out_int_addr)); ++ ++ /* Generate the P2P Device Address. This consists of the device's ++ * primary MAC address with the locally administered bit set. ++ */ ++ memcpy(out_dev_addr, primary_addr, sizeof(*out_dev_addr)); ++ out_dev_addr->octet[0] |= 0x02; ++ ++ /* Generate the P2P Interface Address. If the discovery and connection ++ * BSSCFGs need to simultaneously co-exist, then this address must be ++ * different from the P2P Device Address. ++ */ ++ memcpy(out_int_addr, out_dev_addr, sizeof(*out_int_addr)); ++ out_int_addr->octet[4] ^= 0x80; ++ ++} ++ ++/* P2P IF Address change to Virtual Interface MAC Address */ ++void ++wl_cfg80211_change_ifaddr(u8* buf, struct ether_addr *p2p_int_addr, u8 element_id) ++{ ++ wifi_p2p_ie_t *ie = (wifi_p2p_ie_t*) buf; ++ u16 len = ie->len; ++ u8 *subel; ++ u8 subelt_id; ++ u16 subelt_len; ++ AP6210_DEBUG(" Enter\n"); ++ ++ /* Point subel to the P2P IE's subelt field. ++ * Subtract the preceding fields (id, len, OUI, oui_type) from the length. ++ */ ++ subel = ie->subelts; ++ len -= 4; /* exclude OUI + OUI_TYPE */ ++ ++ while (len >= 3) { ++ /* attribute id */ ++ subelt_id = *subel; ++ subel += 1; ++ len -= 1; ++ ++ /* 2-byte little endian */ ++ subelt_len = *subel++; ++ subelt_len |= *subel++ << 8; ++ ++ len -= 2; ++ len -= subelt_len; /* for the remaining subelt fields */ ++ ++ if (subelt_id == element_id) { ++ if (subelt_id == P2P_SEID_INTINTADDR) { ++ memcpy(subel, p2p_int_addr->octet, ETHER_ADDR_LEN); ++ AP6210_DEBUG("Intended P2P Interface Address ATTR FOUND\n"); ++ } else if (subelt_id == P2P_SEID_DEV_ID) { ++ memcpy(subel, p2p_int_addr->octet, ETHER_ADDR_LEN); ++ AP6210_DEBUG("Device ID ATTR FOUND\n"); ++ } else if (subelt_id == P2P_SEID_DEV_INFO) { ++ memcpy(subel, p2p_int_addr->octet, ETHER_ADDR_LEN); ++ AP6210_DEBUG("Device INFO ATTR FOUND\n"); ++ } else if (subelt_id == P2P_SEID_GROUP_ID) { ++ memcpy(subel, p2p_int_addr->octet, ETHER_ADDR_LEN); ++ AP6210_DEBUG("GROUP ID ATTR FOUND\n"); ++ } return; ++ } else { ++ AP6210_DEBUG("OTHER id : %d\n", subelt_id); ++ } ++ subel += subelt_len; ++ } ++} ++/* ++ * Check if a BSS is up. ++ * This is a common implementation called by most OSL implementations of ++ * p2posl_bss_isup(). DO NOT call this function directly from the ++ * common code -- call p2posl_bss_isup() instead to allow the OSL to ++ * override the common implementation if necessary. ++ */ ++bool ++wl_cfgp2p_bss_isup(struct net_device *ndev, int bsscfg_idx) ++{ ++ s32 result, val; ++ bool isup = false; ++ s8 getbuf[64]; ++ ++ /* Check if the BSS is up */ ++ *(int*)getbuf = -1; ++ result = wldev_iovar_getbuf_bsscfg(ndev, "bss", &bsscfg_idx, ++ sizeof(bsscfg_idx), getbuf, sizeof(getbuf), 0, NULL); ++ if (result != 0) { ++ AP6210_ERR("'wl bss -C %d' failed: %d\n", bsscfg_idx, result); ++ AP6210_ERR("NOTE: this ioctl error is normal " ++ "when the BSS has not been created yet.\n"); ++ } else { ++ val = *(int*)getbuf; ++ val = dtoh32(val); ++ AP6210_DEBUG("---wl bss -C %d ==> %d\n", bsscfg_idx, val); ++ isup = (val ? TRUE : FALSE); ++ } ++ return isup; ++} ++ ++ ++/* Bring up or down a BSS */ ++s32 ++wl_cfgp2p_bss(struct wl_priv *wl, struct net_device *ndev, s32 bsscfg_idx, s32 up) ++{ ++ s32 ret = BCME_OK; ++ s32 val = up ? 1 : 0; ++ ++ struct { ++ s32 cfg; ++ s32 val; ++ } bss_setbuf; ++ ++ bss_setbuf.cfg = htod32(bsscfg_idx); ++ bss_setbuf.val = htod32(val); ++ AP6210_DEBUG("---wl bss -C %d %s\n", bsscfg_idx, up ? "up" : "down"); ++ ret = wldev_iovar_setbuf(ndev, "bss", &bss_setbuf, sizeof(bss_setbuf), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ ++ if (ret != 0) { ++ AP6210_ERR("'bss %d' failed with %d\n", up, ret); ++ } ++ ++ return ret; ++} ++ ++/* Check if 'p2p' is supported in the driver */ ++s32 ++wl_cfgp2p_supported(struct wl_priv *wl, struct net_device *ndev) ++{ ++ s32 ret = BCME_OK; ++ s32 p2p_supported = 0; ++ ret = wldev_iovar_getint(ndev, "p2p", ++ &p2p_supported); ++ if (ret < 0) { ++ AP6210_ERR("wl p2p error %d\n", ret); ++ return 0; ++ } ++ if (p2p_supported == 1) { ++ AP6210_DEBUG("p2p is supported\n"); ++ } else { ++ AP6210_DEBUG("p2p is unsupported\n"); ++ p2p_supported = 0; ++ } ++ return p2p_supported; ++} ++ ++/* Cleanup P2P resources */ ++s32 ++wl_cfgp2p_down(struct wl_priv *wl) ++{ ++ s32 i = 0, index = -1; ++ wl_cfgp2p_cancel_listen(wl, ++ wl->p2p_net ? wl->p2p_net : wl_to_prmry_ndev(wl), TRUE); ++ for (i = 0; i < P2PAPI_BSSCFG_MAX; i++) { ++ index = wl_to_p2p_bss_bssidx(wl, i); ++ if (index != WL_INVALID) ++ wl_cfgp2p_clear_management_ie(wl, index); ++ } ++ wl_cfgp2p_deinit_priv(wl); ++ return 0; ++} ++ ++s32 ++wl_cfgp2p_set_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, int len) ++{ ++ s32 ret = -1; ++ int count, start, duration; ++ wl_p2p_sched_t dongle_noa; ++ ++ AP6210_DEBUG(" Enter\n"); ++ ++ memset(&dongle_noa, 0, sizeof(dongle_noa)); ++ ++ if (wl->p2p && wl->p2p->vif_created) { ++ ++ wl->p2p->noa.desc[0].start = 0; ++ ++ sscanf(buf, "%10d %10d %10d", &count, &start, &duration); ++ AP6210_DEBUG("set_p2p_noa count %d start %d duration %d\n", ++ count, start, duration); ++ if (count != -1) ++ wl->p2p->noa.desc[0].count = count; ++ ++ /* supplicant gives interval as start */ ++ if (start != -1) ++ wl->p2p->noa.desc[0].interval = start; ++ ++ if (duration != -1) ++ wl->p2p->noa.desc[0].duration = duration; ++ ++ if (wl->p2p->noa.desc[0].count != 255) { ++ wl->p2p->noa.desc[0].start = 200; ++ dongle_noa.type = WL_P2P_SCHED_TYPE_REQ_ABS; ++ dongle_noa.action = WL_P2P_SCHED_ACTION_GOOFF; ++ dongle_noa.option = WL_P2P_SCHED_OPTION_TSFOFS; ++ } ++ else { ++ /* Continuous NoA interval. */ ++ dongle_noa.action = WL_P2P_SCHED_ACTION_NONE; ++ dongle_noa.type = WL_P2P_SCHED_TYPE_ABS; ++ if ((wl->p2p->noa.desc[0].interval == 102) || ++ (wl->p2p->noa.desc[0].interval == 100)) { ++ wl->p2p->noa.desc[0].start = 100 - ++ wl->p2p->noa.desc[0].duration; ++ dongle_noa.option = WL_P2P_SCHED_OPTION_BCNPCT; ++ } ++ else { ++ dongle_noa.option = WL_P2P_SCHED_OPTION_NORMAL; ++ } ++ } ++ /* Put the noa descriptor in dongle format for dongle */ ++ dongle_noa.desc[0].count = htod32(wl->p2p->noa.desc[0].count); ++ if (dongle_noa.option == WL_P2P_SCHED_OPTION_BCNPCT) { ++ dongle_noa.desc[0].start = htod32(wl->p2p->noa.desc[0].start); ++ dongle_noa.desc[0].duration = htod32(wl->p2p->noa.desc[0].duration); ++ } ++ else { ++ dongle_noa.desc[0].start = htod32(wl->p2p->noa.desc[0].start*1000); ++ dongle_noa.desc[0].duration = htod32(wl->p2p->noa.desc[0].duration*1000); ++ } ++ dongle_noa.desc[0].interval = htod32(wl->p2p->noa.desc[0].interval*1000); ++ ++ ret = wldev_iovar_setbuf(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION), ++ "p2p_noa", &dongle_noa, sizeof(dongle_noa), wl->ioctl_buf, WLC_IOCTL_MAXLEN, ++ &wl->ioctl_buf_sync); ++ ++ if (ret < 0) { ++ AP6210_ERR("fw set p2p_noa failed %d\n", ret); ++ } ++ } ++ else { ++ AP6210_ERR("ERROR: set_noa in non-p2p mode\n"); ++ } ++ return ret; ++} ++s32 ++wl_cfgp2p_get_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, int buf_len) ++{ ++ ++ wifi_p2p_noa_desc_t *noa_desc; ++ int len = 0, i; ++ char _buf[200]; ++ ++ AP6210_DEBUG(" Enter\n"); ++ buf[0] = '\0'; ++ if (wl->p2p && wl->p2p->vif_created) { ++ if (wl->p2p->noa.desc[0].count || wl->p2p->ops.ops) { ++ _buf[0] = 1; /* noa index */ ++ _buf[1] = (wl->p2p->ops.ops ? 0x80: 0) | ++ (wl->p2p->ops.ctw & 0x7f); /* ops + ctw */ ++ len += 2; ++ if (wl->p2p->noa.desc[0].count) { ++ noa_desc = (wifi_p2p_noa_desc_t*)&_buf[len]; ++ noa_desc->cnt_type = wl->p2p->noa.desc[0].count; ++ noa_desc->duration = wl->p2p->noa.desc[0].duration; ++ noa_desc->interval = wl->p2p->noa.desc[0].interval; ++ noa_desc->start = wl->p2p->noa.desc[0].start; ++ len += sizeof(wifi_p2p_noa_desc_t); ++ } ++ if (buf_len <= len * 2) { ++ AP6210_ERR("ERROR: buf_len %d in not enough for" ++ "returning noa in string format\n", buf_len); ++ return -1; ++ } ++ /* We have to convert the buffer data into ASCII strings */ ++ for (i = 0; i < len; i++) { ++ snprintf(buf, 3, "%02x", _buf[i]); ++ buf += 2; ++ } ++ buf[i*2] = '\0'; ++ } ++ } ++ else { ++ AP6210_ERR("ERROR: get_noa in non-p2p mode\n"); ++ return -1; ++ } ++ return len * 2; ++} ++s32 ++wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf, int len) ++{ ++ int ps, ctw; ++ int ret = -1; ++ s32 legacy_ps; ++ ++ AP6210_DEBUG(" Enter\n"); ++ if (wl->p2p && wl->p2p->vif_created) { ++ sscanf(buf, "%10d %10d %10d", &legacy_ps, &ps, &ctw); ++ AP6210_DEBUG(" Enter legacy_ps %d ps %d ctw %d\n", legacy_ps, ps, ctw); ++ if (ctw != -1) { ++ wl->p2p->ops.ctw = ctw; ++ ret = 0; ++ } ++ if (ps != -1) { ++ wl->p2p->ops.ops = ps; ++ ret = wldev_iovar_setbuf(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION), ++ "p2p_ops", &wl->p2p->ops, sizeof(wl->p2p->ops), ++ wl->ioctl_buf, WLC_IOCTL_MAXLEN, &wl->ioctl_buf_sync); ++ if (ret < 0) { ++ AP6210_ERR("fw set p2p_ops failed %d\n", ret); ++ } ++ } ++ ++ if ((legacy_ps != -1) && ((legacy_ps == PM_MAX) || (legacy_ps == PM_OFF))) { ++#if !defined(SUPPORT_PM2_ONLY) ++ if (legacy_ps == PM_MAX) ++ legacy_ps = PM_FAST; ++#endif /* SUPPORT_PM2_ONLY */ ++ ++ ret = wldev_ioctl(wl_to_p2p_bss_ndev(wl, P2PAPI_BSSCFG_CONNECTION), ++ WLC_SET_PM, &legacy_ps, sizeof(legacy_ps), true); ++ if (unlikely(ret)) { ++ AP6210_ERR("error (%d)\n", ret); ++ } else { ++ wl_cfg80211_update_power_mode(ndev); ++ } ++ } ++ else ++ AP6210_ERR("ilegal setting\n"); ++ } ++ else { ++ AP6210_ERR("ERROR: set_p2p_ps in non-p2p mode\n"); ++ ret = -1; ++ } ++ return ret; ++} ++ ++u8 * ++wl_cfgp2p_retreive_p2pattrib(void *buf, u8 element_id) ++{ ++ wifi_p2p_ie_t *ie = NULL; ++ u16 len = 0; ++ u8 *subel; ++ u8 subelt_id; ++ u16 subelt_len; ++ ++ if (!buf) { ++ AP6210_ERR("P2P IE not present"); ++ return 0; ++ } ++ ++ ie = (wifi_p2p_ie_t*) buf; ++ len = ie->len; ++ ++ /* Point subel to the P2P IE's subelt field. ++ * Subtract the preceding fields (id, len, OUI, oui_type) from the length. ++ */ ++ subel = ie->subelts; ++ len -= 4; /* exclude OUI + OUI_TYPE */ ++ ++ while (len >= 3) { ++ /* attribute id */ ++ subelt_id = *subel; ++ subel += 1; ++ len -= 1; ++ ++ /* 2-byte little endian */ ++ subelt_len = *subel++; ++ subelt_len |= *subel++ << 8; ++ ++ len -= 2; ++ len -= subelt_len; /* for the remaining subelt fields */ ++ ++ if (subelt_id == element_id) { ++ /* This will point to start of subelement attrib after ++ * attribute id & len ++ */ ++ return subel; ++ } ++ ++ /* Go to next subelement */ ++ subel += subelt_len; ++ } ++ ++ /* Not Found */ ++ return NULL; ++} ++ ++#define P2P_GROUP_CAPAB_GO_BIT 0x01 ++u8 * ++wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length) ++{ ++ wifi_p2p_ie_t * p2p_ie = NULL; ++ u8 *capability = NULL; ++ bool p2p_go = 0; ++ u8 *ptr = NULL; ++ ++ if (!(p2p_ie = wl_cfgp2p_find_p2pie(((u8 *) bi) + bi->ie_offset, bi->ie_length))) { ++ AP6210_ERR("P2P IE not found"); ++ return NULL; ++ } ++ ++ if (!(capability = wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_P2P_INFO))) { ++ AP6210_ERR("P2P Capability attribute not found"); ++ return NULL; ++ } ++ ++ /* Check Group capability for Group Owner bit */ ++ p2p_go = capability[1] & P2P_GROUP_CAPAB_GO_BIT; ++ if (!p2p_go) { ++ return bi->BSSID.octet; ++ } ++ ++ /* In probe responses, DEVICE INFO attribute will be present */ ++ if (!(ptr = wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_DEV_INFO))) { ++ /* If DEVICE_INFO is not found, this might be a beacon frame. ++ * check for DEVICE_ID in the beacon frame. ++ */ ++ ptr = wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_DEV_ID); ++ } ++ ++ if (!ptr) ++ AP6210_ERR(" Both DEVICE_ID & DEVICE_INFO attribute not present in P2P IE "); ++ ++ return ptr; ++} ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) ++static void ++wl_cfgp2p_ethtool_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) ++{ ++ snprintf(info->driver, sizeof(info->driver), "p2p"); ++ snprintf(info->version, sizeof(info->version), "%lu", (unsigned long)(0)); ++} ++ ++struct ethtool_ops cfgp2p_ethtool_ops = { ++ .get_drvinfo = wl_cfgp2p_ethtool_get_drvinfo ++}; ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ ++ ++s32 ++wl_cfgp2p_register_ndev(struct wl_priv *wl) ++{ ++ int ret = 0; ++ struct net_device* net = NULL; ++ struct wireless_dev *wdev = NULL; ++ uint8 temp_addr[ETHER_ADDR_LEN] = { 0x00, 0x90, 0x4c, 0x33, 0x22, 0x11 }; ++ ++ if (wl->p2p_net) { ++ AP6210_ERR("p2p_net defined already.\n"); ++ return -EINVAL; ++ } ++ ++ /* Allocate etherdev, including space for private structure */ ++ if (!(net = alloc_etherdev(sizeof(struct wl_priv *)))) { ++ AP6210_ERR("%s: OOM - alloc_etherdev\n", __FUNCTION__); ++ return -ENODEV; ++ } ++ ++ wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); ++ if (unlikely(!wdev)) { ++ AP6210_ERR("Could not allocate wireless device\n"); ++ free_netdev(net); ++ return -ENOMEM; ++ } ++ ++ strncpy(net->name, "p2p%d", sizeof(net->name) - 1); ++ net->name[IFNAMSIZ - 1] = '\0'; ++ ++ /* Copy the reference to wl_priv */ ++ memcpy((void *)netdev_priv(net), &wl, sizeof(struct wl_priv *)); ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)) ++ ASSERT(!net->open); ++ net->do_ioctl = wl_cfgp2p_do_ioctl; ++ net->hard_start_xmit = wl_cfgp2p_start_xmit; ++ net->open = wl_cfgp2p_if_open; ++ net->stop = wl_cfgp2p_if_stop; ++#else ++ ASSERT(!net->netdev_ops); ++ net->netdev_ops = &wl_cfgp2p_if_ops; ++#endif ++ ++ /* Register with a dummy MAC addr */ ++ memcpy(net->dev_addr, temp_addr, ETHER_ADDR_LEN); ++ ++ wdev->wiphy = wl->wdev->wiphy; ++ ++ wdev->iftype = wl_mode_to_nl80211_iftype(WL_MODE_BSS); ++ ++ net->ieee80211_ptr = wdev; ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) ++ net->ethtool_ops = &cfgp2p_ethtool_ops; ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) */ ++ ++ SET_NETDEV_DEV(net, wiphy_dev(wdev->wiphy)); ++ ++ /* Associate p2p0 network interface with new wdev */ ++ wdev->netdev = net; ++ ++ ret = register_netdev(net); ++ if (ret) { ++ AP6210_ERR(" register_netdevice failed (%d)\n", ret); ++ free_netdev(net); ++ kfree(wdev); ++ return -ENODEV; ++ } ++ ++ /* store p2p net ptr for further reference. Note that iflist won't have this ++ * entry as there corresponding firmware interface is a "Hidden" interface. ++ */ ++ wl->p2p_wdev = wdev; ++ wl->p2p_net = net; ++ ++ AP6210_DEBUG("%s: P2P Interface Registered\n", net->name); ++ ++ return ret; ++} ++ ++s32 ++wl_cfgp2p_unregister_ndev(struct wl_priv *wl) ++{ ++ ++ if (!wl || !wl->p2p_net) { ++ AP6210_ERR("Invalid Ptr\n"); ++ return -EINVAL; ++ } ++ ++ unregister_netdev(wl->p2p_net); ++ free_netdev(wl->p2p_net); ++ ++ return 0; ++} ++static int wl_cfgp2p_start_xmit(struct sk_buff *skb, struct net_device *ndev) ++{ ++ if (skb) ++ { ++ AP6210_DEBUG("(%s) is not used for data operations.Droping the packet.\n", ++ ndev->name); ++ dev_kfree_skb_any(skb); ++ } ++ ++ return 0; ++} ++ ++static int wl_cfgp2p_do_ioctl(struct net_device *net, struct ifreq *ifr, int cmd) ++{ ++ int ret = 0; ++ struct wl_priv *wl = *(struct wl_priv **)netdev_priv(net); ++ struct net_device *ndev = wl_to_prmry_ndev(wl); ++ ++ /* There is no ifidx corresponding to p2p0 in our firmware. So we should ++ * not Handle any IOCTL cmds on p2p0 other than ANDROID PRIVATE CMDs. ++ * For Android PRIV CMD handling map it to primary I/F ++ */ ++ if (cmd == SIOCDEVPRIVATE+1) { ++ ret = wl_android_priv_cmd(ndev, ifr, cmd); ++ ++ } else { ++ AP6210_ERR("%s: IOCTL req 0x%x on p2p0 I/F. Ignoring. \n", ++ __FUNCTION__, cmd); ++ return -1; ++ } ++ ++ return ret; ++} ++ ++static int wl_cfgp2p_if_open(struct net_device *net) ++{ ++ extern struct wl_priv *wlcfg_drv_priv; ++ struct wireless_dev *wdev = net->ieee80211_ptr; ++ struct wl_priv *wl = NULL; ++ wl = wlcfg_drv_priv; ++ if (!wdev || !wl || !wl->p2p) ++ return -EINVAL; ++ AP6210_DEBUG("Enter\n"); ++ /* If suppose F/W download (ifconfig wlan0 up) hasn't been done by now, ++ * do it here. This will make sure that in concurrent mode, supplicant ++ * is not dependent on a particular order of interface initialization. ++ * i.e you may give wpa_supp -iwlan0 -N -ip2p0 or wpa_supp -ip2p0 -N ++ * -iwlan0. ++ */ ++ wdev->wiphy->interface_modes |= (BIT(NL80211_IFTYPE_P2P_CLIENT) ++ | BIT(NL80211_IFTYPE_P2P_GO)); ++ wl_cfg80211_do_driver_init(net); ++ ++ return 0; ++} ++ ++static int wl_cfgp2p_if_stop(struct net_device *net) ++{ ++ extern struct wl_priv *wlcfg_drv_priv; ++ struct wl_priv *wl = NULL; ++ unsigned long flags; ++ struct wireless_dev *wdev = net->ieee80211_ptr; ++ int clear_flag = 0; ++ if (!wdev) ++ return -EINVAL; ++ ++ AP6210_DEBUG("Enter\n"); ++ wl = wlcfg_drv_priv; ++ if (!wl) ++ return -EINVAL; ++ spin_lock_irqsave(&wl->cfgdrv_lock, flags); ++ if (wl->scan_request && wl->scan_request->dev == net) { ++ cfg80211_scan_done(wl->scan_request, true); ++ wl->scan_request = NULL; ++ clear_flag = 1; ++ } ++ spin_unlock_irqrestore(&wl->cfgdrv_lock, flags); ++ if (clear_flag) ++ wl_clr_drv_status(wl, SCANNING, net); ++ wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) ++ & (~(BIT(NL80211_IFTYPE_P2P_CLIENT)| ++ BIT(NL80211_IFTYPE_P2P_GO))); ++ return 0; ++} ++ ++bool wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops) ++{ ++ return (if_ops == &wl_cfgp2p_if_ops); ++} +diff --git a/drivers/net/wireless/ap6210/wl_cfgp2p.h b/drivers/net/wireless/ap6210/wl_cfgp2p.h +new file mode 100644 +index 0000000..d3552d6 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_cfgp2p.h +@@ -0,0 +1,311 @@ ++/* ++ * Linux cfgp2p driver ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_cfgp2p.h 368091 2012-11-12 04:28:31Z $ ++ */ ++#ifndef _wl_cfgp2p_h_ ++#define _wl_cfgp2p_h_ ++#include ++#include ++ ++struct wl_priv; ++extern u32 wl_dbg_level; ++ ++typedef struct wifi_p2p_ie wifi_wfd_ie_t; ++/* Enumeration of the usages of the BSSCFGs used by the P2P Library. Do not ++ * confuse this with a bsscfg index. This value is an index into the ++ * saved_ie[] array of structures which in turn contains a bsscfg index field. ++ */ ++typedef enum { ++ P2PAPI_BSSCFG_PRIMARY, /* maps to driver's primary bsscfg */ ++ P2PAPI_BSSCFG_DEVICE, /* maps to driver's P2P device discovery bsscfg */ ++ P2PAPI_BSSCFG_CONNECTION, /* maps to driver's P2P connection bsscfg */ ++ P2PAPI_BSSCFG_MAX ++} p2p_bsscfg_type_t; ++ ++/* vendor ies max buffer length for probe response or beacon */ ++#define VNDR_IES_MAX_BUF_LEN 1400 ++/* normal vendor ies buffer length */ ++#define VNDR_IES_BUF_LEN 512 ++ ++/* Structure to hold all saved P2P and WPS IEs for a BSSCFG */ ++struct p2p_saved_ie { ++ u8 p2p_probe_req_ie[VNDR_IES_BUF_LEN]; ++ u8 p2p_probe_res_ie[VNDR_IES_MAX_BUF_LEN]; ++ u8 p2p_assoc_req_ie[VNDR_IES_BUF_LEN]; ++ u8 p2p_assoc_res_ie[VNDR_IES_BUF_LEN]; ++ u8 p2p_beacon_ie[VNDR_IES_MAX_BUF_LEN]; ++ u32 p2p_probe_req_ie_len; ++ u32 p2p_probe_res_ie_len; ++ u32 p2p_assoc_req_ie_len; ++ u32 p2p_assoc_res_ie_len; ++ u32 p2p_beacon_ie_len; ++}; ++ ++struct p2p_bss { ++ u32 bssidx; ++ struct net_device *dev; ++ struct p2p_saved_ie saved_ie; ++ void *private_data; ++}; ++ ++struct p2p_info { ++ bool on; /* p2p on/off switch */ ++ bool scan; ++ bool vif_created; ++ s8 vir_ifname[IFNAMSIZ]; ++ unsigned long status; ++ struct ether_addr dev_addr; ++ struct ether_addr int_addr; ++ struct p2p_bss bss_idx[P2PAPI_BSSCFG_MAX]; ++ struct timer_list listen_timer; ++ wl_p2p_sched_t noa; ++ wl_p2p_ops_t ops; ++ wlc_ssid_t ssid; ++}; ++ ++#define MAX_VNDR_IE_NUMBER 5 ++ ++struct parsed_vndr_ie_info { ++ char *ie_ptr; ++ u32 ie_len; /* total length including id & length field */ ++ vndr_ie_t vndrie; ++}; ++ ++struct parsed_vndr_ies { ++ u32 count; ++ struct parsed_vndr_ie_info ie_info[MAX_VNDR_IE_NUMBER]; ++}; ++ ++/* dongle status */ ++enum wl_cfgp2p_status { ++ WLP2P_STATUS_DISCOVERY_ON = 0, ++ WLP2P_STATUS_SEARCH_ENABLED, ++ WLP2P_STATUS_IF_ADD, ++ WLP2P_STATUS_IF_DEL, ++ WLP2P_STATUS_IF_DELETING, ++ WLP2P_STATUS_IF_CHANGING, ++ WLP2P_STATUS_IF_CHANGED, ++ WLP2P_STATUS_LISTEN_EXPIRED, ++ WLP2P_STATUS_ACTION_TX_COMPLETED, ++ WLP2P_STATUS_ACTION_TX_NOACK, ++ WLP2P_STATUS_SCANNING, ++ WLP2P_STATUS_GO_NEG_PHASE, ++ WLP2P_STATUS_DISC_IN_PROGRESS ++}; ++ ++ ++#define wl_to_p2p_bss_ndev(wl, type) ((wl)->p2p->bss_idx[type].dev) ++#define wl_to_p2p_bss_bssidx(wl, type) ((wl)->p2p->bss_idx[type].bssidx) ++#define wl_to_p2p_bss_saved_ie(wl, type) ((wl)->p2p->bss_idx[type].saved_ie) ++#define wl_to_p2p_bss_private(wl, type) ((wl)->p2p->bss_idx[type].private_data) ++#define wl_to_p2p_bss(wl, type) ((wl)->p2p->bss_idx[type]) ++#define wl_get_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : test_bit(WLP2P_STATUS_ ## stat, \ ++ &(wl)->p2p->status)) ++#define wl_set_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : set_bit(WLP2P_STATUS_ ## stat, \ ++ &(wl)->p2p->status)) ++#define wl_clr_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0 : clear_bit(WLP2P_STATUS_ ## stat, \ ++ &(wl)->p2p->status)) ++#define wl_chg_p2p_status(wl, stat) ((!(wl)->p2p_supported) ? 0:change_bit(WLP2P_STATUS_ ## stat, \ ++ &(wl)->p2p->status)) ++#define p2p_on(wl) ((wl)->p2p->on) ++#define p2p_scan(wl) ((wl)->p2p->scan) ++#define p2p_is_on(wl) ((wl)->p2p && (wl)->p2p->on) ++ ++/* dword align allocation */ ++#define WLC_IOCTL_MAXLEN 8192 ++ ++#define INIT_TIMER(timer, func, duration, extra_delay) \ ++ do { \ ++ init_timer(timer); \ ++ timer->function = func; \ ++ timer->expires = jiffies + msecs_to_jiffies(duration + extra_delay); \ ++ timer->data = (unsigned long) wl; \ ++ add_timer(timer); \ ++ } while (0); ++extern void ++wl_cfgp2p_listen_expired(unsigned long data); ++extern bool ++wl_cfgp2p_is_pub_action(void *frame, u32 frame_len); ++extern bool ++wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len); ++extern bool ++wl_cfgp2p_is_gas_action(void *frame, u32 frame_len); ++extern void ++wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len); ++extern s32 ++wl_cfgp2p_init_priv(struct wl_priv *wl); ++extern void ++wl_cfgp2p_deinit_priv(struct wl_priv *wl); ++extern s32 ++wl_cfgp2p_set_firm_p2p(struct wl_priv *wl); ++extern s32 ++wl_cfgp2p_set_p2p_mode(struct wl_priv *wl, u8 mode, ++ u32 channel, u16 listen_ms, int bssidx); ++extern s32 ++wl_cfgp2p_ifadd(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, ++ chanspec_t chspec); ++extern s32 ++wl_cfgp2p_ifdisable(struct wl_priv *wl, struct ether_addr *mac); ++extern s32 ++wl_cfgp2p_ifdel(struct wl_priv *wl, struct ether_addr *mac); ++extern s32 ++wl_cfgp2p_ifchange(struct wl_priv *wl, struct ether_addr *mac, u8 if_type, chanspec_t chspec); ++ ++extern s32 ++wl_cfgp2p_ifidx(struct wl_priv *wl, struct ether_addr *mac, s32 *index); ++ ++extern s32 ++wl_cfgp2p_init_discovery(struct wl_priv *wl); ++extern s32 ++wl_cfgp2p_enable_discovery(struct wl_priv *wl, struct net_device *dev, const u8 *ie, u32 ie_len); ++extern s32 ++wl_cfgp2p_disable_discovery(struct wl_priv *wl); ++extern s32 ++wl_cfgp2p_escan(struct wl_priv *wl, struct net_device *dev, u16 active, u32 num_chans, ++ u16 *channels, ++ s32 search_state, u16 action, u32 bssidx); ++ ++extern s32 ++wl_cfgp2p_act_frm_search(struct wl_priv *wl, struct net_device *ndev, ++ s32 bssidx, s32 channel); ++ ++extern wpa_ie_fixed_t * ++wl_cfgp2p_find_wpaie(u8 *parse, u32 len); ++ ++extern wpa_ie_fixed_t * ++wl_cfgp2p_find_wpsie(u8 *parse, u32 len); ++ ++extern wifi_p2p_ie_t * ++wl_cfgp2p_find_p2pie(u8 *parse, u32 len); ++ ++extern wifi_wfd_ie_t * ++wl_cfgp2p_find_wfdie(u8 *parse, u32 len); ++extern s32 ++wl_cfgp2p_set_management_ie(struct wl_priv *wl, struct net_device *ndev, s32 bssidx, ++ s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len); ++extern s32 ++wl_cfgp2p_clear_management_ie(struct wl_priv *wl, s32 bssidx); ++ ++extern s32 ++wl_cfgp2p_find_idx(struct wl_priv *wl, struct net_device *ndev); ++extern struct net_device * ++wl_cfgp2p_find_ndev(struct wl_priv *wl, s32 bssidx); ++ ++ ++extern s32 ++wl_cfgp2p_listen_complete(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++extern s32 ++wl_cfgp2p_discover_listen(struct wl_priv *wl, s32 channel, u32 duration_ms); ++ ++extern s32 ++wl_cfgp2p_discover_enable_search(struct wl_priv *wl, u8 enable); ++ ++extern s32 ++wl_cfgp2p_action_tx_complete(struct wl_priv *wl, struct net_device *ndev, ++ const wl_event_msg_t *e, void *data); ++extern s32 ++wl_cfgp2p_tx_action_frame(struct wl_priv *wl, struct net_device *dev, ++ wl_af_params_t *af_params, s32 bssidx); ++ ++extern void ++wl_cfgp2p_generate_bss_mac(struct ether_addr *primary_addr, struct ether_addr *out_dev_addr, ++ struct ether_addr *out_int_addr); ++ ++extern void ++wl_cfg80211_change_ifaddr(u8* buf, struct ether_addr *p2p_int_addr, u8 element_id); ++extern bool ++wl_cfgp2p_bss_isup(struct net_device *ndev, int bsscfg_idx); ++ ++extern s32 ++wl_cfgp2p_bss(struct wl_priv *wl, struct net_device *ndev, s32 bsscfg_idx, s32 up); ++ ++ ++extern s32 ++wl_cfgp2p_supported(struct wl_priv *wl, struct net_device *ndev); ++ ++extern s32 ++wl_cfgp2p_down(struct wl_priv *wl); ++ ++extern s32 ++wl_cfgp2p_set_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, int len); ++ ++extern s32 ++wl_cfgp2p_get_p2p_noa(struct wl_priv *wl, struct net_device *ndev, char* buf, int len); ++ ++extern s32 ++wl_cfgp2p_set_p2p_ps(struct wl_priv *wl, struct net_device *ndev, char* buf, int len); ++ ++extern u8 * ++wl_cfgp2p_retreive_p2pattrib(void *buf, u8 element_id); ++ ++extern u8 * ++wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length); ++ ++extern s32 ++wl_cfgp2p_register_ndev(struct wl_priv *wl); ++ ++extern s32 ++wl_cfgp2p_unregister_ndev(struct wl_priv *wl); ++ ++extern bool ++wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops); ++ ++/* WiFi Direct */ ++#define SOCIAL_CHAN_1 1 ++#define SOCIAL_CHAN_2 6 ++#define SOCIAL_CHAN_3 11 ++#define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \ ++ (channel == SOCIAL_CHAN_2) || \ ++ (channel == SOCIAL_CHAN_3)) ++#define SOCIAL_CHAN_CNT 3 ++#define AF_PEER_SEARCH_CNT 2 ++#define WL_P2P_WILDCARD_SSID "DIRECT-" ++#define WL_P2P_WILDCARD_SSID_LEN 7 ++#define WL_P2P_INTERFACE_PREFIX "p2p" ++#define WL_P2P_TEMP_CHAN 11 ++ ++/* If the provision discovery is for JOIN operations, ++ * then we need not do an internal scan to find GO. ++ */ ++#define IS_PROV_DISC_WITHOUT_GROUP_ID(p2p_ie, len) \ ++ (wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL) ++ ++#define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \ ++ ((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \ ++ (frame->action == P2PSD_ACTION_ID_GAS_CREQ))) ++#define IS_P2P_PUB_ACT_REQ(frame, p2p_ie, len) \ ++ (wl_cfgp2p_is_pub_action(frame, len) && \ ++ ((frame->subtype == P2P_PAF_GON_REQ) || \ ++ (frame->subtype == P2P_PAF_INVITE_REQ) || \ ++ ((frame->subtype == P2P_PAF_PROVDIS_REQ) && \ ++ IS_PROV_DISC_WITHOUT_GROUP_ID(p2p_ie, len)))) ++#define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \ ++ ((subtype == P2P_PAF_GON_CONF) || \ ++ (subtype == P2P_PAF_INVITE_RSP) || \ ++ (subtype == P2P_PAF_PROVDIS_RSP))) ++#define IS_P2P_SOCIAL(ch) ((ch == SOCIAL_CHAN_1) || (ch == SOCIAL_CHAN_2) || (ch == SOCIAL_CHAN_3)) ++#define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && \ ++ (len == WL_P2P_WILDCARD_SSID_LEN)) ++#endif /* _wl_cfgp2p_h_ */ +diff --git a/drivers/net/wireless/ap6210/wl_iw.c b/drivers/net/wireless/ap6210/wl_iw.c +new file mode 100644 +index 0000000..8e067f4 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_iw.c +@@ -0,0 +1,3622 @@ ++/* ++ * Linux Wireless Extensions support ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_iw.c 352251 2012-08-22 06:08:38Z $ ++ */ ++ ++#if defined(USE_IW) ++#define LINUX_PORT ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++ ++typedef const struct si_pub si_t; ++#include ++ ++ ++#include ++ ++#include ++ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++#include ++#endif ++#if defined(SOFTAP) ++struct net_device *ap_net_dev = NULL; ++tsk_ctl_t ap_eth_ctl; /* apsta AP netdev waiter thread */ ++#endif /* SOFTAP */ ++ ++extern bool wl_iw_conn_status_str(uint32 event_type, uint32 status, ++ uint32 reason, char* stringBuf, uint buflen); ++ ++uint iw_msg_level = WL_ERROR_VAL; ++ ++#define MAX_WLIW_IOCTL_LEN 1024 ++ ++/* IOCTL swapping mode for Big Endian host with Little Endian dongle. Default to off */ ++#define htod32(i) i ++#define htod16(i) i ++#define dtoh32(i) i ++#define dtoh16(i) i ++#define htodchanspec(i) i ++#define dtohchanspec(i) i ++ ++extern struct iw_statistics *dhd_get_wireless_stats(struct net_device *dev); ++extern int dhd_wait_pend8021x(struct net_device *dev); ++ ++#if WIRELESS_EXT < 19 ++#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) ++#define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST) ++#endif /* WIRELESS_EXT < 19 */ ++ ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) ++#define DAEMONIZE(a) daemonize(a); \ ++ allow_signal(SIGKILL); \ ++ allow_signal(SIGTERM); ++#else /* Linux 2.4 (w/o preemption patch) */ ++#define RAISE_RX_SOFTIRQ() \ ++ cpu_raise_softirq(smp_processor_id(), NET_RX_SOFTIRQ) ++#define DAEMONIZE(a) daemonize(); \ ++ do { if (a) \ ++ strncpy(current->comm, a, MIN(sizeof(current->comm), (strlen(a) + 1))); \ ++ } while (0); ++#endif /* LINUX_VERSION_CODE */ ++ ++#define ISCAN_STATE_IDLE 0 ++#define ISCAN_STATE_SCANING 1 ++ ++/* the buf lengh can be WLC_IOCTL_MAXLEN (8K) to reduce iteration */ ++#define WLC_IW_ISCAN_MAXLEN 2048 ++typedef struct iscan_buf { ++ struct iscan_buf * next; ++ char iscan_buf[WLC_IW_ISCAN_MAXLEN]; ++} iscan_buf_t; ++ ++typedef struct iscan_info { ++ struct net_device *dev; ++ struct timer_list timer; ++ uint32 timer_ms; ++ uint32 timer_on; ++ int iscan_state; ++ iscan_buf_t * list_hdr; ++ iscan_buf_t * list_cur; ++ ++ /* Thread to work on iscan */ ++ long sysioc_pid; ++ struct semaphore sysioc_sem; ++ struct completion sysioc_exited; ++ ++ ++ char ioctlbuf[WLC_IOCTL_SMLEN]; ++} iscan_info_t; ++iscan_info_t *g_iscan = NULL; ++static void wl_iw_timerfunc(ulong data); ++static void wl_iw_set_event_mask(struct net_device *dev); ++static int wl_iw_iscan(iscan_info_t *iscan, wlc_ssid_t *ssid, uint16 action); ++ ++/* priv_link becomes netdev->priv and is the link between netdev and wlif struct */ ++typedef struct priv_link { ++ wl_iw_t *wliw; ++} priv_link_t; ++ ++/* dev to priv_link */ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) ++#define WL_DEV_LINK(dev) (priv_link_t*)(dev->priv) ++#else ++#define WL_DEV_LINK(dev) (priv_link_t*)netdev_priv(dev) ++#endif ++ ++/* dev to wl_iw_t */ ++#define IW_DEV_IF(dev) ((wl_iw_t*)(WL_DEV_LINK(dev))->wliw) ++ ++static void swap_key_from_BE( ++ wl_wsec_key_t *key ++) ++{ ++ key->index = htod32(key->index); ++ key->len = htod32(key->len); ++ key->algo = htod32(key->algo); ++ key->flags = htod32(key->flags); ++ key->rxiv.hi = htod32(key->rxiv.hi); ++ key->rxiv.lo = htod16(key->rxiv.lo); ++ key->iv_initialized = htod32(key->iv_initialized); ++} ++ ++static void swap_key_to_BE( ++ wl_wsec_key_t *key ++) ++{ ++ key->index = dtoh32(key->index); ++ key->len = dtoh32(key->len); ++ key->algo = dtoh32(key->algo); ++ key->flags = dtoh32(key->flags); ++ key->rxiv.hi = dtoh32(key->rxiv.hi); ++ key->rxiv.lo = dtoh16(key->rxiv.lo); ++ key->iv_initialized = dtoh32(key->iv_initialized); ++} ++ ++static int ++dev_wlc_ioctl( ++ struct net_device *dev, ++ int cmd, ++ void *arg, ++ int len ++) ++{ ++ struct ifreq ifr; ++ wl_ioctl_t ioc; ++ mm_segment_t fs; ++ int ret; ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ioc.cmd = cmd; ++ ioc.buf = arg; ++ ioc.len = len; ++ ++ strcpy(ifr.ifr_name, dev->name); ++ ifr.ifr_data = (caddr_t) &ioc; ++ ++#ifndef LINUX_HYBRID ++ /* Causes an extraneous 'up'. If specific ioctls are failing due ++ to device down, then we can investigate those ioctls. ++ */ ++ dev_open(dev); ++#endif ++ ++ fs = get_fs(); ++ set_fs(get_ds()); ++#if defined(WL_USE_NETDEV_OPS) ++ ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); ++#else ++ ret = dev->do_ioctl(dev, &ifr, SIOCDEVPRIVATE); ++#endif ++ set_fs(fs); ++ ++ return ret; ++} ++ ++/* ++set named driver variable to int value and return error indication ++calling example: dev_wlc_intvar_set(dev, "arate", rate) ++*/ ++ ++static int ++dev_wlc_intvar_set( ++ struct net_device *dev, ++ char *name, ++ int val) ++{ ++ char buf[WLC_IOCTL_SMLEN]; ++ uint len; ++ ++ val = htod32(val); ++ len = bcm_mkiovar(name, (char *)(&val), sizeof(val), buf, sizeof(buf)); ++ ASSERT(len); ++ ++ return (dev_wlc_ioctl(dev, WLC_SET_VAR, buf, len)); ++} ++ ++static int ++dev_iw_iovar_setbuf( ++ struct net_device *dev, ++ char *iovar, ++ void *param, ++ int paramlen, ++ void *bufptr, ++ int buflen) ++{ ++ int iolen; ++ ++ iolen = bcm_mkiovar(iovar, param, paramlen, bufptr, buflen); ++ ASSERT(iolen); ++ BCM_REFERENCE(iolen); ++ ++ return (dev_wlc_ioctl(dev, WLC_SET_VAR, bufptr, iolen)); ++} ++ ++static int ++dev_iw_iovar_getbuf( ++ struct net_device *dev, ++ char *iovar, ++ void *param, ++ int paramlen, ++ void *bufptr, ++ int buflen) ++{ ++ int iolen; ++ ++ iolen = bcm_mkiovar(iovar, param, paramlen, bufptr, buflen); ++ ASSERT(iolen); ++ BCM_REFERENCE(iolen); ++ ++ return (dev_wlc_ioctl(dev, WLC_GET_VAR, bufptr, buflen)); ++} ++ ++#if WIRELESS_EXT > 17 ++static int ++dev_wlc_bufvar_set( ++ struct net_device *dev, ++ char *name, ++ char *buf, int len) ++{ ++ char *ioctlbuf; ++ uint buflen; ++ int error; ++ ++ ioctlbuf = kmalloc(MAX_WLIW_IOCTL_LEN, GFP_KERNEL); ++ if (!ioctlbuf) ++ return -ENOMEM; ++ ++ buflen = bcm_mkiovar(name, buf, len, ioctlbuf, MAX_WLIW_IOCTL_LEN); ++ ASSERT(buflen); ++ error = dev_wlc_ioctl(dev, WLC_SET_VAR, ioctlbuf, buflen); ++ ++ kfree(ioctlbuf); ++ return error; ++} ++#endif /* WIRELESS_EXT > 17 */ ++ ++/* ++get named driver variable to int value and return error indication ++calling example: dev_wlc_bufvar_get(dev, "arate", &rate) ++*/ ++ ++static int ++dev_wlc_bufvar_get( ++ struct net_device *dev, ++ char *name, ++ char *buf, int buflen) ++{ ++ char *ioctlbuf; ++ int error; ++ ++ uint len; ++ ++ ioctlbuf = kmalloc(MAX_WLIW_IOCTL_LEN, GFP_KERNEL); ++ if (!ioctlbuf) ++ return -ENOMEM; ++ len = bcm_mkiovar(name, NULL, 0, ioctlbuf, MAX_WLIW_IOCTL_LEN); ++ ASSERT(len); ++ BCM_REFERENCE(len); ++ error = dev_wlc_ioctl(dev, WLC_GET_VAR, (void *)ioctlbuf, MAX_WLIW_IOCTL_LEN); ++ if (!error) ++ bcopy(ioctlbuf, buf, buflen); ++ ++ kfree(ioctlbuf); ++ return (error); ++} ++ ++/* ++get named driver variable to int value and return error indication ++calling example: dev_wlc_intvar_get(dev, "arate", &rate) ++*/ ++ ++static int ++dev_wlc_intvar_get( ++ struct net_device *dev, ++ char *name, ++ int *retval) ++{ ++ union { ++ char buf[WLC_IOCTL_SMLEN]; ++ int val; ++ } var; ++ int error; ++ ++ uint len; ++ uint data_null; ++ ++ len = bcm_mkiovar(name, (char *)(&data_null), 0, (char *)(&var), sizeof(var.buf)); ++ ASSERT(len); ++ error = dev_wlc_ioctl(dev, WLC_GET_VAR, (void *)&var, len); ++ ++ *retval = dtoh32(var.val); ++ ++ return (error); ++} ++ ++/* Maintain backward compatibility */ ++#if WIRELESS_EXT < 13 ++struct iw_request_info ++{ ++ __u16 cmd; /* Wireless Extension command */ ++ __u16 flags; /* More to come ;-) */ ++}; ++ ++typedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info, ++ void *wrqu, char *extra); ++#endif /* WIRELESS_EXT < 13 */ ++ ++#if WIRELESS_EXT > 12 ++static int ++wl_iw_set_leddc( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra ++) ++{ ++ int dc = *(int *)extra; ++ int error; ++ ++ error = dev_wlc_intvar_set(dev, "leddc", dc); ++ return error; ++} ++ ++static int ++wl_iw_set_vlanmode( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra ++) ++{ ++ int mode = *(int *)extra; ++ int error; ++ ++ mode = htod32(mode); ++ error = dev_wlc_intvar_set(dev, "vlan_mode", mode); ++ return error; ++} ++ ++static int ++wl_iw_set_pm( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra ++) ++{ ++ int pm = *(int *)extra; ++ int error; ++ ++ pm = htod32(pm); ++ error = dev_wlc_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm)); ++ return error; ++} ++#endif /* WIRELESS_EXT > 12 */ ++ ++int ++wl_iw_send_priv_event( ++ struct net_device *dev, ++ char *flag ++) ++{ ++ union iwreq_data wrqu; ++ char extra[IW_CUSTOM_MAX + 1]; ++ int cmd; ++ ++ cmd = IWEVCUSTOM; ++ memset(&wrqu, 0, sizeof(wrqu)); ++ if (strlen(flag) > sizeof(extra)) ++ return -1; ++ ++ strcpy(extra, flag); ++ wrqu.data.length = strlen(extra); ++ wireless_send_event(dev, cmd, &wrqu, extra); ++ AP6210_DEBUG("Send IWEVCUSTOM Event as %s\n", extra); ++ ++ return 0; ++} ++ ++static int ++wl_iw_config_commit( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ void *zwrq, ++ char *extra ++) ++{ ++ wlc_ssid_t ssid; ++ int error; ++ struct sockaddr bssid; ++ ++ AP6210_DEBUG("%s: SIOCSIWCOMMIT\n", dev->name); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_SSID, &ssid, sizeof(ssid)))) ++ return error; ++ ++ ssid.SSID_len = dtoh32(ssid.SSID_len); ++ ++ if (!ssid.SSID_len) ++ return 0; ++ ++ bzero(&bssid, sizeof(struct sockaddr)); ++ if ((error = dev_wlc_ioctl(dev, WLC_REASSOC, &bssid, ETHER_ADDR_LEN))) { ++ AP6210_ERR("%s: WLC_REASSOC failed (%d)\n", __FUNCTION__, error); ++ return error; ++ } ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_name( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *cwrq, ++ char *extra ++) ++{ ++ int phytype, err; ++ uint band[3]; ++ char cap[5]; ++ ++ AP6210_DEBUG("%s: SIOCGIWNAME\n", dev->name); ++ ++ cap[0] = 0; ++ if ((err = dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &phytype, sizeof(phytype))) < 0) ++ goto done; ++ if ((err = dev_wlc_ioctl(dev, WLC_GET_BANDLIST, band, sizeof(band))) < 0) ++ goto done; ++ ++ band[0] = dtoh32(band[0]); ++ switch (phytype) { ++ case WLC_PHY_TYPE_A: ++ strcpy(cap, "a"); ++ break; ++ case WLC_PHY_TYPE_B: ++ strcpy(cap, "b"); ++ break; ++ case WLC_PHY_TYPE_LP: ++ case WLC_PHY_TYPE_G: ++ if (band[0] >= 2) ++ strcpy(cap, "abg"); ++ else ++ strcpy(cap, "bg"); ++ break; ++ case WLC_PHY_TYPE_N: ++ if (band[0] >= 2) ++ strcpy(cap, "abgn"); ++ else ++ strcpy(cap, "bgn"); ++ break; ++ } ++done: ++ snprintf(cwrq->name, IFNAMSIZ, "IEEE 802.11%s", cap); ++ return 0; ++} ++ ++static int ++wl_iw_set_freq( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_freq *fwrq, ++ char *extra ++) ++{ ++ int error, chan; ++ uint sf = 0; ++ ++ AP6210_DEBUG("%s: SIOCSIWFREQ\n", dev->name); ++ ++ /* Setting by channel number */ ++ if (fwrq->e == 0 && fwrq->m < MAXCHANNEL) { ++ chan = fwrq->m; ++ } ++ ++ /* Setting by frequency */ ++ else { ++ /* Convert to MHz as best we can */ ++ if (fwrq->e >= 6) { ++ fwrq->e -= 6; ++ while (fwrq->e--) ++ fwrq->m *= 10; ++ } else if (fwrq->e < 6) { ++ while (fwrq->e++ < 6) ++ fwrq->m /= 10; ++ } ++ /* handle 4.9GHz frequencies as Japan 4 GHz based channelization */ ++ if (fwrq->m > 4000 && fwrq->m < 5000) ++ sf = WF_CHAN_FACTOR_4_G; /* start factor for 4 GHz */ ++ ++ chan = wf_mhz2channel(fwrq->m, sf); ++ } ++ chan = htod32(chan); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_CHANNEL, &chan, sizeof(chan)))) ++ return error; ++ ++ /* -EINPROGRESS: Call commit handler */ ++ return -EINPROGRESS; ++} ++ ++static int ++wl_iw_get_freq( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_freq *fwrq, ++ char *extra ++) ++{ ++ channel_info_t ci; ++ int error; ++ ++ AP6210_DEBUG("%s: SIOCGIWFREQ\n", dev->name); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci)))) ++ return error; ++ ++ /* Return radio channel in channel form */ ++ fwrq->m = dtoh32(ci.hw_channel); ++ fwrq->e = dtoh32(0); ++ return 0; ++} ++ ++static int ++wl_iw_set_mode( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ __u32 *uwrq, ++ char *extra ++) ++{ ++ int infra = 0, ap = 0, error = 0; ++ ++ AP6210_DEBUG("%s: SIOCSIWMODE\n", dev->name); ++ ++ switch (*uwrq) { ++ case IW_MODE_MASTER: ++ infra = ap = 1; ++ break; ++ case IW_MODE_ADHOC: ++ case IW_MODE_AUTO: ++ break; ++ case IW_MODE_INFRA: ++ infra = 1; ++ break; ++ default: ++ return -EINVAL; ++ } ++ infra = htod32(infra); ++ ap = htod32(ap); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_INFRA, &infra, sizeof(infra))) || ++ (error = dev_wlc_ioctl(dev, WLC_SET_AP, &ap, sizeof(ap)))) ++ return error; ++ ++ /* -EINPROGRESS: Call commit handler */ ++ return -EINPROGRESS; ++} ++ ++static int ++wl_iw_get_mode( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ __u32 *uwrq, ++ char *extra ++) ++{ ++ int error, infra = 0, ap = 0; ++ ++ AP6210_DEBUG("%s: SIOCGIWMODE\n", dev->name); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_INFRA, &infra, sizeof(infra))) || ++ (error = dev_wlc_ioctl(dev, WLC_GET_AP, &ap, sizeof(ap)))) ++ return error; ++ ++ infra = dtoh32(infra); ++ ap = dtoh32(ap); ++ *uwrq = infra ? ap ? IW_MODE_MASTER : IW_MODE_INFRA : IW_MODE_ADHOC; ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_range( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ struct iw_range *range = (struct iw_range *) extra; ++ static int channels[MAXCHANNEL+1]; ++ wl_uint32_list_t *list = (wl_uint32_list_t *) channels; ++ wl_rateset_t rateset; ++ int error, i, k; ++ uint sf, ch; ++ ++ int phytype; ++ int bw_cap = 0, sgi_tx = 0, nmode = 0; ++ channel_info_t ci; ++ uint8 nrate_list2copy = 0; ++ uint16 nrate_list[4][8] = { {13, 26, 39, 52, 78, 104, 117, 130}, ++ {14, 29, 43, 58, 87, 116, 130, 144}, ++ {27, 54, 81, 108, 162, 216, 243, 270}, ++ {30, 60, 90, 120, 180, 240, 270, 300}}; ++ ++ AP6210_DEBUG("%s: SIOCGIWRANGE\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ dwrq->length = sizeof(struct iw_range); ++ memset(range, 0, sizeof(*range)); ++ ++ /* We don't use nwids */ ++ range->min_nwid = range->max_nwid = 0; ++ ++ /* Set available channels/frequencies */ ++ list->count = htod32(MAXCHANNEL); ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_VALID_CHANNELS, channels, sizeof(channels)))) ++ return error; ++ for (i = 0; i < dtoh32(list->count) && i < IW_MAX_FREQUENCIES; i++) { ++ range->freq[i].i = dtoh32(list->element[i]); ++ ++ ch = dtoh32(list->element[i]); ++ if (ch <= CH_MAX_2G_CHANNEL) ++ sf = WF_CHAN_FACTOR_2_4_G; ++ else ++ sf = WF_CHAN_FACTOR_5_G; ++ ++ range->freq[i].m = wf_channel2mhz(ch, sf); ++ range->freq[i].e = 6; ++ } ++ range->num_frequency = range->num_channels = i; ++ ++ /* Link quality (use NDIS cutoffs) */ ++ range->max_qual.qual = 5; ++ /* Signal level (use RSSI) */ ++ range->max_qual.level = 0x100 - 200; /* -200 dBm */ ++ /* Noise level (use noise) */ ++ range->max_qual.noise = 0x100 - 200; /* -200 dBm */ ++ /* Signal level threshold range (?) */ ++ range->sensitivity = 65535; ++ ++#if WIRELESS_EXT > 11 ++ /* Link quality (use NDIS cutoffs) */ ++ range->avg_qual.qual = 3; ++ /* Signal level (use RSSI) */ ++ range->avg_qual.level = 0x100 + WL_IW_RSSI_GOOD; ++ /* Noise level (use noise) */ ++ range->avg_qual.noise = 0x100 - 75; /* -75 dBm */ ++#endif /* WIRELESS_EXT > 11 */ ++ ++ /* Set available bitrates */ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_CURR_RATESET, &rateset, sizeof(rateset)))) ++ return error; ++ rateset.count = dtoh32(rateset.count); ++ range->num_bitrates = rateset.count; ++ for (i = 0; i < rateset.count && i < IW_MAX_BITRATES; i++) ++ range->bitrate[i] = (rateset.rates[i] & 0x7f) * 500000; /* convert to bps */ ++ dev_wlc_intvar_get(dev, "nmode", &nmode); ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &phytype, sizeof(phytype)))) ++ return error; ++ ++ if (nmode == 1 && ((phytype == WLC_PHY_TYPE_SSN) || (phytype == WLC_PHY_TYPE_LCN) || ++ (phytype == WLC_PHY_TYPE_LCN40))) { ++ dev_wlc_intvar_get(dev, "mimo_bw_cap", &bw_cap); ++ dev_wlc_intvar_get(dev, "sgi_tx", &sgi_tx); ++ dev_wlc_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(channel_info_t)); ++ ci.hw_channel = dtoh32(ci.hw_channel); ++ ++ if (bw_cap == 0 || ++ (bw_cap == 2 && ci.hw_channel <= 14)) { ++ if (sgi_tx == 0) ++ nrate_list2copy = 0; ++ else ++ nrate_list2copy = 1; ++ } ++ if (bw_cap == 1 || ++ (bw_cap == 2 && ci.hw_channel >= 36)) { ++ if (sgi_tx == 0) ++ nrate_list2copy = 2; ++ else ++ nrate_list2copy = 3; ++ } ++ range->num_bitrates += 8; ++ for (k = 0; i < range->num_bitrates; k++, i++) { ++ /* convert to bps */ ++ range->bitrate[i] = (nrate_list[nrate_list2copy][k]) * 500000; ++ } ++ } ++ ++ /* Set an indication of the max TCP throughput ++ * in bit/s that we can expect using this interface. ++ * May be use for QoS stuff... Jean II ++ */ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_PHYTYPE, &i, sizeof(i)))) ++ return error; ++ i = dtoh32(i); ++ if (i == WLC_PHY_TYPE_A) ++ range->throughput = 24000000; /* 24 Mbits/s */ ++ else ++ range->throughput = 1500000; /* 1.5 Mbits/s */ ++ ++ /* RTS and fragmentation thresholds */ ++ range->min_rts = 0; ++ range->max_rts = 2347; ++ range->min_frag = 256; ++ range->max_frag = 2346; ++ ++ range->max_encoding_tokens = DOT11_MAX_DEFAULT_KEYS; ++ range->num_encoding_sizes = 4; ++ range->encoding_size[0] = WEP1_KEY_SIZE; ++ range->encoding_size[1] = WEP128_KEY_SIZE; ++#if WIRELESS_EXT > 17 ++ range->encoding_size[2] = TKIP_KEY_SIZE; ++#else ++ range->encoding_size[2] = 0; ++#endif ++ range->encoding_size[3] = AES_KEY_SIZE; ++ ++ /* Do not support power micro-management */ ++ range->min_pmp = 0; ++ range->max_pmp = 0; ++ range->min_pmt = 0; ++ range->max_pmt = 0; ++ range->pmp_flags = 0; ++ range->pm_capa = 0; ++ ++ /* Transmit Power - values are in mW */ ++ range->num_txpower = 2; ++ range->txpower[0] = 1; ++ range->txpower[1] = 255; ++ range->txpower_capa = IW_TXPOW_MWATT; ++ ++#if WIRELESS_EXT > 10 ++ range->we_version_compiled = WIRELESS_EXT; ++ range->we_version_source = 19; ++ ++ /* Only support retry limits */ ++ range->retry_capa = IW_RETRY_LIMIT; ++ range->retry_flags = IW_RETRY_LIMIT; ++ range->r_time_flags = 0; ++ /* SRL and LRL limits */ ++ range->min_retry = 1; ++ range->max_retry = 255; ++ /* Retry lifetime limits unsupported */ ++ range->min_r_time = 0; ++ range->max_r_time = 0; ++#endif /* WIRELESS_EXT > 10 */ ++ ++#if WIRELESS_EXT > 17 ++ range->enc_capa = IW_ENC_CAPA_WPA; ++ range->enc_capa |= IW_ENC_CAPA_CIPHER_TKIP; ++ range->enc_capa |= IW_ENC_CAPA_CIPHER_CCMP; ++ range->enc_capa |= IW_ENC_CAPA_WPA2; ++#if (defined(BCMSUP_PSK) && defined(WLFBT)) ++ /* Tell the host (e.g. wpa_supplicant) to let us do the handshake */ ++ range->enc_capa |= IW_ENC_CAPA_4WAY_HANDSHAKE; ++#endif /* (defined (BCMSUP_PSK) && defined(WLFBT)) */ ++ ++ /* Event capability (kernel) */ ++ IW_EVENT_CAPA_SET_KERNEL(range->event_capa); ++ /* Event capability (driver) */ ++ IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); ++ IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); ++ IW_EVENT_CAPA_SET(range->event_capa, IWEVTXDROP); ++ IW_EVENT_CAPA_SET(range->event_capa, IWEVMICHAELMICFAILURE); ++ IW_EVENT_CAPA_SET(range->event_capa, IWEVASSOCREQIE); ++ IW_EVENT_CAPA_SET(range->event_capa, IWEVASSOCRESPIE); ++ IW_EVENT_CAPA_SET(range->event_capa, IWEVPMKIDCAND); ++ ++#if WIRELESS_EXT >= 22 && defined(IW_SCAN_CAPA_ESSID) ++ /* FC7 wireless.h defines EXT 22 but doesn't define scan_capa bits */ ++ range->scan_capa = IW_SCAN_CAPA_ESSID; ++#endif ++#endif /* WIRELESS_EXT > 17 */ ++ ++ return 0; ++} ++ ++static int ++rssi_to_qual(int rssi) ++{ ++ if (rssi <= WL_IW_RSSI_NO_SIGNAL) ++ return 0; ++ else if (rssi <= WL_IW_RSSI_VERY_LOW) ++ return 1; ++ else if (rssi <= WL_IW_RSSI_LOW) ++ return 2; ++ else if (rssi <= WL_IW_RSSI_GOOD) ++ return 3; ++ else if (rssi <= WL_IW_RSSI_VERY_GOOD) ++ return 4; ++ else ++ return 5; ++} ++ ++static int ++wl_iw_set_spy( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_iw_t *iw = IW_DEV_IF(dev); ++ struct sockaddr *addr = (struct sockaddr *) extra; ++ int i; ++ ++ AP6210_DEBUG("%s: SIOCSIWSPY\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ iw->spy_num = MIN(ARRAYSIZE(iw->spy_addr), dwrq->length); ++ for (i = 0; i < iw->spy_num; i++) ++ memcpy(&iw->spy_addr[i], addr[i].sa_data, ETHER_ADDR_LEN); ++ memset(iw->spy_qual, 0, sizeof(iw->spy_qual)); ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_spy( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_iw_t *iw = IW_DEV_IF(dev); ++ struct sockaddr *addr = (struct sockaddr *) extra; ++ struct iw_quality *qual = (struct iw_quality *) &addr[iw->spy_num]; ++ int i; ++ ++ AP6210_DEBUG("%s: SIOCGIWSPY\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ dwrq->length = iw->spy_num; ++ for (i = 0; i < iw->spy_num; i++) { ++ memcpy(addr[i].sa_data, &iw->spy_addr[i], ETHER_ADDR_LEN); ++ addr[i].sa_family = AF_UNIX; ++ memcpy(&qual[i], &iw->spy_qual[i], sizeof(struct iw_quality)); ++ iw->spy_qual[i].updated = 0; ++ } ++ ++ return 0; ++} ++ ++static int ++wl_iw_set_wap( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct sockaddr *awrq, ++ char *extra ++) ++{ ++ int error = -EINVAL; ++ ++ AP6210_DEBUG("%s: SIOCSIWAP\n", dev->name); ++ ++ if (awrq->sa_family != ARPHRD_ETHER) { ++ AP6210_ERR("%s: Invalid Header...sa_family\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* Ignore "auto" or "off" */ ++ if (ETHER_ISBCAST(awrq->sa_data) || ETHER_ISNULLADDR(awrq->sa_data)) { ++ scb_val_t scbval; ++ bzero(&scbval, sizeof(scb_val_t)); ++ if ((error = dev_wlc_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t)))) { ++ AP6210_ERR("%s: WLC_DISASSOC failed (%d).\n", __FUNCTION__, error); ++ } ++ return 0; ++ } ++ /* WL_ASSOC(("Assoc to %s\n", bcm_ether_ntoa((struct ether_addr *)&(awrq->sa_data), ++ * eabuf))); ++ */ ++ /* Reassociate to the specified AP */ ++ if ((error = dev_wlc_ioctl(dev, WLC_REASSOC, awrq->sa_data, ETHER_ADDR_LEN))) { ++ AP6210_ERR("%s: WLC_REASSOC failed (%d).\n", __FUNCTION__, error); ++ return error; ++ } ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_wap( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct sockaddr *awrq, ++ char *extra ++) ++{ ++ AP6210_DEBUG("%s: SIOCGIWAP\n", dev->name); ++ ++ awrq->sa_family = ARPHRD_ETHER; ++ memset(awrq->sa_data, 0, ETHER_ADDR_LEN); ++ ++ /* Ignore error (may be down or disassociated) */ ++ (void) dev_wlc_ioctl(dev, WLC_GET_BSSID, awrq->sa_data, ETHER_ADDR_LEN); ++ ++ return 0; ++} ++ ++#if WIRELESS_EXT > 17 ++static int ++wl_iw_mlme( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct sockaddr *awrq, ++ char *extra ++) ++{ ++ struct iw_mlme *mlme; ++ scb_val_t scbval; ++ int error = -EINVAL; ++ ++ AP6210_DEBUG("%s: SIOCSIWMLME\n", dev->name); ++ ++ mlme = (struct iw_mlme *)extra; ++ if (mlme == NULL) { ++ AP6210_ERR("Invalid ioctl data.\n"); ++ return error; ++ } ++ ++ scbval.val = mlme->reason_code; ++ bcopy(&mlme->addr.sa_data, &scbval.ea, ETHER_ADDR_LEN); ++ ++ if (mlme->cmd == IW_MLME_DISASSOC) { ++ scbval.val = htod32(scbval.val); ++ error = dev_wlc_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t)); ++ } ++ else if (mlme->cmd == IW_MLME_DEAUTH) { ++ scbval.val = htod32(scbval.val); ++ error = dev_wlc_ioctl(dev, WLC_SCB_DEAUTHENTICATE_FOR_REASON, &scbval, ++ sizeof(scb_val_t)); ++ } ++ else { ++ AP6210_ERR("%s: Invalid ioctl data.\n", __FUNCTION__); ++ return error; ++ } ++ ++ return error; ++} ++#endif /* WIRELESS_EXT > 17 */ ++ ++static int ++wl_iw_get_aplist( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_scan_results_t *list; ++ struct sockaddr *addr = (struct sockaddr *) extra; ++ struct iw_quality qual[IW_MAX_AP]; ++ wl_bss_info_t *bi = NULL; ++ int error, i; ++ uint buflen = dwrq->length; ++ ++ AP6210_DEBUG("%s: SIOCGIWAPLIST\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ /* Get scan results (too large to put on the stack) */ ++ list = kmalloc(buflen, GFP_KERNEL); ++ if (!list) ++ return -ENOMEM; ++ memset(list, 0, buflen); ++ list->buflen = htod32(buflen); ++ if ((error = dev_wlc_ioctl(dev, WLC_SCAN_RESULTS, list, buflen))) { ++ AP6210_ERR("%d: Scan results error %d\n", __LINE__, error); ++ kfree(list); ++ return error; ++ } ++ list->buflen = dtoh32(list->buflen); ++ list->version = dtoh32(list->version); ++ list->count = dtoh32(list->count); ++ ASSERT(list->version == WL_BSS_INFO_VERSION); ++ ++ for (i = 0, dwrq->length = 0; i < list->count && dwrq->length < IW_MAX_AP; i++) { ++ bi = bi ? (wl_bss_info_t *)((uintptr)bi + dtoh32(bi->length)) : list->bss_info; ++ ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + ++ buflen)); ++ ++ /* Infrastructure only */ ++ if (!(dtoh16(bi->capability) & DOT11_CAP_ESS)) ++ continue; ++ ++ /* BSSID */ ++ memcpy(addr[dwrq->length].sa_data, &bi->BSSID, ETHER_ADDR_LEN); ++ addr[dwrq->length].sa_family = ARPHRD_ETHER; ++ qual[dwrq->length].qual = rssi_to_qual(dtoh16(bi->RSSI)); ++ qual[dwrq->length].level = 0x100 + dtoh16(bi->RSSI); ++ qual[dwrq->length].noise = 0x100 + bi->phy_noise; ++ ++ /* Updated qual, level, and noise */ ++#if WIRELESS_EXT > 18 ++ qual[dwrq->length].updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; ++#else ++ qual[dwrq->length].updated = 7; ++#endif /* WIRELESS_EXT > 18 */ ++ ++ dwrq->length++; ++ } ++ ++ kfree(list); ++ ++ if (dwrq->length) { ++ memcpy(&addr[dwrq->length], qual, sizeof(struct iw_quality) * dwrq->length); ++ /* Provided qual */ ++ dwrq->flags = 1; ++ } ++ ++ return 0; ++} ++ ++static int ++wl_iw_iscan_get_aplist( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_scan_results_t *list; ++ iscan_buf_t * buf; ++ iscan_info_t *iscan = g_iscan; ++ ++ struct sockaddr *addr = (struct sockaddr *) extra; ++ struct iw_quality qual[IW_MAX_AP]; ++ wl_bss_info_t *bi = NULL; ++ int i; ++ ++ AP6210_DEBUG("%s: SIOCGIWAPLIST\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ if ((!iscan) || (iscan->sysioc_pid < 0)) { ++ return wl_iw_get_aplist(dev, info, dwrq, extra); ++ } ++ ++ buf = iscan->list_hdr; ++ /* Get scan results (too large to put on the stack) */ ++ while (buf) { ++ list = &((wl_iscan_results_t*)buf->iscan_buf)->results; ++ ASSERT(list->version == WL_BSS_INFO_VERSION); ++ ++ bi = NULL; ++ for (i = 0, dwrq->length = 0; i < list->count && dwrq->length < IW_MAX_AP; i++) { ++ bi = bi ? (wl_bss_info_t *)((uintptr)bi + dtoh32(bi->length)) : list->bss_info; ++ ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + ++ WLC_IW_ISCAN_MAXLEN)); ++ ++ /* Infrastructure only */ ++ if (!(dtoh16(bi->capability) & DOT11_CAP_ESS)) ++ continue; ++ ++ /* BSSID */ ++ memcpy(addr[dwrq->length].sa_data, &bi->BSSID, ETHER_ADDR_LEN); ++ addr[dwrq->length].sa_family = ARPHRD_ETHER; ++ qual[dwrq->length].qual = rssi_to_qual(dtoh16(bi->RSSI)); ++ qual[dwrq->length].level = 0x100 + dtoh16(bi->RSSI); ++ qual[dwrq->length].noise = 0x100 + bi->phy_noise; ++ ++ /* Updated qual, level, and noise */ ++#if WIRELESS_EXT > 18 ++ qual[dwrq->length].updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; ++#else ++ qual[dwrq->length].updated = 7; ++#endif /* WIRELESS_EXT > 18 */ ++ ++ dwrq->length++; ++ } ++ buf = buf->next; ++ } ++ if (dwrq->length) { ++ memcpy(&addr[dwrq->length], qual, sizeof(struct iw_quality) * dwrq->length); ++ /* Provided qual */ ++ dwrq->flags = 1; ++ } ++ ++ return 0; ++} ++ ++#if WIRELESS_EXT > 13 ++static int ++wl_iw_set_scan( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra ++) ++{ ++ wlc_ssid_t ssid; ++ ++ AP6210_DEBUG("%s: SIOCSIWSCAN\n", dev->name); ++ ++ /* default Broadcast scan */ ++ memset(&ssid, 0, sizeof(ssid)); ++ ++#if WIRELESS_EXT > 17 ++ /* check for given essid */ ++ if (wrqu->data.length == sizeof(struct iw_scan_req)) { ++ if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { ++ struct iw_scan_req *req = (struct iw_scan_req *)extra; ++ ssid.SSID_len = MIN(sizeof(ssid.SSID), req->essid_len); ++ memcpy(ssid.SSID, req->essid, ssid.SSID_len); ++ ssid.SSID_len = htod32(ssid.SSID_len); ++ } ++ } ++#endif ++ /* Ignore error (most likely scan in progress) */ ++ (void) dev_wlc_ioctl(dev, WLC_SCAN, &ssid, sizeof(ssid)); ++ ++ return 0; ++} ++ ++static int ++wl_iw_iscan_set_scan( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra ++) ++{ ++ wlc_ssid_t ssid; ++ iscan_info_t *iscan = g_iscan; ++ ++ AP6210_DEBUG("%s: SIOCSIWSCAN\n", dev->name); ++ ++ /* use backup if our thread is not successful */ ++ if ((!iscan) || (iscan->sysioc_pid < 0)) { ++ return wl_iw_set_scan(dev, info, wrqu, extra); ++ } ++ if (iscan->iscan_state == ISCAN_STATE_SCANING) { ++ return 0; ++ } ++ ++ /* default Broadcast scan */ ++ memset(&ssid, 0, sizeof(ssid)); ++ ++#if WIRELESS_EXT > 17 ++ /* check for given essid */ ++ if (wrqu->data.length == sizeof(struct iw_scan_req)) { ++ if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { ++ struct iw_scan_req *req = (struct iw_scan_req *)extra; ++ ssid.SSID_len = MIN(sizeof(ssid.SSID), req->essid_len); ++ memcpy(ssid.SSID, req->essid, ssid.SSID_len); ++ ssid.SSID_len = htod32(ssid.SSID_len); ++ } ++ } ++#endif ++ ++ iscan->list_cur = iscan->list_hdr; ++ iscan->iscan_state = ISCAN_STATE_SCANING; ++ ++ ++ wl_iw_set_event_mask(dev); ++ wl_iw_iscan(iscan, &ssid, WL_SCAN_ACTION_START); ++ ++ iscan->timer.expires = jiffies + msecs_to_jiffies(iscan->timer_ms); ++ add_timer(&iscan->timer); ++ iscan->timer_on = 1; ++ ++ return 0; ++} ++ ++#if WIRELESS_EXT > 17 ++static bool ++ie_is_wpa_ie(uint8 **wpaie, uint8 **tlvs, int *tlvs_len) ++{ ++/* Is this body of this tlvs entry a WPA entry? If */ ++/* not update the tlvs buffer pointer/length */ ++ uint8 *ie = *wpaie; ++ ++ /* If the contents match the WPA_OUI and type=1 */ ++ if ((ie[1] >= 6) && ++ !bcmp((const void *)&ie[2], (const void *)(WPA_OUI "\x01"), 4)) { ++ return TRUE; ++ } ++ ++ /* point to the next ie */ ++ ie += ie[1] + 2; ++ /* calculate the length of the rest of the buffer */ ++ *tlvs_len -= (int)(ie - *tlvs); ++ /* update the pointer to the start of the buffer */ ++ *tlvs = ie; ++ return FALSE; ++} ++ ++static bool ++ie_is_wps_ie(uint8 **wpsie, uint8 **tlvs, int *tlvs_len) ++{ ++/* Is this body of this tlvs entry a WPS entry? If */ ++/* not update the tlvs buffer pointer/length */ ++ uint8 *ie = *wpsie; ++ ++ /* If the contents match the WPA_OUI and type=4 */ ++ if ((ie[1] >= 4) && ++ !bcmp((const void *)&ie[2], (const void *)(WPA_OUI "\x04"), 4)) { ++ return TRUE; ++ } ++ ++ /* point to the next ie */ ++ ie += ie[1] + 2; ++ /* calculate the length of the rest of the buffer */ ++ *tlvs_len -= (int)(ie - *tlvs); ++ /* update the pointer to the start of the buffer */ ++ *tlvs = ie; ++ return FALSE; ++} ++#endif /* WIRELESS_EXT > 17 */ ++ ++ ++static int ++wl_iw_handle_scanresults_ies(char **event_p, char *end, ++ struct iw_request_info *info, wl_bss_info_t *bi) ++{ ++#if WIRELESS_EXT > 17 ++ struct iw_event iwe; ++ char *event; ++ ++ event = *event_p; ++ if (bi->ie_length) { ++ /* look for wpa/rsn ies in the ie list... */ ++ bcm_tlv_t *ie; ++ uint8 *ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t); ++ int ptr_len = bi->ie_length; ++ ++ if ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_RSN_ID))) { ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = ie->len + 2; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)ie); ++ } ++ ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t); ++ ++#if defined(WLFBT) ++ if ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_MDIE_ID))) { ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = ie->len + 2; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)ie); ++ } ++ ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t); ++#endif /* WLFBT */ ++ ++ while ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_WPA_ID))) { ++ /* look for WPS IE */ ++ if (ie_is_wps_ie(((uint8 **)&ie), &ptr, &ptr_len)) { ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = ie->len + 2; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)ie); ++ break; ++ } ++ } ++ ++ ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t); ++ ptr_len = bi->ie_length; ++ while ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_WPA_ID))) { ++ if (ie_is_wpa_ie(((uint8 **)&ie), &ptr, &ptr_len)) { ++ iwe.cmd = IWEVGENIE; ++ iwe.u.data.length = ie->len + 2; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)ie); ++ break; ++ } ++ } ++ ++ *event_p = event; ++ } ++ ++#endif /* WIRELESS_EXT > 17 */ ++ return 0; ++} ++static int ++wl_iw_get_scan( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ channel_info_t ci; ++ wl_scan_results_t *list; ++ struct iw_event iwe; ++ wl_bss_info_t *bi = NULL; ++ int error, i, j; ++ char *event = extra, *end = extra + dwrq->length, *value; ++ uint buflen = dwrq->length; ++ ++ AP6210_DEBUG("%s: SIOCGIWSCAN\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ /* Check for scan in progress */ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci)))) ++ return error; ++ ci.scan_channel = dtoh32(ci.scan_channel); ++ if (ci.scan_channel) ++ return -EAGAIN; ++ ++ /* Get scan results (too large to put on the stack) */ ++ list = kmalloc(buflen, GFP_KERNEL); ++ if (!list) ++ return -ENOMEM; ++ memset(list, 0, buflen); ++ list->buflen = htod32(buflen); ++ if ((error = dev_wlc_ioctl(dev, WLC_SCAN_RESULTS, list, buflen))) { ++ kfree(list); ++ return error; ++ } ++ list->buflen = dtoh32(list->buflen); ++ list->version = dtoh32(list->version); ++ list->count = dtoh32(list->count); ++ ++ ASSERT(list->version == WL_BSS_INFO_VERSION); ++ ++ for (i = 0; i < list->count && i < IW_MAX_AP; i++) { ++ bi = bi ? (wl_bss_info_t *)((uintptr)bi + dtoh32(bi->length)) : list->bss_info; ++ ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + ++ buflen)); ++ ++ /* First entry must be the BSSID */ ++ iwe.cmd = SIOCGIWAP; ++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; ++ memcpy(iwe.u.ap_addr.sa_data, &bi->BSSID, ETHER_ADDR_LEN); ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_ADDR_LEN); ++ ++ /* SSID */ ++ iwe.u.data.length = dtoh32(bi->SSID_len); ++ iwe.cmd = SIOCGIWESSID; ++ iwe.u.data.flags = 1; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, bi->SSID); ++ ++ /* Mode */ ++ if (dtoh16(bi->capability) & (DOT11_CAP_ESS | DOT11_CAP_IBSS)) { ++ iwe.cmd = SIOCGIWMODE; ++ if (dtoh16(bi->capability) & DOT11_CAP_ESS) ++ iwe.u.mode = IW_MODE_INFRA; ++ else ++ iwe.u.mode = IW_MODE_ADHOC; ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_UINT_LEN); ++ } ++ ++ /* Channel */ ++ iwe.cmd = SIOCGIWFREQ; ++ iwe.u.freq.m = wf_channel2mhz(CHSPEC_CHANNEL(bi->chanspec), ++ CHSPEC_CHANNEL(bi->chanspec) <= CH_MAX_2G_CHANNEL ? ++ WF_CHAN_FACTOR_2_4_G : WF_CHAN_FACTOR_5_G); ++ iwe.u.freq.e = 6; ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_FREQ_LEN); ++ ++ /* Channel quality */ ++ iwe.cmd = IWEVQUAL; ++ iwe.u.qual.qual = rssi_to_qual(dtoh16(bi->RSSI)); ++ iwe.u.qual.level = 0x100 + dtoh16(bi->RSSI); ++ iwe.u.qual.noise = 0x100 + bi->phy_noise; ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_QUAL_LEN); ++ ++ /* WPA, WPA2, WPS, WAPI IEs */ ++ wl_iw_handle_scanresults_ies(&event, end, info, bi); ++ ++ /* Encryption */ ++ iwe.cmd = SIOCGIWENCODE; ++ if (dtoh16(bi->capability) & DOT11_CAP_PRIVACY) ++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; ++ else ++ iwe.u.data.flags = IW_ENCODE_DISABLED; ++ iwe.u.data.length = 0; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)event); ++ ++ /* Rates */ ++ if (bi->rateset.count) { ++ value = event + IW_EV_LCP_LEN; ++ iwe.cmd = SIOCGIWRATE; ++ /* Those two flags are ignored... */ ++ iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; ++ for (j = 0; j < bi->rateset.count && j < IW_MAX_BITRATES; j++) { ++ iwe.u.bitrate.value = (bi->rateset.rates[j] & 0x7f) * 500000; ++ value = IWE_STREAM_ADD_VALUE(info, event, value, end, &iwe, ++ IW_EV_PARAM_LEN); ++ } ++ event = value; ++ } ++ } ++ ++ kfree(list); ++ ++ dwrq->length = event - extra; ++ dwrq->flags = 0; /* todo */ ++ ++ return 0; ++} ++ ++static int ++wl_iw_iscan_get_scan( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_scan_results_t *list; ++ struct iw_event iwe; ++ wl_bss_info_t *bi = NULL; ++ int ii, j; ++ int apcnt; ++ char *event = extra, *end = extra + dwrq->length, *value; ++ iscan_info_t *iscan = g_iscan; ++ iscan_buf_t * p_buf; ++ ++ AP6210_DEBUG("%s: SIOCGIWSCAN\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ /* use backup if our thread is not successful */ ++ if ((!iscan) || (iscan->sysioc_pid < 0)) { ++ return wl_iw_get_scan(dev, info, dwrq, extra); ++ } ++ ++ /* Check for scan in progress */ ++ if (iscan->iscan_state == ISCAN_STATE_SCANING) ++ return -EAGAIN; ++ ++ apcnt = 0; ++ p_buf = iscan->list_hdr; ++ /* Get scan results */ ++ while (p_buf != iscan->list_cur) { ++ list = &((wl_iscan_results_t*)p_buf->iscan_buf)->results; ++ ++ if (list->version != WL_BSS_INFO_VERSION) { ++ AP6210_ERR("list->version %d != WL_BSS_INFO_VERSION\n", list->version); ++ } ++ ++ bi = NULL; ++ for (ii = 0; ii < list->count && apcnt < IW_MAX_AP; apcnt++, ii++) { ++ bi = bi ? (wl_bss_info_t *)((uintptr)bi + dtoh32(bi->length)) : list->bss_info; ++ ASSERT(((uintptr)bi + dtoh32(bi->length)) <= ((uintptr)list + ++ WLC_IW_ISCAN_MAXLEN)); ++ ++ /* overflow check cover fields before wpa IEs */ ++ if (event + ETHER_ADDR_LEN + bi->SSID_len + IW_EV_UINT_LEN + IW_EV_FREQ_LEN + ++ IW_EV_QUAL_LEN >= end) ++ return -E2BIG; ++ /* First entry must be the BSSID */ ++ iwe.cmd = SIOCGIWAP; ++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; ++ memcpy(iwe.u.ap_addr.sa_data, &bi->BSSID, ETHER_ADDR_LEN); ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_ADDR_LEN); ++ ++ /* SSID */ ++ iwe.u.data.length = dtoh32(bi->SSID_len); ++ iwe.cmd = SIOCGIWESSID; ++ iwe.u.data.flags = 1; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, bi->SSID); ++ ++ /* Mode */ ++ if (dtoh16(bi->capability) & (DOT11_CAP_ESS | DOT11_CAP_IBSS)) { ++ iwe.cmd = SIOCGIWMODE; ++ if (dtoh16(bi->capability) & DOT11_CAP_ESS) ++ iwe.u.mode = IW_MODE_INFRA; ++ else ++ iwe.u.mode = IW_MODE_ADHOC; ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_UINT_LEN); ++ } ++ ++ /* Channel */ ++ iwe.cmd = SIOCGIWFREQ; ++ iwe.u.freq.m = wf_channel2mhz(CHSPEC_CHANNEL(bi->chanspec), ++ CHSPEC_CHANNEL(bi->chanspec) <= CH_MAX_2G_CHANNEL ? ++ WF_CHAN_FACTOR_2_4_G : WF_CHAN_FACTOR_5_G); ++ iwe.u.freq.e = 6; ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_FREQ_LEN); ++ ++ /* Channel quality */ ++ iwe.cmd = IWEVQUAL; ++ iwe.u.qual.qual = rssi_to_qual(dtoh16(bi->RSSI)); ++ iwe.u.qual.level = 0x100 + dtoh16(bi->RSSI); ++ iwe.u.qual.noise = 0x100 + bi->phy_noise; ++ event = IWE_STREAM_ADD_EVENT(info, event, end, &iwe, IW_EV_QUAL_LEN); ++ ++ /* WPA, WPA2, WPS, WAPI IEs */ ++ wl_iw_handle_scanresults_ies(&event, end, info, bi); ++ ++ /* Encryption */ ++ iwe.cmd = SIOCGIWENCODE; ++ if (dtoh16(bi->capability) & DOT11_CAP_PRIVACY) ++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; ++ else ++ iwe.u.data.flags = IW_ENCODE_DISABLED; ++ iwe.u.data.length = 0; ++ event = IWE_STREAM_ADD_POINT(info, event, end, &iwe, (char *)event); ++ ++ /* Rates */ ++ if (bi->rateset.count <= sizeof(bi->rateset.rates)) { ++ if (event + IW_MAX_BITRATES*IW_EV_PARAM_LEN >= end) ++ return -E2BIG; ++ ++ value = event + IW_EV_LCP_LEN; ++ iwe.cmd = SIOCGIWRATE; ++ /* Those two flags are ignored... */ ++ iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; ++ for (j = 0; j < bi->rateset.count && j < IW_MAX_BITRATES; j++) { ++ iwe.u.bitrate.value = (bi->rateset.rates[j] & 0x7f) * 500000; ++ value = IWE_STREAM_ADD_VALUE(info, event, value, end, &iwe, ++ IW_EV_PARAM_LEN); ++ } ++ event = value; ++ } ++ } ++ p_buf = p_buf->next; ++ } /* while (p_buf) */ ++ ++ dwrq->length = event - extra; ++ dwrq->flags = 0; /* todo */ ++ ++ return 0; ++} ++ ++#endif /* WIRELESS_EXT > 13 */ ++ ++ ++static int ++wl_iw_set_essid( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wlc_ssid_t ssid; ++ int error; ++ ++ AP6210_DEBUG("%s: SIOCSIWESSID\n", dev->name); ++ ++ /* default Broadcast SSID */ ++ memset(&ssid, 0, sizeof(ssid)); ++ if (dwrq->length && extra) { ++#if WIRELESS_EXT > 20 ++ ssid.SSID_len = MIN(sizeof(ssid.SSID), dwrq->length); ++#else ++ ssid.SSID_len = MIN(sizeof(ssid.SSID), dwrq->length-1); ++#endif ++ memcpy(ssid.SSID, extra, ssid.SSID_len); ++ ssid.SSID_len = htod32(ssid.SSID_len); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_SSID, &ssid, sizeof(ssid)))) ++ return error; ++ } ++ /* If essid null then it is "iwconfig essid off" command */ ++ else { ++ scb_val_t scbval; ++ bzero(&scbval, sizeof(scb_val_t)); ++ if ((error = dev_wlc_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t)))) ++ return error; ++ } ++ return 0; ++} ++ ++static int ++wl_iw_get_essid( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wlc_ssid_t ssid; ++ int error; ++ ++ AP6210_DEBUG("%s: SIOCGIWESSID\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_SSID, &ssid, sizeof(ssid)))) { ++ AP6210_ERR("Error getting the SSID\n"); ++ return error; ++ } ++ ++ ssid.SSID_len = dtoh32(ssid.SSID_len); ++ ++ /* Get the current SSID */ ++ memcpy(extra, ssid.SSID, ssid.SSID_len); ++ ++ dwrq->length = ssid.SSID_len; ++ ++ dwrq->flags = 1; /* active */ ++ ++ return 0; ++} ++ ++static int ++wl_iw_set_nick( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_iw_t *iw = IW_DEV_IF(dev); ++ AP6210_DEBUG("%s: SIOCSIWNICKN\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ /* Check the size of the string */ ++ if (dwrq->length > sizeof(iw->nickname)) ++ return -E2BIG; ++ ++ memcpy(iw->nickname, extra, dwrq->length); ++ iw->nickname[dwrq->length - 1] = '\0'; ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_nick( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_iw_t *iw = IW_DEV_IF(dev); ++ AP6210_DEBUG("%s: SIOCGIWNICKN\n", dev->name); ++ ++ if (!extra) ++ return -EINVAL; ++ ++ strcpy(extra, iw->nickname); ++ dwrq->length = strlen(extra) + 1; ++ ++ return 0; ++} ++ ++static int wl_iw_set_rate( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ wl_rateset_t rateset; ++ int error, rate, i, error_bg, error_a; ++ ++ AP6210_DEBUG("%s: SIOCSIWRATE\n", dev->name); ++ ++ /* Get current rateset */ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_CURR_RATESET, &rateset, sizeof(rateset)))) ++ return error; ++ ++ rateset.count = dtoh32(rateset.count); ++ ++ if (vwrq->value < 0) { ++ /* Select maximum rate */ ++ rate = rateset.rates[rateset.count - 1] & 0x7f; ++ } else if (vwrq->value < rateset.count) { ++ /* Select rate by rateset index */ ++ rate = rateset.rates[vwrq->value] & 0x7f; ++ } else { ++ /* Specified rate in bps */ ++ rate = vwrq->value / 500000; ++ } ++ ++ if (vwrq->fixed) { ++ /* ++ Set rate override, ++ Since the is a/b/g-blind, both a/bg_rate are enforced. ++ */ ++ error_bg = dev_wlc_intvar_set(dev, "bg_rate", rate); ++ error_a = dev_wlc_intvar_set(dev, "a_rate", rate); ++ ++ if (error_bg && error_a) ++ return (error_bg | error_a); ++ } else { ++ /* ++ clear rate override ++ Since the is a/b/g-blind, both a/bg_rate are enforced. ++ */ ++ /* 0 is for clearing rate override */ ++ error_bg = dev_wlc_intvar_set(dev, "bg_rate", 0); ++ /* 0 is for clearing rate override */ ++ error_a = dev_wlc_intvar_set(dev, "a_rate", 0); ++ ++ if (error_bg && error_a) ++ return (error_bg | error_a); ++ ++ /* Remove rates above selected rate */ ++ for (i = 0; i < rateset.count; i++) ++ if ((rateset.rates[i] & 0x7f) > rate) ++ break; ++ rateset.count = htod32(i); ++ ++ /* Set current rateset */ ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_RATESET, &rateset, sizeof(rateset)))) ++ return error; ++ } ++ ++ return 0; ++} ++ ++static int wl_iw_get_rate( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, rate; ++ ++ AP6210_DEBUG("%s: SIOCGIWRATE\n", dev->name); ++ ++ /* Report the current tx rate */ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_RATE, &rate, sizeof(rate)))) ++ return error; ++ rate = dtoh32(rate); ++ vwrq->value = rate * 500000; ++ ++ return 0; ++} ++ ++static int ++wl_iw_set_rts( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, rts; ++ ++ AP6210_DEBUG("%s: SIOCSIWRTS\n", dev->name); ++ ++ if (vwrq->disabled) ++ rts = DOT11_DEFAULT_RTS_LEN; ++ else if (vwrq->value < 0 || vwrq->value > DOT11_DEFAULT_RTS_LEN) ++ return -EINVAL; ++ else ++ rts = vwrq->value; ++ ++ if ((error = dev_wlc_intvar_set(dev, "rtsthresh", rts))) ++ return error; ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_rts( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, rts; ++ ++ AP6210_DEBUG("%s: SIOCGIWRTS\n", dev->name); ++ ++ if ((error = dev_wlc_intvar_get(dev, "rtsthresh", &rts))) ++ return error; ++ ++ vwrq->value = rts; ++ vwrq->disabled = (rts >= DOT11_DEFAULT_RTS_LEN); ++ vwrq->fixed = 1; ++ ++ return 0; ++} ++ ++static int ++wl_iw_set_frag( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, frag; ++ ++ AP6210_DEBUG("%s: SIOCSIWFRAG\n", dev->name); ++ ++ if (vwrq->disabled) ++ frag = DOT11_DEFAULT_FRAG_LEN; ++ else if (vwrq->value < 0 || vwrq->value > DOT11_DEFAULT_FRAG_LEN) ++ return -EINVAL; ++ else ++ frag = vwrq->value; ++ ++ if ((error = dev_wlc_intvar_set(dev, "fragthresh", frag))) ++ return error; ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_frag( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, fragthreshold; ++ ++ AP6210_DEBUG("%s: SIOCGIWFRAG\n", dev->name); ++ ++ if ((error = dev_wlc_intvar_get(dev, "fragthresh", &fragthreshold))) ++ return error; ++ ++ vwrq->value = fragthreshold; ++ vwrq->disabled = (fragthreshold >= DOT11_DEFAULT_FRAG_LEN); ++ vwrq->fixed = 1; ++ ++ return 0; ++} ++ ++static int ++wl_iw_set_txpow( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, disable; ++ uint16 txpwrmw; ++ AP6210_DEBUG("%s: SIOCSIWTXPOW\n", dev->name); ++ ++ /* Make sure radio is off or on as far as software is concerned */ ++ disable = vwrq->disabled ? WL_RADIO_SW_DISABLE : 0; ++ disable += WL_RADIO_SW_DISABLE << 16; ++ ++ disable = htod32(disable); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_RADIO, &disable, sizeof(disable)))) ++ return error; ++ ++ /* If Radio is off, nothing more to do */ ++ if (disable & WL_RADIO_SW_DISABLE) ++ return 0; ++ ++ /* Only handle mW */ ++ if (!(vwrq->flags & IW_TXPOW_MWATT)) ++ return -EINVAL; ++ ++ /* Value < 0 means just "on" or "off" */ ++ if (vwrq->value < 0) ++ return 0; ++ ++ if (vwrq->value > 0xffff) txpwrmw = 0xffff; ++ else txpwrmw = (uint16)vwrq->value; ++ ++ ++ error = dev_wlc_intvar_set(dev, "qtxpower", (int)(bcm_mw_to_qdbm(txpwrmw))); ++ return error; ++} ++ ++static int ++wl_iw_get_txpow( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, disable, txpwrdbm; ++ uint8 result; ++ ++ AP6210_DEBUG("%s: SIOCGIWTXPOW\n", dev->name); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_RADIO, &disable, sizeof(disable))) || ++ (error = dev_wlc_intvar_get(dev, "qtxpower", &txpwrdbm))) ++ return error; ++ ++ disable = dtoh32(disable); ++ result = (uint8)(txpwrdbm & ~WL_TXPWR_OVERRIDE); ++ vwrq->value = (int32)bcm_qdbm_to_mw(result); ++ vwrq->fixed = 0; ++ vwrq->disabled = (disable & (WL_RADIO_SW_DISABLE | WL_RADIO_HW_DISABLE)) ? 1 : 0; ++ vwrq->flags = IW_TXPOW_MWATT; ++ ++ return 0; ++} ++ ++#if WIRELESS_EXT > 10 ++static int ++wl_iw_set_retry( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, lrl, srl; ++ ++ AP6210_DEBUG("%s: SIOCSIWRETRY\n", dev->name); ++ ++ /* Do not handle "off" or "lifetime" */ ++ if (vwrq->disabled || (vwrq->flags & IW_RETRY_LIFETIME)) ++ return -EINVAL; ++ ++ /* Handle "[min|max] limit" */ ++ if (vwrq->flags & IW_RETRY_LIMIT) { ++ /* "max limit" or just "limit" */ ++#if WIRELESS_EXT > 20 ++ if ((vwrq->flags & IW_RETRY_LONG) ||(vwrq->flags & IW_RETRY_MAX) || ++ !((vwrq->flags & IW_RETRY_SHORT) || (vwrq->flags & IW_RETRY_MIN))) { ++#else ++ if ((vwrq->flags & IW_RETRY_MAX) || !(vwrq->flags & IW_RETRY_MIN)) { ++#endif /* WIRELESS_EXT > 20 */ ++ ++ lrl = htod32(vwrq->value); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_LRL, &lrl, sizeof(lrl)))) ++ return error; ++ } ++ /* "min limit" or just "limit" */ ++#if WIRELESS_EXT > 20 ++ if ((vwrq->flags & IW_RETRY_SHORT) ||(vwrq->flags & IW_RETRY_MIN) || ++ !((vwrq->flags & IW_RETRY_LONG) || (vwrq->flags & IW_RETRY_MAX))) { ++#else ++ if ((vwrq->flags & IW_RETRY_MIN) || !(vwrq->flags & IW_RETRY_MAX)) { ++#endif /* WIRELESS_EXT > 20 */ ++ ++ srl = htod32(vwrq->value); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_SRL, &srl, sizeof(srl)))) ++ return error; ++ } ++ } ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_retry( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, lrl, srl; ++ ++ AP6210_DEBUG("%s: SIOCGIWRETRY\n", dev->name); ++ ++ vwrq->disabled = 0; /* Can't be disabled */ ++ ++ /* Do not handle lifetime queries */ ++ if ((vwrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) ++ return -EINVAL; ++ ++ /* Get retry limits */ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_LRL, &lrl, sizeof(lrl))) || ++ (error = dev_wlc_ioctl(dev, WLC_GET_SRL, &srl, sizeof(srl)))) ++ return error; ++ ++ lrl = dtoh32(lrl); ++ srl = dtoh32(srl); ++ ++ /* Note : by default, display the min retry number */ ++ if (vwrq->flags & IW_RETRY_MAX) { ++ vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX; ++ vwrq->value = lrl; ++ } else { ++ vwrq->flags = IW_RETRY_LIMIT; ++ vwrq->value = srl; ++ if (srl != lrl) ++ vwrq->flags |= IW_RETRY_MIN; ++ } ++ ++ return 0; ++} ++#endif /* WIRELESS_EXT > 10 */ ++ ++static int ++wl_iw_set_encode( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_wsec_key_t key; ++ int error, val, wsec; ++ ++ AP6210_DEBUG("%s: SIOCSIWENCODE\n", dev->name); ++ ++ memset(&key, 0, sizeof(key)); ++ ++ if ((dwrq->flags & IW_ENCODE_INDEX) == 0) { ++ /* Find the current key */ ++ for (key.index = 0; key.index < DOT11_MAX_DEFAULT_KEYS; key.index++) { ++ val = htod32(key.index); ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_KEY_PRIMARY, &val, sizeof(val)))) ++ return error; ++ val = dtoh32(val); ++ if (val) ++ break; ++ } ++ /* Default to 0 */ ++ if (key.index == DOT11_MAX_DEFAULT_KEYS) ++ key.index = 0; ++ } else { ++ key.index = (dwrq->flags & IW_ENCODE_INDEX) - 1; ++ if (key.index >= DOT11_MAX_DEFAULT_KEYS) ++ return -EINVAL; ++ } ++ ++ /* Interpret "off" to mean no encryption */ ++ wsec = (dwrq->flags & IW_ENCODE_DISABLED) ? 0 : WEP_ENABLED; ++ ++ if ((error = dev_wlc_intvar_set(dev, "wsec", wsec))) ++ return error; ++ ++ /* Old API used to pass a NULL pointer instead of IW_ENCODE_NOKEY */ ++ if (!extra || !dwrq->length || (dwrq->flags & IW_ENCODE_NOKEY)) { ++ /* Just select a new current key */ ++ val = htod32(key.index); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_KEY_PRIMARY, &val, sizeof(val)))) ++ return error; ++ } else { ++ key.len = dwrq->length; ++ ++ if (dwrq->length > sizeof(key.data)) ++ return -EINVAL; ++ ++ memcpy(key.data, extra, dwrq->length); ++ ++ key.flags = WL_PRIMARY_KEY; ++ switch (key.len) { ++ case WEP1_KEY_SIZE: ++ key.algo = CRYPTO_ALGO_WEP1; ++ break; ++ case WEP128_KEY_SIZE: ++ key.algo = CRYPTO_ALGO_WEP128; ++ break; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) ++ case TKIP_KEY_SIZE: ++ key.algo = CRYPTO_ALGO_TKIP; ++ break; ++#endif ++ case AES_KEY_SIZE: ++ key.algo = CRYPTO_ALGO_AES_CCM; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ /* Set the new key/index */ ++ swap_key_from_BE(&key); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_KEY, &key, sizeof(key)))) ++ return error; ++ } ++ ++ /* Interpret "restricted" to mean shared key authentication */ ++ val = (dwrq->flags & IW_ENCODE_RESTRICTED) ? 1 : 0; ++ val = htod32(val); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_AUTH, &val, sizeof(val)))) ++ return error; ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_encode( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_wsec_key_t key; ++ int error, val, wsec, auth; ++ ++ AP6210_DEBUG("%s: SIOCGIWENCODE\n", dev->name); ++ ++ /* assure default values of zero for things we don't touch */ ++ bzero(&key, sizeof(wl_wsec_key_t)); ++ ++ if ((dwrq->flags & IW_ENCODE_INDEX) == 0) { ++ /* Find the current key */ ++ for (key.index = 0; key.index < DOT11_MAX_DEFAULT_KEYS; key.index++) { ++ val = key.index; ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_KEY_PRIMARY, &val, sizeof(val)))) ++ return error; ++ val = dtoh32(val); ++ if (val) ++ break; ++ } ++ } else ++ key.index = (dwrq->flags & IW_ENCODE_INDEX) - 1; ++ ++ if (key.index >= DOT11_MAX_DEFAULT_KEYS) ++ key.index = 0; ++ ++ /* Get info */ ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_WSEC, &wsec, sizeof(wsec))) || ++ (error = dev_wlc_ioctl(dev, WLC_GET_AUTH, &auth, sizeof(auth)))) ++ return error; ++ ++ swap_key_to_BE(&key); ++ ++ wsec = dtoh32(wsec); ++ auth = dtoh32(auth); ++ /* Get key length */ ++ dwrq->length = MIN(IW_ENCODING_TOKEN_MAX, key.len); ++ ++ /* Get flags */ ++ dwrq->flags = key.index + 1; ++ if (!(wsec & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED))) { ++ /* Interpret "off" to mean no encryption */ ++ dwrq->flags |= IW_ENCODE_DISABLED; ++ } ++ if (auth) { ++ /* Interpret "restricted" to mean shared key authentication */ ++ dwrq->flags |= IW_ENCODE_RESTRICTED; ++ } ++ ++ /* Get key */ ++ if (dwrq->length && extra) ++ memcpy(extra, key.data, dwrq->length); ++ ++ return 0; ++} ++ ++static int ++wl_iw_set_power( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, pm; ++ ++ AP6210_DEBUG("%s: SIOCSIWPOWER\n", dev->name); ++ ++ pm = vwrq->disabled ? PM_OFF : PM_MAX; ++ ++ pm = htod32(pm); ++ if ((error = dev_wlc_ioctl(dev, WLC_SET_PM, &pm, sizeof(pm)))) ++ return error; ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_power( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error, pm; ++ ++ AP6210_DEBUG("%s: SIOCGIWPOWER\n", dev->name); ++ ++ if ((error = dev_wlc_ioctl(dev, WLC_GET_PM, &pm, sizeof(pm)))) ++ return error; ++ ++ pm = dtoh32(pm); ++ vwrq->disabled = pm ? 0 : 1; ++ vwrq->flags = IW_POWER_ALL_R; ++ ++ return 0; ++} ++ ++#if WIRELESS_EXT > 17 ++static int ++wl_iw_set_wpaie( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *iwp, ++ char *extra ++) ++{ ++ dev_wlc_bufvar_set(dev, "wpaie", extra, iwp->length); ++ ++ return 0; ++} ++ ++static int ++wl_iw_get_wpaie( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *iwp, ++ char *extra ++) ++{ ++ AP6210_DEBUG("%s: SIOCGIWGENIE\n", dev->name); ++ iwp->length = 64; ++ dev_wlc_bufvar_get(dev, "wpaie", extra, iwp->length); ++ return 0; ++} ++ ++static int ++wl_iw_set_encodeext( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra ++) ++{ ++ wl_wsec_key_t key; ++ int error; ++ struct iw_encode_ext *iwe; ++ ++ AP6210_DEBUG("%s: SIOCSIWENCODEEXT\n", dev->name); ++ ++ memset(&key, 0, sizeof(key)); ++ iwe = (struct iw_encode_ext *)extra; ++ ++ /* disable encryption completely */ ++ if (dwrq->flags & IW_ENCODE_DISABLED) { ++ ++ } ++ ++ /* get the key index */ ++ key.index = 0; ++ if (dwrq->flags & IW_ENCODE_INDEX) ++ key.index = (dwrq->flags & IW_ENCODE_INDEX) - 1; ++ ++ key.len = iwe->key_len; ++ ++ /* Instead of bcast for ea address for default wep keys, driver needs it to be Null */ ++ if (!ETHER_ISMULTI(iwe->addr.sa_data)) ++ bcopy((void *)&iwe->addr.sa_data, (char *)&key.ea, ETHER_ADDR_LEN); ++ ++ /* check for key index change */ ++ if (key.len == 0) { ++ if (iwe->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { ++ AP6210_DEBUG("Changing the the primary Key to %d\n", key.index); ++ /* change the key index .... */ ++ key.index = htod32(key.index); ++ error = dev_wlc_ioctl(dev, WLC_SET_KEY_PRIMARY, ++ &key.index, sizeof(key.index)); ++ if (error) ++ return error; ++ } ++ /* key delete */ ++ else { ++ swap_key_from_BE(&key); ++ error = dev_wlc_ioctl(dev, WLC_SET_KEY, &key, sizeof(key)); ++ if (error) ++ return error; ++ } ++ } ++#if (defined(BCMSUP_PSK) && defined(WLFBT)) ++ /* This case is used to allow an external 802.1x supplicant ++ * to pass the PMK to the in-driver supplicant for use in ++ * the 4-way handshake. ++ */ ++ else if (iwe->alg == IW_ENCODE_ALG_PMK) { ++ int j; ++ wsec_pmk_t pmk; ++ char keystring[WSEC_MAX_PSK_LEN + 1]; ++ char* charptr = keystring; ++ uint len; ++ ++ /* copy the raw hex key to the appropriate format */ ++ for (j = 0; j < (WSEC_MAX_PSK_LEN / 2); j++) { ++ sprintf(charptr, "%02x", iwe->key[j]); ++ charptr += 2; ++ } ++ len = strlen(keystring); ++ pmk.key_len = htod16(len); ++ bcopy(keystring, pmk.key, len); ++ pmk.flags = htod16(WSEC_PASSPHRASE); ++ ++ error = dev_wlc_ioctl(dev, WLC_SET_WSEC_PMK, &pmk, sizeof(pmk)); ++ if (error) ++ return error; ++ } ++#endif /* (defined (BCMSUP_PSK) && defined(WLFBT)) */ ++ ++ else { ++ if (iwe->key_len > sizeof(key.data)) ++ return -EINVAL; ++ ++ AP6210_DEBUG("Setting the key index %d\n", key.index); ++ if (iwe->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { ++ AP6210_DEBUG("key is a Primary Key\n"); ++ key.flags = WL_PRIMARY_KEY; ++ } ++ ++ bcopy((void *)iwe->key, key.data, iwe->key_len); ++ ++ if (iwe->alg == IW_ENCODE_ALG_TKIP) { ++ uint8 keybuf[8]; ++ bcopy(&key.data[24], keybuf, sizeof(keybuf)); ++ bcopy(&key.data[16], &key.data[24], sizeof(keybuf)); ++ bcopy(keybuf, &key.data[16], sizeof(keybuf)); ++ } ++ ++ /* rx iv */ ++ if (iwe->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { ++ uchar *ivptr; ++ ivptr = (uchar *)iwe->rx_seq; ++ key.rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | ++ (ivptr[3] << 8) | ivptr[2]; ++ key.rxiv.lo = (ivptr[1] << 8) | ivptr[0]; ++ key.iv_initialized = TRUE; ++ } ++ ++ switch (iwe->alg) { ++ case IW_ENCODE_ALG_NONE: ++ key.algo = CRYPTO_ALGO_OFF; ++ break; ++ case IW_ENCODE_ALG_WEP: ++ if (iwe->key_len == WEP1_KEY_SIZE) ++ key.algo = CRYPTO_ALGO_WEP1; ++ else ++ key.algo = CRYPTO_ALGO_WEP128; ++ break; ++ case IW_ENCODE_ALG_TKIP: ++ key.algo = CRYPTO_ALGO_TKIP; ++ break; ++ case IW_ENCODE_ALG_CCMP: ++ key.algo = CRYPTO_ALGO_AES_CCM; ++ break; ++ default: ++ break; ++ } ++ swap_key_from_BE(&key); ++ ++ dhd_wait_pend8021x(dev); ++ ++ error = dev_wlc_ioctl(dev, WLC_SET_KEY, &key, sizeof(key)); ++ if (error) ++ return error; ++ } ++ return 0; ++} ++ ++ ++#if WIRELESS_EXT > 17 ++struct { ++ pmkid_list_t pmkids; ++ pmkid_t foo[MAXPMKID-1]; ++} pmkid_list; ++static int ++wl_iw_set_pmksa( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ struct iw_pmksa *iwpmksa; ++ uint i; ++ char eabuf[ETHER_ADDR_STR_LEN]; ++ pmkid_t * pmkid_array = pmkid_list.pmkids.pmkid; ++ ++ AP6210_DEBUG("%s: SIOCSIWPMKSA\n", dev->name); ++ iwpmksa = (struct iw_pmksa *)extra; ++ bzero((char *)eabuf, ETHER_ADDR_STR_LEN); ++ if (iwpmksa->cmd == IW_PMKSA_FLUSH) { ++ AP6210_DEBUG("wl_iw_set_pmksa - IW_PMKSA_FLUSH\n"); ++ bzero((char *)&pmkid_list, sizeof(pmkid_list)); ++ } ++ if (iwpmksa->cmd == IW_PMKSA_REMOVE) { ++ pmkid_list_t pmkid, *pmkidptr; ++ pmkidptr = &pmkid; ++ bcopy(&iwpmksa->bssid.sa_data[0], &pmkidptr->pmkid[0].BSSID, ETHER_ADDR_LEN); ++ bcopy(&iwpmksa->pmkid[0], &pmkidptr->pmkid[0].PMKID, WPA2_PMKID_LEN); ++ { ++ uint j; ++ AP6210_DEBUG("wl_iw_set_pmksa,IW_PMKSA_REMOVE - PMKID: %s = ", ++ bcm_ether_ntoa(&pmkidptr->pmkid[0].BSSID, ++ eabuf)); ++ for (j = 0; j < WPA2_PMKID_LEN; j++) ++ AP6210_DUMP("%02x ", pmkidptr->pmkid[0].PMKID[j]); ++ AP6210_DUMP("\n"); ++ } ++ for (i = 0; i < pmkid_list.pmkids.npmkid; i++) ++ if (!bcmp(&iwpmksa->bssid.sa_data[0], &pmkid_array[i].BSSID, ++ ETHER_ADDR_LEN)) ++ break; ++ for (; i < pmkid_list.pmkids.npmkid; i++) { ++ bcopy(&pmkid_array[i+1].BSSID, ++ &pmkid_array[i].BSSID, ++ ETHER_ADDR_LEN); ++ bcopy(&pmkid_array[i+1].PMKID, ++ &pmkid_array[i].PMKID, ++ WPA2_PMKID_LEN); ++ } ++ pmkid_list.pmkids.npmkid--; ++ } ++ if (iwpmksa->cmd == IW_PMKSA_ADD) { ++ bcopy(&iwpmksa->bssid.sa_data[0], ++ &pmkid_array[pmkid_list.pmkids.npmkid].BSSID, ++ ETHER_ADDR_LEN); ++ bcopy(&iwpmksa->pmkid[0], &pmkid_array[pmkid_list.pmkids.npmkid].PMKID, ++ WPA2_PMKID_LEN); ++ { ++ uint j; ++ uint k; ++ k = pmkid_list.pmkids.npmkid; ++ BCM_REFERENCE(k); ++ AP6210_DEBUG("wl_iw_set_pmksa,IW_PMKSA_ADD - PMKID: %s = ", ++ bcm_ether_ntoa(&pmkid_array[k].BSSID, ++ eabuf)); ++ for (j = 0; j < WPA2_PMKID_LEN; j++) ++ AP6210_DUMP("%02x ", pmkid_array[k].PMKID[j]); ++ AP6210_DUMP("\n"); ++ } ++ pmkid_list.pmkids.npmkid++; ++ } ++ AP6210_DEBUG("PRINTING pmkid LIST - No of elements %d\n", pmkid_list.pmkids.npmkid); ++ for (i = 0; i < pmkid_list.pmkids.npmkid; i++) { ++ uint j; ++ AP6210_DEBUG("PMKID[%d]: %s = ", i, ++ bcm_ether_ntoa(&pmkid_array[i].BSSID, ++ eabuf)); ++ for (j = 0; j < WPA2_PMKID_LEN; j++) ++ AP6210_DUMP("%02x ", pmkid_array[i].PMKID[j]); ++ AP6210_DEBUG("\n"); ++ } ++ AP6210_DEBUG("\n"); ++ dev_wlc_bufvar_set(dev, "pmkid_info", (char *)&pmkid_list, sizeof(pmkid_list)); ++ return 0; ++} ++#endif /* WIRELESS_EXT > 17 */ ++ ++static int ++wl_iw_get_encodeext( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ AP6210_DEBUG("%s: SIOCGIWENCODEEXT\n", dev->name); ++ return 0; ++} ++ ++static int ++wl_iw_set_wpaauth( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error = 0; ++ int paramid; ++ int paramval; ++ uint32 cipher_combined; ++ int val = 0; ++ wl_iw_t *iw = IW_DEV_IF(dev); ++ ++ AP6210_DEBUG("%s: SIOCSIWAUTH\n", dev->name); ++ ++ paramid = vwrq->flags & IW_AUTH_INDEX; ++ paramval = vwrq->value; ++ ++ AP6210_DEBUG("%s: SIOCSIWAUTH, paramid = 0x%0x, paramval = 0x%0x\n", ++ dev->name, paramid, paramval); ++ ++ switch (paramid) { ++ ++ case IW_AUTH_WPA_VERSION: ++ /* supported wpa version disabled or wpa or wpa2 */ ++ if (paramval & IW_AUTH_WPA_VERSION_DISABLED) ++ val = WPA_AUTH_DISABLED; ++ else if (paramval & (IW_AUTH_WPA_VERSION_WPA)) ++ val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED; ++ else if (paramval & IW_AUTH_WPA_VERSION_WPA2) ++ val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED; ++ AP6210_DEBUG("%s: %d: setting wpa_auth to 0x%0x\n", __FUNCTION__, __LINE__, val); ++ if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val))) ++ return error; ++ break; ++ ++ case IW_AUTH_CIPHER_PAIRWISE: ++ case IW_AUTH_CIPHER_GROUP: ++ ++ if (paramid == IW_AUTH_CIPHER_PAIRWISE) { ++ iw->pwsec = paramval; ++ } ++ else { ++ iw->gwsec = paramval; ++ } ++ ++ if ((error = dev_wlc_intvar_get(dev, "wsec", &val))) ++ return error; ++ ++ cipher_combined = iw->gwsec | iw->pwsec; ++ val &= ~(WEP_ENABLED | TKIP_ENABLED | AES_ENABLED); ++ if (cipher_combined & (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104)) ++ val |= WEP_ENABLED; ++ if (cipher_combined & IW_AUTH_CIPHER_TKIP) ++ val |= TKIP_ENABLED; ++ if (cipher_combined & IW_AUTH_CIPHER_CCMP) ++ val |= AES_ENABLED; ++ ++ if (iw->privacy_invoked && !val) { ++ AP6210_DEBUG("%s: %s: 'Privacy invoked' TRUE but clearing wsec, assuming " ++ "we're a WPS enrollee\n", dev->name, __FUNCTION__); ++ if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", TRUE))) { ++ AP6210_DEBUG("Failed to set iovar is_WPS_enrollee\n"); ++ return error; ++ } ++ } else if (val) { ++ if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) { ++ AP6210_DEBUG("Failed to clear iovar is_WPS_enrollee\n"); ++ return error; ++ } ++ } ++ ++ if ((error = dev_wlc_intvar_set(dev, "wsec", val))) ++ return error; ++#ifdef WLFBT ++ if ((paramid == IW_AUTH_CIPHER_PAIRWISE) && (val | AES_ENABLED)) { ++ if ((error = dev_wlc_intvar_set(dev, "sup_wpa", 1))) ++ return error; ++ } ++ else if (val == 0) { ++ if ((error = dev_wlc_intvar_set(dev, "sup_wpa", 0))) ++ return error; ++ } ++#endif /* WLFBT */ ++ break; ++ ++ case IW_AUTH_KEY_MGMT: ++ if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) ++ return error; ++ ++ if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) { ++ if (paramval & IW_AUTH_KEY_MGMT_PSK) ++ val = WPA_AUTH_PSK; ++ else ++ val = WPA_AUTH_UNSPECIFIED; ++ } ++ else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) { ++ if (paramval & IW_AUTH_KEY_MGMT_PSK) ++ val = WPA2_AUTH_PSK; ++ else ++ val = WPA2_AUTH_UNSPECIFIED; ++ } ++ AP6210_DEBUG("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val); ++ if ((error = dev_wlc_intvar_set(dev, "wpa_auth", val))) ++ return error; ++ break; ++ ++ case IW_AUTH_TKIP_COUNTERMEASURES: ++ dev_wlc_bufvar_set(dev, "tkip_countermeasures", (char *)¶mval, 1); ++ break; ++ ++ case IW_AUTH_80211_AUTH_ALG: ++ /* open shared */ ++ AP6210_ERR("Setting the D11auth %d\n", paramval); ++ if (paramval & IW_AUTH_ALG_OPEN_SYSTEM) ++ val = 0; ++ else if (paramval & IW_AUTH_ALG_SHARED_KEY) ++ val = 1; ++ else ++ error = 1; ++ if (!error && (error = dev_wlc_intvar_set(dev, "auth", val))) ++ return error; ++ break; ++ ++ case IW_AUTH_WPA_ENABLED: ++ if (paramval == 0) { ++ val = 0; ++ AP6210_DEBUG("%s: %d: setting wpa_auth to %d\n", __FUNCTION__, __LINE__, val); ++ error = dev_wlc_intvar_set(dev, "wpa_auth", val); ++ return error; ++ } ++ else { ++ /* If WPA is enabled, wpa_auth is set elsewhere */ ++ } ++ break; ++ ++ case IW_AUTH_DROP_UNENCRYPTED: ++ dev_wlc_bufvar_set(dev, "wsec_restrict", (char *)¶mval, 1); ++ break; ++ ++ case IW_AUTH_RX_UNENCRYPTED_EAPOL: ++ dev_wlc_bufvar_set(dev, "rx_unencrypted_eapol", (char *)¶mval, 1); ++ break; ++ ++#if WIRELESS_EXT > 17 ++ ++ case IW_AUTH_ROAMING_CONTROL: ++ AP6210_DEBUG("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__); ++ /* driver control or user space app control */ ++ break; ++ ++ case IW_AUTH_PRIVACY_INVOKED: { ++ int wsec; ++ ++ if (paramval == 0) { ++ iw->privacy_invoked = FALSE; ++ if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) { ++ AP6210_DEBUG("Failed to clear iovar is_WPS_enrollee\n"); ++ return error; ++ } ++ } else { ++ iw->privacy_invoked = TRUE; ++ if ((error = dev_wlc_intvar_get(dev, "wsec", &wsec))) ++ return error; ++ ++ if (!WSEC_ENABLED(wsec)) { ++ /* if privacy is true, but wsec is false, we are a WPS enrollee */ ++ if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", TRUE))) { ++ AP6210_DEBUG("Failed to set iovar is_WPS_enrollee\n"); ++ return error; ++ } ++ } else { ++ if ((error = dev_wlc_intvar_set(dev, "is_WPS_enrollee", FALSE))) { ++ AP6210_DEBUG("Failed to clear iovar is_WPS_enrollee\n"); ++ return error; ++ } ++ } ++ } ++ break; ++ } ++ ++ ++#endif /* WIRELESS_EXT > 17 */ ++ ++ ++ default: ++ break; ++ } ++ return 0; ++} ++#define VAL_PSK(_val) (((_val) & WPA_AUTH_PSK) || ((_val) & WPA2_AUTH_PSK)) ++ ++static int ++wl_iw_get_wpaauth( ++ struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra ++) ++{ ++ int error; ++ int paramid; ++ int paramval = 0; ++ int val; ++ wl_iw_t *iw = IW_DEV_IF(dev); ++ ++ AP6210_DEBUG("%s: SIOCGIWAUTH\n", dev->name); ++ ++ paramid = vwrq->flags & IW_AUTH_INDEX; ++ ++ switch (paramid) { ++ case IW_AUTH_WPA_VERSION: ++ /* supported wpa version disabled or wpa or wpa2 */ ++ if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) ++ return error; ++ if (val & (WPA_AUTH_NONE | WPA_AUTH_DISABLED)) ++ paramval = IW_AUTH_WPA_VERSION_DISABLED; ++ else if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) ++ paramval = IW_AUTH_WPA_VERSION_WPA; ++ else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) ++ paramval = IW_AUTH_WPA_VERSION_WPA2; ++ break; ++ ++ case IW_AUTH_CIPHER_PAIRWISE: ++ paramval = iw->pwsec; ++ break; ++ ++ case IW_AUTH_CIPHER_GROUP: ++ paramval = iw->gwsec; ++ break; ++ ++ case IW_AUTH_KEY_MGMT: ++ /* psk, 1x */ ++ if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) ++ return error; ++ if (VAL_PSK(val)) ++ paramval = IW_AUTH_KEY_MGMT_PSK; ++ else ++ paramval = IW_AUTH_KEY_MGMT_802_1X; ++ ++ break; ++ case IW_AUTH_TKIP_COUNTERMEASURES: ++ dev_wlc_bufvar_get(dev, "tkip_countermeasures", (char *)¶mval, 1); ++ break; ++ ++ case IW_AUTH_DROP_UNENCRYPTED: ++ dev_wlc_bufvar_get(dev, "wsec_restrict", (char *)¶mval, 1); ++ break; ++ ++ case IW_AUTH_RX_UNENCRYPTED_EAPOL: ++ dev_wlc_bufvar_get(dev, "rx_unencrypted_eapol", (char *)¶mval, 1); ++ break; ++ ++ case IW_AUTH_80211_AUTH_ALG: ++ /* open, shared, leap */ ++ if ((error = dev_wlc_intvar_get(dev, "auth", &val))) ++ return error; ++ if (!val) ++ paramval = IW_AUTH_ALG_OPEN_SYSTEM; ++ else ++ paramval = IW_AUTH_ALG_SHARED_KEY; ++ break; ++ case IW_AUTH_WPA_ENABLED: ++ if ((error = dev_wlc_intvar_get(dev, "wpa_auth", &val))) ++ return error; ++ if (val) ++ paramval = TRUE; ++ else ++ paramval = FALSE; ++ break; ++ ++#if WIRELESS_EXT > 17 ++ ++ case IW_AUTH_ROAMING_CONTROL: ++ AP6210_ERR("%s: IW_AUTH_ROAMING_CONTROL\n", __FUNCTION__); ++ /* driver control or user space app control */ ++ break; ++ ++ case IW_AUTH_PRIVACY_INVOKED: ++ paramval = iw->privacy_invoked; ++ break; ++ ++#endif /* WIRELESS_EXT > 17 */ ++ } ++ vwrq->value = paramval; ++ return 0; ++} ++#endif /* WIRELESS_EXT > 17 */ ++ ++static const iw_handler wl_iw_handler[] = ++{ ++ (iw_handler) wl_iw_config_commit, /* SIOCSIWCOMMIT */ ++ (iw_handler) wl_iw_get_name, /* SIOCGIWNAME */ ++ (iw_handler) NULL, /* SIOCSIWNWID */ ++ (iw_handler) NULL, /* SIOCGIWNWID */ ++ (iw_handler) wl_iw_set_freq, /* SIOCSIWFREQ */ ++ (iw_handler) wl_iw_get_freq, /* SIOCGIWFREQ */ ++ (iw_handler) wl_iw_set_mode, /* SIOCSIWMODE */ ++ (iw_handler) wl_iw_get_mode, /* SIOCGIWMODE */ ++ (iw_handler) NULL, /* SIOCSIWSENS */ ++ (iw_handler) NULL, /* SIOCGIWSENS */ ++ (iw_handler) NULL, /* SIOCSIWRANGE */ ++ (iw_handler) wl_iw_get_range, /* SIOCGIWRANGE */ ++ (iw_handler) NULL, /* SIOCSIWPRIV */ ++ (iw_handler) NULL, /* SIOCGIWPRIV */ ++ (iw_handler) NULL, /* SIOCSIWSTATS */ ++ (iw_handler) NULL, /* SIOCGIWSTATS */ ++ (iw_handler) wl_iw_set_spy, /* SIOCSIWSPY */ ++ (iw_handler) wl_iw_get_spy, /* SIOCGIWSPY */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) wl_iw_set_wap, /* SIOCSIWAP */ ++ (iw_handler) wl_iw_get_wap, /* SIOCGIWAP */ ++#if WIRELESS_EXT > 17 ++ (iw_handler) wl_iw_mlme, /* SIOCSIWMLME */ ++#else ++ (iw_handler) NULL, /* -- hole -- */ ++#endif ++ (iw_handler) wl_iw_iscan_get_aplist, /* SIOCGIWAPLIST */ ++#if WIRELESS_EXT > 13 ++ (iw_handler) wl_iw_iscan_set_scan, /* SIOCSIWSCAN */ ++ (iw_handler) wl_iw_iscan_get_scan, /* SIOCGIWSCAN */ ++#else /* WIRELESS_EXT > 13 */ ++ (iw_handler) NULL, /* SIOCSIWSCAN */ ++ (iw_handler) NULL, /* SIOCGIWSCAN */ ++#endif /* WIRELESS_EXT > 13 */ ++ (iw_handler) wl_iw_set_essid, /* SIOCSIWESSID */ ++ (iw_handler) wl_iw_get_essid, /* SIOCGIWESSID */ ++ (iw_handler) wl_iw_set_nick, /* SIOCSIWNICKN */ ++ (iw_handler) wl_iw_get_nick, /* SIOCGIWNICKN */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) wl_iw_set_rate, /* SIOCSIWRATE */ ++ (iw_handler) wl_iw_get_rate, /* SIOCGIWRATE */ ++ (iw_handler) wl_iw_set_rts, /* SIOCSIWRTS */ ++ (iw_handler) wl_iw_get_rts, /* SIOCGIWRTS */ ++ (iw_handler) wl_iw_set_frag, /* SIOCSIWFRAG */ ++ (iw_handler) wl_iw_get_frag, /* SIOCGIWFRAG */ ++ (iw_handler) wl_iw_set_txpow, /* SIOCSIWTXPOW */ ++ (iw_handler) wl_iw_get_txpow, /* SIOCGIWTXPOW */ ++#if WIRELESS_EXT > 10 ++ (iw_handler) wl_iw_set_retry, /* SIOCSIWRETRY */ ++ (iw_handler) wl_iw_get_retry, /* SIOCGIWRETRY */ ++#endif /* WIRELESS_EXT > 10 */ ++ (iw_handler) wl_iw_set_encode, /* SIOCSIWENCODE */ ++ (iw_handler) wl_iw_get_encode, /* SIOCGIWENCODE */ ++ (iw_handler) wl_iw_set_power, /* SIOCSIWPOWER */ ++ (iw_handler) wl_iw_get_power, /* SIOCGIWPOWER */ ++#if WIRELESS_EXT > 17 ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) wl_iw_set_wpaie, /* SIOCSIWGENIE */ ++ (iw_handler) wl_iw_get_wpaie, /* SIOCGIWGENIE */ ++ (iw_handler) wl_iw_set_wpaauth, /* SIOCSIWAUTH */ ++ (iw_handler) wl_iw_get_wpaauth, /* SIOCGIWAUTH */ ++ (iw_handler) wl_iw_set_encodeext, /* SIOCSIWENCODEEXT */ ++ (iw_handler) wl_iw_get_encodeext, /* SIOCGIWENCODEEXT */ ++ (iw_handler) wl_iw_set_pmksa, /* SIOCSIWPMKSA */ ++#endif /* WIRELESS_EXT > 17 */ ++}; ++ ++#if WIRELESS_EXT > 12 ++enum { ++ WL_IW_SET_LEDDC = SIOCIWFIRSTPRIV, ++ WL_IW_SET_VLANMODE, ++ WL_IW_SET_PM ++}; ++ ++static iw_handler wl_iw_priv_handler[] = { ++ wl_iw_set_leddc, ++ wl_iw_set_vlanmode, ++ wl_iw_set_pm ++}; ++ ++static struct iw_priv_args wl_iw_priv_args[] = { ++ { ++ WL_IW_SET_LEDDC, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, ++ 0, ++ "set_leddc" ++ }, ++ { ++ WL_IW_SET_VLANMODE, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, ++ 0, ++ "set_vlanmode" ++ }, ++ { ++ WL_IW_SET_PM, ++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, ++ 0, ++ "set_pm" ++ } ++}; ++ ++const struct iw_handler_def wl_iw_handler_def = ++{ ++ .num_standard = ARRAYSIZE(wl_iw_handler), ++ .num_private = ARRAY_SIZE(wl_iw_priv_handler), ++ .num_private_args = ARRAY_SIZE(wl_iw_priv_args), ++ .standard = (iw_handler *) wl_iw_handler, ++ .private = wl_iw_priv_handler, ++ .private_args = wl_iw_priv_args, ++#if WIRELESS_EXT >= 19 ++ get_wireless_stats: dhd_get_wireless_stats, ++#endif /* WIRELESS_EXT >= 19 */ ++ }; ++#endif /* WIRELESS_EXT > 12 */ ++ ++int ++wl_iw_ioctl( ++ struct net_device *dev, ++ struct ifreq *rq, ++ int cmd ++) ++{ ++ struct iwreq *wrq = (struct iwreq *) rq; ++ struct iw_request_info info; ++ iw_handler handler; ++ char *extra = NULL; ++ size_t token_size = 1; ++ int max_tokens = 0, ret = 0; ++ ++ if (cmd < SIOCIWFIRST || ++ IW_IOCTL_IDX(cmd) >= ARRAYSIZE(wl_iw_handler) || ++ !(handler = wl_iw_handler[IW_IOCTL_IDX(cmd)])) ++ return -EOPNOTSUPP; ++ ++ switch (cmd) { ++ ++ case SIOCSIWESSID: ++ case SIOCGIWESSID: ++ case SIOCSIWNICKN: ++ case SIOCGIWNICKN: ++ max_tokens = IW_ESSID_MAX_SIZE + 1; ++ break; ++ ++ case SIOCSIWENCODE: ++ case SIOCGIWENCODE: ++#if WIRELESS_EXT > 17 ++ case SIOCSIWENCODEEXT: ++ case SIOCGIWENCODEEXT: ++#endif ++ max_tokens = IW_ENCODING_TOKEN_MAX; ++ break; ++ ++ case SIOCGIWRANGE: ++ max_tokens = sizeof(struct iw_range); ++ break; ++ ++ case SIOCGIWAPLIST: ++ token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality); ++ max_tokens = IW_MAX_AP; ++ break; ++ ++#if WIRELESS_EXT > 13 ++ case SIOCGIWSCAN: ++ if (g_iscan) ++ max_tokens = wrq->u.data.length; ++ else ++ max_tokens = IW_SCAN_MAX_DATA; ++ break; ++#endif /* WIRELESS_EXT > 13 */ ++ ++ case SIOCSIWSPY: ++ token_size = sizeof(struct sockaddr); ++ max_tokens = IW_MAX_SPY; ++ break; ++ ++ case SIOCGIWSPY: ++ token_size = sizeof(struct sockaddr) + sizeof(struct iw_quality); ++ max_tokens = IW_MAX_SPY; ++ break; ++ default: ++ break; ++ } ++ ++ if (max_tokens && wrq->u.data.pointer) { ++ if (wrq->u.data.length > max_tokens) ++ return -E2BIG; ++ ++ if (!(extra = kmalloc(max_tokens * token_size, GFP_KERNEL))) ++ return -ENOMEM; ++ ++ if (copy_from_user(extra, wrq->u.data.pointer, wrq->u.data.length * token_size)) { ++ kfree(extra); ++ return -EFAULT; ++ } ++ } ++ ++ info.cmd = cmd; ++ info.flags = 0; ++ ++ ret = handler(dev, &info, &wrq->u, extra); ++ ++ if (extra) { ++ if (copy_to_user(wrq->u.data.pointer, extra, wrq->u.data.length * token_size)) { ++ kfree(extra); ++ return -EFAULT; ++ } ++ ++ kfree(extra); ++ } ++ ++ return ret; ++} ++ ++/* Convert a connection status event into a connection status string. ++ * Returns TRUE if a matching connection status string was found. ++ */ ++bool ++wl_iw_conn_status_str(uint32 event_type, uint32 status, uint32 reason, ++ char* stringBuf, uint buflen) ++{ ++ typedef struct conn_fail_event_map_t { ++ uint32 inEvent; /* input: event type to match */ ++ uint32 inStatus; /* input: event status code to match */ ++ uint32 inReason; /* input: event reason code to match */ ++ const char* outName; /* output: failure type */ ++ const char* outCause; /* output: failure cause */ ++ } conn_fail_event_map_t; ++ ++ /* Map of WLC_E events to connection failure strings */ ++# define WL_IW_DONT_CARE 9999 ++ const conn_fail_event_map_t event_map [] = { ++ /* inEvent inStatus inReason */ ++ /* outName outCause */ ++ {WLC_E_SET_SSID, WLC_E_STATUS_SUCCESS, WL_IW_DONT_CARE, ++ "Conn", "Success"}, ++ {WLC_E_SET_SSID, WLC_E_STATUS_NO_NETWORKS, WL_IW_DONT_CARE, ++ "Conn", "NoNetworks"}, ++ {WLC_E_SET_SSID, WLC_E_STATUS_FAIL, WL_IW_DONT_CARE, ++ "Conn", "ConfigMismatch"}, ++ {WLC_E_PRUNE, WL_IW_DONT_CARE, WLC_E_PRUNE_ENCR_MISMATCH, ++ "Conn", "EncrypMismatch"}, ++ {WLC_E_PRUNE, WL_IW_DONT_CARE, WLC_E_RSN_MISMATCH, ++ "Conn", "RsnMismatch"}, ++ {WLC_E_AUTH, WLC_E_STATUS_TIMEOUT, WL_IW_DONT_CARE, ++ "Conn", "AuthTimeout"}, ++ {WLC_E_AUTH, WLC_E_STATUS_FAIL, WL_IW_DONT_CARE, ++ "Conn", "AuthFail"}, ++ {WLC_E_AUTH, WLC_E_STATUS_NO_ACK, WL_IW_DONT_CARE, ++ "Conn", "AuthNoAck"}, ++ {WLC_E_REASSOC, WLC_E_STATUS_FAIL, WL_IW_DONT_CARE, ++ "Conn", "ReassocFail"}, ++ {WLC_E_REASSOC, WLC_E_STATUS_TIMEOUT, WL_IW_DONT_CARE, ++ "Conn", "ReassocTimeout"}, ++ {WLC_E_REASSOC, WLC_E_STATUS_ABORT, WL_IW_DONT_CARE, ++ "Conn", "ReassocAbort"}, ++ {WLC_E_PSK_SUP, WLC_SUP_KEYED, WL_IW_DONT_CARE, ++ "Sup", "ConnSuccess"}, ++ {WLC_E_PSK_SUP, WL_IW_DONT_CARE, WL_IW_DONT_CARE, ++ "Sup", "WpaHandshakeFail"}, ++ {WLC_E_DEAUTH_IND, WL_IW_DONT_CARE, WL_IW_DONT_CARE, ++ "Conn", "Deauth"}, ++ {WLC_E_DISASSOC_IND, WL_IW_DONT_CARE, WL_IW_DONT_CARE, ++ "Conn", "DisassocInd"}, ++ {WLC_E_DISASSOC, WL_IW_DONT_CARE, WL_IW_DONT_CARE, ++ "Conn", "Disassoc"} ++ }; ++ ++ const char* name = ""; ++ const char* cause = NULL; ++ int i; ++ ++ /* Search the event map table for a matching event */ ++ for (i = 0; i < sizeof(event_map)/sizeof(event_map[0]); i++) { ++ const conn_fail_event_map_t* row = &event_map[i]; ++ if (row->inEvent == event_type && ++ (row->inStatus == status || row->inStatus == WL_IW_DONT_CARE) && ++ (row->inReason == reason || row->inReason == WL_IW_DONT_CARE)) { ++ name = row->outName; ++ cause = row->outCause; ++ break; ++ } ++ } ++ ++ /* If found, generate a connection failure string and return TRUE */ ++ if (cause) { ++ memset(stringBuf, 0, buflen); ++ snprintf(stringBuf, buflen, "%s %s %02d %02d", ++ name, cause, status, reason); ++ AP6210_DEBUG("Connection status: %s\n", stringBuf); ++ return TRUE; ++ } else { ++ return FALSE; ++ } ++} ++ ++#if (WIRELESS_EXT > 14) ++/* Check if we have received an event that indicates connection failure ++ * If so, generate a connection failure report string. ++ * The caller supplies a buffer to hold the generated string. ++ */ ++static bool ++wl_iw_check_conn_fail(wl_event_msg_t *e, char* stringBuf, uint buflen) ++{ ++ uint32 event = ntoh32(e->event_type); ++ uint32 status = ntoh32(e->status); ++ uint32 reason = ntoh32(e->reason); ++ ++ if (wl_iw_conn_status_str(event, status, reason, stringBuf, buflen)) { ++ return TRUE; ++ } else ++ { ++ return FALSE; ++ } ++} ++#endif /* WIRELESS_EXT > 14 */ ++ ++#ifndef IW_CUSTOM_MAX ++#define IW_CUSTOM_MAX 256 /* size of extra buffer used for translation of events */ ++#endif /* IW_CUSTOM_MAX */ ++ ++void ++wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) ++{ ++#if WIRELESS_EXT > 13 ++ union iwreq_data wrqu; ++ char extra[IW_CUSTOM_MAX + 1]; ++ int cmd = 0; ++ uint32 event_type = ntoh32(e->event_type); ++ uint16 flags = ntoh16(e->flags); ++ uint32 datalen = ntoh32(e->datalen); ++ uint32 status = ntoh32(e->status); ++ ++ memset(&wrqu, 0, sizeof(wrqu)); ++ memset(extra, 0, sizeof(extra)); ++ ++ memcpy(wrqu.addr.sa_data, &e->addr, ETHER_ADDR_LEN); ++ wrqu.addr.sa_family = ARPHRD_ETHER; ++ ++ switch (event_type) { ++ case WLC_E_TXFAIL: ++ cmd = IWEVTXDROP; ++ break; ++#if WIRELESS_EXT > 14 ++ case WLC_E_JOIN: ++ case WLC_E_ASSOC_IND: ++ case WLC_E_REASSOC_IND: ++ cmd = IWEVREGISTERED; ++ break; ++ case WLC_E_DEAUTH_IND: ++ case WLC_E_DISASSOC_IND: ++ cmd = SIOCGIWAP; ++ wrqu.data.length = strlen(extra); ++ bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN); ++ bzero(&extra, ETHER_ADDR_LEN); ++ break; ++ ++ case WLC_E_LINK: ++ case WLC_E_NDIS_LINK: ++ cmd = SIOCGIWAP; ++ wrqu.data.length = strlen(extra); ++ if (!(flags & WLC_EVENT_MSG_LINK)) { ++ bzero(wrqu.addr.sa_data, ETHER_ADDR_LEN); ++ bzero(&extra, ETHER_ADDR_LEN); ++ } ++ break; ++ case WLC_E_ACTION_FRAME: ++ cmd = IWEVCUSTOM; ++ if (datalen + 1 <= sizeof(extra)) { ++ wrqu.data.length = datalen + 1; ++ extra[0] = WLC_E_ACTION_FRAME; ++ memcpy(&extra[1], data, datalen); ++ AP6210_DEBUG("WLC_E_ACTION_FRAME len %d \n", wrqu.data.length); ++ } ++ break; ++ ++ case WLC_E_ACTION_FRAME_COMPLETE: ++ cmd = IWEVCUSTOM; ++ if (sizeof(status) + 1 <= sizeof(extra)) { ++ wrqu.data.length = sizeof(status) + 1; ++ extra[0] = WLC_E_ACTION_FRAME_COMPLETE; ++ memcpy(&extra[1], &status, sizeof(status)); ++ AP6210_DEBUG("wl_iw_event status %d \n", status); ++ } ++ break; ++#endif /* WIRELESS_EXT > 14 */ ++#if WIRELESS_EXT > 17 ++ case WLC_E_MIC_ERROR: { ++ struct iw_michaelmicfailure *micerrevt = (struct iw_michaelmicfailure *)&extra; ++ cmd = IWEVMICHAELMICFAILURE; ++ wrqu.data.length = sizeof(struct iw_michaelmicfailure); ++ if (flags & WLC_EVENT_MSG_GROUP) ++ micerrevt->flags |= IW_MICFAILURE_GROUP; ++ else ++ micerrevt->flags |= IW_MICFAILURE_PAIRWISE; ++ memcpy(micerrevt->src_addr.sa_data, &e->addr, ETHER_ADDR_LEN); ++ micerrevt->src_addr.sa_family = ARPHRD_ETHER; ++ ++ break; ++ } ++ ++ case WLC_E_ASSOC_REQ_IE: ++ cmd = IWEVASSOCREQIE; ++ wrqu.data.length = datalen; ++ if (datalen < sizeof(extra)) ++ memcpy(extra, data, datalen); ++ break; ++ ++ case WLC_E_ASSOC_RESP_IE: ++ cmd = IWEVASSOCRESPIE; ++ wrqu.data.length = datalen; ++ if (datalen < sizeof(extra)) ++ memcpy(extra, data, datalen); ++ break; ++ ++ case WLC_E_PMKID_CACHE: { ++ struct iw_pmkid_cand *iwpmkidcand = (struct iw_pmkid_cand *)&extra; ++ pmkid_cand_list_t *pmkcandlist; ++ pmkid_cand_t *pmkidcand; ++ int count; ++ ++ if (data == NULL) ++ break; ++ ++ cmd = IWEVPMKIDCAND; ++ pmkcandlist = data; ++ count = ntoh32_ua((uint8 *)&pmkcandlist->npmkid_cand); ++ wrqu.data.length = sizeof(struct iw_pmkid_cand); ++ pmkidcand = pmkcandlist->pmkid_cand; ++ while (count) { ++ bzero(iwpmkidcand, sizeof(struct iw_pmkid_cand)); ++ if (pmkidcand->preauth) ++ iwpmkidcand->flags |= IW_PMKID_CAND_PREAUTH; ++ bcopy(&pmkidcand->BSSID, &iwpmkidcand->bssid.sa_data, ++ ETHER_ADDR_LEN); ++ wireless_send_event(dev, cmd, &wrqu, extra); ++ pmkidcand++; ++ count--; ++ } ++ break; ++ } ++#endif /* WIRELESS_EXT > 17 */ ++ ++ case WLC_E_SCAN_COMPLETE: ++#if WIRELESS_EXT > 14 ++ cmd = SIOCGIWSCAN; ++#endif ++ AP6210_DEBUG("event WLC_E_SCAN_COMPLETE\n"); ++ if ((g_iscan) && (g_iscan->sysioc_pid >= 0) && ++ (g_iscan->iscan_state != ISCAN_STATE_IDLE)) ++ up(&g_iscan->sysioc_sem); ++ break; ++ ++ default: ++ /* Cannot translate event */ ++ break; ++ } ++ ++ if (cmd) { ++ if (cmd == SIOCGIWSCAN) ++ wireless_send_event(dev, cmd, &wrqu, NULL); ++ else ++ wireless_send_event(dev, cmd, &wrqu, extra); ++ } ++ ++#if WIRELESS_EXT > 14 ++ /* Look for WLC events that indicate a connection failure. ++ * If found, generate an IWEVCUSTOM event. ++ */ ++ memset(extra, 0, sizeof(extra)); ++ if (wl_iw_check_conn_fail(e, extra, sizeof(extra))) { ++ cmd = IWEVCUSTOM; ++ wrqu.data.length = strlen(extra); ++ wireless_send_event(dev, cmd, &wrqu, extra); ++ } ++#endif /* WIRELESS_EXT > 14 */ ++ ++#endif /* WIRELESS_EXT > 13 */ ++} ++ ++int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstats) ++{ ++ int res = 0; ++ wl_cnt_t cnt; ++ int phy_noise; ++ int rssi; ++ scb_val_t scb_val; ++ ++ phy_noise = 0; ++ if ((res = dev_wlc_ioctl(dev, WLC_GET_PHY_NOISE, &phy_noise, sizeof(phy_noise)))) ++ goto done; ++ ++ phy_noise = dtoh32(phy_noise); ++ AP6210_DEBUG("wl_iw_get_wireless_stats phy noise=%d\n *****", phy_noise); ++ ++ scb_val.val = 0; ++ if ((res = dev_wlc_ioctl(dev, WLC_GET_RSSI, &scb_val, sizeof(scb_val_t)))) ++ goto done; ++ ++ rssi = dtoh32(scb_val.val); ++ AP6210_DEBUG("wl_iw_get_wireless_stats rssi=%d ****** \n", rssi); ++ if (rssi <= WL_IW_RSSI_NO_SIGNAL) ++ wstats->qual.qual = 0; ++ else if (rssi <= WL_IW_RSSI_VERY_LOW) ++ wstats->qual.qual = 1; ++ else if (rssi <= WL_IW_RSSI_LOW) ++ wstats->qual.qual = 2; ++ else if (rssi <= WL_IW_RSSI_GOOD) ++ wstats->qual.qual = 3; ++ else if (rssi <= WL_IW_RSSI_VERY_GOOD) ++ wstats->qual.qual = 4; ++ else ++ wstats->qual.qual = 5; ++ ++ /* Wraps to 0 if RSSI is 0 */ ++ wstats->qual.level = 0x100 + rssi; ++ wstats->qual.noise = 0x100 + phy_noise; ++#if WIRELESS_EXT > 18 ++ wstats->qual.updated |= (IW_QUAL_ALL_UPDATED | IW_QUAL_DBM); ++#else ++ wstats->qual.updated |= 7; ++#endif /* WIRELESS_EXT > 18 */ ++ ++#if WIRELESS_EXT > 11 ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters=%d\n *****", (int)sizeof(wl_cnt_t)); ++ ++ memset(&cnt, 0, sizeof(wl_cnt_t)); ++ res = dev_wlc_bufvar_get(dev, "counters", (char *)&cnt, sizeof(wl_cnt_t)); ++ if (res) ++ { ++ AP6210_ERR("wl_iw_get_wireless_stats counters failed error=%d ****** \n", res); ++ goto done; ++ } ++ ++ cnt.version = dtoh16(cnt.version); ++ if (cnt.version != WL_CNT_T_VERSION) { ++ AP6210_DEBUG("\tIncorrect version of counters struct: expected %d; got %d\n", ++ WL_CNT_T_VERSION, cnt.version); ++ goto done; ++ } ++ ++ wstats->discard.nwid = 0; ++ wstats->discard.code = dtoh32(cnt.rxundec); ++ wstats->discard.fragment = dtoh32(cnt.rxfragerr); ++ wstats->discard.retries = dtoh32(cnt.txfail); ++ wstats->discard.misc = dtoh32(cnt.rxrunt) + dtoh32(cnt.rxgiant); ++ wstats->miss.beacon = 0; ++ ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters txframe=%d txbyte=%d\n", ++ dtoh32(cnt.txframe), dtoh32(cnt.txbyte)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters rxfrmtoolong=%d\n", dtoh32(cnt.rxfrmtoolong)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters rxbadplcp=%d\n", dtoh32(cnt.rxbadplcp)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters rxundec=%d\n", dtoh32(cnt.rxundec)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters rxfragerr=%d\n", dtoh32(cnt.rxfragerr)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters txfail=%d\n", dtoh32(cnt.txfail)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters rxrunt=%d\n", dtoh32(cnt.rxrunt)); ++ AP6210_DEBUG("wl_iw_get_wireless_stats counters rxgiant=%d\n", dtoh32(cnt.rxgiant)); ++ ++#endif /* WIRELESS_EXT > 11 */ ++ ++done: ++ return res; ++} ++ ++static void ++wl_iw_timerfunc(ulong data) ++{ ++ iscan_info_t *iscan = (iscan_info_t *)data; ++ iscan->timer_on = 0; ++ if (iscan->iscan_state != ISCAN_STATE_IDLE) { ++ AP6210_DEBUG("timer trigger\n"); ++ up(&iscan->sysioc_sem); ++ } ++} ++ ++static void ++wl_iw_set_event_mask(struct net_device *dev) ++{ ++ char eventmask[WL_EVENTING_MASK_LEN]; ++ char iovbuf[WL_EVENTING_MASK_LEN + 12]; /* Room for "event_msgs" + '\0' + bitvec */ ++ ++ dev_iw_iovar_getbuf(dev, "event_msgs", "", 0, iovbuf, sizeof(iovbuf)); ++ bcopy(iovbuf, eventmask, WL_EVENTING_MASK_LEN); ++ setbit(eventmask, WLC_E_SCAN_COMPLETE); ++ dev_iw_iovar_setbuf(dev, "event_msgs", eventmask, WL_EVENTING_MASK_LEN, ++ iovbuf, sizeof(iovbuf)); ++ ++} ++ ++static int ++wl_iw_iscan_prep(wl_scan_params_t *params, wlc_ssid_t *ssid) ++{ ++ int err = 0; ++ ++ memcpy(¶ms->bssid, ðer_bcast, ETHER_ADDR_LEN); ++ params->bss_type = DOT11_BSSTYPE_ANY; ++ params->scan_type = 0; ++ params->nprobes = -1; ++ params->active_time = -1; ++ params->passive_time = -1; ++ params->home_time = -1; ++ params->channel_num = 0; ++ ++ params->nprobes = htod32(params->nprobes); ++ params->active_time = htod32(params->active_time); ++ params->passive_time = htod32(params->passive_time); ++ params->home_time = htod32(params->home_time); ++ if (ssid && ssid->SSID_len) ++ memcpy(¶ms->ssid, ssid, sizeof(wlc_ssid_t)); ++ ++ return err; ++} ++ ++static int ++wl_iw_iscan(iscan_info_t *iscan, wlc_ssid_t *ssid, uint16 action) ++{ ++ int params_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_iscan_params_t, params)); ++ wl_iscan_params_t *params; ++ int err = 0; ++ ++ if (ssid && ssid->SSID_len) { ++ params_size += sizeof(wlc_ssid_t); ++ } ++ params = (wl_iscan_params_t*)kmalloc(params_size, GFP_KERNEL); ++ if (params == NULL) { ++ return -ENOMEM; ++ } ++ memset(params, 0, params_size); ++ ASSERT(params_size < WLC_IOCTL_SMLEN); ++ ++ err = wl_iw_iscan_prep(¶ms->params, ssid); ++ ++ if (!err) { ++ params->version = htod32(ISCAN_REQ_VERSION); ++ params->action = htod16(action); ++ params->scan_duration = htod16(0); ++ ++ /* params_size += OFFSETOF(wl_iscan_params_t, params); */ ++ (void) dev_iw_iovar_setbuf(iscan->dev, "iscan", params, params_size, ++ iscan->ioctlbuf, WLC_IOCTL_SMLEN); ++ } ++ ++ kfree(params); ++ return err; ++} ++ ++static uint32 ++wl_iw_iscan_get(iscan_info_t *iscan) ++{ ++ iscan_buf_t * buf; ++ iscan_buf_t * ptr; ++ wl_iscan_results_t * list_buf; ++ wl_iscan_results_t list; ++ wl_scan_results_t *results; ++ uint32 status; ++ ++ /* buffers are allocated on demand */ ++ if (iscan->list_cur) { ++ buf = iscan->list_cur; ++ iscan->list_cur = buf->next; ++ } ++ else { ++ buf = kmalloc(sizeof(iscan_buf_t), GFP_KERNEL); ++ if (!buf) ++ return WL_SCAN_RESULTS_ABORTED; ++ buf->next = NULL; ++ if (!iscan->list_hdr) ++ iscan->list_hdr = buf; ++ else { ++ ptr = iscan->list_hdr; ++ while (ptr->next) { ++ ptr = ptr->next; ++ } ++ ptr->next = buf; ++ } ++ } ++ memset(buf->iscan_buf, 0, WLC_IW_ISCAN_MAXLEN); ++ list_buf = (wl_iscan_results_t*)buf->iscan_buf; ++ results = &list_buf->results; ++ results->buflen = WL_ISCAN_RESULTS_FIXED_SIZE; ++ results->version = 0; ++ results->count = 0; ++ ++ memset(&list, 0, sizeof(list)); ++ list.results.buflen = htod32(WLC_IW_ISCAN_MAXLEN); ++ (void) dev_iw_iovar_getbuf( ++ iscan->dev, ++ "iscanresults", ++ &list, ++ WL_ISCAN_RESULTS_FIXED_SIZE, ++ buf->iscan_buf, ++ WLC_IW_ISCAN_MAXLEN); ++ results->buflen = dtoh32(results->buflen); ++ results->version = dtoh32(results->version); ++ results->count = dtoh32(results->count); ++ AP6210_DEBUG("results->count = %d\n", results->count); ++ ++ AP6210_DEBUG("results->buflen = %d\n", results->buflen); ++ status = dtoh32(list_buf->status); ++ return status; ++} ++ ++static void wl_iw_send_scan_complete(iscan_info_t *iscan) ++{ ++ union iwreq_data wrqu; ++ ++ memset(&wrqu, 0, sizeof(wrqu)); ++ ++ /* wext expects to get no data for SIOCGIWSCAN Event */ ++ wireless_send_event(iscan->dev, SIOCGIWSCAN, &wrqu, NULL); ++} ++ ++static int ++_iscan_sysioc_thread(void *data) ++{ ++ uint32 status; ++ iscan_info_t *iscan = (iscan_info_t *)data; ++ ++ DAEMONIZE("iscan_sysioc"); ++ ++ status = WL_SCAN_RESULTS_PARTIAL; ++ while (down_interruptible(&iscan->sysioc_sem) == 0) { ++ if (iscan->timer_on) { ++ del_timer(&iscan->timer); ++ iscan->timer_on = 0; ++ } ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ rtnl_lock(); ++#endif ++ status = wl_iw_iscan_get(iscan); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ rtnl_unlock(); ++#endif ++ ++ switch (status) { ++ case WL_SCAN_RESULTS_PARTIAL: ++ AP6210_DEBUG("iscanresults incomplete\n"); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ rtnl_lock(); ++#endif ++ /* make sure our buffer size is enough before going next round */ ++ wl_iw_iscan(iscan, NULL, WL_SCAN_ACTION_CONTINUE); ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) ++ rtnl_unlock(); ++#endif ++ /* Reschedule the timer */ ++ iscan->timer.expires = jiffies + msecs_to_jiffies(iscan->timer_ms); ++ add_timer(&iscan->timer); ++ iscan->timer_on = 1; ++ break; ++ case WL_SCAN_RESULTS_SUCCESS: ++ AP6210_DEBUG("iscanresults complete\n"); ++ iscan->iscan_state = ISCAN_STATE_IDLE; ++ wl_iw_send_scan_complete(iscan); ++ break; ++ case WL_SCAN_RESULTS_PENDING: ++ AP6210_DEBUG("iscanresults pending\n"); ++ /* Reschedule the timer */ ++ iscan->timer.expires = jiffies + msecs_to_jiffies(iscan->timer_ms); ++ add_timer(&iscan->timer); ++ iscan->timer_on = 1; ++ break; ++ case WL_SCAN_RESULTS_ABORTED: ++ AP6210_DEBUG("iscanresults aborted\n"); ++ iscan->iscan_state = ISCAN_STATE_IDLE; ++ wl_iw_send_scan_complete(iscan); ++ break; ++ default: ++ AP6210_DEBUG("iscanresults returned unknown status %d\n", status); ++ break; ++ } ++ } ++ complete_and_exit(&iscan->sysioc_exited, 0); ++} ++ ++int ++wl_iw_attach(struct net_device *dev, void * dhdp) ++{ ++ iscan_info_t *iscan = NULL; ++ ++ if (!dev) ++ return 0; ++ ++ iscan = kmalloc(sizeof(iscan_info_t), GFP_KERNEL); ++ if (!iscan) ++ return -ENOMEM; ++ memset(iscan, 0, sizeof(iscan_info_t)); ++ iscan->sysioc_pid = -1; ++ /* we only care about main interface so save a global here */ ++ g_iscan = iscan; ++ iscan->dev = dev; ++ iscan->iscan_state = ISCAN_STATE_IDLE; ++ ++ ++ /* Set up the timer */ ++ iscan->timer_ms = 2000; ++ init_timer(&iscan->timer); ++ iscan->timer.data = (ulong)iscan; ++ iscan->timer.function = wl_iw_timerfunc; ++ ++ sema_init(&iscan->sysioc_sem, 0); ++ init_completion(&iscan->sysioc_exited); ++ iscan->sysioc_pid = kernel_thread(_iscan_sysioc_thread, iscan, 0); ++ if (iscan->sysioc_pid < 0) ++ return -ENOMEM; ++ return 0; ++} ++ ++void wl_iw_detach(void) ++{ ++ iscan_buf_t *buf; ++ iscan_info_t *iscan = g_iscan; ++ if (!iscan) ++ return; ++ if (iscan->sysioc_pid >= 0) { ++ KILL_PROC(iscan->sysioc_pid, SIGTERM); ++ wait_for_completion(&iscan->sysioc_exited); ++ } ++ ++ while (iscan->list_hdr) { ++ buf = iscan->list_hdr->next; ++ kfree(iscan->list_hdr); ++ iscan->list_hdr = buf; ++ } ++ kfree(iscan); ++ g_iscan = NULL; ++} ++ ++#endif /* USE_IW */ +diff --git a/drivers/net/wireless/ap6210/wl_iw.h b/drivers/net/wireless/ap6210/wl_iw.h +new file mode 100644 +index 0000000..c675a56 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_iw.h +@@ -0,0 +1,161 @@ ++/* ++ * Linux Wireless Extensions support ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wl_iw.h 291086 2011-10-21 01:17:24Z $ ++ */ ++ ++#ifndef _wl_iw_h_ ++#define _wl_iw_h_ ++ ++#include ++ ++#include ++#include ++#include ++ ++#define WL_SCAN_PARAMS_SSID_MAX 10 ++#define GET_SSID "SSID=" ++#define GET_CHANNEL "CH=" ++#define GET_NPROBE "NPROBE=" ++#define GET_ACTIVE_ASSOC_DWELL "ACTIVE=" ++#define GET_PASSIVE_ASSOC_DWELL "PASSIVE=" ++#define GET_HOME_DWELL "HOME=" ++#define GET_SCAN_TYPE "TYPE=" ++ ++#define BAND_GET_CMD "GETBAND" ++#define BAND_SET_CMD "SETBAND" ++#define DTIM_SKIP_GET_CMD "DTIMSKIPGET" ++#define DTIM_SKIP_SET_CMD "DTIMSKIPSET" ++#define SETSUSPEND_CMD "SETSUSPENDOPT" ++#define PNOSSIDCLR_SET_CMD "PNOSSIDCLR" ++/* Lin - Is the extra space needed? */ ++#define PNOSETUP_SET_CMD "PNOSETUP " /* TLV command has extra end space */ ++#define PNOENABLE_SET_CMD "PNOFORCE" ++#define PNODEBUG_SET_CMD "PNODEBUG" ++#define TXPOWER_SET_CMD "TXPOWER" ++ ++#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] ++#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" ++ ++/* Structure to keep global parameters */ ++typedef struct wl_iw_extra_params { ++ int target_channel; /* target channel */ ++} wl_iw_extra_params_t; ++ ++struct cntry_locales_custom { ++ char iso_abbrev[WLC_CNTRY_BUF_SZ]; /* ISO 3166-1 country abbreviation */ ++ char custom_locale[WLC_CNTRY_BUF_SZ]; /* Custom firmware locale */ ++ int32 custom_locale_rev; /* Custom local revisin default -1 */ ++}; ++/* ============================================== */ ++/* Defines from wlc_pub.h */ ++#define WL_IW_RSSI_MINVAL -200 /* Low value, e.g. for forcing roam */ ++#define WL_IW_RSSI_NO_SIGNAL -91 /* NDIS RSSI link quality cutoffs */ ++#define WL_IW_RSSI_VERY_LOW -80 /* Very low quality cutoffs */ ++#define WL_IW_RSSI_LOW -70 /* Low quality cutoffs */ ++#define WL_IW_RSSI_GOOD -68 /* Good quality cutoffs */ ++#define WL_IW_RSSI_VERY_GOOD -58 /* Very good quality cutoffs */ ++#define WL_IW_RSSI_EXCELLENT -57 /* Excellent quality cutoffs */ ++#define WL_IW_RSSI_INVALID 0 /* invalid RSSI value */ ++#define MAX_WX_STRING 80 ++#define SSID_FMT_BUF_LEN ((4 * 32) + 1) ++#define isprint(c) bcm_isprint(c) ++#define WL_IW_SET_ACTIVE_SCAN (SIOCIWFIRSTPRIV+1) ++#define WL_IW_GET_RSSI (SIOCIWFIRSTPRIV+3) ++#define WL_IW_SET_PASSIVE_SCAN (SIOCIWFIRSTPRIV+5) ++#define WL_IW_GET_LINK_SPEED (SIOCIWFIRSTPRIV+7) ++#define WL_IW_GET_CURR_MACADDR (SIOCIWFIRSTPRIV+9) ++#define WL_IW_SET_STOP (SIOCIWFIRSTPRIV+11) ++#define WL_IW_SET_START (SIOCIWFIRSTPRIV+13) ++ ++#define G_SCAN_RESULTS 8*1024 ++#define WE_ADD_EVENT_FIX 0x80 ++#define G_WLAN_SET_ON 0 ++#define G_WLAN_SET_OFF 1 ++ ++ ++typedef struct wl_iw { ++ char nickname[IW_ESSID_MAX_SIZE]; ++ ++ struct iw_statistics wstats; ++ ++ int spy_num; ++ uint32 pwsec; /* pairwise wsec setting */ ++ uint32 gwsec; /* group wsec setting */ ++ bool privacy_invoked; /* IW_AUTH_PRIVACY_INVOKED setting */ ++ struct ether_addr spy_addr[IW_MAX_SPY]; ++ struct iw_quality spy_qual[IW_MAX_SPY]; ++ void *wlinfo; ++} wl_iw_t; ++ ++struct wl_ctrl { ++ struct timer_list *timer; ++ struct net_device *dev; ++ long sysioc_pid; ++ struct semaphore sysioc_sem; ++ struct completion sysioc_exited; ++}; ++ ++ ++#if WIRELESS_EXT > 12 ++#include ++extern const struct iw_handler_def wl_iw_handler_def; ++#endif /* WIRELESS_EXT > 12 */ ++ ++extern int wl_iw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); ++extern void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data); ++extern int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstats); ++int wl_iw_attach(struct net_device *dev, void * dhdp); ++int wl_iw_send_priv_event(struct net_device *dev, char *flag); ++ ++void wl_iw_detach(void); ++ ++#define CSCAN_COMMAND "CSCAN " ++#define CSCAN_TLV_PREFIX 'S' ++#define CSCAN_TLV_VERSION 1 ++#define CSCAN_TLV_SUBVERSION 0 ++#define CSCAN_TLV_TYPE_SSID_IE 'S' ++#define CSCAN_TLV_TYPE_CHANNEL_IE 'C' ++#define CSCAN_TLV_TYPE_NPROBE_IE 'N' ++#define CSCAN_TLV_TYPE_ACTIVE_IE 'A' ++#define CSCAN_TLV_TYPE_PASSIVE_IE 'P' ++#define CSCAN_TLV_TYPE_HOME_IE 'H' ++#define CSCAN_TLV_TYPE_STYPE_IE 'T' ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) ++#define IWE_STREAM_ADD_EVENT(info, stream, ends, iwe, extra) \ ++ iwe_stream_add_event(info, stream, ends, iwe, extra) ++#define IWE_STREAM_ADD_VALUE(info, event, value, ends, iwe, event_len) \ ++ iwe_stream_add_value(info, event, value, ends, iwe, event_len) ++#define IWE_STREAM_ADD_POINT(info, stream, ends, iwe, extra) \ ++ iwe_stream_add_point(info, stream, ends, iwe, extra) ++#else ++#define IWE_STREAM_ADD_EVENT(info, stream, ends, iwe, extra) \ ++ iwe_stream_add_event(stream, ends, iwe, extra) ++#define IWE_STREAM_ADD_VALUE(info, event, value, ends, iwe, event_len) \ ++ iwe_stream_add_value(event, value, ends, iwe, event_len) ++#define IWE_STREAM_ADD_POINT(info, stream, ends, iwe, extra) \ ++ iwe_stream_add_point(stream, ends, iwe, extra) ++#endif ++ ++#endif /* _wl_iw_h_ */ +diff --git a/drivers/net/wireless/ap6210/wl_linux_mon.c b/drivers/net/wireless/ap6210/wl_linux_mon.c +new file mode 100644 +index 0000000..3210664 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wl_linux_mon.c +@@ -0,0 +1,422 @@ ++/* ++ * Broadcom Dongle Host Driver (DHD), Linux monitor network interface ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: dhd_linux_mon.c 280623 2011-08-30 14:49:39Z $ ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++typedef enum monitor_states ++{ ++ MONITOR_STATE_DEINIT = 0x0, ++ MONITOR_STATE_INIT = 0x1, ++ MONITOR_STATE_INTERFACE_ADDED = 0x2, ++ MONITOR_STATE_INTERFACE_DELETED = 0x4 ++} monitor_states_t; ++int dhd_add_monitor(char *name, struct net_device **new_ndev); ++extern int dhd_start_xmit(struct sk_buff *skb, struct net_device *net); ++int dhd_del_monitor(struct net_device *ndev); ++int dhd_monitor_init(void *dhd_pub); ++int dhd_monitor_uninit(void); ++ ++/** ++ * Local declarations and defintions (not exposed) ++ */ ++#ifndef DHD_MAX_IFS ++#define DHD_MAX_IFS 16 ++#endif ++ ++typedef struct monitor_interface { ++ int radiotap_enabled; ++ struct net_device* real_ndev; /* The real interface that the monitor is on */ ++ struct net_device* mon_ndev; ++} monitor_interface; ++ ++typedef struct dhd_linux_monitor { ++ void *dhd_pub; ++ monitor_states_t monitor_state; ++ monitor_interface mon_if[DHD_MAX_IFS]; ++ struct mutex lock; /* lock to protect mon_if */ ++} dhd_linux_monitor_t; ++ ++static dhd_linux_monitor_t g_monitor; ++ ++static struct net_device* lookup_real_netdev(char *name); ++static monitor_interface* ndev_to_monif(struct net_device *ndev); ++static int dhd_mon_if_open(struct net_device *ndev); ++static int dhd_mon_if_stop(struct net_device *ndev); ++static int dhd_mon_if_subif_start_xmit(struct sk_buff *skb, struct net_device *ndev); ++static void dhd_mon_if_set_multicast_list(struct net_device *ndev); ++static int dhd_mon_if_change_mac(struct net_device *ndev, void *addr); ++ ++static const struct net_device_ops dhd_mon_if_ops = { ++ .ndo_open = dhd_mon_if_open, ++ .ndo_stop = dhd_mon_if_stop, ++ .ndo_start_xmit = dhd_mon_if_subif_start_xmit, ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) ++ .ndo_set_rx_mode = dhd_mon_if_set_multicast_list, ++#else ++ .ndo_set_multicast_list = dhd_mon_if_set_multicast_list, ++#endif ++ .ndo_set_mac_address = dhd_mon_if_change_mac, ++}; ++ ++/** ++ * Local static function defintions ++ */ ++ ++/* Look up dhd's net device table to find a match (e.g. interface "eth0" is a match for "mon.eth0" ++ * "p2p-eth0-0" is a match for "mon.p2p-eth0-0") ++ */ ++static struct net_device* lookup_real_netdev(char *name) ++{ ++ struct net_device *ndev_found = NULL; ++ ++ int i; ++ int len = 0; ++ int last_name_len = 0; ++ struct net_device *ndev; ++ ++ /* We need to find interface "p2p-p2p-0" corresponding to monitor interface "mon-p2p-0", ++ * Once mon iface name reaches IFNAMSIZ, it is reset to p2p0-0 and corresponding mon ++ * iface would be mon-p2p0-0. ++ */ ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ ndev = dhd_idx2net(g_monitor.dhd_pub, i); ++ ++ /* Skip "p2p" and look for "-p2p0-x" in monitor interface name. If it ++ * it matches, then this netdev is the corresponding real_netdev. ++ */ ++ if (ndev && strstr(ndev->name, "p2p-p2p0")) { ++ len = strlen("p2p"); ++ } else { ++ /* if p2p- is not present, then the IFNAMSIZ have reached and name ++ * would have got reset. In this casse,look for p2p0-x in mon-p2p0-x ++ */ ++ len = 0; ++ } ++ if (ndev && strstr(name, (ndev->name + len))) { ++ if (strlen(ndev->name) > last_name_len) { ++ ndev_found = ndev; ++ last_name_len = strlen(ndev->name); ++ } ++ } ++ } ++ ++ return ndev_found; ++} ++ ++static monitor_interface* ndev_to_monif(struct net_device *ndev) ++{ ++ int i; ++ ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ if (g_monitor.mon_if[i].mon_ndev == ndev) ++ return &g_monitor.mon_if[i]; ++ } ++ ++ return NULL; ++} ++ ++static int dhd_mon_if_open(struct net_device *ndev) ++{ ++ int ret = 0; ++ ++ AP6210_DEBUG("enter\n"); ++ return ret; ++} ++ ++static int dhd_mon_if_stop(struct net_device *ndev) ++{ ++ int ret = 0; ++ ++ AP6210_DEBUG("enter\n"); ++ return ret; ++} ++ ++static int dhd_mon_if_subif_start_xmit(struct sk_buff *skb, struct net_device *ndev) ++{ ++ int ret = 0; ++ int rtap_len; ++ int qos_len = 0; ++ int dot11_hdr_len = 24; ++ int snap_len = 6; ++ unsigned char *pdata; ++ unsigned short frame_ctl; ++ unsigned char src_mac_addr[6]; ++ unsigned char dst_mac_addr[6]; ++ struct ieee80211_hdr *dot11_hdr; ++ struct ieee80211_radiotap_header *rtap_hdr; ++ monitor_interface* mon_if; ++ ++ AP6210_DEBUG("enter\n"); ++ ++ mon_if = ndev_to_monif(ndev); ++ if (mon_if == NULL || mon_if->real_ndev == NULL) { ++ AP6210_DEBUG(" cannot find matched net dev, skip the packet\n"); ++ goto fail; ++ } ++ ++ if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) ++ goto fail; ++ ++ rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; ++ if (unlikely(rtap_hdr->it_version)) ++ goto fail; ++ ++ rtap_len = ieee80211_get_radiotap_len(skb->data); ++ if (unlikely(skb->len < rtap_len)) ++ goto fail; ++ ++ AP6210_DEBUG("radiotap len (should be 14): %d\n", rtap_len); ++ ++ /* Skip the ratio tap header */ ++ skb_pull(skb, rtap_len); ++ ++ dot11_hdr = (struct ieee80211_hdr *)skb->data; ++ frame_ctl = le16_to_cpu(dot11_hdr->frame_control); ++ /* Check if the QoS bit is set */ ++ if ((frame_ctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) { ++ /* Check if this ia a Wireless Distribution System (WDS) frame ++ * which has 4 MAC addresses ++ */ ++ if (dot11_hdr->frame_control & 0x0080) ++ qos_len = 2; ++ if ((dot11_hdr->frame_control & 0x0300) == 0x0300) ++ dot11_hdr_len += 6; ++ ++ memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); ++ memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); ++ ++ /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for ++ * for two MAC addresses ++ */ ++ skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); ++ pdata = (unsigned char*)skb->data; ++ memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); ++ memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); ++ PKTSETPRIO(skb, 0); ++ ++ AP6210_DEBUG("if name: %s, matched if name %s\n", ndev->name, mon_if->real_ndev->name); ++ ++ /* Use the real net device to transmit the packet */ ++ ret = dhd_start_xmit(skb, mon_if->real_ndev); ++ ++ return ret; ++ } ++fail: ++ dev_kfree_skb(skb); ++ return 0; ++} ++ ++static void dhd_mon_if_set_multicast_list(struct net_device *ndev) ++{ ++ monitor_interface* mon_if; ++ ++ mon_if = ndev_to_monif(ndev); ++ if (mon_if == NULL || mon_if->real_ndev == NULL) { ++ AP6210_DEBUG(" cannot find matched net dev, skip the packet\n"); ++ } else { ++ AP6210_DEBUG("enter, if name: %s, matched if name %s\n", ++ ndev->name, mon_if->real_ndev->name); ++ } ++} ++ ++static int dhd_mon_if_change_mac(struct net_device *ndev, void *addr) ++{ ++ int ret = 0; ++ monitor_interface* mon_if; ++ ++ mon_if = ndev_to_monif(ndev); ++ if (mon_if == NULL || mon_if->real_ndev == NULL) { ++ AP6210_DEBUG(" cannot find matched net dev, skip the packet\n"); ++ } else { ++ AP6210_DEBUG("enter, if name: %s, matched if name %s\n", ++ ndev->name, mon_if->real_ndev->name); ++ } ++ return ret; ++} ++ ++/** ++ * Global function definitions (declared in dhd_linux_mon.h) ++ */ ++ ++int dhd_add_monitor(char *name, struct net_device **new_ndev) ++{ ++ int i; ++ int idx = -1; ++ int ret = 0; ++ struct net_device* ndev = NULL; ++ dhd_linux_monitor_t **dhd_mon; ++ ++ mutex_lock(&g_monitor.lock); ++ ++ AP6210_DEBUG("enter, if name: %s\n", name); ++ if (!name || !new_ndev) { ++ AP6210_DEBUG("invalid parameters\n"); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ /* ++ * Find a vacancy ++ */ ++ for (i = 0; i < DHD_MAX_IFS; i++) ++ if (g_monitor.mon_if[i].mon_ndev == NULL) { ++ idx = i; ++ break; ++ } ++ if (idx == -1) { ++ AP6210_DEBUG("exceeds maximum interfaces\n"); ++ ret = -EFAULT; ++ goto out; ++ } ++ ++ ndev = alloc_etherdev(sizeof(dhd_linux_monitor_t*)); ++ if (!ndev) { ++ AP6210_DEBUG("failed to allocate memory\n"); ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ ndev->type = ARPHRD_IEEE80211_RADIOTAP; ++ strncpy(ndev->name, name, IFNAMSIZ); ++ ndev->name[IFNAMSIZ - 1] = 0; ++ ndev->netdev_ops = &dhd_mon_if_ops; ++ ++ ret = register_netdevice(ndev); ++ if (ret) { ++ AP6210_DEBUG(" register_netdevice failed (%d)\n", ret); ++ goto out; ++ } ++ ++ *new_ndev = ndev; ++ g_monitor.mon_if[idx].radiotap_enabled = TRUE; ++ g_monitor.mon_if[idx].mon_ndev = ndev; ++ g_monitor.mon_if[idx].real_ndev = lookup_real_netdev(name); ++ dhd_mon = (dhd_linux_monitor_t **)netdev_priv(ndev); ++ *dhd_mon = &g_monitor; ++ g_monitor.monitor_state = MONITOR_STATE_INTERFACE_ADDED; ++ AP6210_DEBUG("net device returned: 0x%p\n", ndev); ++ AP6210_DEBUG("found a matched net device, name %s\n", g_monitor.mon_if[idx].real_ndev->name); ++ ++out: ++ if (ret && ndev) ++ free_netdev(ndev); ++ ++ mutex_unlock(&g_monitor.lock); ++ return ret; ++ ++} ++ ++int dhd_del_monitor(struct net_device *ndev) ++{ ++ int i; ++ bool rollback_lock = false; ++ if (!ndev) ++ return -EINVAL; ++ mutex_lock(&g_monitor.lock); ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ if (g_monitor.mon_if[i].mon_ndev == ndev || ++ g_monitor.mon_if[i].real_ndev == ndev) { ++ g_monitor.mon_if[i].real_ndev = NULL; ++ if (rtnl_is_locked()) { ++ rtnl_unlock(); ++ rollback_lock = true; ++ } ++ unregister_netdev(g_monitor.mon_if[i].mon_ndev); ++ free_netdev(g_monitor.mon_if[i].mon_ndev); ++ g_monitor.mon_if[i].mon_ndev = NULL; ++ g_monitor.monitor_state = MONITOR_STATE_INTERFACE_DELETED; ++ break; ++ } ++ } ++ if (rollback_lock) { ++ rtnl_lock(); ++ rollback_lock = false; ++ } ++ ++ if (g_monitor.monitor_state != ++ MONITOR_STATE_INTERFACE_DELETED) ++ AP6210_DEBUG("interface not found in monitor IF array, is this a monitor IF? 0x%p\n", ++ ndev); ++ mutex_unlock(&g_monitor.lock); ++ ++ return 0; ++} ++ ++int dhd_monitor_init(void *dhd_pub) ++{ ++ if (g_monitor.monitor_state == MONITOR_STATE_DEINIT) { ++ g_monitor.dhd_pub = dhd_pub; ++ mutex_init(&g_monitor.lock); ++ g_monitor.monitor_state = MONITOR_STATE_INIT; ++ } ++ return 0; ++} ++ ++int dhd_monitor_uninit(void) ++{ ++ int i; ++ struct net_device *ndev; ++ bool rollback_lock = false; ++ mutex_lock(&g_monitor.lock); ++ if (g_monitor.monitor_state != MONITOR_STATE_DEINIT) { ++ for (i = 0; i < DHD_MAX_IFS; i++) { ++ ndev = g_monitor.mon_if[i].mon_ndev; ++ if (ndev) { ++ if (rtnl_is_locked()) { ++ rtnl_unlock(); ++ rollback_lock = true; ++ } ++ unregister_netdev(ndev); ++ free_netdev(ndev); ++ g_monitor.mon_if[i].real_ndev = NULL; ++ g_monitor.mon_if[i].mon_ndev = NULL; ++ if (rollback_lock) { ++ rtnl_lock(); ++ rollback_lock = false; ++ } ++ } ++ } ++ g_monitor.monitor_state = MONITOR_STATE_DEINIT; ++ } ++ mutex_unlock(&g_monitor.lock); ++ return 0; ++} +diff --git a/drivers/net/wireless/ap6210/wldev_common.c b/drivers/net/wireless/ap6210/wldev_common.c +new file mode 100644 +index 0000000..596e448 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wldev_common.c +@@ -0,0 +1,374 @@ ++/* ++ * Common function shared by Linux WEXT, cfg80211 and p2p drivers ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wldev_common.c,v 1.1.4.1.2.14 2011-02-09 01:40:07 $ ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#define htod32(i) i ++#define htod16(i) i ++#define dtoh32(i) i ++#define dtoh16(i) i ++#define htodchanspec(i) i ++#define dtohchanspec(i) i ++ ++extern int dhd_ioctl_entry_local(struct net_device *net, wl_ioctl_t *ioc, int cmd); ++ ++s32 wldev_ioctl( ++ struct net_device *dev, u32 cmd, void *arg, u32 len, u32 set) ++{ ++ s32 ret = 0; ++ struct wl_ioctl ioc; ++ ++ ++ memset(&ioc, 0, sizeof(ioc)); ++ ioc.cmd = cmd; ++ ioc.buf = arg; ++ ioc.len = len; ++ ioc.set = set; ++ ++ ret = dhd_ioctl_entry_local(dev, &ioc, cmd); ++ ++ return ret; ++} ++ ++/* Format a iovar buffer, not bsscfg indexed. The bsscfg index will be ++ * taken care of in dhd_ioctl_entry. Internal use only, not exposed to ++ * wl_iw, wl_cfg80211 and wl_cfgp2p ++ */ ++static s32 wldev_mkiovar( ++ s8 *iovar_name, s8 *param, s32 paramlen, ++ s8 *iovar_buf, u32 buflen) ++{ ++ s32 iolen = 0; ++ ++ iolen = bcm_mkiovar(iovar_name, param, paramlen, iovar_buf, buflen); ++ return iolen; ++} ++ ++s32 wldev_iovar_getbuf( ++ struct net_device *dev, s8 *iovar_name, ++ void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync) ++{ ++ s32 ret = 0; ++ if (buf_sync) { ++ mutex_lock(buf_sync); ++ } ++ wldev_mkiovar(iovar_name, param, paramlen, buf, buflen); ++ ret = wldev_ioctl(dev, WLC_GET_VAR, buf, buflen, FALSE); ++ if (buf_sync) ++ mutex_unlock(buf_sync); ++ return ret; ++} ++ ++ ++s32 wldev_iovar_setbuf( ++ struct net_device *dev, s8 *iovar_name, ++ void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync) ++{ ++ s32 ret = 0; ++ s32 iovar_len; ++ if (buf_sync) { ++ mutex_lock(buf_sync); ++ } ++ iovar_len = wldev_mkiovar(iovar_name, param, paramlen, buf, buflen); ++ if (iovar_len > 0) ++ ret = wldev_ioctl(dev, WLC_SET_VAR, buf, iovar_len, TRUE); ++ else ++ ret = BCME_BUFTOOSHORT; ++ if (buf_sync) ++ mutex_unlock(buf_sync); ++ return ret; ++} ++ ++s32 wldev_iovar_setint( ++ struct net_device *dev, s8 *iovar, s32 val) ++{ ++ s8 iovar_buf[WLC_IOCTL_SMLEN]; ++ ++ val = htod32(val); ++ memset(iovar_buf, 0, sizeof(iovar_buf)); ++ return wldev_iovar_setbuf(dev, iovar, &val, sizeof(val), iovar_buf, ++ sizeof(iovar_buf), NULL); ++} ++ ++ ++s32 wldev_iovar_getint( ++ struct net_device *dev, s8 *iovar, s32 *pval) ++{ ++ s8 iovar_buf[WLC_IOCTL_SMLEN]; ++ s32 err; ++ ++ memset(iovar_buf, 0, sizeof(iovar_buf)); ++ err = wldev_iovar_getbuf(dev, iovar, pval, sizeof(*pval), iovar_buf, ++ sizeof(iovar_buf), NULL); ++ if (err == 0) ++ { ++ memcpy(pval, iovar_buf, sizeof(*pval)); ++ *pval = dtoh32(*pval); ++ } ++ return err; ++} ++ ++/** Format a bsscfg indexed iovar buffer. The bsscfg index will be ++ * taken care of in dhd_ioctl_entry. Internal use only, not exposed to ++ * wl_iw, wl_cfg80211 and wl_cfgp2p ++ */ ++s32 wldev_mkiovar_bsscfg( ++ const s8 *iovar_name, s8 *param, s32 paramlen, ++ s8 *iovar_buf, s32 buflen, s32 bssidx) ++{ ++ const s8 *prefix = "bsscfg:"; ++ s8 *p; ++ u32 prefixlen; ++ u32 namelen; ++ u32 iolen; ++ ++ if (bssidx == 0) { ++ return wldev_mkiovar((s8*)iovar_name, (s8 *)param, paramlen, ++ (s8 *) iovar_buf, buflen); ++ } ++ ++ prefixlen = (u32) strlen(prefix); /* lengh of bsscfg prefix */ ++ namelen = (u32) strlen(iovar_name) + 1; /* lengh of iovar name + null */ ++ iolen = prefixlen + namelen + sizeof(u32) + paramlen; ++ ++ if (buflen < 0 || iolen > (u32)buflen) ++ { ++ AP6210_ERR("%s: buffer is too short\n", __FUNCTION__); ++ return BCME_BUFTOOSHORT; ++ } ++ ++ p = (s8 *)iovar_buf; ++ ++ /* copy prefix, no null */ ++ memcpy(p, prefix, prefixlen); ++ p += prefixlen; ++ ++ /* copy iovar name including null */ ++ memcpy(p, iovar_name, namelen); ++ p += namelen; ++ ++ /* bss config index as first param */ ++ bssidx = htod32(bssidx); ++ memcpy(p, &bssidx, sizeof(u32)); ++ p += sizeof(u32); ++ ++ /* parameter buffer follows */ ++ if (paramlen) ++ memcpy(p, param, paramlen); ++ ++ return iolen; ++ ++} ++ ++s32 wldev_iovar_getbuf_bsscfg( ++ struct net_device *dev, s8 *iovar_name, ++ void *param, s32 paramlen, void *buf, s32 buflen, s32 bsscfg_idx, struct mutex* buf_sync) ++{ ++ s32 ret = 0; ++ if (buf_sync) { ++ mutex_lock(buf_sync); ++ } ++ ++ wldev_mkiovar_bsscfg(iovar_name, param, paramlen, buf, buflen, bsscfg_idx); ++ ret = wldev_ioctl(dev, WLC_GET_VAR, buf, buflen, FALSE); ++ if (buf_sync) { ++ mutex_unlock(buf_sync); ++ } ++ return ret; ++ ++} ++ ++s32 wldev_iovar_setbuf_bsscfg( ++ struct net_device *dev, s8 *iovar_name, ++ void *param, s32 paramlen, void *buf, s32 buflen, s32 bsscfg_idx, struct mutex* buf_sync) ++{ ++ s32 ret = 0; ++ s32 iovar_len; ++ if (buf_sync) { ++ mutex_lock(buf_sync); ++ } ++ iovar_len = wldev_mkiovar_bsscfg(iovar_name, param, paramlen, buf, buflen, bsscfg_idx); ++ if (iovar_len > 0) ++ ret = wldev_ioctl(dev, WLC_SET_VAR, buf, iovar_len, TRUE); ++ else { ++ ret = BCME_BUFTOOSHORT; ++ } ++ ++ if (buf_sync) { ++ mutex_unlock(buf_sync); ++ } ++ return ret; ++} ++ ++s32 wldev_iovar_setint_bsscfg( ++ struct net_device *dev, s8 *iovar, s32 val, s32 bssidx) ++{ ++ s8 iovar_buf[WLC_IOCTL_SMLEN]; ++ ++ val = htod32(val); ++ memset(iovar_buf, 0, sizeof(iovar_buf)); ++ return wldev_iovar_setbuf_bsscfg(dev, iovar, &val, sizeof(val), iovar_buf, ++ sizeof(iovar_buf), bssidx, NULL); ++} ++ ++ ++s32 wldev_iovar_getint_bsscfg( ++ struct net_device *dev, s8 *iovar, s32 *pval, s32 bssidx) ++{ ++ s8 iovar_buf[WLC_IOCTL_SMLEN]; ++ s32 err; ++ ++ memset(iovar_buf, 0, sizeof(iovar_buf)); ++ err = wldev_iovar_getbuf_bsscfg(dev, iovar, pval, sizeof(*pval), iovar_buf, ++ sizeof(iovar_buf), bssidx, NULL); ++ if (err == 0) ++ { ++ memcpy(pval, iovar_buf, sizeof(*pval)); ++ *pval = dtoh32(*pval); ++ } ++ return err; ++} ++ ++int wldev_get_link_speed( ++ struct net_device *dev, int *plink_speed) ++{ ++ int error; ++ ++ if (!plink_speed) ++ return -ENOMEM; ++ error = wldev_ioctl(dev, WLC_GET_RATE, plink_speed, sizeof(int), 0); ++ if (unlikely(error)) ++ return error; ++ ++ /* Convert internal 500Kbps to Kbps */ ++ *plink_speed *= 500; ++ return error; ++} ++ ++int wldev_get_rssi( ++ struct net_device *dev, int *prssi) ++{ ++ scb_val_t scb_val; ++ int error; ++ ++ if (!prssi) ++ return -ENOMEM; ++ bzero(&scb_val, sizeof(scb_val_t)); ++ ++ error = wldev_ioctl(dev, WLC_GET_RSSI, &scb_val, sizeof(scb_val_t), 0); ++ if (unlikely(error)) ++ return error; ++ ++ *prssi = dtoh32(scb_val.val); ++ return error; ++} ++ ++int wldev_get_ssid( ++ struct net_device *dev, wlc_ssid_t *pssid) ++{ ++ int error; ++ ++ if (!pssid) ++ return -ENOMEM; ++ error = wldev_ioctl(dev, WLC_GET_SSID, pssid, sizeof(wlc_ssid_t), 0); ++ if (unlikely(error)) ++ return error; ++ pssid->SSID_len = dtoh32(pssid->SSID_len); ++ return error; ++} ++ ++int wldev_get_band( ++ struct net_device *dev, uint *pband) ++{ ++ int error; ++ ++ error = wldev_ioctl(dev, WLC_GET_BAND, pband, sizeof(uint), 0); ++ return error; ++} ++ ++int wldev_set_band( ++ struct net_device *dev, uint band) ++{ ++ int error = -1; ++ ++ if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) { ++ error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), true); ++ if (!error) ++ dhd_bus_band_set(dev, band); ++ } ++ return error; ++} ++ ++int wldev_set_country( ++ struct net_device *dev, char *country_code) ++{ ++ int error = -1; ++ wl_country_t cspec = {{0}, 0, {0}}; ++ scb_val_t scbval; ++ char smbuf[WLC_IOCTL_SMLEN]; ++ ++ if (!country_code) ++ return error; ++ ++ error = wldev_iovar_getbuf(dev, "country", &cspec, sizeof(cspec), ++ smbuf, sizeof(smbuf), NULL); ++ if (error < 0) ++ AP6210_ERR("%s: get country failed = %d\n", __FUNCTION__, error); ++ ++ if ((error < 0) || ++ (strncmp(country_code, smbuf, WLC_CNTRY_BUF_SZ) != 0)) { ++ bzero(&scbval, sizeof(scb_val_t)); ++ error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); ++ if (error < 0) { ++ AP6210_ERR("%s: set country failed due to Disassoc error %d\n", ++ __FUNCTION__, error); ++ return error; ++ } ++ cspec.rev = -1; ++ memcpy(cspec.country_abbrev, country_code, WLC_CNTRY_BUF_SZ); ++ memcpy(cspec.ccode, country_code, WLC_CNTRY_BUF_SZ); ++ get_customized_country_code((char *)&cspec.country_abbrev, &cspec); ++ error = wldev_iovar_setbuf(dev, "country", &cspec, sizeof(cspec), ++ smbuf, sizeof(smbuf), NULL); ++ if (error < 0) { ++ AP6210_ERR("%s: set country for %s as %s rev %d failed\n", ++ __FUNCTION__, country_code, cspec.ccode, cspec.rev); ++ return error; ++ } ++ dhd_bus_country_set(dev, &cspec); ++ AP6210_ERR("%s: set country for %s as %s rev %d\n", ++ __FUNCTION__, country_code, cspec.ccode, cspec.rev); ++ } ++ return 0; ++} +diff --git a/drivers/net/wireless/ap6210/wldev_common.h b/drivers/net/wireless/ap6210/wldev_common.h +new file mode 100644 +index 0000000..f9bf425 +--- /dev/null ++++ b/drivers/net/wireless/ap6210/wldev_common.h +@@ -0,0 +1,111 @@ ++/* ++ * Common function shared by Linux WEXT, cfg80211 and p2p drivers ++ * ++ * Copyright (C) 1999-2012, Broadcom Corporation ++ * ++ * Unless you and Broadcom execute a separate written software license ++ * agreement governing use of this software, this software is licensed to you ++ * under the terms of the GNU General Public License version 2 (the "GPL"), ++ * available at http://www.broadcom.com/licenses/GPLv2.php, with the ++ * following added to such license: ++ * ++ * As a special exception, the copyright holders of this software give you ++ * permission to link this software with independent modules, and to copy and ++ * distribute the resulting executable under terms of your choice, provided that ++ * you also meet, for each linked independent module, the terms and conditions of ++ * the license of that module. An independent module is a module which is not ++ * derived from this software. The special exception does not apply to any ++ * modifications of the software. ++ * ++ * Notwithstanding the above, under no circumstances may you combine this ++ * software in any way with any other Broadcom software provided under a license ++ * other than the GPL, without Broadcom's express prior written consent. ++ * ++ * $Id: wldev_common.h,v 1.1.4.1.2.14 2011-02-09 01:40:07 $ ++ */ ++#ifndef __WLDEV_COMMON_H__ ++#define __WLDEV_COMMON_H__ ++ ++#include ++ ++/* wl_dev_ioctl - get/set IOCTLs, will call net_device's do_ioctl (or ++ * netdev_ops->ndo_do_ioctl in new kernels) ++ * @dev: the net_device handle ++ */ ++s32 wldev_ioctl( ++ struct net_device *dev, u32 cmd, void *arg, u32 len, u32 set); ++ ++/** Retrieve named IOVARs, this function calls wl_dev_ioctl with ++ * WLC_GET_VAR IOCTL code ++ */ ++s32 wldev_iovar_getbuf( ++ struct net_device *dev, s8 *iovar_name, ++ void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync); ++ ++/** Set named IOVARs, this function calls wl_dev_ioctl with ++ * WLC_SET_VAR IOCTL code ++ */ ++s32 wldev_iovar_setbuf( ++ struct net_device *dev, s8 *iovar_name, ++ void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync); ++ ++s32 wldev_iovar_setint( ++ struct net_device *dev, s8 *iovar, s32 val); ++ ++s32 wldev_iovar_getint( ++ struct net_device *dev, s8 *iovar, s32 *pval); ++ ++/** The following function can be implemented if there is a need for bsscfg ++ * indexed IOVARs ++ */ ++ ++s32 wldev_mkiovar_bsscfg( ++ const s8 *iovar_name, s8 *param, s32 paramlen, ++ s8 *iovar_buf, s32 buflen, s32 bssidx); ++ ++/** Retrieve named and bsscfg indexed IOVARs, this function calls wl_dev_ioctl with ++ * WLC_GET_VAR IOCTL code ++ */ ++s32 wldev_iovar_getbuf_bsscfg( ++ struct net_device *dev, s8 *iovar_name, void *param, s32 paramlen, ++ void *buf, s32 buflen, s32 bsscfg_idx, struct mutex* buf_sync); ++ ++/** Set named and bsscfg indexed IOVARs, this function calls wl_dev_ioctl with ++ * WLC_SET_VAR IOCTL code ++ */ ++s32 wldev_iovar_setbuf_bsscfg( ++ struct net_device *dev, s8 *iovar_name, void *param, s32 paramlen, ++ void *buf, s32 buflen, s32 bsscfg_idx, struct mutex* buf_sync); ++ ++s32 wldev_iovar_getint_bsscfg( ++ struct net_device *dev, s8 *iovar, s32 *pval, s32 bssidx); ++ ++s32 wldev_iovar_setint_bsscfg( ++ struct net_device *dev, s8 *iovar, s32 val, s32 bssidx); ++ ++extern void get_customized_country_code(char *country_iso_code, wl_country_t *cspec); ++extern void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec); ++extern void dhd_bus_band_set(struct net_device *dev, uint band); ++extern int wldev_set_country(struct net_device *dev, char *country_code); ++extern int net_os_wake_lock(struct net_device *dev); ++extern int net_os_wake_unlock(struct net_device *dev); ++extern int net_os_wake_lock_timeout(struct net_device *dev); ++extern int net_os_wake_lock_timeout_enable(struct net_device *dev, int val); ++extern int net_os_set_dtim_skip(struct net_device *dev, int val); ++extern int net_os_set_suspend_disable(struct net_device *dev, int val); ++extern int net_os_set_suspend(struct net_device *dev, int val, int force); ++extern int wl_iw_parse_ssid_list_tlv(char** list_str, wlc_ssid_t* ssid, ++ int max, int *bytes_left); ++ ++/* Get the link speed from dongle, speed is in kpbs */ ++int wldev_get_link_speed(struct net_device *dev, int *plink_speed); ++ ++int wldev_get_rssi(struct net_device *dev, int *prssi); ++ ++int wldev_get_ssid(struct net_device *dev, wlc_ssid_t *pssid); ++ ++int wldev_get_band(struct net_device *dev, uint *pband); ++ ++int wldev_set_band(struct net_device *dev, uint band); ++ ++#endif /* __WLDEV_COMMON_H__ */ +diff --git a/firmware/Makefile b/firmware/Makefile +index 0d15a3d..934cd24 100644 +--- a/firmware/Makefile ++++ b/firmware/Makefile +@@ -109,6 +109,10 @@ fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \ + fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \ + kaweth/new_code_fix.bin \ + kaweth/trigger_code_fix.bin ++fw-shipped-$(CONFIG_AP6210) += ap6210/bcm20710a1.hcd ap6210/fw_bcm40181a2.bin \ ++ ap6210/fw_bcm40181a2_apsta.bin \ ++ ap6210/fw_bcm40181a2_p2p.bin \ ++ ap6210/nvram_ap6210.txt + ifdef CONFIG_FIRMWARE_IN_KERNEL + fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw + fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw +diff --git a/firmware/ap6210/bcm20710a1.hcd.ihex b/firmware/ap6210/bcm20710a1.hcd.ihex +new file mode 100644 +index 0000000..28e8935 +--- /dev/null ++++ b/firmware/ap6210/bcm20710a1.hcd.ihex +@@ -0,0 +1,1665 @@ ++:100000004CFC2C00000900010800EEC4EC420790F3 ++:100010006524FD0400FFFFFFFF4006000000A00272 ++:100020007020020A00280009000000000000004CB7 ++:10003000FCFF2800090041290042434D323037308F ++:100040003241312047656E657269632055415254D3 ++:1000500020436C61737320312040203236204D489C ++:100060007A0069020000005D0C000A64E6B000003E ++:100070008898425A33435F09003C28010004000479 ++:10008000F70C0A6F0098160800C600F3025D0066C0 ++:10009000033000C900E10268005C033600C300E2DF ++:1000A000026A0053033C00C200E1026C004E0341AF ++:1000B00000C500D60272004A034300C300CE027995 ++:1000C0000042034800C500C00283003A034E00C846 ++:1000D00000BF0282003B034E00C900BC028400370F ++:1000E0000352000808070707070707060606060564 ++:1000F00005050502C0680194FC0E00FFFF000066C4 ++:1001000002000030FC0E00FFFF0F0063040000003F ++:10011000FD0E00FFFF0F006802000088FC0E00FFCC ++:10012000FF0000000400002CFC0E00FFFF0000494F ++:10013000044CFCFF23010900000070FC0E00FFFFCF ++:1001400000000B09000074FC0E00FFFF00002E01F0 ++:100150000000D8FF0E00FFFF000062190000D0FC75 ++:100160000E00FFFF000020C90000C8FC0E00FFFFCA ++:10017000000038850000DCFC0E00FFFF00001CC8FA ++:100180000000CCFD0E00FFFF0000048000005CFCBE ++:100190000E00FFFF00000200000020FC0E00FFFF29 ++:1001A000000019210000E0FC0E00008000000000AB ++:1001B0000000C0FC0E00FFFF000022000000948F32 ++:1001C0000800FFFFFFFF00120012988F0800FFFFDA ++:1001D0000000001200009C8F080000FFFFFF0009D4 ++:1001E0000909CCFC0E00FFFF00002B450000780041 ++:1001F0000F00FFFFFFFF0D08090968000F00FF0057 ++:10020000FFFF0D000D0D6C000F00FF00FFFF0D0044 ++:100210000D0D90000F00000000FF000000800C0199 ++:100220000F000000FFFF0000080888000F00F0002A ++:100230000000804CFCFF1E0209000000002C010F92 ++:1002400000FF0000000700000024010F0000000074 ++:10025000FF0000000530010F0000FF000000080053 ++:100260000020010F00000000FF00000006D07B000E ++:1002700001040A08FC0E00FFFF00002E3600000CEF ++:10028000FC0E00FFFF00002CAE000010FC0E00FF73 ++:10029000FF00002AAC000014FC0E00FFFF0000A2CB ++:1002A00022000018FC0E00FFFF00001D2000001CB3 ++:1002B000FC0E00FFFF00000D15000020FC0E00FFEB ++:1002C000FF0000858D000024FC0E00FFFF0000836E ++:1002D00011000028FC0E00FFFF0000000100009844 ++:1002E000FF0E00FFFF00003E410000C31600126930 ++:1002F0001419310870047836042430607180764A0D ++:100300003108290A6F210002301905CB000000BA1C ++:10031000147F7100A700000092000000001400008C ++:1003200000000000000000000A0800F40A080000B5 ++:1003300001000058014CFCFF19030900001FCF0900 ++:1003400000100F0C6EF0B009F060D1090001040339 ++:10035000036B1420206B1A2400FF0108080A1306FF ++:1003600011020FFE0DFA0BF609F207EE050A13064D ++:1003700011020FFE0DFA0BF609F207EE050301005C ++:100380000182D600040602020A233C5A6E7D8000D8 ++:100390008000800080008000800080028002800257 ++:1003A00080028002800214FF20880AFF61000000A2 ++:1003B0000000000000000000000014FF20820AFF7F ++:1003C000610000000000000000000000000014FFB9 ++:1003D00020000AFF61000000000000000000000093 ++:1003E000000014FF20080AFF610000000000000068 ++:1003F00000000000000014FF200B0AFF6100000055 ++:100400000000000000000000000014FF20100AFFA0 ++:10041000610000000000000000000000000040FF3C ++:10042000FF68027B0000000040FFFF68027B0000C5 ++:10043000000040FFFF68024CFCFF140409007B0031 ++:1004400000000040FFFF68027B0000000040FFFF4B ++:1004500069027B0000000040FFFF69027B00000092 ++:100460000082D600FF0602020A233C5A6E7D8000FD ++:100470008000800080008000800080028002800276 ++:1004800080028002800214FF19880AFF2000000009 ++:100490000000000000000000000014FF19820AFFA5 ++:1004A000430000000000000000000000000014FFF6 ++:1004B00019000AFF660000000000000000000000B4 ++:1004C000000014FF19080AFF660000000000000089 ++:1004D00000000000000014FF190B0AFF4300000099 ++:1004E0000000000000000000000014FF19100AFFC7 ++:1004F000200000000000000000000000000041009B ++:100500000000007B0000000041000000007B0000B4 ++:10051000000041000000007B0000000041000000DE ++:10052000007B0000000041000000007B0000000094 ++:1005300041000000007B0000004CFCFF0F0509009B ++:100540000086120004130040080000401300010060 ++:100550000180FF000113C15E007CCB1E85B47CCB03 ++:100560001E85B42604B104B204B304B404B504B6C1 ++:1005700004B704B804B904BA04BB04BC04BD04BE87 ++:1005800004BF04C004C104C204C304C404C504C637 ++:1005900004C704C804C904CA04CB04CC04CD04CEE7 ++:1005A00004CF04D004D104D204D304D404D504D697 ++:1005B00004D704D8280C000B04000E4C09000B04CF ++:1005C00000E44C09000B0400524E0900082500000D ++:1005D000B0DB010078F01EFC1600F0630900281C57 ++:1005E000FEF733FF281C5F3000210170391C321DDB ++:1005F00087F7D7FB080F000184E0000030BD00B58D ++:100600000000000000000817000288E0000087F0EA ++:1006100048F908001C53090000F002F800BD000072 ++:10062000081D0003C46200008FF059FB0E007A59C8 ++:10063000090001B4FFF769FF01BC704CFCFF0A061A ++:100640000900F7A9FC000008150004586600008F97 ++:10065000F08CF9060074590900FFF796FF30BD0BC6 ++:1006600004001A5B09000B0400445B090008150034 ++:1006700005C08400008DF000FE0600C4600900FF84 ++:10068000F7A6FF30BD082D0006B47702006EF08992 ++:10069000FC1E00CA60090002B461684907C90F3036 ++:1006A0001C91F7F5FC02BC002902D0F06991F76AB1 ++:1006B000FB91F76CFB080F000724B500000FE0C0AA ++:1006C00046000000000000080F0008C44F000010A2 ++:1006D000E0C046000000000000086700091CF003AD ++:1006E0000057F064F85800E860090070B5061C0C6B ++:1006F0001C151C002B21D104A8008840281DD10501 ++:10070000A80088202819D15A2917D8081C15D00408 ++:10071000F0BEF8002811D1032D0FD02204121408C6 ++:10072000210748002304F0BBF8002806D1221C2929 ++:100730001C301CA9F733F8012000E000204CFCFF1E ++:100740000507090070BD18650800080F000A9880A9 ++:1007500000005808042B0000000000000817000BE0 ++:10076000680C040055F06AFA08004061090000F0C6 ++:1007700002F870BD00000819000C64D4000088F075 ++:10078000EEFE0A0044620900281CFEF7E3FF77F73B ++:1007900020F90813000D08D6000088F021FE04009F ++:1007A0004E62090077F7DEF9080F000E80DA0000CC ++:1007B000C046C0460000000000000815000F24528B ++:1007C000000091F015F806005262090000F001F8EF ++:1007D000F0BD0B0400B463090008190010845C022A ++:1007E0000070F0BFFB0A00066409009B005859EF37 ++:1007F000188FF73CFC0817001164F8000086F0D44D ++:10080000FD08001064090000F002F8F0BD000008C7 ++:100810001700123CF5000086F0D4FF0800E86409D8 ++:100820000000F002F830BD0000082F0013C4F601EC ++:100830000076F04EFF200064650900054B30B44C93 ++:10084000FCFF00080900054CE57949190C06211642 ++:1008500030BC195489F7A7F8C046903408008C03BF ++:10086000080008170014487C02006EF09CFC080089 ++:100870008465090000F002F870BD0000082B001527 ++:10088000D4BA00008AF092FD1C00FC6509000AB48D ++:10089000201C311C00F009F80ABC012803D0042BED ++:1008A00001D175F762FA75F763FA081F00162CF08C ++:1008B000000087F001FB10003266090001B483F7E5 ++:1008C0003FFC01BC00F024F878F7F7FC082500177E ++:1008D000E4A203005CF0ADF91600426609000028AE ++:1008E00006D100F007F8002802D10120A3F774FE1A ++:1008F000A3F74AFE08170018C06A02006FF0EAFD6D ++:1009000008009866090000F002F830BD00000823D6 ++:100910000019C47202006FF088FA1400D867090049 ++:1009200008B4301C0122012300F004F808BC90F741 ++:1009300071FD0000920600A3008000141908170042 ++:100940001A4CFCFFFB0809002848020072F09AF8D4 ++:1009500008006069090000F069FA8DF7BDFF08170B ++:10096000001BB473020070F0FAFC0800AC7D0900B3 ++:10097000FFF75DFE8FF791FB080F001C34C40100E8 ++:10098000C046201C0000000000000817001D24477E ++:10099000020072F020F908006869090000F0F7F918 ++:1009A0008DF7EFFE0817001E6847020072F002F98B ++:1009B00008007069090000F009FA8DF707FF0817B1 ++:1009C000001F0C4D020071F034FE08007869090028 ++:1009D00000F099FA8EF7DEF908170020404D02006A ++:1009E00071F01EFE08008069090000F0AFFA8EF772 ++:1009F000F8F9081700217C4D020071F004FE080090 ++:100A00008869090000F007FC8EF70CFA081700222D ++:100A10007854020072F088FC08008C7D0900FFF712 ++:100A200058FD8DF783FB081700230C57020072F066 ++:100A300042FB0800947D0900FFF7B4FD8DF706FD29 ++:100A40000819004CFCFFF6090900244472010080DB ++:100A5000F0A3FF0A008E810900FFF7F5FF7FF75A28 ++:100A6000F80000081700254C58020072F0A6FA089A ++:100A7000009C7D0900FFF724FF8DF76DFE0817002D ++:100A8000265C46020073F0AAFB0800B47D0900FE54 ++:100A9000F774FE8CF75FFC081700270865010080DB ++:100AA000F042FA08009069090000F0FDFD7FF7D2DE ++:100AB000FD0817002834AE01007DF076FA08002406 ++:100AC00083090002B0FFF757FF70BD08170029081F ++:100AD0006E000090F0CCFF0800A47D0900FFF7F93C ++:100AE000FD6FF76AF8087F012AA444000094F04AD9 ++:100AF000F870013C85090000B528490B6826490BB0 ++:100B00006024490B6822490B601E490B682D490B74 ++:100B100060434B43490B6034490B680120C0030319 ++:100B2000430B6040490B78002B04D02F490B6840E1 ++:100B30000303430B602D4A13685B085B0013603AA4 ++:100B40004B3B4A13604CFCFFF10A0900B0F7E6FE8C ++:100B5000B1F70FFBB1F75EFEB2F704F80D2136488E ++:100B600001F0A5FE364A9068002803D099F70FF8E7 ++:100B7000B0F7ABFD2448244A11684160244A60E084 ++:100B8000C046C0B00800FFF2011A48A50900848FD2 ++:100B9000B002D08B0E00A0800E004CA50900148B73 ++:100BA0000E0050A509006CE5050054A509008C1540 ++:100BB000080023840900538409002D850900A984B5 ++:100BC0000900158509005C000F0094830E00FF00EA ++:100BD000FFFF608B0E0040230001E08A0E00E02C36 ++:100BE0000800A4860E0088B2080005000080850079 ++:100BF00000801C800E0014800E00848F0800048387 ++:100C00000E00108B0E00C8FC0E00C42C0800CC2C6B ++:100C10000800D02C0800C82C0800D42C0800D4FFF1 ++:100C20000E00BC8B0E00AD020000CC8B0E001CCD64 ++:100C3000080010325476D48B0E00009D0800ECCCD6 ++:100C4000080011684161054CFCFFEC0B09004A11DA ++:100C5000688160054A13680360044A1368044A13F4 ++:100C60006000BDC046D02C0800C82C0800D42C0859 ++:100C700000D4FF0E000861002B0044000093F094A4 ++:100C8000FF52002C83090010B5A448002383700490 ++:100C900023437001230370A14BA2480360A24BA21F ++:100CA0004C2360A24C2368A24C2360A24C2368A270 ++:100CB0004C23602C22A249A248BCF711FBA148A1F9 ++:100CC0004C2060A149C160A1494162A1490161A1D3 ++:100CD0004B8361A14BC36110BD080F002CD0B80439 ++:100CE00000A5F809E00000000000000817002D2012 ++:100CF000BA04004DF09CF808005C8B0900FFF7D4A3 ++:100D0000FF30BD00000817002E3069040052F020AB ++:100D1000FA0800748D0900FFF7C4FFADF7F8FD086D ++:100D200019002F545D040053F012F80A007C8D095D ++:100D300000B4F770F8FFF7B2FF30BD08190030E0DB ++:100D4000A504004EF0D1FB0A004CFCFFE70C0900A3 ++:100D5000868D090000F003F803B0F0BD000008170D ++:100D60000031E882040050F0A0FD08002C8E09003C ++:100D700000F002F830BD000008170032B0B10400E6 ++:100D80004DF0BAFE0800288F090000F002F830BDCF ++:100D90000000082B0033DCC004004CF086FF1C0070 ++:100DA000EC8F0900FF233D3343430448C0189F30B4 ++:100DB0000078002800D101207047C046349D08000B ++:100DC000081B003494AC04004EF0C2F90C001C90D7 ++:100DD0000900201C00F003F8B1F73AFE0000081BE0 ++:100DE0000035ACAC04004EF002FA0C00B4900900DF ++:100DF000201C00F003F8B1F7FAFD000008230036CC ++:100E00003CC104004CF064FF14000890090029184C ++:100E10007F231B02FF339D4200D35D1EFF23B3F7E8 ++:100E200092F808170037981B030067F004FB0800CE ++:100E3000A4910900FFF7D2FF30BD0000082B003855 ++:100E40001C7B040051F05EFB1C00DC4CFCFFE20D3F ++:100E5000090091090004910FB4301CFFF7E3FF0172 ++:100E60002802D10FBC05B0F0BD0FBC062DAEF79423 ++:100E7000FC081F003918AC04004EF02AFB1000706B ++:100E800092090003D1FFF7C1FFB1F7D2FCB1F7D14E ++:100E9000FC0000080F003A1C730400C046C0460066 ++:100EA00000000000000817003B807A040051F0ACFD ++:100EB000FC0800DC9309000420AEF75AFF10BD08BF ++:100EC00017003C9882040051F0A4F80800E493094C ++:100ED00000FFF7CAFF30BD00000817003D6CA804F2 ++:100EE000004EF072FE080054950900FFF74AFFF02B ++:100EF000BD00000815003E94A304004FF07EFA06E2 ++:100F00000094980900FFF7E8FF10BD080F003F0CA0 ++:100F1000A3040000F01DF8000000000000082300FA ++:100F2000404894000090F027FA14009A98090001B4 ++:100F30002B02D10020287001E06FF7DCFD62686FA2 ++:100F4000F718FE081D0041A4CC04004CF04CFCFF37 ++:100F5000DD0E090003FE0E00AE9809002878B2F7F6 ++:100F600079F9201C00F001F830BD080F0042C4A937 ++:100F700004005E4A2068000000000000080F0043E3 ++:100F8000A4630400FE23F533000000000000081FE6 ++:100F90000044D472000092F0FCFA1000D0980900CE ++:100FA000301C049900F004F8009988426DF7FCFCAD ++:100FB000081700459897040050F0C8F808002C99CD ++:100FC0000900FFF79FFEF0BD000008170046E49DF2 ++:100FD00004004FF094FF0800109D090000F002F893 ++:100FE000F0BD000008150047D099010080F0E8FA34 ++:100FF0000600A49F0900FFF7B2FF00BD08150048D6 ++:1010000068E901007BF01FFB0600AA9F0900FFF7BB ++:10101000C2FF00BD08210049A4E901007BF004FBE8 ++:101020001200B09F09000FB4301CFFF7C6FF0FBCC1 ++:101030000A22311C84F7F3FC080F004AC889030018 ++:10104000402303600000000000000819004B884C9A ++:10105000FCFED80F090085030061F01BFD0A00C2E9 ++:101060009F090000F003F89EF743FB000008BF0053 ++:101070004C5464020073F01EFEB00094A0090000FE ++:10108000B51E4B1A680D2A2ED0092A04D108430434 ++:10109000D09EF760FB01E00C2A04D11F490B6800C9 ++:1010A00020186028E0072A26D09BF712FF13490B6F ++:1010B00068012B12D112490B681B010ED41A490B7F ++:1010C00068002B0AD00E480368DB0102D5124908DC ++:1010D0006806E010490B68580002E000280BD002B7 ++:1010E000E00E490B68186001209EF731FE0F490B96 ++:1010F00068202003430B6000BDC046B0C808004014 ++:101100001B0800B45F0800400B080023C30800D48C ++:10111000CA0800F40A08000C0B0800E40A0800E4FE ++:10112000CA080053860300E4C7080020040E000824 ++:101130001B004DD06C020073F0A6FA0C0020A2092F ++:1011400000019800F003F802B0F0BD0000FE0000BE ++:101150004CFCFF004B0900F0B5484C484B49480394 ++:1011600060494B4948036001F0F4FE00F098FB0031 ++:10117000F0AEF900F058FB00F0B6FA00F0C8FA0340 ++:10118000F06FFE424A151CE435424B2B60424E3351 ++:101190006802263343404E33604048036880218B09 ++:1011A00043036000233E4E33703E490B1C23333D06 ++:1011B0004E33603D4B3E4E33603E4B3E4E33600BF4 ++:1011C0001C12333D4E33603D4B3E4E33603E483E35 ++:1011D0004B3F4E3360031C0E333E4E336012233DB3 ++:1011E0004E33700B1C11333C4E33603C4B3D4E3341 ++:1011F000603D4B3D4E33603D4E31603D4B3E4E3386 ++:10120000603E4E33683E4E33603E4B3E4E33603E52 ++:101210004B6B673E4B061C071DC8C40E363D4FC8BE ++:10122000C4991C0E30061CC2C43B4BD36200233A47 ++:101230004E336004F034FE394B6B65E4209EF73D7D ++:10124000FB0007000F042805D13F20C043354A505A ++:1012500073004CFCFFFB4B09000A907300233349D9 ++:101260000B703348E862F0BC08BC184700B5314841 ++:101270003249086032480749C86400F024F900BDCB ++:10128000C04614A4090091520900BCC80800955238 ++:101290000900F0C40800A0190800455309006C01BA ++:1012A0000F0040150800FD0708001E4500006CA453 ++:1012B000090020C9000070A409001CC8000074A423 ++:1012C000090078A40900388500007CA409005E04A8 ++:1012D000000044050000881308008C1308009013D8 ++:1012E0000800781308000EC90000801308000AC81F ++:1012F00000007C1308008413080026850000741386 ++:101300000800D8FF0E0080A409006216000084A423 ++:101310000900F95809004205000062190000819295 ++:10132000090068A409004D650900B8130800BAA5B2 ++:101330000900599E0900014B0900900008007963DB ++:10134000090070B500200F49104B4B6114E06B0988 ++:101350009C00EB064CFCFFF64C0900DB0E01259DC2 ++:10136000400B592B430B5143004C69C50052195295 ++:1013700068012632432725AD03AA1A1A5301300506 ++:101380004AC3009D58922DE5D370BDC0464C1B0842 ++:1013900000ACA509000CA3090000207047002070D4 ++:1013A00047002801D0002000E00120704700207095 ++:1013B0004710B5037814490B700620A9F75FFD04A8 ++:1013C0001E10D00E230370042343700023437101C9 ++:1013D000238370F723C370FC230371A9F779FD20E1 ++:1013E0001CA9F750FD012010BC08BC1847810589D5 ++:1013F0000D030AFC201840FC2803D1F72901D10372 ++:101400004800E000207047C046BAA509004D4D09CC ++:101410000004280AD106480378002B06D0054803AB ++:10142000785B065B0E0370012000E000207047C06F ++:1014300046BAA5090039C3080030B50124827812E4 ++:1014400002437813439A05920D1B0AFC252B400C8E ++:101450002B2DD0FC2B244CFCFFF14D0900D11C2A74 ++:101460001CD0B52A0DD0B62A0FD0C22A10D0C32A5C ++:1014700011D0E62A02D0F52A1AD112E003F04CFC72 ++:1014800017E001F05FFE012016E001F091FEFAE79F ++:1014900001F0C0FEF7E701F006FFF4E705F088F978 ++:1014A000F1E703F0AFF9EEE7202B04D0042B02D1D3 ++:1014B0000024201C00E0002030BC08BC1847024873 ++:1014C000024908607047C046D54D090018C9080098 ++:1014D000002070470148024988607047654E090046 ++:1014E000201A080072487349C8607047F0B583B08D ++:1014F000041C012906D164300023C372251C9435D5 ++:10150000AB73EB736C4803689B079B0F032B02D0F4 ++:1015100071F722FAC8E00023A381E07B484000D1A4 ++:10152000B6E070F7BDFC002803D1644803691B01D5 ++:1015300001D5012100E00021271C64373E1CFB6817 ++:1015400080208343C8010343F3600C365C4A107863 ++:10155000431006D0C3071B0E4CFCFFEC4E090031B4 ++:10156000688020814319433160564803691B01029A ++:10157000D4381C94F79AF9BB69002B02D03B681B46 ++:10158000063BD4338868460380E37B012B0DD025CE ++:101590001C94356B7B002B10D02B88042B0DD3EBC8 ++:1015A0007C022B0AD3AB7D002B07D1A72303201885 ++:1015B00055009B78208343002106E00121E9740057 ++:1015C0009B78208343082003431F208002834388A5 ++:1015D00002034300931B041B0C3C4A1360012030A0 ++:1015E00072384A13691B0152D400984006010F005B ++:1015F000231A1C012094F77AFB45E0E07B002802C7 ++:10160000D1A72301221A55012804D1E37C042B0120 ++:10161000D072F76DFCF37A002B06D00023F37233FF ++:101620006801204002434033600121B172251C94BF ++:1016300035A97323480369DB0002D5201C87F77D99 ++:10164000FD338821490B60B0884860381C70F79DD5 ++:10165000FC30684006030F1D48C04CFCFFE74F09F3 ++:10166000005C3072431EA381E37B002B0FD101216C ++:10167000387F8140194A1068084008D1E37C042B68 ++:1016800005D016480378AB7516480378EB750E48FD ++:1016900003691B010FD5201C94F7D3FE0BE0271C18 ++:1016A00064373B727B7270F72BFC636C002B02D0AB ++:1016B0005A231B5BA38103B0F0BC08BC1847814EC2 ++:1016C000090000020800188B0E0054200800DCC836 ++:1016D0000800CC8A0E009EBB0500B4010800F5018D ++:1016E0000800F601080030B50D1C041C75F777FEE4 ++:1016F0006B075B0F012B05D1E37B002B02D1A07B95 ++:101700009CF7B6FD30BC08BC184700B52C22044934 ++:101710000548BFF774FC034804494161044B186055 ++:1017200000BD0CBD050088A409006D500900E4024D ++:10173000080010B53F4C3F4B1C602C223F49201C39 ++:10174000BFF75DFC3E48606210BDF0B5041C051C8F ++:10175000876A28353B4B4233187800284CFCFFE25F ++:1017600050090066D1201C012172F7D1F9061E4BE9 ++:10177000DD022804DB201C77F74BFA002859D161E1 ++:101780008C8B1F9E4223DA304A13689C420BD0395F ++:101790001CAB310878013800D30870731C59102035 ++:1017A0001C76F7D8FF30E0731C5810E37B002B0544 ++:1017B000D07B6C002B02D06B7F002B25D02F89B8FB ++:1017C0004222D36A89002A06D1A389002B03D120A3 ++:1017D0001C71F7DFFD18E0BA4200DA3A1C904201B2 ++:1017E000D90C2310E04B23A27C1B5D9A420CD10242 ++:1017F000280AD36B7F002B05D01448037899420147 ++:10180000D9282300E03823A374211C4D3108780027 ++:10181000280FD00238087000060BD1E37B012B02A1 ++:10182000D0237D0C2B05D0321C201C0523022177F0 ++:10183000F734F9F0BC08BC1847B4A4090000030849 ++:101840000074BD0500D15009006C210800F40208A5 ++:101850000000B52C2216491748BFF7D4FB154CFCE5 ++:10186000FFDD51090048164B18601649016100BDA3 ++:1018700030B50D1C041C78F71CF8022D09D16B2320 ++:10188000185D002805D0201C87F705FB201C87F772 ++:101890003DFB30BC08BC184700B5011C6831CB7853 ++:1018A000002B07D04B7A002B04D18B78002B01D072 ++:1018B00087F714FB00BDC0462CBE0500E0A409005C ++:1018C00030030800E951090000B57CF752FA00BD69 ++:1018D00000B52C220B490C48BFF798FB0A4B0B486C ++:1018E000036000BD0A49CB6ADB0007D5094AD388EB ++:1018F0005B00418C8B4201DC012100E000215A3069 ++:1019000001707047B0CB05000CA50900F403080076 ++:1019100054200800942008000020704730B5041CB3 ++:1019200000292BD0012925D140051BD426E0174DD5 ++:10193000291C1748B7F7C7FF2988281C262902D178 ++:1019400003F04BFD0EE0042902D17CF712FA09E006 ++:101950000F2902D104F032FB04E089000D4A8958B6 ++:101960004CFC48D8520900C6F7EDFA0A48B7F7C64A ++:10197000FF0028DFD00A4B1C4003E0022901D17B85 ++:10198000F7CBFF201C30BC08BC18470548064908A7 ++:10199000607047F4440800284508009CBE0500FF1D ++:1019A000FBFFFF95520900F0C408004CFCFF2453D4 ++:1019B000090000B5431E04490B6004490B78032B52 ++:1019C00001D1BFF7E8FF00BDC046E08A0E0038082D ++:1019D0000800F0B587B0061C0491081C0021039193 ++:1019E000A34C2064211C4431009100238B70A0483B ++:1019F0008568002D00D16EE2AB7D002B09D001225D ++:101A000003920023AB756361237810208343237016 ++:101A100006E06069002803D0012E01D970F701FFAC ++:101A200022691D27FF03002A50D0607A012803D1C4 ++:101A30009389002B4AD047E08F4B1B5C002B43D18E ++:101A4000BB68DB0742D4137D092B3DD204281AD191 ++:101A5000012E18D1967562612378102003432370FC ++:101A600023683B6085490B687233187802282DD0B3 ++:101A7000002382490B608249086882490B68036031 ++:101A80000B68036022E002280AD1012E08D1967566 ++:101A90006261237810200343237023683B6015E0C4 ++:101AA000032803D179498B78022B0FD0064CFCFF19 ++:101AB0001F5409002801D0032805D1012E03D1BBF2 ++:101AC000689B0600D5C0E1122803D0102801D07011 ++:101AD000F72BFE6A4B985D029000287DD00123DB36 ++:101AE00007334301936B4B6C490868986301236B80 ++:101AF000490B606B490B689B0C9B040B600B68697E ++:101B0000490868034366490B6001230099CB70665E ++:101B1000490B6866490B6066490B6866490B60288B ++:101B20007C1A281DD164490B6864490B6064490B19 ++:101B30006864490B6064490B6864490B6064490B35 ++:101B40006864490B6064490B6864490B6064490B25 ++:101B50006850490B60634908686349086063492D10 ++:101B6000E063490B6855490B6062490B6855490BA6 ++:101B70006061490B6855490B6060490B6855490B1A ++:101B8000605F490B6855490B6019280ED1FF20177B ++:101B9000302B562A3309DD5B490B683E490B605AEE ++:101BA00049086851490860594908E059490B684C8F ++:101BB000FCFF1A55090039490B60584908684C491F ++:101BC00008605749086857490860A87B231804280B ++:101BD00001D3187800E0205C6F2290431870C2E0B7 ++:101BE000A87B225C0F218A433107090F0A43225444 ++:101BF00023180428049802D38107101C01E08107F0 ++:101C00001878490E6022904308431870234B4649C8 ++:101C100008689863009AD378002B00D1A1E022498C ++:101C20000B689B0C9B040B600B68404908680343DE ++:101C30001D490B600023D3703D490B681D490B60A3 ++:101C40003C490B681D490B603B490B681D490B6003 ++:101C50003A490B6821490B6039490B681B490B60F5 ++:101C600038490B681B490B6037490B681D490B60ED ++:101C700036490B6809490B6035496BE0642C080054 ++:101C80006C210800ECBB0500DC02080060000F00BE ++:101C9000AC2C080044020800882B08002CFC0E0025 ++:101CA00060020800E08A0E00B88A0E005C0208009C ++:101CB0006C4CFCFF15560900130800D8FC0E007090 ++:101CC000130800E0FC0E006CA40900CCFC0E0074AC ++:101CD000A40900DCFC0E0070A40900D0FC0E007CFE ++:101CE000A40900C8FC0E0078A40900D4FF0E002C43 ++:101CF000A4090030A4090030FC0E0034A4090078C7 ++:101D00001308007C13080080130800741308008473 ++:101D100013080014A4090018A409001CA409002039 ++:101D2000A4090024A4090028A40900D8FF0E00B8C3 ++:101D30002C080048020800BC2C0800C02C0800C475 ++:101D40002C0800C82C0800CC2C0800D02C0800D48B ++:101D50002C0800D82C0800DC2C08000868934908DF ++:101D60006093490B6893490B6000210191286882B8 ++:101D70006A281C0021C6F7EDF8002810D026231A87 ++:101D80005C002A0CD08368002B09D002980028043C ++:101D9000D0802301981843019001E0012200E00067 ++:101DA00022237880208343D0010343237020200422 ++:101DB0009908404CFCFF1057090001D00120C003D6 ++:101DC0007F4908600499090704D47D490B68802085 ++:101DD00083430B600499880801214140A278802048 ++:101DE0008243C8010243A2702868826A281C03212A ++:101DF000C6F7B3F874490B78012B01D077F753F885 ++:101E000005A9714A13687020034018099CF7A0F8CF ++:101E10002369002B14D0637A032B11D188F701FCBE ++:101E2000002806D16A480368032B02D00368062BFA ++:101E300006D12B7C122B03D101230098837058E02C ++:101E400005988007800F06D003280ED1069B6049B5 ++:101E50000888834209D30398012800D1656170F78F ++:101E60006EFC012300994B7043E00820B860A87B0A ++:101E7000786223683B603B1C1833221D0392920753 ++:101E8000920F02D1039909680FE00399891A03910F ++:101E9000D2000968D140049120218A1A0399496827 ++:101EA000914001B40598014301BC1960BA69331C23 ++:101EB000103B042B0D4CFCFF0B580900D2474B1371 ++:101EC00040FF22013282401343BB61102E07D144F0 ++:101ED0004908684449086002E040481040B8610180 ++:101EE00098002800D07861E5602672002300990BE5 ++:101EF000704B70281C8CF7B5FC012007B0F0BC08B3 ++:101F0000BC1847394B3949087A185C39490B6800C5 ++:101F10002814D00120800303430B60364A1368362F ++:101F2000480340364A117849020B43354A1360355D ++:101F30004A1368302083431020184308E0324803D6 ++:101F4000400B602C490B682E490B602E4908682F06 ++:101F5000490860704710B5254C234B607A185C0027 ++:101F60002802D070F75FFF15E06069002801D0708B ++:101F7000F769FC27490868637A012B01D1254A00DB ++:101F8000E0254A13680360116801600023234A13A7 ++:101F90006070F774FE002322490B60E360236163E5 ++:101FA0007244340120207010BD002803D10348037F ++:101FB000680348036000204CFC7206590900704712 ++:101FC00030FC0E0080A40900D8FF0E00648B0E00C8 ++:101FD000A4860E00D4C1080024860E001C840E00C6 ++:101FE000E4B60800FFF0FFFF9406080064FC0E0052 ++:101FF000ECBB0500642C0800808B0E00B02C0800A0 ++:10200000FFC1FFFF9013080088FC0E00B42C0800ED ++:10201000FFBFFFFFCCFD0E00AC2C08004002080003 ++:102020004402080060000F0018800E004CFCFF887E ++:1020300059090070B582B0061C654801688906021E ++:10204000D5022072F71FFC624C2568A3682360004C ++:102050002D26D0002E18D19EF7F4F9002814D0C3F5 ++:102060000703D52A68916900290BD1430703D52AB4 ++:1020700068D169002905D1830706D52A68116A004D ++:102080002902D0281CC5F76CFF9EF7F8F9011C2A1D ++:10209000685269002A04D0002802D0281CC5F75DC8 ++:1020A000FFA0680026A84218D0002D21D02A68126F ++:1020B00069002A03D0281C0521C5F74FFFAE8123F4 ++:1020C000699D4200D126612B7D092B11D3281C73F9 ++:1020D000F7E8FD281C73F76DF90AE0002808D063C3 ++:1020E00069984205D166613B4800220121B7F71D7E ++:1020F000FF3A48C16E002904D0A368002B01D1C566 ++:10210000F72FFF70F7B6FBA06800284BD08681033D ++:102110007D092B20D26369984205D166612E480063 ++:10212000220121B7F702FFA068A84206D1014CFCAA ++:10213000FF835A0900684968002902D00523037506 ++:1021400008E0017D032901D0042905D1016849680F ++:10215000002901D0C5F708FFA068022303750168B4 ++:102160000A69002A02D00221C5F7FBFEA068807B25 ++:102170001D4A136870210B401909884216D169461F ++:102180009BF7EAFE70F760FC002801D0174800E0DA ++:102190001748028800998907890F04D0032905D1BF ++:1021A000019B934202D33F2301201855A0688CF76E ++:1021B000E0F901208CF7F0F9A66066603C342671E6 ++:1021C0006671012002B070BC08BC18470948044978 ++:1021D00088617047C046C4C408006C2108000C2DFB ++:1021E0000800201A080024860E0066020800640217 ++:1021F0000800895909009F48A0498865704700B5C3 ++:102200009F4A9007800F01D1116808E0121AC000A0 ++:102210001368C3402021081A516881401943C90F2F ++:1022200098480170984A1068002817D0974A0260B1 ++:102230004CFCFF7E5B0900974A8260974AC26001AE ++:1022400023964A13700023964A1360964A136096A9 ++:102250004A1360012902D100F007F802E04068C586 ++:10226000F785FE08BC1847000000B500F003F80829 ++:10227000BC1847000010B564238C48037000238C01 ++:102280004803608C4803608C4C236000F04FF87D5D ++:102290004A9007800F01D1116808E0121AC000139C ++:1022A00068C3402021081A51688140194301204029 ++:1022B00007014015D081490B68001403430B60806F ++:1022C000490B68804803400B6004390B680120808B ++:1022D0000303430B607C4B7D490B6003037C490B7C ++:1022E00060684A9007800F01D1116808E0121AC097 ++:1022F000001368C3402021081A516881401943C95E ++:102300000011D5744C2368002B02D0201CB7F705B0 ++:10231000FC7149201C00231A1CB7F7E0FB6F480131 ++:1023200068201CB7F7E6FB8EF762FA10BD10B56C9B ++:102330004C234CFCFF795C090068012423436A4C60 ++:10234000236001239B03694C2360504A9007800F50 ++:1023500001D1116808E0121AC0001368C34020219F ++:10236000081A516881401943090105D55E48036880 ++:10237000022003435C4803605D4800218160F42132 ++:10238000C16020210161E8218161E92141611021C1 ++:1023900041624021C161016205239B04036010BDBD ++:1023A000F0B582B0071C01910C1C002200920123A1 ++:1023B0005B0250490B604E490E68360C3604211CF6 ++:1023C000242903D0151C25291CD102E008240A2148 ++:1023D0000AE070300078022802D10824464801E063 ++:1023E000012446480278012123010D031D431307F0 ++:1023F0001B0D1E43FB7B002B00D1E4E00123DB031C ++:102400001E43E0E0019B5B003D481C5A3D498C4265 ++:1024100011D18023DA5D3C48135C1B013B4818183E ++:102420008388002B07D0374C1034837A012B06D1D8 ++:10243000344C20344CFCFF745D090003E0002C0197 ++:10244000D1251CC3E0381C8CF79CFB002800D04031 ++:102450002431480368002B07D0602C01D1E02464AC ++:10246000E0702C08D1D02460E00198042801D0024B ++:102470002801D101252D04302C4FD17023D85D00C7 ++:10248000284BD0214C703450E0C0464D5B0900A071 ++:10249000190800C005080030C8080044060800B14B ++:1024A0005B0900E15C0900155F0900B8050800340C ++:1024B000C8080038C808003CC80800D0050800401B ++:1024C000C8080048C808004CC808009C800E0010CE ++:1024D000800E00FFBFFFFFFF030000BC820E001054 ++:1024E000000C0068500800673D0200D40508007029 ++:1024F000010F005C000F0074820E000C800E00982B ++:1025000006080090060800D8050800100100009099 ++:1025100005080024500800D4C40800502C05D13B05 ++:102520006FDB0502D501235B041D432543FF231107 ++:102530003370339C42034CFCFF6F5E0900D02309CB ++:102540005D48C15C0091302C0BD17023D85D002810 ++:1025500007D1381C2830037D807A19180906090E26 ++:102560000091009803031D43FB7B002B02D0012345 ++:10257000DB031E43FB7C032B04D1788CC306180FAE ++:1025800003021E43402C25D14C480378002B06D073 ++:10259000381C8DF774FE03071B0A1D431AE0012344 ++:1025A000DB041D43B87B9BF7FFFC4008444A1060E6 ++:1025B000444A11689BF793FC434A1060434A1368EE ++:1025C000984204D2381C8DF73AFE002802D001232D ++:1025D0003A4803703E480560466002B0F0BC08BC53 ++:1025E0001847F0B582B00F1C051C00220092019024 ++:1025F0008CF7CBFA364E002844D034682F48017847 ++:1026000000291AD1A87B9BF7CFFC40082C4A106008 ++:102610002C4A11689BF763FC2B4A10602B4A136805 ++:10262000984204D2281C8DF70AFE00281BD00123F3 ++:1026300022480370274B1C404CFCFF6A5F090015C1 ++:10264000E06B6E1B0612D4012910D1281C8DF7FAFD ++:10265000FD00280BD1A87B9BF7AAFC41081A4A1160 ++:10266000600023174A13700123DB041C4314480342 ++:1026700078002B03D001988CF734FF0090174B1C87 ++:1026800040009803071B0A1C433460042F01D0024A ++:102690002F05D13368012109040B43012107E01004 ++:1026A000480378002B06D033680E490B40002133D5 ++:1026B000600B48017002B0F0BC08BC184724060843 ++:1026C00000B805080038C8080034C808003CC8082D ++:1026D00000CC05080070820E00FFFFF7FFFFFF0F20 ++:1026E000FF45C80800FFFFFEFF30B5041CC37C0394 ++:1026F0002B27D1037D0C2B24D11830437B002B20BA ++:10270000D121490B699C4202D18B68002B13D04127 ++:102710008900680B1858010509A07B9BF748FC85C8 ++:102720004201D3281A03E0431B01200007C01A838B ++:102730001F1648834205D3201C734CFC6365600957 ++:1027400000F7C8FA201C72F756FF237D022B03D036 ++:10275000032B01D0042B07D10F480379002B16D08F ++:10276000201C70F79FFD12E00C480369002B02D07B ++:10277000201C70F734F806494123585C012804D026 ++:10278000002804D10B689C4201D172F7C2FA30BD17 ++:102790006C210800FBFFFF07A42C0800642C080034 ++:1027A0004CFCFF4861090070B5041C002538484303 ++:1027B0006912219B0708D5364A1068364A106050C6 ++:1027C000304079122800D8011C43209DF76CF83264 ++:1027D0004BA360324B2361201C0830AAF70DFF2168 ++:1027E00068086063681D60AAF776FF201C1030AA95 ++:1027F000F703FF216808600420AAF785FF606106DF ++:102800002801DAAAF768FF201C0830AAF7F5FE2194 ++:102810006808606368002018600420AAF774FFE06D ++:1028200060201C1030AAF7E8FE2168086063680089 ++:102830002018600420AAF767FF6061E368C61A30B9 ++:102840001CAAF7B7FF042817DD01350C2D14D03072 ++:102850001C042E08DDAAF7ADFF8100081A216908C3 ++:102860001802382061CFE7AAF7A4FF8100081AA157 ++:1028700068081A0230A060C6E7A16820690B1AE355 ++:10288000614018C30F18184310236270BDC046186A ++:102890001B0800D4CC080034A70900FF0300000186 ++:1028A000FCFF4CFC0543620900FF4CFCFF58620929 ++:1028B00000F0B5444D2B68987B9BF73BFB46082BFB ++:1028C00068996C301C9BF7D0FA041C2868011C9492 ++:1028D000314A88002A10D094420ED9037D0B2B0B6D ++:1028E000D00D2B09D070F79FFB2B686433197F0143 ++:1028F0002000037BF771F864E00B7D002B06D0CB42 ++:1029000088F31A1B041B0C9C4200D81C1CC36F6468 ++:1029100030002B06D00B89F31A1B041B0C9C4200C1 ++:10292000D81C1C8A88B31A1A04120C944200D814BA ++:102930001C0B881F1FBA4204D3CB7C022B01D3008F ++:1029400023CB74214E33889C4204D80020BA422EF7 ++:10295000D303202CE073889C4201D8042228E0B3E2 ++:10296000889C420BD9007F74F7C1FE002814D00365 ++:102970007C112B11D115494B889C4203D8296894AE ++:1029800031052215E08B889C420DD82968943106C8 ++:10299000224A745E2383740CE0F3889C4203D82996 ++:1029A000689431062204E029689431074CFCA15355 ++:1029B0006309002200E0021C4A740B7E012B04D143 ++:1029C000531F012B01D804234B74F0BDB421080020 ++:1029D00034020800EC02080010B5A3F7D3FB0B4942 ++:1029E0004B699B070FD50A48036801200343084839 ++:1029F00003600A249BF750FD013CFBD104480368A7 ++:102A00005B085B00036010BC08BC1847181B08007B ++:102A1000F0FC0E0010B5094C2C220949201CBEF711 ++:102A2000E1FA0849E160084B1C6010BDC27B4A40D6 ++:102A300002D0838C05490B607047C04638A7090057 ++:102A400034CC0500CD63090010040800CC8A0E00C8 ++:102A50004CFCD418640900F0B581B0041C002100BE ++:102A600091C56D8726F600002D04D1301C9BF7A67A ++:102A7000F8051E03D0301C9BF7A1F80090264F3BB1 ++:102A800068002B08D1301C08309BF798F83860316B ++:102A90001C0831BEF7B8FD20480368002B0DD1306B ++:102AA0001C08309BF78BF81C4A1060311C0831BEA3 ++:102AB000F7AAFD19480368002B07D03B68002B04D8 ++:102AC000D0002D02D00098002817D1E02300201854 ++:102AD00051E565E4210B59DB0208D4635810480323 ++:102AE000430B515022206807217DF7D6FA0D480389 ++:102AF00068002B0DD19BF76EF80AE0E5656060E495 ++:102B0000221359064883431351206807217DF7E5B6 ++:102B1000FA002001B0F0BD444408009C44080000C5 ++:102B2000001000600308004CFC78F064090030B528 ++:102B3000E4221358012109058B431350051C79F732 ++:102B40002AFA0024002800D0EC65E86D002802D0A5 ++:102B50009BF75BF8EC656868002802D09BF755F896 ++:102B60006C60074D2868002802D09BF74EF82C6057 ++:102B7000054D2868002802D09BF747F82C6030BD2F ++:102B8000C046444408009C44080000231360012808 ++:102B900005D10123DB040B6007239B0313607047FF ++:102BA00000004CFC748C650900B0B503685B01192A ++:102BB00048C21880270F404906490E906800282710 ++:102BC000D00568281C041C002F06D0437B8B4201D3 ++:102BD000D0002300E0012306E0037B5B088B420169 ++:102BE000D0002300E00123002B0FD0A84205D11311 ++:102BF0007C002B02D1D37F022B0AD0111C08319B01 ++:102C0000F7BCFD201C9AF7AAFF02E00068A842D991 ++:102C1000D1B0BDC0467C2908004CFC1E18660900D6 ++:102C200010B5002907D0041C70F798F9201C6EF726 ++:102C300003F9012000E0081C10BD4CFC4458660953 ++:102C40000000B50D48B6F707FE00BD30B5051C0005 ++:102C5000240A49A300C818C378AB4204D1A300C812 ++:102C6000180421BEF7A5FC0134082CF1D330BD00B7 ++:102C7000B50068FFF7EAFF00BDB8520800504708EA ++:102C8000004CFCFFA066090030B5104D0D24281C37 ++:102C90000022111C90F720FA281C90F713FA203517 ++:102CA000013CF4D130236343094818182C23195CE4 ++:102CB000022904D1406A002801D09AF77BFF013431 ++:102CC000022CEFD390F7C8F930BDC0467C2908002C ++:102CD00080590800F0B582B0051C0E1C041CB034ED ++:102CE0006946207B9BF7D3F82C482D4A1178431A6C ++:102CF000F6000198991940182A4B984201D30320F5 ++:102D000005E00121284B984200D30221081C0099BC ++:102D100043185808031D5808860176092188301C7D ++:102D20009BF76AF86788391C77F7E6FA381A430880 ++:102D3000AB80831958014009A0601422291C1B484C ++:102D400003F0A8FD02B0F0BD10B5041C18490868D6 ++:102D50000007000F01280BD80B683F20000203403A ++:102D6000190A144A906EFFF7B5FF134A9378A374BB ++:102D700010BC08BC184710B5041CB3F7B7F80F49CE ++:102D80008B78004CFC419B6709002B07D1A37C0B7F ++:102D9000498878834202D0201CB3F787FE10BC0814 ++:102DA000BC18470E02000038A40900A903000071F6 ++:102DB00002000000980E00A88B0E0038B0080074C6 ++:102DC000150800AC2108004CFCFFEC670900F0B5C9 ++:102DD00084B0061C181C01AB07C300252C1C03F093 ++:102DE0005EFD00902F1C0199002918D0F37F022B63 ++:102DF00015D1337C351C002B01D00C3500E0083593 ++:102E00002A68101E00D01068002A07D0116891426D ++:102E100001D12C6001E00B6813600C6014E0357484 ++:102E200012E00A6801928A4201D1F76001E013685A ++:102E30000B6001990F60002C04D02368136022609E ++:102E4000141C01E0141C1260F1680029E9D115E09E ++:102E50001A680193111C9A4201D1B76004E013680B ++:102E600001B40298036001BC0F60002C04D02368F9 ++:102E700013602260141C01E0141C1260B368002B64 ++:102E8000E6D1002D0BD02A68002A05D01368036014 ++:102E90002B681860286007E02860006004E0F37F7A ++:102EA000022B01D10323F377009803F000FD12E019 ++:102EB0002068051CA04201D1002401E003682360C2 ++:102EC0002F600399002904D0024CFC7DE7680900BB ++:102ED0009900229CF731FE01E09AF726FE002CEAC9 ++:102EE000D104B0F0BD0A480B4908600B480B4908F3 ++:102EF000600B480C4908600C4B0C490B600C4B0DE7 ++:102F0000490B600D4B0D490B600D4B0E490B60706A ++:102F100047C970090064C80800236F090068C80821 ++:102F200000E975090080C80800196A090054C8083A ++:102F300000096D090070C808006976090078C808A2 ++:102F40000064A30900B00608004CFCFF9869090062 ++:102F500070B5051C7CF755F8011C041CEA691204C5 ++:102F6000D20F2273032363730C34414B186800099A ++:102F70000226800706D5F42043599B0702D5A67088 ++:102F80003C480660F4204359DB0601D4002A01D1F5 ++:102F9000002000E038484860281C90F7E6FC002339 ++:102FA000364A137070BD30B5041C0D1C7CF729F82F ++:102FB00033494B681A7BD207D20F02730523437340 ++:102FC0008573304A4260011C201C90F7CEFC30BD56 ++:102FD00010B5041C0321FFF7E6FF294A5368987BCC ++:102FE000244A1060201C8DF7D0FF10BC08BC184785 ++:102FF00070B5041C7CF705F8011CE2691204D20FBD ++:10300000027304234373F8231D59837B0126B343C2 ++:1030100035402B438373F8263559AD07ED0F022653 ++:10302000B3436D002B4383730C30002A0CD1164A36 ++:10303000537815785B199578EB18D578EB181579D6 ++:10304000EB185279D31800E00023C34CFCFF936ABD ++:103050000900700F484860201C90F78AFC70BD0082 ++:10306000B5094A5168897B8B07DA0FC907C90F8DEB ++:10307000F7CCFF00BDC046641B080088500800D391 ++:103080004902005CC80800F44408008B710900E89C ++:10309000500800094A020010B5041C6D4A1068C0AF ++:1030A0000702D4112323702BE008790002C97808A5 ++:1030B00043012178F76FF8002803D0F8221158490E ++:1030C0000701D51223EEE7C169090403D4F4210BEB ++:1030D000589B060DD55F4B19684906490FF422121B ++:1030E000589207920F914203D15B490B78002B0154 ++:1030F000D00C23D7E701230B7028342370FFF72B64 ++:10310000FF10BD30B5051C0C1C031C283301201812 ++:103110007001F0F4FA002801D10C2022E02079009F ++:1031200002E1780843012178F735F800280BD0F840 ++:10313000221158490701D40B2013E0F43003685BD7 ++:103140000601D40E200DE04249086840064CFCFF01 ++:103150008E6B0900400F022808D1414A1188601D7A ++:1031600001F040FA002801D10D20287030BD30B5A3 ++:103170008A7B002A01D1122340E0374CCB782068AB ++:103180000225002B06D0012318432060364803682F ++:103190002B4305E001239843206032480368AB438A ++:1031A000036031480B7903704B7943708B798370DE ++:1031B0002F48CB79202B02D12E4B186002E02D48EE ++:1031C000402BF9D0487A00020B7A184340102A4B62 ++:1031D0001860C0006080C87A00028B7A1843204BC8 ++:1031E0001880487B00020B7B1843244B188024482E ++:1031F0000280CB7B244803700B7C2348037030BDD6 ++:10320000164A1168C907C90F817317490B78C37330 ++:103210004B7803748B784374164A1168090A8174D9 ++:10322000164A11684900C174090A01750D4A1188CE ++:103230004175090A8175114A1188C175090A01761B ++:1032400010490B8843760F490B7883760F490B4C56 ++:10325000FCFF896C090078C3760E23C3707047C0E9 ++:1032600046641B08005CC8080060A40900301B0805 ++:1032700000A80608001E200000940608003A40003E ++:10328000009006080062A4090064A4090065A7096B ++:103290000066A7090010B5041CFF20052193F779EB ++:1032A000FF002806D016238370C470210A01719391 ++:1032B000F7FBFE10BD10B5041CFF20052193F76934 ++:1032C000FF002806D018238370C470210A0171936F ++:1032D000F7EBFE10BD10B50024201C00F0F0FB0140 ++:1032E00034042CF9D31821AB48BEF754F901F04C43 ++:1032F000F8A9480268D10708D55106490F022904E8 ++:10330000D1A64A116872230B4313600023A4490B12 ++:1033100070A4490B704088C010A3490860A3490BF2 ++:103320007010BC08BC184730B5051C00244E236340 ++:10333000439F481818811C281C062203F0B5FA0088 ++:103340002803D1201C00F0BBFB02E00134042CED6B ++:10335000D34CFCFF846D090030BD00B500214E2028 ++:103360004843954A8218507800021278104302D0E0 ++:103370008DF7D8FC07E001310429F0D300238F49F1 ++:103380000B708DF708FE00BDF0B5061C0425002467 ++:10339000894F4E206043C019811C301C2830062202 ++:1033A00003F086FA002801D1251C02E00134042C28 ++:1033B000EED3042D0DD100244E206043C11948786E ++:1033C00000020978084301D1251C02E00134042CD5 ++:1033D000F2D3042D18D24E236B43DC19311C283153 ++:1033E000A01C0622BDF7B8FD5C20805B2070000A9F ++:1033F0006070311C201C083000F0F6F9311C2831B7 ++:103400006F480622BDF7A8FDF0BDF0B5041C0F1CE7 ++:1034100000264E207043684BC518A91C381C062294 ++:1034200003F046FA002803D00136042EF1D326E03B ++:10343000201C78F77EFA291C0831201C00F085FA40 ++:10344000E0690F21C9050843E061201C0F230386B2 ++:103450003030864CFCFF7F6E09008D69780C022AA3 ++:10346000781443A64205D0584A0121B14013688B15 ++:10347000431360554A0123A3401168194311608426 ++:1034800085012000E00020F0BD10B582B006224F7B ++:10349000496846BDF764FD0024694606236343403E ++:1034A000481818062203F007FA002801D00120036B ++:1034B000E00134042CF0D3002002B010BDF0B5823E ++:1034C000B0071C062243496846BDF749FD00243475 ++:1034D0004E0622151C65436946A81903F0ECF90055 ++:1034E0002806D1391CA8190622BDF739FD01200391 ++:1034F000E00134042CEBD3002002B0F0BDF0B504A1 ++:103500001C0E1C171C344DFF2001302058002801D0 ++:10351000D0B6F794FAF8210859C00700D491E0001A ++:103520002E00D18EE0002F00D1A5E00859800700C1 ++:10353000D4A1E0201C6DF7C3FCE069F8218843406A ++:10354000210843E061F822105904229043F8221028 ++:1035500051201C90F74CFCFF7A6F09007DFD20681C ++:1035600000216DF7EBFC164A1378002B0AD0E069B6 ++:1035700000043CD41B4880791B4A1178014001D1DA ++:10358000002832D1261C5C36318800231A1C181CF6 ++:1035900094F7A2F83088FFF798FE00232B700848B4 ++:1035A00003701048037022E0C046BBA50900641BED ++:1035B0000800301B08005CC808005DC808009006C1 ++:1035C000080065A70900D3A50900BFC10800B7C15D ++:1035D0000800D020080054A309005CA3090064A7D8 ++:1035E000090038A5090066A7090001232B70201CDB ++:1035F00028308DF787FBE069000414D48DF7A4FB15 ++:103600008DF774FE012801D18DF793FB982108599D ++:10361000C00008D5E06C032189068843E064201CC3 ++:10362000012181F77FF80023B9490B70A36B1B07B9 ++:103630002FD5E06900042CD4B6494B681B0528D56A ++:10364000201C01218DF739FE23E0B249086880076C ++:1036500015D5F8221059084CFCFF75700900210897 ++:103660004310518021E069000400D44900AC4A11A4 ++:10367000600120000778F716FE002E0DD1201C8D6A ++:10368000F7C2FC09E0E069000403D5201C8DF76E49 ++:10369000FD02E00123A34803700120F0BC08BC1820 ++:1036A0004700B5FC300068002801D0B6F7CEF9001D ++:1036B000BD70B59D4D03685B019C49CE18041CFF8D ++:1036C000F76DFEE069000403D4201C00218DF7F89B ++:1036D000FD20687CF7AFFC201CFFF7E2FFE06900EB ++:1036E00006C00E0A2817D1012120688140904803A6 ++:1036F000688B430360201C74F7C1FCE069F82188E3 ++:103700004340210843E061206883F7E4FF201CA0C8 ++:1037100030042103F0DFF8211C301C01228FF7DC7C ++:10372000FCE069F821884318210843E061F821088A ++:10373000590721084340218843F821085120680196 ++:10374000218140CA437B490B6813400B606DF70E23 ++:10375000FBE069000402D42B784CFCFF7071090077 ++:10376000012B04D05C342088FFF7A6FD01E0002384 ++:103770002B70012070BC08BC184700B5011C1D202F ++:1037800078F708FE08BC18470000F0B5071C0024B5 ++:103790006B4E0622151C6543391CA81903F096F8D8 ++:1037A000002805D1A8190621BDF706FF012003E076 ++:1037B0000134042CECD30020F0BD70B5061C0025AC ++:1037C0004E236B435F481C18A11C301C062203F0DB ++:1037D0007DF8002803D00135042DF1D310E0221C20 ++:1037E00025329107890F01D1106808E0521AC900EB ++:1037F0001368CB402020411A50688840184300E0ED ++:10380000002070BDF0B5002900D1ABE0041C00D150 ++:10381000A8E0C8694005400F2070C8698004400FC7 ++:103820006070486BA21C93079B0F01D1106006E0EB ++:103830001070000A5070000A9070000AD070886BF7 ++:10384000A21D93079B0F01D1106006E01070000AC3 ++:103850005070000A9070000AD070C84CFCFF6B7268 ++:1038600009006B221C0A3293079B0F01D1106006DE ++:10387000E01070000A5070000A9070000AD07008C2 ++:103880006C221C0E3293079B0F01D1106006E010D2 ++:1038900070000A5070000A9070000AD0700D1C5021 ++:1038A000352888A074000AE074AB782375EB786340 ++:1038B00075CB7BA3758B7EE375CB7E237624480383 ++:1038C00078637698204058400FA076E889E076002B ++:1038D0000A20770F1C9C37B86D221C1D3293079B62 ++:1038E0000F01D1106006E01070000A5070000A90BD ++:1038F00070000AD070261C2036C86C4001C00F70C2 ++:1039000070C86C0001C00FB070C86CC000C00FF070 ++:1039100070C86C8000C00F30711022291C103170EB ++:103920001D17E05CC80800181B0800641B0800D4C1 ++:103930005008005DC8080064A709007C290800E45D ++:10394000C70800B4C40800BBA50900D3A509003C02 ++:10395000A40900BDF712FB1022291C20314CFCFFEA ++:1039600066730900301C1530BDF70BFB4534F87841 ++:103970002070F0BDF0B5002800D1B8E00C1C00D1DB ++:10398000B5E04978CB0022785207520F1343C26941 ++:103990003F2109028A439906890C0A43C261A31C8C ++:1039A0009A07920F01D1196808E09B1AD2001D688E ++:1039B000D54020218A1A5968914029434163A31DAB ++:1039C0009A07920F01D1196808E09B1AD2001D686E ++:1039D000D54020218A1A5968914029438163231CCC ++:1039E0000A339A07920F01D1196808E09B1AD20096 ++:1039F0001D68D54020218A1A596891402943C16326 ++:103A0000231C0E339A07920F01D1196808E09B1A04 ++:103A1000D2001D68D54020218A1A59689140294357 ++:103A20000164061C5036E17C0902A27C11433180FE ++:103A3000637DF370237DB370A37DC373E37D8376D1 ++:103A4000237EC376A37E98210A58D200D208191C7F ++:103A50001D2349070A4398210A50217F0902E24C9D ++:103A6000FCFF617409007E1143F181071C9C372221 ++:103A70001C1D329107890F01D1156808E0521AC93F ++:103A8000001368CB402025691A55688D401D43BD41 ++:103A900065251C20356B78002B04D0C16C01229267 ++:103AA000061143C164AB78002B04D0C16C0122D253 ++:103AB000061143C164EB78002B04D0C16C012212C3 ++:103AC000071143C1642B79002B04D0C16C01225231 ++:103AD000071143C1641022691D301C1030BDF7541A ++:103AE000FA1022291C1531301C2030BDF74DFA4543 ++:103AF000342078F870F0BD10B5042810D24E214162 ++:103B00004334484418002020706070A01C0621BD7A ++:103B1000F75DFD314A1188201C0830BDF757FD10B4 ++:103B2000BD70B5FF230133C458002C03D0201CB551 ++:103B3000F79AFF0CE0061CC518142099F7EDFF0456 ++:103B40001E0ED02860321C25490023B5F76DFF24D6 ++:103B50004A11682448BDF754FE011C201CB5F76FBC ++:103B6000FF4CFCFF5C75090070BD10B5041E13D03E ++:103B7000F830006840070FD5201C28308DF7D7F8A3 ++:103B80001B490B68FF2B01D08DF7F3F8E069F82192 ++:103B9000884340210843E06110BD10B5041CFFF7C5 ++:103BA000E4FF13225C23195B002093F74EFCE069CD ++:103BB0000006C00E0A2803D10A21201C79F785F8D7 ++:103BC000201C7FF75AF8201C7FF785F9201C7FF70F ++:103BD00071F8206877F7CDFC10BDC046D3A5090069 ++:103BE0003EA40900F345020040A40900D4300000BF ++:103BF0008C06080010B5AC4AAC4900780302AC4C06 ++:103C000020680004184308601078C302086818434D ++:103C100008606068000423681B0C184348605078F3 ++:103C200088600020C860012010BC08BC184710B58F ++:103C3000041C00290AD18DF7F3FD70342078042884 ++:103C400015D19C484379012B11D10EE0022906D1F0 ++:103C50005030407F76F71DFD0023A38107E0052942 ++:103C600005D1004CFCFF57760900F0E7F800280169 ++:103C7000D18DF7B9FB10BC08BC184770B5904D2B1F ++:103C800068FF2B56D1002077F7E0FA2860FF285014 ++:103C9000D001238B4803608B4803708B4C0323E3D4 ++:103CA000748B480168201C6FF71DF92523237402CB ++:103CB0002363743323A374201C7030042303700027 ++:103CC00023437023632384824803685B0063842456 ++:103CD0002000230355E3818EF771F8286877F77386 ++:103CE000FD7D4E30607368802003437360286877E1 ++:103CF000F7F2FC211C503103680B77C269C86807D2 ++:103D000026B0433240104301225202104380221059 ++:103D100043C8600023CB750B6813430B6001238BF2 ++:103D20007702234B776D496D488DF7A8FB201C6FF8 ++:103D3000F75CF8012070BC08BC184770B5061C047D ++:103D40001C0023674803605F480378002B04D140C0 ++:103D5000235C490B60980527E04B0704D57034209D ++:103D600078042867D14CFCFF5277090044E08B07A8 ++:103D700024D5351C70352B78022B5FD169785648D5 ++:103D800002685A4803684B43301C934213D95300CE ++:103D9000638418360123737304232B703323A374B5 ++:103DA00000236B706FF7C2FA2023474E3360D805AB ++:103DB00078F791FA42E0013169701EE0CB073DD5FA ++:103DC000351C70352878022838D315D0042817D32D ++:103DD00034D147490868430E47490B6047488DF77F ++:103DE00044FB02232B704823A37440490B685B00FB ++:103DF0006384183401236373301C6FF797FA1DE056 ++:103E0000102331480360180678F765FA33480368D1 ++:103E10005B00638418340123637304232B70002335 ++:103E20006B70301C6FF7E0F835493548062202F018 ++:103E300062FD002802D133486FF7D6F870BC08BC89 ++:103E4000184731498868002805D0007C24380128AB ++:103E500001D8012000E00020704700B51D211C485A ++:103E600002F051FD1921274CFCFF4D780900480252 ++:103E7000F04DFDFF23274A1360144A1360002326E8 ++:103E80004A1370FF23254A13608DF7B4FA00BD1062 ++:103E9000B583B0041C0C22E92109036846BDF782F2 ++:103EA000F8694600200A7801312254174B1A540150 ++:103EB000300628F7D34B78A37103B010BD65A7096E ++:103EC00000B8890E0038800E00A42C08008C06086B ++:103ED00000D4500800BEC10800F0500800B0060829 ++:103EE000009006080000820E00D850080064000808 ++:103EF0000018800E009806080098830E00E4500811 ++:103F000000E05008000BA70900E8500800645108C1 ++:103F1000006C21080088060800BFC1080050A409F1 ++:103F20000000B5002346490B7046490B7046486FA8 ++:103F3000F79DF846490868FF2804D077F724FBFF6F ++:103F40002342490B60012342480360424803780141 ++:103F50002B04D18DF782FE00233E490B7000BD106B ++:103F6000B5041C70342378022B4CFCFF48790900FF ++:103F700024D13B4B1968043B1A68CB0717D4530371 ++:103F800015D54B0313D50723DB040B400FD1530684 ++:103F90001A0F032A0BD18B05DA0E082A01D00C2A3E ++:103FA00005D13048FFF777FF0323237006E0CB07E6 ++:103FB00004D46378013363706FF7BFF910BC08BC99 ++:103FC000184730B582B0041C27490B7E002B39D12D ++:103FD00026490B68702003401D09A37BAB4231D0FA ++:103FE00023490B68FE20034000D00123002B26D17B ++:103FF0000020B2F7D5FE002821D11E490B689B0690 ++:104000001DD48BF70BFE002819D16946281C9AF79E ++:1040100070F868466FF7F7FE68469AF79DF800203B ++:104020009AF7FDF81448002343628362009B9B08C3 ++:104030009B00416B59180B011B09436302E0A07BF5 ++:104040009AF7EDF802B030BD5CC80800BEC10800A8 ++:10405000F05008008C060800D4500800BFC10800CA ++:104060002C8B0E0038A509002C2D084CFCFF437A40 ++:1040700009000024860E00B4C4080008800E006CFD ++:10408000210800037B0C30FF2B04D14378202B0147 ++:10409000D1002000E001207047F0B582B00C1C0177 ++:1040A000D10420A3E0051C52480268002A08D02849 ++:1040B0001CC3F715FF002803D0FF300006000E9543 ++:1040C000E0F82148590007800F01282DD1E8690048 ++:1040D000042AD4237B5B0827D0474908688007233C ++:1040E000D5201CFFF7CEFF00281ED0281C28308DBD ++:1040F000F73DF9F822505902229043F822505120FE ++:104100001C99F735FD0821281C7EF789FC8CF77077 ++:10411000FF0123394A1370394A1168281C8CF7575C ++:10412000FF281C8DF793F8BBE72F687B0135481EED ++:1041300018F37F012B55D0237B5B080ED1637B05E1 ++:104140002B02D1304900910DE030490091042B0938 ++:10415000D0DB002E48C218009204E0201C0C307AFC ++:10416000F75AFD009000990B79637700234CFCFF10 ++:104170003E7B0900236002F0BCFB01900099486877 ++:1041800040010BD4B068002805D003682360B368F1 ++:104190001C60B46011E0B46024600EE0F068002898 ++:1041A00005D003682360F3681C60F46001E0F460EC ++:1041B0002460211C281C90F78CF80123BB40164971 ++:1041C000086818430860019802F09BFBE869000644 ++:1041D000C00E0A2803D1381C73F7A5FF09E0082890 ++:1041E00007D1381C6CF758FE03E0201C99F7C3FC7C ++:1041F0005AE7002002B0F0BDC046BCC80800641BEE ++:104200000800BFC10800885008007C29080044A3AA ++:1042100009004CA309006CCF05007429080070B593 ++:1042200082B0002301935F490868202800D1B6E0DE ++:1042300010285AD15D49086877F75FFA051C5B4E74 ++:10424000301C76F782FF002811D0041CF822135886 ++:1042500001221343F8221350EB69C06907210B4078 ++:1042600088431843E061286877F798F90CE02C4CF4 ++:10427000FCFF397C09001C311C281C28300622BC9C ++:10428000F79FFEF820435902208343F82043513121 ++:104290001C201C8CF7E5FD002805D0F820035901EF ++:1042A000200343F8200351201CFFF756FC02F024A2 ++:1042B000FB012321688B40404A11681943116002B9 ++:1042C000F023FB20686CF7F9FCE369F820834310C6 ++:1042D000200343E361206801216CF75DFE201C8F01 ++:1042E000F799FE201CFEF7C6FEFF233148036059F4 ++:1042F000E0FF23013398424AD12E4876F729FF0484 ++:104300001E50D077F795FBE369012000068343F840 ++:1043100020834310200343E361E36C5B005B08E30D ++:1043200064EC210B59000683430B51201C00217BB8 ++:10433000F70DFC201C00217BF764FC6B4601AA21D1 ++:104340001C4C31201C283096F764FA002806D00156 ++:104350009B002B03D0201C7BF75CF803E0211C00A2 ++:104360002078F73EF8FF23124803601448036801E1 ++:104370002B4CFC5C347D090018D1E3691B0415D477 ++:1043800011480368002B03D1104803680E480360EE ++:104390008CF700FD0AE0402802D18DF7D8FC05E03B ++:1043A00001235B02984201D18DF769FC012002B024 ++:1043B00070BDC046D45008008C060800E8500800C4 ++:1043C000B4C4080088C808008850080048A4090040 ++:1043D0004CFCFFBC7D09009F480023036083607094 ++:1043E0004770B59D490B68180A9D4A402803D19C27 ++:1043F00049D1609C4906E09C490143D16003021900 ++:10440000189B4BC9189B4D29609B4C9B4963685B6B ++:104410000E2468E407E40F634009D0402807D17FE9 ++:104420002464020B68964D2B400125ED0406E0FD47 ++:104430002424020B68924D2B400325AD040B600B26 ++:10444000682B430B6000238E4E336003040B21095D ++:104450000459182143032631438B4E31600F30102D ++:104460006070BD10B57C4A1368002B05D061210136 ++:10447000220A546EF75BFF05E0041C6EF7B5FD20C1 ++:104480001C00F0B0F810BC08BC184710B5041C7E26 ++:1044900048416A002902D1836A022B09D903290401 ++:1044A000D1836AFF203630834202D2201C6EF7F798 ++:1044B000FF60237648195D405C80210143754A11F5 ++:1044C000606D480368744A136043681720800603D0 ++:1044D00043534CFCFFB77E090060FFF785FFA37BC9 ++:1044E000704A136000236F4A1360082113206DF790 ++:1044F00067FE10BD30B5041C002927D1FFF7C9FFA6 ++:104500006A4D61342178694A0023D056012907D1C8 ++:104510007DF7B5FF0006010C2868654A104006E0EB ++:104520007DF7ADFF0006000E2968090A090208435D ++:1045300028604A4A11685F484143494A1068000AA6 ++:104540000430BDF76CF95C4A106014E0022907D111 ++:1045500001235A490B604034607F76F7A5F80AE0E2 ++:10456000052908D1002355490B60FFF76EFC002890 ++:1045700001D18CF740FF30BC08BC184700B5374A62 ++:10458000011C1368002B0DD09368002B0AD193896E ++:10459000936060310A780023022A00D2531C0B700A ++:1045A0006EF7C8FE08BC184700002C49037D022B9B ++:1045B00007D10868431E00D30B608868431E00D3F0 ++:1045C0008B60704710B5037D092B0CD13D4C3D4AE3 ++:1045D000106877F74CFC70B27F090000F92060602A ++:1045E000688021884360603A4AD078206210BC0815 ++:1045F000BC184770B583B00024364E4E256543ABDA ++:1046000019991C3548062202F07DF9002803D001D3 ++:1046100034042CF1D305E0A9194878000209780880 ++:104620004300E0002001A9C8700821000A02AA1076 ++:1046300070012301A883706846831D2848032293D4 ++:10464000F70DF803B070BD4CFCFF1E800900F0B5FB ++:10465000061C0F1C054C6368FF2B45D1012076F723 ++:1046600003FE6060FF283FD100207FE04CA40900DA ++:1046700094060800C8890E0040C07DC0447E00003A ++:1046800000D07DC0043E00008C800E0040A50900D3 ++:10469000B88A0E00FFFFC3FF94830E0098830E00BC ++:1046A0006C210800A8060800A4860E0040820E00B7 ++:1046B00000830E00F8800E0004830E0092030800B1 ++:1046C000FF00FFFF710200009C830E00F0FC0E0053 ++:1046D00000820E0050A409000BA70900D3A5090011 ++:1046E000B7C10800B6FC00002A4D0123EB74216914 ++:1046F000281C6EF706FC2760A389A360264979432E ++:1047000026480068000A0430BDF790F82449086084 ++:1047100024232B7402236B743123AB74281C603068 ++:10472000002303700123437000238370C3702B6246 ++:104730005D2002234355606877F754F8A87301237E ++:10474000EB73184F391C301C8C4CFC791981090013 ++:10475000F7A7FE606877F749F8391C6EF74AFA3117 ++:104760001C13480622BCF729FC2169281C6EF7DBC4 ++:10477000FB0120F0BD09480368002B00D001230095 ++:104780002B09D0007D002806D0072801D00020008A ++:10479000E00120002800D00120704764510800711A ++:1047A000020000940608009C830E0040A509000B3F ++:1047B000A7090000B5F8210B585B0702D40421803B ++:1047C000F720FB00BD4CFCFF9881090030B5051CAB ++:1047D000041C08790002C9780843012176F715FD09 ++:1047E000002802D112232B700EE00834F42109585E ++:1047F0004907490F00D00121A1715C300088E071A8 ++:10480000000A20720323EB7030BD000070B582B047 ++:10481000051C0024200123181B0145481E18F821FF ++:10482000885940071AD4306876F7DEFF69688842F5 ++:1048300014D1301C77F704F900280FD03D4B69469E ++:104840000B8002238B705C23985BC870000A01A95F ++:104850000870394A6946301C81F78AF801340B2CFC ++:10486000D8D30123354A1376686872F732FE686838 ++:1048700073F746FB6868B2F773F9696830486EF7FA ++:1048800028FE69682F486EF724FE69682E486EF787 ++:1048900020FE69682D486EF71CFE6C68002C45D11F ++:1048A0000C2363432A481D18A87A022831D3042810 ++:1048B0000ED32ED1281C82F704FF061C288000236B ++:1048C0006B72E87976F7184CFC9593820900FFA08B ++:1048D0003006810C3028E0281C82F7F6FE28800084 ++:1048E000236B72EB7999005B189B011B495E1831B1 ++:1048F0001CB831487100230B71C436B379002B15F5 ++:10490000D073792B80B3796B8033796B72281C82DA ++:10491000F7DBFE7071301D07E0002807D0281C82ED ++:10492000F7D3FE2880281C09300023037001340EC1 ++:104930002CB9D302B070BD88380800530C00004376 ++:10494000720100CC2F0800B42E0800682E08001C4D ++:104950002E0800D037080040490800140B08004C0E ++:10496000FCFF7E830900F0B5051C13235B049F4FF9 ++:104970003B60082105206DF706FC9D4F3B689D4874 ++:1049800003403B603B68C00703433B608B4F3B6881 ++:1049900002273B43894F3B60974C98482062012394 ++:1049A000974F3B60974FB868606278686065A86908 ++:1049B0002430C17880220A43934F3A60934E837823 ++:1049C000B07B002B0ED1924D0021B0F72FF9B169C9 ++:1049D000081C243042781302007B18430022B0F7F1 ++:1049E0003CFB09E00121B0F721F98A4D8A4A13689E ++:1049F0000120400603431360884805608848838A85 ++:104A00008848036000232360F0BD05238381836908 ++:104A10002633187801280FD10021CB4382490B603F ++:104A200000234B607D490B68802003430B607A496B ++:104A30000B68800403430B60704700B5C369002B0B ++:104A400023D013235B04694A13605F4A13685D4AED ++:104A500013605B4A1368594A1360554A1368644AE5 ++:104A6000134CFCC779840900607248724A1168418E ++:104A700060724A11684161714A11688160714A131C ++:104A8000680360704A1368704A136061486EF70FDC ++:104A9000FB08BC1847000030B5052383816C4A1120 ++:104AA0006806220A40062A02D181692A3108E08B71 ++:104AB0000702D481692C3103E04B0704D481692EAD ++:104AC000310B8801330B8013235B0449490B605081 ++:104AD00049CB69002B12D1524C2568C37B012B0CAA ++:104AE000D12368802083432360022099F747FC800C ++:104AF000231D43A06899040843A060256030BC08CA ++:104B0000BC184713235B043A4803604148C369005B ++:104B10002B02D1434803680360704700B5002901A8 ++:104B2000D1FFF724FF08BC184700004CFCFFAC86FF ++:104B30000900F0B581B0051C0C1C08790002C97889 ++:104B4000084352D00020ADF798FBFF2801D109237C ++:104B50004CE0071CADF752FB0023038121790902C9 ++:104B6000E27811438186C186051C83F79BF82E1CD1 ++:104B7000B03673885808E8806379252B0ED23948FF ++:104B800000900521BCF763FC6179C8084907490F0B ++:104B900001228A40009B195C11431954B07BFF230A ++:104BA0003D334343314819180091281CAFF74EFD9F ++:104BB0002F4885662521281CFDF7DBFF307B00216F ++:104BC000AFF783FF0523AB80381CAFF7CEFD00990C ++:104BD0009E3101200870381C002100F035F8A279C0 ++:104BE000E179381C00F005F801E012232B7001B0C8 ++:104BF000F0BDF0B50C1C171CADF700FB061C201D0A ++:104C0000B4F7DFFB051E1ED0B18D0B051B0D012077 ++:104C100040031843210408432B1CA907890F01D125 ++:104C2000186006E01870000A5870000A984CFCFFE3 ++:104C3000A787090070000AD8703A06120E210409ED ++:104C40000C281D91F75BF9281CB2F74AFFF0BD3024 ++:104C5000B50C1CFF233D3343430548C51801F074D0 ++:104C6000FDA2352C8001F078FD30BDC046F44E0821 ++:104C700000349D080038B0080000B5C37B012B0547 ++:104C8000D1AC490B78002B01D101230B70B2F7593D ++:104C9000FA08BC1847000000B52C22A749A748BC59 ++:104CA000F7B7F8A648A64B1860A6494160A6498107 ++:104CB00061A649C16100BD00B5017D032901D00491 ++:104CC0002902D1B2F7A2FA09E0037D062B02D10036 ++:104CD000F008F803E0092B01D1B2F7C8FA08BC18B4 ++:104CE00047000070B582B0051C041C8034E37A00D4 ++:104CF0002B08D0036DBE3319780820AEF707FD00EE ++:104D000023A376E3726378032B28D0A87B99F72B33 ++:104D1000F84008218C431A1E04360C618C00291DB2 ++:104D2000D08E421BD36078012806D1688CBCF74C2A ++:104D3000FCFFA2880900D4FC062803D13E2002E033 ++:104D4000042803D008202B6DAF3318700323637041 ++:104D5000281C6EF786F82B6DBE3319780520AEF748 ++:104D6000D9FC31E06068002808D00090002301934E ++:104D70006946A87B99F74DF9002363606378032B9C ++:104D800011D0FF201930285A864209D8A87B85F710 ++:104D90006DFB002804D1281CB2F7A7FD002802D023 ++:104DA0006D49C8780CE06378002B07D16B4BA87B6A ++:104DB000185C032802D26849887801E0664948787F ++:104DC000A874281CB2F783FC02B070BD70B5041C37 ++:104DD0000E1C5A4D2878002802D0013828702878F7 ++:104DE000012804D85E4A13685E490B40136000280E ++:104DF00016D0201C9830C378002B02D18188CA06B7 ++:104E00000ED58379002B11D0311C201CB0F7D1F9BD ++:104E10002B78012B0AD9311C201CB0F79DF905E035 ++:104E2000201CAFF762FE201CB2F70BFC70BDF0B582 ++:104E3000814CFCFF9D890900B0041C051C803500D5 ++:104E400027AF81EF76FF230533C618F37D0133F3D7 ++:104E500075C37B012B13D17378002B19D144480300 ++:104E6000689B0715D5A07B98F785FF80084100A0B7 ++:104E70006981420DD098F719FF4000686008E00191 ++:104E800023737036480378A3740123DB07B361B73B ++:104E900070374800680090830722D535490B685B5E ++:104EA0000602D40098430710D5A07B98F763FF4013 ++:104EB0000828846B78012B08D102236B70236D586E ++:104EC0008900016884201CB2F7AAFAF37D012B0740 ++:104ED000D17DF709FA011C201CAEF7A0FC01F0E51A ++:104EE000F97DF701FAB074009906220A40062A1EDD ++:104EF000D1236DBE33187885F7EDFA201C00F0BF82 ++:104F0000F8F078012804D81B4980000B5C01330BB2 ++:104F100054E37B0099201C002B02D1FFF75AFF01BC ++:104F2000E000F06DF8201CAFF7E3FDAF7234E0B79E ++:104F3000758B074CFCC8988A09002AD5A87A1049B5 ++:104F40000B78984225D21EE0C046FDCC080078E4DC ++:104F5000050080A50900781508002B8809009B89A9 ++:104F60000900ED87090074150800E3C008001C80E3 ++:104F70000E00FFBFFFFFBC8B0E0040150800ECB019 ++:104F800008001CCD0800E37B002B02D00130A87282 ++:104F900006E02B7E002B00D02F76201CB2F758FBAA ++:104FA00001B0F0BC08BC18470000F0B5061E20D0C8 ++:104FB0000768002F1DD0407CADF72EF9051C707CD2 ++:104FC000182141430C484418786890F7CDFD98F7B4 ++:104FD0004EFD381C98F705FD00233360217A01311E ++:104FE0002172217A05480278A88D90F702FD0023EE ++:104FF0002372F0BDC046F4B008007C1508004CFCDC ++:10500000FF648B090070B5051C0E1C041C8034A3C2 ++:105010007F002B1ED0B0F7D3F8184A537C012B0920 ++:10502000D9E37E002B02D1A08BC10603D5311C2809 ++:105030001CB0F798F8CD23585D00280AD0FF23054F ++:1050400033E818837D002B04D04378002B01D10175 ++:105050002383700B490B681B070FD56378022B0C59 ++:10506000D1FF201630285C002807D0A0898004805A ++:105070000E0023002800D10123237670BDECCC085C ++:1050800000E02C0800F0B5041C051C3A480668989E ++:1050900035A8880712F306D90FE9707307D90F03F3 ++:1050A00007DA0F002F04D0344803685B0300D511E2 ++:1050B0001CFF231533E0184378002B03D10029018E ++:1050C000D0012343708A4216D0AB79002B15D10052 ++:1050D0002F08D0D0231859C168C91BC16002D483DE ++:1050E00068DB1983600122AA71201CB2F7EDFB2056 ++:1050F0001CAFF7E0FB01E0002383713307DA0FA850 ++:105100004CFCFF5F8C0900884307D90F8A4234D1D9 ++:105110001C4F397C0A0702D5B304990E2DD1184AC9 ++:1051200013689B0303D5B3079B0F032B25D00421E2 ++:105130004840A880251C5035AE87B304980E1CD07B ++:1051400020221149BB68181D01F004FBCC342078E3 ++:10515000800712D50D490B68012080030340580BCE ++:105160000BD02B68BE331878ADF759F8AF303D211E ++:105170000170012028870023AB87F0BDA88B0E00AB ++:10518000E02C0800ECCC080080980E00BC8B0E00D0 ++:1051900010B51F4C2068002805D08008800098F7C3 ++:1051A00023FC0023236010BDF0B5051CC668B4695C ++:1051B000002C16D0B0F797F9002812D1154F3A1CE1 ++:1051C000211C1331E01CB0F76FF8381C00F00AF80E ++:1051D0000023AB60EB60A008800098F705FC00237B ++:1051E000B361F0BD00B582B0262369460B80019003 ++:1051F000081C76F789FF02B000BD00B54368002B9C ++:1052000004D04CFC1E5A8D09001022044800219243 ++:10521000F768F900BDC046E49C08001CA709001708 ++:105220002000004CFCA0908D0900F0B583B00291E5 ++:10523000FF233D3343432248C618356D01F08BFAF6 ++:10524000371C90372C1CB0348E239A5B02998A1A33 ++:105250001204120C638853433A6FD2185101490962 ++:10526000019101F080FAF37B012B0ED16B8B5B0077 ++:105270000093288B4000019A101841014909181C1D ++:10528000BCF725FAA0800098E080281C82F714FD66 ++:10529000F37B002B0ED1E68870086883A188019803 ++:1052A00098F703FDE288011C101CBCF710FA301AB5 ++:1052B000400828830298431E3B800123BB7203B041 ++:1052C000F0BD349D08004CFCF8348E0900F0B58127 ++:1052D000B00090ACF79CFF041C0027364E336BDB0C ++:1052E000071FD5B4421DD0251C2C354223A97D9A19 ++:1052F0005D914216D1291C1031301C3C3006220130 ++:10530000F039FA00280DD101F025FA051CBE36301F ++:105310007800F036F8281C01F025FA3078AFF75203 ++:10532000FA03E0C03601370F2FD8DB0098B2F7A39D ++:10533000FB251C0123EB852C35201C80F78BFE0000 ++:10534000980021AEF78BF81C4A13681021DB060386 ++:10535000D5A971201CB3F717FA201CB1F7D5FBBEF5 ++:10536000342178FF223D325143144BC9187F23FF6B ++:105370002023300B54A623FF2017300B5401B0F02C ++:10538000BD10B5FF233D3343430C48C418201C8097 ++:10539000304178012907D1418C608CBCF7A3F90614 ++:1053A0002803D13E2002E0042903D00820236DAF5A ++:1053B00033187010BD2890080040150800349D086F ++:1053C000004CFCC0308F0900F0B5061C046D2B4862 ++:1053D00003689E4201D1B0F7EBF8301CAFF727FF0E ++:1053E000351C8035288901380ED32881288904236B ++:1053F0006B70002808D1301C6DF735FDBE34217864 ++:105400000520AEF789F938E0687800281FD1B07B15 ++:1054100098F7AFFC4008B034A16898F745FC012329 ++:105420009B0698420CD267883B1859014909381CE1 ++:10543000BCF730F97843A168081840014009A06022 ++:10544000A06800236B700223F374B06112E002289D ++:1054500010D1AB7E002B0DD0E889298A431A18049D ++:10546000000C074B984205D2EB7A002B02D1301C7E ++:10547000B2F77FF8301C6DF798FEF0BD6C21080084 ++:10548000FF7F00004CFC9028900900F0B5051C1F20 ++:1054900049FF230533C418E378980000230B5443D5 ++:1054A00018581C00230370AF692B6D1889421C2605 ++:1054B0007C688C5043B04063681B18580140093821 ++:1054C0001A01239B06984220D2B31D20789840A34E ++:1054D00068D901EB7B002B00D15143E26882420086 ++:1054E000D3101CBCF7BCF8011C802800D980219F78 ++:1054F000352970074803789E4202D2701C2074043C ++:10550000E000230434191C381C0BC4F0BDC046EC69 ++:10551000B008006F1508004CFCE8C0900900F0B519 ++:10552000061C071C9C373888102101401D490BD0F0 ++:105530001D4BF518EB7898000A5C9301AA68D21805 ++:10554000AA604318597811E0174BF518EB789800CA ++:105550004118487800280DD08C780978614389017A ++:10556000BCF77BF8A9680918A960211C8B01E868C1 ++:10557000C018E8602B7C002B11D1E86800280ED001 ++:10558000AB68D901F37B002B03D1336D1A8901324B ++:105590005143BCF762F8802800D98020F870F0BD34 ++:1055A000C046ECB0080004010000F0B50D1C114C21 ++:1055B00020600B68DB0701D598F758FB0F4E0020E1 ++:1055C000706637680E483840306098F764FE98F788 ++:1055D00062FE2868E0606868A0600220706698F744 ++:1055E0005AFE98F758FE98F756FE37600020E060A4 ++:1055F000A060F0BDC04600820E001C800E00FFFFC0 ++:10560000FFFD4CFC34AC91090000B54068084A131A ++:10561000681979002909D1074A13681B0605D400C7 ++:105620002801D098F7BBF9012000E0002000BDC0A0 ++:1056300046C04F0800E02C08004CFC7CF8910900A3 ++:1056400030B5041C80304378002B1BD10323E37456 ++:10565000252101230B55837E002B07D0236DD98B89 ++:1056600009014184A36903840123C372618CA06989 ++:1056700074F772FD238C984204D02084216DB031E0 ++:1056800088800880FF230133E158E518A06998F766 ++:10569000E3FA216DB2310A88011C101CBBF7D2FF5E ++:1056A000011C201CB2F726F8A3692B60201CAFF761 ++:1056B00034FF00236B7130BD4CFCFF80920900F079 ++:1056C000B581B02F4806682F4805682F4803780039 ++:1056D0002B52D12E480368AB4203D12D480368B347 ++:1056E000424AD02C4C2D4FFE20284007D1002D03DC ++:1056F000D02B480368DB0301D5002E1CD063681B48 ++:10570000071B0F022B02D0022098F739FE25480014 ++:1057100078606324480078A06366F7B7FF01F00D56 ++:10572000F8822141432068642250436430BBF785EE ++:10573000FF431C3B6018E063681B0702D000209801 ++:10574000F71EFE00206063A063184A1368009317D9 ++:105750004A1088392109014143181CBBF76EFF38F4 ++:105760006014490098BBF769FF134908603868A0C6 ++:105770006107490D6007490E6001B0F0BC08BC1814 ++:1057800047C04614CD0800B4C4080008C30800B8D8 ++:10579000CA080068A409000C000F00DC5E0800FCC9 ++:1057A0000A080009C308000AC30800C02D0800E861 ++:1057B0000A080020CF01009C000F4CFC657B930978 ++:1057C000000030B5041C13490B685D78B0F75DFF2D ++:1057D000022C01D0042C16D1281C203081F7A9FE00 ++:1057E000042C07D10D4800231A1C191C91F745FE03 ++:1057F000022102E0022C03D10821281CADF705FE8E ++:10580000281CACF782FD05490B689879012801D165 ++:10581000ACF7E4FD30BDC49C08000E200000C89C1D ++:1058200008004CFCFFEC930900F0B5041C00216E4D ++:10583000F74CF8002803DA01234E4843716FE00665 ++:105840001C251C7835687A00280DD1A07B98F76359 ++:10585000FA4008236DB833196898F7FFF900280457 ++:10586000DC687A002805D0002E03DD201CB1F7BDCE ++:10587000FE55E0E37B012B03D1002801D101236B0E ++:1058800072A878802101433C4A1160082105206CF0 ++:10589000F7A4FB384A5379002B41D1AFF75BFE37B1 ++:1058A0004F381C052100F040FF03233B74201C00EF ++:1058B000F037F8AFF70CFEEB8A002B0AD1FF201669 ++:1058C00030205C002805D1AFF745FE3B7C08200363 ++:1058D000433B740023AB74FF230533E6180023F326 ++:1058E00075201CB1F788FF264A13780021002B0091 ++:1058F000D101211170F078FF2806D16B7A022B03B9 ++:10590000D1081CF070A3697360012805D8F1708B71 ++:10591000001C48C0187B7C8370201CAEF7ADFFF0E4 ++:10592000BD30B5844CFC71E79409007C18490B78B4 ++:105930008374051C012200216DF769FEAC742C6D87 ++:10594000B223195B0239884200DB081C114941432C ++:10595000E5208000BBF774FEFF210531695C8842B9 ++:1059600000D3081C32342178490701D5012801D819 ++:10597000002800D101200349487430BDA42C080040 ++:10598000A4860E00ECCC08006C150800ECB00800F2 ++:1059900074150800710200004CFCFF5C950900F0D2 ++:1059A000B583B0012100910027C0237B431A481C16 ++:1059B00018206BC00729D5251CBC356B78002B241B ++:1059C000D1261CE38D2C36002B1FD0B379002B027F ++:1059D000D00021009119E0211C0C310F4805220054 ++:1059E000F09EFE002811D00223B371201CB2F72ACA ++:1059F000FE01A9201CB2F712FE01A9A878B1F7ACEC ++:105A0000FE082201A9A878B2F72EFF01370F2FCB8D ++:105A1000D3009803B0F0BD28900800004F08001094 ++:105A2000B5002912D140498B79002B0BD03F490B8F ++:105A300069834207D13E4C2368DB0603D54631011A ++:105A40002008700EE0AFF751FF0BE0022909D101E9 ++:105A50001C48318A880B7E9B18013383814B889BBD ++:105A60001A4B8010BC08BC184730B5314A11680B7E ++:105A700006D90F884218D12F4D2C68ACF798FCC17D ++:105A8000780B028178194302791304194342791380 ++:105A90000619438C4208D12A1F134CFCFF57960964 ++:105AA00000681A0C41780B0200781843824201D03A ++:105AB000002000E0012030BDF0B583B0051C00914E ++:105AC0000026041C58342379002B2CD0012601A871 ++:105AD000B0F723FA071C6379002B13D0E378012B6E ++:105AE00007D13023585DFFF7C3FF002801D1061C02 ++:105AF00019E02835AB79012B04D101A9381CB0F786 ++:105B0000C1F8061C0F480378002B0CD0012F0AD1D6 ++:105B1000029B03208003034001208003834202D1C3 ++:105B2000012300980360301C03B0F0BDC046AC21D7 ++:105B30000800642C080008800E00A88B0E008898CE ++:105B40000E006C9C0800F0B50D1C041C002D14D137 ++:105B50004B488379002B0CD04A480369A34208D1F3 ++:105B6000494A1368DB0604D5031C4633012018702C ++:105B700036E0201CB0F7B5FD32E0FFF754FF022DF0 ++:105B80002ED1414A131C5421085B0004271C5237B4 ++:105B90003988084318644433251C56354CFCFF52A1 ++:105BA000970900A807800F01D12E6808E02D1AC0C0 ++:105BB000002968C1402026301A6E6886400E431EB8 ++:105BC00060A36B002B0CD1A06EC16B91603C304583 ++:105BD0007908212D0200792843D06013680B431304 ++:105BE00060A06E806A9064F0BC08BC1847F0B58273 ++:105BF000B0041C051CB0F75BF858352B79002B312D ++:105C0000D0EB78012B10D1201C28308379012B0B8D ++:105C1000D16B79002B08D1007AFFF72DFF00280304 ++:105C2000D1201C6CF796FC1DE0EB78012B1AD8A64E ++:105C30006E6846B0F775F96B79002B0CD1071C69BB ++:105C400046301C3C300622BBF7C5F8423637706C34 ++:105C5000340120207012E02E231B5D012B02D1693C ++:105C600046B0F713F8A37C0B498878834202D12011 ++:105C70001CB0F768FE201C0121AFF712FF02B0F044 ++:105C8000BC08BC1847AC210800642C080008800E32 ++:105C900000808B0E0074150800034B0448034CFC75 ++:105CA0004B4D98090060044B044803607047C046A0 ++:105CB000BCA3090050150800E8A3090064150800FA ++:105CC00010B5041C6CF749FC201C6DF7ACF84A2396 ++:105CD000002018536523195D0220ADF7FDFCA36E6B ++:105CE000BC3318780021AEF7D9FE10BD4CFC18BCAF ++:105CF00098090000B5011C32310B78FB2213400BD0 ++:105D000070AEF7E5F800BD4CFC50E0980900F0B526 ++:105D1000061C0F1C104D2C68A07B97F7F5FF800820 ++:105D20004300991C608CA26983185801400997F7B9 ++:105D300086FF041C002F0BD0B17B2B68987B6DF77E ++:105D4000BBFF002804D1032C01D8002400E0033C51 ++:105D5000201CF0BDC0466C2108004CFCFF349909A2 ++:105D600000F0B586B0061C4568039581780A0712D5 ++:105D70000F0092C07802908F0943191A790592009A ++:105D8000200490C04A13681879002804D1BE490B3A ++:105D9000681B0600D4C9E10098062800D9CAE105AD ++:105DA00098002808D0122806D0301CAEF783FA00DD ++:105DB0002800D1BAE1BEE1B54C2378B54908798312 ++:105DC0004202D3201CADF772FAB148418800292362 ++:105DD000D00378002B10D06378002B04D0AD489806 ++:105DE000F75DFB002818D000236370A370A84A5009 ++:105DF0008850214143A74805E02378A648002B049A ++:105E0000D15022514398F7FFFA06E098F747FB007C ++:105E10002802D0201CADF74AFA20782923191C410A ++:105E2000430191E11C8807800F01D10A6808E0094D ++:105E30001AC0000B68C3402022101A4A6882401A18 ++:105E4000430198954B0099C95C81548018009903CF ++:105E50002901D0052957D18C4A13681B4CFCFF2F10 ++:105E60009A09000600D44EE1477002998B1F037215 ++:105E7000291C09300622BAF79FFF0635E11C880766 ++:105E8000800F01D10A6808E0091AC0000B68C340FE ++:105E90002022101A4A6882401A4301988018023062 ++:105EA000291C0622BAF788FF0098052817D1063565 ++:105EB000E11C8807800F01D10B6808E0091AC000B7 ++:105EC0000A68C2402023181A4B6883401343019983 ++:105ED000C8180F30029A0C3A291CBAF76DFFE11C62 ++:105EE0008807800F01D10B6808E0091AC0000A6812 ++:105EF000C2402023181A4B68834013430199C818E5 ++:105F00002830F17872688918C9780170FEE0FF07BF ++:105F1000FF0F0098042806D05C4A1368F178706877 ++:105F20000818C078587259490868C379012B18D1EC ++:105F3000391C281CADF7F0FC009A042A05D1ADF7F6 ++:105F40000DFD002800D1E4E04CE0FF2803D1391C0E ++:105F5000281CADF736FDADF716FD002800D14CFC2E ++:105F6000FF2A9B0900D8E040E050490B78002B3C09 ++:105F7000D0009A042A17D14D480490291C103006ED ++:105F80002200F0C9FB002800D0C6E00499887D03F8 ++:105F9000071B0FBB4200D0BFE08023034000D1BBF2 ++:105FA000E04006400E1FE009228356012008568378 ++:105FB0004200DAB1E03E480490291C10300622006D ++:105FC000F0AAFB002806D10499887D03071B0FBBAC ++:105FD0004200D1A1E0291C049810300622BAF7EF44 ++:105FE000FE8023381C18430499887501210491E12F ++:105FF0001C8807800F01D10A6808E0091AC0000B4D ++:1060000068C3402022101A4A6882401A43019880CF ++:10601000184770291C02300622BAF7D1FE20480327 ++:1060200078002B19D0E11C8807800F01D10A68087D ++:10603000E0091AC0000B68C3402022101A4A688287 ++:10604000401A4301998818F17872688918ADF7D71A ++:10605000FD0006000EFF285FD106350298FA3000D9 ++:106060004CFCEF259C090006000E02900098E11CF4 ++:10607000012822D18807800F01D10B6808E0091A96 ++:10608000C0000A68C2402023181A4B68834013439B ++:106090000199C8180021017225E0C04F0800E02CCA ++:1060A00008005DC30800BC9C080093C3080014E30B ++:1060B000050068C30800B8AF08008807800F01D149 ++:1060C0000B6808E0091AC0000A68C2402023181AA9 ++:1060D0004B68834013430199C818029A0272291C25 ++:1060E0000930BAF770FEE11C8807800F01D10B68F8 ++:1060F00008E0091AC0000A68C2402023181A4B6839 ++:10610000834013430199C8182830F17872688918C0 ++:10611000C97801700498002802D0237801332370D5 ++:1061200023780A490879834202D3201CADF7C9F8C5 ++:106130000598122804D1AEF781F9AEF7B6F904E05C ++:106140000398002801D097F71CFC06B0F0BDBC9C5A ++:1061500008004CFCFF189D0900F0B586B0041C0136 ++:106160002203920292002200923249051C08682004 ++:1061700035EB7A012B02D1304A117801E02E4A51D9 ++:1061800078A17406220240062A51D12C4A166832A0 ++:1061900007120F019201070BD529490B68987B0064 ++:1061A0002805D0301CAFF7F0FF0090029000E0030C ++:1061B00090244F019805282BD1EB7A012B28D83356 ++:1061C00006D90F287B414023D1ACF7F0F879680459 ++:1061D00091B968059104A90231062200F09FFA00E6 ++:1061E0002816D10398002813D00298002810D02038 ++:1061F0001CB0F7B5F8009900290AD0201C6CF7A153 ++:10620000F911490B68DB0703D4201C0021AFF75EAE ++:10621000FF0E490B681B060AD50198052801D0031B ++:106220002805D1391C3004000C0022ADF7F4FA0621 ++:10623000B0F0BDC046BC8B0E005C150800A88B0EEC ++:1062400000B89C080080980E0008800E00E02C0822 ++:106250000010B5564CFCFF139E09004C822099F7A4 ++:1062600025FA000600160022A15600290ED0CB10F8 ++:10627000CA1AC310D2187F23DB439A4201DA181CD2 ++:1062800004E07F207F2A01DC1006001601060916B3 ++:106290002170494A1368002B01D14848C17710BDCD ++:1062A00070B5002644480368002B01D184F784FDB3 ++:1062B000434C4449201C0F300522BAF787FD0025C6 ++:1062C0002819C07B97F74AFF36180135052DF7D3FB ++:1062D0003D48C36A5B011CD53C4803685B0518D484 ++:1062E00000253B4803789E4213D001200A2D00D997 ++:1062F000022040194100374885F7D4FC002805D01A ++:10630000291C201C0F3085F7DFFC013E0135252DAF ++:10631000E7D3211C0F313048052200F003FA002892 ++:1063200009D0211C0F312C480522BAF74FFD6369B3 ++:106330000120834363616369DB0707D4FFF732FB06 ++:10634000616901229143104001436161002070BCEA ++:1063500008BC184700B54CFC9A0E9F090075F7035E ++:10636000FB00280BD11F480368002B07D114490BF1 ++:10637000681D490868834201D1012000E000200027 ++:10638000BD00B5B821194800F0D8F900230B4A1315 ++:106390007000BD10B5041C15480368002B0BD020FD ++:1063A0001C002185F794FC1821201C85F790FC4ED9 ++:1063B00021201C85F78CFC10BDC0466CA70900B4D9 ++:1063C000C4080050370800F4460800F44E08005492 ++:1063D00020080020040800A4030800E0340800009E ++:1063E0004F080010CD0800E4C708009034080014DE ++:1063F000CD08004CFCCCCC9F090030B55049086852 ++:10640000504D09280DD14F4A1068411C1820BBF788 ++:1064100034F903234D4A1370AB78834250DAA870E5 ++:106420004EE000234A490B704A4C012801D007284E ++:106430001CD120680022191C99F7BAFB464908684C ++:10644000FF230133984203D20122002199F7B0FBC8 ++:106450009BF782FF2B68DB0102D53F49086802E009 ++:106460003E490B6858003D490B6818602B685B007B ++:1064700002D501233B48037031490868012801D047 ++:10648000072811D120680022012199F791FB20688B ++:106490000122022199F78CFB3349206899F712FCFD ++:1064A0002068012199F7EBFB254803680C2B07D1E5 ++:1064B0002C480378012B01D9012303709EF7A9FE14 ++:1064C00030BD4CFCE044A10900F0B5324A106883AD ++:1064D000025C0F8307DD0F4303DE0FCB780727FF36 ++:1064E00004B8435F07BF0A384310600B795B004F65 ++:1064F00079FF07FF0F3B435B008F79FF07FF0F3BDF ++:10650000433E27B843DF06BF0E38431060CB790106 ++:106510002189048843D907490B0843106083025B33 ++:106520000F9C420AD1002C34D110688307DB0F9DE9 ++:106530004203D14303DB0F9E422BD017480478005F ++:106540002C27D1A00023189B0114481D18D02148E6 ++:1065500059C0041BD5E4214859C004C00E072815B2 ++:10656000D300F06EF8061C281C8EF767F90C4B9AC6 ++:106570008AD0235859000B00031105090D08435810 ++:1065800051281C8DF762FF301C00F062F8013403C3 ++:106590002CD7D3F0BD4C0B0800DEC00800941C08BB ++:1065A00000942008004CFCFF2CA2090070B5051CCB ++:1065B000006813498B7B002B1DD012498B79002B6F ++:1065C00019D0030CDC1D10480440201CB2F776FEE5 ++:1065D000061C08D0221C291CBAF794FB281C97F72C ++:1065E000B5F9301C08E0281C97F7B0F900209CF79B ++:1065F000D8FF032002E0281CB1F7ECF970BDC046BB ++:10660000300B080080150800FCFF000078470000F0 ++:1066100000C09FE51CFF2FE1E05105007847000016 ++:1066200000C09FE51CFF2FE17410050078470000B3 ++:1066300000C09FE51CFF2FE160E8010078470000E3 ++:1066400000C09FE51CFF2FE17CD7040078470000C5 ++:1066500000C09FE51CFF2FE190D7040078470000A1 ++:1066600000C09FE51CFF2FE1FC40050078470000BB ++:1066700000C09FE51CFF2FE1304F05007847000068 ++:1066800000C09FE51CFF2FE1CC5105002300000056 ++:10669000394D090024000000354D09002500000097 ++:1066A0003D4D09003500004CFCFF27A309000049BF ++:1066B0004D090088000000894D09008D000000ADE3 ++:1066C0004D090092000000000000000000000003DF ++:1066D0000000025946020004000100000000000012 ++:1066E00000000000000000000000000000000000AA ++:1066F00000000000000000955102002376090029E7 ++:106700007709003F79090000000000000000000048 ++:106710000000006754020000000000A37F09000091 ++:1067200000000000000000D37E0900497E0900003F ++:106730000000005B7F090000000000897F090087DE ++:106740005102009F9504006D9904007F930400009E ++:10675000000000DD95090000000000A7960400007D ++:106760000000000000000005990400C39304009F8E ++:106770009504006D99040091A2040000000000FD42 ++:10678000960900000000009D97090093A304006192 ++:106790006709008F670900C3930400420500005E8B ++:1067A0000400006204000042054CFC4A22A40900D7 ++:1067B00000006C04000062190000440500006C0435 ++:1067C0000000621900000A00000001002100A086FC ++:1067D00001000C0019000200000000180000FF007A ++:1067E0000000800200008002000090A30900001851 ++:0D67F0000008030000004EFC04FFFFFFFF47 ++:00000001FF +diff --git a/firmware/ap6210/fw_bcm40181a2.bin.ihex b/firmware/ap6210/fw_bcm40181a2.bin.ihex +new file mode 100644 +index 0000000..a8e3092 +--- /dev/null ++++ b/firmware/ap6210/fw_bcm40181a2.bin.ihex +@@ -0,0 +1,13727 @@ ++:100000000000000091EC000055EB000055EB0000F3 ++:1000100055EB000055EB000055EB000055EB0000E0 ++:1000200055EB000055EB000055EB000055EB0000D0 ++:1000300055EB000055EB000055EB000055EB0000C0 ++:1000400055EB000055EB000055EB000055EB0000B0 ++:1000500055EB000055EB000055EB000055EB0000A0 ++:1000600055EB000055EB000055EB000055EB000090 ++:1000700055EB000055EB000055EB000055EB000080 ++:100080000048004791EC0000000000000000000064 ++:100090000000000000000000000000000000000060 ++:1000A0000000000000000000000000000000000050 ++:1000B0000000000000000000000000000000000040 ++:1000C0000000000000000000000000000000000030 ++:1000D0000000000000000000000000000000000020 ++:1000E0000000000000000000000000000000000010 ++:1000F0000000000000000000000000000000000000 ++:10010000D11E8000B5228000BD248000491F8000E0 ++:10011000F9218000A9160100F1208000D120800083 ++:10012000594880006948800015648000E1628000C1 ++:10013000296280003D6580008D628000C56280007C ++:10014000596380005D6580007D6380009D63800051 ++:100150000D668000A961800061618000756080008B ++:1001600095608000DD6380009D65800029668000C9 ++:10017000FD618000B96580001D618000F16580002F ++:100180009D6680006D658000916C8000CD6B800065 ++:10019000316C80008D6B8000556C8000AD6A8000F2 ++:1001A000C16A8000D56A8000496B80001D6A8000AA ++:1001B000FD6A8000AD688000C1698000D168800060 ++:1001C000356B8000B16980004DF10000D166800080 ++:1001D000E16780008D678000CD6780009D688000AA ++:1001E000ED678000BD678000A1678000ED6680003C ++:1001F00009678000616780004D4880001D488000CD ++:1002000085988000DD96800051948000B19B80002D ++:100210003994800005988000199880002D988000FE ++:10022000C59B8000D19A8000899D8000D193800079 ++:10023000D9918000ED9A80002129000099170100D2 ++:1002400079290000C1170100519B8000BD290000E1 ++:1002500049A9800099988000F529000031A8800004 ++:1002600005A7800021A28000BD938000DD9380005F ++:10027000199E80007D93800045988000E59B80005A ++:100280006DA68000C19C8000C59F8000A19D80005C ++:10029000F5988000851701005517010029AA8000F4 ++:1002A000B9A9800075AA8000E1A9800039AA800060 ++:1002B0008DAA80005DAA80000DAA8000C5A98000DB ++:1002C0009DA98000A90C8000850D8000C1068000DA ++:1002D00029088000694680004D468000D94480008E ++:1002E0004146800021448000F54380001544800091 ++:1002F000E1438000E1428000854680007544800033 ++:100300002D448000A9428000F9428000CD43800046 ++:10031000B9458000F544800039458000090080001F ++:100320003D00800049018000D10480000D04800060 ++:10033000910380004D038000E503800035038000B9 ++:100340006503800029028000CD02800051028000F8 ++:1003500085028000F5028000950680003906800045 ++:100360008105800005068000FD048000690F800083 ++:100370002516800015168000451380001513800097 ++:100380002513800009138000351380000D1E8000A6 ++:10039000F91D8000291D80001D1C8000391C800073 ++:1003A0003116800059138000192C0200951380002B ++:1003B000B91C8000C5270000452D0200751D800076 ++:1003C000A90F01003D1D80000D1B8000E910800079 ++:1003D000790F8000A9168000311480002D11800053 ++:1003E000A51E8000B11E8000BD1E8000692B80000C ++:1003F000AD28800011298000892B8000FD2B800012 ++:10040000E128800065288000B52C8000912C8000B8 ++:100410001D2B8000752D8000252C80004D30800024 ++:10042000DD2D800059278000313180002118010026 ++:100430008D268000C5268000E5248000FD268000F2 ++:1004400021258000B12A80006525800025288000B4 ++:100450006129800041298000D92980009D298000E0 ++:1004600081298000893080004D2E8000B12B8000D2 ++:10047000312C8000E12C8000613280002D32800020 ++:10048000C93380004D368000693A8000B535800060 ++:10049000F9348000A93480003D3380009D33800012 ++:1004A000013480003536800031388000353A8000D4 ++:1004B000213A8000AD3280000D338000DD328000B3 ++:1004C000953A8000D937800099368000193780002E ++:1004D000593880004938800019398000313D80004A ++:1004E000D53A8000C93C8000E13B8000513D80004E ++:1004F000D93D8000AD3E8000593F80009941800089 ++:1005000041478000CD5B8000895380002D4D8000E5 ++:10051000A94C8000E14D8000E94F8000B14F800080 ++:10052000C94E80008D4E8000F15180005D528000E8 ++:10053000D15180002D52800001528000C94F8000AF ++:10054000594C80006D4C8000455B8000395680001E ++:10055000155A8000C9588000315A800081578000A8 ++:10056000F95980001D568000AD55800091558000DE ++:100570004D5A80002D558000714B800071548000D1 ++:1005800009548000F54D80001D4C8000F94B80001F ++:10059000094C8000114E800015588000C9110100DF ++:1005A0002D508000E5588000555680007D5A80000F ++:1005B000054F8000354E8000D9558000515880008D ++:1005C0009D57800059518000614D8000B1488000E6 ++:1005D0005D5B800081528000494C80003515010030 ++:1005E000F15B8000E55C8000E15F8000A55E80003B ++:1005F0007D5E80008D5C8000015C8000A15F8000DA ++:10060000895D800005608000395D8000D15E8000DA ++:10061000495E8000ED6C8000656D8000DD6D8000BE ++:100620000D6D8000296D8000896D8000F96C80005F ++:10063000D96C80003D6E8000616F8000756E800017 ++:10064000056E8000A974800055758000D574800007 ++:1006500005748000D17C8000457D8000757C800021 ++:10066000117E8000897E8000E97E8000917D80007F ++:100670003D7E8000517F8000A581800065848000E0 ++:10068000418480008D8380006583800035858000F3 ++:10069000E58480009D848000218580007584800031 ++:1006A000BD8380005D858000BD858000158F800042 ++:1006B000918D8000D58980001986800019AB80005B ++:1006C0005DAC8000A1AA8000B5AB80005DAB80006E ++:1006D000FDB080007DB1800065B080006DAE80000F ++:1006E00085AE8000EDAD800041AF80001DAE800082 ++:1006F00031B180003DB18000B9AE8000F5B180001D ++:1007000079B08000FDAD800009B180008DB080001F ++:1007100049B1800069B180004DAE80003DAE8000DF ++:1007200095AE800029B38000C9AE8000CDAF8000B7 ++:10073000E5AF800025B080008DAF8000B5B28000AD ++:10074000FDB2800019B38000EDB080005DAE800086 ++:100750002DAE800029B28000A9B08000A1B1800038 ++:1007600005B2800039B28000A9AE80007DAF800064 ++:10077000ADB38000A9BD80009DC1800025C7800069 ++:10078000DDC8800065CA8000E1CB8000DDCE80003E ++:1007900019CE800099CE800015CF8000E52C000096 ++:1007A0000DD88000DDD7800091D78000B110010006 ++:1007B000CD2B000069D880007DCF800045D9800016 ++:1007C000FD10010099D1800025110100F9E08000A1 ++:1007D00071F58000152D0000D1DE80008D21010013 ++:1007E00009EA8000A1E4800045200100E1EC8000DE ++:1007F00011E3800039EA800039E3800099E380004A ++:1008000029DF800005220100A120010075220100DE ++:10081000352301007D230100BDEB8000952D0000F4 ++:10082000152E00001922010091220100CD210100A6 ++:10083000E1E18000A9E980007D210100F9200100AB ++:10084000EDF58000D90081009DF68000C5F780009D ++:1008500085FF800045018100D50281004D038100A4 ++:10086000E50081007DF6800081F78000D5F58000ED ++:1008700051F9800031FB8000F1F68000F9F580002D ++:1008800041FF8000D9F98000DDFC8000A9F78000DD ++:10089000C12E000059FB80008DF78000A5F9800073 ++:1008A0008DF9800029F68000A1F880005DF78000B6 ++:1008B00065F6800095FD8000912F0000F502810013 ++:1008C0002D0281008901810005018100A93000000D ++:1008D00099FF800019F7800089F68000C1F680003A ++:1008E0008D10010085F5800005F78000DDF68000A1 ++:1008F000B1F68000AD6A8100BD6A8100DD2F810004 ++:10090000E1578100F56D8200A98D820009258200E2 ++:10091000196E820001AA81005D608200A537820005 ++:10092000ED69810079598200E55882001D598200E5 ++:10093000FD6D8100493A810041BC8200E95A820084 ++:10094000CD608100D59681001D6181002961810003 ++:1009500089BF81001DAB810069320000893200002F ++:10096000D132000005A6810021AD82002958810006 ++:10097000BD3E8100A540810035958100599B8100D5 ++:100980003D3682001D4582000928810099A0810022 ++:10099000D1288100E93B81008D288100416E8200D1 ++:1009A000859B8100295D81006D398200FD398200BF ++:1009B000253A820095698100C97A810091578100AA ++:1009C0005D57810075308200852F82003557810088 ++:1009D000D12F82002157810049578100F5288100DD ++:1009E00095A882002DA2820089D38100D56B810059 ++:1009F0005959810075598100F55A820005AD810071 ++:100A0000F1D2810039378100ED718100C5968100F6 ++:100A10008957820091618200CD618200A9588100CE ++:100A20001D2782004543820001448200156A81002F ++:100A3000614A8100ED4E810071228200055A8100D9 ++:100A40004D8A81007549810071248200B14981007D ++:100A5000B144810075AC8200292B8200595281007B ++:100A6000E12A8200B529820071A7810035A78100A3 ++:100A700001D48100F5BE810055B48100D16A8200A5 ++:100A8000D19C81009D9C8100959B8100B59D81003A ++:100A9000459D8100C59D81006170820009358100FE ++:100AA000A1AB82008DAB820075AB8200F193810017 ++:100AB0009968810015D7810071C182007D2B81006A ++:100AC000E92F81000DB6810025BD82008D4F810088 ++:100AD0000D5081008543820031D78100B1BD820075 ++:100AE00095C182005DB38200B90D01008DD18100F6 ++:100AF000A9368100E9BC820029378100E9368100EE ++:100B0000A1D68100A53B81006DAB810041B0810081 ++:100B100045AE8100DDB1810041BD820095BE8200FD ++:100B2000CD2E82009D6B8100CD458200453981002C ++:100B3000353B8100BD3A8100F1D58100419F8100A4 ++:100B4000119F810071A48200ADD58100C130810068 ++:100B5000A13982004D618100995B8100A5728100FD ++:100B600089DA810061BF81006157820081218200A2 ++:100B7000A9218200D1AD820009BC8200B5A181000B ++:100B80009DCA8100B92F8200D9BB8200113082003A ++:100B90007DAD8200CDA4810099A48100CDAB8200FF ++:100BA00015AB8200C1AA8200B998810081A581009D ++:100BB000D9D08100A9CF8100E93B8200EDCF81002F ++:100BC00065D1810079D1810051D0810065D081004B ++:100BD000E521820011228200D1340000B9480000D2 ++:100BE000FD9C81009145820055AE820041B4810098 ++:100BF00095BD8100F18A8200098B820079D981003C ++:100C00007D618200CDA4820041918100A13F8200DC ++:100C10003594820049948200898982005DC18200F6 ++:100C2000F1C18200D13B8200D5958200E560810050 ++:100C300009208200E5170100BD3B820075A18200FA ++:100C400025A58200253B8200E93A8200753A8200A0 ++:100C5000F1308200B130820071D781004599820065 ++:100C600091D7810089948200DDC18200A96A820047 ++:100C7000256B8200C944810029458100596B8100A0 ++:100C800059498100EDAA810069618200AD2482008A ++:100C900005368100D535810079D08100A5D081004D ++:100CA000715C8100E1AD8100EDD0810049C9810016 ++:100CB0004DD88100893D82004920820065968200DE ++:100CC000F925820089CF8100856A82001593820010 ++:100CD0002D5D8200E9CA81006D4082006130820092 ++:100CE00015488200313C810061D68100114E81009F ++:100CF0000129810041A1810015A681000999820086 ++:100D0000E5C98100B1D7810035C08200294A810040 ++:100D100041AD8100EDBE82002DBE820005BE820085 ++:100D200079BE820055328100A5958100B1598100BC ++:100D3000E54781009152810015638100956481002F ++:100D40008D668100592C8100392C8100212E810073 ++:100D500065358200D5578200352B8200996082006C ++:100D6000016182001D4082001D2082001DD881008B ++:100D7000A9AC8200F1AB8200F52B820041AE82006B ++:100D800011120100356A810009AE8200696D82008E ++:100D9000098C8100D58B8100116F810081908100C9 ++:100DA000296C8200DDA18100E92B8100552F820092 ++:100DB000398C8100A55A8200355C820045BB8200D7 ++:100DC00091BE81002D6E8100115C8200258A810018 ++:100DD0004D93810089388200D5378200555A8100B1 ++:100DE000013882008D038100E9208200E13E82000B ++:100DF000914581002D6D81000D58820021478200B0 ++:100E0000FDCE810011CA81005936820051CB81008C ++:100E100025CB8100912E81002D2F8100B93A8200CF ++:100E2000A10D0100DDA9810031D48100D1B3820080 ++:100E3000ADA98100D53882008DD88100555E820031 ++:100E4000719A81001541820035DA810019258200EE ++:100E50006926820035358100D90D01003D71810080 ++:100E6000012D810009A282000D238200FD71810005 ++:100E7000D960820051728100416182004528810061 ++:100E8000C12382008D6C81006D2382009547810013 ++:100E9000B9D98100B534810075C98100F134810070 ++:100EA0002DBF810059AF8200D93C8100494F81009C ++:100EB000E5AB8100F51501007931810005958200CF ++:100EC0006D638200DD938200A56682000DC88100FB ++:100ED000095E81007D758100156281009159810054 ++:100EE000D575810011498100C1488100B9BF8100D9 ++:100EF000A5458200F5598200F1A9820041A6820031 ++:100F000039588200BD428200BDA782004D22820076 ++:100F100071A78200A5A78200E15C8100ED418200FB ++:100F2000D1A78200D1688100B5CC810015AF8200C5 ++:100F300095418100E1C8810089AA8100E99681007C ++:100F40007D2F810081470000494282005944820080 ++:100F5000F90D010031318200614982004D49820062 ++:100F60000DA58100095E8200253E8200CDCD810065 ++:100F700029B382002151810045B18200A91D820060 ++:100F800079BC8200D1568100599D8100999D8100D4 ++:100F9000191C8200513F82001D308100C9BD8100B3 ++:100FA00015388100794A8100DD9B8100199E8100FE ++:100FB00069618100896E8100B5708100D132820043 ++:100FC000F1578100A93382009D5A81003D3582008E ++:100FD00089338200D96E810045708100FD618100F6 ++:100FE000594B81000D9C8100558B8200F18E82004F ++:100FF000E59A8100BD35820049368100291F8200B3 ++:10100000655C820009150100516F8100299B8100F8 ++:10101000A56D8100B5A28200E1AF8200A9568200D1 ++:10102000894481003D578200E16F8200016F820098 ++:10103000DD728200E53E810095518100FDD4810082 ++:10104000F5BC810081B48100F199810019318100E2 ++:10105000358A8200DDDA8100413D81002D3E81002C ++:10106000E9898200C1D48100FD8D820099B681009A ++:10107000BDA781003D9F82005D0381006D928200CB ++:10108000218B8200599A8100ED278100ED94820026 ++:10109000FD8A81009D8A8100416B8100E16F8100A2 ++:1010A0005D468200A19482009D898200C9928200DF ++:1010B00079998100B1908200219182001D348100D4 ++:1010C00099B28200DD6A82008DC9810059278200B1 ++:1010D00021120100D9908100A56B82006D3C820035 ++:1010E000E56D820005C28200C96A8100ED4582007B ++:1010F000816B8100353F8200FD90820071BC8100D0 ++:10110000F16B81003D4E8200514A82003DA2810078 ++:10111000190E010079738200B97E8200698882000D ++:10112000695A8200DD2E810015138200117381003F ++:10113000698082009D9181005D8B8100816C8200BD ++:101140008D8F81004D8F810009888100BD6D8200E7 ++:10115000018E81001D5E820091718100C127810096 ++:10116000797582002DBE81002D5B8200E9A5820089 ++:10117000B5728200255B0000217D82004D808200D7 ++:101180008D7F820001A08100ED7F82002D418100D2 ++:10119000F98481006185820045728200F9548100E2 ++:1011A000692B820069518100C5558100315681004B ++:1011B000A1A6810071508100392A8200615381000B ++:1011C000C573810035620000F1978100A99B810001 ++:1011D000FD3B820025A08200DD398100715D810028 ++:1011E000BD1401004995810009CC810021A3820032 ++:1011F00045AA8100AD818200916782002962820048 ++:101200007D708200E12F8200E97D000081DB81009A ++:10121000952482006989820089C38200C5C4820046 ++:1012200039180100B1EB820009CB82000DCC82009D ++:1012300059EB820061E9820015F18200E9CD82005C ++:1012400045DF820009F182008DF782008DCA82009D ++:1012500089F38200D5CA8200A1098300C9F7820000 ++:10126000FDEF820099F8820025F9820039FA8200A8 ++:1012700089ED8200ADE08200ADE5820065DA820092 ++:101280007DC582002DE6820065EE820031E4820099 ++:10129000E5F182009DC8820055F3820075150100BA ++:1012A00061C78200CDE182006DE18200A5E282008B ++:1012B00059DF820029F4820009C7820055EF8200BD ++:1012C000E9EC8200E9DB8200BDDD8200E1C582003D ++:1012D0004DE5820005E08200A5F982000DC582007F ++:1012E00089F48200ADA1000085A2000091E6820091 ++:1012F000BDCC8200FDE982008DD182002DF18200FB ++:101300002DF7820095FB820069CE8200A1F0820059 ++:10131000D5F08200F5CC820035A3000081D982008F ++:1013200045C58200FDCB820025CB8200BDEB82004B ++:101330001DDB820015CD820019E78200CDE6820018 ++:101340004DCF82009DCB8200450C8300E50D8300CC ++:10135000590E8300410E8300010B83004D0A830068 ++:10136000D10D8300310C8300590C8300710A830076 ++:10137000650E8300F10D8300410B8300A11E8300E5 ++:10138000B11E8300012B8300F54E8300112B8300D7 ++:10139000B127830099238300014A8300ED4983002C ++:1013A000FD478300CD4C8300BD4C8300714C83000E ++:1013B000D52783004D25830095258300E14C8300CC ++:1013C000414C83000912010065118300E144830050 ++:1013D00021288300BD2883007929830065288300A4 ++:1013E000652B830041458300D5298300491D830077 ++:1013F000A12A83005D30830051488300E5488300C3 ++:1014000029488300F5238300114A8300793483003F ++:1014100091188300A5338300ED3483001D118300F0 ++:101420009D4E8300954D8300B51A8300614783006C ++:101430001D4D8300ED1083000D458300C11E830008 ++:1014400001208300E9218300F1258300F91D830039 ++:10145000F513010059B3000049108300C10F830048 ++:1014600021248300A5248300B94A8300B52F83007B ++:10147000C1458300FD1C8300711D8300F5188300A6 ++:1014800059198300F1198300190F0100492A8300BB ++:1014900011B40000B957830029578300654F8300BA ++:1014A00001608300E559830039518300F54F8300C3 ++:1014B000555483001D5E83002152830065598300CB ++:1014C00079508300714F8300095983003D63830085 ++:1014D000C5578300815C8300B15B8300DD538300CB ++:1014E000115383009D4F830029508300254F8300B3 ++:1014F000D5588300CD62830039608300F95C830096 ++:101500004D6183005D5F83002D548300DD508300B7 ++:1015100039578300A555830091638300A16283003E ++:10152000C15D83002D5E8300455F8300A151830070 ++:101530004D5E8300195B83006D5A8300A9568300BA ++:10154000A5508300095783000D748300DD63830079 ++:10155000297A830001668300B9B28300D5A783008E ++:101560007D848300819383005DB38300A193830016 ++:10157000E9938300E10E010071BA0000B1BA0000E6 ++:10158000717A83005D67830051668300CD708300AC ++:1015900055718300DD7483008DAA830051A88300F8 ++:1015A000A9B183009D918300D184830039BB0000E1 ++:1015B00061848300AD77830081818300158283007D ++:1015C000B1808300E5B583006D7E8300B57983002B ++:1015D0002DBC0000916E8300758F830055878300BA ++:1015E0002913010015C1000025678300C18883000D ++:1015F000D98F8300F5AC8300E97783009D6D83006C ++:10160000A1A78300FD998300C9A4830051C40000F1 ++:10161000558B8300E58A8300CD6A8300F5868300BD ++:10162000596A8300B9AA83001566830051B283000A ++:101630009DB38300D9B6830059B1830091828300A2 ++:10164000D5B0830081868300C97A83000585830035 ++:10165000797C83008965830055A58300C9AF830029 ++:101660008D1501007999830091898300C5B58300A8 ++:101670000DB8830099D483002DC083009DC28300E0 ++:10168000ADC38300A1C68300B1C68300C5C2830079 ++:10169000A9D0830055BF8300F9CF830029BF830001 ++:1016A000C5E18300C1C0830095C083004DD883008D ++:1016B0000DD7830015D88300F1D7830079BD83004F ++:1016C000A1E1830035C28300C5E08300DDE0830033 ++:1016D000C5DC830099DA830001DA83004DB883000A ++:1016E00075C0830019C28300F9C983003DD6830009 ++:1016F00015BE8300C9D683005DBA830029D6830056 ++:1017000031B9830035BC83009DD883005DDC830044 ++:1017100029C18300A9C28300E5C0830025DB8300C3 ++:1017200075C283001DD083005DBC830061C6830049 ++:10173000D5C2830005BC830001C98300B5C88300FE ++:10174000EDC8830055D6830015D98300A5D1830049 ++:10175000F1D5830001D9830081B8830089E083003B ++:10176000E1BC8300A5DB8300EDE1830071C1830050 ++:10177000E9B783006DC783008DC183001DC8830056 ++:10178000B5D1830071DC8300E1C18300A9C183006E ++:1017900019DC830039D883004DCB8300A5B78300C3 ++:1017A00069CB83008DC98300C9D48300A5C500001F ++:1017B00099D68300E5DC83004DD483001DC38300EC ++:1017C00021DD830045D983007DD383003DD2830092 ++:1017D00041DA8300CDD88300D9BF830095BD830053 ++:1017E000EDBD830051C083002DB8830049BB830049 ++:1017F00031BB8300CDDA8300D5D0830049CA830092 ++:101800009DD5830081BF8300D5CF83003DC9830070 ++:10181000DDD18300B9D7830025C78300D1C800007C ++:101820005DBE830021E18300F9E0830071B983008C ++:101830008DE1830025D9830049D78300DDDB830058 ++:10184000A9B9830085BA83000917010059EB830009 ++:10185000C5E7830041E2830025E283006DF5830044 ++:1018600065EB830085F2830089F78300B1F2830082 ++:10187000A9F58300AD008400E100840019FD830018 ++:1018800035EE8300FDF38300D1D1000089FB830096 ++:10189000B9FA830021F98300F1FA8300D9F88300B3 ++:1018A000D9F9830031008400C5FE830049E7830035 ++:1018B000050084004DFF83006DF3830059FE830013 ++:1018C00001FE830025EB83000DEB830031018400D2 ++:1018D00035FD830081EB830059FD830011F88300FF ++:1018E000FDF78300C5ED8300ADED8300A101840009 ++:1018F000E9E78300B1F38300DDF2830025F3830081 ++:10190000F9E68300E5E28300F9120100A5E983000E ++:101910008DF5830051EE830079F8830071E2830036 ++:10192000F1E8830045E6830099F783006DEE8300BC ++:1019300041F48300B9EB830075E78300B1E88300CD ++:10194000BDD3000061F183000518010089EE83001A ++:10195000F5D40000FDE58300A9FD83000D1301000F ++:10196000B5FB8300F1F183002D108400E1158400A4 ++:10197000B1198400C5158400D90F8400CD218400DD ++:10198000491E84004D1F8400E1128400ED0884008C ++:10199000F10184002D0F8400ED238400F51E8400E6 ++:1019A000E520840049208400AD128400F11A8400EF ++:1019B000711F8400C9198400AD188400450B840090 ++:1019C000910B84000D2484008D2384000D18840065 ++:1019D000210684008D168400310384006909840087 ++:1019E000FD158400E902840001028400A909840035 ++:1019F0008D148400811E8400E10B8400751C84001A ++:101A0000AD0A840049108400712084000121840003 ++:101A1000850A8400291D840045078400390C840050 ++:101A200029198400551E840089038400E51D840063 ++:101A30002125840049138400291A8400DD12010045 ++:101A4000ED12840045068400010D84008943840062 ++:101A50006D2A8400014D84001528840069288400C3 ++:101A6000DD0B010009408400112C8400F92784005B ++:101A7000912D8400794C84008934840019338400CA ++:101A80006D2F8400C92D8400F12E84007D2E8400EA ++:101A900065258400DD348400FD2584001929840037 ++:101AA000B5408400D944840079298400B92B84008E ++:101AB0003D45840095328400B9288400D1388400E3 ++:101AC00031488400A93084006D2C8400994384003F ++:101AD000D13284006D338400FD2F84005D45840085 ++:101AE00011348400B54A840075488400C5488400D8 ++:101AF000B1278400314A8400D949840059328400D6 ++:101B0000014C840039388400314D840055448400F0 ++:101B1000D93D840055438400513C840091398400B0 ++:101B20009536840091378400F5368400E1478400BF ++:101B300015478400CD4C8400F52B84002546840095 ++:101B4000E53A8400C937840049428400292A840088 ++:101B5000A53F840059268400952A8400452B8400E3 ++:101B6000C95D8400C1230100A156840095568400FC ++:101B700019578400E956840005578400355F8400B6 ++:101B80001D628400B557840065638400ED628400A3 ++:101B900021638400BD628400194E8400B95384001F ++:101BA000B15D8400B5518400D55F8400F95584008F ++:101BB0006560840059538400E5538400E94D840036 ++:101BC00049240100E15F8400212501005125010025 ++:101BD000B55B840031568400A5638400CD60840029 ++:101BE00091638400ED5084002D5E840031518400A7 ++:101BF000155C840061548400F55E8400F15D84000E ++:101C0000352401007152840059588400815C84009D ++:101C1000715784002557840071588400AD568400A4 ++:101C2000415984006D4F840029508400E1548400A0 ++:101C3000BD6184006D61840005598400A56684003F ++:101C4000D9678400456684000D658400916784002F ++:101C5000B96384005D67840079678400F966840055 ++:101C60002165840021678400C56684008D66840038 ++:101C70006566840011688400516C8400AD6E840038 ++:101C8000016E8400F97084004D7F84007D6C8400B7 ++:101C90002D748400456A84000D7B840001120100CC ++:101CA000156E8400457A8400E56C8400456F8400DD ++:101CB000C17C8400297E8400756D8400956B84004E ++:101CC000B56D84007D7D84005D6B8400D56A8400E1 ++:101CD000816A840085748400B1808400857E8400DC ++:101CE000CD7F84004981840069818400ED8984006E ++:101CF0006D8A8400FD8984008D8984009D8984001B ++:101D0000E9858400F982840025858400518A840055 ++:101D100075858400958484008181840071838400AA ++:101D2000C18984005D898400D58984006D8984001F ++:101D30007D8984000D8A840009868400798C840062 ++:101D40007D8A84000D8B8400499484008D928400E8 ++:101D5000E98D84009D8B8400FD8C84007990840043 ++:101D60000D8C8400458C8400E9A68400A5AD840018 ++:101D700029968400C598840015C1840009A98400AF ++:101D800099C2840045B7840031C18400D1B8840071 ++:101D90008D998400B99A840025AC8400D9BF840051 ++:101DA000C9BE8400A196840025B18400519B8400A3 ++:101DB000919884004D9784001D9784007DA684002F ++:101DC000D1B784002DAB84008595840019B08400C0 ++:101DD000F5AD840029A98400C1A98400219F840055 ++:101DE00025A28400B1AE8400C1AF8400D5A38400D5 ++:101DF00075B7840041A28400E1BC84006DA8840012 ++:101E0000BD9D840095B884005D95840075BE8400F6 ++:101E100051B98400A9958400C5C18400599A8400F1 ++:101E2000419684003DB884009DA88400E5A8840004 ++:101E3000A59B8400F5A684003DAF8400159A84001C ++:101E4000F9988400EDA984006DB18400FDF0840050 ++:101E500025DF840025ED8400E5D08400CDF18400E9 ++:101E600009F2840035F2840055F28400CDF284003A ++:101E7000B1D38400F5D384002DD48400C1D4840070 ++:101E8000A5048500F90585006D0585009904850088 ++:101E90008D04850079D4840045E88400B1C58400B0 ++:101EA00095DF840031DF840075E484001DE0840048 ++:101EB000BDC9840005ED8400A500850091FB840068 ++:101EC000F9ED840091EF84009DFB840081EA840099 ++:101ED00079E28400E1E500006DE60000A1EB8400FA ++:101EE000D1E484009D028500F1E7000015CC840058 ++:101EF0005DFB840081C5840015D5840099D68400DB ++:101F000035E78400B9DF840045F48400B9C7840054 ++:101F100001DF84002D018500E1C7840025D1840004 ++:101F2000B5E60000BDDD84004DF38400E1C9840006 ++:101F300041E084002DCA84009DD4840091E7000014 ++:101F4000D900850079CB840021FC8400B9E88400A5 ++:101F5000B5D8840031FD8400BDFB84001D048500DC ++:101F60005D04850031ED8400450685005DEC84004C ++:101F700025C384001DF38400D9C684002DEC8400A1 ++:101F8000F1C5840059E9840019C884005112010088 ++:101F9000B100850049D3840001C98400E1D28400E6 ++:101FA0008DCB8400DDEB840011F4840009FC8400F7 ++:101FB000D9F3840069C38400A1C884002DEE840095 ++:101FC00071D68400790185004112010025D8840072 ++:101FD000DDF9840009F0840035F784008DE8000005 ++:101FE000D9FC840015D78400DDD584001DDE840073 ++:101FF00001E9000019F1840099F1840049F184009D ++:10200000BDE90000A1F48400F1D084003DCC84003F ++:1020100069D2840089E98400F51D0100C9D38400D8 ++:102020008506850089078500E90685004D0785003E ++:102030001107850025078500710685009506850036 ++:10204000BD06850075078500B10785009D078500E1 ++:10205000A9068500D1068500FD06850039078500A3 ++:10206000610785005D0685001509850079098500F1 ++:10207000350A8500BD0985000D0A850091EA00003A ++:10208000711201004D0A8500A90985002509850006 ++:10209000DD0A85006D0A850081088500C507850079 ++:1020A0000D0B8500590F8500ED118500C9128500C3 ++:1020B00021108500F90D8500D5118500511085008E ++:1020C000AD118500011185006D108500B1D10100B1 ++:1020D000850F850085108500990D850011128500FA ++:1020E0000D22850041178500D917850075208500D0 ++:1020F0007D2C8500352F8500B92285002D25850092 ++:102100009D238500612F8500A5278500C92A8500AC ++:102110006D2985009D22850031228500A52485003A ++:10212000E1238500B12F8500BD2C85005914850061 ++:10213000C9138500A11C8500452C8500A9178500C1 ++:10214000B1208500311A8500FD178500291D850005 ++:1021500021148500AD218500B5308500453185000D ++:1021600035278500D1318500C5148500BD2D85003A ++:102170002D23850059238500891485004D4685004F ++:102180006547850025368500514785003D46850019 ++:102190008D3C8500514A8500994A85007547850028 ++:1021A0001D478500553685005D468500D53B850079 ++:1021B00049498500D53A8500E139850041398500D6 ++:1021C000E53885000937850045358500C93C85001F ++:1021D000754B8500B9458500ED4885002146850091 ++:1021E000213A8500A940850001328500F53285003D ++:1021F000FD378500894E8500DD508500ED50850056 ++:102200005D57850009558500495085005D50850062 ++:10221000D1528500F5528500E54E8500C9558500EF ++:1022200065568500C9508500094F850071D20100AF ++:102230009D5585000D538500A94C8500B957850033 ++:10224000A55785000D518500FD5A8500D5518500A3 ++:10225000A9518500B15285009D53850039558500EF ++:102260009D4E8500C95785006D578500954C8500AA ++:10227000095785008D4F8500DDD20100FD5985008D ++:10228000014D8500ED598500D9598500194C85000F ++:10229000756C8500816E8500516C8500295C850018 ++:1022A000416E8500795E8500210F0100AD6E8500CD ++:1022B000B56C85006D6585001D5F8500196B850017 ++:1022C0008579850071738500B58E8500E19585005F ++:1022D00001828500519085002D828500D190850076 ++:1022E000FD908500BD9285006D8F8500CD928500A3 ++:1022F00055968500C58E8500857285005D8D8500AB ++:1023000001838500C1918500257085000D918500B0 ++:10231000C17685006971850041718500F97F85006E ++:1023200079708500F19385009D958500F574850091 ++:10233000497485006D788500BD728500ED8A850041 ++:10234000C98C850099918500597D8500BD718500F6 ++:10235000758185000D818500A9798500217785002B ++:102360002193850089928500D194850095968500FA ++:1023700065838500D97385006582850021D30100BE ++:102380005975850021768500556F85006D9585000E ++:10239000E583850029848500AD8F8500F16E850079 ++:1023A0009D2E010075280100292E0100A53601008F ++:1023B000F52D01001D2B0100992B0100A531010015 ++:1023C0005D2B01002D2B0100252B0100613C01003C ++:1023D000692E010041370100952801007530010088 ++:1023E000FD310100C52A0100D1280100C13F0100D3 ++:1023F000CD280100C1400100F1420100DD2D0100A6 ++:10240000DD2A01004D2E01009D32010091360100B0 ++:10241000ED2D0100C5280100BD280100613001003B ++:1024200031340100253401005930010055330100D9 ++:10243000813001008D320100152D0100F92B0100C2 ++:10244000D1450100192D0100F92D0100012E0100D7 ++:1024500089300100A53A0100F93A0100B12C0100D0 ++:10246000D52D0100853501009DEB0000D9EB000062 ++:1024700015EC000059EF00009DF40000E12C020073 ++:1024800005F500000DF5000049F8000049F90000CD ++:10249000B1F9000009FB0000452F000011310000D8 ++:1024A000493100006D31000079310000C931000070 ++:1024B000D500010011020100D931000039330000BC ++:1024C00045340000710D0100F93500006D0D01006B ++:1024D000E54F00006D6B00005D750000B19E0000CF ++:1024E0005D0D0100610D0100690D0100650D010028 ++:1024F000F5160100A9C60000450D0100410D0100BF ++:10250000310D0100390D0100D90B0100510D010001 ++:102510004D0D0100550D0100590D01002D0D01005B ++:10252000350D01003D0D0100490D01004DD50000A4 ++:1025300031D5000039D5000041D5000059D5000043 ++:10254000FD0B0100190C0100390C0100F90B010011 ++:10255000F50B0100350C0100150C0100110C0100F8 ++:102560000D0C0100090C0100050C0100010C01001B ++:10257000890C0100950C0100C50C0100E50C01005F ++:10258000E90C0100FD0C0100F90C0100F50C010043 ++:10259000F10C0100ED0C0100990D0100910D0100FD ++:1025A000890D01009D0D0100850D0100790D0100CF ++:1025B0008D0D0100750D01007D0D0100950D0100CF ++:1025C000010D010001000000200000001F000000BC ++:1025D00050000000020000000100000001000000A7 ++:1025E000010000000000000061D401000A0708009B ++:1025F000B533020051FB80006D310000C12E000098 ++:1026000000000000D1F980000000000029FB8000DC ++:1026100000000000000000009C1800409600FFFF32 ++:10262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA ++:10263000FFFFAAAA0300409600000000000000006F ++:10264000000000000000000000000000000000008A ++:10265000000000000000000000000000000000007A ++:10266000000000000000000000000000000000006A ++:10267000000000000000000000000000000000005A ++:10268000000000000000000000000000000000004A ++:10269000000000000000000000000000000000003A ++:1026A000000000000000000000000000000000002A ++:1026B000000000000000000000000000000000001A ++:1026C000000000000000000000000000000000000A ++:1026D00000000000000000000000000000000000FA ++:1026E00000000000000000000000000000000000EA ++:1026F00000000000000000000000000000000000DA ++:1027000000000000000000000000000000000000C9 ++:1027100000000000000000000000000000000000B9 ++:1027200000000000000000000000000000000000A9 ++:102730000000000000000000000000000000000099 ++:102740000000000000000000000000000000000089 ++:102750000000000000000000000000000000000079 ++:102760000000000000000000000000000000000069 ++:102770000000000000000000000000000000000059 ++:102780000000000000000000000000000000000049 ++:102790000000000000000000000000000000000039 ++:1027A0000000000000000000000000000000000029 ++:1027B0000000000000000000000000000000000019 ++:1027C000000000002DE97043994605460E469046EC ++:1027D00020F086FA436831469C69284642464B46BB ++:1027E000A047BDE87083C0462DE9F74F0029054694 ++:1027F00092469B46009153DB438A828A514403FBF5 ++:1028000002F399424CDA806808F038DB002101902D ++:10281000A86808F005DD4369044643F000434FF023 ++:102820000008436124E000989BF8007008EB000664 ++:102830004FF0000903E00136D04517D07F0817F0AC ++:10284000010F0CD0284621463246FEF3EDF630B19A ++:1028500063694FF0FF3023F00043636122E009F128 ++:102860000109B9F1080F08F10108E4D10BF1010BDE ++:10287000D045D8DB6369A86823F000436361002179 ++:1028800008F03EDCA868012108F03ADC2846214621 ++:1028900020F0C2F9A868019908F0C2DC002001E02C ++:1028A0006FF01C00BDE8FE8F407C704713B500F050 ++:1028B0008FD8024608B904460FE000240AE010460B ++:1028C00001A90022FFF344F7019A13782C2B08BFCB ++:1028D000013201341378002BF1D120461CBDC046D3 ++:1028E000B0F8423070B50446C3B142F2197503E046 ++:1028F0000A2003F031DF0A3D236B1B6913F070439C ++:1029000007D0B3F1005F04D0B3F1405F01D0092DCF ++:10291000EED1226B136823F01003136070BDC04624 ++:1029200070B590F878310546FF2B1FD0104C406AE7 ++:10293000E36E9847D4F89C30686A984701280BD812 ++:1029400095F8141241B90B4628460A4A03F030DEC6 ++:10295000012385F8143209E0054B686AD3F89C30EE ++:1029600095F805419847241885F8064170BDC04682 ++:10297000E0A685003D98800010B5084671B191F839 ++:102980000832012B0AD091F875313BB14B691A6AB4 ++:10299000034B02EA03030BB10EF0FEFE10BDC0466E ++:1029A00000FC0101D0F8943110B59942044601D9D8 ++:1029B000002002E00EF0F0FEE08D10BDD0F8801196 ++:1029C00010B5044691B10223C068D4F8842108F000 ++:1029D00005DB074B1B684BB9D4F88011D4F8842170 ++:1029E000E06881EA0202023308F0F8DA10BDC0465E ++:1029F000AC2702002DE9F04190F817320446012B74 ++:102A000077D00123002780F8173243E0A0683146D1 ++:102A100000F082DBD4F8F0301B68984205D92846D4 ++:102A20000021324600F00EDB42E02046FFF778FF3F ++:102A300035690023AB7194F8783131462B7294F8E4 ++:102A4000063184F80731DBB26B72D4F8FC31606A6E ++:102A50000133C4F8FC316A79274BD20982F00102B4 ++:102A60005B6A9847B0B9D4F8F8106B7900293CD06C ++:102A700013F00F0F39D06A782B7843EA02230F3313 ++:102A80001B091A0A0A6918BF0023937194F8783158 ++:102A900013722AE0D4F8F0301B68012B08D904F136 ++:102AA00028052846002100F04FDA06460028ADD15F ++:102AB000002384F81732C4F8F8302FB16269043368 ++:102AC0005364204607F03CDFE28DD4F8C8319A42C7 ++:102AD00003D9206901F0C4DD0BE0D4F8CC319A426F ++:102AE00007D2206901F0AEDD03E00127C4F8F860E9 ++:102AF000D0E7BDE8F081C046E0A685002DE9F041B1 ++:102B00000746884616461D4642F2197403E00A201D ++:102B100003F022DE0A3C79690B6D002B02DA092CE6 ++:102B2000F5D11FE0AB191B0243F00042069BB3F145 ++:102B3000807F04D198F8003043F08073D21842F2BD ++:102B400019740A6503E00A2003F006DE0A3C7B697B ++:102B50001B6D002B02DA092CF5D103E0012088F867 ++:102B6000003000E00020BDE8F081C0460022C36BC9 ++:102B70000BB1013BC363531CDAB21030102AF6D1FB ++:102B80007047C0462DE9F041066805460F4670685B ++:102B90004FF4BC7104F09CD808B9044612E000213F ++:102BA0004FF4BC720446FFF34BF2D5F86031266057 ++:102BB000C4F8603195F86431C4F8687184F8643100 ++:102BC0006B6863602046BDE8F081C04603682DE96C ++:102BD000F74F012A14BF2A25322506460F465868AA ++:102BE0002946914604F0CCD8834640B93368013871 ++:102BF0001B68D3F88C20136D013313656CE007F16B ++:102C00000E0A04695146042201A8FFF3B5F1019BA5 ++:102C100006F1280803F47F421B0643EA02234AF622 ++:102C2000FE12B2EB134F0BBF2C4907F108012046EF ++:102C300020460622FFF3A0F10622A01D4146FFF325 ++:102C40009BF104F10C02B9F1000F0DD02B0A237394 ++:102C500004F10E00557022490622FFF38DF108237E ++:102C600023750623637503E008232373062353703B ++:102C70006419A4F11C05394606222846FFF37CF1AD ++:102C8000002304F8163C023304F8153C41460622A2 ++:102C900005F10800FFF370F107F11801042205F1B6 ++:102CA0000E00FFF369F107F10801062205F1120099 ++:102CB000FFF362F15146042205F11800FFF35CF1C5 ++:102CC000D6F85C3130680133C6F85C315946D6F825 ++:102CD000682125F067DA0120BDE8FE8F2C9E850073 ++:102CE00014D2850010B50368D3F800481B6893F828 ++:102CF000AB306BB1FFF73AFF08E0A16829B10120C2 ++:102D000000F0CAF808B1FFF731FF2468002CF4D1B5 ++:102D1000002010BD7047C046C3682DE9F04106464B ++:102D20000D4658683821174603F0D2DF044610B923 ++:102D30006FF01A002BE000213822FFF381F101230C ++:102D4000294623606360A360062204F10C00FFF3B0 ++:102D500013F16B8E05F10901A3742B7A04F11400B1 ++:102D6000E3742A7AFFF308F16D8D3046A586E78675 ++:102D70002146382221230BF013DE00B907E0F36867 ++:102D800021465868382203F0B3DF4FF0FF30BDE82A ++:102D9000F081C04630B50C4690F8CF1091B0944603 ++:102DA0009E460380194D91B94FF0FF330293039370 ++:102DB000049305930D3300940191069107910891B6 ++:102DC00009910A950B900C930D910E9115E04FF01F ++:102DD000FF33029303930493059300F1D00306930A ++:102DE0004BB2002207930C2300940192089209929F ++:102DF0000A950B900C930D920E927146044A63460D ++:102E0000C06824F079D811B030BDC046F920010067 ++:102E10002C9E85001FB5836D0446012B17D1B0F899 ++:102E2000583113F0010F12D1C36893F8703273B99F ++:102E300002AA01A903AB0FF0E5F9029A3AB12046C4 ++:102E40000199039BFFF7A6FF08B90223A3651FBDE5 ++:102E500010B579B1B0F8583143F00103A0F85831FA ++:102E6000836D022B15D1C3680C21D3F8680151F092 ++:102E70009FDB0EE0B0F8583113F0010F09D023F0BA ++:102E80000103A0F85831836D1BB101238365FFF75F ++:102E9000C1FF002010BDC046012801D0002000E085 ++:102EA0008868704710B50C4641B18B6823B9C06F74 ++:102EB0000968FFF767FEA060A06800E0C06F10BD62 ++:102EC0002DE9F0418C692369994202D100273E46E1 ++:102ED00004E0CE6A0EB9374600E0376863681146F1 ++:102EE000D86803F03BDFA36805461B6893F895306C ++:102EF0001BB1C38A43F08003C382636893F8AB308D ++:102F00008BB120463146FFF7CDFF60B129460AF06C ++:102F10003FD9022807D163682946D868012203F007 ++:102F2000FFDE01200BE0204629460CF039DCA068CA ++:102F300029463A4625F036D9003818BF0120BDE8A9 ++:102F4000F081C04637B5144605461146406FFFF77D ++:102F5000E1FE6368112B08D0122B01D0102B15D184 ++:102F6000A37803F001032B7510E002AA002342F8B6 ++:102F7000043DA86894F82F103CF080D930B18379D3 ++:102F800023B96188C1F3800127F03AD93EBDC0461C ++:102F90002DE9F0470446084615460DF003FF80462C ++:102FA00010B9D4F8109001E0D0F80490A368D9F8D3 ++:102FB00024701B682A6993F895303BB1EB8A13F4AF ++:102FC000006301D001262AE01E460AE0537B127BF3 ++:102FD00043EA022348F66C02934214BF00260126FE ++:102FE000EEB9204629460CF0CDDB636893F8AB3090 ++:102FF000ABB120464146FFF755FF80B1294609F0A5 ++:10300000B9DF042801D0012804D163682946D868B3 ++:10301000002244E0052802D14FF0010801E04FF002 ++:103020000008636893F895301BB116B9AB8A2D334D ++:10303000AB82002F2FD0EEB9FB6913F0010F07D040 ++:10304000637D2BB1204629460CF0A8DC024668B10E ++:10305000B8F1000F0ED1636893F8963053B1D4F8ED ++:10306000840029460EF004F9024618B9636829461F ++:10307000D86814E063682946D86803F0ABDE3B6982 ++:103080000446DB68484639462246984748B1204600 ++:1030900003F0DCDD05E063682946D8683A4603F0B2 ++:1030A0003FDEBDE8F087C0464B6A10B591F843207B ++:1030B00043F480134B62D0F8883002F00702D21834 ++:1030C00092F88030013382F88030D0F888200123D4 ++:1030D00082F88630D0F8881091F8812091F87B3002 ++:1030E0009A4211D291F8802091F87A309A420BD20C ++:1030F00091F8822091F87C309A4205D291F8832091 ++:1031000091F87D309A4201D30DF0F0D8002010BD27 ++:103110001FB5084B02460093074B08460193074B27 ++:103120000749DB6902931268064BFFF3F5F105B01E ++:1031300000BDC046DDD60100A0D601000028020077 ++:10314000AED60100D1D6010010B5436804461B7EFF ++:1031500053B1D0F880000CF049FDA06801F048FEA2 ++:103160006268002382F8203010BDC04610B5806927 ++:10317000FFF7EAFF002010BD70B504466368806861 ++:103180001E7E0EB1002515E001F0F4FC054620B9C5 ++:10319000D4F880000CF058FD05460CF0D5F86368B3 ++:1031A000D3F89C1031B10B7823B1034B3246186829 ++:1031B000FFF33AF5284670BD2428020010B5806858 ++:1031C00001F0FEFD002010BD10B50446FFF7F6FF2C ++:1031D000A06806F083FE10BD61290DDC602940DA8D ++:1031E00054293ED003DC2F293BD0442912E0A1F121 ++:1031F0005C03012B0FD834E0AC2932D005DC7C29EC ++:103200002FD0A1292DD06A2904E0DE2929D0F42964 ++:1032100027D0CD2925D0642911DC632921DA4A2958 ++:103220001FD006DC07291ADB08291ADD3C2918D033 ++:1032300015E0502915D012DBA1F15C030DE0C32984 ++:1032400005DCC2290DDAA1F1A803022B06E0B1F5D5 ++:10325000847F06D003DBA1F58973012B01D90020FF ++:1032600001E06FF01600704731B1036B1B689942A3 ++:1032700002D06FF00C0006E090F82930002B14BF4C ++:1032800000206FF00A00704730B5072A1C469DF8F1 ++:103290000C5001DD496809B9036B1968032906D090 ++:1032A0004B1E012B10D8036B1B6899420CD12DB11A ++:1032B00090F8293013B96FF00A0007E00CB92046E6 ++:1032C00004E00020216001E06FF00C0030BDC0463A ++:1032D0001FB59646BEF1070F1A4601DC002300E039 ++:1032E0005B685F2903930ADC5E2914DA4A2916D049 ++:1032F00002DC3C2913D00CE05C290ADB0FE0AA2990 ++:103300000DD002DCA82904DB0DE0C22907D0C329B7 ++:1033100009D000200EE01946FFF7A6FF0AE00021C1 ++:10332000FFF7A2FF06E000230093114603AB7246AD ++:10333000FFF7AAFF05B000BDC88810F0080018BF4D ++:103340006FF016007047C046D1F8D83270B5054608 ++:10335000188C164610BB8B6D40F2371203EA02023E ++:10336000002A0CBF012411242A6B1368022B07D1F9 ++:1033700095F85C360133DBB2012B98BF44F0200492 ++:10338000537D53B1B06B06F13C0122F063DE20B1F6 ++:1033900095F947360BB144F48064204670BDC046B1 ++:1033A00091F801C030B5BCF1010F45DDCA788B78CA ++:1033B00043EA0223012B3FD1ACF10203032B3EDD94 ++:1033C000ACF10603012B3ADD0B1D1D1D6A781B793C ++:1033D000002043EA0222864600E00130ACF10803F7 ++:1033E000904203EB0E0406D0AEF1040EACF10403E0 ++:1033F0007344042BF1DCC0EB0203A4EB830001282F ++:103400001DDD05EB8203DA789B7843EA022E821EEB ++:10341000002301E00133043A734501D0032AF9DCAB ++:10342000C3EB0E03A2EB8303012B08DD023B06D0A6 ++:10343000C3EB0C034B7002E06FF0160000E00020BD ++:1034400030BDC0462F2A30B50446964602D86FF0EC ++:103450000D0034E0B0F88031056B0B60B0F88231BC ++:10346000AA894B60EB891B0743EA023302688B6031 ++:103470001069BEF13B0FC36BCB6093680B61836A2D ++:103480004B61C36A8B61B2F87A30CB61D4F8843176 ++:103490004B62D2F8B0300B6243688B62836BCB62B5 ++:1034A0000CD92B8900220B636B89BEF13F0F4B6354 ++:1034B0008A6303D9036C1046CB6300E0002030BD63 ++:1034C00010B519B14068302203F012DC10BDC046BF ++:1034D00010B50446D0F860068E46C37A90F80AC04C ++:1034E00093B182894FF6FF739A420DD0837B43B923 ++:1034F0008378012B05D0037B03F0010383F00101E6 ++:1035000000E00021C9B20BE0216B71450ED1837B35 ++:103510002BB98378012B02D091F84C1000E00021E8 ++:103520008C4503D08172206938F0BADE002010BDCE ++:103530004FF0FF33A0F83C3210B5044600F50E7092 ++:10354000063000210C22FEF37BF523685B6B23B968 ++:103550004FF0FF33A4F840320DE04FF00F03A4F812 ++:103560003E324FF0F003A4F840324FF47063A4F8F9 ++:1035700042324FF20003A4F8443210BD70B5044645 ++:10358000D4F8741580680CF069D8D4F8F816D0F126 ++:10359000010538BF0025A0680CF060D800B90135DE ++:1035A000A068D4F8FC160CF059D800B90135D4F84D ++:1035B000E036A068196A0CF051D800B90135D4F88A ++:1035C000E0260023D360A068D4F83C150CF046D860 ++:1035D00000B90135A068D4F894170CF03FD800B9B1 ++:1035E0000135284670BDC04610B5044625F0F2DE10 ++:1035F000204617F00BD810BD2DE9F04F0746106993 ++:10360000A5B0D1F81090884601F124011A900792D4 ++:103610000693189199F80130D2F87CA199F800200E ++:10362000339C42EA0323C3F38102022A7868089399 ++:103630000B9201D0002302E0089DC5F3C013DBB25A ++:1036400041461693FFF3E6F504300A90329888B1AC ++:10365000037A0B2B08D197F8F0375BB197F8F13765 ++:1036600043B18379072B05D832990A9A91F90F3023 ++:10367000D2180A92D7F88831002B1CDA329BD3B1CA ++:103680001B7A022B17D197F8A034A3B91A9DAB6D02 ++:1036900013F0080F0FD132988379292B0BD8032B05 ++:1036A00009D90B2B07D82F99012904D10A9A19910E ++:1036B00008320A9201E000231993D8F81030B8F8C4 ++:1036C0001420A3F1760676329D1FA8F8142000215D ++:1036D0007022C8F8106030460595FEF3B1F41898D2 ++:1036E000036813F4806F01D0828827E00799A64B06 ++:1036F0004A6802EA0303D3B1089A02F0FC03882B5C ++:1037000015D199F8043013F0010F10D1B8F8163024 ++:103710002F9D03F007032E9801EB43016B1E984287 ++:10372000B1F8BE200AD1531CA1F8BE3006E00B99B7 ++:10373000012914D000224FF0100B04E00B9B012B49 ++:103740000DD04FF0000B2E9D05F00F0343EA02133E ++:103750009BB289F816301B0A89F8173001E04FF048 ++:10376000000B3098042807D138461A9932460FF0DA ++:1037700047D8ADF88C0019E02F992E9D4B1E9D4225 ++:10378000B7F8462502D1531CA7F846352E98309934 ++:1037900000F00F0343EA02135B0147F6E07203EA0D ++:1037A000020201F007031A43ADF88C20079A92F841 ++:1037B000DF3023B9089D05F0FC03802B01D14BF0CD ++:1037C000200B724B04EA03031BB1002020942194C8 ++:1037D0001FE00B99012906D9189A1368002B02DB08 ++:1037E00013F0100008D0079C002594F8483003F02F ++:1037F0007F032093219349E0396B644B8A6C02EA82 ++:10380000030343B199F8043013F0010F03D0209261 ++:1038100021920F903BE099F8043013F0010009D099 ++:103820000798002190F848300F9103F07F03209310 ++:1038300021932CE04A6C554B02EA0303002BE6D19E ++:1038400020ABD7F8600100930DF18F0301930DF1C8 ++:103850008E0302930DF18A03039323AA21AB0799E8 ++:103860004FF028DA189A136843F00062189B1A6028 ++:10387000BDF88A3013F0010F03D0189C42F40053B6 ++:1038800023602E9DD5F1010538BF00250F95D7F88F ++:103890006036219A9C7A3B6893F8463013F0030116 ++:1038A00000F0358112F0006F02F07F0104D007298B ++:1038B00006D9202904D02EE0354B5B56002B2ADA9E ++:1038C00012F0804F01D1002A25DB22F4401121F4AF ++:1038D000605112F0006F21911AD0D7F860068378FA ++:1038E000012B15D93B6B93F94D20012A0BD0079D75 ++:1038F0006B6813F0804F0BD0B2F1FF3F08D1037B10 ++:1039000013F0040F04D041F4801343F4805301E01A ++:1039100041EAC4232193209911F0006F01F07F0246 ++:1039200004D0072A06D9202A04D036E0184B9B562B ++:10393000002B32DA219B13F0804F01D1002B2CDBBE ++:1039400021F4401222F4605211F0006F209221D035 ++:10395000D7F860068378012B1CD93B6B93F94D1087 ++:1039600001290BD0079D6B6813F0804F12D0B1F185 ++:10397000FF3F0FD1037B13F0040F0BD042F48013F1 ++:1039800043F4805308E0C046400001807F000008F7 ++:10399000401B860042EAC4232093B7F8283603F47C ++:1039A0004063B3F5406F30D13B6B18690FF0BEF840 ++:1039B000219B00F44070B0F5007F14BF0222032267 ++:1039C00013F0006F03F07F0111D0202902D11546BA ++:1039D00005222EE097F9CA34B3F1FF3F12D10798C0 ++:1039E000436813F4002F23D01546042221E09C4B9A ++:1039F0005B56002BB4BF97F9C93497F9C834B3F1BB ++:103A0000FF3F15D015469AB213E0219B03F07F03C8 ++:103A1000202B04BF4FF000632193209B03F07F0312 ++:103A2000202B04BF4FF00063209302252A4600E0BC ++:103A30001546219B110223F4E06341EA030321931D ++:103A4000209B23F4E06213F0006F14BF41EA0203ED ++:103A500042EA05232092219A209312F0006F06D0AB ++:103A600097F9DC31012B02D142F4000304E097F90D ++:103A7000DC3113B922F400032193209A12F0006F75 ++:103A800006D097F9DC31012B02D142F4000304E0A7 ++:103A900097F9DC3113B922F40003209307993846D3 ++:103AA00012F03ED9219911F0006202D111920E92CA ++:103AB0001DE0D7F8583693F90530022B02D00022CA ++:103AC0000E9207E0C1F30223043B012B8CBF0023BD ++:103AD00001230E9311F4000F05D001F07F03072B93 ++:103AE00003D9202B01D0119001E0042311932099D8 ++:103AF00011F0006201D112921DE011F4000F16D0F6 ++:103B000001F07F03072B14D9202B12D00FE0209B4C ++:103B100022F4E06223F4E06342F4007243F40073A1 ++:103B200002252192209311910E91129103E012909F ++:103B300001E0042412940F9888B11A99219BD1F8BE ++:103B400010231A9801EBC201C1F814332F9C0132E3 ++:103B5000E3B202F03F02C1F81833C0F81023BAF103 ++:103B6000000F36D0FA68DAF80434D2F880410AEB54 ++:103B7000C303C3F80442D2F884013A4AC3F80802E6 ++:103B8000B8F8163003F00703D35C022B11D1DAF832 ++:103B900000100AEBC102C2F80441C2F80801219BDF ++:103BA000013153602F9C01F01F01E3B29360CAF80A ++:103BB0000010DAF80424219B0AEBC201C1F8083492 ++:103BC0002F980132C3B202F03F02C1F80C34CAF898 ++:103BD0000424219911F000642AD011F4000F01F49B ++:103BE000E06312D01B0A043B012B1F4801F07F0247 ++:103BF00005D8142302FB0303D3F80C801AE0142326 ++:103C000002FB0303D3F8088014E01B0A043B012BDA ++:103C1000154801F07F0205D8142302FB0303D3F8F3 ++:103C2000048007E0142302FB03F353F8008001E053 ++:103C300001F07F080B9A022A00D0BAB9B7F83836DB ++:103C40000A98984204DC189A136813F0806F0DD01C ++:103C500099F8043083F0010303F0010307E0C04644 ++:103C6000401B8600C4D285008418860000230D9373 ++:103C70003B6B587D50B1D7F858361B7833B12CB90F ++:103C8000924A01F07F03D356002B0BDB3B6893F87D ++:103C9000463013F0030F2CD05CB3D7F8583693F9A5 ++:103CA000053033B32F9A012A13D9D7F858361B7829 ++:103CB0000BB1162300E03023189C20932193236836 ++:103CC00023F000632360209B43EA05232093219384 ++:103CD0000FE070B1D7F858361B7853B14CB97B4A16 ++:103CE00001F07F030E98D35630EA230028BF01204D ++:103CF0000E90219A12F0006F15D102F07F03022B73 ++:103D000005D0042B03D00B2B01D0162B0BD1069919 ++:103D100039B1022B05D097F95C36013B18BF01235E ++:103D200000E000231193209B13F0006F16D103F0E5 ++:103D30007F03022B05D0042B03D00B2B01D0162BB5 ++:103D40000CD1069C44B1022B06D097F95C36013B9E ++:103D500018BF0123129301E0002012900B99079CD9 ++:103D6000022904BF079BC3F86021636813F4803FF6 ++:103D700040D097F8CE31002B3CD097F8D131002BB2 ++:103D800038D0D7F8583693F90530032B32D0219B21 ++:103D900013F0006F09D103F07F03022B2AD0042B0C ++:103DA00028D00B2B26D0162B24D099F8043013F0F2 ++:103DB000010F1FD1089800F0FC03882B1AD1189925 ++:103DC00001240B684BF4A04B43F480530B60079B1A ++:103DD0001094D3F8F0204FF69F73002A0CBF1822DE ++:103DE0001E2239F8021001EA030343F0200329F8E8 ++:103DF000023001E000201090384621990A9A059B74 ++:103E00000DF17A0419F028DC2346384620990A9AE5 ++:103E100019F022DC062206F136002146FEF3ACF052 ++:103E2000209B13F0006F10D103F07F03022B05D00D ++:103E3000042B03D00B2B01D0162B06D10A99C1F30A ++:103E4000072386F83A1086F83B30189B1A6812F45C ++:103E5000806F13D0219B13F0006F0FD0329C14B1F0 ++:103E6000237A042B0AD1189842F40063036097F870 ++:103E7000C3340D99002B18BF01210D91219911F028 ++:103E8000006F0AD1114A01F07F03D356002B04DAE8 ++:103E9000059A137803F00F0301E0059B1B78089C3B ++:103EA0000C93A42C14D099F8043013F0010F0FD107 ++:103EB000109878B9119A319B38460FF06FDE89F867 ++:103EC0000200C0F30F2089F803001DE0401B8600AC ++:103ED000109A62B1119A384640F62A1319F052D955 ++:103EE000023080B289F80200000A89F80300089BBA ++:103EF000A42B09D199F8023099F8032043EA022350 ++:103F000086F83C301B0A09E099F8043013F0010FE1 ++:103F100001D1109C2CB1002386F83C3086F83D304E ++:103F20000BE02099129A319B38460FF037DE86F865 ++:103F30003C00C0F30F2086F83D001898036813F486 ++:103F4000007F0DD083894BF4005B86F842301B0A5A ++:103F500086F84330C38986F844301B0A86F845301A ++:103F60002E9909B94BF0080B09F104021B9299F83C ++:103F7000043013F0010F14D1189B1A6812F4805FFB ++:103F80000FD197F8D03113B112F0400F09D112F4CC ++:103F9000806F04D1169C14B197F8F8310BB94BF02F ++:103FA000010B0B98022814D197F8CE318BB1B8F1E0 ++:103FB000040F0ED9AB4B30995B5C07EB4303B3F8AE ++:103FC000FE3123B1189A136813F4806F01D04BF4BB ++:103FD000805B3B6B18690EF0A9FD199B00F44060F3 ++:103FE000B0F5406F08BF4BF4807B0BB14BF4004B36 ++:103FF0004FEA1B2386F800B07370329CECB197F83F ++:10400000A034D3B91A98836D13F0080F15D1237A11 ++:104010000B2B08D197F8F0377BB197F8F13763B1E4 ++:10402000A379072B09D832998A79292A05D80B7BDD ++:1040300003F0070343EA021A01E04FF0000A189A5E ++:10404000129C1368494613F0005F18BF4AF0080A33 ++:10405000631EDBB2012B98BF4AF4005A301D0222C6 ++:10406000FDF38AF70023B371F37186F82C3086F8DC ++:104070002D303298002849D097F8A034002B45D134 ++:104080001A998B6D13F0080040D1329B1A7A0B2AD3 ++:104090000BD197F8F037002B38D097F8F137002B79 ++:1040A00034D0329CA379072B30D832998B79292BC5 ++:1040B0002CD8089C09F1180104F44073B3F5407F33 ++:1040C000169B08BF09F11E0103B10231022A11D16A ++:1040D0003246329C2318B3F8BC309375C3F30723E0 ++:1040E000D375831C02320A2B1846F2D106F1200048 ++:1040F000032209E00B2A06F1160002D10231053233 ++:1041000002E0329B93F90E20FDF336F706221B994D ++:1041100006F12600FDF330F79DF88C30002486F878 ++:104120004C309DF88D3086F84D30D7F84C011A99F7 ++:104130004AF0EEDF96F8463096F8472080B243EA20 ++:10414000022343EA00239BB286F846301B0A86F816 ++:10415000473086F84E4086F84F4086F8504086F843 ++:10416000514086F8524086F8534086F8544086F80D ++:10417000554086F8564086F857400D9808B10E9481 ++:1041800003E00E99002900F01D81002221992B46A1 ++:10419000384622F051DE00228046209938462B46D0 ++:1041A00022F04ADE18F000628346099206D12E4BB7 ++:1041B00008F07F029B56002B2ADA36E018F4000F35 ++:1041C00008F4E06310D01B0A043B012B274808F0D9 ++:1041D0007F0204D8142302FB0303DB6814E01423DA ++:1041E00002FB03039B680FE01B0A043B012B1F48E3 ++:1041F00008F07F0204D8142302FB03035B6803E08A ++:10420000142302FB03F31B58023B18BF012302E0F7 ++:10421000931E18BF012343B197F95C36012B04D0DC ++:1042200001234AF4804A139301E0002413941BF005 ++:10423000006F06D10C4B0BF07F029B56002B30DA3F ++:104240003CE01BF4000F0BF4E06316D01B0A043BA8 ++:10425000012B06480BF07F020AD8142302FB03034C ++:10426000DB681AE098E08500401B86008418860011 ++:10427000142302FB03039B680FE01B0A043B012B82 ++:104280009D480BF07F0204D8142302FB03035B68F4 ++:1042900003E0142302FB03F31B58023B18BF012366 ++:1042A00002E0931E18BF012343B197F95C36012B3E ++:1042B00004D001254AF4004A149501E0002014902E ++:1042C0000E993278737821B142EA032343F40063F4 ++:1042D00003E042EA032343F0060333701B0A7370C2 ++:1042E0000E9B06F15802002B0CBF14250E251592CB ++:1042F0001DAC2A4638464146159B19F0ADD92346D8 ++:104300002A463846594619F0A7D92146062206F111 ++:104310002E00FDF331F6139C119D0A9800940024A1 ++:104320000E99219B0195029042460394384619F05C ++:10433000B3D986F86000C0F30F2086F861001499A5 ++:10434000129A0A9B009101920E9902930394209B6A ++:1043500038465A4619F0A0D986F83400C0F30F2029 ++:1043600086F835000E9D06F162004DB16FF03B03FB ++:1043700009F10A01062286F85E3086F85F4008E0FF ++:104380006FF04B0386F85E300E990C2286F85F10B2 ++:104390001B99FDF3F1F5099A52B9584A08F07F03C9 ++:1043A000D356002B04DA159C237803F00F0301E0A9 ++:1043B00096F858300C9D1B0243EA050506F15E098C ++:1043C0000C951BE00E99062206F15800FDF338F615 ++:1043D0000E99102206F15E00FDF332F606F12E0072 ++:1043E0000E990622FDF32CF60E9886F8340086F816 ++:1043F00035008146139014908046834618990B68C7 ++:1044000013F4806F0BD0219A12F0006F07D0D7F809 ++:10441000400107990A9B2AF0B3DF86F833004FEA80 ++:104420001A23F37086F802A00C9A130AB274F3747C ++:10443000209B13F0006F02D097F8C0A40EE003F0A9 ++:104440007F03022B07D0042B05D00B2B03D0163B88 ++:1044500018BF012300E000231FFA83FA18F0006F51 ++:1044600003D097F8C0349D000EE008F07F03022BC4 ++:1044700007D0042B05D00B2B03D0163B18BF01230C ++:1044800000E000239B009DB21BF0006F03D097F863 ++:10449000C0341C010EE00BF07F03022B07D0042B6D ++:1044A00005D00B2B03D0163B18BF012300E00023DF ++:1044B0001B019CB23B6B18690EF038FB45EA0A03FE ++:1044C0002343C0B243EA002333751B0A7375219B53 ++:1044D00013F0006F02D097F8C04413E003F07F039D ++:1044E000022B0DD0042B0BD00B2B09D0B3F11600EF ++:1044F00018BF012005E0C04684188600401B8600D6 ++:10450000002084B2119D6B1EDBB2012B07D83B68E3 ++:1045100044F01004D3F88C209369013393612199FE ++:10452000384615F02BDB44EA000080B23072000AF6 ++:104530007072219938461FF055DEB072C0F30F201B ++:10454000F072209938461FF04DDE3073C0F30F2013 ++:1045500070730D9808B90E9979B1414638461FF02D ++:1045600041DEB073C0F30F20F073594638461FF098 ++:1045700039DE3074C0F30F207074219911F0006F90 ++:104580000CD0119A042A09D10A9A384618F0ACDEE8 ++:1045900086F83E00C0F30F2086F83F00209911F006 ++:1045A000006F0CD0129B042B09D10A9A384618F0E0 ++:1045B0009BDE86F84000C0F30F2086F84100079C80 ++:1045C000636813F0400F00F0CE80169D002D00F0C0 ++:1045D000CA806A4B30981B5C179307EB4303B3F810 ++:1045E000FE31002B00F0BF8018990B6813F4806F28 ++:1045F00040F08D802E9A002A40F08980219C384618 ++:104600002146119A0A9B18F0BDDD8246B9F1000FD0 ++:104610001AD04146139A38460FF082D8149A0446AD ++:10462000594638460FF07CD899F8032099F80230A3 ++:1046300043EA022303EB040896F8352096F8343059 ++:1046400043EA022318181BE0109B13B1804648462A ++:1046500016E02146119A4B4638460FF09FDA209C0F ++:10466000129A21460A9B00EB0A08384618F08ADDA8 ++:1046700021460546129A38464B460FF08FDA40190C ++:104680001FFA88F3B3711B0AF37183B286F82C30DA ++:104690001B0A86F82D30179C07EB4403B3F8FE5134 ++:1046A000CAEB0804A54225D31898036813F0400FFD ++:1046B00002D0309901291DD038462199119AC4EBB6 ++:1046C00005030FF035D8FF2802D84FF4807304E0BB ++:1046D000B7F82A36834228BF034699B2309B07EBCE ++:1046E0004302B2F82C368B4204D0A2F82C1638467E ++:1046F00026F0CCD83B6893F84430002B33D0309C64 ++:10470000032C30D8D7F864011799424628E03B685B ++:1047100093F844303BB3309D032D24D8B9F1000FFA ++:104720000CD0139A384641460EF0FADF99F8032070 ++:1047300099F8023043EA02231A180EE0219C119ADC ++:1047400021460A9B384618F01DDD119A0546214680 ++:1047500038464B460FF022DA4219D7F86401179910 ++:10476000079B3DF02FDD1898036843F08403036036 ++:10477000BDF88C0025B0BDE8F08FC04698E08500FC ++:104780002DE9F0479946536A064613F4007F8846A0 ++:1047900017469DF920A0146902F1240515D0E86898 ++:1047A00083B2000C84F8423084F844001B0A000AEB ++:1047B00084F8433084F845002378607843EA002386 ++:1047C00043F4005323701B0A637033682D6993F818 ++:1047D000443093B1F36A03EB4803B3F91C3063B977 ++:1047E0005DB12B69D3F8D43293F89D30032B04D9F3 ++:1047F000D6F864012B463DF0C5DDB8F1040F22D197 ++:1048000094F84D3094F84C2042EA0324336893F82E ++:104810003830D3B1384612F045D906EB8000D0F8D5 ++:104820004C12D1F85835D1F860055A1CC1F85825FA ++:10483000C369A1F8C8409A4288BFC261D1F8602517 ++:10484000136A013313624FF6FF74B9F1000F05D0FC ++:10485000F26A02EB4802938B534493834FF6FF7343 ++:104860009C4204D03069A821224639F0F3D933693B ++:10487000394603EB8803D8680C4B4A465B6A984775 ++:10488000002810DA0A480CF00FFF0A4A13680133B7 ++:104890001360B9F1000F06D0F26A02EB4802938B65 ++:1048A000CAEB03039383BDE8F087C046E0A685000A ++:1048B000BC568600E827020070B50D46D0F8601699 ++:1048C0000446CB7AAB420CD025B10C31B0F8282687 ++:1048D00015F098D9D4F860362046DD72216BFEF7CA ++:1048E000F7FD002070BDC0462DE9F04F89B00023D0 ++:1048F0000D46179907460492149CDDF854800793DF ++:104900000693DDF848B0DDF84C903AF073DD049A78 ++:10491000824602F001060096386829462246434640 ++:104920001EF0D2DC0590002840F0ED80B5F906308D ++:10493000002B1CDAA9882A895EB1169BCDF800806D ++:1049400003930194CDF8088049003869013123466A ++:1049500009E0169BCDF8009003930194CDF80880F0 ++:10496000386949005B4638F0FBD80590CBE0B9F1D7 ++:10497000030F0DD9042207A85946FDF3FDF2B9F142 ++:10498000070F05D906A80BF104010422FDF3F4F288 ++:10499000049A0799931E1F2B21D8DFE813F02300F8 ++:1049A0002500270029002E00310038003A004B0076 ++:1049B0004D0053005500570059005B005D005F003B ++:1049C000200065006C0074007600870089008D006F ++:1049D0008F00940096009B002000A6009D006FF0C1 ++:1049E00016038FE04A4B09E0494B71E0494B05E063 ++:1049F000002900F38580474B05E0474B1B6879E0B1 ++:104A000000297DDB444B1960444B002239E0444BC4 ++:104A1000F4E719B1434B1B68002B71D0404B0022C7 ++:104A20001960414B1A60414B1A60414B1A60414B6F ++:104A3000013A26E03B4BE1E73A4A1368002B5FDD81 ++:104A4000116060E03C4BD9E73B4B41E03B4BD5E785 ++:104A50003A4B3DE0344BD1E7334B39E0D7F86C3279 ++:104A6000D3F8D8329B6845E0354B1A68354B1B6844 ++:104A700043EA02433EE0324B0A141A60314B01F024 ++:104A8000FF021A603FE0304BB8E72F4B1960002956 ++:104A900039D02E4B002119602D4B4FF0FF321A6098 ++:104AA0002C4B1A602C4B19602C4B11E02C4BA5E7BA ++:104AB000002925DD2A4B0BE02A4B9FE74B1E092BD3 ++:104AC0001ED8284B04E0284B98E7002918DD264B18 ++:104AD000196018E0254B91E79AF8063063B9244B2A ++:104AE0000A1E18BF01221A700DE09AF806301BB991 ++:104AF0001F4B1B78236006E06FF00602059202E070 ++:104B00006FF01C030593059809B0BDE8F08FC0460F ++:104B1000EC270200D8270200E0270200B827020095 ++:104B2000C0270200401E0200D4270200D027020046 ++:104B3000C8270200B42702002C1E0200441E0200F7 ++:104B4000142C0200102C0200BC270200E4270200F3 ++:104B5000281E0200381E0200C4270200DC270200C3 ++:104B6000341E02003C1E0200241E0200CC2702005C ++:104B7000B027020037B5036804465B7E002B40F087 ++:104B8000C480026992F8EA305BB1D36ED3F8202179 ++:104B900040F2044302EA0303B3F5806F40F0B580AE ++:104BA00005E0106E0AF050FE002840F0AE80236849 ++:104BB00093F8203033B9206907F062FE22680123A0 ++:104BC00082F8203023681B6FFBB9206907F0D6FDFF ++:104BD00010F1090F19D12268136F13F0020114D1DB ++:104BE00043F0020313670D4604EB8503D3F84C1220 ++:104BF00041B18B7933B94B7923B18B7C13B120460A ++:104C00003AF03ED90135082DEED123681D6F1DB154 ++:104C1000204612F079D976E0012384F82930204625 ++:104C200021F004D82368596B39B103234FF4807203 ++:104C3000009320462946134605E0032300932046AF ++:104C40004FF480720B461EF0BFDFA0680AF02CDD27 ++:104C5000236801221A7694F89D3173B120460CF036 ++:104C6000C1FDD4F840352046598E23F0DFDE002305 ++:104C700084F89D3120461DF0C3D9B4F85C17204656 ++:104C800021F04CDF206907F0DFFF236893F82F3015 ++:104C90001BB1D4F8340730F03DD8236893F8313095 ++:104CA0007BB1002504EB8503D3F84C1231B18B792D ++:104CB00023B94B7913B1204635F0FADE0135082DC2 ++:104CC000F0D1204615F00EDF204618F0EDFA012550 ++:104CD000D4F8AC114FF448720123A0680AF076DCD6 ++:104CE000204684F8F15125F0D1DD204614F072DF22 ++:104CF000204626F02DD950B1204626F007D920466F ++:104D0000294626F00DDB002001E06FF008003EBDD3 ++:104D1000D0F8403570B55D8E064605F44063B3F5B6 ++:104D2000406F22D1036893F8463013F0030F0BD085 ++:104D300005F47041D0F85C01B1F5805F14BF00212B ++:104D4000012141F0B7DA80B92846FEF36BF2044640 ++:104D50002846FEF367F244F430640E288CBF4FF40B ++:104D600080504FF400500443A5B2326B05F47043F9 ++:104D70005268B3F5805F14BF00230123934205D02E ++:104D8000D6F85C01012140F0B9DD0546D6F85C019A ++:104D9000294641F003DB80B905F47043B3F5805F29 ++:104DA00014BF38233C23F358346BD6F85C013363CB ++:104DB000012140F0A3DD34630546284670BDC0469E ++:104DC00070B50025044680F8E85124F0B7DDE36AA9 ++:104DD0002946986A8022FDF333F1206908F0BAF978 ++:104DE000D4F840012AF09EDCC4F8885670BDC04655 ++:104DF0002DE9F04390F8A03187B00446002B40F035 ++:104E0000ED8003681B7E002B00F0E880012380F812 ++:104E1000A031006907F0E6FE2269074692F8EA3001 ++:104E20005BB1D36ED3F8202140F2044302EA0303BE ++:104E3000B3F5806518BF012503E0106E0AF004FD8C ++:104E40000546002D6FD1D4F8680104214FF0B0DB86 ++:104E5000204621F0A3DE00B90137A94604EB09037F ++:104E6000D3F84C62002E59D096F80680B8F1000FA6 ++:104E700054D1304633F06ADC73793F18002B4DD0A3 ++:104E8000236893F83130002B3FD0D6F8CC3013F0A4 ++:104E9000010F3AD0204631460CF0B4FC23683F188D ++:104EA00093F89530002B39D0D4F86C122046BC31E1 ++:104EB00050F074DC0546002830D02046294622F008 ++:104EC0008BD82B7E13F0020F19D02846022150F008 ++:104ED000B7D8B17CD4F86C32D1F1010138BF0021D0 ++:104EE000082201920291204631460332BC33CDF8AC ++:104EF0000080CDF80C80CDF8108017F00FDED4F8CC ++:104F00006C22012382F8F03008E02046314639F067 ++:104F1000B7DF3F184FF47A6001F01EDC09F1040995 ++:104F2000B9F1200F9AD10025D4F8B434EA18136BE4 ++:104F300013B1506A98473F18343540F2AC439D4254 ++:104F4000F2D194F8F1314BB1A068D4F8AC110AF069 ++:104F500085DB00B90137002384F8F1312046FEF7E4 ++:104F60000DFB236800211976236B4FF0FF32C61921 ++:104F700018690DF0B3FD204615F08ADAD4F878529E ++:104F800007E00023291D606801220093FDF35AF712 ++:104F90002D68002DF5D1236893F82F3073B1631974 ++:104FA000D3F84C1239B18B792BB10B791BB1204658 ++:104FB0000CF028FC36180435202DF0D1D4F87C02F2 ++:104FC00010B10BF03BFE3618206907F0BDFD002341 ++:104FD000801984F8293084F8A03100E0002007B05F ++:104FE000BDE8F0832DE9F04F9BB005462598089267 ++:104FF0000793827AC37A0F4642EA0323269A00F186 ++:105000000C010C3A08980A9113930B92C27D837D90 ++:105010000DF1580943EA0223C3F3C70ABAF10E0F90 ++:1050200094BF002101210F91079918F0C1F8249A2B ++:1050300028460A32114609920F9A50F0B9DB002433 ++:10504000804615AE28462599269A4B461594169407 ++:1050500000961CF0DFDF30B928462599269A4B468A ++:1050600000961EF0D7DFB8F1000F06D0D8F8043054 ++:1050700013F0010F01D00C9427E00B990A9832220B ++:10508000FDF31CF3014620B14078023120F0E2DF4D ++:1050900058B90B990A980122FDF310F3014638B173 ++:1050A0004078023120F0D6DF10B101230C9301E0EB ++:1050B00000200C90B8F1000F07D00C9929B9D8F84E ++:1050C000043043F00103C8F804300A980B99032216 ++:1050D000FDF3F4F2044608B14378A3B92B6893F8C2 ++:1050E0003F3053B1B5F82606C3B2534503D0FEF3A3 ++:1050F00099F0504501D1012300E0002300225FFA1E ++:1051000083FB0D9211E02B6893F83F3043B1B5F863 ++:105110002606FEF387F0A378834201D1012300E045 ++:1051200000235FFA83FBCDF834B0BBF1000F01D14F ++:105130005B4602E03B1E18BF01235FFA83FA2B682F ++:1051400093F8463013F0030002D11090119024E040 ++:1051500095F8723263B9BAF1000F09D0D7F8D4329A ++:10516000DB8813F0200003D110901190129018E00A ++:105170000A990B9A284620F0DFDF0A9911900B9AC2 ++:10518000284620F0A5DF2B68109093F94C0020B141 ++:1051900028460A990B9A1DF0C9DC1290BAF1000F4B ++:1051A00069D02B6893F8463013F0030F63D0109B3F ++:1051B000002B60D0119800285DD019785A782846C5 ++:1051C0000FF0E0DEB5F82696064609F47043B3F515 ++:1051D000005F0CBF38233C23EC58D5F85C016168B4 ++:1051E00040F08CDA10F0080F01D0002104E094F8B0 ++:1051F000EC30191E18BF0121119A137813F0020325 ++:1052000017BF10981A464378C3F3800209F440632D ++:10521000B3F5406F18D1B5F82636B34202D100215C ++:105220000E912EE02B6893F82F30002B40F05B841A ++:105230003046FDF3F7F70446B5F82606FDF3F2F71E ++:10524000844240F0508414E0A9B1A2B106F4406356 ++:10525000B3F5406F0FD12B6893F82F3073B93046F8 ++:10526000FDF3E0F70446B5F82606FDF3DBF78442CC ++:1052700004D10E9605E000220E9202E000230E9368 ++:105280009A462B6B5B7D002B3AD0BBF1000F37D0D9 ++:1052900095F8723233B995F87432002B30D0BAF1E8 ++:1052A000000F2DD195F849365BB1159B002B08DD19 ++:1052B000169B1B7813F0040F03D0D5F8582604234F ++:1052C000136195F8493653B10C9850B9139911F000 ++:1052D000200F0ED1D5F858260423D36009E00C9A8C ++:1052E0003AB1159B002B08DD169B1B7813F0010FBC ++:1052F00003D0D5F8582604231362284625F06CDE27 ++:105300002B6893F8463013F0030F46D0BBF1000F23 ++:1053100043D095F8723233B995F87432002B3CD0F3 ++:10532000BAF1000F39D1B5F8263603F44063B3F56E ++:10533000406F14BF00210121109B13B90C9830B9A4 ++:1053400016E0109A937803F00303032B05D1D5F8E8 ++:10535000582604239361109B53B11098837803F06F ++:105360000303022B04D119B1D5F858260233D362B6 ++:10537000119A7AB1109B6BB111985A78037813F097 ++:10538000020F07D112F0040F04D019B1D5F8582636 ++:105390000423D362284625F0D1DE2B6893F82F3002 ++:1053A000E3B1D5F8FC341B78C3B10D99B1B92846E7 ++:1053B00011992FF01FDA88B128460D992FF01CDBC8 ++:1053C00028462FF00FDBB5F8263603F44063B3F51B ++:1053D000406F03D1284601212FF080DAB8F1000F89 ++:1053E00029D0D8F8F03033B300230B99824A0A98B9 ++:1053F00000931CF087DF41460246284620F0C0D9C2 ++:105400002B6893F8463013F0030F14D0119A2AB189 ++:10541000129B28460093109B41460AE0D8F80430BE ++:1054200013F4803F07D01198119A00904146284606 ++:1054300013461DF0DBDB95F87032002B00F06C8317 ++:105440000FB93E4601E0D7F8DC62BAF1000F00F078 ++:1054500083802B6893F8463013F0030F3DD0BB7C5C ++:1054600043B9B8F1000F08D1284609990F9A50F0B6 ++:10547000B9DA8046B8F1000F2FD01199C9B1D7F829 ++:10548000CC3013F4005F05D0B7F8343543F0200377 ++:10549000A7F83435129A109B009228464146119A7B ++:1054A0001DF0A4DBB7F8343523F02003A7F834351A ++:1054B0000DE0BB7C5BB9D8F8043013F4803F06D014 ++:1054C000119B284641461A4600931DF08FDB284663 ++:1054D0000A990B9A434620F079D9089928461EF07C ++:1054E0005BDA41B238461EF099DA38461EF0EED942 ++:1054F0000899284612F0E4DA0146384611F046DAF7 ++:10550000BB797BB9D7F8E032D7F8D422188A9B8AC6 ++:105510005085938573792BB9BB7C1BB1384601212B ++:1055200035F038DF0023B371F371BC7CA4B996F871 ++:105530008530012B10D186F88540D5F8400126F042 ++:10554000FDDF284639460F22234600940194029439 ++:105550000394049417F0E2DA002F5AD0BB79002BA1 ++:1055600057D1BB7C002B54D0259925988B784A784D ++:105570001B0443EA02230A781343CA78043143EA3E ++:1055800002698B784A781B0443EA022302791343A9 ++:10559000CA7843EA0264F26912B9336A13B935E092 ++:1055A000944204D3944231D1336A99452ED2DDF826 ++:1055B00090E0002300930193029303930493284601 ++:1055C000394616220EF1100317F0A8DA384608996A ++:1055D000079A259B24F0A2DFBBF1000F16D0FB79C0 ++:1055E00063B1BB7C23B107F1BC00FDF3B5F128B971 ++:1055F00007F1BC0104E0C0460FD4010007F1D60159 ++:10560000002228461346009222F02ADDC6F8209098 ++:10561000F461BAF1000F00F01F82BB79002B40F05B ++:105620009681BB7C002B00F0928114AB00932599EE ++:105630003846269A0DF1670316F016DBBDF85010B8 ++:10564000D7F8E462A7F8201595F8EB41002C65D156 ++:1056500000284FD03378022B19D138462146B6F8AE ++:1056600026900BF0DDFDB5F8303885F8324803B1EF ++:10567000F38438461EF0A6DFD7F8E432A6F8269069 ++:105680005B8B002B4AD0384611F062DA46E02B687B ++:105690005B6B4BB195F8FA3133B1B8F1000F14D010 ++:1056A00098F8D2300F2B10D0B27822B12846394664 ++:1056B00023F0D6D832E04FF0FF330093284607F1AD ++:1056C000BC01134622F0CCDC28E095F80D372BB353 ++:1056D000B3785BB1B8F1000F05D0D8F8043023F0EF ++:1056E0000063C8F80430384616F09CDB384623F0D7 ++:1056F000B9DD13E0337A23B1718911B9384623F04B ++:10570000DFDDD7F8E4325B8B43B13378022B05D170 ++:10571000336A012B02D138461EF040DFF3781BB10B ++:105720003846002123F0C0DC737A1BB138460021D3 ++:1057300023F0B2DE2B6B5B7D002B41D0139A284601 ++:10574000C2F3802124F0B2DD169A002A38D0159BCE ++:10575000002B35DDD5F8581691F90130B3F1FF3F34 ++:1057600009D11378C3F340020B78934203D0284643 ++:10577000012120F0FDD8169B1B7813F0040318BFFD ++:10578000012385F8463695F94636012B03D0D5F826 ++:1057900058361B690BB1002300E0012385F842361F ++:1057A000B8F1000F0CD0D8F8043023F00402C8F888 ++:1057B000042095F946361BB942F00403C8F80430BA ++:1057C0002B6893F8463013F0030F36D0109B002B54 ++:1057D00033D0D5F8582692F90630B3F1FF3F27D1E0 ++:1057E000109892F90520837803F003039A4204D0BD ++:1057F00028460B211A4620F0BBD810998B78C3F3AA ++:105800008002D5F85836DB79934203D028460D2123 ++:1058100020F0AED8109A9378C3F30012D5F858361A ++:105820009B7A934209D02846102120F0A1D804E0A9 ++:10583000012B0CBF032300235371D5F85C01B5F88D ++:10584000261640F073DB90B1D5F85C01B5F826164A ++:105850003FF0ACDF2B6B18690DF068F9B5F8263610 ++:10586000834204D1002128460A461EF095DBB8F198 ++:10587000000F3FD0D8F8043013F0400F00F03F8104 ++:105880000A9B0B981893179006E02846214618AA01 ++:1058900017AB1DF063DE40B918981799DD22FCF3B1 ++:1058A0000DF704460028F0D122E1A11C0E79012E4B ++:1058B00040F025818A7995F80C3202F00F0203F04E ++:1058C0000F039A4200F01B8105F500740634204650 ++:1058D0001822FCF351F32B6893F830303BB1D5F824 ++:1058E0003407214600F563701822FCF345F338466F ++:1058F000314602E128460A990B9A10F087DC01280C ++:1059000002D128460EF018DA0E9929B195F86D35B6 ++:1059100013B9284618F0DED8259A079B0092D5F8CF ++:105920004C013946089A49F07DDAD7F8CC3013F4A7 ++:10593000005F00F0F180259B269800930190394686 ++:10594000D5F84C01089A079B4AF0C2D9E4E0BB7C29 ++:10595000002B40F081800C9909B1012102E0139ADB ++:10596000C2F34011CCB2B8F1000F15D0D8F8043012 ++:1059700014B143F0040301E023F00403C8F8043039 ++:105980000B990023664A0A9800931CF0BBDC414641 ++:10599000024628461FF0F4DE2B6B5B7D13B3159B8C ++:1059A000002B11DD169B1B7813F0040F03D0D5F8E4 ++:1059B000582604231361169B1B7813F0020F03D0A3 ++:1059C000D5F85826042353620C9B1BB9D5F85826EA ++:1059D0000433D3611CB9D5F858260423D360284674 ++:1059E00025F0FADA2B6893F8463013F0030F00F035 ++:1059F0009380109840B1837803F00303032B03D105 ++:105A0000D5F85826013393621199C9B1119BB5F8A5 ++:105A100026165A781B7843EA022010F0100F03D1A3 ++:105A2000D5F858260423536310F0020F08D101F46F ++:105A30004063B3F5406F03D1D5F8582604231363B0 ++:105A4000109828B90C9919B1D5F858260423536138 ++:105A5000284625F073DB5FE095F85735002B5BD0C7 ++:105A6000BBF1000F58D0139A12F0020F54D00A98CD ++:105A70000B990022FCF322F6034600284CD028465E ++:105A8000991C5A7839F06EDC0446002844D0837C97 ++:105A9000002B41D10899079A16F0B4DE00283BD0BC ++:105AA000259BD4F8D06226980093249B019003F1A3 ++:105AB0001002284608990123029620F053DC024682 ++:105AC00050BB296BD5F86036503106F138009B7811 ++:105AD0004BF054DA269808990090079A2046259BA7 ++:105AE00034F034DD18E000218A460E91FFF7C9BB7F ++:105AF000022385F80E32384601211CF051D90023CB ++:105B00000B990A98064A00931CF0FCDB41460246BA ++:105B100028461FF035DEEDE61BB0BDE8F08FC0462D ++:105B20000FD401002DE9F04FD2F81080C1B0D8F8A1 ++:105B3000D8A2064609910892DAF82C00DAF830105B ++:105B400000220793FCF3BAF520B1831C109342782E ++:105B50000B9205E0099A099B093210921B7A0B936C ++:105B60002CAF002128223846FCF36AF200212822BB ++:105B700022A8FCF365F2DAF830100122DAF82C00E2 ++:105B8000FCF39CF5DAF8301004463222DAF82C00E7 ++:105B9000FCF394F505463CB16278102A04D8381D10 ++:105BA000A11C2C92FCF3E8F13DB16A78102A04D8CC ++:105BB00023A8A91C2292FCF3DFF1099AD38813F0E1 ++:105BC000010F17D0316B4B7DA3B10A6D2CAC201D9A ++:105BD00054312C92FCF3D0F1D8F8CC3013F4005FA0 ++:105BE00005D0D6F84C014146224649F0E3DF0023B8 ++:105BF000229309E022AB0093099B304603F138025F ++:105C000041462CAB20F022D9B8F86250DAF82C408B ++:105C1000B5F5806FDAF8307059D0B5F5006F04D162 ++:105C20000022934611920C9257E020463946FDF32C ++:105C300051F3119020B143784FF0000B0C930BE01F ++:105C4000204639463022FCF339F5834610B9119AC3 ++:105C50000C9201E043780C93402D09D0802D07D0A1 ++:105C6000102D05D0B5F5807F02D0B5F5007F33D17A ++:105C7000D8F8582040F2371302EA030363B30C9AB2 ++:105C8000BBF1000F08BF1422402D0C922ED14FF013 ++:105C900000094F4616E0162307FB03F303F5B47320 ++:105CA00008EB03040998211D0622FCF349F140B9D1 ++:105CB00040AB03EB890204F10A0342F8B83C09F156 ++:105CC00001090137D8F8CC329F42E4D310E000221A ++:105CD000934611920C9200E045B1D8F8582040F25A ++:105CE000371302EA03030BB118230C934FF000099A ++:105CF00040F2EE5301933FAB0293079B099A002BAE ++:105D000014BF20210021304608F1C20300921CF08C ++:105D100053DB0D9030B930460D99B8F80C2332F0B2 ++:105D2000DDDE83E23F9A304602F5BC630E330A9211 ++:105D30004146099A0E93FDF707FB0A9A1070C0F3CB ++:105D40000F2050709AF8223093709AF82330D37055 ++:105D5000131D3F93079B8BB10AF124042046FCF3EB ++:105D6000FBF510B93F98214602E03F9808F1D601B3 ++:105D70000622FCF301F13F9B06333F933F9A00213B ++:105D80000F921046109B0B9A26F0EED92DAB0121F5 ++:105D90002C9A3F9026F0E8D90C9B3F90002B7CD0AA ++:105DA000BBF1000F11D0B9F1000F03D030465946B6 ++:105DB000FDF7F6FA3F9C5946204617F0A7DC3F90C6 ++:105DC0009BF80130A346637019E0402D09D0802D67 ++:105DD00007D0102D05D0B5F5807F02D0B5F5007F36 ++:105DE0005BD1A649834617F091DC099B3F9003F1F4 ++:105DF0007B02304641460BF1040313F0F5DA402DE7 ++:105E000009D0802D07D0102D05D0B5F5807F02D0A8 ++:105E1000B5F5007F41D1B9F1000F01D14C4626E024 ++:105E20009BF801300BF1020202F80390D7184FEAF9 ++:105E300019237B709BF80130002402338BF801306A ++:105E40003F9B02333F9312AB07EB041053F824102F ++:105E500002301022FCF390F09BF801300134103333 ++:105E60008BF801303F9B10334C453F93EBD1D6F874 ++:105E70006C32D3F8D8325B68022B0ED16CB10022A1 ++:105E800000920192CDF808B09BF801303046023301 ++:105E90000393572113461DF00BDE229A2AB13F9837 ++:105EA000322123AB26F060D93F90DAF82C401CE079 ++:105EB0006278C1F102031B199B18671C83421CD82E ++:105EC000119BA34219D02378012B0BD9302B09D079 ++:105ED00002323F982146FCF34FF03F9B6278023339 ++:105EE0009B183F933B78A21CD41834B1DAF82C10DD ++:105EF000DAF830000B189C42DAD3336893F8463056 ++:105F000013F0030F18D0089A536813F4803F13D08E ++:105F1000326B0DF1DB041368404621466532022BDB ++:105F200014BF0023012326F081D83F982D211A2287 ++:105F3000234626F019D93F9096F8653633B106F519 ++:105F4000CC613F98043117F0E1DB3F90336893F860 ++:105F5000463013F0030F1FD0089A536813F4803FA4 ++:105F60001AD0326B0DF1DB0113684046022B14BFCF ++:105F700000230123653226F059D83F990E9B8B42AE ++:105F800001D2002202E00E9BC1EB030230460DF16C ++:105F9000DB0325F009DF3F9033685B6B4BB3099A55 ++:105FA000D38813F0040F24D00DF1F50034490322F7 ++:105FB000FBF3E2F702238DF8F83000238DF8F93077 ++:105FC00001338DF8FA3096F8FA313BB1099A92F91B ++:105FD0006A30002B02DA96F80A3700E000238DF8C9 ++:105FE000FB303F98DD2107220DF1F50326F0BCD8E8 ++:105FF0003F90B5F5806F02D0B5F5006F06D1D8F8A7 ++:106000002C3543B33F98D8F8281505E00C9B13B303 ++:10601000119A2AB13F98114617F078DB3F901AE0A9 ++:10602000402D18D0802D16D0102D14D0B5F5807FBE ++:1060300011D0B5F5007F0ED03F9C1249204617F0D5 ++:1060400065DB099B3F9003F16B023046414604F14A ++:10605000080313F0C9D96B1E9BB2012B03D9042D81 ++:1060600001D0082D10D1099A506E002838D0B2F80E ++:1060700068100C300C39FDF32DF11BE0CCD28500FB ++:1060800017D40100E2D28500402D09D0802D07D021 ++:10609000102D05D0B5F5807F02D0B5F5007F1FD15A ++:1060A000099B586EE0B1B3F868100C300C393022FF ++:1060B000FCF304F3A0B1D6F86C32D3F8D8325B68A5 ++:1060C000022B0DD14378102B0AD902330022029003 ++:1060D0000393304657210123009201921DF0E8DC22 ++:1060E000D8F8583013F0040F01D004230EE013F059 ++:1060F000020F01D0022309E013F0010F01D00123A8 ++:1061000004E013F4807318BF4FF48073089A13648B ++:10611000336893F8463013F0030F2DD0089A136CB0 ++:10612000013B012B09D8536813F4802F05D0114689 ++:106130003046062224F0B4DD1EE0089A536813F4BA ++:10614000802F19D011463046062224F04DDD30460E ++:1061500016F07ADF012801460ED1D6F8F83742F260 ++:106160000E721B88013B9BB2934202D83046013924 ++:1061700000E0304628F0AADF3F9C0E9BA34201D2EC ++:10618000002302E00E9AC4EB020300932023019344 ++:10619000002123464FF0FF32404639F0C5DF0F9B08 ++:1061A00000273F90C01A03930490414655223B4676 ++:1061B000304600970197029716F0B0DC0A9A3F9B91 ++:1061C000A2F11805C5EB0304DAF834100D9B9C828C ++:1061D00021B17068DAF8382000F08ADD0A9A706818 ++:1061E000C5EB0203E41A214600F072DDCAF8340060 ++:1061F00040B1079BCAF838408AF83C300A992246D9 ++:10620000FBF3BAF6099A3046B2F862300197C3F34D ++:10621000401300930297089B0D99D6F804281FF0AD ++:1062200081DC0D9B002808BF00230D930D9841B021 ++:10623000BDE8F08F2DE9F04F95B0079119690692EE ++:1062400005930A9101F106098A7999F80130064609 ++:1062500042EA0323069A0893C0F87828C3F381051D ++:1062600013465B79127942EA0323099303F003038F ++:10627000022B08D1089C14F4004F04D0D5F101037F ++:1062800038BF002300E00023DBB205990B930B9A83 ++:106290008B8AA3F10A0893001DB918339845C0F200 ++:1062A000A081089B03F0FC07A42F03D0842F01D00A ++:1062B000942F03D1B8F10F0F40F3938199F8043074 ++:1062C00009F1040A13F001030C9303D00024109485 ++:1062D0000D9408E05146304639F020D8011E18BF11 ++:1062E000012110900D9125B1002293460E920F923C ++:1062F00010E009F110043046214638F0EBDF0E9033 ++:1063000010B183460F9505E03046214639F04CD850 ++:1063100083460F9096F8C83123B9326892F82C3032 ++:1063200033B925E030460699059A00230FF068DD61 ++:10633000A42F03D0842F01D0942F01D10D9B53BBE8 ++:10634000802F28D0502F26D0002D40F006840D9CA1 ++:106350000CBB5046FCF3F0F2002800F0FE83BBF1CA ++:10636000000F18D109F11000FCF3E6F298B9F4E33C ++:106370000C9981B90D9B43B192F838305BB155B996 ++:10638000BBF1000F07D1109C2CB9D2F88C20936F71 ++:1063900001339367E1E396F8C8317BB9BBF1000F95 ++:1063A00001D05C4601E0D6F86C4294F8E5302BB1A0 ++:1063B00030460699059AA3680FF022DD012D10D111 ++:1063C000C42F0ED0D42F0CD009F10A00FCF3C4F274 ++:1063D000002840F0C28399F80A3013F0010F40F012 ++:1063E000BC83059930460B69A1F8148006330B6114 ++:1063F00033684946D3F88C20D36C0133D3641FFA39 ++:1064000088F30093069A13AB12F072D830B1336858 ++:10641000D3F88C20D36F0133D3679EE3139A12B164 ++:1064200033689B6A1362012D39D1059A059B106967 ++:10643000998A00F11002059C1A61A1F11003A38250 ++:106440000B9B2BB100F11402A1F114032261A38272 ++:106450000599A42F8C8A0FD113990B699B79002B76 ++:1064600000F07B8391F8DF30002B00F0768330461C ++:10647000089A2FF0DDDD70E3336893F84230002B8B ++:1064800000F06B83842F02D0942F40F06683D6F8FF ++:10649000400113992346009728F0C2DF5DE3069A76 ++:1064A000937DD27D43EA0223C3F3C7030E2BD4BFEF ++:1064B0000023012311930C9B002B62D199F8163015 ++:1064C00099F8172043EA0228139B33B9304609F1A3 ++:1064D0000A01119A4FF06CD91390089C14F4006AC9 ++:1064E00005D0139B1BB1B3F8BC30434525D0139B9B ++:1064F0000BB1A3F8BC80139B8BB142E006EBC20347 ++:1065000003F5F3642046FCF327F270B909F10A00A1 ++:1065100021460622FBF314F5013508B906E01D46B5 ++:1065200096F8E837EAB29342E8D20024BAF1000FB5 ++:106530000CD064B1E388434521D13368D3F88C2073 ++:10654000D2F8BC310133C2F8BC3106E3BCB996F8CD ++:10655000E83709F10A0106EBC30202F5F3640133DF ++:1065600086F8E83706222046FBF306F596F8E8178A ++:106570000A23B1FBF3F202FB131386F8E837A4F801 ++:1065800006800D9961B10E9A52B19BF806303BB965 ++:10659000DBF8E4321B7A1BB15846089910F0B4DEE0 ++:1065A000059B059C1869998A00F118021A619246A8 ++:1065B0000B9AA1F11803A38232B100F11C02A1F1E0 ++:1065C0001C032261A3829246059C0899099BB4F89A ++:1065D000148011F48044C3F3C0150DD0B8F1070F37 ++:1065E00006DC3368D3F88C20536E01335366B4E273 ++:1065F000B02F40F0B28227E0502F00F087800ED8F5 ++:10660000202F00F0768205D8002F00F07282102F24 ++:1066100045D0A2E2302F42D0402F56D09DE2B02F7D ++:106620000ED006D8802F00F09080A02F00F055816A ++:1066300093E2C02F00F0AC81D02F00F07B828CE27F ++:10664000B8F1050F40F38382BBF1000F00F08582A3 ++:106650009BF80630A3B19BF80430002B00F07D823C ++:10666000069ACDF800800195137CD6F8340703F024 ++:106670000803029359464A46534604F06DFE6CE205 ++:10668000D6F8403593F93430002B00F06682584636 ++:10669000494652464346009532F09ADC5DE2B8F135 ++:1066A000050F40F35482BBF1000F00F056829BF8B7 ++:1066B0000630002B40F05182139B58460093494608 ++:1066C0005246434632F042DA47E2336893F8953057 ++:1066D00013B996F872326BB108F118030393304680 ++:1066E0002C2109F10A02234600940194CDF8089068 ++:1066F0001DF0DED9069B0A9C0093D6F84C01494652 ++:1067000052464346019449F00FDB26E2B8F10B0FE5 ++:1067100040F31D82D6F84C015146424649F0BEDC9A ++:10672000D6F868319B79002B00F017820D9900296B ++:1067300000F01382304606990A9A4B46CDF800A025 ++:10674000CDF8048010F042DF07E2B8F10B0F40F300 ++:10675000FE810A9B30460E99069ACDF80090CDF83E ++:1067600004A0CDF80880FEF73DFCD6F868319B798F ++:106770004BB1304606990A9A4B46CDF800A0CDF8A9 ++:10678000048010F023DF96F87232002B2ED19AF895 ++:106790000A3013F0010F29D030465146424617F017 ++:1067A00039D818BB069A937DD27D43EA0223C3F3FE ++:1067B000C7040E2C8CBF0023012363B10AF10C0027 ++:1067C000A8F10C010322FBF379F778B143786BB1A0 ++:1067D0008378A3420AD1336B18690CF0A7F9C0B2D1 ++:1067E000844203D1D6F868014EF0AAD80F9B0BB1B2 ++:1067F0001D4607E0304609F1100138F0D5DD0546A9 ++:10680000002846D0AA79002A43D10AF10C00A8F149 ++:106810000C01D5F8D842D5F8DC72FBF34FF7A2682B ++:1068200081460B2A08D1284606990A9A5346CDF884 ++:10683000008033F08BDE0DE0336893F831304BB1DC ++:106840000F2A07D1284606990A9A5346CDF80080A8 ++:1068500034F04CDAAB7CE3B197F85A30CBB1D6F8D0 ++:106860006801494601224EF013D930B197F85930EA ++:106870001BB9013387F859300BE0D6F86801494657 ++:1068800001224EF005D920B997F859300BB187F89D ++:1068900059000E9C002C00F06081DBF8D8329B6818 ++:1068A0000C2B40F05A815346584606990A9A23F019 ++:1068B00035DE5846002131F0FFDF336893F82F3082 ++:1068C00023B1D6F834072EF025DA46E1DBF8E432BE ++:1068D000584699780AF0A4FC3FE1B8F1010F40F363 ++:1068E0003681BBF1000F00F038819BF80630BAF812 ++:1068F00000505BBB3046139920F06EDB1398037E8B ++:1069000013F0020F14D002214EF09ADB139B1B7E72 ++:1069100013F0080F0CD130465946224609F10A03FC ++:1069200000950194CDF808A0CDF80C800AF0D8FAB3 ++:106930000E99002900F01181DBF8D8329B6813B161 ++:10694000584631F003DF58460321ADE013990B6937 ++:106950005B4540F00281304620F03EDB1398037E19 ++:1069600013F0020F10D012214EF06ADB3046594668 ++:10697000224609F10A0300950194CDF808A0CDF84C ++:106980000C800AF0ADFAAFE010214EF059DBE4E0E4 ++:10699000B8F1010F40F3DB80BBF1000F01D05F467F ++:1069A00004E0109A002A00F0D880174600252C46F3 ++:1069B0003319D3F84C1241B109F11000BC31062251 ++:1069C000FBF3BEF2002808BF01250434202CEFD1D0 ++:1069D000002D00F0C280139BBAF8004033B9304656 ++:1069E00009F10A01119A4EF0E3DE1390139911B1E7 ++:1069F000304620F0F1DABB791398002B57D10028EC ++:106A00003CD012214EF01CDB1398037E13F0010FD3 ++:106A100003D1436813F0005F30D001214EF010DB4A ++:106A2000A4F10D039BB2092B07D83368D3F88C204F ++:106A3000D2F8F8310133C2F8F83197F91030022B4F ++:106A400003D1F8680E2152F08DDD13990B7E13F0FF ++:106A500004020ED100944B683046C3F34073019397 ++:106A6000394609F10A03CDF808A0CDF80C8032F0C0 ++:106A7000B7DC139A536823F0005353600E9B002B2E ++:106A80006BD09BF81230002B67D0DBF8D82253680C ++:106A9000022B02D19368082B5FD8936813B1584634 ++:106AA00031F054DE5846022134F074DC55E0002801 ++:106AB00053D00169B94250D1D0F8F0301BB14368CE ++:106AC00023F400734360139B1B7E13F0010F44D02B ++:106AD0000022304609F10A0300940192CDF808A083 ++:106AE000CDF80C8032F07CDC304613994EF068DE35 ++:106AF00033E0B8F1030F2ADDBBF1000F2DD09BF876 ++:106B0000043053B39BF806303BB309F110000BF18E ++:106B1000BC010622FBF314F2F8B9139BD6F8340734 ++:106B2000019359464A465346CDF8008002950AF033 ++:106B300061FC12E00A99069C0291304613994A467C ++:106B40005346CDF80080019410F038DC05E033683E ++:106B5000D3F88C20136F013313670798059900222F ++:106B600000F0DED815B0BDE8F08FC0462DE9F04F3B ++:106B7000436899B0164689460493918B96F82A305B ++:106B8000126880460292D9F810A00BB9059302E072 ++:106B900096F82220059296F82C00B0B911F4006FF7 ++:106BA00013D0059A09EB4203B3F8AC20B6F87E3057 ++:106BB0009A420AD1D8F80030D3F88C20D2F8BC31F0 ++:106BC0000133C2F8BC3100F065BC9AF80630C1F35D ++:106BD000802B7BBBDAF8E442237A6BB160B9BBF15E ++:106BE000000F09D199F8D230726A134113F0010FE6 ++:106BF00002D1504610F088DBD8F800305B6BCBB187 ++:106C0000237EBBB196F82A30A3B196F828308BB119 ++:106C10000021504621F0BEDEDAF8CC3013F4005FDC ++:106C200008D0B38B13F4005204D1D8F84C0151466C ++:106C300048F0AAD9338C13F0040440F02B84B38BB2 ++:106C400003F4804373634BB9DAF8582040F23713EA ++:106C500002EA03032BB39AF8603013B3059BB463C5 ++:106C60000093404604994A4633464FF051DF08B13D ++:106C700022460EE0736B23B1D9F86C310133C9F8A9 ++:106C80006C31D8F8003093F89530002B00F0028476 ++:106C90000122736B33B1D9F868310133C9F8683117 ++:106CA00000E0002296F82C300BB1002708E005998F ++:106CB00009EB4103B6F87E10B3F8AC70A3F8AC1042 ++:106CC000D8F8000090F8953013B1002A40F0E28324 ++:106CD00096F82C50002D40F00081B6F87E20059BE0 ++:106CE00012F00F0C4FEA830E40F081800EEB090783 ++:106CF000F96E41B104982A4600F012D8FD66C7F833 ++:106D00008C50C7F83051BBF1000F00F0E68073697A ++:106D1000F168FB66D8F800307269DB6903919C6802 ++:106D20001169D368908ACB1892681B189B1A0918AE ++:106D30005B1AA34223DA0498214600F021D8F866B2 ++:106D4000002800F0A7837369006919699C689A8A12 ++:106D5000C4EB0104091BA218FBF30EF17169FA6E72 ++:106D600008698B68C01A13691B181361938A1B1A70 ++:106D700093828B8A049893822A46FFF3D1F7D8F83E ++:106D80000030D8F82828DB6903999B68AA489B1A29 ++:106D90005B1A063BC7F88C3071680822FBF3D0F011 ++:106DA00050B1A64871680622FBF3CAF048B973686F ++:106DB000DB88B3F5407F04D1D9F8043043F00803F1 ++:106DC00003E0D9F8043023F00803C9F804309C48E4 ++:106DD00071680822FBF3B4F0D9F8083010B943F019 ++:106DE000200301E023F02003C9F8083075E00EEB22 ++:106DF0000904E16E11B9D0F88C2017E022F00F02DF ++:106E000027F00F039A4204D107F00F0301339C458A ++:106E100010D02A460498FFF383F7D8F80030E566CF ++:106E2000D3F88C20C4F88C50C4F83051136E013361 ++:106E300013662FE3B068D4F88C309842E9D8049BED ++:106E400009EB0E020090019340468C3273680CF0FF ++:106E5000C7D8049871692A46FFF362F7BBF1000FA7 ++:106E60003BD1E36EC4F88CB07361C4F86CB0736945 ++:106E7000C4F830B11A69998A02F118037360A1F15C ++:106E80001803B36096F829303260F1602BB102F13B ++:106E90001E037360A1F11E03B36096F82A3043B15C ++:106EA0007368059902337360B36886F82210023B59 ++:106EB000B36032681378527843EA0223B383736B6A ++:106EC0005BB1B16B49B191F90E2073689B18736087 ++:106ED00091F90E20B3689B1AB360B36B73B11B7A40 ++:106EE000042B03D1404631464FF0C0DEB36B1B7A12 ++:106EF0000B2B03D1404631464FF0D4DFBBF1000FDE ++:106F000040F02283D8F8003093F89530002B73D0EE ++:106F1000DAF808309B7913F0010F40F0DA826BE069 ++:106F200010F4000F00F4E06310D01B0A043B012BA7 ++:106F3000444A00F07F0004D8142300FB0323DA68DE ++:106F400014E0142300FB03239A680FE01B0A043BA0 ++:106F5000012B3C4A00F07F0004D8142300FB0323DC ++:106F60005A6803E0142300FB03F39A584FF4FA73B2 ++:106F7000B2FBF3F007E000F07F034FF4FA7203FB7B ++:106F800002F3B3FBF2F0C0F307238DF825300DF1C7 ++:106F90001B05C0F307438DF824008DF82630012728 ++:106FA000030E316805F10F0018228DF827308DF897 ++:106FB0002970FAF3E1F796F82F30DBB19DF82B201A ++:106FC0009DF82A3005F1190443EA022343F40073C3 ++:106FD0008DF82A3021461B0A062205F11F008DF884 ++:106FE0002B30FAF3C9F7D8F86C122046BC310622D0 ++:106FF000FAF3C2F7BB4601E04FF0000BD8F80030BF ++:1070000093F8953013B91C461A4602E00DF11B04A3 ++:107010002D2273695B6A13F0400F15D013F0800FB7 ++:1070200000F038820092D8F83C01494632462346A7 ++:1070300029F00EDE88E2C046401E86002CD40100F6 ++:10704000481E86008418860031680DF15A07043105 ++:1070500006223846FAF390F7316815AD0A31062258 ++:107060002846FAF389F731680DF14E0420461031B5 ++:107070000622FAF381F796F829302BB1316812A86D ++:1070800018310622FAF378F7B38B13F4807F03F4F8 ++:10709000007305D1002B14BF23462B46776704E00D ++:1070A00074670BB9356701E012AB33677468BBF1E5 ++:1070B000000F00F0EE803368F3662378AA2B23D10B ++:1070C0006378AA2B20D1A378032B1DD1E378DBB9F9 ++:1070D0002379CBB9637943B9A379E179404641EA91 ++:1070E00003210BF0F1DB50B10EE0F82B0CD1A379AA ++:1070F000E179404641EA03210BF0E6DB20B1A279B9 ++:10710000E37943EA022500E03589D8F8003093F8A6 ++:107110009530D3B1DAF8E0305BB9736BABB9DAF81C ++:10712000582040F2371302EA030373B19AF8603033 ++:107130005BB1059A40460192494652463346009556 ++:107140000DF022DA002840F0A581B36B6BB11B7AF9 ++:10715000012B0AD0032B08D0404604994A463346F7 ++:1071600009F0DEFE002800F09581736F1B7813F0A4 ++:10717000010F08D0D8F80030D3F88C20D2F8D031E5 ++:107180000133C2F8D031B36B33B11B7A022B03D178 ++:10719000404631464FF06ADD726B22B996F82A30CC ++:1071A00023B3144602E0B36B93F90E4096F82A30ED ++:1071B0005BB1336802341A78597842EA012222F02E ++:1071C000800292B21A70120A5A707368581E03E055 ++:1071D00063421B5C00F8013971690A699042F7D279 ++:1071E0008B8A12191B1B0A618B82326096F82F3032 ++:1071F000BBB130684278037800F10A0443EA022305 ++:1072000043F4007303701B0A4370214606221030BA ++:10721000FAF3B2F6D8F86C122046BC310622FAF323 ++:10722000ABF69AF9103093B148F68E039D420ED119 ++:107230003168726BDAF80C001231003A18BF012283 ++:107240000AF1180351F0AEDE002840F02381716985 ++:107250000A698B8A9B18CA68D21A2C2A40F21A81B2 ++:1072600000238DF829308B8A08692D2218180DF11A ++:107270001B01FAF381F6716996F82220CB8A02F09D ++:10728000070223F007031A43CA8296F829200091C7 ++:10729000FAE0D6F814B02378DBF81070AA2BC7EB0D ++:1072A000040529D16378AA2B26D1A378032B23D1F7 ++:1072B000E3780BBB2379FBB9637943B9A379E1790F ++:1072C000404641EA03210BF0FFDA50B114E0F82BFD ++:1072D00012D1A379E179404641EA03210BF0F4DAB7 ++:1072E00050B17269A91F7B18CBF81030938A5B1AD2 ++:1072F00093821369F36628E0DAF8583013F0200F10 ++:107300000FD0204692490822FAF31AF648B972695A ++:10731000281D1169938A09181B1A11619382F1665D ++:1073200013E07269A5F10E00938A11691B1A93820A ++:1073300033890918116103F0FF021B0A43EA022393 ++:10734000F1660B73C3F30F234B73B36B6BB11B7AF3 ++:10735000012B0AD0032B08D0404604994A463346F5 ++:1073600009F0DEFD002800F09580B36B33B11B7A85 ++:10737000022B03D1404631464FF078DC0622716F74 ++:10738000F06EFAF3F9F5F06E06220630316FFAF37B ++:10739000F3F5716996F82220CB8A02F0070223F0F8 ++:1073A00007031A43736FCA821B7813F0010F08D0CA ++:1073B000D8F80030D3F88C20D2F8D0310133C2F89D ++:1073C000D0319AF8613093B199F8183013F0100F5A ++:1073D0000DD1F36E1A7B5B7B43EA022348F68E02E3 ++:1073E000934204D073695B6A13F0100F52D09AF87D ++:1073F0006530BBB199F8183013F0100F12D1F36E4D ++:107400001A7B5B7B43EA022248F6B4039A4209D016 ++:10741000263B9A4206D073695B6A002B02DB13F0AD ++:10742000100F37D09AF8063023B9DAF8E422013386 ++:1074300082F82A3098F83238013388F832389AF9CD ++:107440001030EBB1F16E0B7B4A7B42EA032248F627 ++:107450008E039A4214D10B8A03F0FF021B0A43EAFF ++:107460000223B2680C3A934214D8726BDAF80C001B ++:10747000003A18BF01220AF1180351F093DD48B910 ++:10748000736996F82920009340464946736F1FF0B0 ++:107490007BD959E0D8F80000436BA3B171692D4A3C ++:1074A000CB8AD0F8904003F00703D25C2A4B0498B3 ++:1074B0009B5C04EBC304636EA56E01336366FBF350 ++:1074C000A9F64019A066049871690022FFF328F418 ++:1074D0003AE0D8F8303005991A8940468DF81B20DB ++:1074E000130A120E8DF81C308DF81E200023B2698D ++:1074F0008DF81D30937DD27D43EA0223C3F3C70389 ++:107500008DF81F3009EB410393F8AC30D6F88010AA ++:1075100003F00F0301338DF828301CF03DDA029A96 ++:1075200040B2030E8DF82000911FD6F880008DF830 ++:1075300021308DF822308DF8233015F039FE10F00F ++:10754000006F7FF4EDAC16E519B0BDE8F08FC046D2 ++:10755000F7E38500C4D2850098E085002DE9F04F5F ++:107560000024A7B08DF832408DF83B408DF83840AC ++:107570008DF870408DF83F409A4609939B8A0546E6 ++:10758000212B02911746259412940D940A9224926D ++:107590001B9450D9DAF810901046494615F008FEB1 ++:1075A00009F1060203900492527899F8063043EAF2 ++:1075B0000223ADF82C30C3F38103ADF82E30BDF8B3 ++:1075C0002C30C3F3031203F44073B3F5407F14BFB0 ++:1075D000002301238DF83930BDF82E30ADF830206E ++:1075E000022B0ABFBDF830302346C3F3C0038DF829 ++:1075F0003A303B7903F00303022B08D1BDF92C305C ++:10760000002B04DABDF83030C3F3C00300E00023E0 ++:10761000D9B29DF839009DF83A308DF83B1000281A ++:107620000CBF2222282203B1023201B10432099B8D ++:107630009B8A934206D22B68D3F88C20536E013379 ++:107640005366A5E304990B7903F001038DF83C30F0 ++:1076500020B100231E468DF8403015E0BDF82C30D7 ++:1076600013F4807F01D0043105E013F4007F01D0D2 ++:107670000A3100E01031284637F02CDE031E18BF17 ++:10768000012306468DF840309DF83C303BB9049903 ++:107690002846043137F042DE08B1012400E000241E ++:1076A00095F8C83123B92B6893F82C3033B92FE003 ++:1076B00028463946099A00230EF0A2DB2B6893F87E ++:1076C0003F300BB98DF8403054BBBDF82C3013F46B ++:1076D000807F05D19DF83C3013B19DF840303BBB15 ++:1076E0009DF8393013B19DF83C300BBB2B6893F8F3 ++:1076F0002C30002B00F04C839DF84030002B00F024 ++:107700004783B379002B40F043834FF0010B11E026 ++:107710009DF83C301BB9002C00F03A8300E03CB1EE ++:107720009DF8393023B99DF84030002B00F03083AC ++:107730004FF0000B2B6893F895304BB346B39DF890 ++:107740003C30D6F8DC405BB914F0010F00F0208328 ++:10775000049806F1C20104300622FAF3F1F314E0B2 ++:1077600004980430FBF3E8F020B114F0080F00F0A7 ++:107770000F830DE014F0040F0AD114F0020F00F093 ++:107780000783284604990EF0A7DA002840F000830A ++:10779000099A136906331361938A063B9382049A0C ++:1077A00002F1180305939DF8393013B102F11E035D ++:1077B000059300238DF83D309DF83A306BB3059B5F ++:1077C0005A781B7843EA0221C1F3C0138DF83D308B ++:1077D0007BB126B196F81935002B40F0D98295F887 ++:1077E000CF31002B00F0D482099A536A43F0400352 ++:1077F0005362844B01F007028DF832209A5C824B71 ++:107800009B5C0D93C1F300138DF83830059B023358 ++:1078100005939DF832308DF870309DF83D3023B9D6 ++:10782000099A938A043B938206E002980999FBF334 ++:1078300069F1838A043B8382099A059C938A1269C1 ++:107840000793A41A1B1B514602980693FBF3E2F41C ++:107850000499001B08908B7DCA7D43EA0223ADF892 ++:107860008E30BBF1000F2ED1079B284600933A467D ++:1078700025AB10F03DDE002840F08A82BDF82C30A8 ++:1078800013F4407F3BD1BA7DFB7D049942EA032289 ++:10789000C2F3C70228460A310E2AD4BF00220122B1 ++:1078A0004EF0A0D8259030B92B68D3F88C20D36E39 ++:1078B0000133D3666CE20369D3F8CC30C3F3C01351 ++:1078C0008DF83F301BE0BDF82C3013F4407F16D00C ++:1078D0009DF839309BB9259B8BB9BA7DFB7D284635 ++:1078E00042EA0322C2F3C7020A310E2AD4BF0022A1 ++:1078F00001224EF077D82590002800F04982259B80 ++:107900001C69D4F8DC82BBF1000F23D19DF839301B ++:1079100003BB9DF83C3023B1BDF82C3013F4807FBD ++:1079200011D1A379BDF82C201BB112F4807F0AD0AD ++:1079300010E0A37C02F44072002B14BF4FF40073DC ++:1079400000239A4206D02B68D3F88C20936D013324 ++:1079500093651DE295F82D370AF1240A33B99DF895 ++:107960003F1019B9A3790BB10E4608E028463946F5 ++:107970001CF012D8C0B246B208B18AF80900A37947 ++:10798000FBB99DF83F30E3B9314620461CF046D89C ++:1079900020461BF09BDF3946284610F091D801465F ++:1079A00020460EF0F3DF9DF8403053B1A37C43B185 ++:1079B000E37933B198F805301BB92046012133F043 ++:1079C000E9DC95F82D3733B99DF83F301BB9259B7D ++:1079D000D3F8FC3073B16EB1259AD2F8F810D2F812 ++:1079E000F43043F82160D2F8F830013303F0070394 ++:1079F000C2F8F8309DF8393043B1B4F86200ADF800 ++:107A0000780040E0C4D2850098E08500A3792599EC ++:107A1000002B35D08A8FADF878204A6812F0400FDD ++:107A200020D09DF83A30EBB1049B9B7D13F00F0FF3 ++:107A300018D191F8DF30ABB18B7E13F0010F11D16B ++:107A4000BDF82C3013F4805F0CD012F4003F09D045 ++:107A50000D9A91F8D130134113F0010F02D028464E ++:107A60002DF034DFBDF82C30259913F4805F15BF5D ++:107A70004B684B6843F4003323F400334B6002E05F ++:107A8000898FADF8781095F82D371BB9259BD3F861 ++:107A9000FC3073B16EB1259AD2F8F810D2F8F430F8 ++:107AA00043F82160D2F8F830013303F00703C2F83D ++:107AB000F830259BD3F87C1159B1D1F808360398DA ++:107AC00001EB8302013303F03F03C2F80C06C1F857 ++:107AD0000836A3795BB9A37C4BB19DF83C3033B930 ++:107AE000BBF1000F03D188F806B088F807B09DF805 ++:107AF0003C30FBB1A379002B40F04A81A37C4BB111 ++:107B0000296804984E3110300622FAF319F2002841 ++:107B100000F03E8104980430FAF30EF750B92B6858 ++:107B200093F83E3033B9284604990EF0D5D8002892 ++:107B300040F02E81039ACAF814209DF83C308BB98E ++:107B400099F8022099F80130134399F800201A435C ++:107B500008D0BB7CFA7CD5F86001039943EA022285 ++:107B60004BF022DADAF8142012F0006F26D012F46B ++:107B7000000F02F4E06310D01B0A043B012B96486F ++:107B800002F07F0204D8142302FB0303DA6817E033 ++:107B9000142302FB03039A6812E01B0A043B012B27 ++:107BA0008D4802F07F0204D8142302FB03035A68B5 ++:107BB00006E0142302FB03F31A5801E002F07F02EF ++:107BC000864B1A6099F90330002B07DA2B68D3F83B ++:107BD0008C20D2F8D8320133C2F8D83299F8033069 ++:107BE00003F03003102B07D12B68D3F88C20D2F888 ++:107BF000E0320133C2F8E0329DF83C30002B40F017 ++:107C00009780DAF814102B6811F0006FD3F88C20ED ++:107C100026D011F4000F01F4E06310D01B0A043BDE ++:107C2000012B6D4801F07F0104D8142301FB0303ED ++:107C3000D96817E0142301FB0303996812E01B0ABB ++:107C4000043B012B644801F07F0104D8142301FB9D ++:107C50000303596806E0142301FB03F3195801E0FC ++:107C600001F07F0116293AD00CD80B2925D004D871 ++:107C7000022916D004291AD05AE00C2923D012293F ++:107C800027D055E030293CD004D818292DD02429FC ++:107C900031D04DE0602940D06C2944D0482936D0FD ++:107CA00046E0D2F870320133C2F8703240E0D2F8C8 ++:107CB00074320133C2F874323AE0D2F878320133C8 ++:107CC000C2F8783234E0D2F87C320133C2F87C3228 ++:107CD0002EE0D2F880320133C2F8803228E0D2F8A8 ++:107CE00084320133C2F8843222E0D2F88832013380 ++:107CF000C2F888321CE0D2F88C320133C2F88C32E0 ++:107D000016E0D2F890320133C2F8903210E0D2F887 ++:107D100094320133C2F894320AE0D2F89832013337 ++:107D2000C2F8983204E0D2F89C320133C2F89C3297 ++:107D300025994B6813F4802F0BD09DF83C3043B944 ++:107D4000BBF1000F05D1D5F8400104AA27F098DB5C ++:107D500003E0284604AAFEF709FF049B1B7C13F0EE ++:107D6000010F05D1259AD2F858310133C2F85831A4 ++:107D7000049B1B7C13F0010F05D0259AD2F85C31CF ++:107D80000133C2F85C31259B0398C3F864011FE0FE ++:107D90002868436BBBB19DF83C30A3B90999104AE0 ++:107DA000CB8AD0F8904003F00703D25C0D4B0298C9 ++:107DB0009B5C04EBC304636EA56E01336366FBF347 ++:107DC00029F24019A066029809990022FEF3A8F74B ++:107DD00027B0BDE8F08FC04684188600CC2702008B ++:107DE000C4D2850098E085002DE9F04FADF50F7DF8 ++:107DF000DDF860B28A46594617469946064637F07E ++:107E0000F9DAD0F8D412D0F8D822D0F8DC32D0F891 ++:107E1000E4428046089109920A930B94BBF1000F4B ++:107E200001D1D0F808B000238DF837328B9330465B ++:107E300051463A464B46FBF7CFF9041EC2F2338057 ++:107E400033685B7EEBB9326992F8EA305BB1D36E8E ++:107E5000D3F8202140F2044302EA0303B3F5806023 ++:107E600018BF012005E0106E07F0EEFC003818BFC7 ++:107E7000012030B1B068FBF767F94FF0FF3402F032 ++:107E800012B847B1B9F1030F05D98CA839460422BD ++:107E9000FAF372F001E000238C93BAF1A30F8C9DEA ++:107EA000F168706827D00DDCBAF11C0F07DCBAF15D ++:107EB0001B0F20DAAAF10203012B15D81BE0BAF13F ++:107EC000340F10E040F20B139A4514D005DCBAF1E0 ++:107ED000D60F10D0BAF1FB0F05E0BAF58B7F0AD0B0 ++:107EE00040F21B139A4506D0002F01F09587B9F197 ++:107EF000000F41F3918740F23B132A1E18BF012265 ++:107F00009A4501F2618701A454F82AF0098400001F ++:107F1000138400001D8400008F840000C99D0000B0 ++:107F2000C99D0000C99D0000C99D0000C99D0000B9 ++:107F3000E7840000F5840000C99D0000558500001D ++:107F4000C99D0000CF850000C99D0000C99D0000AB ++:107F5000C99D0000C99D0000DB850000E785000089 ++:107F60000786000023860000558600007986000001 ++:107F7000AB86000019870000979C0000899C0000D8 ++:107F8000D987000019880000D7890000E389000024 ++:107F9000438A00004F8A0000F38A0000FF8A000035 ++:107FA000158B0000218B0000638B0000C99D000031 ++:107FB000C99D0000C99D0000C99D0000858B00007F ++:107FC000418C0000478D0000FB8C0000C99D000023 ++:107FD000C99D0000538D0000958D0000C78D0000E5 ++:107FE000F38D00008F8E0000DD8E00002D8F0000CD ++:107FF000758F0000B38F0000BF8F0000979C0000BA ++:10800000F188000001890000418900007B8900009F ++:10801000C99D0000C99D0000C98F0000D58F0000D8 ++:10802000EB8F000019900000C7900000F79000004F ++:10803000C99D0000979C0000199200004592000025 ++:108040005D9200008D920000A3920000C99D000087 ++:108050006F8B00007B8B0000CD9900000384000033 ++:10806000E7920000F3920000C99D0000C99D000046 ++:10807000C99D0000C99D0000C99D0000979C00009B ++:10808000979C0000979C0000979C0000C99D0000F1 ++:10809000C99D000049930000C99D0000C99D0000D2 ++:1080A000C99D0000C99D0000C99D0000C99D000038 ++:1080B0007D90000089900000118500001D85000062 ++:1080C000BD970000CF9700007D97000087970000C4 ++:1080D000A789000093900000C99D0000C99D000081 ++:1080E000D793000057930000E5930000F993000038 ++:1080F0008794000087940000C99D0000C99D00007E ++:10810000239500004395000059950000C99D00008B ++:10811000C99D0000C99D0000C99D0000C99D0000C7 ++:10812000FD95000011960000979C00004596000008 ++:10813000C5950000C99D0000C99D0000B1960000D2 ++:10814000BF960000D39600000D9400001D9700001C ++:108150002797000031970000C99D0000C99D0000CD ++:10816000E79700001598000023980000C99D0000C3 ++:10817000C99D0000C99D0000C99D0000C99D000067 ++:10818000C99D0000C99D0000C99D0000B584000084 ++:10819000C1840000A98400006984000025960000C5 ++:1081A00031960000C99D0000C99D0000979C000009 ++:1081B000979C0000979C0000039900003D980000E8 ++:1081C000C99D0000C99D0000C99D0000C99D000017 ++:1081D000C99D0000F397000001980000DD960000A3 ++:1081E000C99D0000C99D0000578C0000C99D00007A ++:1081F000C99D0000C99D0000C99D0000C99D0000E7 ++:10820000C99D0000C99D0000C99D00005399000050 ++:108210005D990000979C0000979C0000C99D00009C ++:10822000C99D0000C99D0000C99D0000C99D0000B6 ++:1082300013940000C99D0000C99D0000C99D000065 ++:108240002799000045990000C99D0000C99D0000C4 ++:10825000C99D0000C99D0000979C0000979C0000EC ++:10826000EB990000F5990000C99D0000C99D000030 ++:10827000019A00007D9A0000879A0000978800000C ++:10828000A3880000979A0000AB9A0000199E000096 ++:10829000199E0000938A0000A18A0000C18A000094 ++:1082A000CF8A0000C99D0000C99D0000BD9A000052 ++:1082B000C99D0000C99D0000C59A0000ED9A00000C ++:1082C000C99D0000C99D0000C99D0000C99D000016 ++:1082D000C99D0000C99D0000C99D0000C99D000006 ++:1082E000C99D0000C99D0000C99D0000C99D0000F6 ++:1082F000C99D0000339B0000C99D0000C99D00007E ++:10830000C99D0000C99D0000C99D0000739C00002C ++:10831000C99D0000C99D0000C99D0000699A000028 ++:10832000739A0000FD830000FD830000C99D0000DA ++:10833000C99D0000C99D0000C99D00008D9B0000E3 ++:10834000C99D0000C99D0000C99D0000C99D000095 ++:10835000C99D0000B19B0000B19B0000C99D0000B9 ++:10836000C99D000065910000D1910000DD910000E1 ++:10837000E7910000F99100000B920000C99D0000F8 ++:10838000DB9B0000EB9B0000F99B0000C99D0000F7 ++:10839000C99D0000C99D0000C99D0000C99D000045 ++:1083A000C99D0000C99D0000C99D0000C99D000035 ++:1083B000C99D0000C99D0000C99D0000C99D000025 ++:1083C0004F9C0000619C0000279C0000C99D00009C ++:1083D000C99D0000C99D0000C99D0000C99D000005 ++:1083E000C99D0000C99D0000979C0000979C00005B ++:1083F0008D9D0000A19D0000B59D0000002101F0B1 ++:108400009EBB002401F0B9BAC14B00243B6001F0CF ++:108410004ABD012300243B6001F045BD33685B7E0B ++:10842000002B41F0F38486F89F3186F8A231304664 ++:1084300009F06AF830460EF04BDD30460EF036DEBD ++:108440003268137E002B41F0DF84136F13F0030FAB ++:1084500041F01D8513F0040F41F0D68413F0080F8E ++:1084600001F0DD8401F0D0BC33685D7E002D41F069 ++:10847000CD84012486F8A241304609F045F886F8FB ++:108480009F41304608F072FC2C4601F00CBD0123E0 ++:1084900086F89F3133685C7E002C41F0B584B0686B ++:1084A000FAF752FE01F0FFBC336800241B7E3B60EC ++:1084B00001F0F9BC96F8293000243B6001F0F3BCD0 ++:1084C00031680B7E002B41F0CB844C7E002C41F0B8 ++:1084D000DE8411463069079235F06AD9079A86F82A ++:1084E000292001F0E0BC3368002493F82C303B6075 ++:1084F00001F0D9BC336883F82C2096F82930002B82 ++:1085000001F0828430461BF0EBDA002401F0CBBC92 ++:1085100096F8C83100243B6001F0C5BC86F8C8213C ++:1085200086F8CB21304608F0EFFF96F82930002B73 ++:1085300001F06A8430461BF099DA30461BF0D0DA3D ++:10854000B0688C9907F0C4DD304620F0CBDF002402 ++:1085500001F0A9BC40461AF083D810F0006F2AD071 ++:1085600010F4000F00F4E06310D01B0A043B012B51 ++:10857000684900F07F0004D8142300FB0313DA6875 ++:1085800014E0142300FB03139A680FE01B0A043B5A ++:10859000012B604900F07F0004D8142300FB031373 ++:1085A0005A6803E0142300FB03F35A584FF4FA739C ++:1085B000B2FBF3F007E000F07F034FF4FA7203FB25 ++:1085C00002F3B3FBF2F00024386001F06CBC3368B6 ++:1085D00000245B683B6001F066BC98F81230002410 ++:1085E0003B6001F060BC98F8063013B1002D01F03B ++:1085F0002284D6F840252B1E18BF0123002482F8C0 ++:10860000343001F050BCB8F95E300BB1022004E008 ++:10861000B8F95C30181E18BF01200024386001F042 ++:1086200042BC022D0AD14FF000014FF0010200249C ++:10863000A8F85C10A8F85E2001F035BC2B1E18BF0E ++:108640000123A8F85C3000244FF00003A8F85E3046 ++:1086500001F029BCB8F80630002B01F0E983B9F12C ++:10866000050F41F3F483384608F1BC010622F9F303 ++:1086700083F4002401F017BC98F80440002C41F06A ++:10868000EF83B9F1050F41F3E28308F1BC003946ED ++:108690000622F9F371F496F82930002B01F0B48327 ++:1086A000404620F09DD901F0FEBBB9F1230F41F304 ++:1086B000CE83384600212422F9F3C2F498F80650FC ++:1086C0005DB198F8192008F11A0147F8042B3846D3 ++:1086D000F9F352F4002401F0E6BB98F80740381D86 ++:1086E00054B1089C237A04F109013B60227AF9F322 ++:1086F00043F42C4601F0D7BBD6F84025137A02F19B ++:1087000009013B60127AF9F337F401F0CCBBC046A3 ++:10871000776CE41484188600B9F1030F41F3978352 ++:108720003A68131D9945C1F29283202A03D96FF04C ++:10873000110401F062BB07F1040A3046514636F0DD ++:1087400011DE10B1404541F06A8398F806309BB1C4 ++:10875000404651463A6836F00FDA3046414636F028 ++:108760008FDB98F819303BB13046414636F03CDD9E ++:108770000446002841F0418398F80630002B41F070 ++:108780004383B9F1310F02D819461A4619E07A8DA0 ++:1087900022B1FB6A13B90125FA6200E000253046D8 ++:1087A00007F12C01A9F12C020AF034DC04460DB1CA ++:1087B0000023FB62002C41F0208307F12402A9F181 ++:1087C00024013B683046009201915246414631F007 ++:1087D000CFD8002401F067BB336B18690AF0A6F903 ++:1087E000C0B2386098F807301BB1089991F8323060 ++:1087F00003E0D6F8403593F832300024D6F868010B ++:108800007B60BC608379002B01F0FE824BF09CDF23 ++:10881000C0B2B86001F047BB0E2DCCBF4FF4805200 ++:108820004FF40052E02D03D96FF0120401F0E5BAC5 ++:1088300045F4306342EA03039DB2D6F85C01294651 ++:108840003DF0ACDD18B96FF0130401F0D6BAD6F8DC ++:10885000403532685D86137E002B01F0D58292F898 ++:108860003F40002C41F0D082336B18690AF05EF96A ++:10887000A84201F0C9822946304620F091DA3046FC ++:1088800008F0B0FF3046294620F0D0D8304619F025 ++:10889000B7DB01F008BB96F8683700243B6001F0B5 ++:1088A00002BB642D01F2BE8286F8685730699DF8DC ++:1088B000301235F021D833681B7E002B01F0A482E2 ++:1088C000D6F868319D79002D41F09E82304608F03F ++:1088D00089FF3046D6F85C410DF066D80146204647 ++:1088E0003CF042DF304619F08BDB2C4601F0DBBA5E ++:1088F000D6F86036002493F907303B6001F0D3BA14 ++:10890000304669B211F024D9041EC1F276828C9BE4 ++:10891000D6F86026D37133681B7E002B01F06B8282 ++:10892000304608F05FFF304611F054D93046D6F893 ++:10893000AC1614F005D8304619F062DB01F05BBAD2 ++:108940003368187E30B9D6F8603604469B793B60B0 ++:1089500001F0A9BA336B89A918690AF065FA0446CF ++:1089600028B19DF8243200243B6001F09CBAD6F86F ++:1089700060369B793B6001F096BA6B1C042B01F2C8 ++:108980005182B5F1FF3F01D103238C93D6F86036B5 ++:108990008C9A00249A71336B9DF8301218690AF092 ++:1089A00081FE01F080BA33681B7E002B01F0498202 ++:1089B000B1F8E8339AB24DF6AD639A4201F02F82D6 ++:1089C0004FF6FF739A4201F02A82C2F3401300244B ++:1089D0003B6001F068BAB6F83A3600243B6001F01B ++:1089E00062BA6B1EFE2B01F21D82A9B2A6F83A16DE ++:1089F0003069B6F83C2634F029DEB6F82032B6F8F5 ++:108A00003A2623F00F031343A6F82032B6F8223299 ++:108A1000304623F00F031343A6F82232B6F824326F ++:108A2000002423F00F031343A6F82432B6F82632AD ++:108A300023F00F031343A6F8263212F053D801F0A7 ++:108A400032BAB6F83C3600243B6001F02CBA6B1EFB ++:108A5000FE2B01F2E781AAB2B6F83A16A6F83C2638 ++:108A6000306934F0F3DD3146B1F82022B6F83C36F7 ++:108A700022F4706242EA0322A1F8202206F10803E0 ++:108A800002319942F0D1304612F02CD8002401F086 ++:108A90000ABA336B0024B3F806313B6001F003BA25 ++:108AA00096F82930002B01F0C9816B1EFE2B01F2D4 ++:108AB000B9813046A9B220F023D8002401F0F3B9DF ++:108AC000336B0024B3F808313B6001F0ECB996F841 ++:108AD0002930002B01F0B281A5F1FF03B3F5E06F5F ++:108AE00001F2A0813046A9B21FF0FEDF002401F0A0 ++:108AF000DAB996F95C3600243B6001F0D4B96B1CFE ++:108B0000012B02D9012D41F08D81002486F85C569D ++:108B100001F0C9B9336800241B6F3B6001F0C3B991 ++:108B20002A0C01F07F8122F00303002B41F07A81AF ++:108B3000A9B221F00303002B41F07481D04310EA65 ++:108B4000010441F06F813268136F00EA03030B43A5 ++:108B5000304613670EF0BCD930460EF0A7DA01F0AC ++:108B6000A2B9336B00241B893B6001F09CB998F8D3 ++:108B7000603000243B6001F096B9002488F8602042 ++:108B800001F091B9832D01F2508106EB8503B9F113 ++:108B9000A30FD3F8804241F35A8145AD2846002106 ++:108BA000A422F9F34DF2002C42D0E37947A82B60C0 ++:108BB000226904F114016A60F9F3DEF1237A61930A ++:108BC00096F8A0349BB9D8F8583013F0080F0ED19E ++:108BD000237A0B2B08D196F8F03743B196F8F1378A ++:108BE0002BB1A379072B02D8A379292B03D9629B38 ++:108BF00043F001036293638913F0020F03D0629B79 ++:108C000043F002036293638913F0200F03D0629B49 ++:108C100043F010036293638913F0100F03D0629B3B ++:108C200043F0200362936CA821460622F9F3A4F1D5 ++:108C3000384645A9A422F9F39FF1002401F033B985 ++:108C4000A549012330460097CDF804900293CDF852 ++:108C50000CB000F096BFB9F1070F41F3F880304631 ++:108C600036F08EDD80450BD08C9B032B01F2DD802E ++:108C700008EB83035B6F002B01F0D7809B798C930B ++:108C80008C9B832B01F2D18006EB8303D3F88042C7 ++:108C9000002C01F0CA802369002B01F0C680B8F8CF ++:108CA000623013F0010F08D02046F9F355F620B1D9 ++:108CB000B8F86C30D8F8680003E0B4F8B830D4F8ED ++:108CC000B4008DF818321B0A8DF81932030A8DF89A ++:108CD0001B32030C00248DF81A028DF81C3286A971 ++:108CE000030E082238468DF81D328DF81E428DF88D ++:108CF0001F42F9F341F101F0D6B8336893F83F30E1 ++:108D0000002B41F0B380D6F86801837923B10421A8 ++:108D100007924BF04DDC079A96F8723286F850278E ++:108D200086F85925002B41F06F80D6F85C011AB106 ++:108D300006F5AA610E3102E006F5AA610A313DF09E ++:108D400011DA01F057B896F8503700243B6001F073 ++:108D5000AAB80325304639464A4600230095CDF887 ++:108D600004800BF0BBD8044638B110F1190F01F0A4 ++:108D70004480C6F8245501F040B80223C6F82435D3 ++:108D800096F8F437C6F8285523F0010386F8F4372F ++:108D900001F089B8B9F10B0F41F23E803B680B2B13 ++:108DA000899341F239804B45C8BFCDF82492899B05 ++:108DB00030460C3B8993394689AAD6F8243510F001 ++:108DC000EDDB01F017B896F829303BB933681B6F1B ++:108DD00013F0040F01F0328001F016B898F8064045 ++:108DE000002C41F028803046414636F049D801F049 ++:108DF0005AB833681B7E002B01F02380B9F1050FB0 ++:108E000041F22580B9F10D0F0CD9304607F1080168 ++:108E1000A9F108020AF0FED83D460446002840F0B9 ++:108E2000EC870AE082AC204639460622F9F3A4F02A ++:108E3000002384934FF00E09254698F80640CCB9DC ++:108E40000A9AD2F8901039B1706892F89420FDF324 ++:108E50004FF70A9BC3F890400A9C494684F89490C7 ++:108E60007068FDF335F7C4F8900018B129464A46FA ++:108E7000F9F382F02946404632F028D90A9904468F ++:108E8000D1F89030002B40F0BF8700F0B4BF002332 ++:108E90000093304639464A468BABFAF7F5F904465B ++:108EA000002840F0AA878B99032900F0ED87326BE8 ++:108EB0001368994204D1D2F8F0303B6000F0F3BF60 ++:108EC0005368002B14BF38233C23F358D3F8F030F9 ++:108ED0003B6000F0E8BFC0467B7286000023009331 ++:108EE000304639464A468BABFAF7CEF9044600289D ++:108EF00040F083878C9A02F16403672B00F292871B ++:108F00008B99032904D0336B1B68994240F0CB87BF ++:108F1000002A04DB3046316B32F01CDA0246336B38 ++:108F2000C3F8FC20C3F8F02000F0BDBF002300937D ++:108F3000304639464A468BABFAF7A6F90446002874 ++:108F400040F05B878B99032900F09E87326B136892 ++:108F5000994204D1D2F8F4303B6000F0A4BF5368CA ++:108F6000002B14BF38233C23F358D3F8F4303B6074 ++:108F700000F099BF00230093304639464A468BAB38 ++:108F8000FAF782F90446002840F037878C9A642A61 ++:108F900000F27A878B99032904D0336B1B689942BE ++:108FA00040F08187336BC3F80021C3F8F42000F050 ++:108FB0007ABF0A9A0024D36A3B6000F074BF0A9B10 ++:108FC0000024DD6200F06FBF98F83A3000243B6067 ++:108FD00000F069BFBB49012330460097CDF80490EB ++:108FE0000293CDF80CB000F0CCBDD8F84C2006248C ++:108FF000531C03FB04F39945C0F2298747F8042B5F ++:10900000D8F84C20384602FB04F2D8F85410F8F394 ++:10901000B3F7002400F047BF3B68402B00F2028703 ++:10902000062403FB04F304339945C0F21087D8F8F3 ++:10903000541049B1D8F84C2002FB04F20432FDF37D ++:1090400057F60023C8F84C303968706801FB04F10A ++:109050000431FDF33DF6C8F8540018B96FF01A0456 ++:1090600000F0CBBE57F8042BC8F84C20394602FB61 ++:1090700004F2F8F381F7002400F015BFD8F850305F ++:1090800000243B6000F00FBF0024C8F8505000F0EF ++:109090000ABF98F807301BB1089C04F1380203E0BE ++:1090A000D6F8403503F1380211680B1D9945C0F21E ++:1090B000CE8647F8041B3846111D1268F8F35CF79A ++:1090C000002400F0F0BE78AC282200212046F8F3FE ++:1090D000B7F73046214614F0A9DC789A131D99455C ++:1090E000C0F2B58647F8042B211D3846F8F344F743 ++:1090F000002400F0D8BE3A68131D9945C0F2A78637 ++:10910000102A00F2AA8678AC002128222046F8F323 ++:1091100097F757F8042B201D39467892F8F32CF76F ++:10912000336893F8463013F0030F0ED098F80730E9 ++:1091300004F115001BB1089A02F14D0102E0D6F8C6 ++:1091400040154D311022F8F317F7304678A910F08A ++:109150008BDC0446002840F0508630460DF04AD89B ++:1091600000F0A1BE6DB100243046414623222346C3 ++:109170000094019402940394049413F0CFDC00F063 ++:1091800092BE98F806303BB9D6F8680104214BF03E ++:109190000FDA40462FF0DADAD6F878122B467068EC ++:1091A000043101220095F9F34DF698F8063043B9E1 ++:1091B000404601212A462B4602F0ACFF2C4600F027 ++:1091C00072BE3046414635F05BDE2C4600F06BBE89 ++:1091D000D6F84C3500243B6000F065BE0024C6F88C ++:1091E0004C5500F060BE384606F5AA610622F8F339 ++:1091F000C3F6002400F057BE06F5AA6039460622E1 ++:10920000F8F3BAF6002400F04EBE304641460AF0AC ++:1092100089DF002400F047BE98F8060058B998F896 ++:10922000123043B198F807302BB1089CE38D044607 ++:109230003B6000F038BED6F840350024DB8D3B6043 ++:1092400000F031BE6A1E4FF6FE739A4200F2EA85C4 ++:10925000D6F840350024DD8500F025BE98F80600DC ++:1092600060B998F812304BB198F8073033B10899CB ++:10927000044691F860303B6000F015BED6F84035EA ++:10928000002493F860303B6000F00DBE6B1EFE2B97 ++:1092900000F2C885D6F84035002483F8605000F00D ++:1092A00002BE3A6845F2AB539A420FD106490023F9 ++:1092B00030463B600097CDF804900293CDF80CB097 ++:1092C0000DE0C046AB728600DD7286000023A04927 ++:1092D0000097CDF804900293CDF80CB030463A4692 ++:1092E0004B4600F050BC0B9A002413783B6000F012 ++:1092F000DABD022D00F293850B9B1D7033681B7E37 ++:109300004BB140460DF062DCD8F8E4325B8B13B110 ++:1093100040461BF043D90B9C637E0BB18C9B33B949 ++:109320008C994046003918BF012107F079FF40466B ++:109330001CF05CDB0146404622F000DC404631F088 ++:10934000B7DF002400F0AFBD304639464A46FAF791 ++:1093500079F800F04FBD316891F830300F7E1BB1C5 ++:1093600015B96FF0190400E0002491F8953013B19D ++:10937000002D40F08F85002C40F03F8591F82F3074 ++:10938000934200F0908527B1B0680792F9F7DCFEB0 ++:10939000079A3368304683F82F20414636F0F8D9D3 ++:1093A000326892F8443023B192F82F300BB182F832 ++:1093B0004440304612F004DD002386F8DD3186F8A3 ++:1093C000DE311FB1B068F9F7D7FE0446304608F029 ++:1093D0009BF800F010BD3368002493F82F303B60F9 ++:1093E00000F061BD5B49002230460097CDF8049043 ++:1093F0000292CDF80CB0C5E35649012330460097E0 ++:10940000CDF804900293CDF80CB0BAE304238C930A ++:1094100004E0B9F10B0F40F31A85043798F80630D1 ++:10942000002B30D13B78304613F0010F39463D46D2 ++:1094300018BF08F1BC054CF0B1D9044628B1436807 ++:1094400013F4805F01D04BF02FDF98F81230002B1F ++:1094500000F0DA84002140460A460B4602F05AFE2C ++:1094600054B1BDF830323046019329462A4608F1FE ++:10947000C20300941EF086DD3046414635F000DD23 ++:10948000002400F010BDAAF179033846DDF83092CF ++:10949000012B8CBF01251025F9F34EF2BAF1790F9B ++:1094A00014BF4FF0000B4FF0010B044638B3D6F851 ++:1094B00000058AA94BF00EDE19E0D2F8F030B3B9FE ++:1094C0001369434513D1102D03D1137E13F0020FFE ++:1094D00004E0012D03D1137E13F0010F07D03046B5 ++:1094E00041465B460095CDF804904BF00BDF8AA80F ++:1094F0004BF0F8DD02460028DFD100F085BC304695 ++:1095000039464CF04BD90246002800F07D843046A5 ++:1095100041465B460095CDF804904BF0F3DE00F039 ++:10952000C2BC98F8070028B1089900240B8E3B6054 ++:1095300000F0B9BCD6F8403504461B8E3B6000F005 ++:10954000B2BCD6F8403500241D8600F0ACBCC04645 ++:10955000E3728600E8728600002F00F05D84B9F1A6 ++:109560000C0F1FD13B79391D13F0010440F05484D6 ++:1095700030464CF013D938B1012386F82D374BF023 ++:10958000A3DE386000F08FBC98F8060018B16FF0C9 ++:109590001D0400F032BCD8F8E03204461B693B6081 ++:1095A00000F081BCB9F1040F40F0368498F8060051 ++:1095B000002840F03184D8F8E03204461B693B6053 ++:1095C00000F071BC304620F0B9D93368D3F88C0074 ++:1095D000036C3B60836C7B60D0F8D831BB60D0F803 ++:1095E000B03102699B18B9F1130FFB6040F30C8492 ++:1095F000D0F83C3100243B6100F055BC9D4900226D ++:1096000030460097CDF804900292CDF80CB0B9E244 ++:109610009849012330460097CDF804900293CDF885 ++:109620000CB0AEE2B8F8623000243B6000F03BBC06 ++:109630009149012330460097CDF804900293CDF86C ++:109640000CB09EE2832D40F30284336B3D1D1869FC ++:1096500009F0FCFB089A4FF0000982F861008C9B2E ++:109660003046043B08992A46CDF8009009F0EEDD1B ++:10967000AB6F84333B6098F80630002B00F0C48356 ++:1096800007F11704204649462022F8F3D9F498F848 ++:1096900019202046AA7408F11A01F8F36DF407F1B5 ++:1096A0000C0008F1BC010622F8F366F44C46FAE31C ++:1096B00001233B60336B00241B687B60F3E396F867 ++:1096C0009C310BB9184601E0336B186800243860F0 ++:1096D000E9E33046294612F053DC8BE3B9F1020F7F ++:1096E00040F3B583336B188968B1022801D1653026 ++:1096F0000FE0052801D167300BE0042801D16A3062 ++:1097000007E0072801D1613003E0082814BF3F209B ++:10971000632000231C4638707B70C4E396F8433600 ++:1097200000243B60BFE396F9473600243B60BAE370 ++:109730006B1C012B02D9012D40F07483EAB2316811 ++:1097400086F84726087E48B191F83F40002C40F04B ++:109750005B833046214620F0A9DDA4E351B2B1F18C ++:10976000FF3F03D1044686F843069CE3012914BF5A ++:1097700000230123044686F8433694E396F84836DE ++:1097800000243B608FE396F84836934200F03C8318 ++:10979000336886F8482693F82F30002B00F0348386 ++:1097A00096F82930002B00F02F83304621F0AEDBF5 ++:1097B0003046012121F0B4DD002474E3306B0368EE ++:1097C000022B40F02183437D00243B606BE3336830 ++:1097D00093F83F30002B40F049833046E9B2012234 ++:1097E0001FF0B4D906E3D6F8583600241B783B6046 ++:1097F00059E3D6F85836002493F903303B6052E31E ++:10980000022D00F20F83304604216AB21CF0B0D85A ++:10981000002448E3D6F85836002493F901303B6021 ++:1098200041E36B1C012B02D9012D40F0FB82304635 ++:1098300002216AB21CF09CD8002434E3B9F1270F4E ++:1098400040F30583282278A83946F8F395F3789CED ++:10985000102C00F20883336B5B7D002B00F0FA8242 ++:1098600064B906F5AE600C3021462822F8F3E8F31F ++:1098700019E3C046177386001C73860033686EAC0C ++:1098800093F84630214613F0030317BFD8F8CC30C5 ++:109890001846C3F3003383F0010000227F230093B6 ++:1098A0000190134678A847F027DCD6F860360022EE ++:1098B0009B782046AC4947F061DB789A6E9B9A42D0 ++:1098C00040F0D18206F5AE6028220C302146F8F334 ++:1098D00053F33268137E002B00F0968292F82F30FB ++:1098E000002B00F0918292F83F30002B00F08C8228 ++:1098F000304621F00BDB3046012121F011DD002440 ++:10990000D1E2336B5B7D002B00F0A482B9F1270F0D ++:1099100040F39D8206F5AE6138460C312822F8F3FB ++:109920002BF30024BFE225B1022D02D0012D40F01F ++:109930009182D8F8E832404683F8E05030F046DFB4 ++:109940000024B0E2D8F8E832002493F8E0303B601D ++:10995000A9E2B6F87A3500243B60A4E23368187EA9 ++:10996000002840F07D824FF6FE739D4200F25A823D ++:109970000446A6F87A5596E201344C4502DAE35DD6 ++:10998000002BF9D1032C00F3688288AD002104225A ++:109990002846F8F355F3224639462846F8F308F4EA ++:1099A000D6F85C0129463CF0DDDB0446002840F097 ++:1099B000248230460DF07ADB06F5AA600A3029468B ++:1099C0000322F8F3F5F386F859456CE2B9F1030F79 ++:1099D00040F33D82D6F85C013BF05EDE0422014696 ++:1099E0003846F8F3C9F200245DE2D6F80C350024BD ++:1099F0003B6058E233681B7E002B00F0228229E294 ++:109A0000B9F1030F40F32382A9F1040399083B68DD ++:109A10008B4288BF396000252C460E2C8CBF4FF43A ++:109A200080514FF4005144F430631943D6F85C017F ++:109A300089B23CF0B3DC10B10DAB5C55013501349B ++:109A4000E02CEAD13B68AB4201D3002107E03D6046 ++:109A5000FDE10DAA8A5C07EB81035A600131A9423E ++:109A6000F7D100243D601EE2304639463BF064DF0A ++:109A7000C0E13046394608F0DDFCBBE196F8CE3156 ++:109A800000243B600FE286F8CE21304600210AF028 ++:109A90005FDF002407E23368114683F84120336B0F ++:109AA0000024186909F0A6F9FDE13368002493F851 ++:109AB0004130003B18BF01233B60F4E133680024D0 ++:109AC0003B60F0E1D8F87030B3F1FF3F00F0AD81BA ++:109AD00008EB8303586F002800F0A781C3790024A6 ++:109AE000AB4214BF002301233B60DCE140466FF032 ++:109AF00007040025416FB9B1CA798C9B9A4213D1F2 ++:109B0000D8F87030B3F1FF3F07D008EB83035A6FEA ++:109B10001AB1538923F0020353814B89C8F870505E ++:109B200043F002034B81002401350430042DE1D1C0 ++:109B300061E1B9F1090F40F38A8185E101314945BD ++:109B400000F08581CB5D002BF8D1A6E100230293C4 ++:109B5000304639463A19C4EB09030097CDF8049012 ++:109B6000CDF80CB00FE0C0460C1886003B19C4EBD2 ++:109B700009020093012301920293CDF80CB0304604 ++:109B800039460022134619F00BDC33E198F8063011 ++:109B9000002B40F0598198F81130002B00F05481CF ++:109BA000D8F80C00394698F8072013F0B9FB21E1EA ++:109BB00019F0010440F0308101230293AD49AE4B0E ++:109BC00040F21312924518BF1946304622460097BC ++:109BD000CDF80490CDF80CB0D4E73846B16B4FF413 ++:109BE0008672F8F3C9F100245DE138460899AC2289 ++:109BF000F8F3C2F1002456E1099C099AA36B516B5A ++:109C000047F8043B926B3846F8F3B6F1099B099C80 ++:109C10009A6B5B6CB818BB50216C626C0430F8F323 ++:109C2000ABF100243FE1336893F83F30002B00F0A4 ++:109C3000FF800899002900F0FB80496E002900F0A0 ++:109C4000F78038460822F8F397F100242BE1089AB0 ++:109C5000384602F16B011022F8F38EF1002422E164 ++:109C6000089B384603F17B011022F8F385F10024AC ++:109C700019E133681B7E002B00F0E3803046394643 ++:109C80004A460AF065DFB5E033680121186901F042 ++:109C90000DDB002407E1304651464A463B46F9F7C2 ++:109CA00017FB0446002840F0A880BAF13C0F49D1C8 ++:109CB0003D1D00F0AE807B6813F0006F40F0A9807E ++:109CC00003F07F03022B06D0042B04D00B2B02D011 ++:109CD000162B40F09E806EAC3046214613F0A6DE77 ++:109CE000304621461CF01ED8286810F0006F26D0A0 ++:109CF00010F4000F00F4E06310D01B0A043B012BAA ++:109D00005E4900F07F0204D8142302FB0313D868D5 ++:109D100017E0142302FB0313986812E01B0A043BAC ++:109D2000012B564900F07F0204D8142302FB0313D1 ++:109D3000586806E0142302FB03F3585801E000F0D2 ++:109D40007F002860336B514618698CAB0733009352 ++:109D50004A463B460AF0B4F9BAF13C0F044608D033 ++:109D6000BAF15C0F05D0BAF14A0F02D0BAF15D0F1B ++:109D700041D1002C41D1002F00F095803B68326822 ++:109D8000003B18BF012382F840308CE03C490022A0 ++:109D900030460097CDF804900292CDF80CB0F1E671 ++:109DA0003749012330460097CDF804900293CDF84F ++:109DB0000CB0E6E63349012330460097CDF8049015 ++:109DC0000293CDF80CB0DCE6D6F8680151463A466D ++:109DD0004B46CDF800B04AF0C9DC10F1170F04462D ++:109DE00009D1D6F8340751463A464B46CDF800B073 ++:109DF00029F030D90446002C55D004F12A032A2B2F ++:109E000002D83368DC664EE000244CE06FF00804B2 ++:109E100049E06FF0010446E06FF00104EDE74FF018 ++:109E2000FF34EAE76FF01C04E7E76FF00704E4E7AC ++:109E30006FF01004E1E76FF00604DEE76FF00A044C ++:109E4000DBE76FF00304D8E76FF01604D5E76FF097 ++:109E50000D04D2E76FF00C04CFE76FF00E04CCE7EF ++:109E60006FF00404C9E76FF00B04C6E76FF01B0442 ++:109E7000C3E7C0467ED701002F7386008418860092 ++:109E8000507386005D7386006FF00204B5E76FF0D3 ++:109E90000804B2E76FF01904AFE74C1CBAF5837FF2 ++:109EA0003FF454AE62E620460DF50F7DBDE8F08F1D ++:109EB0002DE9F341089C05460E4617469846009446 ++:109EC00007F0A6FD10F1170F06D1284631463A4695 ++:109ED00043460094FDF788FFBDE8FC812DE9F04181 ++:109EE0000368054693F83F30D0F80C8013B1B0F802 ++:109EF000267602E0FAF70CFF074600222869394669 ++:109F000003F0E2F85621286933F08ADBD5F888316E ++:109F10004000002BC5F8040506DA2869B22133F0A9 ++:109F20007FDB4000C5F80805A221286933F078DB03 ++:109F30004000C5F8EC07284612F03AD895F8CD3124 ++:109F40003BB928694C2133F06BDBC0F3C71085F8AF ++:109F5000CD0128461CF092DDD5F84C0104F02EFD11 ++:109F600028463DF05FDA002605EB8603D3F84C4225 ++:109F70002CB120461EF03EDF20461EF031DD0136BA ++:109F8000082EF1D12B6893F83F309BB1002205EBEE ++:109F90008203D3F84C0250B1037943B1D0F8D432E4 ++:109FA000DB8D1B04C8F888311FF05CD902E0013258 ++:109FB000082AECD12846394609F0AAD82846742147 ++:109FC000B5F87A2522F006D995F8D13142F210720F ++:109FD000002B18BF4FF4BC622846822122F0FAD829 ++:109FE0002B6B95F8D111186909F04AF80122134634 ++:109FF000B5F8781728460AF063DA0123B5F87A171E ++:10A00000002228460AF05CDAD5F8400125F0D8DBBA ++:10A010002846F9F7E9FA2B685B6B5BB1B8F888362C ++:10A02000D5F86C029BB243F00403A8F888360021EF ++:10A0300017F0B6DE2846F9F77BFAD5F8841161B936 ++:10A0400028461CF08DD80404C5F884412846022116 ++:10A050001CF086D82043C5F884012B6893F8A13002 ++:10A06000012B03D1D5F8400126F096DC284617F0E5 ++:10A07000C7DF284608F0B6DBB5F85C1728461CF0A9 ++:10A080004DDD284610F004DA424BEA68002185F8DD ++:10A090004410C2F8DC33012385F8A83185F8AA31D1 ++:10A0A0002B6893F838303BB14A1901314FF0FF3338 ++:10A0B000082982F89538F7D100244FF440763146CC ++:10A0C00028461CF04DD805EB4401B1F8203213F0BE ++:10A0D0000F0F06D123F00F0300F00F021343A1F876 ++:10A0E0002032B1F8202212F0F00F06D100F0F00378 ++:10A0F00022F0F0021343A1F82032B1F8202212F42A ++:10A10000706F06D100F4706322F470621343A1F8FB ++:10A110002032B1F820321A0B06D11B0500F4704230 ++:10A120001B0D1A43A1F8202201340236042CC6D19B ++:10A130002B68284693F94C100BF076DA2A68137EC8 ++:10A1400003B392F82F30EBB1002605EB8603D3F86A ++:10A150004C426CB1A3795BB12B6893F838302BB1CA ++:10A160002846D4F84C15002235F0F2DD0023E371C7 ++:10A170000136082EE9D1002385F87232D5F834076C ++:10A180002AF0C8DDD5F8680104214AF011DABDE8EB ++:10A19000F081C0468096980003681A6819B10123BF ++:10A1A00082F8AA3001E082F8AA1070472DE9F04742 ++:10A1B0001746937AD27A056843EA022A3B79064623 ++:10A1C00003F007044FF0000938E00B6968681A785B ++:10A1D0005B7842EA0328D6F87822936E01339366BF ++:10A1E0000122FCF39DF52B6893F8A130012B03D0DD ++:10A1F000C8F34123032B17E0182304FB0362B2F8D2 ++:10A200008232B2F88612284699420CBFB2F88032E8 ++:10A210004B1CA2F886322146012220F0E5DB09F131 ++:10A2200001031FFA83F9D1450AD02B69022103EB00 ++:10A230008403D868124B9B6B984701460029C4D110 ++:10A240002B6893F8A130012B05D02846214696F9BA ++:10A250002C2020F0C9DBBB7913F0020F0ED00024B4 ++:10A2600006E00120FCF378F2631CDCB20B2C05D075 ++:10A27000EB68D3F8703113F0010FF2D0BDE8F0872E ++:10A28000E0A685002DE9F347D0F80090044601A927 ++:10A29000D9F800054AF01EDF00263AE07B6813F487 ++:10A2A000802F36D063684FF00008FD58AA46D5F8D5 ++:10A2B000F8205FFA88FE32B391781379002918BF2D ++:10A2C00001261BB100231371D3701CE0D9B1D378E0 ++:10A2D0000133D9B2D1707B6813F4807F14BF628ED2 ++:10A2E000A28E6423B2FBF3F291420BD3D4F878220E ++:10A2F0004846D2F8C43051460133C2F8C4307246E1 ++:10A3000023F030DF012608F101080435B8F1080F09 ++:10A31000CDD101A84AF0E6DE07460028BED136B905 ++:10A32000236884F8A3639868A16B05F097D9BDE80A ++:10A33000FC87C0464368F7B5CE5805460027FCB2F7 ++:10A3400028463146224622F0DBD901370123284630 ++:10A350003146224622F040D9082FF0D12A68002346 ++:10A360000093506806F110010122F8F36BF5FEBD71 ++:10A37000D0F8AC037047C046D0F8C0037047C04661 ++:10A38000C0F8C0137047C046D0F8AC331B68DB6917 ++:10A3900018690528A8BF05207047C0462DE9F04F71 ++:10A3A000F3B00890894608999DF8F8010792D1F812 ++:10A3B000B0231C46D9F8D4320690D1F8AC730C9275 ++:10A3C000002148A828226F9115937C9DDDF8F48127 ++:10A3D000F7F336F607980C99037803F0FC03202B6B ++:10A3E00014BF002301230D9391F82F3033B1D7F818 ++:10A3F0006801837913B104214AF0DAD80D9A0AB1C1 ++:10A40000092D00E0032D40F2E58522786378211DB7 ++:10A4100042EA032AA278E37842EA03230E930D9BD3 ++:10A4200023B9043D8B4613950F9304E00A3D04F1D4 ++:10A430000A0B13950F911398012840F2CB859BF8D6 ++:10A44000013002339842C0F2C58548AB00933846CC ++:10A450005946139A002319F059DE002840F045832D ++:10A4600097F838279DF834319A4240F03E8399F8A6 ++:10A4700019309BF801209A4240F03E8309F11A00FE ++:10A480000BF10201F7F35CF5002840F0358398F8F2 ++:10A49000183013F0020F0BD098F8DF3023B1384694 ++:10A4A000414601222BF0CEDC4046FE214AF0C8DDB9 ++:10A4B00099F94820002AC0F21F8398F8183013F049 ++:10A4C000010F00F01983082392FBF3F34344197D35 ++:10A4D000A44B02EA0303002B05DA013B6FEA437346 ++:10A4E0006FEA5373013351FA03F313F0010F00F0D5 ++:10A4F000038319A80021C8F81090A8F800A101381A ++:10A500006D22F7F39DF50024214613E072AA53183B ++:10A5100013F8A43C03F07F026C2A0AD89248835CAB ++:10A520003BB119AB013B9A54835634EA230428BF4C ++:10A5300001240131489B9942E8D3D8F8043023F034 ++:10A5400007023B6BC8F804205B7D23B11CB942F0C5 ++:10A550000103C8F804303B6B5B7D43B11AF4806F94 ++:10A5600005D1D8F8043043F00203C8F804301AF0DB ++:10A57000200405D0D8F8043043F00403C8F80430B0 ++:10A58000159B0021986B0FE0159A531893F83C2007 ++:10A5900012F0800F07D019AB013B02F07F029B5CE9 ++:10A5A000002B00F0A28201318142EDD10C9890F88D ++:10A5B000463013F0030F45D05946139A38461BF026 ++:10A5C0009BDD00260546414638462A46334600961E ++:10A5D00018F00CDBB5B14DA8E91C01301022F7F3DF ++:10A5E000CBF431467B1872A893F8EB24431813F888 ++:10A5F000933C02EA0303934240F077820131102931 ++:10A60000F0D105E00C9991F84730002B40F06D82B5 ++:10A6100038465946139A43461BF0D8D83B22584631 ++:10A620001399F8F34BF0024660B141784B1EDBB250 ++:10A630001E2B07D888F80B1108F58670911C5278EC ++:10A64000F7F39AF4B9F862200023A8F83C20C8F880 ++:10A650004030B9F8623033B1D9F8582040F237139E ++:10A6600002EA030343B9D9F8583013F0400003D18C ++:10A670000646119016905EE0139B58461946CDF899 ++:10A68000C0B16E9326F02EDD119038B14378042BC3 ++:10A6900040F239820020064616904CE070986E9980 ++:10A6A000F8F318F6119050B108F1400300930898A0 ++:10A6B0004946119A08F13C0327F092DD10E0584614 ++:10A6C00013993022F7F3FAF770B1119008F14003B3 ++:10A6D000009308984946119A08F13C0327F08CDC56 ++:10A6E000002840F0108223E0584613994422F7F3E3 ++:10A6F000E5F7119080B108F14003009308984946AE ++:10A70000119A08F13C0327F0D7DB002840F0FB81C9 ++:10A7100001210E4616910EE0D9F8583013F0410F82 ++:10A7200000F0F181119A1646A8F83C20169202E03A ++:10A73000002301261693D8F8043023F4001323F0E5 ++:10A740004003C8F804303B685B6B002B3AD0D9F863 ++:10A75000CC3013F0020F35D11398CDF8C0B16E9004 ++:10A760000BE0C04607000080401B860038462946A3 ++:10A7700070AA6EAB18F0F2DE38B970986E99DD22CF ++:10A78000F7F39CF705460028F0D1404600211BF066 ++:10A79000ADD9BDB1D8F8043043F04003C8F8043057 ++:10A7A00097F8FA3173B14046297A1BF09FD998F88F ++:10A7B000D13013F00F0F05D0D8F8043043F4001354 ++:10A7C000C8F8043000231399304A5846009317F014 ++:10A7D00099DD4146024638461AF0D2DF1AF01005DC ++:10A7E0000DD0D9F8582040F2371302EA030333B9E9 ++:10A7F00012F0400F00F08D81002E40F08A810C99FC ++:10A8000091F8303053B93B6B1B68022B06D197F996 ++:10A810005C361BB914B94FF0130A24E03B6B1B687C ++:10A82000022B08D1089A53782BB11AF4806402D114 ++:10A830004FF0190A17E0384611F074DB0899D1F887 ++:10A84000C033984211D303230093079B002403F1E4 ++:10A850000A0238461721012301940294039419F047 ++:10A8600027D94FF0110A10945AE10C9890F838301B ++:10A8700073B13846494612F079D8D9F85035984224 ++:10A8800006D300214FF0110A109149E148D401008C ++:10A890000C9A92F8463013F0030F27D0D9F85820BD ++:10A8A00040F2371302EA030303B397F8692712F063 ++:10A8B000020F08D0D8F8043013F4803F03D0D8F842 ++:10A8C0004030022B0BD012F0010F0FD0D8F804301B ++:10A8D00013F4803F0AD0D8F84030012B06D1002273 ++:10A8E000384641461346009218F080D9D9F8CC304A ++:10A8F00013F4005F09D0D7F84C0141465A46139B28 ++:10A9000003F0D8FE002840F00481D8F8043013F09A ++:10A91000010F02D0012387F84D36D8F8043013F028 ++:10A92000011F02D1012387F84E36D8F8043013F402 ++:10A93000801F02D0012387F85136D8F8043013F471 ++:10A94000002F09D11598438E03F44063B3F5406F8F ++:10A9500002D1012387F85236D8F8043013F0020FE1 ++:10A9600002D0012387F84F36D8F8043013F0040FD3 ++:10A9700002D1012387F85036D8F8043013F4001FB1 ++:10A9800002D0012387F8FB31D7F8344720462AF05C ++:10A9900091D930B120462AF095D910B120462AF03D ++:10A9A00063D9D8F8043013F0007F1DD0012487F854 ++:10A9B00054460C9991F8463013F0030F14D091F9D6 ++:10A9C0004C308BB10221384618F0CAD8159A538EF4 ++:10A9D00003F44063B3F5406F06D138462AF002D83D ++:10A9E0003846214629F07ADFD8F8043003F40413FE ++:10A9F000B3F5001F02D1012387F853363B6B5B7D13 ++:10AA000013B1384620F0E8DA0C9890F8463013F08D ++:10AA1000030F02D0384620F091DBD8F8403043B91C ++:10AA20003DB1D9F8583013F0010F02D00123C8F816 ++:10AA300040300C99D9F8582091F838301BB9D7F824 ++:10AA40006C32994524D0B9F8620008BB12F0010FAE ++:10AA50001ED0D9F87030B3F1FF3F19D009EB830352 ++:10AA60005C6FACB1217A012901D0032910D1628930 ++:10AA7000E379009204F11402029208F11A020191A2 ++:10AA80000490059003923846494622693CF0F6DC72 ++:10AA9000B8F8D4302BB9D8F8100034F081DDA8F81C ++:10AAA000D400B8F8D4200C98109290F8463013F0E7 ++:10AAB000030F33D0D8F84030013B012B0AD8D8F827 ++:10AAC000043013F4802F05D038464146062220F08A ++:10AAD000E7D823E0D8F8043013F4802F1ED038468E ++:10AAE0004146062220F080D818E000214FF0120ADB ++:10AAF00011911091169113E000224FF00C0A11925F ++:10AB0000109216920CE000234FF00C0A169310934B ++:10AB100006E000204FF00C0A109001E04FF0000A10 ++:10AB20003EAC00212822204634ADF7F389F22846B6 ++:10AB300000212822F7F384F2D7F87C3533B107F5EA ++:10AB4000AE6120460C312822F7F316F21599234600 ++:10AB50003831099138464946099A00951BF076D953 ++:10AB60003E9B03F10804349B0BB10233E418D8F880 ++:10AB700004304846002BB8BF14340421002235F0BD ++:10AB800091DA97F8653604190BB10233E418D8F856 ++:10AB900004300DF5A57013F0400F18BF1A340021D2 ++:10ABA0002022F7F34DF2D8F8043013F4803F05D09B ++:10ABB000D7F8FC3434341B7803B11334D8F8083098 ++:10ABC00013F0400F06D0D7F84C014146524645F0ED ++:10ABD00041DC2418079A09F1C2030A3217920D9A30 ++:10ABE0000A9309F1BC006FAB0B9000900293002A0E ++:10ABF0000CBF102130213846179A0A9B019417F098 ++:10AC0000DBDB1490002800F0E5816F980123041924 ++:10AC100012940370013B43703B6B1B68022B05D100 ++:10AC200097F95C2612B91F3303704270D9F8582087 ++:10AC300040F2371302EA03035BB199F8603043B185 ++:10AC40000378427843EA022343F0100303701B0A9F ++:10AC5000437097F843365BB13B6B5B7D43B1037840 ++:10AC6000427843EA022343F4806303701B0A437073 ++:10AC7000002380F802A0C370109B037110990B0A87 ++:10AC80004371012106303FAB3E9A21F06DDAD8F8CE ++:10AC900004300646002B06DA0C21122207F5037356 ++:10ACA00021F062DA0646349A2AB13046322135ABB9 ++:10ACB00021F05ADA0646D7F8603648AC00229B7875 ++:10ACC0002046099946F05AD9D8F8043013F4803F49 ++:10ACD0003FD03B6B0DF5B5751B6804F11502022BD7 ++:10ACE00014BF002301234846294661AC21F09ED9B8 ++:10ACF0004846214621F0F6D830462D211A222B460F ++:10AD000021F032DA23463D21162221F02DDAD7F840 ++:10AD1000FC3406461B78E3B172AB012203F8012D27 ++:10AD20007F2121F021DAD7F8FC140DF5D574054602 ++:10AD300024310E222046F7F31FF138462146002227 ++:10AD400017F0EEDE28464A210E22234621F00CDAC7 ++:10AD50000646129AB24201D2002002E0129BC6EBD4 ++:10AD600003000423009001934846334600214FF02E ++:10AD7000FF3235F0D9D997F8653604462BB107F57F ++:10AD8000CC61043112F0C2DC0446D8F8043013F070 ++:10AD9000400F08D007F500732046DD211822063346 ++:10ADA00021F0E2D90446D8F8083013F0400F06D05D ++:10ADB000D7F84C0141465246234645F02BDB069816 ++:10ADC0000023D9F808200090019302933846149983 ++:10ADD000D26843461AF0A6DEBAF1000F40F0FA80BE ++:10ADE0001099159AA8F8D41092F860300E989BB27A ++:10ADF000834238BF0346A8F80231022140464AF098 ++:10AE00007FDB404649464AF0C5DAD9F8CC3013F426 ++:10AE1000801F09D03846494611F0A8DD012803D12A ++:10AE20003846494634F002D80C990D9A8B6AC8F816 ++:10AE300024305AB10B980F990622F7F381F028B10C ++:10AE400008981799D9F8082027F0CEDBD9F8082000 ++:10AE50000898179926F0CCDFD9F8CC2012F40053CB ++:10AE60000CBF1C4602243B6893F8463013F0030FD6 ++:10AE700007D012F4805F04D1B8F8063003F0010265 ++:10AE800000E000227F2300930192234648A808F1A6 ++:10AE90004401002246F030D9384641464AF032D9C2 ++:10AEA0000C9890F82F3063B1D8F8E81049B1C06819 ++:10AEB000D8F8EC20FBF31CF70023C8F8EC30C8F8F6 ++:10AEC000E830B9F86230002B33D0D9F8582040F27E ++:10AED000371302EA030363B312F0010F01D1119992 ++:10AEE00039B398F8DE300BB1119AB2B90C9890F8DA ++:10AEF0002F30F3B11199E1B14978C0680231FBF309 ++:10AF0000E7F6C8F8E800A0B1119B5A78194602325A ++:10AF1000C8F8EC20F7F330F00BE00224384608F1D3 ++:10AF20001A010B9A0A9BCDF8008001941DF02AD8D3 ++:10AF3000A246D9F8CC3013F4005F04D0D7F84C0106 ++:10AF4000494644F0FFD938464946012216F0E8DF69 ++:10AF500000231398009302930D9B0490002B0CBFC9 ++:10AF600008220A2238464946179BCDF804A0CDF89E ++:10AF70000CB011F0D3DD169860B3D9F87030B3F18E ++:10AF8000FF3F03D009EB83035B6F13B90DF5CD725F ++:10AF900002E003F5997312E0362313700DF5CD71BD ++:10AFA00026335370023201F110039A42F4D10C9A05 ++:10AFB00092F82F3013B137238DF89A310B46009356 ++:10AFC000F12301933846494608F11A02D8F8E830CF ++:10AFD00020F0FAD973B0BDE8F08FC0462DE9F04FEC ++:10AFE000D0F8ACA3D1B0D0F8B00389469DF86C116D ++:10AFF0000890DAF86801079206911E4683799DF859 ++:10B00000704113B1042149F0D3DA99F8063023B125 ++:10B0100099F80430002B00F09B813278737842EA73 ++:10B020000328B278F37842EA0323079A0993537806 ++:10B030001B0213F4804040F07D81099B012B00F03E ++:10B04000828083460E2545E1DBF8D830002B00F0E6 ++:10B050007F81F3789F0914B30AEB8703D3F88052FA ++:10B06000EDB12B69DBB12B7ACBB14CAC314603226D ++:10B070002046F6F381F705F114012A69E01CF6F386 ++:10B080007BF729690DF12E05204603312A46FDF391 ++:10B0900061F25A9A301D111F2A46FDF38BF2032FDD ++:10B0A00040D809EB87035B6F002B3BD01A695A9895 ++:10B0B0003146143301F02ADF002833D0321D3179B4 ++:10B0C000537841EA03289178D378B8F1010F41EA27 ++:10B0D000032309931FD1032B1DD1B37A06F10A0272 ++:10B0E000102B18D1DBF8D80006F10C010230527891 ++:10B0F000F6F326F7044670B95846414699F94820B8 ++:10B100004AF016DA8BF8DE805846414622464AF06D ++:10B110000FDA25460BE05846012199F9482049F0FD ++:10B1200099DF03E003234FF0010809930F25DBF8B3 ++:10B13000D810089E4A78F0680232FBF3D9F5002354 ++:10B14000CBF8D830C6E0D9F85050D9F84C60D9F8CF ++:10B150005410ADB10C46074609E00799062201F1EB ++:10B160000A002146F6F3ECF6063410B10137B74277 ++:10B17000F3DB012D02D1B74206DB01E0022D01D045 ++:10B18000002512E0B742FBDB03230093079B00245A ++:10B1900003F10A02504617212346019402940394B6 ++:10B1A00018F086DC0125A346AFE0BAF8822144F20C ++:10B1B00021339A4214D00E3B9A4211D007339A425F ++:10B1C0000ED010339A420BD0143B9A4208D007336A ++:10B1D0009A4205D010339A4202D025339A4200D1C8 ++:10B1E0000125079E504606F10A0421462A464AF0E8 ++:10B1F000DFDA014610B150464AF0E2DA0135002D9F ++:10B20000D3DD504621464AF0E3DB8346002800F0B8 ++:10B210009C8049464AF0BED8DBF8042012F4805FD7 ++:10B2200009D0089991F83030002B40F08E8022F43C ++:10B230008053CBF80430504659461BF0CDDEB8F1B0 ++:10B24000000F03D0B8F1010F16D041E0B9F95C301E ++:10B2500099F9482023B9584601214AF069D903E0F9 ++:10B260005846012149F0F6DE9BF8183013F0010F23 ++:10B2700069D000252C4632E0DBF8D81041B1089B9C ++:10B280004A78D8680232FBF333F50023CBF8D83084 ++:10B29000B9F86250002D56D1089E8221F068FBF368 ++:10B2A00017F5044608B945462FE0102303706FF0E8 ++:10B2B0007F0343702946DAF80C30B3F85A26631836 ++:10B2C000013180299A70F6D10025CBF8D84006E0EC ++:10B2D0000D2502E0099903293AD80024ADB9BBF144 ++:10B2E000000F12D09BF8183013F0010F0DD0079EFD ++:10B2F00050464946042206F10A0300950195CDF80F ++:10B3000008800395049511F009DC0999069A4B1CF5 ++:10B31000019300230393079B059203F10A0148461A ++:10B3200009F1BC025B46CDF80080029504941CF044 ++:10B33000F3DC0DE0079A504602F10A014AF02EDADA ++:10B34000834628B180E60D2500E001250024DCE7D6 ++:10B3500051B0BDE8F08FC0467FB5089D9DF82440F0 ++:10B360009DF82860009501940296FFF737FE7FBD97 ++:10B3700002292DE9F0410646D0F8AC5301D0002453 ++:10B3800001E000F575742B68D3F88C205368126CBB ++:10B390009B1822692361C2EB0302A3699A422378B6 ++:10B3A0000ED24BB9E26863699A4205D30123237038 ++:10B3B00063680133636028E0E3680133E36024E0FD ++:10B3C0000027E7600BB3012904D1284602311EF0A3 ++:10B3D00025DE18E0022916D1A868D6F8D01304F0AB ++:10B3E0003DD9D6F8CC3373B12B6893F87430012B68 ++:10B3F00007D02869012132F063D82A68012382F836 ++:10B400007430C6F8CC7300232370BDE8F081C046C9 ++:10B410002DE9F04F97B0DDF894B0D0F8AC6300237D ++:10B42000D0F8B0930C460746594630460392DDF8F3 ++:10B4300088A014931393129333F0DCDF039905462D ++:10B4400001F001030093484621465246239B17F022 ++:10B450003BDF1490002840F00783219A032A0DD97E ++:10B46000042213A82099F6F387F5219B072B05D911 ++:10B47000209A12A8111D0422F6F37EF5139C129A4D ++:10B48000B4F1000818BF4FF00108BBF1000F01D163 ++:10B49000D5F808B003998B1E472B00F2E182DFE854 ++:10B4A00013F0F900FE00010104016A007D008C0028 ++:10B4B000DF028E00DF029700DF0207010A01480069 ++:10B4C00058007F0195010D011F014E015401280212 ++:10B4D000DF029900A000AD00B00033013601FC008E ++:10B4E000DF023E024202DF02DF02DF02DF02DF0292 ++:10B4F000DF02DF02DF02DF02DF02DF02DF02DF0244 ++:10B50000770289028E02E500EF00E202A402DF0268 ++:10B51000DF02B402B702C002C302C602C902CC02F3 ++:10B52000DF02DC02CF02DF02DF02DF02DF021402F1 ++:10B530001B02D9F83430002B00F092820DAC30465B ++:10B5400007F56371224620F077DB50462146102232 ++:10B55000C3E0D9F83430002B00F0828211AC5146A0 ++:10B5600004222046F6F308F5304607F563712246BB ++:10B5700020F07EDB1FE0219A0023052A8DF857304A ++:10B5800040F22781384620990DF1570227F084DADE ++:10B590009DF8573014908AF8003064E251463046E6 ++:10B5A0004AF0FCD80146002800F0268238469AF876 ++:10B5B000062029F06FDC149055E29B4B00E09B4B7A ++:10B5C0000093384629465246239B27F0FFD9F2E7DD ++:10B5D000974BF5E7D6F83407FEF7CEFECAF8000021 ++:10B5E00041E2D6F834572846FEF7CEFE844200F3F7 ++:10B5F0002E8228462146FEF7C3FE34E2D5F85035A8 ++:10B600003BE03368DB691F692B79002B40F06B81CD ++:10B61000BC4200F31C82C5F85045139C18461946DD ++:10B620007318D3F84C2222B1937913B1954218BF05 ++:10B63000013004312029F3D1002800F01482C4EB3A ++:10B64000070393FBF0F000217318D3F84C224AB1A2 ++:10B6500093793BB1954205D0D2F85035834288BFEB ++:10B66000C2F8500504312029EED1FCE196F9A83842 ++:10B67000002B01DA002300E00123CAF80030F2E1D8 ++:10B68000B8F1000F01D0002301E04FF0FF3386F83E ++:10B69000A838E8E195F83C30EFE7AB79EDE785F8BD ++:10B6A0003C80E0E1D6F82837E7E7C6F82847DAE13A ++:10B6B000D7F8BC33E1E7C7F8BC43D4E16A7E049213 ++:10B6C00022B105A805F11A01F6F356F4049B1A1DE0 ++:10B6D000239B93427DDB504604A9F6F34DF4C2E16F ++:10B6E000202C02D96FF01103BCE12399231D99424C ++:10B6F0006FDB2B79002B40F0F68028460AF104011D ++:10B70000224633F039DAAEE195F83A30B5E7AB7955 ++:10B7100085F83A8085F83B80002B00F0A4812B79D6 ++:10B72000002B00F0A0813046294611F0BFDA3046E8 ++:10B730004FF000614FEAC86218F03CDA93E199F8E3 ++:10B740003830003B18BF012397E799F838301C1EAA ++:10B7500018BF0124444500F0868130461FF076DB97 ++:10B7600010B96FF015037DE154B1304601F0C2FE0F ++:10B77000736A23F4C0137362002389F8383072E1CE ++:10B78000736A304643F400237362022389F8383029 ++:10B79000D6F8AC38013B86F8A93805F081FE62E1A5 ++:10B7A000219A032A15D9002C05DB3046214614AA1C ++:10B7B00033F064DD05460DB12B795EE7149B13F180 ++:10B7C0001E0F40F05081CAF800504CE1239B072B1C ++:10B7D00002DC6FF00D0345E1032A01D1002703E0ED ++:10B7E000022A14BF00270127002C2DDB30462146FA ++:10B7F00014AA33F043DD054630BB149B13F11E0F32 ++:10B8000022D1129B002B1FDD87F0010300932A46F3 ++:10B810002B463046139933F0CBD9054650B96FF01B ++:10B820001A03149310E0C046991E8300A91E8300DA ++:10B83000F92A83003046294633F0A4DE149018B16B ++:10B840003046294633F0F8DD129B032B00F00B81C4 ++:10B85000022B00F00881149A3AB112F11E0F40F049 ++:10B860000281002B40F0FF80FCE0002B24DD2B79CF ++:10B87000002B40F0F88033681B6F13F0030F02D0E9 ++:10B880006FF00803EEE0AB7923B13046294633F080 ++:10B89000ABDC90E6D5F8CC3013F4005202D04FF078 ++:10B8A000FF33DFE06B7E304600920192294605F1BE ++:10B8B0001A022EF05DD8D6E06B79002B00F0D38011 ++:10B8C0003046294633F0DCDACDE015B195F9643520 ++:10B8D000D3E6CAF800501FE0F5B1002C1CDB012CA8 ++:10B8E0001ADC2B7913B16FF00403BBE085F86445D3 ++:10B8F000B9E099F818307BB199F82F3063B199F815 ++:10B9000030304BB999F83F3033B9D6F868319B796C ++:10B9100013B9B6F81637B0E66FF00103A2E033684A ++:10B9200093F83030A9E6336893F83030434500F09F ++:10B930009A80304633F024DF0446B8F1000F05D07A ++:10B9400043791BB13046214633F09ADA214630461E ++:10B9500088F0010233F01CDF04461490002840F008 ++:10B9600082803368012283F82F20B8F1000F03D0C2 ++:10B97000D6F8403583F834203368304683F8308079 ++:10B9800010F01EDA86F8DD41304605F0BDFD6AE0B4 ++:10B99000BAF80200F7F360F4E8B99AF80400BAF8CC ++:10B9A00002109AF800209AF801300090284628F0FA ++:10B9B000C3DD00E6D6F83437B3F8A4335DE624B926 ++:10B9C000D6F83437A3F8A4434DE0D6F85C01A1B211 ++:10B9D0003AF0E4DC10B96FF0130343E0D6F83437E3 ++:10B9E000BDF84C10A3F8A4133DE0BBF1000F03D049 ++:10B9F0009BF80430022B02D06FF01D0332E0384672 ++:10BA0000DBF8101027F01CD8D5E597F8F03334E6B2 ++:10BA1000E3B287F8D53387F8F033384626F0D6DE20 ++:10BA200021E0D7F8E83328E6C7F8E8431BE0D7F869 ++:10BA3000EC3322E6C7F8EC4315E097F8D4331CE664 ++:10BA4000D6F86C32D3F8D432DB8D9C4202DD6FF035 ++:10BA50001C0307E0A7F8C84305E0B7F8C8330CE6B5 ++:10BA60006FF016031493149817B0BDE8F08FC0461A ++:10BA70002DE9F0410468074686B020460E46904600 ++:10BA80001D461BF0B3D910B120461BF0A7D90C9B63 ++:10BA90002046029300230393049339460B22434626 ++:10BAA0000096019511F03AD806B0BDE8F081C04685 ++:10BAB00070B5114686B00546164649F06FDE04465D ++:10BAC00008B390F8DF3023B12846214601222AF03E ++:10BAD000B9D9204649F0E8DBE3681BB12846214686 ++:10BAE0003CF0CCD9002203230092019302920392EE ++:10BAF0000492284621690532334611F00FD82846B2 ++:10BB0000214649F05DDE06B070BDC04670B5036BDE ++:10BB1000002680F8D068D0F85C410546186907F027 ++:10BB200005F8014620463AF001DA20B12846012105 ++:10BB3000324618F031DA70BDF0B505688BB00646B4 ++:10BB40000021EF681DF0D6DA304610F01BDFD5F883 ++:10BB5000E4366BB1A868D5F8741503F07FDD0023D7 ++:10BB6000C5F8E43695F8583503F0FD0385F85835E7 ++:10BB7000D5F85C013AF0BAD92A6992F8EA3063B193 ++:10BB8000D36ED3F8202140F2044302EA0303B3F555 ++:10BB9000806F14BF0020012006E0106E03F054FEF9 ++:10BBA000D0F1010038BF002000283CD0284605F025 ++:10BBB00019FE2B6BD5F85C41186906F0B7FF0146FA ++:10BBC00020463AF0B3D930B195F8D0281AB92846B2 ++:10BBD000012118F0E1D9304611F06EDC4FF000433E ++:10BBE000C7F888310F21286931F010DE286940F24A ++:10BBF000FF3131F0F9DD2B6B1B68022B04D1286972 ++:10BC000095F8431631F05EDE284616F02DDC284606 ++:10BC100016F0F6D900232846694600931AF082D818 ++:10BC200028461DF0D7DB0BB0F0BDC0462DE9F04F24 ++:10BC30000668D0F8D022D0F8D81297B00746D0F8CE ++:10BC4000E8B23046069107921DF04CDC069BB068C6 ++:10BC5000196803F003DD384602212CF02DDEF7E1F0 ++:10BC6000D6F8D83603EB82035D686C8E04F470431B ++:10BC7000B3F5805F14BF38233C2356F8039004F4D7 ++:10BC80004063B3F5406F28D1336893F8463013F022 ++:10BC9000030F15D0D6F85C01D9F8041039F02EDD69 ++:10BCA00010F0080F0CD199F8EC304BB1D9F80030F6 ++:10BCB000022B12D1D6F8FC349B7813F0020F0CD073 ++:10BCC0002046F7F3AFF20E2894BF4FF400534FF421 ++:10BCD000805340F4306003439CB2D6F85C012146A7 ++:10BCE0003AF05CDB002800F0AE81688EF7F39AF240 ++:10BCF0000446688EF7F396F244F430640E288CBF45 ++:10BD00004FF480504FF400500443A1B238462BF05A ++:10BD100087DE002800F09781D7F8E832002B78D032 ++:10BD2000D3F8DC30002B74D04FF00001A7F85C1082 ++:10BD300095F8AA004FF00C0800FB08B0EA8814A997 ++:10BD400082F08002C2F3C0121C30F7F3D1F3BDF8C9 ++:10BD500050200DF1540AA7F8622095F8AA00514628 ++:10BD600000FB08B02030F7F321F4159B33BB95F8A6 ++:10BD7000AA1013AC01FB08B1042224312046F6F3CB ++:10BD8000FBF020469A490422F6F3DAF048B995F818 ++:10BD9000A920A2F10803DBB2022B40F254818DF8F6 ++:10BDA0004F2020465146F7F301F4024630B9009087 ++:10BDB000CDF8048095F832300293FAE0159B8D4956 ++:10BDC00013F0040F1CBF43F002031593159B30467C ++:10BDD00013F0020F1CBF43F00103159315AB009342 ++:10BDE0000423019301230293BB68002203931346AB ++:10BDF00017F0D6DA002207230192009395F8AA30B3 ++:10BE00003046029303920492394618322B4610F0C2 ++:10BE100085DEB5F8623013F0100F0FD0BA6D40F226 ++:10BE2000371302EA03034BB9734B1A7832B9012373 ++:10BE30000092019395F832300293FCE02846F6F325 ++:10BE40007BF518B100230222009327E03B6D002B05 ++:10BE500032D0336893F83030002B2DD11C469846F1 ++:10BE600009E0796D284641440622F6F369F008F1AD ++:10BE7000060818B10134FB6C9C42F2D33B6D012BD8 ++:10BE800003D1FB6C9C4206D316E0022B14D1FB6C51 ++:10BE90009C420DD210E0002300930322019295F8FA ++:10BEA0003220039302920493304639461722C7E0AA ++:10BEB000002304220093F1E7336893F8953083B1AF ++:10BEC000D6F84C35012B09D1284606F5AA61062281 ++:10BED000F6F336F0002840F0B68002E0022B00F0C6 ++:10BEE000B28095F9344074B9D6F85C01698E3AF0A5 ++:10BEF000E9D840B105230094019395F832300394BA ++:10BF000002930494D0E7B7F862306BB1BA6D40F297 ++:10BF1000371302EA03033BB1304639462A462BF079 ++:10BF2000A1DF002840F08F80D9F80030022B0AD121 ++:10BF300099F815203AB9FD33009305F1380009A9A5 ++:10BF40000123019214E0336805F1380093F846307C ++:10BF500009A913F0030317BFD7F8CC301A46C3F36F ++:10BF6000003383F001020192FF2300220093134665 ++:10BF700045F0C2D8336B09F1500493F8EC1039B195 ++:10BF80006B8E03F44063B3F5406F14BF1421282176 ++:10BF9000204645F059D8D6F86036002209A8214637 ++:10BFA0009B7844F0EBDF024630B9009009230193FF ++:10BFB00002920392049277E79DF8382096F838377A ++:10BFC0009A4240D195F93430C3B96A8E304602F4B2 ++:10BFD0007042B2F5805F14BF0222012205F13801E0 ++:10BFE0002BF0E4DC024648B90A230090DFE7C046A4 ++:10BFF00058D4010017738600B0270200336893F805 ++:10C00000303053B32946304649F0C8DB014620B3EF ++:10C01000037E13F0020F06D0436813F4805202D15E ++:10C020000D230092C3E7D1F8F030B3B100220F2303 ++:10C0300000920193029203920492304639461732DD ++:10C040002B4610F06BDDD6F8DC36013BC6F8DC364B ++:10C05000D6F8DC26002A7FF403AED6F8DC36FBB136 ++:10C06000069B00219977D6F8DC26D6F8D836013A17 ++:10C0700003EB8203C6F8DC26069A9C685368012B02 ++:10C080000AD0009101910291039104913046394602 ++:10C090002022234610F042DD38462EF011DA35E03A ++:10C0A000D7F8CC3013F4005F06D0FB7923B9D6F86B ++:10C0B0004C01394643F0F8DF0799FA7991F93430A9 ++:10C0C0004AB1002238460121934214BF00230123C4 ++:10C0D0002CF0DAD809E038460121D3F1010338BF4A ++:10C0E0000023009201922CF009DA97F91030022B0C ++:10C0F00003D1F86800214DF035DA96F875323846EC ++:10C1000023F0040386F875322CF0A6D917B0BDE8E9 ++:10C11000F08FC0462DE9F04F9B460568D0F8D0322D ++:10C1200089B003932B68064693F83F308A469046C1 ++:10C13000D0F8D872D0F8D492002B00F08281C37965 ++:10C14000002B00F07E81837C0DF1160013B106F107 ++:10C15000D60100E049460622F5F30EF700242B68CD ++:10C1600085F84A4593F844301BB1D5F8640135F0A1 ++:10C1700067DFB37C2BB1D5F84C013146224605F080 ++:10C1800067F82A6992F8EA305BB1D36ED3F82021C0 ++:10C1900040F2044302EA0303B3F5806418BF0124AC ++:10C1A00005E0106E03F050FB041E18BF0124CCB153 ++:10C1B000002130462FF012DA3046FFF7BDFCB37C89 ++:10C1C0003046D3F1010338BF0023009300210DF165 ++:10C1D00016020823FFF74CFC002130460A4632F0D5 ++:10C1E000CBDC1AE1B37C002B00F08F80D6F8DC3278 ++:10C1F000D3F8901041B193F894206868FAF378F579 ++:10C20000D6F8DC32C3F89040BB6823B10D2B02D0C6 ++:10C2100030462CF09BDAD5F86801042148F0C8D9E3 ++:10C220000DF11601284649F0B9DA002421460746E7 ++:10C2300086F8944030461CF06FDC2146304619F0F9 ++:10C240002DDC304621460FF01FDEBAF1000F45D03D ++:10C2500006F1BC00F6F380F300283FD12B6BB9F850 ++:10C260003240186906F062FC844237D1D5F85C018F ++:10C27000B9F8321039F0AADE30B9D5F85C01B9F856 ++:10C28000321039F01FDF80B1B8F1000F0DD1D5F8B1 ++:10C290005C01B9F8321039F049DE30B9DFF8ACA1F1 ++:10C2A0000123C34685F8D03800E0C24608230DF1CB ++:10C2B00016010193284606F1C2030A4600971BF0B7 ++:10C2C00091DE034658B1BAF1000F08D02846514616 ++:10C2D0005A4618F053D810B9824600E0C2460FB94A ++:10C2E0003C462FE038460E2148F0AADE2B6893F832 ++:10C2F000443023B1D5F86401394635F0B5DE28461F ++:10C3000039461AF069DE00241CE02B6893F895305A ++:10C3100093B1D5F8000507A948F0DCDE06E05368C4 ++:10C3200013F0005F1CBF23F00053536007A848F0D0 ++:10C33000D9DE02460028F2D10124B474304616F04A ++:10C34000B3DEC246304600212FF048D905F5007112 ++:10C35000284606311FF0E2DC2B6893F83F20A2B993 ++:10C3600095F9473685F84226B3F1FF3F08BF85F8B7 ++:10C370004326284619F0B2DA2B6893F8463013F0BA ++:10C38000030F02D0284619F0C5DA06F1BC00F6F317 ++:10C39000E3F2014630B930460DF11602082300944D ++:10C3A000FFF766FB95F872323BB9D5F86C329E42C6 ++:10C3B00003D13046FFF7C0FB05E0304611F07CD8D2 ++:10C3C000304610F0DFDAD9F8641049B16868B9F87E ++:10C3D0006820FAF38DF40023C9F86430A9F86830B6 ++:10C3E00002230DF11602009328463346002117F070 ++:10C3F0002FD93046002117F0FDDA304617F066DA03 ++:10C40000284605F081F8BAF1000F03D02846002134 ++:10C410005A46D047B8F1000F01D0002013E0304653 ++:10C420004146424632F0A8DB414606220398F5F326 ++:10C4300007F606F1BC0041460622F5F301F6404638 ++:10C4400001E04FF0FF3009B0BDE8F08F0DBB0000F8 ++:10C450002DE9F04F062989B007460D4692469B46C6 ++:10C460009DF848900468D0F8D86246D061BBB9F115 ++:10C47000000F03D12046394633F098DB94F872322E ++:10C48000002B3AD0D4F8000507A948F023DE03E0DA ++:10C490001B7E13F0020F30D107A848F023DE0346BD ++:10C4A0000028F5D151E0236B186906F03FFBD7F85F ++:10C4B000D4325B8E834220D0204628F00DD8D4F8A9 ++:10C4C000340728F027DC18E0B368093B012B14D8A7 ++:10C4D0002046114649F062D910B10C2148F0B0DD78 ++:10C4E000022D07D0A068316803F0B8D8052D01D01F ++:10C4F000012D02D14FF0010801E04FF00008139B1D ++:10C500000095CDF804B00293336C20460393736C0E ++:10C5100039460493B9F1000F0CBF07220922534694 ++:10C5200010F0FCDAB8F1000F13D0052D01D0022D68 ++:10C5300007D1B27F337F9A4203D238462DF0C0DF55 ++:10C5400007E03846FFF772FB03E07368032BAAD1BC ++:10C55000D3E709B0BDE8F08F0048704760E70100FD ++:10C560000048704780E8010010B5836F40F2EE226A ++:10C570001C6A044B94219C4208BF4FF4166231F0B0 ++:10C5800069DB10BD50200800816F10B508310446EA ++:10C590002FF06CDEFFF7E0FF014620462FF046DE6D ++:10C5A00010BDC0462DE9F04104460D469046BDF849 ++:10C5B00018E09DF81C701E4633B18368DA6A02EBFE ++:10C5C0004102938BFB1893834FF6FF739E4503D074 ++:10C5D000A821724631F03EDB04EB8503D868084B96 ++:10C5E000414632465B6A9847002807DA36B1A368AD ++:10C5F000DA6A02EB4502938BDB1B9383BDE8F08183 ++:10C60000E0A6850010B507490446406EF6F3E0F158 ++:10C61000034620B9606E0449F6F3DAF10346184682 ++:10C6200010BDC04699D501000AAA860070B50D4616 ++:10C630000669144608460A220021F5F301F56B88C5 ++:10C640001C43F36C6C8013F0200F03D02B8843F451 ++:10C6500080632B80B16F42F250030A8C9A4206D15C ++:10C660004B8C052B03D86B8843F004036B8070BDA3 ++:10C670004FEA810210B513188E468168DB6F52189D ++:10C680008367936B0B6390F8EB3063B190F8E830FD ++:10C690004BB94FF40051006EBEF1000F0CBF0A46BB ++:10C6A0000022FEF3BFF310BDB1F1FF3F2DE9F041D1 ++:10C6B00004460E4605D1836F596A09B90E4600E05B ++:10C6C0009E6994F8E9701FB9204639462FF004DBC3 ++:10C6D000206EFEF307F580B1002504EB8503D868D2 ++:10C6E00010B1254B9B6898470135062DF5D1E368BD ++:10C6F0001BB1204600212FF03BDB94F8E8203AB133 ++:10C70000A3680022DA612046032130F071DC30E0BA ++:10C71000206E46F0040184F8EA20FEF393F3A06F44 ++:10C72000012184F8EA1018B1406A08B106F0D0F887 ++:10C7300020462FF0F5DBE26E206ED2F8E0310121C9 ++:10C7400023F02003C2F8E031F9F326F4002120465B ++:10C750002FF0C2DA204630F03DDD2046012130F0D6 ++:10C7600011D9A2680023D3611FB9204602212FF0FE ++:10C77000B3DABDE8F081C046E0A6850070B50121BE ++:10C78000044631F0ABDA206E03F05CF8204600215D ++:10C790002FF0A2DA204630F0FDDE054630B120460B ++:10C7A000002131F09BDA6FF0080005E020464FF0E1 ++:10C7B000FF31FFF779FF284670BDC04673B50469A5 ++:10C7C000054620460E46FFF7DFFEA36F3146586A46 ++:10C7D00007F0F6FB2A68012382F8743020462FF018 ++:10C7E0007DDCA36F2046998A31F010D8A36F2046D4 ++:10C7F000D98A30F0F9DF204694F886102FF0FED960 ++:10C80000A36F204652219A8B31F024DAA36F502176 ++:10C81000DA8B204631F01EDA20462FF081DC2046EC ++:10C82000FFF7A2FE032300932046042108220023E1 ++:10C8300030F0F0DB20462EF0B1DF7CBD10B504698E ++:10C840004FF440412046002230F0D2DBD4F8F830DB ++:10C850001B691BB120462EF0A1DF02E020462FF01D ++:10C8600059DDE26C206E02F00202002A0CBF114674 ++:10C870004FF400710A460023FEF384F310BDC04656 ++:10C8800070B5836804461B6893F82050F5B9012100 ++:10C8900031F024DA206E02F0D5FF204629462FF031 ++:10C8A0001BDA20462FF036DDA068D0F848381B7818 ++:10C8B0000BB12FF061DBA36F586A05F0FBFFA36893 ++:10C8C00084F85E501A68012382F8203070BDC0469B ++:10C8D00070B5082986B005460C4602DD6FF00100F0 ++:10C8E0002DE1836897491B685869F6F345F0082CD9 ++:10C8F00024D12A6E936913F0005F03D0D36913F03B ++:10C90000010F0BD0EB6C13F0010F0BD02B6D13F05C ++:10C91000800F07D1D36913F0010F03D06B6D13F0B3 ++:10C92000005F05D12B6D13F0800101D10C4612E0A0 ++:10C9300043B2022B40F30181052400E05CB1D5F83D ++:10C94000F8305B68022B06DDAB6D13F0005F02D19F ++:10C950006FF00200F3E00A220DF10E000021F5F362 ++:10C960006FF3D5F8F8304FF000021A8195F8903047 ++:10C970000BB91E4604E0EB6ED3F8203103F001063C ++:10C9800095F8903053B164B9D5F8F8301B68002B96 ++:10C9900000F0888028462FF0BDDC83E0002C00F0FA ++:10C9A0008180BDF80E30D5F8F82043F01003ADF8C3 ++:10C9B0000E305368022B6B6D03D123F000536B656F ++:10C9C00039E043F0005314F0040F6B6503D1138971 ++:10C9D00043F0140313812A6E936913F0005F03D0B0 ++:10C9E000D36913F0010F0BD0EB6C13F0010F12D0D1 ++:10C9F0002B6D13F0800F0ED1D36913F0010F0AD005 ++:10CA00006B6D13F0005F06D0D5F8F820138943F062 ++:10CA1000400313810FE0D5F8F8305B68042B05D193 ++:10CA2000BDF8123043F40053ADF81230D5F8F820B9 ++:10CA300000231361D360D5F8F8205368022B12D17C ++:10CA4000EB6C13F4804FBDF8103008D043F48073C2 ++:10CA5000ADF810303023D3602023136103E023F4BA ++:10CA60008073ADF8103014F0020FD5F8F81003D031 ++:10CA70000B8943F0010304E00A894FF6FE7302EAD2 ++:10CA8000030314F0040F0B81D5F8F81003D00B89C1 ++:10CA900043F0080304E00A894FF6F77302EA030340 ++:10CAA0000B8109E0BDF80E3023F01003ADF80E3015 ++:10CAB0006B6D23F000536B65D5F8F8301C60AB6FDD ++:10CAC000696D586A06F08AF995F890301BB116B175 ++:10CAD000284630F033DF0224BDF80E30284600210E ++:10CAE0001022009430F096DABDF81030284601216B ++:10CAF0004FF48072009430F08DDABDF81230284681 ++:10CB000021464FF40052009430F084DA28462FF08A ++:10CB1000A1D895F8903073B1AB6F1B68A34206D1D2 ++:10CB2000D5F8F8301B6813B128462EF037DE16B161 ++:10CB300028462FF05DDF002001E00124FFE606B06B ++:10CB400070BDC046C65C860070B5054690F8900082 ++:10CB5000002846D0AB6F002185F89010586A05F088 ++:10CB6000BDFEAB681A6992F8EA305BB1D36ED3F8B8 ++:10CB7000202140F2044302EA0303B3F5806018BFAA ++:10CB8000012002E0106E02F05FFE68B10024AB6F7E ++:10CB900085F8EB4085F8EA40586A214605F098FE92 ++:10CBA000A8682FF033D91BE0286EFEF39BF20446F1 ++:10CBB00080B1EB6ED3F8203113F0010F02D028467C ++:10CBC00030F0BCDEAB689868F6F7F8FA0446284601 ++:10CBD00031F0A2D895F8E81011B9284631F07ED886 ++:10CBE000204670BD70B5054690F8900050B3AB6814 ++:10CBF0001A6992F8EA305BB1D36ED3F8202140F283 ++:10CC0000044302EA0303B3F5806418BF012403E080 ++:10CC1000106E02F019FE0446AA6814B100231362D4 ++:10CC20000CE0906802F056DD284621462FF054D8DB ++:10CC300095F8E83013B928462FF06CDBAB6F586AD3 ++:10CC400006F014FB70BDC0460121836F10B580F85B ++:10CC500090100446586A05F041FE204602212FF04C ++:10CC60003BD8A368986802F03FDD002010BDC046A5 ++:10CC70002DE9F3418668062733680DF10204DB696C ++:10CC800005461B6AD0F86C80C6F8AC3830493A4685 ++:10CC90002046F5F371F16B6C2E48214603FB07002B ++:10CCA0003A46F5F369F10423C6F8AC38013B86F83F ++:10CCB000A938A8681EF0CAD808B93C4604E0D6F8DE ++:10CCC000AC389B0001339CB2D5F8B8700026F05DFB ++:10CCD00004F0FF01201880B2421E02F0FF0341EA77 ++:10CCE000032102F48072C4F300231A43330243F495 ++:10CCF000004301369BB2062EA8F840350446A8F83A ++:10CD00002015A8F82C25A8F84035E0D12846982110 ++:10CD10007A7830F09FDFD5F8B83028469A219A7893 ++:10CD200030F098DFD5F8B8302846DC781A789C21A6 ++:10CD300042EA042230F08EDFD5F8B83028465C791C ++:10CD40001A799E2142EA042230F084DFBDE8FC819A ++:10CD500061DB0100301E02002DE9FF410569074635 ++:10CD60009221284630F05CDC400080B2A7F84200F7 ++:10CD700000282FD04FF000080DF101060F2130469A ++:10CD8000154A4346F5F3A0F1686E3146F5F320F6F7 ++:10CD900060B13146686EB7F84240F5F3EDF504EB4B ++:10CDA000480482B22146284630F054DF08F10108D9 ++:10CDB000B8F1770FE0D1686E0849F5F309F648B18C ++:10CDC000686E0649D5F8F840F5F3D6F52081284677 ++:10CDD0002EF040DFBDE8FF81AEAC8600177C8600F8 ++:10CDE0002DE9F041056986B04FF0FF31AC4A80462D ++:10CDF0002846EE6E30F0FCD8D5F8F8302846196891 ++:10CE0000FFF766FDAB6D3BB14FF00303A6F8B436F8 ++:10CE10004FF0FF03A6F8B836EB6C13F0010F27D0E4 ++:10CE2000A04A136823BB012111602B6D286E13F0FB ++:10CE3000800F03D0023102F0BBFD19E002F0B8FD13 ++:10CE40002B6D13F0005F13D12846922130F0E8DB00 ++:10CE5000400080B260B100F1CE042146284630F097 ++:10CE6000DFDB40F040022146284692B230F0F2DE8D ++:10CE70004FF0FF31C6F8281128468B4A30F0B8D859 ++:10CE80008A4C03E00A20F9F367F40A3CD6F828310B ++:10CE900013F0010F01D1092CF4D14046D6F8283106 ++:10CEA000FFF7CCFCD5F8F4302BB92B6E9A6A40F220 ++:10CEB00094539A4213D1286E7D4B826BD318012B69 ++:10CEC00007D94AF6E6039A4203D04AF6E5039A42A6 ++:10CED00005D10823002128220093FDF3D7F7002174 ++:10CEE0000A46286EFDF3B6F7FFF73AFB01462846DF ++:10CEF0002FF09CD92846FFF7BBFE4FF480330093F8 ++:10CF00002846062398210DF10E022FF0CFDCD8F829 ++:10CF1000003093F83830D3B140461DF097DF012838 ++:10CF200015D100231C461F4605930AE04FF4C02389 ++:10CF300000933946284605AA04232FF0DDDC01348E ++:10CF40002437D8F80030DB691B6A9C42EED32846B0 ++:10CF50008021082230F07EDE28465C210A2230F053 ++:10CF600079DE4FF08073534AC6F8003128465249A3 ++:10CF700030F03ED84FF00043C6F8883103F1024349 ++:10CF8000C6F88C314FF48043C6F8283103F540438E ++:10CF900073620121284630F019D8286E02F0A0FCF7 ++:10CFA00083B2A8F818001621A6F8A8362846B5F8C6 ++:10CFB000442030F04FDE2846C021B5F8542030F030 ++:10CFC00049DE2846C221B5F8562030F043DE3B4BFF ++:10CFD0002846C6F86031D6F86031B5F8883044216B ++:10CFE000C6F86431364BB5F88C20C6F86031D6F8F7 ++:10CFF0006031B5F88A30C6F8643130F02BDE28464F ++:10D000004621B5F88E2030F025DEB6F888361B05AF ++:10D010001B0DA6F888364FF00103A6F89C360023B6 ++:10D02000C8F848301C4605EB8403D86810B1254B7E ++:10D030005B6898470134062CF5D1224CE868236DD3 ++:10D040009847E36EE86898474046FFF785FE2B6EE9 ++:10D050009A6B4AF662139A421ED1EB6C13F0010FE1 ++:10D060001AD02B6D13F0800F16D113F0005F13D17F ++:10D070002846922130F0D4DA400080B260B100F14D ++:10D08000CE042146284630F0CBDA40F0400221465B ++:10D09000284692B230F0DEDD06B0BDE8F081C04631 ++:10D0A00004040004F02702000204020449420F00B5 ++:10D0B0001D57FFFF0000024000000640060002006E ++:10D0C00007000200E0A685002DE9F04790F8E9701E ++:10D0D00004460E469046856817B939462EF0FCDDA9 ++:10D0E000A86802F0F7DA06F47041B1F5805F14BF6A ++:10D0F0000021012181462046FFF7BAFAA36F31468D ++:10D10000586A05F00FFDA36F586A05F0EDFB28463D ++:10D11000FFF766FEB8F1000F04D0012120460A4651 ++:10D120002FF0D4DF28463146FFF748FBA868494670 ++:10D1300002F0E4DAD4F8D43043F00403C4F8D43075 ++:10D140000123C4F8D0301FB9204602212EF0C4DDDF ++:10D15000BDE8F087816810B50B680446D3F88C20D1 ++:10D16000D2F8B4300133C2F8B4300A6992F8EA3028 ++:10D1700063B1D36ED3F8202140F2044302EA0303E3 ++:10D18000B3F5806F14BF0020012006E0106E02F09E ++:10D190005BFBD0F1010038BF002020B120464FF0EA ++:10D1A000FF31FFF781FAA0682EF030DEA06819F099 ++:10D1B0008BDC10BDD0F8EC1010B5044631B100681E ++:10D1C0000C22F9F395F50023C4F8EC3010BDC046ED ++:10D1D0002DE9F04FD1F8D43289B0B3F832A0D0F8AD ++:10D1E0004C31804603938B798946D0F80CB0002BE4 ++:10D1F00000F0B58000273E4608EB8603D3F84C527A ++:10D200008DB1AB797BB9EB796BB1D5F8D432588E4F ++:10D21000F6F308F004465046F6F304F0844201D0D9 ++:10D220002F4606E02F460136082EE5D1002F00F0EC ++:10D230009680D7F8D432588EF5F3F4F7044650466A ++:10D24000F5F3F0F7844205D0D7F8D432D9F8D422D8 ++:10D25000DB8DD385404605A904AA18F08BDF39463B ++:10D26000D8F84C0141F0E2DF182300FB03F4D8F8B2 ++:10D270004C0104F13A0142F0C3DC38B9049A059B31 ++:10D28000039839460092019301F0DCFA04F1400161 ++:10D29000D8F84C0142F0B4DCD7F8D4320599DB8DD4 ++:10D2A00040019E02CE42079001D3B04209D321F043 ++:10D2B0007F4323F460038219984201D21046F6E7B7 ++:10D2C000079006AC07AD22462B46049803F0FAFC03 ++:10D2D000384618F0E5D929460346002220461DF0BD ++:10D2E000EDDDD9F8D4327608DB8D29469F02204641 ++:10D2F000334600221DF0FCDD3B46012101E049469A ++:10D300001346DA19B34201F10109F8D306A807A9B7 ++:10D31000002204AC05AD1DF0EBDD20462946069A3F ++:10D32000079B1DF0E5DD059B2046CBF88031049B73 ++:10D330002946CBF88431002304930593069A079B72 ++:10D340001DF0D6DDD8F84C010499059A42F010DFA3 ++:10D35000BB01CBF8883107FB09F3CBF88C3109B05E ++:10D36000BDE8F08F2DE9F34100EB8101D1F84C428B ++:10D37000064690461D469DF8207014B94FF0FF33C5 ++:10D3800019E004F11A0000212022F4F359F60023D9 ++:10D39000637615B9336803F14E054346304621469E ++:10D3A0002A46009730F09ADF034620B930462146DE ++:10D3B00032F0E8D803461846BDE8FC81D1F8CC30FD ++:10D3C00073B543F40053C1F8CC3005460C4632F037 ++:10D3D000D9D80646002840F08880B5F8822144F26A ++:10D3E00021339A421AD00E3B9A4217D007339A4201 ++:10D3F00014D010339A4211D0143B9A420ED0073306 ++:10D400009A420BD010339A4208D025339A4205D065 ++:10D41000AB6B5B7D13B96FF00B0666E02B6B93F87B ++:10D42000EC300BB91E4608E0B5F8263603F440632D ++:10D43000B3F5406F14BF142628262B6893F84630A6 ++:10D4400013F0030305D0D4F8CC30C3F3003383F0DA ++:10D4500001030093284633462146022231F024DAA4 ++:10D460000646002841D1D4F8CC3013F4803F0AD1CD ++:10D47000D5F84C01214641F0E1DFC4F8F00280B953 ++:10D480006FF01A0631E0062204F1BC0004F1C2017B ++:10D49000F4F372F5D4F8D432B5F8262683F8346064 ++:10D4A0005A86A379D3B194F8F532312B11D82B6871 ++:10D4B0001B7E2BB1284694F8F4120D4A1BF0B6DF00 ++:10D4C000D5F84C0194F8F41241F0FCDE322384F8D4 ++:10D4D000F43294F8F53284F8F43206E0D5F84C01D1 ++:10D4E00004F53D7141F0B2DE064630467CBDC046D3 ++:10D4F000329E85002DE9F041054632F041D90026E3 ++:10D500000746AB19D3F84C426CB1A3795BB1BC426E ++:10D5100009D063791BB12846214631F0B1DC284699 ++:10D52000214631F089DF0436202EEAD1BDE8F081B2 ++:10D53000002010607047C04610B505F021F810BDFE ++:10D5400010B504F05DFFC0B210BDC04610B508466E ++:10D55000114604F037FF10BD2DE9F0470446884618 ++:10D560004768002110469146C922F4F369F5204628 ++:10D57000414638F013DF78B997F85037002B00F0A8 ++:10D58000D08707F5AA6138460E3138F061D90646D2 ++:10D59000002800F0C68700E0266908F47043B3F560 ++:10D5A000805F14BF38233C233078FF5804F0D0FF4D ++:10D5B0000446B07804F0B4FF637C5FFA88F513F09A ++:10D5C0000102064602D097F904E106E097F904311A ++:10D5D000182BD4BF9646A3F1180E934B9C4203D14F ++:10D5E00058214FF0520C0BE0904B9C4205D0904BD1 ++:10D5F0009C4202D04FF07F0C01E04FF0580C614686 ++:10D600003B68022B5FD1012D01D8002303E00A2DD6 ++:10D610008CBF02230123E31893F90620854B9C421B ++:10D6200003D10B2D10D14C2240E0834B9C4203D1FF ++:10D630000E2D3BD1362239E0804B9C4202D0804BEC ++:10D640009C4204D10B2D30D00E2D2ED02EE07D4BE0 ++:10D650009C4203D10E2D29D12A2227E07A4B9C42ED ++:10D6600007D1022D01D1582220E00A2D1ED15422CB ++:10D670001CE0764B9C4203D10A2D17D1502215E0B5 ++:10D68000734B9C4203D10E2D10D128220EE0714B1A ++:10D690009C4203D10B2D09D13E2207E06E4B9C42E8 ++:10D6A00004D10C2D02D1442200E04022CEEB020333 ++:10D6B00023EAE3738B42A8BF0B46002202F809302D ++:10D6C0000132042AFAD1654B9C4208D0644B9C423B ++:10D6D00005D0644B9C4202D0634B9C4207D197F922 ++:10D6E0000431182BD4BF4FF0000EA3F1180E3A6886 ++:10D6F000022A40F01081012D01D8032303E00A2DF6 ++:10D700008CBF05230423E31893F90600494B9C4280 ++:10D7100001D10B2D6CE0554B9C4204D1022D00F041 ++:10D720000E810A2DCFE0444B9C4201D10B2D58E0D5 ++:10D73000424B9C4202D0424B9C4201D10B2D11E046 ++:10D740004B4B9C4202D04B4B9C4204D10D2D40F0E0 ++:10D7500007812E2004E1484B9C4206D10B2D00F09E ++:10D76000F2800D2D00F0F380FAE03E4B9C4258D041 ++:10D77000344B9C4204D10B2D40F0F2803E20EFE070 ++:10D78000314B9C4219D0314B9C4206D1022D00F006 ++:10D79000E4800A2D00F0E180E2E0384B9C4206D1A3 ++:10D7A000022D00F0D8800A2D00F0D580D8E0344B4F ++:10D7B0009C4202D0334B9C4206D1022D00F0C9801E ++:10D7C0000A2D00F0C680CBE02F4B9C420CD1022DDD ++:10D7D00000F0BD800A2D00F0BA80032D00F0BF805C ++:10D7E000092D00F0BC80BBE0284B9C4203D10A2DE0 ++:10D7F00000F0A780B4E0164B9C4205D1A5F10C03C4 ++:10D80000012B40F2A280ABE0214B9C4203D10B2DB7 ++:10D8100000F29D80A4E01F4B9C423DD10C2D00F0F6 ++:10D8200096800D2D75E0C046BC108600F010860075 ++:10D8300024118600400986002CDC0100BC0C860007 ++:10D84000D00C8600700D86007C0986009009860049 ++:10D85000840D8600DCDC010094DE0100340D8600BE ++:10D860005C0D860080118600FC0D860080DE0100C4 ++:10D87000E40C86000C0D8600FCE30100CC09860058 ++:10D88000A4098600B8098600F409860018098600F4 ++:10D89000980D8600381186008C4B9C4203D1022DD6 ++:10D8A00055D00A2D26E08A4B9C4231D0894B9C42B0 ++:10D8B00003D10B2D54D1322052E0874B9C4204D12E ++:10D8C0000B2D40D00C2D3AD04AE0844B9C4205D120 ++:10D8D0000C2D44D00D2D43D13A2041E0804B9C4289 ++:10D8E00004D1A5F10B03012B29D939E07D4B9C42D2 ++:10D8F00002D10B2D29D033E07B4B9C4205D10C2D5E ++:10D900002BD00D2D2CD144202AE0784B9C4227D1DE ++:10D910000B2D18D024E0332D01D800200BE03D2D35 ++:10D9200001D8012007E0632D01D8022003E0942DE7 ++:10D930008CBF04200320231893F9060010E04A202E ++:10D940000EE042200CE038200AE03C2008E04020B5 ++:10D9500006E0502004E0482002E04C2000E0462091 ++:10D96000CEEB000323EAE3736345B4BF1846604679 ++:10D97000022A04D199F800309842A8BF1846002224 ++:10D9800009EB02030132082A1871F9D1C0B2CC4662 ++:10D990004A4600210023013182F83430107382F8A6 ++:10D9A0003C3001320829F5D1337F13F0010202D057 ++:10D9B00097F9040106E097F90431182BD4BF1046FB ++:10D9C000A3F118003B68022B01D16B1E0FE0332D31 ++:10D9D00001D800230BE03D2D01D8012307E0632D82 ++:10D9E00001D8022303E0942D8CBF04230323F256B5 ++:10D9F0009B19997B3E4B9E4205D1A5F16403022BF6 ++:10DA000001D83E2110E03B4B49B29E4203D1642D28 ++:10DA100000F05C850BE0384B9E4205D1A5F1640314 ++:10DA2000022B01D83E2108E0344B9E420ED0344BED ++:10DA30009E420BD0334B9E4208D0334B9E4205D0C2 ++:10DA4000324B9E4202D0324B9E4214D1A5F1680364 ++:10DA5000242B10D82B4B9E421BD02B4B9E4218D010 ++:10DA60002B4B9E4215D0264B9E4223D0274B9E42E5 ++:10DA700020D044224A21274B9E420CD1A5F16803B5 ++:10DA8000202B03D98C2D00F03F8549E04422402112 ++:10DA900001E042224A21204B9E420DD1642D06D046 ++:10DAA000A5F168030C2B3BD840223C216CE04022BE ++:10DAB000342101E044210A46184B9E4230D1A5F1A1 ++:10DAC0006403102B2CD85222422160E068098600A2 ++:10DAD000DCDC0100B4DC010010DD010094DE01009B ++:10DAE00014E10100A8DE0100BCDE0100C8DC010079 ++:10DAF000B50886005BE30100D2088600DC058600DD ++:10DB00002E0586004B058600680586008505860083 ++:10DB100033068600F90586006D0686008A068600B3 ++:10DB20009C4B9E421AD1A5F16403082B98BF30216B ++:10DB3000A5F16E0398BF3422162B98BF4621A5F19C ++:10DB40008603022B98BF3E218C2D08BF3622A5F1FB ++:10DB5000950308BF48210F2B98BF44228E4B9E424D ++:10DB600012D1A5F16E03162BA5F1860398BF3A22B8 ++:10DB700098BF4421022B98BF3A2298BF3E218C2D9A ++:10DB800008BF362208BF4821844B9E4202D0844BF6 ++:10DB90009E4204D1A5F18403082B98BF2C22814B0F ++:10DBA0009E4202D1262D08BF2C21C0EB020323EA9E ++:10DBB000E377C0EB010323EAE37E4A4613790021B1 ++:10DBC000137582F8441009F1080301329A42F5D125 ++:10DBD0004B460A4601321F7783F84CE00133082A8E ++:10DBE000F8D1714B9E425BD0704B9E4258D0704B27 ++:10DBF0009E4255D06F4B9E4252D06F4B9E424FD0AB ++:10DC00006E4B9E4236D06E4B9E4249D06D4B9E422B ++:10DC100046D06D4B9E4243D06C4B9E4240D06C4BE5 ++:10DC20009E423DD06B4B9E423AD06B4B9E423DD0C4 ++:10DC30006A4B9E4234D06A4B9E4231D0694B9E4221 ++:10DC40002ED0694B9E422BD0684B9E4228D0684B09 ++:10DC50009E4225D0674B9E4222D0674B9E421FD0EA ++:10DC6000664B9E421CD0664B9E4219D0654B9E422D ++:10DC700016D052E0032D02D14FF03C0E0FE02B1FC7 ++:10DC8000042B0AD9092D00F04384A5F10C03012BC4 ++:10DC900000F217842C2700F015BC4FF0400E4027EF ++:10DCA0004D4B9E4202D04D4B9E4207D1EB1E082B9E ++:10DCB00094BF4FF0400E4FF0000E4027524B9E4253 ++:10DCC00022D1A5F124030C2B03D838274FF0300EB6 ++:10DCD0001AE0A5F13403082B03D84FF0440E774621 ++:10DCE00012E0A5F16403022B03D834274FF03E0E57 ++:10DCF0000AE0A5F16803202B03D844274FF04A0E11 ++:10DD000002E08C2D08BF32274B46002201321F75DE ++:10DD100083F844E00133082AF8D14B460022002161 ++:10DD2000013283F8241083F854100133082AF6D105 ++:10DD30004B460A46013283F82C7083F85CE00133CD ++:10DD4000082AF7D1184B89F864E09E4206D0174B99 ++:10DD50009E425BD0174B9E4270D0CEE0012D00F06A ++:10DD6000A780022D00F09980032D00F0A6802B1FC4 ++:10DD7000042B04D84C273C2338243E21A1E0092D54 ++:10DD800001D14C2750E00A2D00F087800B2D00F0C8 ++:10DD90008F808EE0A2058600BF0586002C078600D6 ++:10DDA000F40486002CE201007E0A86009B0A8600AD ++:10DDB000B80A8600F20A8600BD0B8600980E86001F ++:10DDC00040DC01006AE0010097DC010046DE010052 ++:10DDD00001DF0100E4DE0100630F860014108600FD ++:10DDE000B50E860024DD010041DD0100D2DD010019 ++:10DDF000EFDD01005DDC01007ADC01000CDE0100DA ++:10DE000029DE0100880C8600DC058600012D4FD03C ++:10DE1000022D44D0032D01D14C2743E02B1F042BAE ++:10DE20004BD9092D04D14A2734233024362148E028 ++:10DE30000A2D34D00B2D3CD136273AE0012D01D1EB ++:10DE40002C2736E0022D31D0EB1E052B18D8032DE0 ++:10DE500004D144272C2328242E2132E0042D20D065 ++:10DE6000082D1ED06B1F022B4FF044078CBF0023E0 ++:10DE700038238CBF002434248CBF00213A2120E0B9 ++:10DE8000092D04D142272E232A24302119E00A2DFE ++:10DE90000CD00B2D0DD12A270BE0402709E03E279F ++:10DEA00007E044273623322438210AE03C2700E0EB ++:10DEB000382700231C46194603E04C273823342416 ++:10DEC0003A214A460020042894BF82F84C4082F848 ++:10DED0004C300130177701320828F4D1FCB24A46A1 ++:10DEE0000020032894BF82F85C3082F85C10013077 ++:10DEF00082F82C4001320828F3D1A74B9E4206D06D ++:10DF0000A64B9E420DD0A64B9E4221D062E0032D2F ++:10DF100045D0092D43D02B1F042B38D83024342270 ++:10DF200033E0032D03D14224462248203AE0042D59 ++:10DF300031D06B1F022B03D84C245022522031E0E9 ++:10DF4000082D28D0092D22D13E244222442029E048 ++:10DF5000032D03D12E243022322023E0042D03D1BF ++:10DF60003024322234201DE06B1F022B03D83224D0 ++:10DF700036223A2016E0082D03D1302434223820EE ++:10DF800010E0092D03D12E24322236200AE000228F ++:10DF90001446104606E046244A224C2002E028247B ++:10DFA0002C222E204B460021042994BF83F84C409C ++:10DFB00083F84C20013101330829F5D14B4600216B ++:10DFC000032994BF83F85C2083F85C00013101339E ++:10DFD0000829F5D1734B9E422AD1032D0CD02B1F5B ++:10DFE000042B03D838203C213E2408E0092D03D01F ++:10DFF000002108460C4602E0342038213A244B46E2 ++:10E000000022042A94BF83F84C0083F84C1001329C ++:10E010000133082AF5D14B460022032A94BF83F826 ++:10E020005C1083F85C4001320133082AF5D134E0FA ++:10E030005D4B9E422AD1A5F124030C2B01D8382731 ++:10E0400004E0A5F134030C2B03D83A274FF0340E2B ++:10E0500012E0A5F16403282B03D83C274FF0400EB3 ++:10E060000AE0A5F19503102B8CBF002746278CBF33 ++:10E070004FF0000E4FF0480E4B46002201321F7544 ++:10E0800083F844E00133082AF8D10AE0474B9E4266 ++:10E0900069D0474B9E4200F0DF80464B9E4200F025 ++:10E0A000DB80454B9E4200F0D780444B9E4200F0FF ++:10E0B000D380434B9E4200F0CF80424B9E4200F003 ++:10E0C000CB80414B9E4200F0C780404B9E4200F007 ++:10E0D000C3803F4B9E4200F0BF803E4B9E4200F00B ++:10E0E000BB803D4B9E4200F0B7803C4B9E4200F00F ++:10E0F000B3803B4B9E4200F0AF803A4B9E4200F013 ++:10E10000AB80394B9E4200F0A780384B9E4200F016 ++:10E11000A380374B9E4200F09F80364B9E4200F01A ++:10E120009B80354B9E4200F09780344B9E4200F01E ++:10E13000F481334B9E4200F08F80324B9E4200F0C0 ++:10E140008E80314B9E4200F08780304B9E4200F023 ++:10E1500083802F4B9E427FD02E4B9E427CD02E4BF5 ++:10E160009E4271D0B5E0A5F12403082B02D84FF0F0 ++:10E17000380E67E0A5F12E03022B40F29880A5F13E ++:10E180003403082B01D8382792E0A5F13E03022B77 ++:10E1900044D8342747E0C046D50A8600A00B860045 ++:10E1A000DA0B86004E0C860011058600F905860004 ++:10E1B00049E2010066E20100A9E301001EDF01005F ++:10E1C0004DE0010013E0010098DD0100D8E00100FE ++:10E1D000F0DC0100F6DF0100F5E001008CE3010056 ++:10E1E00075DF010083E2010030E001000CDC01007A ++:10E1F000BCDF01005BE30100DCE3010063DE010042 ++:10E200005EDD01007BDD01003EE30100D9DF01009E ++:10E210003BDF010058DF010016068600A5F164030C ++:10E22000082B03D844274FF0380E49E0A5F16E03C0 ++:10E230001E2B01D832273BE0A5F19503102B36D9D0 ++:10E240004FF0000E77463BE0A5F124030C2B37D8A6 ++:10E2500038274FF0340E33E09E4B9E4201D1242DDF ++:10E260005CE19D4B9E4203D18C2D29D13A2727E0BA ++:10E270009A4B9E4204D1642D1FD08C2D1DD01FE0DF ++:10E28000974B9E4203D1A5F19503102B0DE0954BC2 ++:10E290009E4215D1A5F124030C2B10D9A5F134030E ++:10E2A0000C2B0CD9A5F16403282B08D908E04427CE ++:10E2B0004FF0400E04E0382702E0482700E03C27FA ++:10E2C0004B46002201321F7583F844E00133082ACF ++:10E2D000F8D1854B9E420BD0844B9E4208D0844B94 ++:10E2E0009E4205D0834B9E4202D0834B9E426DD10D ++:10E2F000A5F12403082B0DD87F4B9E4201D13A2073 ++:10E3000006E07E4B9E4202D13420014655E0342087 ++:10E31000382152E0A5F12E03022B08D8774B9E42FC ++:10E3200014BF3821342114BF4220402045E0A5F11C ++:10E330003403082B02D8462144203EE0A5F13E03D9 ++:10E34000022B06D86D4B3A219E4214BF34202C205C ++:10E3500033E0A5F16403082B06D8684B3E209E42AB ++:10E3600014BF44213A2128E0A5F16E031E2B17D8D3 ++:10E37000A5F18603022B09D85F4B9E4201D14420B0 ++:10E3800005E05E4B9E4201D13C2000E048208C2DF0 ++:10E3900010D1594B9E420FD0584B9E420CD009E0F1 ++:10E3A000A5F19503102B8CBF002146218CBF0020C6 ++:10E3B0004A2002E0442100E03C214B460022013289 ++:10E3C000197583F844000133082AF8D14C4B9E425A ++:10E3D00002D04C4B9E421ED1A5F124030C2B01D838 ++:10E3E00038210EE0A5F134030C2B09D9A5F1640303 ++:10E3F000282B05D9A5F19503102B01D9002100E0A8 ++:10E40000402108464B4600220132187583F844101B ++:10E410000133082AF8D14846002202EB090191F89D ++:10E420003C301BB990F84C3081F83C304AB999F82F ++:10E430003D300BB1013204E090F84C30012289F8F4 ++:10E440003D3001320130072AE7D94A46002192F8CF ++:10E4500044301BB992F84C3082F84430013101321B ++:10E460000829F4D14846002202EB090191F8343022 ++:10E470001BB990F8443081F834304AB999F83530F6 ++:10E480000BB1013204E090F84430012289F83530B4 ++:10E4900001320130072AE7D900229CF824301BB949 ++:10E4A0009CF81C308CF824309CF854301BB99CF834 ++:10E4B0004C308CF854300132082A0CF1010CECD1AC ++:10E4C0002FE040274FF0000EFFF7F8BB3822FFF790 ++:10E4D000ABBAC0467BDD01003EE301003BDF01003B ++:10E4E000F6DF01008CE301004B058600680586001D ++:10E4F0008505860033068600A2058600BF058600D6 ++:10E50000A70686005006860036210A46FFF708BB9C ++:10E5100040274FF0380EFFF7C3BB642D3FF4CBAE5E ++:10E52000CEE6BDE8F087C0462DE9F041069D0746DE ++:10E530000E4610461946002A4ED0002B4CD0002D16 ++:10E540004AD0B30A012B3FD914790EF031FEE40909 ++:10E5500001460023384622460FF046D895F8651547 ++:10E56000012911D195F86725531C0F2A85F86735C5 ++:10E5700032D90023C5F86865064685F8653585F803 ++:10E58000661585F8673527E095F8662532B90123C9 ++:10E59000114685F86635C5F8686513E0D5F8683525 ++:10E5A000F11A09D48B12012B06D995F86725531C53 ++:10E5B0000F2A85F8673505D9002385F86735C5F832 ++:10E5C000686519460E1807E0012385F86535013B9B ++:10E5D00085F8673585F866353046BDE8F081C04678 ++:10E5E0002DE9F3410A9D0B9E9846002304463360B3 ++:10E5F00017462B600846D9B18B784A781B0443EA4A ++:10E6000002230A781343CA78043143EA0263336071 ++:10E610008B784A781B0443EA022302791343CA78B1 ++:10E6200043EA02632B60427A037A53EA022001D163 ++:10E630004FF48060296832680EF0A2DE0C9B014620 ++:10E6400000933A4643462046FFF76EFF04463146A4 ++:10E650002846002223461CF04BDC0898099900222A ++:10E6600023461CF045DCBDE8FC81C046F0B50768D8 ++:10E670001C460E4687B019463846154617F07ADD17 ++:10E680002268D6F8A0309A4202D22B68013B2B6058 ++:10E69000D6F8A030002223600C9B384602930D9BD5 ++:10E6A000716E03931346009501940492FFF798FF4F ++:10E6B00007B0F0BD2DE9F04F8A460668002189B009 ++:10E6C000834690461F4689460D460791069105915F ++:10E6D000029103912BE063789D1C029B43B907AB29 ++:10E6E0000093304621462A4602233EF017DD029071 ++:10E6F000B9F1000F08D106AB0093304621462A46F7 ++:10E700000D233EF00BDD8146039B43B905AB00931F ++:10E71000304621462A4610233EF000DD0390C5EB2B ++:10E7200007031B1B03EB080704EB05080125404604 ++:10E730003946F4F3B7F504460028CCD1304607A992 ++:10E740003EF036D8304606A93EF032D8CDB1DAF8E0 ++:10E75000083043F04003CAF80830029B9BB1B9F17E ++:10E76000000F01D1039B73B1DBF810305AF803306E ++:10E770003BB9584651463DF0FFDE10B16FF01A002C ++:10E7800003E0002001E04FF0FF3009B0BDE8F08F5A ++:10E790002DE9704F066886B08B46104619469046A4 ++:10E7A0009A460F9C109D0EF003FD014630460EF078 ++:10E7B000F9DE41468146224630462B4617F002DDFF ++:10E7C0002046294600224B461CF078DB119B304640 ++:10E7D0000293129B0E99039342465346009401956F ++:10E7E000CDF810B0FFF7FCFE06B0BDE8708FC04654 ++:10E7F00043682DE9F04106460C4617460568F3B11B ++:10E8000099421CD12B681B7E73B1284691F8F412F3 ++:10E8100004F1C2021AF00ADE7368212293F8F4129E ++:10E82000284613461AF00CDEF37B022B07D13B6817 ++:10E830002BB9384606F114012422F3F39DF3BDE809 ++:10E84000F081C0462DE9F7430A9C0B9D0F46814697 ++:10E85000164698460094019540F00ED94346484626 ++:10E86000394632460094019540F0F4D901224846D9 ++:10E87000394640F0D7D9B7F8343513F0100F03D02C ++:10E88000484639463EF008D8BDE8FE8370B58B791E ++:10E8900006461546002B2DD0D1F8CC3013F4005F7E ++:10E8A00028D0107828B15378092B02D86FF00100D6 ++:10E8B00024E0D1F8F042237F834204D1E8B1627FA3 ++:10E8C0006B789A4219D020776B786377638843F02E ++:10E8D000020313F0080F63800FD0304621463EF04C ++:10E8E00063DD304621463EF043D9304621463EF0B6 ++:10E8F000BBDE02E04FF0FF3000E0002070BDC046FC ++:10E900002DE9F743D0F8009004460027E31993F867 ++:10E910003B80B8F1FF0F4CD0FD0000262046294671 ++:10E9200041F06ED9002840D020462946002241F00F ++:10E9300085DE4846414601AA30F0A0DC002834D0EC ++:10E94000D0F8F01221B9002E2FD10EF059D92CE0B9 ++:10E95000837933B1D0F8CC3013F4005F01D0037960 ++:10E960001BB34B8813F0080F1FD0032E1DD8DFE810 ++:10E9700006F002060F1620463EF0C8DE15E013F042 ++:10E98000020F12D00B7F83B120463EF0FBD80CE083 ++:10E9900013F0010F09D020463DF0AEDF05E013F083 ++:10E9A000010F02D020463FF035DA01360235042E41 ++:10E9B000B4D10137042FA9D1BDE8FE832DE9F3417D ++:10E9C000D0F8008007463EF021D9AE21404617F02E ++:10E9D000C7DB4000B8641421404617F0C1DB262491 ++:10E9E000A7F84C0021464046284A1AF01FDD214670 ++:10E9F000002340464FF6FF7201341AF021DD322C1D ++:10EA0000F0D126E0294600223846013441F016DED6 ++:10EA100002350C2CF6D118369A2E1BD11DE0294652 ++:10EA200000223846013441F009DE0235042CF6D1CB ++:10EA30000836202E12D114E029460022384601342F ++:10EA400041F0FCDD0235042CF6D10836BA2E09D18E ++:10EA50000BE03A2635460024D4E70026354600244C ++:10EA6000DDE79A2635460024E6E7384620210022D5 ++:10EA700041F0E4DD032310220093404604211346B5 ++:10EA800015F0A2D80020BDE8FC81C046329E85006A ++:10EA9000F0B50E4649691569908A0A68002A01DABC ++:10EAA000821831D44C68131983422DD8B36801F110 ++:10EAB000080C0CEB040705EB020E6BB9184608E0D6 ++:10EAC00010F80E3010F80C20C15D134099421BD194 ++:10EAD0000130A042F4DB19E0012B15D12B18C4EB57 ++:10EAE00003050DE010F80E3010F80C20C15D134046 ++:10EAF000994203D10130A042F4DB07E00EF1010E90 ++:10EB0000AE4501D80020F6E7002000E00120337B6D ++:10EB10000BB180F00100F0BD036870B50446586881 ++:10EB2000A36A0D46164623B99021F8F3D1F0A062EE ++:10EB300070B1A06A0123AA8A03607F3382604660B5 ++:10EB4000C360296910309A4228BF1A46F3F314F2C1 ++:10EB500070BDC04668468369416920300BB52038D6 ++:10EB600003695A4651460EB44A46414606B4C36844 ++:10EB700082684168FEB40368C269EFF303810EB492 ++:10EB80008269EFF3058106B4034801680029FED0CD ++:10EB90006846884714B000BD3CEC00000A490842B2 ++:10EBA00002D062B6C94308400849084202D061B6A3 ++:10EBB000C943084006490840002803D005490A68AF ++:10EBC00002430A607047000000000080000000401F ++:10EBD000FFFF000000E100E00A49084202D072B6DF ++:10EBE000C94308400849084202D071B6C9430840E9 ++:10EBF00006490840002804D005490A68C04302407D ++:10EC00000A6070470000008000000040FFFF000025 ++:10EC100080E100E0024909689022885870470000AE ++:10EC200048EC0000024909689C22885070470000A7 ++:10EC300048EC0000DDBAADBB0000000000000000A1 ++:10EC400000000000000000000000000000000000C4 ++:10EC50000000000000000000024A11681060081C5B ++:10EC6000704700003CEC0000024A11681060081C6C ++:10EC70007047000040EC0000034908600348016849 ++:10EC80000029FED08847FEE734EC000040EC00008D ++:10EC90006348644900220A500168634A0A40634F8E ++:10ECA0000F403F4232D1002398469A46604A0A40BC ++:10ECB0001821CA405F4943585F4C1C405F4DAC422D ++:10ECC00004D180465E4D4519A9460EE05D4DAC422B ++:10ECD0000BD182465A4D4519AB460F241D1C2340CB ++:10ECE000594C25402D0A2B439C460023984501D0C2 ++:10ECF0009A4504D1554BC018013ADCD105E0504685 ++:10ED0000004202D04046004229D1FEE7FC21415892 ++:10ED10000A680F2313400F2BF1D0012B01D00431CF ++:10ED2000F6E708314A4B13404A4CA34206D100F0A3 ++:10ED3000BBF8804600F0C4F88146E9E7464CA342A0 ++:10ED4000E6D10B1F1B68454C23401824E3409C462A ++:10ED500000F0AAF8824600F0B3F88346D8E74049AD ++:10ED6000212242502E4A3F498958FF23194219D087 ++:10ED700051683D4B194215D011683C4B1940D36A7C ++:10ED800010E0A3420ED0C0460CE039498958194220 ++:10ED900008D03849895819409942FAD12B4B11694A ++:10EDA0001942FCD049463F4204D19823CB58102445 ++:10EDB000E34001E0304BCB581C242340002B01D012 ++:10EDC00000F08CF840462D49086048462C49086000 ++:10EDD00050462C49086060462B4908602B490F605B ++:10EDE0002B4D2C490D60043DAD46009DEC43102396 ++:10EDF000DD41AC4201D081B009E0240CA400264DD5 ++:10EE00002C606B461B1B254D2B60043B9D46244804 ++:10EE10002449002204C08142FCD80EF0E5FAFEE746 ++:10EE20000000001814060000F8FF0000000000F0C9 ++:10EE30000000000FFC0F0000F08F0000A082000017 ++:10EE4000000F0000E08000000070000000100000D3 ++:10EE500000FF0F00002A0800000E0800000000FF5D ++:10EE6000E00100000406000000003800FFFF000081 ++:10EE7000180600000C0600000804000048EC000022 ++:10EE80004CEC000050EC000054EC000044EC00009E ++:10EE900000C00300F81E0200001F0200FC1E02005A ++:10EEA000AC270200182C020008680F22043102402F ++:10EEB000052AF9D1014A1040F746000000F0FFFF93 ++:10EEC00008680F2204310240052AF9D1802210423D ++:10EED000F6D0014A1040F74600F0FFFFFEE70000C1 ++:10EEE00010B57146034802F0DFFB40F61100FFF752 ++:10EEF000C3FE10BD8E1F860010B5002128220446D7 ++:10EF0000F3F39EF00A4B23600A4B63600A4BA36045 ++:10EF10000A4BE3600A4B23610A4B63610A4BA3610E ++:10EF20000A4BE3610A4B23620A4B636210BDC04681 ++:10EF300000000000C71D0200C81D0200AC2702002F ++:10EF4000AC270200182C0200182C020021D202006B ++:10EF500024D20200005903002DE9F04399B00CA817 ++:10EF6000FFF7CAFF0C9B0D99DFF8DC91C91A0F9DC2 ++:10EF70000E9BD9F80060ED1A119C109B06F5A05667 ++:10EF80006048E41A76180B9102F08EFB0B9905F598 ++:10EF90007E7376190733361901F57E729B0A019448 ++:10EFA00004F57E740732009307340523A40A920AFD ++:10EFB000039355482B460294DFF8848102F074FBDA ++:10EFC000524BD8F800401968D9F80050C4EB01033F ++:10EFD00003F57E7001F57E7207300194039504F508 ++:10EFE0007E7405F57E75800A073207340735920A6C ++:10EFF0000090A40AAD0A46480294049502F054FB1E ++:10F00000444B45481968D8F80030C91806F57E7396 ++:10F0100001F57E7207339B0A0732920A009333464A ++:10F0200002F042FB3D4B3E48196802F03DFB3D4B70 ++:10F030001F683D4B3A689A4203D03C4802F034FBCB ++:10F0400024E0179705E03268374B9A4205D1331D0B ++:10F050001793179E16AB9E42F5D3354BC7EB0600B0 ++:10F060001A6817ABC7EB0301C3EB0204C6EB02053A ++:10F070000092019102910390049039462D48324646 ++:10F08000059406940795089502F00EFB2A4C20681B ++:10F09000002834D0C588F3F363F52368013D5C890B ++:10F0A0004FF4806104FB05F6443405FB04F406F5D7 ++:10F0B0007E73073393FBF1F3009304F57E730733FC ++:10F0C00093FBF1F302460293294633461B48019411 ++:10F0D00002F0EAFA1A4B0F4A1B681268C6EB0306E5 ++:10F0E0009B181B1B03F57E7106F57E720731890A9A ++:10F0F0000732009113483146920A02F0D5FA19B04E ++:10F10000BDE8F083E11F8600F01F8600C8260000DE ++:10F110002E208600A4260000722086009026000083 ++:10F12000AC208600F82702004B415453C6208600CD ++:10F13000FC270200E9208600BC260000662186002C ++:10F140008826000092218600CC2600000D4B10B5C9 ++:10F150001A680D4CD2F81416D2F8143699420B4B9B ++:10F1600018BFD2F8141622681B68C2EB010098423F ++:10F1700001D2002004E0B0FBF3F003FB0023236086 ++:10F1800010BDC0469C260000E4260000C8250000F3 ++:10F190002DE9F04301688FB0022907461AD15A4B76 ++:10F1A0005A481A6800235361046814F4805F11D030 ++:10F1B000574B584A1960C169043B1960136804230E ++:10F1C000136024F4805343F400530360524802F068 ++:10F1D0006BFA96E03B680C2B14D14C4C236813F46B ++:10F1E000005F0FD023F4005343F400632360676093 ++:10F1F0004A48F96C02F058FA236803F40063002BC4 ++:10F20000FDD17EE03B68103B0F2B02D8F7F3E2F014 ++:10F2100077E03E4B4248D96902F046FABA6C786C06 ++:10F22000BC68FD683968FB6C009201903A463D4825 ++:10F230000294039502F038FA3B4B7E6C1B68F86928 ++:10F24000D7F828E03C6A7D6A9B1B39697A694FEAE6 ++:10F250009309BB6900903548CDF80CE00194029504 ++:10F2600002F022FAB86BFC6B3D6CF96A3A6B7B6B6F ++:10F2700000902F480194029502F016FAF068316868 ++:10F280007268B36800902B4802F00EFAF069316999 ++:10F290007269B3690090284802F006FA04A8FFF7E3 ++:10F2A0002BFE264802F000FA0024A04625461CE06A ++:10F2B000725912F0010F13D0FF2A11D9059B9A42FF ++:10F2C00008D91F4B1B0D1B059A4209D303F5801368 ++:10F2D0009A4205D81B48294602F0E6F908F10108D0 ++:10F2E0000435B8F10F0F02D801344C45E0D1074A7C ++:10F2F00040F203301368576043F480631360FFF7F4 ++:10F30000BBFC0FB0BDE8F0837428020000280200A7 ++:10F31000241000E0281000E0C4E50100C8E5010069 ++:10F32000D4E50100E1E50100F81E020015E6010048 ++:10F3300048E6010077E6010095E60100FC1C860026 ++:10F340009D668000B2E60100F0B51F4E8BB06846A6 ++:10F35000FFF7D2FD3578F5B90698079B1C1A07D040 ++:10F3600029462246F2F36CF606982146F6F358F742 ++:10F370002146164802F098F9154B1D700123337091 ++:10F38000144B1968E9B10B78DBB1134B2A461868A6 ++:10F39000F3F34AF415E0114F3D7895B90898099BAD ++:10F3A0001C1A07D029462246F2F34AF6089821464D ++:10F3B000F6F336F70A48214602F076F90123357054 ++:10F3C0003B700BB0F0BDC0463C280200C9E601000E ++:10F3D0003E280200BC260000242802003D2802002E ++:10F3E000FBE6010010B50446FBF384F60146204617 ++:10F3F00000F034F910BDC04670B50446FBF37AF650 ++:10F400002046FBF3B7F505462046FBF337F500220F ++:10F41000064640F62A012046FBF3F0F60123AB40F6 ++:10F420008269134201D0002500E0013520463146B3 ++:10F43000FBF3F6F6284670BD10B5FFF7DDFF10BDF3 ++:10F440002DE9F04107460C46FBF354F63846FBF332 ++:10F4500015F540F62A01804600223846FBF3CEF629 ++:10F4600083690646456944B14FF4004043F00044C7 ++:10F4700045F00045FFF792FB07E04FF4004023F012 ++:10F48000004425F00045FFF7A7FBB46138467561DD ++:10F490004146FBF3C5F6BDE8F081C0462DE9F041D9 ++:10F4A0000E465021804617461D46F7F311F40446D8 ++:10F4B00018B300215022F2F3C3F540F23C736363AA ++:10F4C000A3F55573E363A3F5737323640C2363649B ++:10F4D00004230020E56026606760C4F80880A36408 ++:10F4E0000749F3F349F2C0B284F84C000138C0B2C6 ++:10F4F000012802D9022384F84C302046BDE8F0816F ++:10F500003E2986000048704718F9010000487047FE ++:10F5100090F901000048704700A60E00D2F80036AE ++:10F5200070B50546C3F38404FFF7ECFF03E083786E ++:10F53000A34204D00C3020B10388002BF7D10388FC ++:10F5400013B92846FFF7E2FF03884FF47A7003FBF4 ++:10F5500000F070BD0123C2F8603610B5D2F86446E1 ++:10F56000FFF7D8FF04F0FF04B0FBF4F34FF47A7018 ++:10F5700003FB00F010BDC0462DE9F0411C460646D5 ++:10F580001546FBF37BF4002107463046FBF348F6B3 ++:10F590000223C0F8583654B1D0F85C3605F03F026B ++:10F5A00023F4FC4343EA4223C0F85C3603E0D0F87E ++:10F5B0005C36C3F3452530463946FBF331F6284621 ++:10F5C000BDE8F0812DE9F041DFF860800646D8F80B ++:10F5D000004034BBFBF352F4214607463046FBF3B0 ++:10F5E0001FF6D0F81456D0F8143604469D4218BFC2 ++:10F5F000D0F8145642F21070F7F3AEF0D4F8142697 ++:10F60000D4F8143630469A4218BFD4F81426394636 ++:10F61000C5EB0203642203FB02F3C8F80030FBF3DE ++:10F62000FFF5024B1868BDE8F081C046842802004F ++:10F6300070B504460D46FBF321F400210646204632 ++:10F64000FBF3EEF5294602462046FFF783FF3146DD ++:10F6500005462046FBF3E4F5284670BD10B5FFF7DC ++:10F66000E7FF10BD70B504460D46FBF307F400211B ++:10F6700006462046FBF3D4F5294602462046FFF70E ++:10F680004DFF314605462046FBF3CAF5284670BDBE ++:10F690002DE9F04F1746C7F820361D46036A85B09E ++:10F6A0000C2BCBBFD2F82836D2F82836C3F3094B3F ++:10F6B000C3F3072B01230024AB4080468946029404 ++:10F6C00003940094F6F30AF30646012212FA04F3B7 ++:10F6D000334207D00092404649463A46F6F3FEF2DE ++:10F6E00026EA000601341F2CEFD1404603A902AAE6 ++:10F6F000F6F31EF3039B00256FEA030A2C46012351 ++:10F70000A34006EA0A021A4208D0404649463A4651 ++:10F71000E3B2FFF7BDFF854238BF054601341F2C19 ++:10F72000EDD10BF10200401905B0BDE8F08FC046E5 ++:10F730002DE9704305468846FBF3A0F3002181467E ++:10F740002846FBF36DF50446284600F0F3F8224600 ++:10F750000646414618232846FFF79AFF0B2302303E ++:10F7600000FB03F0074C49463419B4FBF6F404FBE4 ++:10F7700000F42846FBF354F50A23B4FBF3F4A0B2DB ++:10F78000BDE870833F420F0073B5044616461D4620 ++:10F7900000914FF4CB6200214FF0FF33FBF376F37F ++:10F7A0002046002140F25C6233460095FBF36EF385 ++:10F7B0007CBDC046002270B513460C4604210546A8 ++:10F7C000FFF7E2FF012C20F0F07308BF43F0F07365 ++:10F7D000284604214FF0FF32FFF7D6FF012C03D15A ++:10F7E00049F64040F6F3B8F770BDC04610B50021A9 ++:10F7F000FFF7E0FF10BDC04610B50121FFF7DAFFAB ++:10F8000010BDC04610B508B1F6F366F510BDC04690 ++:10F8100070B5094B06461D6808E030462C68FBF3BE ++:10F8200069F429466A68F7F363F22546002DF4D19E ++:10F83000014B1D6070BDC0466C270000002343666D ++:10F840007047C0467047C0460020704710B5FFF7AC ++:10F85000D3FF10BD10B5FFF7C9FF10BD2DE9F04172 ++:10F8600006460D461446FBF30DF4804618B93046A3 ++:10F870000121FBF345F4304613F032FA074610B984 ++:10F880006FF01D0415E014B96FF0190418E04FF083 ++:10F8900000032B80002404F182013846F2F34AF27F ++:10F8A000C0B2A0402B8801341843052C2880F2D127 ++:10F8B0000024B8F1000F03D130464146FBF320F499 ++:10F8C0002046BDE8F081C04607B54FF0000302A90D ++:10F8D00021F8023D0122FFF7C1FFBDF806000EBD71 ++:10F8E000416E2DE9F041044661B1D0F8C83000EB1B ++:10F8F0008303D3F8D020C36D9A4203D1006E8847AA ++:10F90000064600E000262046616DFFF711FFA56E58 ++:10F9100007465DB1D4F8C83004EB8303D3F8D02098 ++:10F92000E36D9A4202D1206E3146A8473846BDE8C1 ++:10F93000F081C04610B50446FBF3DCF301462046D7 ++:10F94000FFF740FE10BDC04610B50446FBF3D2F3EE ++:10F9500001462046FFF786FE10BDC046416E2DE9E8 ++:10F96000F041044661B1D0F8C83000EB8303D3F80E ++:10F97000D020C36D9A4203D1006E8847064600E04E ++:10F9800000262046616DFFF753FEA56E07465DB168 ++:10F99000D4F8C83004EB8303D3F8D020E36D9A4247 ++:10F9A00002D1206E3146A8473846BDE8F081C046F6 ++:10F9B00043692DE9F743222B06460F4640F3A0800A ++:10F9C000FBF314F4002800F09B80072F00F29880CE ++:10F9D000B268B2F5026F01D101220AE040F60403D9 ++:10F9E0009A4201D0002204E0F3680C2B94BF00225D ++:10F9F00001225FFA82F8B8F1000F0BD130464FF4C4 ++:10FA000000614246D6F8C890FBF3F8F3054600289B ++:10FA100077D006E0D6F8843013F5405571D04FF01A ++:10FA20000009032F03D030460121FBF379F4D5F808 ++:10FA3000303123F00403C5F8303101239F42C5F86B ++:10FA4000303103D9042F01D0083300E00D23C5F86D ++:10FA50003031D5F83031012F23F00103C5F83031B2 ++:10FA600001D9042F36D1FF2400214FF4E27223463E ++:10FA700030460094FBF30AF22223009300214FF456 ++:10FA8000EE7223463046FBF301F228230093002157 ++:10FA90004FF4E67223463046FBF3F8F181230093DE ++:10FAA00000214FF4E87223463046FBF3EFF10123C7 ++:10FAB000009300214FF4A4724FF0FF333046FBF364 ++:10FAC000E5F1304600214FF4A6724FF6FF73009423 ++:10FAD000FBF3DCF1D5F8303123F0700343EA071370 ++:10FAE000C5F83031D5F8303123F00803C5F830318E ++:10FAF000B8F1000F05D130464946FBF391F300E021 ++:10FB000000252846BDE8FE8370B50446FBF36EF37E ++:10FB1000002839D0A268B2F5026F01D101220AE0B3 ++:10FB200040F604039A4201D0002204E0E3680C2B63 ++:10FB300094BF00220122D5B24DB920464FF4006196 ++:10FB40002A46D4F8C860FBF359F3E8B105E0D4F8CD ++:10FB5000843013F5405017D00026D0F8303123F010 ++:10FB60000403C0F8303143F00103C0F83031C3F36F ++:10FB70000213032B03D020460021FBF3D1F31DB960 ++:10FB800020463146FBF34CF370BDC0462DE977416A ++:10FB90000022012113460546F6F352F10024804667 ++:10FBA00021462822234628460094FBF36FF10121C9 ++:10FBB0000646434628464FF0FF32F6F341F1284609 ++:10FBC000214628224FF0FF330096FBF35FF1BDE89A ++:10FBD0007E81C046D0F86C32994201D0002004E00A ++:10FBE0008B79D3F1010038BF002070472DE9F04137 ++:10FBF000002605460446374608E02B68216A9868C7 ++:10FC0000FFF32CF500B90136013718346B689F42B9 ++:10FC1000F3DB3046BDE8F08103682DE9F0411E6852 ++:10FC20000546B7688846144638462969FFF316F535 ++:10FC300044B133681B7E2BB1384629694246012303 ++:10FC4000FFF3C4F4BDE8F08170B505460446002614 ++:10FC50000DE0616949B1236A3BB1182006FB00F051 ++:10FC6000103028180122FFF7D7FF013618346B68CF ++:10FC70009E42EEDB002070BD2DE9F3411F46036874 ++:10FC8000044601910092DDF820801E6809B10D291B ++:10FC900041DD61680022FFF7BFFFE1680025656074 ++:10FCA00031B1236822891B685868F7F321F0E560B9 ++:10FCB000009B2BB1B3F5967F02DA6FF01C002CE0AD ++:10FCC00030464146FFF786FF28B3019969B12368A2 ++:10FCD0001B685868F6F3FCF7E06010B96FF01A0083 ++:10FCE0001BE03946019AF2F347F101A90422C4F856 ++:10FCF000148004F10800F2F33FF1201D694604224C ++:10FD0000F2F33AF1009840B1204661680122FFF712 ++:10FD100083FF002001E06FF00100BDE8FC81C046D8 ++:10FD20002DE9F047154686B00268DDF84080DDF821 ++:10FD300044A005F00103009306465346106842466E ++:10FD4000DDF84C9013F0C0DA0746002840F0A1809F ++:10FD5000022D54D0032D1FD0012D02D06FF01607B5 ++:10FD600097E04146042203A8F2F306F1022208F1CB ++:10FD700004010DF11600F2F3FFF056F8100B49469E ++:10FD8000BDF81640039D2FF035DB214600902A4632 ++:10FD9000304608F106032EE00222414605A8F2F3A0 ++:10FDA000EBF0042208F1040103A8F2F3E5F00222CB ++:10FDB0000DF1160008F10801F2F3DEF0BDF8143081 ++:10FDC000012B02D06FF0240763E098F80A70736883 ++:10FDD0009F425CDA49463068BDF81640039D2FF01B ++:10FDE00009DB182307FB03F3103300902146F018BA ++:10FDF0002A4608F10B03FFF73FFF074649E00E9B39 ++:10FE00001A6873689A4242DA002A40DB4FF0010315 ++:10FE1000ADF8143004924FF00B030DF116012A4691 ++:10FE200008F10200ADF81630F2F3A6F005A92A4653 ++:10FE30004046F2F3A1F004991824013101FB04615A ++:10FE40002A4608F10800F2F397F0012204A908F10C ++:10FE50000A00F2F391F00499042201FB046108F115 ++:10FE600004001431F2F388F0049B013303FB04F324 ++:10FE70009A5B991902F10B039A4502D26FF00D07B4 ++:10FE800007E008F10B004968F2F376F001E06FF04B ++:10FE90000107384606B0BDE8F087C046F7B50168EF ++:10FEA00005460E6896F87032002B2CD002894769FF ++:10FEB0003AB9304607F1BC011346009218F0D0D889 ++:10FEC00021E0898970688918F6F35AF72A68044690 ++:10FED00018B993680133936015E09289A38A006989 ++:10FEE0009B1A8018A382E9682A892061F2F344F002 ++:10FEF00004F124025389304643F0400353812146E4 ++:10FF0000BA6818F04FD9FEBD13B54FF0000310F0DA ++:10FF10000104ADF8063006D0002904DD10F8013BDD ++:10FF200001398DF8073010F0030F05D0012903DDEA ++:10FF300030F8022B023913E0002211E00368D218D6 ++:10FF4000436828BF0132D218836828BF0132D21813 ++:10FF5000C36828BF0132D21828BF013210301039CF ++:10FF600031F00F03EAD113041B0C03EB124203E040 ++:10FF700030F8023C0239D218034602300129F7DC7E ++:10FF800004BF1B788DF80630BDF80630D3181A046C ++:10FF9000120C02EB134213041B0C03EB124024B1AE ++:10FFA000030243EA10231804000C1CBD10B5FFF730 ++:10FFB000ABFF02E003041B0C9818020CFAD1C043FB ++:10FFC00080B210BD2DE9F041BDF818500C4629460D ++:10FFD00016469846FFF798FF3204120C02EB1442C3 ++:10FFE0002404240C121905F0FF0302EB16421B0235 ++:10FFF00002EB082243EA1523D218101802E003048A ++:020000021000EC ++:100000001B0C9818020CFAD1C04380B2BDE8F081F5 ++:100010002DE9F0418D8A16460D2D1F460C6952DDE3 ++:10002000A38904F10C0003F0FF021B0A43EA022338 ++:10003000B3F5C06F0BD2152D45DD254804F10E0137 ++:100040000622F1F37DF700283DD104F11400038866 ++:1000500003F0FF021B0A43EA0223B3F5014F0AD162 ++:100060000430821C63199A422DD8038803F0FF02E2 ++:100070001B0A43EA0223B3F5006F24D1811CC4EBB1 ++:100080000103C3EB0504132C1DDD82781309042B37 ++:1000900019D102F00F039A00132A14D9A24212DCDC ++:1000A0008A78CB7843EA0223A34201DA1C4600E0B7 ++:1000B00009DC8A79CB7943EA02239804800C10B9D1 ++:1000C00031603C6001E04FF0FF30BDE8F081C04698 ++:1000D00035FA01002DE9F043436887B013F0020FB1 ++:1000E0000546884600F08F8005AA04ABFFF790FF15 ++:1000F0000028C0F288800598037803F00F039E0063 ++:100100003146FFF753FF48B1B8F8163023F010031B ++:10011000A8F816302B6A01332B6274E0EB69059F57 ++:100120000133EB6197F80990B9F1060F24D107F17B ++:100130000C01042202A8049CF1F31EF70599042285 ++:100140001031A41B03A8F1F317F7A4B2B819029950 ++:10015000039A4B460094FFF735FF48B1B8F81630C4 ++:1001600023F01003A8F81630AB6A0133AB624AE003 ++:100170006B6A01336B623EE0B9F1110F24D107F1D4 ++:100180000C01042203A8049CF1F3F6F6059904225D ++:100190001031A41B02A8F1F3EFF6A4B2B819039929 ++:1001A000029A4B460094FFF70DFF48B1B8F816309D ++:1001B00023F01003A8F816302B6B01332B6322E0D9 ++:1001C000EB6A0133EB6216E0B9F1010F13D1049928 ++:1001D000B819891B89B2FFF7E9FE48B1B8F81630A3 ++:1001E00023F01003A8F81630AB6B0133AB630AE0C1 ++:1001F0006B6B01336B63B8F81630002043F01003CB ++:10020000A8F8163001E04FF0FF3007B0BDE8F083EA ++:100210002DE9F043436887B013F0010F804600F0EA ++:100220008780CB8A13F0080F03D183680133836082 ++:100230007EE005AA04ABFFF7EBFE002878DB059A09 ++:1002400000271378977203F00F039E00D772314690 ++:100250000598FFF7ABFE059B9872C0F30F20D8728C ++:10026000D8F80C3005990133C8F80C3091F8099092 ++:10027000B9F1060F21D18D19049C0C3104222F7481 ++:100280006F7402A8F1F378F6059904221031A41BCB ++:1002900003A8F1F371F6A4B24B4628460299039ADB ++:1002A0000094FFF78FFE2874C0F30F206874D8F80D ++:1002B00010300133C8F810303AE0B9F1110F22D1F3 ++:1002C0008D19049CAF71EF71059904220C3103A8BC ++:1002D000F1F352F6059904221031A41B02A8F1F3A0 ++:1002E0004BF6A4B24B4628460399029A0094FFF7B6 ++:1002F00069FEA871C0F30F20E871D8F814300133FB ++:10030000C8F8143014E0B9F1010F11D18C19049917 ++:100310002046891BA770E77089B2FFF747FEA070DF ++:10032000C0F30F20E070D8F818300133C8F8183047 ++:1003300007B0BDE8F083C0462DE9F34114460A9F9B ++:100340000268DDF82C8004F0010300930546434663 ++:1003500010683A4612F0B8DF064618BB052C04D8E0 ++:10036000DFE804F00A061403030D6FF0160619E027 ++:10037000281D3946042213E06B683B6012E005F14A ++:10038000080000214C22F1F35BF60BE0B8F14B0FB3 ++:1003900002D86FF00D0605E0384605F108014C2241 ++:1003A000F1F3EAF53046BDE8FC81C04610B58C6B30 ++:1003B00000200BE00B1893F83C30064A03F07F0353 ++:1003C000D356002B01DA012003E00130A042F1D125 ++:1003D000002010BD401B86002DE9F84F02298346FE ++:1003E0000E4690469A4614BF4FF0FF37002714BFC1 ++:1003F000002401244FF000092EE0022E14BF4FF01C ++:10040000FF3300239F4211D0022E08D1B8F1040F10 ++:1004100007D0B8F1060F04D0B8F1080F01D00422BC ++:1004200000E00022C7EB0403934214DD0E2CCCBF86 ++:100430004FF480534FF4005344F4306213439DB2A1 ++:10044000DBF85C01294635F0A9DF20B12AF8195004 ++:10045000274609F101090134022E0CBF0E230023A7 ++:100460009C4202DCB9F11F0FC7D90A9BC3F8009068 ++:10047000BDE8F88F2DE9F04F88469BB0402100275A ++:10048000DDF890B09DF894900646C0F82077C0F84B ++:100490001C1740689A46F6F31BF40446C6F8180782 ++:1004A00010B96FF0150473E0D8F800306BB9203341 ++:1004B000C6F82037336B30461A8906F5E46300939B ++:1004C00059462346FFF788FF1FE0202B6CD845468E ++:1004D00017E0AC88D6F85C01214635F05FDF0028D4 ++:1004E00062D01FB12B78E2B29A425DD9D6F820379C ++:1004F000D6F81827013722F813400133C6F8203701 ++:100500000435D8F800309F42E3D3D6F82037002BCB ++:100510004AD070681021F6F3DBF30746002835D087 ++:10052000279B002411AD446083600473214606605C ++:1005300080F80DB080F80E9024222846F1F380F563 ++:10054000A24514BF0023012301934FF0FF33029310 ++:10055000039304930593D6F8183730460693D6F8DC ++:10056000203702210793144B144A0A9303230C9358 ++:100570000123089409940D940E9400950B9716F09E ++:10058000BBDC044698B9269B7B6010E06FF01A0430 ++:10059000D6F8181759B17068D6F81C27F6F3A8F3E7 ++:1005A0000023C6F8183702E06FF00104F0E7204698 ++:1005B0001BB0BDE8F08FC046410B01002C9E8500AA ++:1005C00030B590F8143789B00446002B3ED0D0F8EF ++:1005D00068319D79002D62D1036880F814571B7E25 ++:1005E000002B5CD0B0F81637002B58D0036B18697D ++:1005F00002F09CFAB4F81617884250D0204618F042 ++:10060000CFDB204601F0EEF82046B4F8161718F0BC ++:100610000DDA236893F82F306BB1D4F86C32204692 ++:10062000D3F8D412383113F0B9D80146C4F8AC0667 ++:1006300020460CF051D920461AF068DC20462946A5 ++:100640001AF06EDE204611F0DBDC28E003681B7E2A ++:100650002BB3D0F868319B790BBBD0F8000507A904 ++:1006600044F038DD03E02B7E13F0020F17D107A80A ++:1006700044F038DD05460028F5D1236B05901B6852 ++:1006800005A90093032301930290039001222046C1 ++:100690002B46FFF7EFFE10B9012384F8143709B099 ++:1006A00030BDC0462DE9F74F0192D0F800A090F878 ++:1006B0000D801F460C464FF0000BE5E0072200219D ++:1006C0002046F1F3BDF40C9AB8F1020F12F81B00AA ++:1006D000207001D0022308E0042F05D0062F03D09C ++:1006E000082F01D0434600E00023C3EB0002B8F11D ++:1006F000020F14BF002301239A4210DBB8F1020F4E ++:1007000001D0022108E0042F05D0062F03D0082FC6 ++:1007100001D0414600E00021C1EB00060FE0B8F136 ++:10072000020F14BF0026012606E0DAF85C0131460C ++:1007300035F0F2DD18B9013623789E42F5D9B8F1CB ++:10074000020F207802D0002202230BE0042F07D0F2 ++:10075000062F00F0A680082F00F0A3804346A1E0FA ++:100760000E2200231B1893420FDCB8F1020F01D0B8 ++:10077000022108E0042F05D0062F03D0082F01D056 ++:10078000414600E000210D180FE0B8F1020F0CBF48 ++:100790000E25002506E0DAF85C01294635F0BCDDBF ++:1007A00018B9013D23789D42F5D24FF0000963E06E ++:1007B00002EB89039968CB88B1F832E013F020038B ++:1007C0005FFA8EF00DD00EF44072B2F5807F02D148 ++:1007D000821C023806E0B2F5007F02D1821E023090 ++:1007E00000E00246B04201D3A84203D9B24241D34D ++:1007F000AA423FD8B3B1B04214D3A84212D80EF4E3 ++:100800004073B3F5807F05D12379FF2B0AD00133E4 ++:10081000237107E0B3F5007F04D16379FF2B01D08A ++:1008200001336371CB8813F0200F0BD0B24209D390 ++:10083000AA4207D8824205D0A379FF2B1AD00133F0 ++:10084000A37117E023780E2B0FD85046FFF7AEFDAB ++:1008500028B1E378FF2B0DD00133E3700AE0A378D1 ++:10086000FF2B07D00133A37004E06378FF2B01D086 ++:100870000133637009F10109DAF818251368994505 ++:1008800096D30BF1010B07340D9B9B4504DA019ABB ++:1008900013689B45FFF612AF019BC3F800B0BDE89B ++:1008A000FE8F00230E225DE72DE9F84F5FFA83FCEF ++:1008B0001E4603F44073B3F5007F14BF4FF00009E8 ++:1008C0004FF0010905468A4693460CF10200ACF14F ++:1008D0000203B9F1000F02D08646984601E09E4619 ++:1008E00080460027394629E011F80A40ACF105039B ++:1008F0009C4221DB0CF105039C421DDC0AEB01004C ++:1009000082783AB9C3782BB903791BB943790BB90B ++:1009100083798BB1744506D1837993B9B9F1000F0E ++:1009200008D0037907E044450BD152B9C37843B9E5 ++:10093000037933B9437923B9013707315F45D3DBF5 ++:100940001BE0BEF10E0FD4BF4FF400534FF48053A1 ++:100950004EF4306213439CB2D5F8FC341B7893B14B ++:100960002846002124F048D8284624F03BD80AE045 ++:100970002846012124F040D804E0D5F8FC341B7847 ++:10098000002BF5D134462046BDE8F88F2DE9F04F15 ++:10099000D0F8008090F80DA0D8F83010DDB00989AB ++:1009A000814614464FF0000B5B9300E004210022C7 ++:1009B0005B98964608E01EF804300EF1070E052BF2 ++:1009C00001D9934602E001328242F4DB082900F2A9 ++:1009D000B08001A252F821F0FD090100330B0100A3 ++:1009E000030A0100330B0100AF0A0100330B0100C1 ++:1009F000330B0100330B0100AD0901004FF6FF7608 ++:100A00001AE00025AE464FF6FF7612E00EEB0B0221 ++:100A100092FBF0F300FB1323072203FB02F16218A1 ++:100A2000937823B9D378B3423CBF655C1E460EF180 ++:100A3000010E8645EADB15B90025AC4621E00E2DF6 ++:100A400094BF4FF400524FF4805245F4306343EAB0 ++:100A500002006FE00CEB0B0292FBF0F300FB1323A0 ++:100A6000072203FB02FE04EB0E0359789A78DB7829 ++:100A70005218D218B242BCBF14F80E5096B20CF104 ++:100A8000010C8445E6DB3DB99BFBF0F300FB13B39F ++:100A9000072203FB02F31D5D0E2D94BF4FF400539C ++:100AA0004FF4805345EA030343F4306042E0BAF167 ++:100AB000020F3ED15AAB00930024404651465246A5 ++:100AC0004AAB5A94FFF788FCD8F818771FB3D8F8C8 ++:100AD000206706B35A99254610E000243AAB37F850 ++:100AE0001520E05A904205D15CAA02EB410323F89D ++:100AF000480C01310234402CF0D10135B542ECDB19 ++:100B000020230E485B935A9100F0CEFD4AAB009330 ++:100B10005A9B02AC04E020233AAA5B9302AC0092F9 ++:100B20000193214648465BAA0223FFF7BBFD022141 ++:100B30003DE700205DB0BDE8F08FC046B4FA01008B ++:100B4000F0B50546BDB004680E4609B108292DD19F ++:100B50002023D4F818273B93236B03AF1B89009203 ++:100B6000D4F82027394601923BAAFFF79BFD6B7B07 ++:100B7000022B13D1D4F8FC341B787BB1D4F8343772 ++:100B8000B3F8A4E30EF44063B3F5406F06D12046FA ++:100B900039463B9A7346FFF787FE05E02846002159 ++:100BA00003AA3B9BFFF7F2FEA4F816076B6813B18C ++:100BB000A86831469847D4F81817D4F81C276068FD ++:100BC000F6F396F00023C4F818376068294610221F ++:100BD000F6F38EF03DB0F0BD7047C04610B5C3F8D7 ++:100BE000A010082019461C4631F03ADE84F8A40013 ++:100BF00010BDC0467047C0460020704700207047B7 ++:100C0000002070477047C0467047C0467047C046D6 ++:100C1000002070477047C04603680246D3F86C3224 ++:100C2000D3F8E432987818B1938A181E18BF0120BF ++:100C30007047C0467047C0467047C04670B5037DD8 ++:100C400004469BB1457D8DB9C068A169FEF306F5E8 ++:100C500001236375E36906460BB1A0689847D6F196 ++:100C6000010038BF00206575257500E0002070BDCB ++:100C70000846002110B5016141810172017306220D ++:100C8000F1F3DEF110BDC04610B50068F4F7B0F81E ++:100C900010BDC04690F832007047C0460246086852 ++:100CA000430D5B056BB922F07F4323F46003520DC3 ++:100CB00083422CBF4FF40013002352059B180343BB ++:100CC0000B60704770B510600D461C46084619460B ++:100CD0001646FFF7E3FF2368AB4202D233680133C5 ++:100CE000336070BD002070477047C04600207047D9 ++:100CF000002070477047C0467047C0467047C046E6 ++:100D000030B50568B5B061B10DF107040171C922B4 ++:100D100000212046F1F394F12B6B2146186902F073 ++:100D20001BFF35B030BDC046406B70477047C046B2 ++:100D3000002070477047C046002070477047C0468B ++:100D4000002070477047C046002070477047C0467B ++:100D50007047C0467047C0467047C0460020704785 ++:100D60007047C0467047C046002070477047C04675 ++:100D70007047C0467047C0467047C0464FF0FF30CE ++:100D80007047C0467047C04600207047002070473B ++:100D90007047C0467047C0467047C0460020704745 ++:100DA0007047C04603490A6812B100230B60104621 ++:100DB0007047C046E82B020070B515460C464E6CD5 ++:100DC00018F00CD9024628B915F4001F02D0636C44 ++:100DD0006664A364104670BD73B500EB420440F630 ++:100DE0002A15B4F82C66A4F82C56069D009503F03D ++:100DF0008FDCA4F82C667CBD10B511F0F7DC024640 ++:100E000040B1416A11F4002F04D1036813B141F4D9 ++:100E100000234362104610BD2DE9F3411E460368CE ++:100E200004461B7E0F469046002B4BD090F875323F ++:100E3000002B47D10D682846FFF776FF016902466F ++:100E40008B79B3B1837E13F0010F12D0D1F8CC307F ++:100E500013F4806F0DD1B4F8263603F47043B3F564 ++:100E6000805F14BF40234423CB5813B193F8DF3085 ++:100E700043BB5168002925DB164B01EA03030BB97C ++:100E8000184602E0EB8A03F0070011F0400F19D07A ++:100E9000114B02A91B5C204641F8043D336009F068 ++:100EA000EFDDB0F1FF3F0DD0019A3368934209D0D6 ++:100EB0000A4B32609A5CEB8A02F0070223F00703C8 ++:100EC0001A43EA82204639464246334614F06CD82B ++:100ED000BDE8FC8140000180C4D28500301E0200C4 ++:100EE000F0B585B00A9C0D4600940B9C1F460194FA ++:100EF0000C9C064602940D9C039428F02FDBAB79E2 ++:100F000043B13946304644F063DD014610B1304606 ++:100F100044F056DC05B0F0BD10B520F00BDE10BD7E ++:100F20002DE9FF4107461D469E6B146945F0C8DB5D ++:100F30008046002834D1337A022B31D1A3797BB398 ++:100F4000B5F8683063B3A26D40F2371302EA0303C9 ++:100F500033B394F884301BBBD4F888303A6853B963 ++:100F6000D2F88C30D3F8E4210132C3F8E4213C23D9 ++:100F7000C4F8883009E0D2F88C30D3F8E42101328B ++:100F8000C3F8E421012384F89430002394F9482025 ++:100F9000384600930293296F1133019644F068DFBD ++:100FA000404604B0BDE8F0812DE9F74F80460E467B ++:100FB00093461F46002B5FD001295DD14FF4C073CB ++:100FC0000193FAF397F04FF440718246F5F380F6FF ++:100FD000044610B94FF0FF3555E000214FF4407240 ++:100FE000F1F32EF040463146224601ABF0F3BEF657 ++:100FF00010F11E0F3AD1019B4FF0FF325D004A23E2 ++:1010000023700B23637015332371042363716FF016 ++:101010002F03A371923323726FF0560363724FF064 ++:1010200002096319A270E27084F8079003F8022C99 ++:1010300003F8012C07F10C039D4202DC6FF00E0552 ++:101040000DE059463A4604F10A00F0F395F795FB96 ++:10105000F9F340463146224611F074FE05465046EB ++:1010600021464FF44072F5F343F60CE0504621461A ++:101070004FF44072F5F33CF6404631465A463B4643 ++:10108000EFF3A0F705462846BDE8FE8F70B504468D ++:101090001E46FEF39FF3054640B1636893F8AB30FC ++:1010A00023B1E06F3146F1F76DFDA860284670BDB1 ++:1010B0002DE9F0411F4603680C461B68164693F85D ++:1010C000953005460969A28A1BB1E38A13F0800FA7 ++:1010D00009D0152A07DD08480E310622F0F330F753 ++:1010E00008B9013805E02846214632463B46FCF364 ++:1010F000A5F4BDE8F081C046BAD4010010B59E4603 ++:10110000D0F8683103B19B68054C23607346FCF34B ++:10111000F3F1B0F1FF3F01D10023236010BDC046C1 ++:10112000E82B02002DE9F04F87B0DDF854808946A6 ++:1011300015469A46129FDDF84CB00446B8F1000FF0 ++:1011400006D0D8F8081019B10120F1F7A5FE044621 ++:1011500014B96FF0160632E0226805F0010300931F ++:10116000106849463A465B4612F0AED8064630BB98 ++:10117000112D02D0132D09D00FE03846F1F3ECF316 ++:10118000E8B904F5B8703946062203E004F5B670F4 ++:1011900039460422F0F3F0F611E0109B204600934C ++:1011A000119B49460193149B2A4604935346029788 ++:1011B000CDF80CB0CDF81480FCF3C2F006463046F2 ++:1011C00007B0BDE8F08FC04670B50546D0F8B40052 ++:1011D00058B103784BB1F1F767FB044630B9D5F845 ++:1011E000B4000121F1F31AF500E001242846F3F3DD ++:1011F000DBF724B9D5F8B4002146F1F30FF570BD43 ++:1012000010B5FFF735FD10BD10B5FAF7B1F810BDF8 ++:10121000B0F8543810B50BB119F03ED910BDC04626 ++:1012200010B5044638B102682AB121B992F80B37DB ++:101230000BB182F80B17204617F090DF10BDC046A7 ++:1012400010B521B11AB1536E0BB13DF037DE10BDB0 ++:1012500010B50C4651B1002381F8653581F866352B ++:1012600081F86735C1F868353DF0A2DE10BDC04693 ++:10127000036A10B50C46002B2CD0036809691B6863 ++:10128000B4F814E093F895302BB1E38A13F0800F93 ++:1012900001D11E2200E00C2202F10B039E4519D35E ++:1012A0008B188A5C591C5B7803EB02239BB2B3F565 ++:1012B000006F0FD14B784A1C1B09042B0AD1537ABB ++:1012C000012B07D1436A01334362C3680133C36012 ++:1012D000002002E021463FF03BDD10BD036810B561 ++:1012E0001A68536B2BB192F8443013B130F0AEDF73 ++:1012F00000E0002010BDC04610B50C462DF0C0D94E ++:1013000018B994F8F53284F8F43210BD70B50122A2 ++:1013100005460C46D1F84C152EF01ADD284621461C ++:101320002DF0EAD870BDC0460C2A2DE9F0410446E4 ++:101330000F46154651D80122AA4041F2485302EA0D ++:101340000303002B49D0D0F8B4364BB1D3F8D832D0 ++:1013500033B15B68012B40D0032B3ED0022B3CD035 ++:10136000204615F043DD002837D1D4F868315B6999 ++:10137000012B32D0D4F81808FEF3F6F0064628B157 ++:10138000D4F86801092143F013D91AE0082D01D0DF ++:101390000C2D04D1D4F868319B7923BB11E0D4F82B ++:1013A0006801837913B3D4F82835022B04D094F85C ++:1013B000F43713F0010F16D0092143F0F9D8304665 ++:1013C00015E0082D12D1204639460222002325F0CF ++:1013D0003BD958B14FF0FF3009E0204639462A4644 ++:1013E00029F0E6DC03E06FF0180000E00020BDE823 ++:1013F000F081C0462DE9F04F85B005469B468846F2 ++:1014000091460F9F9DF840A0F8F7B2FFD5F8B06362 ++:1014100004460AF087DDD5F8C03398420CD3032385 ++:10142000009300230193029303932046172109F1AF ++:101430000A02013312F03CDB96F8463013F0030F3A ++:1014400019D0D8F8582040F2371302EA030393B1B9 ++:1014500094F8693713F0010F0DD07B6813F4803FC7 ++:1014600009D03B6C012B06D1002220463946134699 ++:10147000009211F0BBDB094C7F2323600E9B2846B2 ++:10148000009341465B464A460197CDF808A0F8F71D ++:1014900085FF0023236005B0BDE8F08F0C2C02000F ++:1014A00010B50446F5F346F0B0F5C05F05DD204603 ++:1014B00043F006DE204643F003DE10BD2DE9F04187 ++:1014C000074619F0DFDF0026BB19D3F84C42B4B150 ++:1014D000D4F88C509DB9A3798BB1A36D13F0020F92 ++:1014E0000DD094F8843053B1F5F38CF0D4F890100B ++:1014F00027F042DF18B1C4F8885084F884500436CD ++:10150000202EE1D1BDE8F08170B590F8A1310546FB ++:1015100063B903681B6F4BB1D0F81C48F5F372F048 ++:10152000D5F82038E41A2418C5F81C48284614F0C9 ++:10153000BBDB70BD10B588B00A9C00940B9C019475 ++:101540000C9C02940D9C03940E9C04940F9C059497 ++:10155000109C0694119C0794F3F3C2F1044B0421F0 ++:10156000D3F88C300A4604469847204608B010BD90 ++:10157000E0A6850070B504460D461EF04BD92946FD ++:1015800006462046F8F708FE304670BD2DE9F041CA ++:101590000546D5F8D8320E465B681746012B006821 ++:1015A000D5F8DC4202D14FF0000805E0042914BF51 ++:1015B0004FF000084FF001080368DB691A6D636A99 ++:1015C000934238BF62624EB9D4F8901031B140688E ++:1015D00094F89420F5F38CF3C4F8906028463146D3 ++:1015E0003A4625F0F5D8B8F1000F01D00023636228 ++:1015F000BDE8F0812DE9F04385B00C9F0546984683 ++:10160000D7F80090D2F8D462144600970AF0F0DCC4 ++:10161000296891F8463013F0030F3FD0D4F8CC205E ++:1016200012F4805F3AD196F93430002B36D14B6BEF ++:10163000002B33D012F0020F30D13B680DF10900BE ++:101640001849032208EB0304F0F396F495F8FA31F5 ++:1016500033B196F96A30002B02DA95F80A0700E0F8 ++:10166000002008EB0901A14201D2002100E0091B82 ++:1016700002238DF80C3000238DF80D3001338DF8E6 ++:101680000E300DF109038DF80F000093204607235B ++:10169000DD221AF07BDD3B6809333B6005B0BDE815 ++:1016A000F083C046C1D401000FB430B5104BADF586 ++:1016B000037D9E4501D1002513E002A887AB0538C4 ++:1016C00040F20121869A8193F0F3F0F5002405465B ++:1016D00005E002AB053BE05CF5F332F20134AC42CD ++:1016E000F7DB28460DF5037DBDE8304004B07047B8 ++:1016F000DB62820010B502490248FFF7D5FF10BD3A ++:10170000CCFB0100E3FB0100C36970B513F4006F6B ++:101710000E460546016915D00368D3F88C20936BFB ++:101720005C1C4FF47A739463B4FBF3F202FB134333 ++:1017300023B90748C96B2246FFF7B6FFEB6923F4CC ++:101740000063EB61284631462CF03CDB70BDC0469F ++:101750007CDB010010B590F81632044663B1084BEB ++:101760001B684BB1D0F88011D0F884210223C068E7 ++:1017700081EA0202F9F332F42046F7F36FF610BD66 ++:10178000AC27020010B50446F7F3B8F7002384F83D ++:10179000173284F8183210BD10B5074C2378012B8E ++:1017A00009D0064B1B78012B05D001232370F8F3D9 ++:1017B00073F70023237010BD002C0200EC2B0200F5 ++:1017C00070B50546F1F7EEF80128014607DD044C37 ++:1017D000012328462370F8F3EDF50023237070BD34 ++:1017E000EC2B020010B5064902690B782BB1D2F838 ++:1017F000D03013B100230B7001E018F051DD10BDA3 ++:10180000F42B020010B58B7913B1044B01221A702E ++:101810002DF0B6DB014B00221A7010BDF42B020034 ++:1018200070B5044C8568A54201D1002001E0F0F3B9 ++:1018300009F770BD0800002070B505460E461AF085 ++:101840002BDD0446C0B13146284640F26C521AF0F6 ++:1018500035DE064620B9284621461AF091DD0AE019 ++:10186000214640F26552F0F387F32846214640F2C4 ++:101870006552F5F33DF23446204670BD2DE9F04146 ++:101880008AB088460023159917460546129C09938D ++:101890002DF0B0DD07F001030093414606462246D5 ++:1018A0002868139B11F010DD8046002840F0AA80C4 ++:1018B000119B032B04D909A810990422F0F35CF3BF ++:1018C0000D2F08D8DFE807F00A0F07071722363C6C ++:1018D0004B07074E93976FF0160892E0284608F0E2 ++:1018E0002DDA40B22AE02846099908F051DA00289A ++:1018F00000F0858085E0B6F95E300BB102201DE076 ++:10190000B6F95C30181E18BF012017E0099B022BA6 ++:1019100006D14FF00003A6F85C304FF0010306E05B ++:10192000003B18BF0123A6F85C304FF00003A6F877 ++:101930005E3066E0D5F83407F8F71EFD206060E001 ++:10194000099BD5F834070393F8F71EFD039B8342E8 ++:1019500055DCD5F834070999F8F712FD51E0B5F8D0 ++:10196000BE3846E02B6893F8A030002B3FD00DF135 ++:101970001608264906224046F0F3FEF221460422CC ++:1019800008A8F0F3F9F2211D042207A8F0F3F4F2FD ++:10199000404604F108010622F0F3EEF2079F57B922 ++:1019A000D5F86821937993B95369012B0FD02B682F ++:1019B00093F83F305BB904F1100301932846314698 ++:1019C000089A3B46CDF8008015F084DC0DE02B68CA ++:1019D0001B7E13B96FF0030813E0284631460DF162 ++:1019E000160204F1100315F061DC804609E095F859 ++:1019F000C334236005E0099B85F8C33401E06FF030 ++:101A00001C0840460AB0BDE8F081C0462C9E850007 ++:101A10002DE9F04790B0DDF860A00C461E46514617 ++:101A20000023054617460F932DF0E4DC8046D0F8DE ++:101A3000DC9277B1032E04D90FA839460422F0F3C3 ++:101A40009BF237B1032E04D90FA839460422F0F3D4 ++:101A500093F2352C6BD010DC162C00F07C8105DC69 ++:101A60000B2C21D0152C00F065811AE01C2C00F005 ++:101A700086812F2C00F0288113E0382C00F0E580BF ++:101A800006DC362C00F09880372C00F0B58008E09A ++:101A90009F2C00F07A81A52C00F03F81392C00F0BA ++:101AA000F5806FF01604A1E12B6893F8A030002BAD ++:101AB0003DD00DF12606A24906223046F0F35CF235 ++:101AC000394604220DA8F0F357F2391D04220CA860 ++:101AD000F0F352F2304607F108010622F0F34CF21F ++:101AE0000C9C54B9D5F8682193798BB95369012BB3 ++:101AF0000ED02B6893F83F3053B907F110030193D0 ++:101B0000284641460D9A2346009615F0E3DB0CE08B ++:101B10002B681B7E002B00F05D81284641460DF1AD ++:101B2000260207F1100315F0C1DB04465EE12B68C5 ++:101B30001B7E002B00F04E81052E40F24E810D2EB3 ++:101B40000BD9284607F10801A6F1080201F062DA74 ++:101B50000446002840F04A8109E005AC3946204699 ++:101B60000622F0F309F2002307930E26274698F881 ++:101B70000640B4B9D9F8901031B1686899F894204A ++:101B8000F5F3B6F0C9F8904089F89460686831467A ++:101B9000F5F39EF0C9F8900018B139463246F0F3DB ++:101BA000EBF14046394629F091DAD9F890300446F5 ++:101BB000002B40F01A8119E1002300932846394692 ++:101BC00032460EABF1F760FB0446002840F00E8170 ++:101BD0000E99032900F004812A6B1368994202D1FF ++:101BE000D2F8F03050E05368002B14BF38233C2368 ++:101BF000EB58D3F8F03047E00023009328463946ED ++:101C000032460EABF1F740FB0446002840F0EE8070 ++:101C10000F9A02F16403672B02D96FF01C04E5E010 ++:101C20000E99032904D02B6B1B68994240F0DE808B ++:101C3000002A04DB2846296B29F08CDB02462B6B3B ++:101C4000C3F8FC20C3F8F020D0E00023009328461E ++:101C5000394632460EABF1F717FB0446002840F038 ++:101C6000C5800E99032900F0BB802A6B1368994246 ++:101C700002D1D2F8F43007E05368002B14BF3823A8 ++:101C80003C23EB58D3F8F4303B60AFE000230093E3 ++:101C90002846394632460EABF1F7F6FA04460028DC ++:101CA00040F0A4800F9A642A00F29A800E990329CA ++:101CB00004D02B6B1B68994240F098802B6BC3F8C3 ++:101CC0000021C3F8F42091E02B680F9C93F83F307B ++:101CD00013B16FF01B0489E0D5F86801837913B163 ++:101CE000042142F065DC95F87232221E18BF0122F1 ++:101CF00085F8502785F85925002B76D12AB105F5AE ++:101D0000AA61D5F85C010E3104E005F5AA61D5F8A9 ++:101D10005C010A3134F026DA07E70123002202933E ++:101D200028460849134600970196CDF80CA011F0FB ++:101D300037DBFAE6B8F95E3033B1022009E0C0467D ++:101D40002C9E85001C738600B8F95C30181E18BFE5 ++:101D50000120386049E00F9B022B06D14FF00003B1 ++:101D6000A8F85C304FF0010306E0003B18BF0123E8 ++:101D7000A8F85C304FF00003A8F85E3035E02B681F ++:101D800001211869F9F392F22FE0331F0622B3FB09 ++:101D9000F2F33B60D5F8000500230BA90F9343F045 ++:101DA00099D910E00B7E13F0020F0CD00F9B5C1C36 ++:101DB0000F943B68A34210D3B81E062204FB020016 ++:101DC0001A31F0F3D9F00BA843F08CD90146002862 ++:101DD000E8D108E06FF0030408E06FF00D0405E0BF ++:101DE0006FF0020402E00F9B3B600024204610B01D ++:101DF000BDE8F0872DE9F04F056889B082460C46B2 ++:101E00001E4628460023179907939346DDF848801D ++:101E10002DF0F0DA139B032B04D907A841460422C6 ++:101E2000F0F3AAF0BBF10D0F56D12846414698F8C1 ++:101E3000066098F8087098F809402DF06FDA10B134 ++:101E40006FF00107F1E098F80630003E18BF012658 ++:101E5000022B14BF4FF400594FF4811947EA0427AD ++:101E60006EB13846F1F3F8F1002840F0E080D5F883 ++:101E70005C01394634F092DA002800F0D880284618 ++:101E80002DF070DBB0F1FF3F014600F0D280284614 ++:101E90004A46434600962CF08BDE0446002800F0AC ++:101EA000C88028462146FBF789FA20B128462146FA ++:101EB0002DF0C2DABDE0002E00F0B9803946284688 ++:101EC000A2683BF0CDD90746002800F0AE80284636 ++:101ED00021462DF0B1DA12E0139B50460193149B7A ++:101EE00021460293159B5A460393169BCDF800801A ++:101EF0000493179B059333463AF03ADF074617F1F0 ++:101F0000170F40F09280DAF80060002330461799EE ++:101F100006932DF06FDA139B0446032B04D906A811 ++:101F200041460422F0F328F0BBF11B0F7DD130466F ++:101F3000414698F8065098F8089098F809702DF0E6 ++:101F4000EDD9034620B1A04202D06FF0010373E047 ++:101F5000B5F1000A18BF4FF0010ABAF1000F0BD01B ++:101F6000032D0BD09A68304649EA07213BF078D917 ++:101F70000346002860D111E0032D0FD130462146E1 ++:101F80002CF070DF012394F94810304600934FF491 ++:101F90008802013BFBF7E6F903464DE0D4F8CC306C ++:101FA000304643F40003C4F8CC3021462CF05ADF0D ++:101FB000A37913B1322384F8F43294F8F41231295E ++:101FC0000FD833681B7E1BB130461D4A17F02EDA3E ++:101FD000D6F84C0194F8F4123DF074D9322384F809 ++:101FE000F4324146062204F1C200EFF3C5F784F84B ++:101FF00006A030462146FBF7E1F9054640B1D4F88A ++:10200000CC3023F40003C4F8CC304FF0FF3313E09E ++:1020100030460321A26811F087D8D4F8CC3023F4DD ++:102020000003C4F8CC302B4606E03B4604E0002712 ++:10203000FBE74FF0FF37F8E7184609B0BDE8F08F2F ++:10204000329E85002DE9F04704468946FCF3F4F7FB ++:10205000F4F3D8F294F854318046012B1ED825466B ++:10206000002717E06E69B379022B11D1B4F86C30F8 ++:1020700013F4807F0CD0204649464246F0F74CFED0 ++:1020800030B90423B37194F8CD30013B84F8CD30DE ++:1020900001370435B4F910309F42E3DBBDE8F08727 ++:1020A00030B54FF0000E044691B08C461546704690 ++:1020B00009E023185A690EF1010ED1794DF800108C ++:1020C000536B0430D371B4F910309E45F1DB2046D8 ++:1020D00061462A46FCF3A4F10020014606E063189D ++:1020E0005A695DF801300130D3710431B4F9103010 ++:1020F0009842F4DB11B030BD2DE9F0410C290446C3 ++:102100000D46164690F853710DD100210122FCF3C3 ++:1021100087F1204600210122FCF33EF1002384F8E0 ++:10212000CE3084F8CD30A36E2046B3F1FF3F08BF18 ++:1021300084F8563129463246FCF392F2B4F86C30FA ++:1021400003F0C003C02B16D1D4F85C319BB194F8D6 ++:102150005331BB420FD9E368A1689868FDF37EF262 ++:10216000E368A1689868D4F85C210123FDF32EF29E ++:102170004FF0FF33A366BDE8F081C046836E10B513 ++:10218000B3F1FF3F01D0FBF39FF510BD2DE9F04106 ++:1021900004460D46866EFCF3C5F6074690B9042248 ++:1021A00004F5AE7005F11401EFF3E6F6D4F85C31F6 ++:1021B0004FF47A7203FB02F3B6F1FF3FC4F85C31CF ++:1021C00008BFA6663846BDE8F081C0460E2937B57F ++:1021D00005468E4614460BD00F2910D1114601A892 ++:1021E0000422EFF3C9F628460199F0F731FE08E022 ++:1021F000B0F85831002003F00103136001E0FCF354 ++:10220000E9F13EBD70B514460546FCF39FF1236825 ++:102210000BB10223AB6570BD70B50D460446FBF3F0 ++:10222000FDF7014610BBA36DEDB1FBB9D4F8542105 ++:102230000F4B02EA03037BB194F85431022B04D113 ++:1022400094F8573113F0010F05E0012B07D194F8F2 ++:10225000573113F0020F02D16FF0010300E00023A9 ++:1022600084F8563102E00BB184F85601084670BD7F ++:10227000FF0000FF10B50446FBF362F7002384F86B ++:102280005731A4F85831C4F85C3184F8563110BD88 ++:102290002DE9F041A2B0882205460C4690F8558100 ++:1022A00090F8567190F854616846EFF365F6284649 ++:1022B0002146FBF3AFF60246002836D1009B85F895 ++:1022C00056719E4285F854612CD01BB995F8573150 ++:1022D00073B112E0022B04D195F8573113F0010FBE ++:1022E00005E0012B07D195F8573113F0020F02D109 ++:1022F0006FF0010314E096B90DE0012E02D113F046 ++:10230000010F05E0022E05D195F8573113F0020FA9 ++:1023100005D107E036B995F85531434502D200237F ++:1023200085F85631009B85F85431104622B0BDE83F ++:10233000F081C0462DE9F04104460E46154690F85E ++:102340005671FBF363F48646A0B92A4601460DE0B8 ++:102350007318DB88083113F0100F06D194F8573149 ++:1023600043F0010384F8573102E0083A072AEFD816 ++:1023700084F856717046BDE8F081C0462DE9F04101 ++:1023800004460D46164690F85671FBF3DBF386467D ++:1023900098B9294632460CE04B6A13F0100F06D16B ++:1023A00094F8573143F0020384F8573103E0383A88 ++:1023B0003831372AF0D884F856717046BDE8F0817C ++:1023C000002070472DE9F0410B4C07460E460025D2 ++:1023D0000BE038462146EFF3A1F620B923799E425F ++:1023E00001D1A06806E001350C34044B1B689D4206 ++:1023F000EFD30020BDE8F08120FC0100F02B0200AB ++:1024000070B50D4600240AE00849284601EBC401D6 ++:102410000422EFF395F508B9013005E00134044BCF ++:102420001B689C42F0D3002070BDC04620FC010018 ++:10243000F82B020010B5034C216033F0F9DA0023C9 ++:10244000236010BD082C02002DE9F0412A4B0646FE ++:10245000D3F800800F4600250BE0284B304603EBF5 ++:10246000C5042146EFF35AF610B9E3789F4241D0F4 ++:1024700001354545F1D1224B0025D3F800800FE00E ++:10248000204B304603EBC5042146EFF347F630B945 ++:10249000E3789F4203D11C4B01221A7010E00135F2 ++:1024A0004545EDD117BB194B3D46D3F800800AE0F6 ++:1024B000174B304603EBC5042146EFF32FF608B95E ++:1024C000201D17E001354545F2D1124B124DD3F8CE ++:1024D0000080002408E029463046EFF31FF604355B ++:1024E00008B90E4806E001344445F4D13046394677 ++:1024F00032F074DEBDE8F081042C0200E3FB010041 ++:102500009421020018FC010098210200F82B02001F ++:1025100020FC0100FC2B020018FC0100CA0286000E ++:1025200010B5084B02461B783BB1074B1B6898421D ++:1025300003D2064B53F8200010B9104632F026DFC4 ++:1025400010BDC046982102007C200200781F0200C6 ++:1025500010B5084B02461B783BB1074B1B689842ED ++:1025600003D2064B53F8200010B9104633F006DBB7 ++:1025700010BDC04698210200802002008420020085 ++:102580002DE9F04F234B8FB01C68234B82468946C0 ++:10259000D3F800B00CB9204638E0036BA168186985 ++:1025A00007AA00F0FFFD00261C4DB0462BE0A368F3 ++:1025B0006F1F012B03D12878FFF702FF03E015F806 ++:1025C000010CFFF7C5FF694633F00EDC002107ABB5 ++:1025D0001DF80120CB5C1A420FD05046394632F02C ++:1025E000E5DD40B1B9F1000F05D009EB86003946B1 ++:1025F0000422EFF3DDF5013602E001311C29E6D1BA ++:1026000008F101080835D845D1D130460FB0BDE8F2 ++:10261000F08FC046082C0200F82B020025FC0100B8 ++:10262000012902D14FF6FF7010E0D0F8BC304FF016 ++:102630000002082BD0F8B03008BF41F40071A3F8B5 ++:10264000D813B3F8DA33A0F8202698B27047C04602 ++:10265000D0F8B030A3F8D813A3F8DA237047C046F7 ++:10266000D0F8B0300021A3F8D8134FF0010230B5F4 ++:10267000B3F8DA434FF00205A3F8D823B3F8DA230E ++:10268000A3F8D853B3F8DA3392B29BB2A0F820166D ++:10269000C4F3031040EA047042EA032240EA023025 ++:1026A00030BDC04670B505460E461446FFF7B8FF6C ++:1026B000314600EA04022846FFF7CAFF70BDC04653 ++:1026C00070B505460E461446FFF7AAFF40EA04021D ++:1026D0003146284692B2FFF7BBFF70BD2DE9F041AD ++:1026E0001546064688461C46FFF79AFF2C4020EA0E ++:1026F000050222433046414692B2FFF7A9FFBDE8EA ++:10270000F081C0462DE9F0411C46069B9046198099 ++:10271000079D0E46FFF784FF089B28801E802B88AC ++:1027200004EA080423EA0803099A23431380BDE856 ++:10273000F081C046D0F8B0304FF00002A3F8FC138F ++:10274000A0F82026B3F8FE0380B27047D0F8B0306E ++:1027500041EA0242C3F8FC237047C046D0F8B030CB ++:10276000A3F8FC13B3F8FE130A40A3F8FE234FF0BE ++:102770000003A0F82036704710B5D0F8B040A4F898 ++:10278000FC13B4F8FE339BB21A434FF00003A4F8D5 ++:10279000FE23A0F8203610BD10B5D0F8B04013408D ++:1027A000A4F8FC13B4F8FE1389B221EA02010B432A ++:1027B000A4F8FE334FF00003A0F8203610BDC04649 ++:1027C0002DE9F04106460C462CE0254635F8023B43 ++:1027D000571E990403F44043890CB3F5804F11D080 ++:1027E00001DC3BB11CE0B3F5004F10D0B3F5404F16 ++:1027F00012D015E03046628835F8023FFFF7CCFF73 ++:10280000013F0DE030466288FFF7A0FF08E0304648 ++:102810006288FFF7A3FF03E030466288FFF7ACFF52 ++:10282000AC1C7A1E002AD0DCBDE8F0812DE9F04115 ++:102830001C46069B90461980079D0E46FFF77AFFBF ++:10284000089B28801E802B8804EA080423EA0803DA ++:10285000099A23431380BDE8F081C04600234FF05E ++:10286000FF3280F8E33041F21A03C25403F59B7340 ++:10287000C254704710B531B140F23B414FF6F87287 ++:10288000FFF76CFF03E002490422FFF799FF10BD38 ++:102890002E03020060B1B0F8DE00B0F5006F05D085 ++:1028A000B0F5406F04D1A0F5386002E0402000E0B0 ++:1028B00000207047012380F8E130704780F824162B ++:1028C0007047C04690F924067047C0467047C0461E ++:1028D00010B1C06900B141777047C04610B1C069FE ++:1028E00000B101777047C04610B590F8E330044658 ++:1028F000002B49D14FF064014FF44872A0F88428AE ++:10290000A0F87C18A0F87E18C0F880381A46A318E2 ++:1029100002324FF06401102AA3F88618F7D14FF065 ++:102920000003A4F82E38A4F8AC37A4F8AE374FF063 ++:102930000A034FF00A02A4F83E38A4F83C38A4F881 ++:102940004038636A4FF01401A4F83228A4F84428F0 ++:10295000A4F83428A4F84628A4F82A28A4F828289B ++:10296000A4F82C28A4F89027A4F892274FF050023E ++:10297000A4F83018A4F89427A4F842180BB1204604 ++:102980009847012384F8E33010BDC04610B5FFF727 ++:1029900067FE10BD2DE9F84F0C46D1F810A00D6868 ++:1029A0009B468968E368064643EA812311469AB24A ++:1029B000BDF82880FFF7CAFE0027B9461EE0BAF12D ++:1029C000200F0BD159F8052030465946120CFFF75D ++:1029D000BDFE39F80520304641460AE0BAF1100F35 ++:1029E00004D135F817203046414602E07A5D304682 ++:1029F0004146FFF7ABFE013709F1040963689F42C6 ++:102A0000DDD3BDE8F88FC0462DE9F74F0D460193A1 ++:102A1000D1F810B00E68EB688968074643EA812355 ++:102A200011469AB2BDF83090FFF790FE4FF00008C3 ++:102A3000C24626E0BBF1200F0FD149463846FFF7CA ++:102A400079FE019904464AF806003846FFF772FEFF ++:102A500044EA00444AF806400FE0BBF1100F06D1EB ++:102A600038464946FFF766FE26F8180005E0384666 ++:102A70004946FFF75FFE08F8060008F101080AF171 ++:102A8000040A6B689845D5D3BDE8FE8F7FB50293E5 ++:102A9000089B03910593099B0192049301A90A9B4A ++:102AA000984707B000BDC0467FB50293089B0391CD ++:102AB0000593099B0192049301A90A9B984707B0CB ++:102AC00000BDC0460B46D0F8F81012B141EA03032E ++:102AD00001E021EA0303C0F8F830704700B5D0F8F0 ++:102AE000F8308E4621B143F01003C0F8F83012E000 ++:102AF00023F0100312F0010FC0F8F8300BD041F2B0 ++:102B0000D413C258C369196A986E814294BF714642 ++:102B1000091AC2F8901000BD00207047A0F8DE101E ++:102B20007047C046A0F8DA107047C046B0F8DA0027 ++:102B30007047C04640F6C313984201D800200BE00E ++:102B400041F2C843984201D8012005E041F24463B4 ++:102B500098428CBF032002207047C0467047C04691 ++:102B600000B5002286460748910030F822307345B0 ++:102B700002D10B18588803E001320E2AF3D100204D ++:102B800000BDC046A8FC010010B5C8B2FFF7E8FFC1 ++:102B9000FFF7D0FF10BDC04610B541F22823C45C3A ++:102BA0004FF0000C134B3CF803E0BEF10E0F8CBF4E ++:102BB0004FF480524FF400524EF4306342EA030067 ++:102BC0002CB1BEF1940F02D9BEF1A50F0AD902298A ++:102BD00003D1BEF10E0F0BD904E0012902D1BEF1E1 ++:102BE0000E0F05D80CF1040CBCF1380FDAD1FF2020 ++:102BF00010BDC046A8FC010010B590F8B2321446D2 ++:102C00000B6090F82B3653B190F8F83690F92A26DD ++:102C100023B1534243F080430B6000E00A6014B1DB ++:102C200090F8F7362370002010BDC04610B58646D8 ++:102C30001C4641F21B031EF8033002989B000E292C ++:102C4000137008D80028ACBF0EEB00030EF1000390 ++:102C500093F81E3127E07F23237030EA200028BF3D ++:102C600004200022114BD35A994202D00432382A50 ++:102C7000F8D1A1F122031E2B04D80EEB000393F828 ++:102C800083312370A1F16403282B04D80EEB0003D9 ++:102C900093F8E8312370A1F19503102B04D80EEBC3 ++:102CA000000393F84D32237010BDC046A8FC01000C ++:102CB0002DE9FF4700250746884691469A46FF269C ++:102CC0002C461EE0009341460DF10E020DF10F035C ++:102CD0003846FFF7ABFF41F2E623FA5C9DF80F1090 ++:102CE00053B2994201DC002302E0C2EB0103DBB2E4 ++:102CF0008DF80F30AB4228BF1D46B34238BF1E4689 ++:102D00000134142CE3B2DDD189F800508AF8006058 ++:102D1000BDE8FF877047C04690F829067047C04657 ++:102D2000B0F8DA3003F47043B3F5805F09D1032AB9 ++:102D300018DDA2F16503032B14D9A2F1C9030F2BEF ++:102D400010D9132A0EDCA2F13403642B0AD9A2F1A4 ++:102D5000A9031F2B06D9A2F1D103072B94BF002092 ++:102D6000012000E00020704770B590F8DA5004466A ++:102D70002846FFF7F5FEB4F8DA3003F47043B3F5F4 ++:102D8000005F01D0002004E02B1903F59A530F33A4 ++:102D9000187940B270BDC04600B54FF0000E00EB90 ++:102DA0000E021EF801300EF1010EBEF1040F82F882 ++:102DB0002C36F4D14FF0000E01EB0E0200EB0E03A7 ++:102DC00012790EF1010EBEF1080F83F83026F3D10F ++:102DD00000BDC04680F8E0107047C046C3699961E5 ++:102DE0007047C04680F8D5104176704780F8D910FA ++:102DF0007047C0467047C04690F81A067047C046F4 ++:102E000041F22403C35C33B141F21C2380F81A164B ++:102E100080F81B16C154704790F8D83013B10023C6 ++:102E200080F8D83000207047C369012093F88130C2 ++:102E30000B70704722B10023C0F8E83FA0F8EC3FC8 ++:102E400000F58153012019607047C0460022C16916 ++:102E500010460B1893F982300130D2180828F8D1A7 ++:102E600092FBF0F040B270477047C0466FF016001A ++:102E70007047C04670B541F21E23C35C04468B42C6 ++:102E80000D46164603D0D0F8883003B1984704F5B4 ++:102E900091531E8041F21E23E55470BD0021C36989 ++:102EA000CB180131082983F88220F8D10021C369A9 ++:102EB0006FF05B02CB180131082983F88220F6D12C ++:102EC000C2690023C2F88C30D36E032B08D1D0F82E ++:102ED000F83F13F0010F03D0136A0833C0F8F03F36 ++:102EE00000F58A531233002204E0002241F2D2138B ++:102EF000C25470474FF6A47101321980198402330D ++:102F0000102AF7D1F1E7C04649F675334B6000232C ++:102F10000B60F0B50C469842ACBF01214FF0FF3179 ++:102F200003F5340301FB03F103F53403081890FBA8 ++:102F3000F3F202FB1303581A03D4C31301335B10DB ++:102F400004E04342DB1301335B105B425A2BD4BFD6 ++:102F50000023012313B1A0F5340014E0002803DBA3 ++:102F6000C31301335B1004E04342DB1301335B10F6 ++:102F70005B4213F15A0FACBF002301230BB90126AA ++:102F800003E000F534004FF0FF364FF0000EF4463A ++:102F90007546604561682268144F0BDD41FA0EF3F7 ++:102FA0009B18236042FA0EF3C3EB01036360EB59F5 ++:102FB0009C440BE041FA0EF3C3EB0203236042FA98 ++:102FC0000EF35B186360EB59C3EB0C0C0EF1010EB2 ++:102FD0000435BEF1120FDCD1636806FB03F36360B6 ++:102FE000236806FB03F32360F0BDC046F4FC010038 ++:102FF00080EAE071A1EBE0710022D0B251FA00F357 ++:103000000132002BF9DC70470146002000B58646EE ++:103010004FF0804343FA0EF31A188A424FEA5000E9 ++:1030200002D8891A43EA00000EF1020EBEF1200F09 ++:10303000EED1884238BF013000BDC046C36983F875 ++:103040009010C36983F89120C36983F89210C36913 ++:1030500083F893207047C046C36983F89210704785 ++:1030600041F21633C256013BC0568242B4BF012022 ++:10307000022070470048704750FD01000020704753 ++:103080007047C046084670470020704741F2D81389 ++:10309000C05803E0C3888B4202D000680028F9D1F1 ++:1030A0007047C04610B5B0F8DA10FFF7EFFF10BD5B ++:1030B000C3699B6913F0005F09D0D0F8B0304FF0BE ++:1030C0000302A3F8B4264FF0FF02A3F8B826704716 ++:1030D000D0F8F83013F0060F0CBF00200120704725 ++:1030E0002DE9F0410F46B0F8DA10044615461E46A9 ++:1030F000FFF74AFD40B9B4F9FC302B60B4F9FE305B ++:103100003360B4F900313B60BDE8F081D0F8A8002D ++:103110007047C04670B541F2D813C15805460AE061 ++:103120000B6841F2D8142B51EB694FF43D7298684B ++:10313000F3F3DEF529590029F2D141F2D81305F550 ++:1031400090523032E950043BEA504FF6CE70F033E3 ++:10315000E852C2F8901070BD10B590F8E93094B004 ++:1031600043F0010380F8E93004460021302201A831 ++:10317000EEF366F7002110220DA8EEF361F70021AF ++:10318000042213A8EEF35CF711A800210822EEF345 ++:1031900057F794F8E930002023F0010384F8E93070 ++:1031A00014B010BD70B506460D46104614460021F9 ++:1031B0001C22EEF345F700200F4BC25A41F22823A0 ++:1031C000F35C1BB1942A01D9A52A10D9022D02D192 ++:1031D0000E2A04D90BE0012D09D10E2A07D9D108F6 ++:1031E00002F0070301229A40635C134363540430E6 ++:1031F0003828E1D170BDC046A8FC010010B50C46CE ++:10320000002103F025F82070012010BD10B5002129 ++:1032100003F01EF840B210BD41F2D41310B5C458EB ++:10322000F433C15819B1C36918693DF095DA002328 ++:103230006370A37010BDC04610B59E462BB941F215 ++:103240000723C35C704613600FE041B1012906D02B ++:10325000022904D0032902D06FF01C0005E041F2DE ++:103260000723C154FFF7D8FF002010BD41F2C82347 ++:10327000C15810B509B9084607E0C36918693DF09F ++:103280006BDAD0F1010038BF002010BD10B541F25B ++:10329000F423C35C0BB104F097FD10BD10B503F02F ++:1032A000B5FB10BDC36970B5DC681B6D054613F036 ++:1032B000010F0E4608D02046F7F3FAF520B1EB696E ++:1032C0009B6913F0005F12D1EA69136D13F0010FCF ++:1032D0003BD0536D13F0800F37D1D068F7F386F7EA ++:1032E000002832D0EB699B6913F0005F2DD0D5F830 ++:1032F000F83013F0020F28D1EEB106F47043B3F5A5 ++:10330000005F18D163691149232BB4BF00230C233C ++:10331000F2B2B8BF0F2120469A400123F7F3D0F54F ++:1033200063690B49222B2046D8BF7021CCBF4FF4D4 ++:103330000072102206E0636904492046222BD8BFA0 ++:103340000F2100220123F7F3BBF570BD00F05555A6 ++:10335000000E5555D0F8B030C269D3F82031136D46 ++:1033600070B513F0010F04460D4608D0D068F7F38E ++:103370009FF520B1E3699B6913F0005F11D1E26909 ++:10338000136D13F0010F18D0536D13F0800F14D18B ++:10339000D068F7F32BF780B1E3699B6913F0005F06 ++:1033A0000BD025B920462946FFF77CFF0AE02046CE ++:1033B000B4F8DA10FFF776FF00E01DB104492046AB ++:1033C000062202E0034920460E22FFF7F9F970BDFC ++:1033D000360302008CFC010010B514299E46D0F87B ++:1033E000A82004D015290CD06FF016000CE092F93B ++:1033F0001A3002A941F8043F70460422EEF3BCF5EE ++:1034000001E0039B9376002010BDC04610B590F8F4 ++:103410001A360C462BB10231224601F091FDA378F9 ++:10342000637010BD10B5012103F072FA10BDC046E3 ++:103430002DE9F0418A79CB790D4642EA03216B7977 ++:103440002A79074642EA0328C3695B690A2B07D930 ++:10345000EB7C1B0213F4807002D10123EB7735E083 ++:103460002A7A6B7A384601F0FF0442EA0326FFF716 ++:103470004DFE7F2C1B4AC8BFA4F58074B30AD356F7 ++:1034800090F85F00E21818F4006F14BF41F23B336C ++:1034900041F23A33FB56D11843B2C918AA7DEB7DED ++:1034A0007F2942EA0322C2F3C702C8BFA1F5807197 ++:1034B0000E2AD4BF4FF400534FF4805342F43062CD ++:1034C000384649B243EA0202FFF7DCFD6A79C1B22D ++:1034D0002977384649B2C2F3801201F00DFBBDE8EE ++:1034E000F081C0461A22020010B590F8E9309646E5 ++:1034F00053B313F0010F19D0D0F8F0308B420FD135 ++:10350000C369D3F88C209B1883F882E0C269D2F893 ++:103510008C30072B01D1002300E00133C2F88C303E ++:1035200090F8E93023F0010380F8E93090F8E930B1 ++:1035300013F0020F08D023F0020380F8E930C369CA ++:10354000724618693DF01CD910BDC04690F8E930AC ++:1035500010B5ABB9012902D0022902D003E0C0F8AE ++:10356000F02080F8E910C3691B6AC0F8EC3041F222 ++:103570000503C35C23B111466FF05E02FFF7B4FF91 ++:1035800010BDC04637B5044602F01CFFE3691A6A55 ++:1035900001321A6294F8E830002B77D041F262339E ++:1035A000E35A1BB1A4F86E38A4F8703841F26633C0 ++:1035B000E35A1BB1A4F86838A4F8643841F26433C4 ++:1035C000E35A1BB1A4F86238A4F86638E369196AB3 ++:1035D0001A6EB1FBF2F302FB131323B92046B4F8C1 ++:1035E000DA10FFF75FFED4F8F83013F00E0F05D1B4 ++:1035F0002046012194F8DA20FFF7A8FF94F8E9307B ++:103600004BB1E369D4F8EC201B6A9B1A052B02D955 ++:10361000002384F8E93041F22805615929B1E369B2 ++:103620001A6A1B6E521A9A420BD3D4F8F83013F070 ++:10363000020F06D12046FFF76FFA10B1E3691B6A4B ++:103640006351D4F8F83013F00F0F1FD1D4F88C3039 ++:103650000BB120469847E36918693DF005D868B179 ++:10366000E36901A918690DF107023DF007D820466A ++:103670009DF80710BDF80420FFF7FCFBD4F8F830E4 ++:1036800013F00F0F02D1204603F0C0F900203EBD19 ++:1036900010B50446FFF74AFA0221C2B22046FFF7EE ++:1036A00055FF10BDC36973B5012983F88110044625 ++:1036B0000D46C36906D9186901220323009300212E ++:1036C000134605E0186900210323009301220B46ED ++:1036D0003CF0FADFE269537F002B30D0D4F8B030F1 ++:1036E000D3F8203183F0010313F0010602D11069F1 ++:1036F0003DF050D8012D0FD90222134620464FF439 ++:103700008261FFF749F820464FF482610122022DC1 ++:1037100014BF002301230BE020464FF482610222F4 ++:103720000023FFF739F820464FF4826101222B462F ++:10373000FFF732F81EB9E36918693DF017D87CBD70 ++:10374000C36970B547F67F750446582118692A4643 ++:103750003CF0EEDFE3695A2118692A463CF0E8DFC5 ++:10376000E369702118692A463CF0E2DFE3697221BF ++:1037700018692A463CF0DCDF70BDC046F7B5C26967 ++:103780000546537F002B62D090F81A36002B45D0A7 ++:10379000106928213F223CF0CBDFEB692421186916 ++:1037A00010223CF0C5DFEB6995F82926186926211F ++:1037B00012013CF0BDDFEB6932211869B5F8FC2637 ++:1037C0003CF0B6DF2E460027EB691869204BF95C08 ++:1037D0003CF086DFEB6996F914250446A11D1869B3 ++:1037E00092B23CF0A5DF96F914250223E96992FB19 ++:1037F000F3F25242086992B204F10E0101373CF033 ++:1038000097DF0136082FDFD1EA690323009310699F ++:103810008022012113463CF057DF18E001460420C6 ++:1038200091F914350822073393FBF2F3DB000130E2 ++:1038300081F8143501310C28F2D195F91425EB6982 ++:10384000073218694E21C2F3CF023CF071DFFEBD92 ++:103850002503020010B5012102F0B6FC40B210BDF4 ++:1038600010B500210446621801317F23652982F8D2 ++:103870009136F8D12046FFF7EDFF2046FFF7C6FC52 ++:1038800010BDC0462DE9F04FB0F8DA30A5B003F412 ++:103890007041B1F5805F14BF022201220592D0F879 ++:1038A000A83004460693C3695A6C40F239539A42D1 ++:1038B00004D052339A4201D0002304E0B1F5805F76 ++:1038C00014BF00230123DBB2002165220DF1290082 ++:1038D0000893EEF3B5F3B4F8DAA00AF44073B3F545 ++:1038E000407F02D15FFA8AF810E0B3F5007F5FFAFB ++:1038F0008AF104D1DD2904D801F1020806E0022989 ++:1039000002D84FF0000801E0A1F102082046059915 ++:10391000FFF7A6FF2046FFF727FA4FF0000BC0B2D3 ++:10392000FF255E4607900395CDF810B070E0204665 ++:1039300051462A46FFF7F4F9002867D005EB040941 ++:1039400099F8B26224AA571907F8676C94F8AC305A ++:1039500043B1059A204641462B46FFF78FFB3018AE ++:1039600007F8670C41460DF18E020DF18F032046DA ++:103970000095FFF75BF999F82C269DF88F309A4255 ++:1039800034BF1146194641F2E623E25C53B2994234 ++:1039900001DC002002E0C2EB0103D8B224AB5919CC ++:1039A00011F8673C984234BF02461A4601F8672C6A ++:1039B00094F8E030642B06D803FB02F3642293FBF7 ++:1039C000F2F301F8673C11F8673C9DF88E20079EE2 ++:1039D0009A4238BF1A462B1993F891368DF88F000A ++:1039E000934294BFC6EB0306C6EB0206049AF3B2F9 ++:1039F0005B4588BF2A46049201F8673C039D5B45FE ++:103A000028BF9B46AB4238BF1D460395099E013631 ++:103A10000996099A142AD5B289D104F5A260002129 ++:103A20005132EEF30DF3039B049D84F8293684F89C ++:103A30002A360023184684F818B684F8F83684F835 ++:103A4000195616E024AE731813F8672C94F81A363A ++:103A5000091981F875250BB1089B1BB194F818362C ++:103A60009B1A03E094F82936C3EB020381F8103562 ++:103A700001301428C1B2E5D121460020069D91F9FC ++:103A80001035B5F9E623D218431CD8B281F81025B9 ++:103A900001310428F2D1E36A0BB12046984725B0E2 ++:103AA000BDE8F08F70B505460E462C46FFF774F959 ++:103AB000294600203218137D03B91379013081F8AB ++:103AC000383601310828F5D10021721892F84430B7 ++:103AD00003B91379013184F8483601340829F4D147 ++:103AE000EB6918693CF056DE2846FFF7CBFEEB6920 ++:103AF00018693CF03BDE70BD7F2970B5044601D9E2 ++:103B0000052028E0002213190132652A83F8B21239 ++:103B1000F9D10023E26984F8F736137FD3B1D4F8E2 ++:103B2000F83013F0020F15D1D4F8B030D3F82031AB ++:103B300083F0010313F0010502D110693CF02ADE85 ++:103B40002046FFF79FFE2DB9E36918693CF00EDEB1 ++:103B5000284600E0002070BD70B5054600F52C70C9 ++:103B6000042202300C46EEF307F205F52C70211DFD ++:103B700008220630EEF300F205F52E70082206301A ++:103B800004F10C01EEF3F8F105F538700822063067 ++:103B900004F13401EEF3F0F105F53A700822063035 ++:103BA00004F13C01EEF3E8F105F53070082206302F ++:103BB00004F11401EEF3E0F105F53270082206304D ++:103BC00004F11C01EEF3D8F105F53470082206303B ++:103BD00004F12401EEF3D0F105F536700822063029 ++:103BE00004F12C01EEF3C8F105F53C700822063013 ++:103BF00004F14401EEF3C0F105F53E7004F14C010F ++:103C000008220630EEF3B8F105F5407008220630C0 ++:103C100004F15401EEF3B0F105F5427006300822CC ++:103C200004F15C01EEF3A8F194F8643085F81633E2 ++:103C3000D5F8B030D3F8203113F0010309D11C4678 ++:103C40002846FFF71FFE54B1EB6918693CF08EDD82 ++:103C500005E0EB69012418693CF09CDDF0E770BDDC ++:103C60002DE9F0410F460546FFF710FA07F47043BF ++:103C7000B3F5805FEB69FAB208BF42F48072044684 ++:103C8000A02118693CF054DDAE6A2CB104F517721E ++:103C900041F2D413EA5005E005F59053303341F278 ++:103CA000D412AB5016B128463946B0472CB341F276 ++:103CB000D413EA58537873B1EB6941F2C8242959F7 ++:103CC00018693CF049DDEB6900221869295913464F ++:103CD0003CF0C0DC11E041F20723EB5C6BB1032B3D ++:103CE0000BD0E969D2F890200B6A9B1A8A6E934236 ++:103CF00003D328460221FFF7D5F928463946FFF7B6 ++:103D0000D1FABDE8F081C046E02910B50B46044663 ++:103D100002DD6FF0120012E043F430630E29D4BFCD ++:103D20004FF400514FF48051194389B2FFF798FFC7 ++:103D30000123204684F8D83008F092FF002010BDFF ++:103D400070B50C460546FFF767F844B9284605F0FC ++:103D5000D9FE28464FF4404106F0AEF910E0214666 ++:103D600028460022FFF7D0FF044648B928462146DE ++:103D70007022234605F04AFB28465E2106F0EEFD40 ++:103D8000204670BD2DE9F0410D460446FFF744F88A ++:103D900045B92046294602F0B3FC2F4641F2D42310 ++:103DA000E55213E0204629460122FFF7ADFF074602 ++:103DB00060B941F2D426A35B23B920460A21FEF75D ++:103DC000B9FCA0532046294602F09AFC3846BDE8CB ++:103DD000F081C04670B50E460546D0F8B040FFF7FA ++:103DE0001BF83EBB41F2D6240A2128462A5BFEF787 ++:103DF000ADFC284640F24B413246FEF7A7FC284670 ++:103E0000314602F0DDFBEB692E531B6D13F0020F00 ++:103E100056D041F2D823D5F8B020EB5A4FF47A703F ++:103E2000A2F89C3441F2DC23EB5AA2F89E34F2F360 ++:103E300093F445E0EB691B6D13F0020F1FD0D5F82A ++:103E4000B01041F2D822B1F89C344FF47A709BB292 ++:103E5000AB50B1F89E3404329BB2AB50B4F89C34F2 ++:103E600023F400731B041B0CA4F89C34B4F89E3498 ++:103E70009BB243F40073A4F89E34F2F36DF4314620 ++:103E800028460122FFF740FF0646C8B941F2D62472 ++:103E90002B5B5BB90A212846FEF74CFC40F24B41F4 ++:103EA00028534FF6FF722846FEF750FC28460121A2 ++:103EB00002F086FB28460A214FF49472FEF75CFC60 ++:103EC000304670BD2DE9F0418AB005AED0F8B07033 ++:103ED00005468846142238493046EEF34DF0142248 ++:103EE00036496846EEF348F0EB6900216C461869E4 ++:103EF000142288450CBF234633463CF023DC4FF0A8 ++:103F00000003A7F86835B8F1000F4FF48073A7F8E5 ++:103F1000C0370CBF40234123A7F80C3541F60223DC ++:103F2000A7F814354FF00003A7F80835A7F80A35AD ++:103F3000A7F84C354FF01403A7F86A3540F626036E ++:103F4000A7F868354FF00003A7F800354FF0D0030D ++:103F5000A7F80235B7F802350CBFFA251E25002454 ++:103F600002E00A20F2F3F8F3AC420ADAB7F80E35B1 ++:103F7000013413F0800FF4D103E00A20F2F3ECF3E4 ++:103F800000E0002401340B2C09D0B7F80E3513F4EF ++:103F9000806FF2D003E00A20F2F3DEF300E00024A9 ++:103FA00001340B2C04D0B7F8903613F4807FF2D193 ++:103FB0000AB0BDE8F081C046E0FC01003CFD010014 ++:103FC00070B590F8E2200446002A6CD1012380F8F5 ++:103FD000E230D0F8B030A0F8DA10D3F8203100F594 ++:103FE00081531A60D0F8F82012F0020F06D190F831 ++:103FF000803E1BB942F02003C0F8F830256A002D3E ++:1040000051D001212046FEF735FCB4F8DA30B4F87F ++:10401000DE2003F44061914203D0E36918693CF06B ++:1040200035DB012141F2CD23E1542046FFF792F91F ++:104030002046A847002384F8E1302046FFF79EFB86 ++:10404000E369204693F88110FFF72CFBE26992F8B0 ++:104050008030012BB4F8DA300BD103F47043B3F5A0 ++:10406000005F01D1936F0BE0D36F012B88BF00235A ++:1040700006E003F47043B3F5005F0CBF136F536F9A ++:10408000D366E3690022D96E2046FEF7D3FE0023F3 ++:1040900084F8E230E369922118693CF02BDB41F2AD ++:1040A00022234000E05270BDC36910B518693CF08E ++:1040B0002BDB10BDC36910B518693CF02FDB10BDB8 ++:1040C000F7B5089F04460D461E463BB1032A05D9A5 ++:1040D000684619460422EDF34FF701E000230093F0 ++:1040E000A82D009900F0FB8015DC5C2D00F0AE805F ++:1040F00008DC3C2D00F0A0804A2D00F093801B2DA1 ++:104100002AD020E05E2D30D0C0F2A8805F2D3DD0B7 ++:10411000872D1BD017E0C32D75D006DCAA2D49D002 ++:104120007BDBC22D00F0DB800DE0D42D00F0AB80F6 ++:1041300003DCD32D00F09B8005E0A5F59A73033BCB ++:10414000012B40F2D2806FF01605CFE02046FEF73B ++:104150007DFE40B23060C8E0E3691D7F002D40F075 ++:10416000B8802046FEF77AFBC0E001233B70E3698C ++:104170005B7F002B00F0B0802046FFF79BFF2046BE ++:10418000BDF80010FEF7D6FA30600FE001233B7057 ++:10419000E3695B7F002B00F09F802046FFF78AFFDA ++:1041A000009A204691B2120CFEF7D0FA2046FFF793 ++:1041B0007BFF9AE0E269537F002B00F08D8010694D ++:1041C0003CF0E8DA00252046FFF774FF3560D4F8AC ++:1041D000BC30082B13D10DF1060220460DF107016A ++:1041E0008DF807508DF8065000F0AAFE9DF90720C3 ++:1041F0009DF9063092B29BB243EA02233360204617 ++:10420000FFF752FF60E0E3691B7F002B6AD0338821 ++:10421000022B64D96FF0010568E0E3691B7F002B76 ++:1042200060D05CE0E3691B7F002B52D1236B002B35 ++:104230005BD02046984718E0E3691B7F002B48D1EC ++:1042400020467268B368FFF7C5FD0EE0E3691B7F87 ++:10425000002B3ED12046FFF773FD06E0E3691B7F8C ++:10426000002B36D12046FFF78DFD05463EE0E36981 ++:10427000DA6E3260D4F8F83F13F0010F35D042F017 ++:104280008003336031E0042902D96FF01C052DE072 ++:10429000E269D36E8B4228D0137FD1662BB31069AD ++:1042A0003CF078DA009B23B1204600210122FEF782 ++:1042B000C1FDE36901222046D96EFEF7BBFD00284F ++:1042C00014BF00256FF00205E36918693CF04EDA6F ++:1042D0000CE06FF0040509E06FF00A0506E06FF0EE ++:1042E0000C0503E06FF0030500E000252846FEBD45 ++:1042F0002DE9F04389B09946109B0026032B074611 ++:104300000C46DDF84480139D079604D907A849465A ++:104310000422EDF331F6079940F286230A1E18BFF6 ++:1043200001229C4200F013812CD80C3B9C427CD093 ++:104330000FD8532C08D8522C80F04081502C00F01C ++:104340003D81512C6AD02DE140F26A239C4250D02D ++:1043500028E1B4F5207F00F0E48009D840F27B2307 ++:104360009C4200F0A48003339C4200F0D58019E108 ++:10437000B4F5217F00F0E48040F285239C4200F0F8 ++:10438000DB800FE140F2D6239C4200F0178114D865 ++:10439000413B9C423ED006D8043B9C4234D0023381 ++:1043A0009C4234D0FEE0B4F5277F00F0D78040F285 ++:1043B0009D239C4200F0D680F4E040F2DD239C4235 ++:1043C00000F0EB8008D8033B9C4200F0D180B4F5AC ++:1043D000377F00F0D680E5E0B4F53D7F00F0F38054 ++:1043E000C0F0E080A4F53E73063B012B00F2DA80BA ++:1043F000E9E03846FFF75EFE38464146FFF706F82B ++:104400003846FFF751FE50E041F2623304E041F2DA ++:10441000643301E041F26633F95246E00123009330 ++:1044200038464346FEF722FDCFE0FA69137F13B901 ++:104430006FF00300C9E0D7F8B030D3F8203183F033 ++:10444000010313F0010902D110693CF0A3D93846E9 ++:10445000FEF72EFE3846FFF72DFE41F2E61341F23D ++:10446000E910F95C385C0133FA5C013317F803E0BA ++:10447000009041F2EA103D5C01303C5C1630385C43 ++:10448000734603903846019502940496FEF764FE45 ++:10449000C8F800003846FFF707FEB9F1000F40F0FA ++:1044A0008D80FB6918693CF061D930468DE0C1F31D ++:1044B000036CBCF1010F00F28380C1F3015EBEF119 ++:1044C000010F7DD8C1F38155032D79D0C1F3034489 ++:1044D000012C75D8C1F30722A2F10A03DBB2052B28 ++:1044E0006ED8C8B2012801D9032869D10E2A28BF85 ++:1044F0000E2241F2E613FA540133F8540133FC540E ++:10450000013307F803E00133FD54013307F803C01A ++:104510000A0F1633FA54C8E708A9012341F8043DED ++:1045200007E0B7F8DA103846FEF72EFB08A941F885 ++:10453000040D40462A462DE041F21B03F954B4E72E ++:1045400041F21B03FB5C08A941F8043D17E0D7F8D2 ++:10455000F830C3F30013C8F80030A6E738464246E7 ++:10456000334602E0384642460123FEF765FE9CE7EB ++:104570000121384601F03AFF08A941F8046D404690 ++:1045800007E007AC38463146224601F093FF40462B ++:1045900021460422EDF3F0F487E73846324601F075 ++:1045A00089FF82E701910292384621464A464346F6 ++:1045B0000095FEF711FF10F1170F04D0002004E062 ++:1045C0006FF01C0001E06FF0160009B0BDE8F08349 ++:1045D0002DE9F04391460A6801230B7342F008036A ++:1045E0000B60B0F9FA3685B0B3F1FF3F04BF42F07B ++:1045F00009030B6090F81A3605460C461BB10B6890 ++:1046000043F002030B602F4626464FF0000897F850 ++:10461000B2322846B37749460DF10E030DF10F0271 ++:10462000CDF80080FEF702FB9DF80E3008F101087E ++:1046300086F8B03197F87535013786F8793201364A ++:10464000B8F1140FE3D195F81A3633B3EB691B7F39 ++:104650001BB32846FFF72EFD95F818362846A3759C ++:1046600095F81836E37595F81936A37695F8193646 ++:10467000E37600F05BFC236810B143F0030301E034 ++:1046800023F003032846236004F10D0104F1150211 ++:1046900000F056FC2846FFF707FD05B0BDE8F083A3 ++:1046A00010B5054B1B78012B03D1013B18461B703D ++:1046B00001E014F00BFE10BD3C28020010B5054BC4 ++:1046C0001B78012B03D1013B18461B7001E014F04D ++:1046D00023FE10BD3C2802002DE9F04105460E46A0 ++:1046E00017461C46FFF7EAFF30B1234628463146FD ++:1046F0003A4614F04BFE04462046BDE8F081C04621 ++:1047000010B50023FFF7E8FF10BDC04610B51446F2 ++:10471000FFF7D4FF20B100210A46EEF319F004465A ++:10472000204610BD10B50022FFF7F0FF10BDC046B7 ++:104730001FB5079B0C890093089B11460193099BA9 ++:10474000224602930A9B03930069069B28F02EDD04 ++:1047500004B010BD00B5B0FBF1FE01FB1E0001F07E ++:10476000010C0CEB51010BE0884228BFC1EB0003A8 ++:104770004FEA4E0E26BF0CEB43000EF1010E400037 ++:10478000531EDAB2FF2AEFD1884228BF0EF1010E84 ++:10479000704600BD00FB01F19202800103FB002086 ++:1047A00001F5004101EB4000490090FBF1F070473A ++:1047B000D0F8A8304FF001025A8670472DE9F04733 ++:1047C00098469DF820308A4691469DF82470B3B1F2 ++:1047D00000246FF000462546204651464A4643468F ++:1047E000FFF7D8FFB04204DA6B1CDDB2BD421AD02D ++:1047F00006460134802CEFD16FF0004013E07F2497 ++:104800004FF0FF361D46204651464A464346FFF7C5 ++:10481000C1FFB04204DD6B1CDDB2BD4203D00646D1 ++:10482000013CF0D22046BDE8F087C04610B5B0F894 ++:10483000DA300446DAB203F47043B3F5005FD0F81F ++:10484000A81003D1531893F8E72486E0702A5ED0AD ++:104850001CD8382A49D00CD82C2A3DD004D8242A78 ++:1048600034D0282A35D02FE0302A38D0342A39D015 ++:104870002AE0642A42D004D83C2A39D0402A3AD0CF ++:1048800022E0682A3DD06C2A3ED01DE0882A50D014 ++:104890000CD87C2A44D004D8742A3BD0782A3CD047 ++:1048A00012E0802A3FD0842A40D00DE0992A49D0D6 ++:1048B00004D88C2A40D0952A41D005E0A12A47D0BF ++:1048C000A52A48D09D2A40D0002246E091F8F6243F ++:1048D00043E091F8F72440E091F8F8243DE091F8A6 ++:1048E000F9243AE091F8FA2437E091F8FB2434E017 ++:1048F00091F8FC2431E091F8FD242EE091F8FE249B ++:104900002BE091F8FF2428E091F8002525E091F8AC ++:10491000012522E091F802251FE091F803251CE013 ++:1049200091F8042519E091F8052516E091F806257F ++:1049300013E091F8072510E091F808250DE091F8B3 ++:1049400009250AE091F80A2507E091F80B2504E013 ++:1049500091F80C2501E091F80D25D1F8E40494F8C4 ++:104960002A36C01A801840B210BDC04608467047AB ++:1049700049B24B1C5B104910C3F10803083141EAEE ++:10498000031188B27047C046B0F8DA3003F47043C0 ++:10499000B3F5005FD0F8A82005D192F83C05FF28B8 ++:1049A00001D0C0B200E000207047C04670B5054697 ++:1049B000D0F8A840FFF7E8FF10B994F8460540B1D9 ++:1049C000B5F8DA3003F47043B3F5005F14BF00208C ++:1049D000012070BD10B50C468EB0D0F8A8109646D8 ++:1049E000002000220DF10603C25401303228F8D114 ++:1049F000BEF1FF3F91F8E93306D114B1B1F93EE5BC ++:104A000003E0B1F940E514E09CB1A02B09D00023EC ++:104A10008DF806308DF807308DF808308DF80930A4 ++:104A200004E000238DF806308DF808308DF80A3048 ++:104A300033E0A02B17D001238DF81A308DF81B30EE ++:104A40006FF0010300228DF81E308DF81F30013306 ++:104A50008DF81C208DF81D208DF820208DF8213038 ++:104A60008DF8242019E002238DF81A306FF003032B ++:104A70008DF81E30023300228DF81F308DF8203063 ++:104A80008DF8213006338DF81B208DF81C208DF811 ++:104A90001D208DF824208DF832300EAA02EB0E0373 ++:104AA00013F9320C0EB010BD30B5C46900F5805357 ++:104AB000226A1B68D0F8A8509A4202D3C3EB0201C5 ++:104AC00001E0DB43991895F8BC2290F8DA309A425D ++:104AD00001D0012004E0A36E994234BF00200120E0 ++:104AE00030BDC0467047C046D0F8A83093F80604E1 ++:104AF000002808BF1020704700B5D0F8A8008E46E7 ++:104B0000D0F8D4240EF0FF0343EA0223110EC0F8BC ++:104B1000D434D0F8D8347F29C8BFA1F5807173444C ++:104B20005B1AC0F8D8349B10C0F8DC3400BDC04616 ++:104B3000844610221B4810B5964600244EF34603C7 ++:104B40005FFA83FE10EA0C0F4FFA8EF104D0884012 ++:104B50000EEB0203DAB203E0C840CEEB0203DAB296 ++:104B60000134042CEAD110EA0C0FD3B201D1013B7D ++:104B7000DAB251B2032301FB03F30329DAB20EDDEB ++:104B8000CB1E2CFA03F00D2801D9D31C06E00A280D ++:104B900001D9931C02E0082801D9531CDAB250B2A3 ++:104BA00010BDC0460000FFFFD0F8A820002382F807 ++:104BB000903382F8913382F8923382F8933382F8FB ++:104BC000943370477047C04670B540F22341D0F827 ++:104BD000A8500446FDF7AEFDC0B2A5F864034FF43B ++:104BE000AA612046FDF7A6FD8005800DA5F86803A3 ++:104BF00040F234412046FDF79DFDC0B27F28C8BF7A ++:104C0000A0F58073A5F8660340F23241C8BFA5F84D ++:104C100066332046FDF78EFDC0B27F28C4BFA0F5E5 ++:104C2000807398B285F8BC0370BDC0462DE9F0478B ++:104C3000884640F2B76104469146FDF77BFD40F29D ++:104C4000B66105462046FDF775FD40F2B5610646A2 ++:104C50002046FDF76FFD40F2B46107462046FDF7A0 ++:104C600069FD4FF0000C6246644650FA04F313F0FD ++:104C7000010101D0012103E00CF101035FFA83FC83 ++:104C8000531CDAB2102A12D001340029EDD00EE004 ++:104C9000A2F1100357FA03F313F0010F01D0012121 ++:104CA00003E00CF101035FFA83FC531CDAB21F2A04 ++:104CB00011D80029ECD00EE0A2F1200356FA03F33C ++:104CC00013F0010F01D0012103E00CF101035FFAA1 ++:104CD00083FC531CDAB22F2A11D80029ECD00EE045 ++:104CE000A2F1300355FA03F313F0010F01D00121B3 ++:104CF00003E00CF101035FFA83FC531CDAB23F2A94 ++:104D000001D80029ECD04FF03F0E00220F2455FAB5 ++:104D100004F313F0010101D0012103E00EF1FF3390 ++:104D20005FFA83FE531CDAB2102A12D0013C00292C ++:104D3000EDD00EE0C2F11F0356FA03F313F0010F9A ++:104D400001D0012103E00EF1FF335FFA83FE531C13 ++:104D5000DAB21F2A11D80029ECD00EE0C2F12F03DD ++:104D600057FA03F313F0010F01D0012103E00EF114 ++:104D7000FF335FFA83FE531CDAB22F2A11D80029C1 ++:104D8000ECD00EE0C2F13F0350FA03F313F0010F31 ++:104D900001D0012103E00EF1FF335FFA83FE531CC3 ++:104DA000DAB23F2A01D80029ECD088F800E089F86F ++:104DB00000C0BDE8F087C04670B50D4640F23941ED ++:104DC0000646FDF7B7FCC0F3C210E88040F2B541DB ++:104DD0003046FDF7AFFC40F2FB4104463046FDF79C ++:104DE000A9FC04F0FF03C0B2C4F307242B806C803D ++:104DF000A88070BD2DE9F047B0F8DA30074603F41B ++:104E00007043B3F5805FD0F8A82009D1B2F89205BD ++:104E100003B2B3F1FF3F0CBF4FF4C87080B24CE057 ++:104E2000B2F8904523B2B3F1FF3F01D0A0B244E005 ++:104E300040F2A541FDF77EFC40F2A541814638468F ++:104E4000FDF778FC40F20D4106463846FDF772FC4E ++:104E500040F20D4104463846FDF76CFC40F2A24199 ++:104E600005463846FDF766FC40F2A24180463846CA ++:104E7000FDF760FCC6F30236012313FA06F6C0F311 ++:104E80000220C5F3022513FA05F58340E4B25FFA68 ++:104E900089F94C44B6B2A419ADB29BB25FFA88F856 ++:104EA0006419434404EB430464005034A4B2B4F5E1 ++:104EB000C86F2CBF20464FF4C860BDE8F087C046DD ++:104EC00010B540F2FB41FDF735FCC0F3062010BDE4 ++:104ED00070B540F2A4410446D0F8A850FDF72AFC72 ++:104EE000C0F38130032814D141F22403E35C83B181 ++:104EF000204640F27341FDF71DFC95F96635C0056B ++:104F0000C00D013303FB00F3022293FBF2F3D8B28E ++:104F100001E095F8C10240B270BDC04610B540F244 ++:104F2000A441FDF707FC00F4404010BD10B5FFF7A9 ++:104F3000F5FFB0F5404F14BF0020012010BDC04662 ++:104F400070B5002313700B7041F22403C35C044658 ++:104F50000D4616461BB340F2AB41FDF7EBFB10F4D8 ++:104F6000004F03D0204640F2AB410AE0204640F219 ++:104F70003C61FDF7DFFB10F4004F07D0204640F204 ++:104F80003C61FDF7D7FBC0F3470028702046FFF7D0 ++:104F9000CDFF08B194F810052B781B18337070BD45 ++:104FA0002DE9F04140F2FF340E4605469046334667 ++:104FB000224640F24561FDF7EFFB28462246434674 ++:104FC00040F24661FDF7E8FB28462246334640F2B0 ++:104FD0004761FDF7E1FB2846224643464FF4C9618D ++:104FE000FDF7DAFB28462246334640F24961FDF7D9 ++:104FF000D3FB284640F24A6122464346FDF7CCFBEC ++:10500000BDE8F08170B5002914BF4FF48073002310 ++:1050100004460D1E18BF01254FF480724FF49661AF ++:10502000FDF7BAFB0122204640F24C412B46FDF72A ++:10503000B3FB2B0320464FF496614FF4805203F4E8 ++:105040007043FDF7A9FB6B0320464FF496614FF4C4 ++:10505000005203F46043FDF79FFB6B0120229BB2DB ++:1050600020464FF49661FDF797FB6B0203F47E43F5 ++:10507000204640F2AE414FF40072FDF78DFBB4F8CC ++:10508000DA3003F47043B3F5005F11D1AB02204670 ++:105090004FF496614FF4806203F47C43FDF77CFB90 ++:1050A000EB009BB2204640F2E5410822FDF774FB7D ++:1050B00070BDC04670B50C02A4B20546234640F24E ++:1050C000FB414FF4FE42FDF767FB284640F2FD41ED ++:1050D0004FF4FE422346FDF75FFB70BD70B500291B ++:1050E00014BF802300230C1E18BF012480224FF41C ++:1050F00096610546FDF750FBA303A40128464FF433 ++:1051000096614FF4804203F44043A4B2FDF744FBA0 ++:10511000284640F23B4140222346FDF73DFB70BD4F ++:1051200070B540F239440D4621460646FDF702FBB4 ++:1051300040F67F4300EA030343EAC51330462146A5 ++:1051400040F6FF729BB2FDF727FB70BD2DE970435F ++:105150000C460646FFF7B4FE628823884FF6FF79B7 ++:1051600043EA022305464A46304640F2B5419BB227 ++:10517000FDF712FB2D02A388ADB247F6FF7830464B ++:10518000424645EA030340F2FB41FDF705FB628816 ++:105190002388304643EA022340F2FC414A469BB250 ++:1051A000FDF7FAFAA3883046424645EA030340F287 ++:1051B000FD41FDF7F1FA3046E188FFF7B1FF3046D7 ++:1051C0000121FFF78BFFBDE87083C04610B502498F ++:1051D0000C22FDF7F5FA10BD380D02002DE9F0475D ++:1051E0009846BDF82CA0BDF824308946BDF82010A3 ++:1051F0000AF00304164603F00F03BDF8282044EA22 ++:10520000032301F00F0102F0030243EA013343EAF2 ++:10521000821343EA021343EA840340F2B6414FF695 ++:10522000FF720746BDF83050FDF7B6FA0F2208EAC4 ++:105230000203384640F2B741FDF7AEFA4FEACA23FF ++:105240009CB22346384640F2B1414FF460522D03E0 ++:10525000FDF7A2FAADB2062238462049FDF7B0FAB2 ++:105260007602384640F2AE414FF470422B46FDF7CD ++:1052700093FA384640F2B1414FF4007206F47E438F ++:10528000FDF78AFAD9F1010338BF0023012238461D ++:1052900040F24D41FDF780FAB7F8DA3003F470437D ++:1052A000B3F5005F10D1384640F2B1414FF4C0521F ++:1052B0002346FDF771FA4FEACA039BB2384640F223 ++:1052C000E6411822FDF768FA384640F2AE414FF445 ++:1052D00070422B46FDF760FABDE8F087A209020094 ++:1052E00010B5044686B021B90D490E22FDF768FAC3 ++:1052F00014E00C490922FDF763FA0021032206237A ++:10530000009302920423039220460A4604910193DB ++:10531000FFF764FF20460121FFF774FE06B010BDC1 ++:10532000420702005E07020010B5D0F8A830D3F89B ++:10533000741529B1C3694FF420729868F1F3D8F459 ++:1053400010BDC0462DE9F041D0F8A8300646D3F88C ++:105350007C55D3F8787500240DE0142302FB03F389 ++:10536000EA1811695268F06902FB01F28068E95895 ++:10537000D208F1F3BDF4E2B20134BA42EDD3BDE894 ++:10538000F081C04670B5D0F8A8500446D5F87C35F9 ++:105390006BB10121FFF7D6FFE369D5F878451422F8 ++:1053A0009868D5F87C1504FB02F2F1F3A1F470BD06 ++:1053B00041F2F023C15810B5044629B1C36942F641 ++:1053C00008529868F1F394F42046FFF7ADFF2046A9 ++:1053D000FFF7D8FFE369D4F8A81098684FF4B962D2 ++:1053E000F1F386F410BDC04610B54FF48052044668 ++:1053F000002340F2C961FDF7CFF9D4F8A820B2F834 ++:10540000C234EBB192F8E933A02B04D1204640F22C ++:105410008961232203E0204640F289613022FDF7B2 ++:1054200095F9D4F8A830B3F8C234022B0ED14FF45A ++:105430008052204640F2C9611346FDF7ADF905E000 ++:10544000204640F289612322FDF780F9042220469C ++:105450002749FDF7B5F90022204640F27961FDF7B2 ++:1054600075F9082220462349FDF7AAF9D4F8A83097 ++:105470002046B3F8C2244FF4D961FDF767F906223C ++:1054800020461D49FDF79CF9D4F8A8304FF48072EE ++:10549000B3F8C23420461A41013A4FF4D06192B2B7 ++:1054A000FDF754F9D4F8A8304FF4A072B3F8C23421 ++:1054B00020461A41013A92B240F28161FDF746F965 ++:1054C000D4F8A830B3F8C224012A04D0022A14BFA9 ++:1054D0003422082200E01822204640F27F61FDF7C6 ++:1054E00035F9204605490E22FDF76AF910BDC04680 ++:1054F000440B02004C0B02002E0C02003A0C02007E ++:105500002DE9F04740F23C4631460446FDF712F9DA ++:1055100040F23B48824641462046FDF70BF94AF0EF ++:10552000010281463146204692B2FDF70FF949F05B ++:105530000102204641464FF6FE7592B2FDF706F98C ++:10554000204631460AEA0502FDF700F920464146A9 ++:1055500009EA0502FDF7FAF8204631465246FDF702 ++:10556000F5F8204641464A46FDF7F0F8BDE8F087D9 ++:10557000802270B513460C4640F2D1610546FDF716 ++:105580000BF90CB1012C05D128464FF4DA610F223A ++:10559000FDF7DCF82846FFF7B3FF70BD2DE9704337 ++:1055A0000E46B0F8DA10054601F47041B1F5005F1F ++:1055B00014BFA521892199469046FDF731F8B5F829 ++:1055C000DA10044601F47041B1F5005F14BFA52163 ++:1055D00089212846FDF724F804F00F04C0F30310D6 ++:1055E000241A3470B5F8DA10284601F47041B1F588 ++:1055F000005F14BFA6218A21FDF712F8B5F8DA1072 ++:10560000044601F47041B1F5005F14BFA6218A2160 ++:105610002846FDF705F804F00F04C0F30310241A20 ++:1056200088F80040B5F8DA10284601F47041B1F569 ++:10563000005F14BFA7218B21FCF7F2FFB5F8DA1049 ++:10564000044601F47041B1F5005F14BFA7218B211E ++:105650002846FCF7E5FF04F00F04C0F30310241AFA ++:1056600089F80040B5F8DA10284601F47041B1F528 ++:10567000005F14BFA8218C21FCF7D2FFB5F8DA1027 ++:10568000044601F470412846B1F5005F14BFA8211B ++:105690008C21FCF7C5FF04F00F04C0F30310069B38 ++:1056A000241A1C70BDE87083B0F8DA1010B501F44C ++:1056B00070410446B1F5005F14BFA52189218822FD ++:1056C000FCF7C6FFB4F8DA10204601F47041B1F5DA ++:1056D000005F14BFA6218A218822FCF7B9FFB4F825 ++:1056E000DA10204601F47041B1F5005F14BFA72124 ++:1056F0008B218822FCF7ACFFB4F8DA10204601F4C5 ++:105700007041B1F5005F14BFA8218C218822FCF7FD ++:105710009FFF10BD10B5D0F8A830044693F8E933C8 ++:10572000A02B03D110490422FDF74AF8204600229D ++:105730004FF48E71FCF78CFF204618220B49FDF7C1 ++:105740003FF841F2EE23E35A2046FF2240F2346153 ++:10575000002B08BF0C23FDF71FF82046044909223F ++:10576000FDF72EF810BDC046580D0200600D020076 ++:10577000900D020070B504220D4607490646FDF75C ++:105780001FF80024054B625BE15A30460234FCF7F7 ++:105790005FFF302CF6D170BDD60B0200D2040200A0 ++:1057A0002DE97043054698461646B0F8DA40FFF7F3 ++:1057B000DFF804F47044B4F5005F14BFA524892415 ++:1057C0000246214628469DF81890FCF741FF3146D5 ++:1057D0002846FFF7CDF8B5F8DA40024604F47044E5 ++:1057E000B4F5005F14BFA6248A2428462146FCF79E ++:1057F0002FFF41462846FFF7BBF8B5F8DA400246CE ++:1058000004F47044B4F5005F14BFA7248B24284629 ++:105810002146FCF71DFF49462846FFF7A9F8B5F8D1 ++:10582000DA40024604F47044B4F5005F14BFA824C3 ++:105830008C2428462146FCF70BFFBDE87083C04648 ++:1058400070B505460E460024074BA25BE15A284678 ++:105850000234FCF7FDFE182CF6D1284603492246F7 ++:10586000FCF7AEFF70BDC046800B0200880C020042 ++:1058700070B506220E4644490446FCF7A1FF0025F8 ++:10588000424B2046E95AFCF7CBFEA8530235182DAF ++:10589000F6D1072101222046FCF7DAFE1022FF2173 ++:1058A00013462046FCF71AFF04221346204640F216 ++:1058B0001F11FCF713FF0C2220463549FCF780FF2F ++:1058C00001223A2113462046FCF708FF04223A2120 ++:1058D00013462046FCF702FF0822134620464FF4E9 ++:1058E0008D71FCF7FBFE0822052113462046FCF7CC ++:1058F000F5FE0122134620464FF48D71FCF7EEFEB3 ++:10590000122220462349FCF75BFF20228221134606 ++:105910002046FCF7E3FEB4F8DA3003F47043B3F545 ++:10592000005F02D000252E4608E0D4F8A8309A7A0D ++:10593000D97A42F400721D7B42EA01160122204608 ++:1059400013464FF49B61FCF727FF2046B3004FF44A ++:105950009B6140F6FC72FCF71FFF022220461346B3 ++:105960004FF49B61FCF718FF2B0320464FF49B611B ++:105970004FF4E04203F47043FCF70EFF2046064963 ++:105980000622FCF71DFF70BD16080200800B020006 ++:10599000AE090200C6090200EA0902002DE9F74F2C ++:1059A000D0F8A830814693F80B809C7A1A7E1F7B32 ++:1059B0004FEA081844F4007493F817B09E7D44EA47 ++:1059C0000804009293F814A0DD7C44EA07345B7D60 ++:1059D00047F2FF38A4B2092223490193FCF7F0FEF5 ++:1059E00048464246234640F2DB41FCF7D5FE484696 ++:1059F0004246234640F2DC41FCF7CEFE4846424692 ++:105A0000234640F20A41FCF7C7FE4FEA0A1A019BFF ++:105A100045F4007545EA0A0545EA0335484642461D ++:105A2000ABB240F20B41FCF7B7FE4FEA0B1B009AFA ++:105A300046F4007646EA0B0646EA023648464246F7 ++:105A4000B3B240F20C41FCF7A7FE20224846822167 ++:105A50001346FCF743FE012248467C211346FCF71F ++:105A60003DFEBDE8FE8FC046C40B0200012970B5A3 ++:105A700005460C4616D106222949FCF7A1FE284608 ++:105A80003A2122462346FCF729FE082228461346DF ++:105A90004FF48D71FCF722FE28467F210022FCF78F ++:105AA000D7FD33E079B91F490622FCF789FE284665 ++:105AB0003A2101222346FCF711FE082228464FF422 ++:105AC0008D71134620E0022920D1B0F8DA3003F4BA ++:105AD0007043B3F5005F02D17D21032201E07D21F7 ++:105AE0002246FCF7B5FD284628210F220123FCF7AA ++:105AF000F5FD8022134628464FF48971FCF7EEFD30 ++:105B00002846052107220223FCF7E8FD284640F23B ++:105B100037614FF440420023FCF73EFE70BDC046A3 ++:105B2000AE060200560C02002DE9F047C369D0F81A ++:105B3000A8501B6D0C4613F4805F40F2234114BF44 ++:105B40004FF006094FF00909064695F844A3FCF703 ++:105B5000F1FD40F2344107463046FCF7EBFD2046AC ++:105B6000FEF7E6FF95F84433C1B2B5F8642395F823 ++:105B700048030BB9012092E007F0FF07C0EB0103D7 ++:105B8000C2EB07029B1A5FFA83F84FFA88F4002CE5 ++:105B90001DDAF36930461B6D03F48053002B0CBFF4 ++:105BA0000B21042114BF0322082263429A42A8BF9A ++:105BB0001A46B5F8683301FB02324FF4AA6192B27B ++:105BC000FCF7C4FD14F1030F06DAFB1C05E0032CFF ++:105BD00002DDFB1E9BB200E0BBB2B5F8640319B254 ++:105BE00002B2D31C994201DDC31C03E09142ACBF59 ++:105BF0000B4613469CB2BAF1000F13D023B2BB423E ++:105C000010D02346304640F22341FF22FCF7C4FD6A ++:105C1000304624490422FCF7D3FD1420F0F39CF510 ++:105C2000002700E00127B5F866434FFA88F220B25A ++:105C3000C9EB000352429A42B8BFC9EB040391B2C8 ++:105C4000B8BF99B20AB200F109039A42C4BF04F185 ++:105C5000090399B2B6F8DA3003F47043B3F5005F84 ++:105C60000CBF95F94B3395F94C335B189BB2BAF1E5 ++:105C7000000F05D0304640F23441FF22FCF78CFD86 ++:105C8000304640F22341FCF755FD95F8BC33C0B2D5 ++:105C900085F8BD0385F8BE0385F8BF333846BDE8F7 ++:105CA000F087C0465C0B020070B5D0F8A8500446DF ++:105CB000FF22B5F8663340F23441FCF76DFDB5F8CC ++:105CC00064332046FF2240F22341FCF765FD204665 ++:105CD000B5F868234FF4AA61FCF738FD2046044963 ++:105CE0000422FCF76DFD1420F0F336F570BDC046BC ++:105CF0008A050200082270B5134605465721FCF7B5 ++:105D0000EDFC56212846FCF78BFC00F0F8045621E8 ++:105D100022462846FCF79CFC0120F0F31DF5562195 ++:105D200044F003022846FCF793FC0120F0F314F53D ++:105D3000562144F007022846FCF78AFC4FF496707F ++:105D4000F0F30AF52846572108220023FCF7C6FC89 ++:105D500070BDC0462DE9F04140F24A4631468046CA ++:105D6000FCF7E8FC40F04404A4B24FF6BF7540468F ++:105D70003146224604EA0505FCF7E8FC31462A468E ++:105D80004046FCF7E3FC25F004050420F0F3E4F4BE ++:105D9000404631462A46FCF7D9FCBDE8F081C046B2 ++:105DA0002DE9F04706460C461546384906221F469F ++:105DB000DDF82090BDF82480FCF702FD304640F26B ++:105DC00082414FF6FF722346FCF7E6FC304640F274 ++:105DD0008141FF222B46FCF7DFFC3FB9304640F201 ++:105DE00081414FF480723B46FCF7D6FC304628498F ++:105DF0000322FCF7E5FC0A2308FB03F5002407E077 ++:105E0000AC4201DD002439E06420F0F3A5F4013454 ++:105E1000304640F28141FCF78DFC10F4007FEFD159 ++:105E200040F283413046FCF785FC40F28441044651 ++:105E30003046FCF77FFC40EA0440C9F8000040F21D ++:105E400085413046FCF776FC40F2864104463046F8 ++:105E5000FCF770FC40EA0440C9F8040040F28741B6 ++:105E60003046FCF767FC4FF4916104463046FCF77E ++:105E700061FC40EA0440C9F80800012430460549A5 ++:105E80000622FCF79DFC2046BDE8F087980702003B ++:105E9000F40502002A06020070B50546002407E05A ++:105EA0006420F0F359F4013441F289339C4207D065 ++:105EB000284640F25141FCF73DFC10F4404FEFD131 ++:105EC000284640F25141FCF735FC10F4404F14BF16 ++:105ED0000020012070BDC04610B540F24C414FF685 ++:105EE000FC72FCF73BFC10BDC36970B504460D465F ++:105EF00018698E2116463AF0FDDBE3694119490025 ++:105F0000186932463AF014DC70BDC046C36970B5FA ++:105F100004460D4618698E213AF0ECDBE36941191D ++:105F2000490018693AF0E6DB70BDC0462DE9F04142 ++:105F30000C46272180461646FFF7E8FF10F00103C4 ++:105F400002D101271D4605E04FF6F07500EA050570 ++:105F50004FF6F07728214046FFF7D8FF3840A84297 ++:105F600001D1012009E0013C631C002B02DD14205B ++:105F7000F0F3F2F3002CEDDC002006B13460BDE854 ++:105F8000F081C0462DE9F0410646D0F8A850FEF752 ++:105F9000C5FFB0F5404F46D1F369E02118693AF0EA ++:105FA000A9DBEC8D8046C4EB000440F2A5413046ED ++:105FB000FCF7C0FB0123C0F30227BB40A4B29C4204 ++:105FC00031DD95F8C134A5F82E80BB4208D90137E0 ++:105FD000304640F2A5414FF4E0623B02FCF7DCFBA7 ++:105FE0003046FEF775FF40B280B22886B6F8DA3048 ++:105FF0006F8603F47043B3F5005F0CBF85F854045B ++:1060000085F85504D6F8A8202B8E92F966255B00FA ++:10601000013293FBF2F3304640F2A44140F2FF120A ++:106020009BB2FCF7B9FBBDE8F081C0462DE9F04F0B ++:10603000044685B00D46D0F8A860FFF7A3FFD4F85A ++:10604000B030D3F8203183F0010313F00103039340 ++:1060500003D1E36918693AF09DDB07212046FCF77C ++:10606000DFFAFF2101902046FCF7DAFA40F21F1117 ++:1060700002902046FCF7D4FA40F23B41834620468A ++:10608000FCF758FB40F23C4182462046FCF752FBAD ++:1060900040F2D74181462046FCF74CFB4FF49B6110 ++:1060A00080462046FCF746FB0F224649074620461D ++:1060B000FCF786FB0122072113462046FCF70EFB66 ++:1060C0001022FF2113462046FCF708FB042213464A ++:1060D00040F21F112046FCF701FB0A20F0F33CF3CD ++:1060E000202220464FF49A611346FCF755FB0A2004 ++:1060F000F0F332F3012D21D140F276412046FCF736 ++:1061000019FB40F27741C5052046FCF713FBC0059B ++:10611000C00DED0DFF288ABFA0F5007302469AB2AC ++:10612000FF2D88BFA5F50073A6F86E058CBF98B249 ++:106130002846C0EB0203A6F86C550AE0204640F260 ++:106140007541FCF7F7FAC005C00DFF2803D9A0F58B ++:1061500000739DB200E00546019B2046DAB207219C ++:10616000FCF776FA029B2046DAB2FF21FCF770FAC0 ++:10617000204640F21F115FFA8BF2FCF769FA2046C5 ++:1061800040F23B415246FCF7E1FA204640F23C41E6 ++:106190004A46FCF7DBFA204640F2D7414246FCF77C ++:1061A000D5FA20464FF49B613A46FCF7CFFA039BA1 ++:1061B0001BB9E36918693AF0D9DA28B205B0BDE82D ++:1061C000F08FC046F807020070B5D0F8A83001295A ++:1061D000D3F8DC63D3F8D853D3F8E04304D10131CA ++:1061E000FFF724FF02B20AE040F27541FCF7A2FA81 ++:1061F000C005C00DFF288CBFA0F500720246631FCA ++:1062000001209840801905FB1200231F184140B25D ++:1062100070BDC04610B50129D0F8A83003D1FFF7F2 ++:1062200005FF00B212E0B3F86C25B3F86E35FF2B12 ++:1062300086BFA3F5007399B21946FF2A86BFA2F55F ++:1062400000739BB21346C3EB010318B210BDC046E6 ++:1062500070B5D0F8A830D3F8D443D3F8D053D3F8DE ++:10626000CC63FFF7D7FF621E0123934000B25B1996 ++:1062700006FB1030204140B270BDC0462DE9F04110 ++:10628000B0F8DA20074602F47043B3F5005FD0F8A7 ++:10629000A85004D1B5F85463B5F8844513E0D3B2DF ++:1062A000942B03D9B5F88645022308E0632B03D964 ++:1062B000B5F88845012302E0B5F88A45002305EBCF ++:1062C0004303B3F85663FF2E1ED001213846FFF773 ++:1062D000BFFF40B2193804FB00F000B20028CCBF69 ++:1062E00000F5FA73A0F5FA734FF47A7293FBF2F3A8 ++:1062F00098B28419A4B2384640F23441FF222346B2 ++:10630000FCF74AFAA5F86643BDE8F08170B505468A ++:10631000D0F8A8600C4689B340F2DA6142F2080274 ++:10632000FCF72AFA284640F2A6510522FCF70EFA9D ++:10633000284640F2A251C322FCF708FA284640F250 ++:10634000A5510722FCF702FA284640F283514FF488 ++:106350004872FCF7FBF9284640F284510022FCF712 ++:10636000F5F9284640F285514FF40072FCF7EEF93A ++:10637000284640F286510022FCF7E8F928462721FA ++:10638000FFF7C4FD1CB140F001039CB203E04FF6DF ++:10639000FE7400EA040496F894332846F31893F840 ++:1063A0009523052302FB03F22621042A98BF1A46EF ++:1063B000FFF79AFD04F110022846272192B2FFF759 ++:1063C00093FD70BD70B5D0F8A850044695F84233DF ++:1063D0005BB10021FFF79AFF204619210022FFF749 ++:1063E000A5FD10B9012385F8453370BD70B5D0F80F ++:1063F000A840054694F8423393B990F8E93013F079 ++:10640000010F1CBF23F0010380F8E93090F8E93058 ++:1064100013F0020F2DD023F0020380F8E93028E0BA ++:1064200094F847330BB1012303E0D1F1010338BFE6 ++:10643000002384F84733E1B100230126C4F86C330C ++:1064400084F8453384F846632846FFF7BBFF94F889 ++:106450004333003B18BF012384F8443313B128466B ++:10646000FFF722FC2846FEF79FFB28463146FFF740 ++:106470004DFF70BD70B5D0F8A83000260C4683F8EB ++:10648000466331460546FFF741FF14B12846FFF742 ++:106490000BFC03222846134640F67A01FCF77CF9F0 ++:1064A000284640F2DA6142F208023346FCF774F9FA ++:1064B00070BDC04670B50546D0F8A84016467AB102 ++:1064C00094F8433394F842438C2144EA4304C3696B ++:1064D000146018693AF00ED944EA004434600FE0C1 ++:1064E000CB080DD101F0010384F84233C1F340031E ++:1064F00084F8433394F8423313B90121FFF7BAFF0C ++:1065000070BDC04610B500210446FFF7B3FF20461A ++:10651000FEF74AFB10BDC04610B50122044640F606 ++:106520000501FCF729F920460722052340F22F41F7 ++:10653000FCF732F920463021F8234FF4FF62FCF7D4 ++:106540002BF90623204630210722FCF725F92046A7 ++:1065500040F2144141F61062FCF7F8F8204640F290 ++:1065600015414FF4C862FCF7F1F8204640F2DF41D4 ++:106570004FF47F424FF47743FCF70EF92046FFF7C4 ++:10658000E9FB204602492D22FCF71AF910BDC0464E ++:10659000680E0200002914BF0223002310B5002A50 ++:1065A00018BF43F001030446032240F24D41FCF7BB ++:1065B000F3F8204640F24C410322FCF7DDF810BD11 ++:1065C00010B5044611B91049132219E012220F49DF ++:1065D000FCF7F6F8012100222046FFF7DBFF2046FA ++:1065E0000B490622FCF7ECF8B4F8DA3003F47043F8 ++:1065F000B3F5005F07BF20460649204606491E2224 ++:10660000FCF7DEF810BDC04692080200B808020090 ++:10661000DC080200660A0200E80802002DE9F041E9 ++:1066200004460D46164640F2DA6148F280021F46E3 ++:106630009DF81880FCF7A0F82046FEF7B7F9B8B12E ++:1066400040F652112046FCF775F8FF22C3B240F61F ++:1066500048112046FCF7A0F840F653112046FCF7FD ++:1066600069F840F64911C3B2FF222046FCF794F8BE ++:10667000D4F8A83093F8463573B140F2EB41204688 ++:10668000FCF758F8C0F3402340F2EB4120464FF4AA ++:1066900080629B02FCF780F86B1EFF22204640F2CE ++:1066A00042619BB24FF6FF75FCF776F8AE4201D01F ++:1066B000731E9EB220464FF4C8612A463346FCF74B ++:1066C0006BF8204640F241612A463B46FCF764F8ED ++:1066D000B8F1000F05D0204608490422FCF770F8F5 ++:1066E00009E0204640F23F610122FCF72FF82046E6 ++:1066F0000121FFF765FFBDE8F081C046DE0B020017 ++:106700002DE9F0410C4640F23B410546FCF712F8FA ++:1067100040F23C4107462846FCF70CF8064674B1A7 ++:106720000E2228460F49FCF74BF828460121FFF7B7 ++:1067300047FF28460C490722FCF742F810E028469C ++:106740000A490422FCF73CF8284640F23B413A460D ++:10675000FBF7FCFF284640F23C413246FBF7F6FFD0 ++:10676000BDE8F08186090200980B0200500D02007E ++:106770002DE9F04F0546C5B001910092FDF79AFC56 ++:10678000EB694FF0805118690A4639F093DF052014 ++:10679000EFF3E2F7002328464FF489614FF480427B ++:1067A000FBF7FAFF284640F255414FF4A842FBF7A9 ++:1067B000CDFF284640F25641FBF7BCFF00F00F002A ++:1067C000052809D14FF4A842284640F25541FBF76D ++:1067D000BDFF4FF4807207E045F20142284640F2C7 ++:1067E0005541FBF7B3FFFE22803A521022EAE272D3 ++:1067F000102AA8BF10225100002301F18006C2EB2D ++:10680000060B1F46994698469A464393429340E0AA ++:1068100040F256412846FBF78DFF40F25741C0F346 ++:106820000B142846FBF786FF5E4544EA003021DC66 ++:10683000BAF17F0F1EDC8104890CB1F5005FC8BF7F ++:10684000A1F5804101F50063B3F5805F23D802AB69 ++:1068500023F8191044AB03EB880252F8083C0AF104 ++:10686000010ACB1842F8083C08EB090383F0400901 ++:1068700088F00108C0F3033303F00C0343EA071365 ++:1068800016F0010F9FB203D007F0FF03402B02D197 ++:10689000013E002EBCDCEB69002218694FF08051EC ++:1068A00039F008DF2846FDF7FFFB429B9B1142931E ++:1068B000439B9B11BAF1800F43931DD0002022E02F ++:1068C00041EA801202AB33F9123001315B1B4029DF ++:1068D00003FB0344F4D1013002280FD1009AA3092D ++:1068E0001460019A1360A3F53A63084A183B934277 ++:1068F0008CBF0020012006E00020044642AB53F884 ++:1069000020500021DCE745B0BDE8F08F48F4FF0FD0 ++:1069100070B504460D46FDF7CDFB20226B012046E5 ++:106920004FF49661FBF738FF0023204640F2B14157 ++:106930004FF40072FBF730FFB4F8DA3003F4704321 ++:10694000B3F5005F02D04FF0000E04E0D5F1010E68 ++:1069500038BF4FF0000E002D0CBF2023002343EA68 ++:106960008E13204660224FF48261FBF715FF20460C ++:106970004FF482618022EB01FBF70EFF2046FDF70A ++:1069800093FB70BD2DE9F047044688461746D0F8C2 ++:10699000A890FCF78DFB20460121FFF7B9FF0025E9 ++:1069A0002E460CE0012100222046FDF78BFA3846E6 ++:1069B000EFF3D2F62046FEF78BFA40B285B2F3B27F ++:1069C00001364345EED320460021FFF7A1FF89F8A9 ++:1069D000C052BDE8F087C04670B505460846FEF7D0 ++:1069E000A7F8EB69A02144B2186939F083DE9D3C19 ++:1069F000A4B26FF0610324B29C42B8BF1C46C1B27E ++:106A000062B22846FCF770FD70BDC04673B5D0F881 ++:106A1000A840064694F84233002B00F0DC8094F83E ++:106A20004633002B00F0D780D0F8B030D3F82031B7 ++:106A300013F0010F00F0CF8000230093019394F82E ++:106A40004553002D40F0AA8029462A46FFF76EFAEA ++:106A5000002800F0A380304601A96A46FFF788FEAF ++:106A6000002800F09B80009BC4F86C3394F84633F8 ++:106A7000012B40F0938094F891030199AC46AE4607 ++:106A80001FE045B204EB8502D2F87033994201D37E ++:106A9000002203E0C2F870131946012204EB8503BB ++:106AA000D3F870339C440EF101035FFA83FE431C5C ++:106AB000D8B243B2072BC8BF002012B1019101998F ++:106AC00019E094F990334FFA8EF29A42D9DBF5E748 ++:106AD00043B204EB8303D3F87023C3F87013431C51 ++:106AE000D8B243B2072BC8BF00200EF101038C447B ++:106AF0005FFA83FE11464FFA8EF3072BE8DD019112 ++:106B000094F8902353B2072B05DC002384F89233CA ++:106B1000531C84F8903394F99033082B3ED194F8A9 ++:106B20009433E31893F8972393F8995394F8923396 ++:106B3000FC2B02D8013384F8923394F892339342B9 ++:106B40002CD194F89133013384F891335BB2072B45 ++:106B500002DD002384F8913394F890333046023BF1 ++:106B600084F890336146FEF7DFFF18B93046FEF730 ++:106B70001BF810E094F89333FC2B02D8013384F80F ++:106B8000933394F89333AB4205D194F8943313B90B ++:106B9000013384F89433002384F8923394F8461335 ++:106BA0000023012984F8453303D13046FFF7AEFBBB ++:106BB00003E030461946FFF75DFC3046D4F86C130D ++:106BC000FFF70AFF002384F8473394F89C3313B986 ++:106BD000013384F89C337CBD2DE9F04F0746D0F893 ++:106BE000A800E1B00B9041F22403FB5C0C46002BA3 ++:106BF00000F09C82FB696A21186939F07BDD400056 ++:106C00001FFA80FBBBF1000F00F090823846FEF7C0 ++:106C100085F9FB69024610B91869594684E218697A ++:106C2000594639F067DD012800F080820BF1060338 ++:106C30009BB20C930BF13A039BB20D930BF16E03D5 ++:106C40009BB20E930BF1AA039BB20F93002C00F0A2 ++:106C50005A82384640F2F941FBF76CFD10F0080FFC ++:106C600040F064824CAD38ACAB1C0193A31C039381 ++:106C70003846002340F2764140F2FF12009502941C ++:106C8000FBF7D4FD2B1D0093AB1D0193231D029335 ++:106C9000A31D03933846002340F2774140F2FF12D0 ++:106CA000FBF7C4FD05F10803009305F10A03019306 ++:106CB00004F10803029304F10A030393384640F2F7 ++:106CC000AA4148F2FF1248F27F03FBF7AFFD05F13E ++:106CD0000C03009305F10E03019304F10C0316223B ++:106CE000029304F10E0303933846134640F23B41EE ++:106CF000FBF79CFD05F11003009305F112030193CE ++:106D000004F11003029304F1120346220393384660 ++:106D1000002340F23C41FBF789FDB7F8DA3005F17A ++:106D2000140E03F47043B3F5005F05F11C030A93DE ++:106D300005F11E03099304F11C03089304F11E03DB ++:106D4000079305F12003069304F1200305F11602D1 ++:106D500004F1140104F1160005F1180605F11A08F2 ++:106D600004F1180904F11A0A05F12205059304F14A ++:106D7000220437D1019241F22B0213460291039073 ++:106D800040F24C413846CDF800E0FBF74FFD384665 ++:106D900040F24D4144F22B0244F20A030096CDF832 ++:106DA0000480CDF80890CDF80CA0FBF73FFD089AC1 ++:106DB0000A980999079B0292072200900191039378 ++:106DC0003846134640F2F941FBF730FD0698059925 ++:106DD000072200900291384640F2FA41134601958D ++:106DE000039436E0019241F22B0213460291039084 ++:106DF00040F24C413846CDF800E0FBF717FD38462D ++:106E000040F24D4144F22B0244F222030096CDF8A9 ++:106E10000480CDF80890CDF80CA0FBF707FD0A9A86 ++:106E2000099B089807990092072201930290134644 ++:106E30000391384640F2F941FBF7F8FC069A059BAE ++:106E40000092029301950394384640F2FA410722DA ++:106E5000002324ACFBF7EAFCA31C019310AB012236 ++:106E600002930DF142030721039338461346009421 ++:106E7000FBF748FC231D0093A31D019311AB1022C7 ++:106E800002930DF14603FF21039338461346FBF7A7 ++:106E900039FC04F10803009304F10A03019312ABD7 ++:106EA000042202930DF14A034CAE03933846134675 ++:106EB00040F21F11FBF726FC06F1240338AD0093C6 ++:106EC00006F12603019305F1240340F644020293E0 ++:106ED00005F1260303933846134640F63811FBF7B5 ++:106EE000A5FC06F12803009306F12A03019305F19E ++:106EF0002803029305F12A030393384640F639111B ++:106F000040F6440240F60403FBF790FC04F10C0346 ++:106F1000009304F10E03019313AB012202930DF1D0 ++:106F20004E033A21039338461346FBF7EBFB04F17B ++:106F30001003009304F11203019314AB082202938F ++:106F40000DF152030393384613464FF48D71FBF74E ++:106F5000D9FB04F11403009304F11603019315AB5C ++:106F6000082202930DF15603052103933846134678 ++:106F7000FBF7C8FB04F11803009304F11A03019313 ++:106F800016AB042202930DF15A033A2103933846BB ++:106F90001346FBF7B7FB04F11C03009304F11E0337 ++:106FA000019317AB012202930DF15E030393384660 ++:106FB00013464FF48D71FBF7A5FB06F12C030093EC ++:106FC00006F12E03019305F12C03029305F12E0324 ++:106FD0000393384640F2D74147F2CB0242F24B03CB ++:106FE000FBF724FC04F12003009318AB202202934A ++:106FF0000DF1620382212234039338461346019433 ++:10700000FBF780FB0B98037B827AC17A1B0342F467 ++:10701000007242EA011243F0030343EA820306F1DD ++:107020003002009205F13002323602923235384693 ++:107030004FF49B6147F6FF729BB201960395FBF7F5 ++:10704000F5FBDDF83090DDF834800026FB694CACB0 ++:10705000325B1869494639F06BDBFB6938AD725B0E ++:107060001869414639F064DBFB69A419186909F114 ++:107070000201628839F05CDBFB69AD1908F102019D ++:1070800018696A88043639F053DB342E09F1040993 ++:1070900008F10408DAD1DDF83890DDF83C800026EC ++:1070A000FB6924AC325B1869494639F041DBFB6966 ++:1070B00010AD725B1869414639F03ADBFB69A419DF ++:1070C000186909F10201628839F032DBFB69AD19F8 ++:1070D00008F1020118696A88043639F029DB242E88 ++:1070E00009F1040908F10408DAD1FB690BF1020186 ++:1070F00018690D2239F01CDBFB690BF104011869DA ++:10710000092239F015DBFB690B991A6A18690B9B88 ++:10711000C1F83824B3F83C240BF1E60139F008DB60 ++:10712000FB6959461869012239F002DB61B0BDE8FC ++:10713000F08FC0462DE9F04F8DB007460F220E4666 ++:107140000DF12100B249EAF317F7D7F8A880002221 ++:10715000B04D14016359B34203D001320E2AF7D166 ++:1071600075E3384691210022FBF772FA3846382140 ++:107170000722FBF76DFA0A2238468821FBF768FAE6 ++:10718000D7F8A83093F882251AB138468821FBF742 ++:107190005FFA64192A213846227AFBF759FA30211E ++:1071A00003223846637AFBF799FA91210322384685 ++:1071B000A37AFBF793FAE37A38210F223846FBF7DC ++:1071C0008DFA912100223846FBF742FA3821072236 ++:1071D0003846FBF73DFA237B30210C229B003846D2 ++:1071E000FBF77CFA5E210F223846637BFBF776FAC9 ++:1071F000A37B5E211B01F0223846FBF76FFA6C215E ++:107200003846E27BFBF724FA384638210822FBF7A0 ++:107210001FFA384691210322FBF71AFA0CA98B19A1 ++:1072200013F8102C38465E21FBF712FA012238467B ++:107230007E21FBF70DFA98F8EE231AB13846382173 ++:10724000FBF706FA0722134638462A21FBF746FACF ++:1072500038462C210022FBF7FBF938462A210C2264 ++:10726000FBF7F6F9012238462C21FBF7F1F9D7F8A4 ++:10727000A82092F852352BB338465E2192F8532558 ++:10728000FBF7E6F9D7F8A830384693F854252A21B9 ++:10729000FBF7DEF9D7F8A830384693F855252B21AF ++:1072A000FBF7D6F9D7F8A830384693F856252C21A5 ++:1072B000FBF7CEF9D7F8A83038462D2193F857259B ++:1072C000FBF7C6F9B7F8DA3003F47043B3F5805F23 ++:1072D00004D13846BF21EE22FBF7BAF90222134649 ++:1072E000384640F21F11FBF7F9F90422F721134643 ++:1072F0003846FBF7F3F9F121032200233846FBF768 ++:10730000EDF9F221F82290233846FBF7E7F9A223A2 ++:10731000F321FF223846FBF7E1F9B7F8DA3003F43E ++:107320007043B3F5005F04D1D7F8A83093F818354F ++:1073300006E0B3F5805F06D1D7F8A83093F8193589 ++:10734000012B00F07B82042238469D210023FBF7AD ++:10735000C5F90022079244213846FBF761F940F253 ++:107360002B1101903846FBF75BF94421029007226C ++:107370003846FBF7A5F9384640F22B110E22FBF7F1 ++:107380009FF941F2080357F803A0079B0BB9554634 ++:1073900001E04FEA4A05204B9A4502D84FF0010917 ++:1073A00006E01E4B9A4594BF4FF002094FF00409C6 ++:1073B000B7F8DA3003F47043B3F5005F03D000216F ++:1073C0000591069106E06268032302FB03F2059231 ++:1073D0006A000692124C102221465046FDF7BAF977 ++:1073E000102221462846FDF7B5F91022049009FB2A ++:1073F00004F15046FDF7AEF9B7F8DA30039003F424 ++:107400007043B3F5005F0DD04FF0000B10E0C046A5 ++:10741000C80602001424020080BA8C01007519030A ++:1074200040420F00059802211022FDF793F9834690 ++:107430004F2102223846FBF70BF9CD4B4FEACA0524 ++:1074400009FB03F3B5FBF3F301335B08013B5FFA80 ++:1074500083F85221072238464FEA9803FBF73EF99A ++:1074600008F101065321602238464FEA4813FBF722 ++:1074700035F909FB06F3BF4CB5FBF3F5BE4B2C19F0 ++:10748000B4FBF3F4013CE4B2512122463846FBF749 ++:10749000DFF8039B10221D0158462946FDF75AF9D3 ++:1074A000013406FB04F600FB06F000280BDB58460F ++:1074B00029461022FDF74EF900FB06F0C0130130FB ++:1074C0004010441E0EE0584629461022FDF742F9AE ++:1074D0006FEA080303FB04F300FB03F0C013013061 ++:1074E0006FEA6004C4F3072353210F223846FBF7E9 ++:1074F000F5F85421E2B23846FBF7AAF806999F4BFB ++:107500000A22B1FBF3F30599384601FB02F2B2FB04 ++:10751000F3F803FB1822590802F0010401EB0454AC ++:107520005208B4FBF3F49B0803EB0253B3FBF1F3F3 ++:10753000E41845211F22C8F30713FBF7CFF84FEAE1 ++:107540000813462138464FF4F87203F0F003FBF7B6 ++:10755000C5F8C4F3074346210F223846FBF7BEF8AF ++:107560004721C4F307223846FBF772F84821E2B2FC ++:107570003846FBF76DF8079A41F29416002A08BFC7 ++:107580004FF4FA56A6F5D8760CBF4FF482794FF433 ++:10759000E1794FF4F572033E96FBF2F606FB02F535 ++:1075A00005F52A754FF425636D02B5FBF3F540F23E ++:1075B0007C6405FB04F4A4F55834A4F5C064B4FB62 ++:1075C000F2F4640AC4F3820242EAC6023846422157 ++:1075D00092B2A4B2FBF73CF804F0030204F01F04DB ++:1075E00044EA421238464321FBF732F84FEA492475 ++:1075F0004FF48773B4FBF3F404FB05F4604B640AA7 ++:10760000604AB3FBF4F39A184FF41243B2FBF3F25F ++:107610005D4B02F00F02B3FBF4F3A3F54C23A3F58B ++:1076200000631B0C42EA03123846402192B2FBF77A ++:107630000FF84FF02552554BB2FBF4F2B3FBF4F3C5 ++:10764000A2F546324FF4B841A2F50072A3F56E33AD ++:10765000B2FBF1F2A3F50073B3FBF1F302F00F02FA ++:1076600042EA03123846412192B20BF17444FAF710 ++:10767000EFFF04F590044FF4966394FBF3F4292391 ++:1076800004FB03F44FF45C7308FB03F840F22B5344 ++:1076900006FB03F606F5E46109FB08F00C31102245 ++:1076A000FDF758F804F5D81400EB640090FBF4F0F3 ++:1076B000C0B23C2894BF0025012515B14308043B06 ++:1076C00000E0031FDCB23C213F2223463846FBF793 ++:1076D00005F8AB013C2140223846FAF7FFFFB7F826 ++:1076E000DA3004F1040603F47043B3F5005F05F1EA ++:1076F000010404D1D7F8A83093F8273506E0B3F594 ++:10770000805F19D1D7F8A83093F82835012B13D111 ++:10771000049B40F245105946102203FB00F0FDF790 ++:1077200019F804FB06F39E2100FB03F4C02238463F ++:107730004023FAF7D3FF0BE00499962001FB00F0F9 ++:1077400010225946FDF706F804FB06F300FB03F48C ++:10775000B4F5160FD4BF002501256B1C032203FBD3 ++:1077600002F394FBF3F0B0F5003F11D5002315E0D0 ++:10777000404B4C003F420F0040420F00A0860100EA ++:10778000000068600021F6FF000084A30000302A9A ++:10779000A0F5C033DB130133C3F347033D213F2280 ++:1077A0003846FAF79BFFAB013D2140223846FAF7F5 ++:1077B00095FF284B9A4504D9202238465721134675 ++:1077C00003E03846572120220023FAF787FF224B97 ++:1077D0009A4504D9102238465721134603E038460B ++:1077E000572110220023FAF779FF049AB2F5341FCB ++:1077F00005DD38464A210222FAF762FF04E03846E6 ++:107800004A21FD22FAF74EFF0C2244211346384646 ++:10781000FAF764FF0120EEF39FF73846FEF76AFAA5 ++:10782000019B38464421DAB2FAF712FF029B384630 ++:1078300040F22B11DAB2FAF70BFF08E004229D2187 ++:1078400038461346FAF74AFF0121079183E50DB048 ++:10785000BDE8F08F80BA8C010075190341F208036E ++:107860002DE9F047C4588A4B4FF48475B4FBF3F408 ++:1078700004FB05F41A235721B4FBF3F40646FAF788 ++:10788000CFFE172181463046FAF7CAFE182130464E ++:10789000FAF7C6FE40F20511FB2207463046FAF71A ++:1078A00001FF304604214022FAF70AFF30464FF428 ++:1078B00090711022FAF704FF304657210222FAF79E ++:1078C000FFFE304640F205110422FAF7F9FE304679 ++:1078D0004FF483712A22FAF7BBFEA4B2304640F27D ++:1078E00007116E22FAF7B4FEE2B230462946FAF7E3 ++:1078F000AFFEC4F30422304640F20911FAF7A8FEA5 ++:10790000304640F20511FD22FAF7CCFE30464FF426 ++:1079100083710122FAF7D4FE3220EEF31DF75D4C9D ++:1079200003E00A20EEF318F70A3C30464FF4857165 ++:10793000FAF776FE10F0010F01D1092CF1D1304693 ++:107940004FF48571FAF76CFE10F0010F08D1FAB20E ++:1079500030461821FAF7B4FE4FF00B0847460CE00A ++:10796000304640F20F11FAF75BFE00F01F071D2FA3 ++:107970008CBF4FF00B0807F1020819213046FAF7C7 ++:107980004FFE4FF48371FE2205463046FAF78AFE19 ++:10799000304640F20511FB22FAF784FE304640F2F1 ++:1079A00005110422FAF78CFE304640F2051102223E ++:1079B000FAF786FE30464FF483710122FAF780FE13 ++:1079C0003220EEF3C9F6334C03E00A20EEF3C4F69E ++:1079D0000A3C30464FF48571FAF722FE10F0010F91 ++:1079E00001D1092CF1D130464FF48571FAF718FE18 ++:1079F00010F0010F06D1EAB230461921FAF728FE3D ++:107A0000092506E030464FF48871FAF709FE00F0C8 ++:107A10001F053046FE224FF483716C01FAF742FED7 ++:107A200044EA85243046FB2240F20511FAF73AFE7B ++:107A30002C43304657215FFA89F2FAF709FE3046A7 ++:107A4000224640F63311FAF781FE2246BC02304648 ++:107A500044EA471440F63411FAF778FE304645EA16 ++:107A6000040240F63511FAF771FE304644EA070287 ++:107A700040F63611FAF76AFE48EA4812D205304657 ++:107A800040F63711D20DFAF761FEBDE8F087C04627 ++:107A900040420F008996980070B55B210446FD2294 ++:107AA000FAF700FE204604214022FAF709FE20469C ++:107AB0004FF490711022FAF703FE204678218022BD ++:107AC000FAF7FEFD204640F229110222FAF7F8FDEE ++:107AD000204657210122FAF7F3FD20465B210222BE ++:107AE000FAF7EEFD41F28830EEF336F6154D03E07D ++:107AF0000A20EEF331F60A3D5C212046FAF790FDAC ++:107B000010F0200F01D1092DF2D15C212046FAF7A7 ++:107B100087FD10F0200F03D020465C21FAF780FD8E ++:107B200020465B21FD22FAF7BDFD20465721FE22AB ++:107B3000FAF7B8FD204640F22911FD22FAF7B2FD0E ++:107B400070BDC0468996980070B504460E46002563 ++:107B50006E4B2046E95AFAF763FDA8530235302DE3 ++:107B6000F6D1182220466A49FAF72AFE3A21FB226A ++:107B70002046FAF797FD012220464FF48D71FAF75F ++:107B80009FFD362101222046FAF79AFD10224FF47C ++:107B90008D712046FAF794FD1420EEF3DDF53A21BD ++:107BA00001222046FAF78CFD1420EEF3D5F5B4F847 ++:107BB000DA3003F47043B3F5005F03D120463A2175 ++:107BC000012208E020463A2101220023FAF786FD2F ++:107BD0002046CA2104221346FAF780FD08222046D7 ++:107BE0004FF48D71FAF76CFD25210E222046FAF72D ++:107BF0002FFD252101222046FAF762FDB4F8DA3084 ++:107C000003F47043B3F5805F04D1204628211E227F ++:107C1000082303E0204628211E220C23FAF75EFDEC ++:107C20001420EEF399F5052108222046FAF710FDFD ++:107C300080224FF489712046FAF742FD1420EEF3BA ++:107C40008BF5FF2110222046FAF73AFD442240F23C ++:107C50001F112046FAF734FD1420EEF37DF50B21B9 ++:107C600007222046FAF72CFD102240F2131120467D ++:107C7000FAF726FD1420EEF36FF5072101222046C6 ++:107C8000FAF7E6FC1420EEF367F502230322204600 ++:107C9000FC21FAF723FDFD212046A622FAF7D8FCA5 ++:107CA000442240F21F112046FAF70AFD1420EEF399 ++:107CB00053F5FF2110222046FAF702FD1420EEF3BF ++:107CC0004BF5B4F8DA3003F47043B3F5805F03D1B9 ++:107CD00010492046082202E00F4920460622FAF702 ++:107CE0006FFD20465921CC22FAF7B2FC20465C21D8 ++:107CF0002E22FAF7ADFC20467821D722FAF7A8FC0D ++:107D0000204692211522FAF7A3FC70BDD20402008E ++:107D1000360A0200040B0200140B02002DE9F04F9A ++:107D200004468BB0894609B98B4608E040F2D7413A ++:107D3000FAF700FD01A983462046FDF799FD2022B0 ++:107D400013464FF49A612046FAF726FD6420EEF3BD ++:107D500003F540F276412046FAF7ECFC40F2A641EA ++:107D600080462046FAF7E6FC09A9824608AA204682 ++:107D700007ABFBF7B5F9099F089E079DB9F1000F06 ++:107D800009D0204601A9FDF75BFD204640F2D7410E ++:107D90005A46FAF7DBFC4FEAC850C00D4FEACA5307 ++:107DA00080F48070DB0D00F5FE70033083F4807387 ++:107DB000C01A8010394632462B46FCF7EBFC4000D7 ++:107DC0000BB0BDE8F08FC046F0B5D0F8A85085B034 ++:107DD00095F858340646002B7BD00023019302937C ++:107DE0000393FDF775F8C7B20FB17F2F71D101ABC7 ++:107DF00002AA304603A9FBF773F940F23E61304610 ++:107E0000FAF798FC40F2A641C4053046FAF792FC16 ++:107E1000C005C00DE40DFF288ABFA0F5807300F5F2 ++:107E200080729AB2FF2C84BFA4F5807398B2C2F519 ++:107E3000FE7398BF04F5807003331B18C3F38F00E3 ++:107E4000C7B995F856340133DBB2042B85F85634A4 ++:107E50003FD985F85674029A019B0399FCF79AFC66 ++:107E6000D5F848244310043B9342B8BF1346C5F8E5 ++:107E700044341AE07F2F2CD195F857340133DBB20C ++:107E8000042B85F8573424D9002385F85734029AF7 ++:107E9000019B0399FCF77EFCD5F84424431004337E ++:107EA0009342A8BF1346C5F84834D6F8A8109BB231 ++:107EB000D1F8442430469342A8BF1346D1F8482451 ++:107EC00040F2A7419342B8BF13469BB2FF22FAF794 ++:107ED00063FC05B0F0BDC0462DE9F04F474B87B0BD ++:107EE00003AC80460D4693E8070084E8070040F2A3 ++:107EF00045614046D8F8A8B0FAF71CFC40F246614C ++:107F000087054046FAF716FC3D498605062240469D ++:107F1000FAF756FC00210A464046FDF741F84FF4B7 ++:107F2000FA730193404629462022A3F5FA73009480 ++:107F3000FDF736FFBF0DB60D8246002849D0049DDF ++:107F4000DDF81490039C09EB0503012B02D84FF0D8 ++:107F5000000A3EE02046FBF74BF806464846FBF792 ++:107F600047F8A6F114031AB2002A06DB35FA02F12B ++:107F70003FD0013235FA02F206E0534215FA03F11E ++:107F800037D0D24315FA02F233B2C3F11E0314FA0A ++:107F900003F3C3EB0204A0F10B031BB2002B0A4650 ++:107FA00002DB35FA03F102E05B4215FA03F120D05F ++:107FB00003B2C3F11F0309FA03F394FBF2F493FB3A ++:107FC000F1F004FB1400FBF71FF8A7058605BF0DB1 ++:107FD000B60D404639463246FCF7E2FF40460949B5 ++:107FE0000622FAF7EDFB5046ABF8B872ABF8BA626E ++:107FF00000E0002007B0BDE8F08FC046BC060200DC ++:10800000C20E0200DC0E020070B504460D46C9B176 ++:1080100004221249FAF7D4FBD4F8A83093F8E933D4 ++:10802000A02B05D1204640F64A1140F24F1203E042 ++:10803000204640F64A11A722FAF788FB0849204655 ++:108040000E2201E007490A22FAF7BAFBE369291E6A ++:1080500018BF0121186938F0A7DB70BDBE0D020002 ++:10806000A20D0200D80D020070B50C46062226496A ++:10807000E4B20546D0F8A860FAF7A2FB0C2C01D8B0 ++:10808000002405E041F25013EB561C1E18BF0124DA ++:1080900096F81A35002B31D0284640F64211FAF7EF ++:1080A00049FB14B10F280BD100E0A8B9D5F8F8307E ++:1080B00013F0060F22D196F82C30A3421ED05CB1EB ++:1080C000EB690122D8689968EDF398F728460121F9 ++:1080D000FFF79AFF01230AE0EB690022D86899684C ++:1080E000EDF38CF728460021FFF78EFF002386F87A ++:1080F0002C30284605490C22FAF762FB2846044931 ++:108100000422FAF75DFB70BDB6070200700702009B ++:108110008807020070B50D46B0F8DA101646D0F8A0 ++:10812000A840FAF731FD28B994F84C342B7094F834 ++:108130004D3401E000232B70337070BD2DE9F04702 ++:108140004FF0000886B0054602ABCDF81080CDF8A0 ++:108150000C80CDF8088003AA8A4604A9D0F8A8901C ++:10816000FAF7BEFF28460DF117010DF11602FFF7D1 ++:10817000D1FF9DF8173004990193039A029B0124C3 ++:1081800028460094FCF71AFB9DF816300746019329 ++:108190002846029B0499039ACDF80080FCF70EFB59 ++:1081A00099F8E83306460BB39DF81700B5F902219C ++:1081B000B5F90431B5F906110190284603920293EE ++:1081C00004910094FCF7FAFA9DF8163004460193E6 ++:1081D00028460499039A029BCDF80080FCF7EEFA3A ++:1081E000A742B8BF27468642A8BF0646BAF1010F8C ++:1081F00002D0BAF1030F02D17B10C9F84434AAF1BE ++:108200000203DBB2012B02D87310C9F8483406B060 ++:10821000BDE8F08707B540F25643009340F255425F ++:108220000133FAF7F1FB0EBD2DE9F04340F2DF41D7 ++:1082300089B0D0F8A8400546FAF77CFAC3B27F2B84 ++:10824000A4F84C30C0F30720C4BFA3F58073A4F892 ++:108250004C307F28C8BFA0F58073A4F84E0001AF52 ++:10826000C8BFA4F84E301123039320262A330DF102 ++:1082700018094FF00208284639460493CDF80490B7 ++:10828000CDF808800596FFF7C5FF069B3F2B01D967 ++:10829000803B0693069B2365079B3F2B01D9803BC0 ++:1082A0000793079B40F2344163652846FAF742FA88 ++:1082B000C0B27F28C4BFA0F5807398B284F858007C ++:1082C00040F224412846FAF735FAC0F30720A4F813 ++:1082D0005A0040F225412846FAF72CFA0D23C0B285 ++:1082E000A4F85C00039328460F3339460493CDF875 ++:1082F0000490CDF808800596FFF78CFF069B236459 ++:10830000079B636409B0BDE8F083C0462DE9F041E6 ++:10831000B2F1FF3F8AB0064688461746D0F8A8500B ++:1083200002D1FCF7E1FB47B295F966355FFA88F4B4 ++:10833000013394FBF3F407230393193305930123CB ++:10834000E4B2029301AD07AB0193304604F5A0738C ++:1083500029460493FFF75EFF079BC034C3F307531E ++:108360000793304606AB294601930494FFF752FF6A ++:10837000002107980DF126020DF12203F0F31AF007 ++:108380000021402008AB09AAF0F314F0BDF9223017 ++:10839000BDF920108B4209DABDF92400C91AF0F3A7 ++:1083A000BBF0BDF82240ADF8240009E0BDF926007D ++:1083B000C1EB0301F0F3B0F0BDF82040ADF82600AA ++:1083C000BDF92600BDF92410F0F3B0F023B2032B61 ++:1083D00080B201DD231F01E0C4F104039AB212B29E ++:1083E00008FA02F103B2052003FB0010911E0123DD ++:1083F0008B40013AC018104107FB00F0C0F3CF00DA ++:108400000AB0BDE8F081C04670B5182386B0D0F838 ++:10841000A840039300238022049340F27666203321 ++:1084200005460593314613460292FAF7B5F904F171 ++:108430009C03284601A90193FFF7ECFE40F271610D ++:108440002846FAF777F940F27361A4F89C022846AF ++:10845000FAF770F940F27461A4F89E022846FAF720 ++:1084600069F940F27561A4F8A2022846FAF762F9A8 ++:1084700040F27961A4F8A0022846FAF75BF9314688 ++:10848000A4F8A4022846FAF755F940F2DA61A4F8F4 ++:10849000A6022846FAF74EF940F22551A4F8A802A0 ++:1084A0002846FAF747F994F86735A4F8AA0284F841 ++:1084B000AC324FF48F612846FAF73CF94FF49A61D9 ++:1084C000A4F8AE022846FAF735F940F22451A4F890 ++:1084D000B0022846FAF72EF9B4F86835C0F3C03078 ++:1084E000A4F8B43294F80734A4F8B20284F8B6328F ++:1084F00094F8083484F8B73206B070BD7FB5002315 ++:108500000293103304930DF116030093012301939A ++:10851000694654330393FFF77DFEBDF8160007B09C ++:1085200000BDC0462DE9F84FD0F8A860074696F880 ++:1085300046355BB9FFF7E2FF40F3072340B21FFA6D ++:1085400083F81FFA80F9C246CB4607E0B6F84A85A1 ++:10855000B6F84C95B6F84EA5B6F850B5B7F8DA307F ++:10856000384603F47043B3F5005F0CBFB6F866609D ++:10857000B6F868604FF0FF320121FCF72BFA36B2F3 ++:108580000121324684B23846FCF724FA0021241A2D ++:108590004FF0FF323846FCF71DFA0121324685B212 ++:1085A0003846FCF717FAA4B2C4EB0806B6B2C4EB1F ++:1085B00009042D1AFF2238463346A4B240F6521160 ++:1085C000FAF7EAF83846FF22234640F65311FAF745 ++:1085D000E3F83846FF22334640F65611FAF7DCF846 ++:1085E000ADB23846FF22234640F65711FAF7D4F8C9 ++:1085F000C5EB0A033846FF2240F648119BB2C5EB93 ++:108600000B05FAF7C9F8384640F64911FF22ABB21C ++:10861000FAF7C2F8BDE8F88F2DE9F04F93B00DF1ED ++:1086200026080C46D0F8A8503B49064693464046DB ++:10863000222201AFE9F3A0F4384638492222E9F3B7 ++:108640009BF4BCB10022304640F60F11FAF77EF8D9 ++:1086500095F8E933324AA02B324B14BF052403248A ++:1086600014BF1046184614BF4FF0100A4FF0110AFD ++:10867000B94616E0012230464FF41161FAF766F868 ++:1086800095F8E933284AA02B284B14BF0E240A245E ++:1086900014BF1046184614BF4FF0100A4FF0110ACD ++:1086A000C1460022114604E00B5A013224319B4599 ++:1086B00006D0A2421FFA82F8F6D14FF6FF7416E0F8 ++:1086C0000FFA88F2242302FB03070024254607E063 ++:1086D00035F80910304637F81420FAF737F8023524 ++:1086E00001340AF101039C42F2D11FFA88F43046AA ++:1086F000FCF74AF910B13046FFF714FF3046FCF79B ++:1087000065FD20B2B0F1FF3F0CBF4FF0FF300020FD ++:1087100013B0BDE8F08FC046E20A0200680802000C ++:10872000F826020040220200F4240200AC220200DB ++:108730002DE9F0438BB006460F4691460DF1060039 ++:108740001D492222E9F318F4D6F8A83093F8E9334A ++:10875000A02B14BF4FF010084FF0110817B93D4679 ++:108760003C4619E000252C4609E00DF10603E15ACC ++:108770003046F9F7DFFF013524F80900023445459A ++:10878000F3D10BE00DF10603E15A34F8092030462D ++:10879000F9F7DCFF013502344545F3D13046FCF7EB ++:1087A000F3F810B13046FFF7BDFE17B93046FCF7BD ++:1087B0000DFD0BB0BDE8F0830C0C020030B587B0A6 ++:1087C00005AB0093022301930023029350330C4620 ++:1087D00003936946102315460493FFF71BFDBDF86C ++:1087E00014302380BDF816302B8007B030BDC04652 ++:1087F0007FB50DF11603009301230193013B029312 ++:1088000057330393694610230493FFF703FDBDF824 ++:108810001600000A07B000BD07B540F256430093AA ++:1088200040F255420133FAF7B5F80EBDF0B5B0F895 ++:10883000DA30D0F8A85003F47043B3F5005F0CBFF2 ++:1088400095F8403395F8413387B085F8423395F871 ++:108850004233064685F84333B0F8DA3003F4704308 ++:10886000B3F5005F14D195F8492353B2002B02DD14 ++:1088700085F8482309E0C3691B6D13F4805F01D0BC ++:10888000342300E0302385F8483395F85C3313E057 ++:1088900095F84A2353B2002B02DD85F8482309E0FE ++:1088A000C3691B6D13F0805F01D0342300E03023D7 ++:1088B00085F8483395F85D335BB2002B4CDD03221D ++:1088C000022BA8BF022303FB02F340F2DF41304634 ++:1088D000DFB2F9F72FFFC1B27F29C0F30720C4BF71 ++:1088E000A1F5807399B203B27F2BC8BFA0F5807346 ++:1088F0007AB2C8BF98B292B2C2EB0003C2EB0102D7 ++:10890000DBB202F0FF0242EA0322304640F2DF41CE ++:10891000F9F71CFF0DF116030093022301930F33A7 ++:1089200002930F2303933046082369460493FFF70D ++:1089300071FC9DF81630FAB29B1A8DF816309DF82E ++:10894000173030469B1A69468DF81730FFF764FFE1 ++:1089500030466C46FDF7FEF94FF0FF3385F89A3349 ++:1089600095F84D33002285F8472385F89C23BBB149 ++:1089700085F8422385F84323304640F22341FF32F5 ++:10898000B5F85033F9F708FF30464FF4AA61B5F84F ++:108990006023F9F7DBFE304604490422F9F710FFA3 ++:1089A0003046FCF711F907B0F0BDC046EC0D0200EF ++:1089B0002DE9F04FC3690C464FF08051BBB005461E ++:1089C000D0F8A870164618690A4637F073DE0520FD ++:1089D000EDF3C2F628464FF489614FF4804200233C ++:1089E000F9F7DAFE0122284640F20A511346F9F758 ++:1089F000D3FE0DF1E70334930123359310333693FF ++:108A00000F2337932846082334A93893FFF702FC35 ++:108A10000CB1314612E0B5F8DA3003F47043B3F527 ++:108A2000005F40F03E81EB6997F8BF641B6D13F463 ++:108A3000805F0CBF08210621FF2E00D10E469DF855 ++:108A4000E720032306FB13238DF8E6300DF1E60340 ++:108A500034932846102334A93793FFF7DDFE7300C3 ++:108A6000FE229BB2284640F20A51F9F795FE97F88C ++:108A7000C044FF2C00F0EA80002C00F0C980102CCC ++:108A800028BF1024C4F12403D9B272B24BB29A4267 ++:108A900001DDCEB202E0002E08BF012670B2A04276 ++:108AA000019002DC5FFA86F902E0631C5FFA83F949 ++:108AB00004F1010BC9EB0B035FFA83F80D23369326 ++:108AC000133338934FFA89F35B004FFA88F204931B ++:108AD00009AB03EBC203570003937B1CDBB2079384 ++:108AE0006300013305934FEA4B03029206934FF064 ++:108AF000000A0198049AA042CABF73B2CDF8DCB054 ++:108B00003793379B34A953445B003793039B284624 ++:108B100035923493FFF77EFB07990AE03AA800EB01 ++:108B2000810353F8C42C42F0800243F8C42C8B1C00 ++:108B3000D9B2059A9142F1DD002111E03AAB03EB85 ++:108B4000810203EB870353F8C43C3AA842F8C43CC3 ++:108B500000EB870353F8C03C42F8C03C8B1CD9B2F1 ++:108B6000B942EBDB069A09AB349328464FEA4A0335 ++:108B700034A90AF1250A35923793FFF74DFEBAF171 ++:108B80004A0FB6D1019B4FFA88F2A342C4BF73B219 ++:108B900037934FFA89F335930DF1AE0303EB42039C ++:108BA000D8BFCDF8DCB034931023389328460E2379 ++:108BB00034A93693FFF72EFB0CE03AAE06EB4803E0 ++:108BC00033F83A2C42F4006223F83A2C08F10103FE ++:108BD0005FFA83F8A045F0D9002109E0029E3AA887 ++:108BE00000EB430200EB460333F83A3C22F83A3CF0 ++:108BF0000298CBB201318342F0DB0DF1AE03349326 ++:108C00002846002334A9CDF8D4B03793FFF704FEEB ++:108C100001221346284640F20E51F9F7BDFD4FF4EC ++:108C20007E4263021340284640F20E51F9F7B4FD2C ++:108C3000284640F20F517F222346F9F7ADFD284622 ++:108C400040F20F514FF47E52E3011BE0284640F200 ++:108C50000E5101220023F9F79FFD284640F20E51E4 ++:108C60004FF47E420023F9F797FD284640F20F515A ++:108C70007F220023F9F790FD284640F20F514FF470 ++:108C80007E520023F9F788FDEB694FF08051186997 ++:108C9000002237F00FDD2846FDF75CF83BB0BDE859 ++:108CA000F08F2146CAE6C0462DE9F041D0F8A86011 ++:108CB0000746D6F87C45002505E021463846FFF7F3 ++:108CC000ABFD01351434D6F878359D42F5D3BDE8B7 ++:108CD000F081C046F0B5C369D0F8A85087B0074608 ++:108CE00080219868EDF3F4F7044600286DD0B5F8BC ++:108CF0001C34002603F4807C03F4007E30464FF0E1 ++:108D0000000316F0100206F00101035316D0BEF165 ++:108D1000000F03D0D5F81C34C3F3802116F0080FE0 ++:108D200002D095F81A3408E0D5F8183416F0200F60 ++:108D300014BFC3F3072303F0FF030353BCF1000F79 ++:108D400000D062BB16F0040F09D016F0020F025BD0 ++:108D500002D0D5F80C340EE0D5F80C3418E016F03B ++:108D6000200F06F002030CD0025B13B1D5F81034CB ++:108D700001E0D5F8143409B11B0E0EE0C3F307432C ++:108D80000BE0025B13B1D5F8103401E0D5F81434D0 ++:108D900011B1C3F3072300E0DBB2134303530136E1 ++:108DA0000230402EABD10F230393002304933846A7 ++:108DB000103301A9059302960194FFF72DFDFB697D ++:108DC000214698688022EDF393F707B0F0BDC046C6 ++:108DD0002DE9F041002486B00594D0F8A88006461D ++:108DE000FBF782FE072302931933049307460123FE ++:108DF0002546019316E00BB90C4603E011F0010F74 ++:108E00000FD14C0830467AB2FFF780FA06AB43F830 ++:108E1000040D0093304604F5107369460393FFF781 ++:108E2000FBFC0135802DE9B298F96635E3D17BB1C1 ++:108E300001230193402405AB0093304604F51073E1 ++:108E400069460393FFF7E8FC631CDCB2802CF2D187 ++:108E500006B0BDE8F081C0462DE9F04FB0F8DA3039 ++:108E600089B003F47043B3F5005F07468B46D0F832 ++:108E7000A85002D1B5F8C42304E0B3F5805F08D14F ++:108E8000B5F8C62313B2B3F1FF3F02D01FFA82FA3E ++:108E900001E04FF0700A072304931933069301236E ++:108EA0004FF00009039307AB0293C846CDF8049036 ++:108EB000019B18F0010F0BEB0306F378009303D02E ++:108EC00095F96635002B59D1B7F8DA3003F47043C1 ++:108ED000B3F5005F03D0019B13F80B9012E0B5F8D7 ++:108EE000402413B2B3F1FF3F18BF1FFA82F9B5F85F ++:108EF0003E2408BF4FF00F0913B2B3F1FF3F1CBF70 ++:108F000092B20092B37872781B0443EA022343EAD8 ++:108F10000A6343EA0903079395F9663502AC013306 ++:108F2000B8FBF3F3C033384621460593FFF774FCD2 ++:108F300007AB029395F9663538460133B8FBF3F376 ++:108F400003F5A07321460593FFF764F93279009B7E ++:108F5000120542EA0372079B384623F07F4323F44D ++:108F600070031A43079295F9663521460133B8FB21 ++:108F7000F3F303F5A0730593FFF74EFC019B08F193 ++:108F800001080533B8F1800F019391D195F9663549 ++:108F9000002B36D05E4608F1800896F8423196F8EC ++:108FA00041211B0443EA022302AC43EA0A6343EA79 ++:108FB00009033846214608F180050793CDF814804F ++:108FC000FFF72AFC07AB3846214602930595FFF7C9 ++:108FD00021F996F84421009B120542EA0372079B8F ++:108FE000384623F07F4323F470031A43214608F1E7 ++:108FF0000108079205950536FFF70EFCB8F5A07F2E ++:10900000CBD109B0BDE8F08F10B5B0F8DA30D0F8A8 ++:10901000A82003F47043B3F5005F03D1D2F87415B0 ++:10902000FFF71AFF10BDC0462DE9F043054687B093 ++:10903000D0F8A890002940D0072399F8C272029373 ++:1090400019330493012301934FF0000805AB0093FB ++:109050002AE007F1C003284669460393FFF7DAF8D0 ++:1090600006F1C003284669460393FFF7D5FB07F5D1 ++:10907000A073284669460393FFF7CCF806F5A07362 ++:10908000284669460393FFF7C7FB07F51073284688 ++:1090900069460393FFF7BEF806F510732846694644 ++:1090A0006C460393FFF7B8FB99F8C2325FFA88F673 ++:1090B000B34208F10108CCD20CE0B0F8DA3003F486 ++:1090C0007043B3F5005F02D10449FFF7C5FE28469F ++:1090D000FFF77EFE07B0BDE8F083C04684C90200FA ++:1090E0002DE9F041D0F8A84086B094F907144FF06C ++:1090F000FF3289B20646FFF709F994F9673505464C ++:10910000022B01D0002007E094F90814304689B200 ++:109110004FF0FF32FFF7FAF8072302931933049355 ++:109120000123C0EB05070193304605ABB4F8681581 ++:109130004FF0FF320093FFF7E9F84FF000084FF0CF ++:109140000003C019A4F86A3548BFA4F86A0521E0F5 ++:1091500094F8662512B111F0010F19D1B4F86835F1 ++:10916000B4F96A558B4253B238BFED1B013391FB02 ++:10917000F3F3DBB203F5107330464FF0FF32039385 ++:10918000FFF7C4F8401B059069463046FFF744FBE3 ++:1091900008F10108B8F1800F5FFA88F1D8D194F98D ++:1091A00066357BB10123019305AB0093402404F5A0 ++:1091B0001073304669460393FFF72EFB631CDCB245 ++:1091C000802CF4D106B0BDE8F081C04630B518233C ++:1091D00087B0D0F8A8400393083305936033029317 ++:1091E00000230546049301A904F19C030193FFF7B2 ++:1091F00013FB2846B4F89C2240F27161F9F7A6FAF5 ++:109200002846B4F89E2240F27361F9F79FFA284687 ++:10921000B4F8A22240F27461F9F798FA2846B4F83B ++:10922000A02240F27561F9F791FA2846B4F8A42219 ++:1092300040F27961F9F78AFA2846B4F8A62240F29A ++:109240007661F9F783FA2846B4F8A82240F2DA6189 ++:10925000F9F77CFA2846B4F8AA2240F22551F9F72A ++:1092600075FA2846B4F8AE224FF48F61F9F76EFA1A ++:109270002846B4F8B0224FF49A61F9F767FAB4F8C7 ++:10928000B2324FF40042DB032846134040F224512F ++:10929000F9F782FA94F8AC32284684F86735B4F8C6 ++:1092A000B432A4F8683594F8B63284F8073494F8E8 ++:1092B000B73284F80834FFF713FF07B030BDC0465B ++:1092C0002DE9F04F8DB0039202930BAB0646D0F818 ++:1092D000A8708B4600930DF12F010DF12D030DF1B8 ++:1092E0002E02FCF75BF930460DF12A010AAAFFF7BE ++:1092F00065FA3046FFF702F90723069319330893FE ++:1093000009AB04934FF000080123059381464FF405 ++:1093100050735D46C246079338E097F8662522B140 ++:109320000AEB0B0313F0010F2DD153B2013304AC40 ++:10933000B5FBF3F303F5A073304621460793FEF720 ++:1093400069FF099BBDF828201B0D92051B05920D96 ++:109350001A43BDF82A3030469B059B0D42EA83280C ++:109360002146CDF82480FFF757FACDF8249097F9DD ++:10937000663530460133B5FBF3F303F5E073214660 ++:109380000793FFF749FA01350AF1010A039A95425A ++:10939000C3D997F96635C3B17F2A16D14FF4C0758A ++:1093A00004AC304621460795CDF82480FFF734FA07 ++:1093B00005F18003304621460135CDF8249007930E ++:1093C000FFF72AFAB5F5E07FEAD1029A07EB4203EC ++:1093D000BDF82A20A3F86C20BDF82820A3F87890C7 ++:1093E000A3F872209DF82F3087F87E309DF82E303C ++:1093F00087F87F309DF82D3087F880309DF82C302D ++:1094000087F881300DB0BDE8F08FC0462DE9F04FF0 ++:109410008DB00393C369D0F8A86005460C469868E0 ++:109420004FF480619346EDF353F40746002800F0B3 ++:109430008A80C5F8FC4F28460121FDF769FA96F8A5 ++:109440002C3043B1284641490622F9F7B9F928469C ++:109450000021FEF7D9FDA4B101203D4984EAE47260 ++:10946000A2EBE47200FB01F1B1FBF2F39EB202FB4E ++:1094700006F2431C8A4298B2EFD1B6F5807F01D93B ++:109480005AE00226242304FB03F349F6404293FBEF ++:10949000F2F300241B04642293FBF2FAA146A046D7 ++:1094A0002EE048460AA9F9F72FFD0B9B03FB0BF3AF ++:1094B000002B04DBDB130133C3F3490206E05B42FC ++:1094C000DB1301335B105B429A05920D0A9B03FB91 ++:1094D0000BF3002B04DBDB130133C3F3490306E07A ++:1094E0005B42DB1301335B105B429B059B0D43EA40 ++:1094F000822347F82830631CD1449CB208F101084C ++:10950000B442CED1062228461249F9F759F915235B ++:10951000079300240B33284605A90993059706965F ++:109520000894FFF779F9039B2846009331464FF6DC ++:10953000FF722346FDF772F8EB69394698684FF4DD ++:109540008062EDF3D5F30DB0BDE8F08FCE070200D9 ++:10955000005A6202C207020030B587B005AB009323 ++:1095600001230193173302930833002204934FF42D ++:109570000023054603920593144628466946FFF7E3 ++:109580004BF9039B01330393631CDCB2802CF4D1B1 ++:1095900007B030BDF0B5D0F8A83087B093F89A2561 ++:1095A0000746002A2DD1324B324D1E68144605E085 ++:1095B00029463846FFF730F901341435B442F7D163 ++:1095C0002D4A002453683846019310230293082340 ++:1095D00004931368694600930394FFF71DF9FB6930 ++:1095E0001B6B082B0DD1254A3846536869460193F9 ++:1095F000122302930E330493136803940093FFF72E ++:109600000BF9102304930DF1160300934FF072032E ++:1096100008260125ADF81630384600236946039325 ++:1096200002960195FFF7F8F84FF082033846694635 ++:10963000ADF816300395FFF7EFF84FF006036946D3 ++:109640003846ADF816300396FFF7E6F83846FFF7D0 ++:10965000DBFC3846FFF728FB3846FFF73BFB384674 ++:10966000FFF7B6FB38466C46FFF776FF07B0F0BD54 ++:10967000F8100200D4150200181D0200F41C0200AC ++:1096800070B5B0F8DA30054603F47043B3F5005F07 ++:10969000D0F8A8200CD192F9F133B3F1FF3F37D1C4 ++:1096A000B2F9F833B3F1FF3F32D1B2F92C352CE0E7 ++:1096B000B3F5805F35D192F95B35B3F1FF3F27D128 ++:1096C00092F9F333B3F1FF3F22D192F95C35B3F154 ++:1096D000FF3F1DD1B2F90034B3F1FF3F18D1B2F909 ++:1096E0003035B3F1FF3F13D1B2F90234B3F1FF3F8C ++:1096F0000ED1B2F93435B3F1FF3F09D1B2F90434D8 ++:10970000B3F1FF3F04D1B2F93835B3F1FF3F08D0D0 ++:10971000012482F86645102228464FF49A611346C8 ++:1097200007E0002482F8664528464FF49A6110222B ++:109730002346F9F731F84FF48F6103222346284678 ++:10974000F9F72AF82846FFF725FF2846FBF7E2FF3E ++:109750002846FCF7E1FE2846FFF768F870BDC046D2 ++:1097600010B5002388B00593103307930DF106035D ++:10977000039301230446ADF80610049303A9543360 ++:109780000693FFF749F82046FBF7FEF810B1204694 ++:10979000FEF7C8FE08B010BD2DE9F041D0F8A87062 ++:1097A0000646002419E0B6F8DA3003F47043B3F546 ++:1097B000805F07D1A218137923B1890492783046CB ++:1097C000890C07E06B4BE21853792BB18904D278EE ++:1097D0003046890CF8F73CFF0634664A4FF6FF73B3 ++:1097E000A15A9942DFD1304673210022F8F730FFA9 ++:1097F000304632216A22F8F72BFF192230463321F6 ++:10980000F8F726FF97F8EC231AB130463321F8F722 ++:109810001FFFC2216F223046F8F71AFF9021102255 ++:109820003046F8F715FF102100223046F8F710FFF8 ++:109830009B2107223046F8F70BFF1D2102223046FC ++:10984000F8F706FF1E2106223046F8F701FF3046E2 ++:1098500040F2EA4144F28862F8F778FFB6F8DA306D ++:1098600003F47043B3F5005F0DD197F8E933B6F810 ++:10987000DE1FA02B14BF022204220BB2B3F1FF3F64 ++:109880000DD0CAB20BE0B3F5805F07D1B6F8E02F78 ++:1098900013B2B3F1FF3F01D0D2B200E0022253B2C3 ++:1098A0001FFA83F807224346304640F2EB41F8F7AF ++:1098B00073FFB6F8DA3003F47043B3F5005F05D0F8 ++:1098C000B3F5805F04D197F83B350BB9002400E075 ++:1098D00001242346254624010F22A4B2304640F23B ++:1098E000F241F8F759FFF0222346304640F2F241A8 ++:1098F000F8F752FF0F22304640F2F1412B46F8F7BD ++:109900004BFFF0222346304640F2F141F8F744FF86 ++:109910004FEA0823304640F2F2414FF4E06203F48C ++:109920007F43F8F739FFB6F8DA30304603F4704376 ++:10993000B3F5805F0CBF03F53B7341F2EA23F45AA1 ++:1099400040F2EB41630203F47E434FF40072F8F7F8 ++:1099500023FFB6F8DA3003F47043B3F5805F0BD021 ++:1099600041F23433F25A13B2B3F1FF3F04D0930201 ++:1099700003E0C046EC260200A3024FF4806203F429 ++:109980007C43304640F2EB41F8F706FF40F2EB41F2 ++:109990003046D6F8A840F8F7CDFEC0F3802084F812 ++:1099A000470540F2EB413046D6F8A840F8F7C2FE32 ++:1099B000C0F3402084F84805D6F8A820304692F835 ++:1099C000481592F847355B1A18BF012382F84635CF ++:1099D000FAF7ECFF830203F47C43304640F646116D ++:1099E0004FF48062F8F7D8FE304643490622F8F774 ++:1099F000E7FE41F21D23F35C2BB10F2230467721A5 ++:109A00001346F8F76BFE30460021FFF7A9FE97F8E2 ++:109A10009A352BB93046FEF73FF83046FDF71EFF6A ++:109A2000F3697A21186936F065DE97F8EC23400077 ++:109A300084B22AB124B1F369A11C186936F078DE2A ++:109A400097F8ED232AB124B1F3692146186936F05D ++:109A50006FDE97F8BB34DBB104221346304640F288 ++:109A60001D11F8F73BFE30469F213F2297F8BC348A ++:109A7000F8F734FE30469E213F2297F8BD34F8F7C0 ++:109A80002DFE304677210F2297F8BE34F8F726FED8 ++:109A9000B6F8DA3003F47043B3F5805F29D197F953 ++:109AA000583533B3B42124223046F8F7D1FDB7211D ++:109AB00024223046F8F7CCFD0322B8213046F8F7CF ++:109AC000C7FD97F95825022A07D13046B821F8F783 ++:109AD000BFFD3046B521012209E0032A09D13046F5 ++:109AE000B821013AF8F7B4FD3046B5210022F8F765 ++:109AF000AFFDBDE8F081C046C604020010B5FFF717 ++:109B00004BFE10BD70B50026D0F8A850C0F8FC6F11 ++:109B100095F82C3004463BB12A490622F8F750FE4E ++:109B200020460121FEF770FA204640F24461F8F722 ++:109B300001FE10F0010309D020463146FCF740FD3C ++:109B40000222204640F23F61134607E010F0020F68 ++:109B500006D0204640F253414FF40042F8F71CFE75 ++:109B6000204619490922F8F72BFE20460021FCF770 ++:109B7000CFFE2046FAF71AFF30B12046FEF7BEFCB2 ++:109B800001462046FFF7ECFD95F8473520469B023D ++:109B900003F47C4340F2EB414FF48062F8F7FCFDA4 ++:109BA000B5F84E356BB1204640F64811FF22F8F764 ++:109BB000F3FD204640F64911FF22B5F85035F8F77D ++:109BC000EBFD70BDE60B0200F20B020070B50C4617 ++:109BD00088B00546F9F720F944B92846FFF792FF07 ++:109BE00028462146FCF794FE204622E028462146DE ++:109BF0000122FAF789F8064608B1012019E0284643 ++:109C00000121FCF785FE0C4B40240393152305939B ++:109C10002846102303A9079304940696FEF7FCFD3B ++:109C2000284621464FF6FF7233460096FCF7F6FCB5 ++:109C3000304608B070BDC0469A21020070B50023BE ++:109C400086B002931033049305AB009302230446BD ++:109C5000ADF8141001930D464E3369461646ADF823 ++:109C600016200393FEF7D8FD2046FAF79FFE78B33F ++:109C7000204640F6461140F2FF322B46F8F78CFDA5 ++:109C8000204640F6471140F2FF323346F8F784FD94 ++:109C900020464FF4156140F2FF322B46F8F77CFD69 ++:109CA000204640F6511140F2FF323346F8F774FD7A ++:109CB000204640F6541140F2FF322B46F8F76CFD77 ++:109CC000204640F6551140F2FF323346F8F764FD66 ++:109CD00006B070BD2DE9F04F8DB004910392D0F81D ++:109CE000A860074606EB4303B3F872B0B3F86C10F4 ++:109CF000B3F878905A460591FFF7A0FF38464946D9 ++:109D0000FFF72EFD0723089319330A934FF000083D ++:109D10000123049D0793C2460BAB069337E096F8E8 ++:109D200066252AB104990AEB010313F0010F2BD128 ++:109D300053B2013306ACB5FBF3F303F5A073384619 ++:109D400021460993FEF766FA0B9B05994FEA8B5261 ++:109D50001B0D1B05920D1A438B059B0D42EA8328B0 ++:109D600038462146CDF82C80FEF756FD96F966352B ++:109D700038460133B5FBF3F303F5E073214609934D ++:109D8000CDF82C90FEF748FD01350AF1010A039A3F ++:109D90009542C4D996F96635C3B17F2A16D14FF4DE ++:109DA000C07506AC384621460995CDF82C80FEF7E3 ++:109DB00033FD05F18003384621460135CDF82C905E ++:109DC0000993FEF729FDB5F5E07FEAD196F8810009 ++:109DD00096F87E1096F87F2096F8803000903846EE ++:109DE000FBF7DEFC0DB0BDE8F08FC04670B500217A ++:109DF0000446D0F8A8500B467F22FFF76BFF2046A1 ++:109E0000FFF7E4F92046B5F8B812B5F8BA22FBF727 ++:109E1000C7F8204640F2D16104220023F8F7BCFCC9 ++:109E200070BDC04670B50446D0F8A8300D4699B153 ++:109E300093F8BC3233B3FFF7D9FF20460422002346 ++:109E400040F2D161F8F7A8FC8022204640F276610A ++:109E50001346F8F7A1FC15E00422134640F2D16145 ++:109E6000F8F79AFC8022204640F276612B46F8F7FC ++:109E700093FC20462946FFF773FC204629462A46D4 ++:109E8000FFF7DCFE70BDC04630B500238BB00893F1 ++:109E9000079306930733054603930A4609B90491CD ++:109EA00002E04FF4307304932023059309AB019330 ++:109EB000012302933AB9284608A907AA06ABF9F785 ++:109EC0000FF9002409E0B5F902310793B5F904311F ++:109ED0000693B5F906310893F3E70899069B2046E7 ++:109EE000079AFAF757FC01A909902846FEF794FC57 ++:109EF000049B01340133802C0493EED10BB030BDB0 ++:109F0000F0B5284B8BB005AC05460F460FCB84E867 ++:109F10000F0041F22403EB5CD5F8A8601BB196F862 ++:109F2000E034002B3BD028461F490822F8F748FCB4 ++:109F3000072302931933049304230193009403F538 ++:109F40004F7301240393284686F86A406946FEF75A ++:109F500063FC0023099309AB019400934FF45174FF ++:109F6000284669460394FEF757FC013440F25E33FD ++:109F70009C42F5D128460D491222F8F721FC7B00BE ++:109F80009BB2284640F2A94140F2FF12F8F704FCC8 ++:109F9000284640F2A36110220023F8F7FDFB0BB026 ++:109FA000F0BDC04668050200620C020054090200C0 ++:109FB00030B5D0F8A8509BB004460022A31893F9FE ++:109FC000103501A95B4241F822300132142AF5D143 ++:109FD00095F86A3063B907331793193319931591BC ++:109FE00003F54873204615A916921893FEF714FC42 ++:109FF000D4F8A81094F82936D1F844242046934286 ++:10A00000A8BF1346D1F8482440F2A7419342B8BFF5 ++:10A0100013469BB2FF22F8F7BFFB95F8E833F3B184 ++:10A02000B5F8E62394F8293620469B1A1B024FF414 ++:10A030007F42134040F2D141F8F7AEFB94F8292655 ++:10A0400095F825352046C3EB420395F8E62340F208 ++:10A05000D1419B1A5BB2FF229BB2F8F79DFB2046D1 ++:10A06000FAF7A6FB1BB030BD70B5C6B001ACD0F896 ++:10A07000A8500646002120464FF48072E7F3E0F72F ++:10A080000723439319334593419495F86A3043B9B4 ++:10A090001E33429330464FF4507341A94493FEF768 ++:10A0A000BBFB402342933046DB1841A94493FEF7A3 ++:10A0B000B3FB46B070BDC0462DE9F04106460C46E4 ++:10A0C000FAF72CFF214605463046FAF74FFC2946A1 ++:10A0D00004463046FAF74AFC4022B4F5404F0CBF24 ++:10A0E00013460023054640F2DA613046D6F8A870E0 ++:10A0F000F8F752FB1022B4F5404F14BF134600236B ++:10A10000304640F2A361F8F747FB0122B4F5404F17 ++:10A1100014BF00230123304640F26E41F8F73CFBA8 ++:10A12000A54200F09580B5F5404F02D13046FFF7CB ++:10A130009BFFB4F5404F3CD13046FFF739FFD6F8CE ++:10A14000A8203B8E92F966255B00013293FBF2F367 ++:10A15000304640F2A44140F2FF129BB2F8F71CFBDC ++:10A160007B8E30461B0240F2A5414FF4E06203F4BF ++:10A170007F43F8F711FB04223046002340F21F1101 ++:10A18000F8F7ACFAF369E021186936F0B3DA002188 ++:10A19000F8853046FAF7A2FF4FF0FF3387F83430E6 ++:10A1A000304640F2A9414FF400420133F8F7F4FA87 ++:10A1B00003E030460121FAF791FF304640F2A44116 ++:10A1C0004FF460422346F8F7E7FAB4F5404F0FD159 ++:10A1D0003046FAF7EBFB40F2A44100280CBF4FF4E5 ++:10A1E000005300234FF400523046F8F7D5FA15E03B ++:10A1F0004EF201039C4211D13046FAF717FB01469B ++:10A200003046FFF77DFE304640F2A941F8F792FA5A ++:10A210000223C0B290FBF3F087F8C10297F96735CB ++:10A22000012B0DDD40F2A4413046F8F783FAC0F36C ++:10A23000803340F2255130464FF40042DB0305E005 ++:10A24000304640F225514FF400420023F8F7A4FABB ++:10A25000BDE8F08170B50023D0F8A82080F82B3637 ++:10A2600092F8E03405468BB190F92A16D2F84834BA ++:10A27000994203DBD2F81035994207DA4EF2010118 ++:10A28000FFF71AFF012385F82B3612E041F2240371 ++:10A29000EB5C73B12846FAF741FE002104462846DC ++:10A2A000FFF70AFF2846FFF783FE28462146FFF7FF ++:10A2B00003FF70BD30B5072389B0D0F8A8400393E1 ++:10A2C0001933059306AB0193012302930546013B25 ++:10A2D000049308E0284601A9FEF79EFA049B013387 ++:10A2E0000493069B01330693069B7F2BF2D94FF410 ++:10A2F00030730493A3F5307308E0284601A9FEF7F4 ++:10A300008BFA049B01330493069B01330693069B4F ++:10A310007F2BF2D9092228465B49F8F751FA01212F ++:10A320002846FBF7A3FB242228465849F8F748FAA9 ++:10A330002846FAF75FFDC0F34F00E62801DDFF2352 ++:10A3400005E02846FAF756FD4008193083B2FF228F ++:10A3500040F2A5412846F8F71FFA2846FFF784FE89 ++:10A36000B4F8E623B4F8E433284603EB42039B0138 ++:10A370009BB24FF49A6147F6C072F8F70DFA0922C2 ++:10A3800028464349F8F71CFAB5F8DA30282103F4D7 ++:10A3900070431E22B3F5005F14BF18231C23284608 ++:10A3A000F8F79CF901223A2113462846F8F796F966 ++:10A3B0000822134628464FF48D71F8F78FF92521AE ++:10A3C0000C222846F8F744F9B5F8DA3003F4704364 ++:10A3D000B3F5005F04D1022228463A21134603E078 ++:10A3E00028463A2102220023F8F778F9082213467A ++:10A3F00028460521F8F772F9284606222549F8F77C ++:10A40000DFF947F20802284640F2D7414FF40053E3 ++:10A41000F8F7C2F92846FAF7EDFC102305930DF181 ++:10A420001E03019301230824ADF81E000293284661 ++:10A43000053301A904930394FEF7EEF928460F2291 ++:10A440001549F8F7BDF928463521FF220023F8F712 ++:10A4500045F92846362103220023F8F73FF928461C ++:10A46000224623464FF48D71F8F738F94FF4806295 ++:10A47000284640F2A4411346F8F78EF92846FBF728 ++:10A480008DFA09B030BDC046C60D02009A05020023 ++:10A49000A4070200F40D0200000E02007FB50902BD ++:10A4A00006AB23F8021D009301230193013B0293A5 ++:10A4B00057330393694610230493FEF7ADF907B0B1 ++:10A4C00000BDC0462DE9F041D0F8A8308AB083F82D ++:10A4D000341083F8C11293F9663506460F466BB106 ++:10A4E00011F0010304D04FF48F610C22082302E025 ++:10A4F0004FF48F610C22F8F74FF97F08072303937D ++:10A5000001AC07F5A07320254FF0010804933046F5 ++:10A5100009AB214601930595CDF80880FDF77AFE39 ++:10A5200007F1C003049330460DEB05032146019368 ++:10A530000595FDF76FFE089B304603F0FF02ADF86E ++:10A540001820C3F30722C3F30743ADF81C30099B5F ++:10A5500006A9C3F30273ADF81A20ADF81E30FAF75E ++:10A56000F5FD09993046C1F30751FFF797FF3046D3 ++:10A570004146FAF7B3FD0AB0BDE8F0812DE9F04F8E ++:10A5800091B0BDF8783002AC0193BDF87C3007463D ++:10A590000093534B9DF880601D460FCD0FC495E886 ++:10A5A0000F009DF8748084E80F0038464D4904225E ++:10A5B000BDF87090BDF884A0BDF888B0F8F700F938 ++:10A5C000384640F2A36102227300F8F7E5F8B8F1CB ++:10A5D000000F18D010AB4FF4002243F8042D0A935B ++:10A5E00001230B9317330C9308330E9300230D9321 ++:10A5F0001C4638460AA9FEF70FF90D9B01340133BA ++:10A60000402C0D93F5D1032409FB04F43846FAF7E6 ++:10A61000EBFE0134384640F2A1615246F8F796F855 ++:10A62000A4B2384640F2A2615A46F8F78FF82246A3 ++:10A63000384640F27E61F8F789F838462A49042204 ++:10A64000F8F7BEF80134142304FB03F4013CA2B272 ++:10A6500038464FF4C861F8F779F80022384640F2DE ++:10A660007761F8F773F808230B930D330C930B33D2 ++:10A6700000240E93384602AB0AA90A930D94FEF704 ++:10A68000CBF8384640F27B61019AF8F75FF838461C ++:10A6900040F27C61009AF8F759F82246384640F2B9 ++:10A6A0007D61F8F753F821463846FFF7F7FE384644 ++:10A6B0000E490422F8F784F80D4C03E00A20ECF36D ++:10A6C0004BF00A3C384640F27661F8F733F810F068 ++:10A6D000010F01D0092CF1D111B0BDE8F08FC046B7 ++:10A6E000B80C0200780B02008A0802001E0E02005D ++:10A6F00049420F002DE9F043D0F8A8908BB00646F0 ++:10A700008846052503270F2DA8BF0F250024ABB2CF ++:10A71000019330460121224623460094029403947B ++:10A720000494FAF75BFDDB2302934FF4AF630493C9 ++:10A730004FF482430593A3F58143012207933046EA ++:10A740002146234600940194039206940894FFF74F ++:10A7500015FFB8F1000F1DD140F2BA613046F7F78E ++:10A76000E9FF40F2BB6104B23046F7F7E3FFA40112 ++:10A77000A4B244F3891404FB04F440F3090000FB81 ++:10A780000043B3F5005F01DAED1B03E0B3F5804F42 ++:10A7900004DBED1917B17B1EDFB2B4E7092D01DD33 ++:10A7A000092501E025EAE5752846C9F838500BB0BF ++:10A7B000BDE8F0832DE9F043D0F8A8608DB096F99C ++:10A7C000663507468846CCB2D3B1634B01EA030332 ++:10A7D000002B05DA013B6FEAC3736FEAD3730133D1 ++:10A7E000012B04D14FF48F610C22073303E04FF4A7 ++:10A7F0008F610C220023F7F7CFFF022398FBF3F8B9 ++:10A80000072386F8344086F8C14201AD039308F56A ++:10A81000A07320244FF00109049338460BAB29465E ++:10A8200001930594CDF80890FDF7F4FC08F1C003FE ++:10A83000049338460AAB294601930594FDF7EAFCD8 ++:10A840000A9B384603F0FF02ADF81820C3F3072235 ++:10A85000C3F30743ADF81C300B9B06A9C3F3027387 ++:10A86000ADF81E30ADF81A20FAF770FC9DF82B10E9 ++:10A87000384601F07F01FAF71DFC0B993846C1F309 ++:10A880000751FFF70BFE38464946FAF727FC0B9AAB ++:10A890003846C2F389219205920DFFF7CFF908F5EA ++:10A8A000E0730493384609AB29460193FDF7B2FCE7 ++:10A8B0003846BDF82410FEF753FF08F510730493D3 ++:10A8C00038460DEB040329460193FDF7A3FC089BD2 ++:10A8D0003846DB009BB240F2A66141F6FF72F7F703 ++:10A8E0005BFF96F967354B4532DD40F2255138461E ++:10A8F000F7F720FF4FF48072C3B29845D4BF00240D ++:10A90000012438469845CCBF1346002340F2255118 ++:10A91000F7F742FF6302384640F225514FF40072C8 ++:10A9200003F47E43F7F738FFA302384640F225517F ++:10A930004FF4806203F47C43E402F7F72DFF3846BE ++:10A9400040F225514FF4006204F47843F7F724FFF6 ++:10A950000DB0BDE8F083C0460100008070B504462C ++:10A960000D460021FFF7A8FB20462946FFF722FFEE ++:10A9700070BDC0462DE9F04F89B0054600920191A7 ++:10A98000FAF7CCFA40F23B4103902846F7F7D2FEA3 ++:10A9900004A902902846FAF70FFA00244FF47A70BF ++:10A9A0000134EBF3D9F6022CF8D141F2F023EA5846 ++:10A9B00092F820301F1E18BF012792F821300BB1EA ++:10A9C0007B1C9FB292F822300BB17B1C9FB292F895 ++:10A9D00023300BB17B1C9FB24FF00009C8464FF0EB ++:10A9E000140ABCE0D5F8B030D3F8203183F001036D ++:10A9F00013F0010403D1EB69186935F0CBDE28466A ++:10AA0000F8F756FB41F2F023EB58284603EB4803D6 ++:10AA1000998CFFF7A3FF28465146FFF73FFD1CB96D ++:10AA2000EB69186935F0A2DE4FF40042284640F287 ++:10AA3000A4411346F7F7B0FE002441F288300134F8 ++:10AA4000EBF38AF6032CF8D1284640F2A641F7F73B ++:10AA500071FEC005C00DFF2886BFA0F580731FFAE8 ++:10AA600083FB00F5807B00263446284640F23E6199 ++:10AA7000F7F760FE631CC005C00D9CB23618102CA1 ++:10AA8000F3D1C6F30F13FF2B8CBFA3F5807303F52F ++:10AA90008073504600210DF11E029EB20DF11A0383 ++:10AAA000EDF388F441F2F023EB580021434493F88E ++:10AAB000200007AA06ABEDF37DF4BDF91A30BDF90D ++:10AAC00018108B4209DABDF91C00C91AEDF324F500 ++:10AAD000BDF81A40ADF81C0009E0BDF91E00C1EB3D ++:10AAE0000301EDF319F5BDF81840ADF81E00BDF9EE ++:10AAF0001C10BDF91E00EDF319F523B2032B81B232 ++:10AB000001DD231F01E0C4F1040398B200B2431E2B ++:10AB100001229A4009B2052301FB032353FA00F0F6 ++:10AB200000F10C03182B16D841F2F023EB58019AD0 ++:10AB300003EB88031B69C31802F809304FEA9B0333 ++:10AB4000C3F17F03009A03EB960302F8093009F181 ++:10AB500001031FFA83F908F101031FFA83F8B845CE ++:10AB6000FFF440AF0AF101035FFA83FABAF1640F10 ++:10AB700002D84FF00008F2E7029B2846C3F3801189 ++:10AB8000FAF7ACFA284604A9FAF7E0FA284603993E ++:10AB9000FFF792FA484609B0BDE8F08F2DE9F04F73 ++:10ABA0001E46C369A9B0D0F8A88004460F4698682D ++:10ABB0004FF483711546ECF38BF00790002800F0FA ++:10ABC000EF81022E0FD016E00E4694F8DA3011F81D ++:10ABD0000629013D9A420BD17188B2882046FAF7C6 ++:10ABE000DFF90126CCE1062305FB03F3063BF91848 ++:10ABF000002DE9D1C3E1012E40F0C1812046FAF7D2 ++:10AC00008DF9002108902046FFF756FA0025934B56 ++:10AC10002046E95AF7F704FD1AABE8520235182D21 ++:10AC2000F5D140F231612046F7F784FD15220B90F3 ++:10AC300040F231612046F7F79FFD40F24C4120463B ++:10AC4000F7F778FD40F24D410C902046F7F772FD82 ++:10AC50004FF496610D902046F7F76CFD40F2B1413C ++:10AC60000E902046F7F766FD40F2F9410F9020461E ++:10AC7000F7F760FD40F2FA4110902046F7F75AFDD1 ++:10AC800040F6381111902046F7F754FD40F639117F ++:10AC900012902046F7F74EFD40F23B4114902046BB ++:10ACA000F7F748FD40F23C4115902046F7F742FD8A ++:10ACB00040F2DA6116902046F7F73CFD40F2DB6186 ++:10ACC00018902046F7F736FD40F2B741199020461C ++:10ACD000F7F730FD40F23B4113902046F7F72AFD8D ++:10ACE000C0F380100A9008B9099007E0204626A911 ++:10ACF000FAF762F898F8C182CDF82480204632999C ++:10AD0000FFF72CFE062220465549F7F759FDB4F807 ++:10AD1000DA3003F47043B3F5005F04D12046982184 ++:10AD20000322F7F795FC20464E491922F7F748FD14 ++:10AD300020464D491822F7F743FDB4F8DA304FF0BA ++:10AD4000030B03F47043B3F5005F14BF0423002327 ++:10AD5000179322E11FFA88F300931FFA89F3002664 ++:10AD600001931FFA8BF3324602932046179B31461C ++:10AD700003960496FAF732FA20460121FAF742F9CF ++:10AD80003346204639493C22FEF740FB20464FF42B ++:10AD900089713246F7F75CFC20AB00934FF4FA7AE6 ++:10ADA00020464FF4806120223346CDF804A0FAF704 ++:10ADB000F7FF054620B92E48F6F776FC2F4636E019 ++:10ADC0003346204629497822FEF720FB20464FF4DF ++:10ADD00089713246F7F73CFC23AB009320464FF4D1 ++:10ADE000806120223346CDF804A0FAF7D9FF18B9C4 ++:10ADF0002048F6F759FC1AE0219A24982299B0EBE2 ++:10AE0000420F0ED993009B1898420AD2259AB2EBB2 ++:10AE1000410F06D98B005B189A422CBF00270127EF ++:10AE200000E00027B8F1010801D3002F92D0B9F15A ++:10AE3000010902D3002F00F0AC80BBF1010B02D35B ++:10AE4000002F00F0AA80204640F2D16104220023A6 ++:10AE5000F7F7A2FC87B93E4614E0C046020502009F ++:10AE60001A05020026050200FA05020080841E0071 ++:10AE7000EC0602000607020020464FF48061FDF751 ++:10AE80002BF806462046FEF73DFE204640F2316193 ++:10AE90000B9AF7F75BFC204640F24C410C9AF7F70F ++:10AEA00055FC204640F24D410D9AF7F74FFC2046E5 ++:10AEB0004FF496610E9AF7F749FC204640F2B141F3 ++:10AEC0000F9AF7F743FC204640F2F941109AF7F742 ++:10AED0003DFC204640F2FA41119AF7F737FC204634 ++:10AEE00040F63811129AF7F731FC204640F6391136 ++:10AEF000149AF7F72BFC204640F23B41159AF7F7DE ++:10AF000025FC204640F23C41169AF7F71FFC2046EC ++:10AF100040F2DA61189AF7F719FC204640F2DB613B ++:10AF2000199AF7F713FC204640F2B741139AF7F746 ++:10AF30000DFC204640F24C4104220023F7F72CFC84 ++:10AF40000025194B2046E95A1AABEA5A0235F7F7A1 ++:10AF50007FFB182DF5D10A9B23B120460999FFF7F5 ++:10AF6000FDFC03E020460A99FAF7B8F82046089954 ++:10AF7000FFF7A2F820460021FAF744F800E0002687 ++:10AF8000E369079998684FF48372EBF3B1F63046A2 ++:10AF900006E000274FF00608DCE64FF00409F8E76A ++:10AFA00029B0BDE8F08FC046020502002DE9F04F40 ++:10AFB000B3B00F939DF8F8409DF8F4300D940E93C4 ++:10AFC0009DF800419DF8FC300B940C93012405463C ++:10AFD0001646D0F8A89088469DF8F0B0BDF80471E8 ++:10AFE0008DF8C7408DF8C640FDF702FC40F2D7410E ++:10AFF00012902846F7F79EFB40F2D7411090284662 ++:10B00000F7F798FB3449119006222846F7F7D8FB4A ++:10B01000284632490F22F7F7D3FB284621461AAAC1 ++:10B02000FDF786FB284621460022FDF7F5FABBF125 ++:10B03000000F02D00023199318E028462146FBF7A1 ++:10B0400067FCD5F8B030D3F8203183F0010313F05A ++:10B05000010319930AD1EB69B821186942F2107201 ++:10B0600035F066DBEB69186935F094DB2846012181 ++:10B07000F9F7C8FF28460121FBF7A2FA284601216B ++:10B08000FAF72EF940F2EA412846F7F753FB40F26F ++:10B09000EB4117902846F7F74DFB40F2EB41189033 ++:10B0A0002846F7F747FB00F0070340F2EB4128463C ++:10B0B0003822DB00F7F770FB28462DA999F8C1A2CA ++:10B0C000F9F77AFE86B1337A53B12846717AFFF7E1 ++:10B0D00045FC96F809A007E0F6090200A60B02005D ++:10B0E00028463146FAF732F840F29C412846F7F7F5 ++:10B0F00021FB40F2316113902846F7F71BFB40F229 ++:10B10000D66115902846F7F715FB40F2DA611490E6 ++:10B110002846F7F70FFB002116902846FAF728FA81 ++:10B12000284688490722F7F74BFB2FAB23930123CF ++:10B1300024930633259376B199F96625737A013203 ++:10B1400093FBF2F303F5107326932846202323A9DB ++:10B150002793FDF75FF82F9A2846D2002F9240F2EE ++:10B16000716192B2F7F7F2FA284677490C22F7F7A5 ++:10B1700027FB0024754B284633F81410F7F750FAD4 ++:10B180000DF1A203E0540134122CF3D1072228461A ++:10B190004FF48B71F7F75CFAB5F8DA3003F47043CB ++:10B1A000B3F5005F05D1284640F22D110122F7F7D3 ++:10B1B0004FFA072228464FF49671F7F749FAB5F887 ++:10B1C000DA3003F47043B3F5005F14D128466A21E6 ++:10B1D000C222F7F73DFA284698210C22F7F738FAF1 ++:10B1E000284640F22F110322F7F732FA284697211A ++:10B1F000F922F7F72DFA0B2107222846F7F728FA4C ++:10B200001022284640F21311F7F722FA1D210122DD ++:10B210002846F7F71DFA012228464FF48A71F7F7FE ++:10B2200017FAB5F8DA3003F47043B3F5005F04D1D0 ++:10B2300028462E211022F7F70BFA082228464FF451 ++:10B240009571F7F705FA092102222846F7F700FA67 ++:10B2500004221346284640F21F11F7F73FFAFF2158 ++:10B26000102200232846F7F739FA0721012200238C ++:10B270002846F7F733FA0521082200232846F7F776 ++:10B280002DFA4FF400421346284640F2DA61F7F7F0 ++:10B2900083FA41460F9A53462846FFF72BFA0024BB ++:10B2A00080B2012101902246284623460094029450 ++:10B2B00003940494F9F792FF0E9BA74208BF4FF442 ++:10B2C000824700930D9B284601930C9B41460293B5 ++:10B2D0000B9B224603934FF4AF630493A3F59F6344 ++:10B2E00007935B46059706940894FFF747F90DF11D ++:10B2F000C60228460DF1C701F9F798FC9DF8C62053 ++:10B300003F2A53D89DF9C730A3424FDB3F2B4DDC7A ++:10B3100052B29A424ADCB8F1000F27D123AC18236D ++:10B3200021462593284630AB26922393FCF772FFE3 ++:10B330009DF9C73021462846309E2693FCF76AFFC8 ++:10B3400044460EE0020A0200200D0200260E020012 ++:10B3500030AB284623A9269430962393FDF75CFA58 ++:10B3600001349DF9C62063B29A42F1DC182323AC64 ++:10B37000259326332693284630AB21462393FCF7AA ++:10B3800049FF3F23284621462693FDF745FA01232E ++:10B39000284621462693FCF73DFF002328462146F8 ++:10B3A0002693FDF739FA2846FDF72EF8284640F295 ++:10B3B000EA41179AF7F7CAF9284640F2EB41189A82 ++:10B3C000F7F7C4F92846D72102220023F7F786F9B8 ++:10B3D000082213462846D721F7F780F9002328468C ++:10B3E0004FF494710822F7F779F928464FF48B71DE ++:10B3F0000022F7F72DF9284640F29C41139AF7F7FF ++:10B40000A5F9284640F23161159AF7F79FF92846C9 ++:10B4100040F2D661149AF7F799F9169C284644F041 ++:10B42000010292B240F2DA61F7F790F92846012161 ++:10B43000FAF79EF8109C082204EA0203284640F21C ++:10B44000D741F7F7A9F9119C4FF4E04204EA02034F ++:10B45000284640F2D741F7F79FF92846FAF73CFD16 ++:10B460000024234B284633F814100DF1A203E25CAC ++:10B470000134F7F7EDF8122CF3D14FF400620023FA ++:10B48000284640F24C41F7F787F928460021FBF7A0 ++:10B4900097F828460021F9F7B5FD284640F23B41D0 ++:10B4A00001220023F7F778F900234FF400622846C1 ++:10B4B00040F63811F7F770F928460021FBF728FA13 ++:10B4C000284600211AAAFDF733F9284609490F2218 ++:10B4D000F7F776F9199B1BB9EB69186935F046D96E ++:10B4E00028461299FEF7DAFF33B0BDE8F08FC04668 ++:10B4F000260E0200C40A02002DE9F04FD0F8A83051 ++:10B5000091B093F8F49318230C930FAB0A93202374 ++:10B510000E93012317460B9301FB01FB3E330521DC ++:10B5200000228046B9F1FF0F08BF4FF001090D93CB ++:10B530000791099206230024039347F6FF733A46C6 ++:10B540000125059340462346214600940194029428 ++:10B550000495FFF72BFD40460AA9FCF75BFE0F9A06 ++:10B5600042F30B3303FB03F342F30B0202FB023201 ++:10B570007B7A5A45069303D307990894CEB206E026 ++:10B58000B9F1000F4DD1079908954B42DEB273B265 ++:10B5900006999DB26B189CB24FF0000A06990AEB0F ++:10B5A000010308999BB221B15A4506D99B1B7B72B6 ++:10B5B0002DE0089B0BB95A4529D322B27F2A26DCFD ++:10B5C0000AEB0503002A1FFA83FA20DB06237C72AC ++:10B5D000039301230021049347F6FF733A46059332 ++:10B5E00040460B46009101910291FFF7DFFC404677 ++:10B5F0000AA9FCF70FFE0F9A42F30B3303FB03F388 ++:10B6000042F30B0202FB023263199CB2C6E70799B0 ++:10B61000099A41F346030132DBB2032A07930992E8 ++:10B6200088D111B0BDE8F08F2DE9F04F8DB0DDF875 ++:10B6300058A01F460123834616468AF808304FF06B ++:10B6400000094FF0640808EB09030021C3F34F051C ++:10B65000DB238AF8095001245246039358460B46CF ++:10B6600000910191029105910494FFF79FFC18232A ++:10B670000893273309930BAB06935846202306A95A ++:10B680000A930794FCF7C6FD0B9B43F30B3202FBB6 ++:10B6900002F243F30B0303FB03231A464FEAE27360 ++:10B6A000BB4202D803D1B24201D9A94600E0A84664 ++:10B6B0000B484FF0FF31801941EB07018B4202D854 ++:10B6C00006D1824204D99F4206D801D1964203D8BE ++:10B6D000C9EB0803012BB6DC28460DB0BDE8F08F9E ++:10B6E00030F8FFFFF7B50546D0F8A87090F8DA00FB ++:10B6F0000E46F7F735FA40F6B41398420446B5F80B ++:10B70000DA2001D11E480AE0D3B2012B02D14FF456 ++:10B71000523004E00302A3F5C420A0F580600022AB ++:10B720004FF47A71F9F716F8A0FB0023284600962B ++:10B73000FFF77AFFA0F128039BB21D2B1BD9272806 ++:10B7400002D84FF434300BE040F6B4139C4202D1DF ++:10B750004FF4703004E02302A3F5BE20A0F5007082 ++:10B7600000224FF47A71F8F7F5FFA0FB002328467A ++:10B770000096FFF759FF031F87F8C232FEBDC0468F ++:10B78000008E03002DE9F04390F8DA30D0F8A8607D ++:10B790008BB086F8BC32D0F8B0300546D3F82031F3 ++:10B7A00083F0010313F001090AD1C369B8211869B4 ++:10B7B00042F2107234F0BCDFEB69186934F0EADF52 ++:10B7C00040F2A5412846F6F7B5FF04462846F9F7AA ++:10B7D000A5FB002180462846FEF76EFC4FF4404151 ++:10B7E0002846FEF769FC2846FEF73EFCD5F8A8205F ++:10B7F0002846D2F84434D2F84824402BA8BF40232E ++:10B800009342B8BF134640F2A741FF229BB2F6F71E ++:10B81000C3FF0023284640F2A5414FF4E062F6F74B ++:10B82000BBFF4FF47A7232212846FBF7ABF80121B7 ++:10B83000284696F8C072FBF76BF82846F7F738FCF5 ++:10B840004FF4E06204EA0203284640F2A541F6F70D ++:10B85000A3FF00212846FEF72FFC96F8C4420DF105 ++:10B860001E0E012C35D171462846FFF73BFF2846B6 ++:10B870002146FDF7D9FBD5F8A8202846D2F8443454 ++:10B88000D2F848243E2BA8BF3E239342B8BF1346AC ++:10B8900040F2A741FF229BB2F6F77EFF0023284625 ++:10B8A00040F2A5414FF4E062F6F776FF28463221D8 ++:10B8B0004FF47A72FBF766F896F8C032DBB996F867 ++:10B8C000C2322846043386F8C2322146FDF7ACFB6B ++:10B8D00011E000210122DB238DF82620039304923E ++:10B8E000284672460B468DF827700091019102910F ++:10B8F0000591FFF75BFB28464146FEF7DDFB284636 ++:10B9000008490422F6F75CFFB9F1000F03D1EB6997 ++:10B91000186934F02BDF28460021FAF7F9FF0BB045 ++:10B92000BDE8F083800C02002DE9F04F044695B08D ++:10B93000D0F8A86040F2E7300F46EAF30DF7072190 ++:10B940002046F6F76DFEC0B20390FF212046F6F7C1 ++:10B9500067FEC0B2049040F21F112046F6F760FE69 ++:10B96000C0B2059005212046F6F75AFE25215FFA60 ++:10B9700080FB2046F6F754FE4FF489715FFA80FA97 ++:10B980002046F6F74DFE00250190864B2046E95AE9 ++:10B99000F6F7D0FE07ABE85202351C2DF5D1D4F8EE ++:10B9A000B030D3F8203183F0010313F00103029388 ++:10B9B00003D1E369186934F0EDDE40F2A44120467A ++:10B9C000F6F72EFE002181462046FEF775FB7F210B ++:10B9D000204696F8C182FEF7C1FF012207211346D7 ++:10B9E0002046F6F77BFE1022FF2113462046F6F78D ++:10B9F00075FE04221346204640F21F11F6F76EFE34 ++:10BA0000362220466849F6F7DBFE2046F9F7F2F9C0 ++:10BA1000C0F34F00E62801DDFF2305E02046F9F7DB ++:10BA2000E9F94008193083B2FF22204640F2A541CF ++:10BA3000F6F7B2FE25210C222046F6F709FE082271 ++:10BA4000134605212046F6F749FE092257492046AC ++:10BA5000F6F7B6FE2046F9F7CDF91023129301232D ++:10BA6000ADF84E0008260F9306250DF14E03204633 ++:10BA70000EA910960E931195FCF7CEFE012F0CD156 ++:10BA80002A4620464A49F6F79BFE2022204682217C ++:10BA90001346F6F723FE042506E02A4620464549CC ++:10BAA000F6F78EFE07260A250122134620464FF49C ++:10BAB0009B61F6F771FE45F4007343EA06139B00A1 ++:10BAC00020464FF49B6140F6FC72F6F765FE0222B9 ++:10BAD000134620464FF49B61F6F75EFE20464FF476 ++:10BAE0009B614FF4E0424FF40053F6F755FE2022DD ++:10BAF000134620464FF49A61F6F74EFE01210022CC ++:10BB00002046F8F7DFF9204640F27641F6F712FEBC ++:10BB100010F4004F02D10A20EAF31EF62046072156 ++:10BB2000039AF6F795FD2046FF21049AF6F790FD5B ++:10BB3000204640F21F11059AF6F78AFD204605219E ++:10BB40005A46F6F785FD204625215246F6F780FD38 ++:10BB5000019B20464FF48971DAB2F6F779FD002592 ++:10BB6000104B2046E95A07ABEA5A0235F6F7EEFDCC ++:10BB70001C2DF5D120464FFA88F1FEF7EFFE204646 ++:10BB800040F2A4414A46F6F763FD029B1BB9E36904 ++:10BB9000186934F0EBDD40F2E730EAF3DDF515B07B ++:10BBA000BDE8F08F1A0A020036060200780502008E ++:10BBB000A2060200740C02002DE9F04FBDB007464A ++:10BBC0000C469146002116220DF15E000493E6F327 ++:10BBD00037F2A8490E220DF19E00E6F3CDF1A649F9 ++:10BBE0000E2224A8E6F3C8F148F2670148F2452284 ++:10BBF000ADF8EA10ADF8E820A04908220DF1C60022 ++:10BC0000E6F3BAF19E490E220DF18200E6F3B4F19B ++:10BC10009C4908220DF1BE00E6F3AEF19A490E22CE ++:10BC20001DA8E6F3A9F147F69733002108220DF18C ++:10BC3000B600ADF8E630ADF8E430E6F301F2FB69AA ++:10BC400030219868D7F8A880EBF342F005900028DF ++:10BC500000F0AB8240F2DB613846F6F76BFD40F254 ++:10BC6000DA610B903846F6F765FD88490A900422A0 ++:10BC70003846F6F7A5FDB9F1070F0BD8DFE809F054 ++:10BC800011040A0A0A22352D1DAA069224AB0DF1D1 ++:10BC90005E0214E00DF18202002306921A46079319 ++:10BCA00019E000210A460B4638460091F9F778FD65 ++:10BCB0000DF1820106910DF15E020DF19E03072147 ++:10BCC00007933EE00DF1E6030DF1EA01069308F15A ++:10BCD0008202079101230E9334E039A906913AAB11 ++:10BCE00008F18202012107932BE03BAB00930DF199 ++:10BCF000EF010DF1EE020DF1ED033846F9F74EFCC0 ++:10BD00009DF8EF209DF8EE300DF1BE0143EA0223CD ++:10BD10004FF00002ADF86C30ADF86E209DF8EC30BD ++:10BD20009DF8ED20069143EA0223ADF870304FF004 ++:10BD30000003ADF872300DF1C6030DF15E020793FA ++:10BD400004210E911023009330330193504B0021B6 ++:10BD5000029338460B23F6F7A7FE05224D493846D5 ++:10BD6000F6F72EFD3846F9F7D9F84FF4805213460E ++:10BD7000089040F2A4413846F6F70EFD00213846FF ++:10BD8000FEF79AF940F2DB413846F6F7D3FC424918 ++:10BD9000062209903846F6F713FDB7F8DA3003F4B7 ++:10BDA0007043B3F5005F07BF38463C4938463C490D ++:10BDB0001222F6F705FD40F2D7413846F6F7BAFCF5 ++:10BDC000059911903846FBF7BFFE384640F23B41DB ++:10BDD000F6F7B0FCC0F380100C9020B138460DF19E ++:10BDE000B601F8F7E9FF64B90C9A22B93846B8F8F9 ++:10BDF0003010FEF7B3FD0DF1CE0438462146F8F7BA ++:10BE0000DBFF638822881B0143EA0223A2882146C4 ++:10BE100013439EB2B7F8DA30082203F470430DF1F1 ++:10BE2000D600B3F5805F14BF00250125E6F3A4F02A ++:10BE30000A222BA80021E6F303F11A4B002233F863 ++:10BE40001540104633E0184B53F82530C1180B88C5 ++:10BE50001230B3422AD14B882BA8ADF8D6308A884D ++:10BE6000ADF8D82031F8063F0A22ADF8DA30E6F313 ++:10BE700083F01EE078090200CE0E020022080200C4 ++:10BE800058050200BC0A02005A080200900702008E ++:10BE900019880100D806020024090200FC0C0200E7 ++:10BEA00030090200720C0200F80C02000132A242BA ++:10BEB000C9D138460DF1D601F9F748F9002404221A ++:10BEC00038463749374DF6F77BFC10260A233846AB ++:10BED0002146354A009601940295F6F7E5FD2023A8 ++:10BEE000019338460A2321462F4A00960295F6F719 ++:10BEF000DBFD40F25341384640F2A472F6F726FCCF ++:10BF0000B8F8C81340F6A663A14208BF1946B9F1B4 ++:10BF1000050F01D14B4299B2D7F8FC3F0CB22BB1BF ++:10BF20003846FDF7EFFD0520EAF316F44FF47A7179 ++:10BF300001235822384604FB01F1FDF767FA40F26D ++:10BF4000DA614FF6FF723846F6F700FCB7F8DA30E0 ++:10BF5000384603F47043B3F5005F0CBF98F895952D ++:10BF600098F89695F8F7B4FF0021C0B2FF228B46EF ++:10BF700010900D910F929AE04FF000030799ADF8E1 ++:10BF8000E0303BF80130C3F30324B9F1000F1AD0BD ++:10BF9000042C0BD00F9A042A13D110990EE0C0463E ++:10BFA000A20A020019880100640B0200109901EB3B ++:10BFB0000903D9B211F0800F18BF7F213846FEF770 ++:10BFC00081FAE2B20F92069B3CA93BF8032001EBF9 ++:10BFD000440333F8441C21B102F0FF0343EA012378 ++:10BFE0009AB2384640F25241F6F7B0FBE31E1FFA10 ++:10BFF00083FABAF1010F16D86D4B10254524029330 ++:10C00000384600210DF1E202012300950194F6F774 ++:10C010003DFD684B38460293002138AA0123009564 ++:10C020000194F6F741FD079B384640F251413BF839 ++:10C030000320F6F78BFB3846F9F72EFF00287CD05B ++:10C040005B4A602112AC10250B2301910292002162 ++:10C05000384622460095574EF6F718FD40230193C7 ++:10C0600000210B233846224600950296F6F71CFD68 ++:10C07000BAF1010F0AD845230193384600210DF18A ++:10C08000E202012300950296F6F70EFD484960236F ++:10C090000193029108F18202384600210B2300959A ++:10C0A000F6F7F4FC0D9A0BF1020B01320D920D9B89 ++:10C0B0000E998B427FF460AF602301933C4B08F1F3 ++:10C0C0008206102402933846002132460B23394D54 ++:10C0D0000094F6F7DBFC4FF001025023A8F89820FB ++:10C0E0003846019300213246042300940295F6F766 ++:10C0F000DBFC552301933846002108F18C02022312 ++:10C1000000940295F6F7D0FC3846F8F74FFCA0B142 ++:10C1100038A90DF1DE023846FCF750FB3846FCF733 ++:10C12000EDF9BDF8E0100446BDF8DE203846FDF715 ++:10C1300085FD38462146FDF713FB049B13B93846AD ++:10C14000FDF7E0FC38460599F9F714FB384640F254 ++:10C15000D741119AF6F7FAFAFB69059998683022E7 ++:10C16000EAF3C6F5384640F2DB41099AF6F7EEFAF3 ++:10C1700040F2534138460022F6F7E8FA0C9921B113 ++:10C1800038460DF1B601F8F7E1FF38460899FDF79A ++:10C1900093FF384640F2DA610A9AF6F7D7FA384642 ++:10C1A00040F2DB610B9AF6F7D1FA3DB0BDE8F08FB3 ++:10C1B00015820100198801002DE9F0470546D0F8E5 ++:10C1C000A8404FEA0118F8F783FE40F2D74147B282 ++:10C1D0002846F6F7AFFA94F925258146B2F1FF3FDC ++:10C1E00011D0042392FBF3F3984505DA284640F278 ++:10C1F000D7414022002304E04022284640F2D741A4 ++:10C200001346F6F7C9FAD5F8FC3F53B12846FDF7B7 ++:10C2100079FC0520EAF3A0F21C492846702200238D ++:10C2200002E01A4928467022FDF7F0F82846394600 ++:10C23000FEF794FB002601212846FBF76FFD04233F ++:10C24000C8EB00047A1E94FBF3F3D2187F2AA8BF30 ++:10C250007F2222EAE277284639460434FEF77EFB45 ++:10C26000082C03D90A2E01D00136E4E72846FDF751 ++:10C2700049FC284640F2D7414A46F6F767FA284675 ++:10C28000F8F726FE40B2BDE8F087C04600093D0041 ++:10C290002DE9F04391B08046D0F8A860F8F718FE79 ++:10C2A0001C23B8F8DA208DF83B3001238DF83A30A2 ++:10C2B00002F47043B3F5805F5FFA80F907D1D3B21F ++:10C2C000402B01D81B2300E02D238DF83B30B8F81C ++:10C2D000DA2002F47043B3F5005F33D1B6F82A25B3 ++:10C2E00013B2B3F1FF3F04D04FF6FF73002A08BF2B ++:10C2F0001A46B6F8F6130BB2B3F1FF3F02D14FF472 ++:10C30000917104E04FF6FF73002908BF1946B6F893 ++:10C310002C5596F8F0032BB2B3F1FF3F04D04FF643 ++:10C32000FF73002D08BF1D46B6F8F84323B2B3F1E2 ++:10C33000FF3F04D04FF6FF73002C08BF1C4696F851 ++:10C34000F1739FE0D3B2402B33D8B6F82E2513B249 ++:10C35000B3F1FF3F04D04FF6FF73002A08BF1A461F ++:10C36000B6F8FA130BB2B3F1FF3F02D14FF491715B ++:10C3700004E04FF6FF73002908BF1946B6F83055A0 ++:10C3800096F859052BB2B3F1FF3F04D04FF6FF7377 ++:10C39000002D08BF1D46B6F8004423B2B3F1FF3F9D ++:10C3A00004D04FF6FF73002C08BF1C4696F85B754F ++:10C3B00068E08C2B33D8B6F8322513B2B3F1FF3FC7 ++:10C3C00004D04FF6FF73002A08BF1A46B6F8FC13D4 ++:10C3D0000BB2B3F1FF3F02D14FF4917104E04FF67D ++:10C3E000FF73002908BF1946B6F8345596F8F203D2 ++:10C3F0002BB2B3F1FF3F04D04FF6FF73002D08BFFF ++:10C400001D46B6F8024423B2B3F1FF3F04D04FF605 ++:10C41000FF73002C08BF1C4696F8F37332E0B6F8A1 ++:10C42000362513B2B3F1FF3F04D04FF6FF73002A55 ++:10C4300008BF1A46B6F8FE130BB2B3F1FF3F02D1A4 ++:10C440004FF4917104E04FF6FF73002908BF1946BD ++:10C45000B6F8385596F85A052BB2B3F1FF3F04D021 ++:10C460004FF6FF73002D08BF1D46B6F8044423B2F3 ++:10C47000B3F1FF3F04D04FF6FF73002C08BF1C46FA ++:10C4800096F85C7513B2B3F1FF3F04D040461946ED ++:10C49000FFF792FE0DE009B2B1F1FF3F07D0404631 ++:10C4A0000DF13202FFF728F89DF83B3007E0FF2836 ++:10C4B00002D086F8070404E09DF83B300BB186F803 ++:10C4C000073429B2B1F1FF3F05D04046FFF774FEB3 ++:10C4D00086F8080411E021B2B1F1FF3F09D04046CF ++:10C4E0000DF13202FFF708F89DF83B3086F808346A ++:10C4F00003E0FF2F18BF86F8087496F9EF33B3F105 ++:10C50000FF3F1CBF4FF0FF3386F8083496F808044D ++:10C5100041B2B1F1FF3F76D096F8072453B2994269 ++:10C52000D8BF86F8082496F80834D8BF86F80704E0 ++:10C5300000248DF83B30DB2301250393404623463E ++:10C5400021460DF132020495009401940294059461 ++:10C55000FEF72CFD18230993083308950B93254605 ++:10C5600007AC0FAB4046214607930A95FBF752FEF6 ++:10C5700005F140034046214601350A93FCF74CF98A ++:10C58000402DEDD196F9072496F908349B18022224 ++:10C5900093FBF2F3A6F86835B8F8DA2002F470439A ++:10C5A000B3F5005F02D1B6F85E3583B9D3B2402B44 ++:10C5B00005D8B6F8602512B1A6F8682509E08C2BDD ++:10C5C00002D8B6F8623513B9B6F864350BB1A6F8DF ++:10C5D0006835404640F224514FF400420023F6F7FC ++:10C5E000DBF896F96625B6F86835013293FBF2F36D ++:10C5F0009BB2404640F22551FF22F6F7CDF80223C8 ++:10C6000086F8673529E0012386F86735404640F211 ++:10C610002551FF227E33F6F7BFF8404640F2255100 ++:10C620004FF480720023F6F7B7F8404640F22551E8 ++:10C630004FF400720023F6F7AFF8404640F2255160 ++:10C640004FF480620023F6F7A7F8404640F22551E8 ++:10C650004FF400620023F6F79FF84FF00003A6F8AE ++:10C660006A35404640F2255196F96645F6F762F87C ++:10C670000134C0B204FB00F496F96635A6F86845AB ++:10C6800013B14046FCF72CFD96F8EF330DF1320262 ++:10C69000FF2B08BF96F8073400218DF83B30DB23D1 ++:10C6A00003930123049340460B46009101910291AC ++:10C6B0000591FEF77BFC40464946FEF74FF94046A0 ++:10C6C00040F27161F6F736F8B6F96A3540F27161F9 ++:10C6D000A0EBC30292B24046F6F738F84046FBF7AB ++:10C6E00093FE11B0BDE8F08370B58E46BEF1FF3FFA ++:10C6F0000546144619469DF9106002D006EB0E015E ++:10C700000DE022B990F82916FFF756FD02E0B2F1CC ++:10C71000FF3F04D021462846FFF74EFD81192846E9 ++:10C72000FEF71CF970BDC0462DE9F04F87B00446F6 ++:10C73000F8F7F4FB04A981462046D4F8A850F8F78E ++:10C740003BFB2046F8F7BCFB40F2D741834620462E ++:10C75000F5F7F0FF03902046FCF74AF88246B9F15E ++:10C76000000F02D0FF23029304E02046F8F7B0FB4D ++:10C7700040B20290B4F8DA304FF02A0803F4704364 ++:10C78000B3F5005F0CBF95F81E1595F81F152046F0 ++:10C790004FB239460F223C23CDF80080FFF7A4FFAB ++:10C7A00095F84665002E00F09080204640F2EB415F ++:10C7B000F5F7C0FF1221C0F3402301222046F5F710 ++:10C7C0008DFF6A780021521A18BF01220B462046BD ++:10C7D000FFF7F2F92046FBF791FE40F3072340B242 ++:10C7E000A5F84A35A5F84C0540F2EB412046F5F78F ++:10C7F000A1FFC0F380235B02204640F2EB414FF4DF ++:10C800000072F5F7C9FF002107220B462046FFF70B ++:10C81000D3F92046FBF772FE40F3072340B2A5F898 ++:10C820004E35A5F85005FF222046B5F84A3540F6AA ++:10C830005211F5F7B1FF2046FF22B5F84C3540F60E ++:10C840005311F5F7A9FF2046FF22B5F84A3540F607 ++:10C850005611F5F7A1FF2046FF22B5F84C3540F6FA ++:10C860005711F5F799FF2046FF22B5F84E3540F6EF ++:10C870004811F5F791FFFF222046B5F8503540F6F4 ++:10C880004911F5F789FF95F84A3595F84C1520467A ++:10C8900041EA0321FCF764FF95F8473520469B02E7 ++:10C8A00040F2EB414FF4806203F47C43F5F774FFF0 ++:10C8B00095F8483520465B0240F2EB414FF4007298 ++:10C8C00003F47E43F5F768FF10E0204639460F2257 ++:10C8D0003C23CDF80080FFF707FF6A7820463146F9 ++:10C8E000003A18BF01223346FFF766F92046F8F7F1 ++:10C8F0004BF810B12046FBF715FE00217F220B46B6 ++:10C900002046FCF7DDFC20465146FDF7C7FD2046DA ++:10C910005946F8F7CFFB204604A9F8F717FC204644 ++:10C9200040F2D741039AF5F711FFB9F1000F04D097 ++:10C9300020464946FDF7C0FB03E020460299FEF77A ++:10C940000DF807B0BDE8F08F2DE9F04F89B004462F ++:10C95000D0F8A870F8F7E2FA04902046F8F7B8FA91 ++:10C960004FF489715FFA80FA2046F5F759FE0721E6 ++:10C9700005902046F5F754FEFF2101902046F5F77B ++:10C980004FFE40F21F1102902046F5F749FE40F29B ++:10C99000AB4103902046F5F7CDFED4F8B030D3F884 ++:10C9A000203183F0010313F0010B03D1E36918690F ++:10C9B00033F0F0DE00212046FDF77EFB2046F6F73F ++:10C9C00077FB40F23B412046F5F7B4FE0DF1180924 ++:10C9D000494680462046F8F7EFF920460121F8F74E ++:10C9E0007DFB20467F21FDF7B9FF0122134620463B ++:10C9F0000721F5F773FE102213462046FF21F5F7B5 ++:10CA00006DFE0422134640F21F112046F5F766FE24 ++:10CA10002046FDF74FFC06224B492046F5F7D0FE95 ++:10CA20002046FBF7E5FE002106462046FDF736FDD1 ++:10CA3000002220460121F7F745FA40F2AB4120469B ++:10CA4000F5F778FE40F23E612046F5F773FEC50526 ++:10CA5000ED0D2B46204640F2A64140F2FF12F5F7BD ++:10CA60009BFE97F8E8330BB3204638490922F5F7C7 ++:10CA7000A7FE002220460121F7F724FA40F2AB413D ++:10CA80002046F5F757FE40F23E612046F5F752FE8C ++:10CA9000C30540F29A41204640F2FF12DB0DF5F744 ++:10CAA0007BFE20462A490922F5F78AFE2B462046BE ++:10CAB00040F2A64140F2FF12F5F76EFE00234FF45C ++:10CAC0008052204640F24C41F5F766FE2046314642 ++:10CAD000FDF7E4FC2046C8F38011F8F7FFFA204682 ++:10CAE0004946F8F733FB20465146FDF737FF20460D ++:10CAF0000499FDF7E1FA20464FF48971059AF5F79C ++:10CB0000A7FD019D012205EA020320460721F5F752 ++:10CB1000E5FD029D102205EA02032046FF21F5F7FC ++:10CB2000DDFD039D0422204640F21F1105EA0203A9 ++:10CB3000F5F7D4FDBBF1000F03D1E369186933F0B9 ++:10CB400015DE09B0BDE8F08FD80C0200E205020046 ++:10CB5000E40C02002DE9F3410446F8F7DFF9E3693C ++:10CB6000D4F8A8501A6A04F580531A6094F8DA30A1 ++:10CB7000002685F8BC3241F20403E654D4F8B03004 ++:10CB80008046D3F8203183F0010313F001070AD166 ++:10CB9000E369B821186942F2107233F0C9DDE36924 ++:10CBA000186933F0F7DD20460121F9F7B1FE0F22B5 ++:10CBB00023492046F5F704FE2046F8F775FD204688 ++:10CBC0003146FCF7CDFD204631463246FDF736F8BA ++:10CBD0002046F6F76DFA41F22403E35C6BB1204680 ++:10CBE000FFF7B2FE20463146FDF74EF995F8E833DF ++:10CBF0001BB120460121FDF747F92046FFF794FDC0 ++:10CC000000217F230A46009320460123FDF7C6FF3B ++:10CC10004FF0FF3385F8073485F808342046FFF7D6 ++:10CC200037FB20464146FDF747FA20460021F9F739 ++:10CC30006FFE1FB9E369186933F098DDBDE8FC8128 ++:10CC4000DA070200082910B503D00A2904D0022906 ++:10CC500004D1FFF77FFF01E0FEF794FD10BDC04651 ++:10CC600010B50446F6F724FA20460021FDF724FA11 ++:10CC700020460821FFF7E6FF10BDC04670B541F21F ++:10CC80000403C35C0446D0F8A85013B9F7F70CFFAF ++:10CC9000F0B1D4F8F83013F0070F06D194F8F5305E ++:10CCA0001BB920460921FFF7CDFFD4F8F82012F078 ++:10CCB0000F0F0DD141F20C03E3564BB912F0800F68 ++:10CCC00006D194F8F5301BB920460221FFF7BAFFD0 ++:10CCD000D4F8F83013F00E0F02D12046F9F752F9CC ++:10CCE000D4F8F83013F0060F3ED1D5F8340448B329 ++:10CCF000E169D5F838240B6A9B1A834234D308695A ++:10CD00006A2133F0F7DC400081B2B1B1E369186900 ++:10CD100033F0F0DC88B940F276412046F5F70AFDA1 ++:10CD2000C005C00DA5F86C0540F277412046F5F727 ++:10CD300001FDC005C00DA5F86E0520460021F9F7DC ++:10CD40004BFF11E040F276412046F5F7F3FCC005B9 ++:10CD5000C00DA5F86C0540F277412046F5F7EAFCD6 ++:10CD6000C005C00DA5F86E052046F8F7D7F8B0F558 ++:10CD7000404F0CD02046F8F7ABF8C0B220B10023EA ++:10CD80007F2885F8563402D0002385F8573470BDCB ++:10CD90002DE9F047CCB20746D0F8A8602046894676 ++:10CDA000F5F7DEFE494680463846F5F7BBFE3846C5 ++:10CDB000B7F8DA10FBF758F9042238465B49F5F763 ++:10CDC000FFFC21463846FAF7B5F90A20E9F3C4F426 ++:10CDD0004FF4004213464FF489613846F5F7DCFC06 ++:10CDE0003846F8F78DFB052100224FEA4800F7F797 ++:10CDF000B1FC0022054641464FF42010F7F7AAFC8B ++:10CE000040F257610446AAB23846F5F79FFC38460F ++:10CE10004FF4CB61A2B2F5F799FC4FF4007338469A ++:10CE20004FF489614FF44072F5F7B6FC97F8DA30A9 ++:10CE30000E2B01D11E2206E0B6F8622013B2B3F128 ++:10CE4000FF3F08BF1522A6F840253846002112B240 ++:10CE5000FBF7E2FB20B1384600211422FBF7DCFB94 ++:10CE600097F8DA3038220E2B0CBF182300233846EF ++:10CE700040F2EB41F5F790FCB7F8DA30384603F4AE ++:10CE80007043B3F5005F0CBFB6F86620B6F86820B3 ++:10CE9000012113B2B3F1FF3F08BF0222A6F83E25DD ++:10CEA00012B2FBF7B9FB182238462149F5F788FC86 ++:10CEB0003846F6F70DF996F8BC2298B10E2AB7F865 ++:10CEC000DA3003D9DBB20E2B03D805E0DBB20E2B30 ++:10CED00002D83846012101E0384600214A46FCF7D5 ++:10CEE000A1FF21E097F8DA309A4201D1012A04D15A ++:10CEF00038460821FFF7A6FE02E03846FCF776FF29 ++:10CF000000210A463846FBF753FD3846F9F7B6F9D3 ++:10CF100038460121F9F76AFA41F22403FB5C1BB1A0 ++:10CF200038460321FBF70AF9BDE8F08792050200B5 ++:10CF30002A080200D0F8B03073B5D3F82031044687 ++:10CF400083F0010313F00106D0F8A85003D1C369A0 ++:10CF5000186933F01FDC41F22403E25C42BBB4F8F1 ++:10CF6000DA3003F47043B3F5005F08D14FF00403E7 ++:10CF7000ADF800304FF00C03ADF8023007E04FF091 ++:10CF8000FF03ADF80030ADF802304FF0F00320465B ++:10CF90006946ADF80430ADF80620F8F7D7F820461A ++:10CFA0009621FDF77BFA20460121FEF7BDFC56E0F5 ++:10CFB0002046FFF7C9FC2046FDF756F82046002121 ++:10CFC000FCF762FF204635490F22F5F7F9FB95F88B ++:10CFD000E833DBB120460121FCF756FF95F92435F3 ++:10CFE000204640F2D141FF229BB2F5F7D5FB95F8E0 ++:10CFF0002535204640F2D1414FF47F421B02F5F720 ++:10D00000CBFB204626490C22F5F7DAFB0522204609 ++:10D010002449F5F7D5FBD4F8A8202046D2F84434AB ++:10D02000D2F848243C2BA8BF3C239342B8BF1346F8 ++:10D0300040F2A741FF229BB2F5F7AEFBB4F8DA301D ++:10D04000204603F47043B3F5005F0CBF95F85434E9 ++:10D0500095F855344FF440412B86FDF72DF840F2FA ++:10D0600076412046F5F766FBC005C00DA5F86C05B6 ++:10D0700040F277412046F5F75DFBD5F83434C00522 ++:10D08000C00DA5F86E051BB120460121F9F7A4FDDE ++:10D090001EB9E369186933F069DB7CBD4A0E0200F2 ++:10D0A0002A070200100A02002DE9F041D0F8A8601A ++:10D0B000012386F86130013B86F8C033B0F8DA30DE ++:10D0C000074603F47043B3F5005F02D196F8C1330D ++:10D0D00004E0B3F5805F06D196F8C233022B02D18B ++:10D0E000012386F8C033B7F8DA30384603F47043CA ++:10D0F000B3F5805F0CBF96F8EB3396F8EA33002463 ++:10D1000086F8E933738B0125A6F8BE320422234941 ++:10D11000347086F8C24286F8C34286F8C44286F864 ++:10D120006755F5F74DFB38462946F8F721FA0422F2 ++:10D130001B493846F5F744FB3846FCF7A1FA384658 ++:10D14000FCF7DCFC3846FFF7F5FE86F82C40B7F814 ++:10D15000DA103846F6F784FD3846FBF765F84FF4E9 ++:10D16000804213464FF489613846F5F715FB642079 ++:10D17000E9F3F2F2234638464FF489614FF48042D6 ++:10D18000F5F70AFB38464FF44041FCF795FF41F2B2 ++:10D190008833F38686F89A55BDE8F08122070200AD ++:10D1A000040C020010B58068F2F36AF210BDC046AC ++:10D1B00010B5437902790C4642EA032E0EF00303C0 ++:10D1C000012B0AD0022B0ED013B14FF400702EE0C9 ++:10D1D0000A780523B2FBF3F029E00B78144A03F038 ++:10D1E0000703D05C23E00978E378227911F0800FFF ++:10D1F00043EA022201F07F0343F0006002D040F4D2 ++:10D20000806006E01EF0200F1CBF20F4E06343F4B2 ++:10D21000407012F0800F18BF40F4000012F0400F71 ++:10D2200018BF40F48000C2F3011340EA035010BD60 ++:10D2300050FD010070B585680446D4F8F811A8685F ++:10D24000F2F30CF24FF0FF3384F8E231A36123686C ++:10D2500000229A712B6B064602211869F5F732FC01 ++:10D26000204636F00FDDD6F1010038BF002070BD3A ++:10D2700070B50D460968044671B1D1F87C1129B129 ++:10D28000036840F20C72D868E9F332F52368296824 ++:10D29000D8686269E9F32CF523682946D86810221A ++:10D2A000E9F326F570BDC04637B5054601A9D0F8AB ++:10D2B000000537F00FDF09E02846214638F06AD92B ++:10D2C000636C1BB92846214638F07ADA01A837F09A ++:10D2D00009DF04460028EFD13EBDC046036870B5A3 ++:10D2E00010210546D868E9F3F3F408B9064615E0BD ++:10D2F0002B6806466969D868E9F3EAF404463060A9 ++:10D3000028B931462846FFF7B3FF264606E000233A ++:10D31000C0F87C313146284637F0BCDD304670BD60 ++:10D320002DE9F3470D469246002853D0002951D0ED ++:10D330000B88D0F80490D0F89843D0F89463002B71 ++:10D340004BD00027E780A7804B880A8813F001089C ++:10D3500024D0402A14D1043120463B4600973BF0AC ++:10D36000DBDFB8423BDBB6F8023113F0400F34D0BC ++:10D37000BAF1000F31D0D9F80C003AF06FDF0BE0B2 ++:10D38000A2F108039BB2372B29D804F1080004311D ++:10D39000E4F3F2F52D88A580384622E0202A19D83A ++:10D3A000043104F14800E4F3E7F5A4F804802D8883 ++:10D3B0000123E580C6F8CC30B6F8023113F0400FF7 ++:10D3C0000BD0BAF1000F08D0D9F80C003AF046DFC4 ++:10D3D000404606E06FF0010003E0002001E04FF05E ++:10D3E000FF30BDE8FC87C04610B50DF09DFD04463A ++:10D3F000F1F7AAFF2046E8F3BDF710BDAAAA030083 ++:10D400001958000040960000904C00001472000073 ++:10D41000101800000FAC000050F2000050F20100A4 ++:10D420000050F20200000050F2020100AAAA03001C ++:10D43000195800000000000050F2040000147200AF ++:10D44000000FAC000050F200001018000050F20075 ++:10D45000000FAC0000409600000000000000101813 ++:10D4600000696C306D6163616464723D30303A31E3 ++:10D47000313A32323A33333A34343A353500626F26 ++:10D48000617264747970653D3078666666660062C4 ++:10D490006F6172647265763D3078313000626F6121 ++:10D4A0007264666C6167733D38006161303D3300C2 ++:10D4B00073726F6D7265763D3200AAAA0300195827 ++:10D4C000000050F200000000594D80009557800088 ++:10D4D00049588000315680000D5A8000C1588000A4 ++:10D4E000295A8000455A8000795780004D568000A7 ++:10D4F000755A800025558000F15980000D58800034 ++:10D5000069548000C14E8000E9518000555280006E ++:10D51000C9518000DD58800051518000D1558000F4 ++:10D52000A555800015568000E14F80008955800088 ++:10D53000FD4E800025508000C9110100ED4D800096 ++:10D54000854E8000A94F8000D94D8000094E800093 ++:10D55000514C8000654C800000000000000000007D ++:10D5600000000000C14F800025528000F95180006A ++:10D57000E12800002800000073645F6C6576656C2C ++:10D580005F74726967676572007370695F70755F59 ++:10D59000656E6162006172705F6D61636164647287 ++:10D5A000006172705F72656D6F7465697000000074 ++:10D5B000F83B86000000000007000000FF3B8600EB ++:10D5C00001000000070000000B3C86000200000084 ++:10D5D000000000001B3C8600030000000700000064 ++:10D5E000263C86000400000000000000373C860056 ++:10D5F0000500000008003000413C860006000000E5 ++:10D600000000000095D501000800000006000000A1 ++:10D61000A1D5010009000000070000000000000083 ++:10D62000000000000000000070666E5F737573708C ++:10D63000656E640058408600000000000800140079 ++:10D6400060408600010000000800880068408600F5 ++:10D65000020000000800380070408600030000004F ++:10D66000080008007E408600040000000100000061 ++:10D670008240860005000000000000008B4086000C ++:10D68000060000000800380028D60100070000004E ++:10D690000100000000000000000000000000000089 ++:10D6A000352E39302E3139352E38392E3600776CFB ++:10D6B00025643A2025732025732076657273696F7F ++:10D6C0006E20257320465749442030312D25780A95 ++:10D6D0000041707220323220323031330031343A1E ++:10D6E00035303A3030000000DA4386000000000098 ++:10D6F00008000000E3438600010000000100000074 ++:10D700000000000000000000000000005C782530F0 ++:10D71000325800253034780A007478636861696E85 ++:10D72000007278636861696E00776C635F696F7619 ++:10D730006172733200727373695F6F6666736574CA ++:10D740000064796E74785F7164626D5F6F76657284 ++:10D75000726964650064796E74785F726174655F84 ++:10D76000616C6C00505A443A2025643E2564206F59 ++:10D77000722025643E256420613D25640A006F7493 ++:10D780007077006164640064656C006C6F775F7231 ++:10D790007373695F74726967676572006C6F775F36 ++:10D7A000727373695F6475726174696F6E0074631C ++:10D7B0005F656E61626C650074635F706572696F4E ++:10D7C000640074635F68695F776D0074635F6C6F9A ++:10D7D0005F776D0074635F73746174757300617358 ++:10D7E000736F635F73746174650064796E7478003D ++:10D7F00074785F737461745F63686B0074785F73CF ++:10D800007461745F63686B5F7072640074785F73D7 ++:10D810007461745F63686B5F726174696F007478C0 ++:10D820005F737461745F63686B5F6E756D007278AF ++:10D830005F726174650069735F5750535F656E7204 ++:10D840006F6C6C65650069735F7770735F656E728E ++:10D850006F6C6C65650002000000000035D70100A8 ++:10D8600001000000060000008BD70100020000004C ++:10D87000060000009CD70100030000000600000025 ++:10D88000AED701000400000006000000B8D7010078 ++:10D890000500000006000000C2D7010006000000DD ++:10D8A00006000000CBD701000700000006000000C2 ++:10D8B000D4D701000800000006000000DED70100F8 ++:10D8C0000900000006000000EAD701000A0000007D ++:10D8D00006000000F0D701000B0000000600000069 ++:10D8E000FCD701000C000000060000000CD801006D ++:10D8F0000D000000060000001ED801000E00000010 ++:10D90000060000002ED801000F00000006000000F5 ++:10D9100036D80100100000000100000046D80100C8 ++:10D9200010000000010000000000000000000000E6 ++:10D930000000000005A58100FDA581000000000099 ++:10D94000000000000DCD820089E68200F5CB820048 ++:10D95000EDCC820067898600000080000100000095 ++:10D96000458B860001000000080002004F8B8600F6 ++:10D970001D000000080002005C8B86000F00000004 ++:10D98000030000006A8B8600100080000700000082 ++:10D990007A8B860002000000080007008B8B86004F ++:10D9A00003000000080007009C8B86000400800034 ++:10D9B00001000000AE8B860006000000020000009F ++:10D9C000B98B86000C00000002000000C88B8600A6 ++:10D9D00021008000030000000000000000000000A3 ++:10D9E000000000004CDB01001000000006000000F9 ++:10D9F000529B860001000000010000005D9B860034 ++:10DA000002002000070000006F9B8600030040001A ++:10DA1000080007007C9B860004004000080004000A ++:10DA20008B9B860005004000080004009A9B86003E ++:10DA300006000000080004004FDB01000D0010008C ++:10DA400007000000A79B86000E00200007000000D2 ++:10DA5000B49B86000700100007000000BF9B8600F3 ++:10DA6000080000000800100058DB01000900000059 ++:10DA700006000000C99B860024000000060000008C ++:10DA80005CDB01000A00000006000000AB728600AB ++:10DA90000F00000001000000D59B86000B008000F5 ++:10DAA00001000000DA9B86000C0000000500000069 ++:10DAB000E59B86001D00000003000000FA9B860025 ++:10DAC0001E00000007000000139C86001F000000DD ++:10DAD00007000000259C86002100000005000000D2 ++:10DAE0003B9C86002000000003000000499C86004B ++:10DAF00011008000010000004F9C860018004000CB ++:10DB000008000600539C8600190000000500000074 ++:10DB1000619C86001A000000010000006C9C8600D9 ++:10DB20001B00400001000000000000000000000099 ++:10DB3000000000000050F20201010000013200006C ++:10DB400027A4000041325E0061212F006170006D4A ++:10DB500061786173736F63006273730073736964D8 ++:10DB600000092F160E0E057573696E6720703270EE ++:10DB7000206D6963726F636F64650A00776C25645A ++:10DB80003A205048595458206572726F72282564A3 ++:10DB9000290A000091BA8600000080000100000000 ++:10DBA00030BB860002000000080044003ABB86003B ++:10DBB000030000000800440044BB8600040000008D ++:10DBC000080000004FBB860005000000080044006C ++:10DBD00059BB8600060000000800000067BB8600F5 ++:10DBE0000700000008004C0074BB8600080000001D ++:10DBF00008004C0081BB8600090080000200000084 ++:10DC000000000000000000000000000054545454C4 ++:10DC10005400000000000000000050505050500020 ++:10DC200000000000000000002300000003000000CE ++:10DC300000084C4C4C4C4C4C1414140000010000D7 ++:10DC400064646464646464646464646464000000C0 ++:10DC5000000000000000000000000000013C424203 ++:10DC6000424242424242423C0000000000000000AA ++:10DC700000000000000000000000344A4E4E4E4EEE ++:10DC80004E4E4E4A38000000000000000000000028 ++:10DC9000000000000000004C4C4C4C4C4C4C4C4CD8 ++:10DCA0004C4C4C4C00000040404040404040000084 ++:10DCB00000000001030000000001424242324242E3 ++:10DCC0001414140000000000030000000008444485 ++:10DCD0004438444414141400000000000300000001 ++:10DCE00000013E3E42343E42141414000000000085 ++:10DCF00054545400540000000000000000000000D4 ++:10DD000000000000000000000000000023000000F0 ++:10DD1000030000000001444444384440141414003B ++:10DD200000000000484A4A4A4A4A4A4A4A4A4A4A7D ++:10DD300048000000343434343434343434000000C7 ++:10DD4000004E4E4E4E4E4E4E4E4E4E4E4E4E0000DD ++:10DD50000000000000000000000000000008545413 ++:10DD6000540054000000000000000000505050001B ++:10DD700050000000000000000000233A3E3800423E ++:10DD80000000000000000000000000000000000093 ++:10DD9000000000000000000A000000006400000015 ++:10DDA000000000000000000000005800000000001B ++:10DDB00000000000013242424242424242424232AC ++:10DDC00042420000000000000000000000000000CF ++:10DDD000000836444444444444444444364A4000E1 ++:10DDE0000000000000000000000000000000082EFD ++:10DDF0004444444444444444442E463A0000000011 ++:10DE00000000000000000000000000083C3E3E3E14 ++:10DE10003E3E3E3E3E3E3C3E3E00000000000000D6 ++:10DE2000000000000000000008344444444444441E ++:10DE3000444444384440000000000000000000005A ++:10DE40000000000000085C5C5C5C5C5C5C5C5C5C32 ++:10DE50005C5C5C00005050505050505050500000DE ++:10DE6000000001383E383E42000000000000000083 ++:10DE70000000000000000000000000000000000A98 ++:10DE80000100000000014E4E4E344C381E1E1E0094 ++:10DE90000000000003000000000142444230443012 ++:10DEA00014141400000000000300000000013E3EB6 ++:10DEB0003E3C3E3E1414140000000000030000002D ++:10DEC0000001444444364C3814141400000000008F ++:10DED0000300000000013E3E30363A2C14141400BA ++:10DEE000000000004242424242424242424242421A ++:10DEF000420000002E343434343434343400000012 ++:10DF0000004A4A4A4A4A4A4A4A4A4A4A4A4A00004F ++:10DF1000002E34343434343434340000000054548B ++:10DF20005400540000000000000000004848480071 ++:10DF300048000000000000000000233E3E3E4A0072 ++:10DF40000000000000000000002828284000000019 ++:10DF500000000000000000004644444A00000000A9 ++:10DF600000000000000000000000000000000000B1 ++:10DF7000000000000A545454005400000000000047 ++:10DF80000000004848480048000000000000000071 ++:10DF900000230000030000000000424242424242CF ++:10DFA00014141400000000000300000000003E3EB6 ++:10DFB0003E3E3E3E141414000000000054545454DD ++:10DFC0000000000000000000000050505050000011 ++:10DFD0000000000000000000233844444A4A0000CA ++:10DFE0000000000000000000000000000000000031 ++:10DFF00000000000000A00000000340000000000E3 ++:10E0000000000000000000003400000000000000DC ++:10E01000000000545454545400000000000000005C ++:10E020000048484848480000000000000000002365 ++:10E03000545454545400000000000000000050509C ++:10E04000505050000000000000000000235C5C5CA9 ++:10E050000050000000000000000000504850004444 ++:10E06000000000000000000000234C4C4C4C4C4CC5 ++:10E070004C4C4C4C4C4C4C0000000000000000008C ++:10E0800000000000000009000100000000013E3E09 ++:10E090003E323E361414140000000000010000005F ++:10E0A00000013E3E3E343E381414140000000000CF ++:10E0B0000100000000014242423C423C1E1E1E0084 ++:10E0C000000000000100000000014E4E4E364C38AA ++:10E0D0001E1E1E0000000000545454545400000042 ++:10E0E00000000000000048484848480000000000C8 ++:10E0F0000000000023000000006400000000000099 ++:10E1000000000000000000580000000000000000B7 ++:10E1100000010000030000000000464646484A484F ++:10E120001717170000000000610A86007E0A8600AB ++:10E130009B0A86000F0B8600490B8600660B860043 ++:10E14000630F8600240E8600410E860014108600A0 ++:10E150006B108600311086009C108600D01086005F ++:10E160000411860060118600B1118600830B8600C1 ++:10E17000A00B86000C0F8600F70B8600CE118600E0 ++:10E18000310C86006B0C860094118600DA0B860039 ++:10E190005E0E86004E0C8600290F8600B80A8600A7 ++:10E1A000D50A8600F20A86007B0E86004E10860095 ++:10E1B000BD0B8600980E86009D0F8600B50E86006A ++:10E1C000880C8600D20E8600140C8600290F86006B ++:10E1D000BA0F86002C0B8600440A8600800F86004A ++:10E1E000460F8600EF0E8600B5DD0100D2DD01008E ++:10E1F000EFDD01005DDC010024DD01000CDE01002B ++:10E2000001DF010046DE010097DC01006AE0010049 ++:10E2100040DC01007ADC010041DD010029DE010063 ++:10E22000E4DE010021E3010004E30100383838385E ++:10E2300038000000000000000000343434343400A2 ++:10E240000000000000000000003A3A3A3A460000A0 ++:10E2500000000000000000000000000000000000BE ++:10E26000000000000008384444444A000000000058 ++:10E27000000000000000000000000000000000009E ++:10E2800000002A0000000054000000000000000010 ++:10E290000000000000440000000000000000000139 ++:10E2A00018098600C00D8600E80D8600200D860046 ++:10E2B000AC0D8600DCDC01009CE00100C8E301003D ++:10E2C000A8DF010088E0010094DF0100B4DC010058 ++:10E2D00010DD010094DE0100B0E0010014E1010056 ++:10E2E000A8DE0100FCE3010080DE010078E301000C ++:10E2F00010E40100C4E00100BCDE0100D0DE01003A ++:10E30000C8DC010038444444444444444444384450 ++:10E31000440000002C3838383838303434000000DD ++:10E3200000343A3A3A3A3A3A3A3A3A3A2C2C00001D ++:10E3300000323C3C3C3C3C000000000000003E48F9 ++:10E3400048424600000000000000000000000000FD ++:10E35000000000000000000000000A0038383E42C3 ++:10E3600000000000000000000000000000000000AD ++:10E37000000000000000000A030000000000444408 ++:10E38000444C4C4C17171700000000003232323852 ++:10E39000000000000000000000003838383800009D ++:10E3A0000000000000000000004C0000004C0000D5 ++:10E3B00000000000000000500000005000000000BD ++:10E3C00000000000000100000300000000004242C5 ++:10E3D00042424242171717000000000054545400F4 ++:10E3E000000000000000000000005050500000003D ++:10E3F00000000000000000002300000003000000F7 ++:10E400000001444444344444141414000000000047 ++:10E410000300000000006464646464642424240035 ++:10E42000000100003CE486000000800001000000C4 ++:10E4300084E5860001000000080024008DE58600C8 ++:10E44000020000000100000096E5860003000000C5 ++:10E45000030000009EE586000400000008000000A4 ++:10E46000A7E586000500000008000200B1E586006F ++:10E470000600000008000800BBE586000700000059 ++:10E4800008000600C5E58600080000000800060038 ++:10E49000CCE586000900000008000200D4E58600F3 ++:10E4A0000A00000008000300DCE586000B00000005 ++:10E4B00007000000E9E586000C00000008000600E7 ++:10E4C000EDE401000D00000008000700F7E4010082 ++:10E4D0000E0000000100000000000000000000002D ++:10E4E000000000006368616E7370656300703270D5 ++:10E4F0005F6966757064007032705F646566696537 ++:10E5000000000000C8E686000000000008000C00C3 ++:10E51000D7E686000100000007000400E9E6860057 ++:10E520000200000008000800FBE68600030000006F ++:10E53000070004000BE786000400000008001C0030 ++:10E540001BE786000500000008000C002CE7860091 ++:10E55000060000000700040043E7860007000000F3 ++:10E560000700040094E50100080000000700040013 ++:10E57000A4E501000900000007000400B8E501005F ++:10E580000A000000080090000000000000000000E9 ++:10E5900000000000706B745F66696C7465725F697F ++:10E5A000636D7000706B745F66696C7465725F692F ++:10E5B000636D705F636E740077616B655F7061633C ++:10E5C0006B6574005365742042525054206174206E ++:10E5D00025780A000A465749442030312D25780A0B ++:10E5E000000A54524150202578282578293A207075 ++:10E5F000632025782C206C722025782C20737020C5 ++:10E6000025782C207073722025782C2078707372F6 ++:10E610002025780A00202072302025782C207231A5 ++:10E620002025782C2072322025782C20723320254A ++:10E63000782C2072342025782C2072352025782CD7 ++:10E640002072362025780A00202072372025782C69 ++:10E650002072382025782C2072392025782C2072C1 ++:10E6600031302025782C207231312025782C2072F1 ++:10E6700031322025780A000A20202073702B3020A8 ++:10E6800025303878202530387820253038782025F6 ++:10E690003038780A00202073702B31302025303834 ++:10E6A0007820253038782025303878202530387883 ++:10E6B0000A0073702B257820253038780A006465AD ++:10E6C00061646D616E5F746F007265636C61696D2A ++:10E6D0002073656374696F6E20313A2052657475DA ++:10E6E000726E656420256420627974657320746F8E ++:10E6F0002074686520686561700A007265636C61EA ++:10E70000696D2073656374696F6E20303A205265BD ++:10E710007475726E65642025642062797465732057 ++:10E72000746F2074686520686561700A0072616D9D ++:10E730007374627964697300706125643D30782573 ++:10E74000257800706425643D3078252578006E7644 ++:10E7500072616D5F6F7665727269646500000000BA ++:10E7600086060200D0090000800602003E3E00003E ++:10E77000820602003E020000000702003C0000008A ++:10E780008406020012020000600104000300010080 ++:10E7900064010200C00000006001040003000100E9 ++:10E7A000660102000A00000060010400040001008C ++:10E7B0006401020014000000600104000700010071 ++:10E7C00064010200830100006001040025000100D3 ++:10E7D00064010200F40100006001040096050100DC ++:10E7E000660102002B04000060010400970501008F ++:10E7F000640102000001000060010400D701010073 ++:10E80000640102003C00000060010400DC01010022 ++:10E81000660102003400000060010400E201010012 ++:10E82000640102003000000060010400E701010003 ++:10E83000660102002C00000060010400ED010100EF ++:10E84000640102002C00000060010400F2010100DC ++:10E85000660102002800000060010400F8010100C8 ++:10E86000640102002800000060010400FD010100B5 ++:10E870006601020028000000FFFF00000000000009 ++:10E880006001040005000103640104000000190098 ++:10E89000240104000400000028010400000000001E ++:10E8A0002C01040000000000300104000000000002 ++:10E8B000340104000A04700034010400EFBED400E7 ++:10E8C00034010400050000FF3401040001FF02FFD1 ++:10E8D0003001040018000000340104000A04E000C4 ++:10E8E00034010400EFBE480034010400050000FFBD ++:10E8F0003401040001FF02FF34010400001018017C ++:10E9000034010400020300103401040018F1F2F392 ++:10E9100034010400BBCC0000300104006806000094 ++:10E92000340104001404700034010400EFBE5801E7 ++:10E9300034010400000000FF3401040001FF02FF65 ++:10E94000340104000010180134010400020303091B ++:10E9500034010400BF000010340104000000000076 ++:10E960003001040038000000340104000000000001 ++:10E970003001040088060000340104001404800003 ++:10E9800034010400EFBE1802340104000000030942 ++:10E9900034010400BF00000334010400000102033D ++:10E9A00034010400040500013401040002030405DD ++:10E9B0003401040000000000300104005800000091 ++:10E9C00034010400000000003001040038000000A1 ++:10E9D000340104000F2000073401040000009400FB ++:10E9E000340104000000009034010400747576774F ++:10E9F00034010400000000003401040000000500A0 ++:10EA000034010400FFFFFFFF300104006802000032 ++:10EA1000340104006E84330034010400DCBA500079 ++:10EA200034010400D40000AB34010400BADABADACD ++:10EA300034010400001018F134010400F2F3001056 ++:10EA40003401040018F1F2F3340104001000000056 ++:10EA500034010400000000003401040000000A003A ++:10EA6000340104000100000E340104004252434D01 ++:10EA7000340104005F54455334010400545F535380 ++:10EA800034010400494401043401040082848B965B ++:10EA900034010400030101063401040002000000F7 ++:10EAA0003001040068000000340104000A04280258 ++:10EAB00034010400DCBA8000340104000000FFFFD0 ++:10EAC00034010400FFFFFFFF34010400001018F1BF ++:10EAD00034010400F2F300103401040018F1F2F3E1 ++:10EAE00034010400D0AF0000340104000000000035 ++:10EAF0003401040000000001340104000200000E93 ++:10EB0000340104004252434D340104005F54455324 ++:10EB100034010400545F5353340104004944010498 ++:10EB20003401040082848B96340104000301010641 ++:10EB300034010400020100003001040068040000F8 ++:10EB4000340104000A04280234010400DCBA800005 ++:10EB5000340104000000FFFF34010400FFFFFFFF49 ++:10EB600034010400001018F134010400F2F3001025 ++:10EB70003401040018F1F2F334010400D0AF0000B6 ++:10EB80003401040000000000340104000000000112 ++:10EB9000340104000200000E340104004252434DCF ++:10EBA000340104005F54455334010400545F53534F ++:10EBB00034010400494401043401040082848B962A ++:10EBC00034010400030101063401040002010000C5 ++:10EBD0000001040000000001900402000000000099 ++:10EBE000A0040200F1F30000B0040200EFFD0000F9 ++:10EBF000A8040200FFFF0000A804020000000000BB ++:10EC0000AA04020000000000A4040200CF1A0000C1 ++:10EC1000AC04020000000000BC0402000000000080 ++:10EC2000A6040200D7020000B6040200FFFD0000A7 ++:10EC3000AE040200FFFF0000060402000100000015 ++:10EC400006040200000000000C040200180000008E ++:10EC5000060402000000000048040200000C00004E ++:10EC600002040200A00700000205020000000000EC ++:10EC70000005020000400000020502000400000040 ++:10EC8000000502000040000002050200080000002C ++:10EC90000005020000400000020502000C00000018 ++:10ECA000000502000040000002050200C000000054 ++:10ECB00080050200FFFF000082050200FFFF000048 ++:10ECC00084050200FFFF000086050200FFFF000030 ++:10ECD00088050200FFFF00009C050200F0FF000015 ++:10ECE000400502000080000020050200060F000021 ++:10ECF0004005020000800000400502000081000085 ++:10ED000020050200101D00004005020000810000E7 ++:10ED10004005020000820000200502001E280000BD ++:10ED20004005020000820000400502000083000050 ++:10ED30002005020029310000400502000083000088 ++:10ED4000400502000084000020050200323F000060 ++:10ED5000400502000084000040050200008500001C ++:10ED6000200502004041000040050200008500002F ++:10ED700012060200010000002E060200CDCC0000A9 ++:10ED8000300602000C0000000006020004800000B3 ++:10ED900096060200080000009A060200E400000047 ++:10EDA00088060200000000009C060200020000002D ++:10EDB00088060200001000009C060200020000000D ++:10EDC00088060200002000009C06020002000000ED ++:10EDD00088060200003000009C06020002000000CD ++:10EDE000880602000B0F00009E06020007000000CC ++:10EDF000100502000B00000050040200014E00004C ++:10EE0000520402005B010000E404020090000000D4 ++:10EE100004040200B400000054050200FF3F00009B ++:10EE2000600104000400010364010400000000000C ++:10EE300064010400B40000006401040047004700BE ++:10EE40006401040000006400640104003009400013 ++:10EE5000600104000D0001036401040002000200CF ++:10EE6000640104000100800064010400050000004A ++:10EE70006401040000008000640104006400640078 ++:10EE8000640104000E004700640104000005000056 ++:10EE90006001040015000103640104000000420841 ++:10EEA00064010400E00B0700640104000A00000094 ++:10EEB000600104001A0001036401040000C0660B35 ++:10EEC000600104001D00010364010400102700001C ++:10EED0006401040000007A036001040020000103C3 ++:10EEE00064010400060010276001040023000103F0 ++:10EEF000640104000000F606640104000000AA0A90 ++:10EF00006401040000003200640104000A0E0B09D1 ++:10EF1000640104000E020000640104000000520AB3 ++:10EF20006401040000003F0164010400FFFF000CC5 ++:10EF30006401040032046E06640104000200F20958 ++:10EF4000600104002E000103640104000000008041 ++:10EF50006001040032000103640104000000320B70 ++:10EF60006001040034000103640104000000CC05CA ++:10EF70006001040058000103640104004252434D43 ++:10EF8000640104005F54455364010400545F53530B ++:10EF900064010400494400006001040060000103B2 ++:10EFA0006401040039000000640104005000000006 ++:10EFB00064010400C000000060010400700001034F ++:10EFC00064010400AA03AA0364010400AA03AA03BB ++:10EFD00064010400AA03AA0364010400AA03AA03AB ++:10EFE00064010400EC03D60364010400C003AA0317 ++:10EFF00064010400F703E10364010400CB03B503DB ++:10F0000064010400AA03AA0364010400AA03AA037A ++:10F0100064010400AA03AA0364010400AA03AA036A ++:10F0200064010400EC03D60364010400C003AA03D6 ++:10F0300064010400F703E10364010400CB03B5039A ++:10F0400064010400020402046401040002040204D6 ++:10F05000640104000E0402046401040002041A04A2 ++:10F0600064010400020402046401040002040204B6 ++:10F070006401040002040204640104002604020482 ++:10F080006401040002040204640104000204020496 ++:10F09000640104000E0402046401040002041A0462 ++:10F0A0006401040002040204640104000204020476 ++:10F0B0006401040002040204640104002604020442 ++:10F0C0006401040000001F0064010400FF031F002E ++:10F0D000640104000200000064010400020000005A ++:10F0E00060010400980001036401040000001F0097 ++:10F0F00064010400FF031F0064010400010000001C ++:10F10000640104000100000060010400A00001038C ++:10F110006401040000001F0064010400FF031F00DD ++:10F12000640104000100000064010400010000000B ++:10F1300060010400A80001036401040000001F0036 ++:10F1400064010400FF031F006401040001000000CB ++:10F15000640104000100000060010400B800010324 ++:10F1600064010400E700EC006401040000007B007F ++:10F17000640104007E00000064010400000000003F ++:10F180006401040000004F51640104003F000000CE ++:10F19000640104000000001060010400C0000103CD ++:10F1A0006401040037243724640104003724372421 ++:10F1B0006001040093010103640104000F0040009A ++:10F1C00064010400E60600006001040097010103E9 ++:10F1D000640104001A08000060010400A00101039A ++:10F1E00064010400FFFFFFFF64010400FFFFFFFF55 ++:10F1F00064010400FFFFFFFF64010400FFFFFFFF45 ++:10F2000064010400FFFFFFFF64010400FFFFFFFF34 ++:10F2100064010400FFFFFFFF64010400FFFFFFFF24 ++:10F2200060010400BC01010364010400000005004A ++:10F2300060010400C5010103640104000000100323 ++:10F2400064010400E000FFFF640104000309BF0043 ++:10F25000640104000000030964010400BF00001001 ++:10F26000640104000309BF006401040000030000FE ++:10F2700060010400CD01010364010400FFFFFFFFF2 ++:10F2800064010400FFFFFFFF64010400FFFFFFFFB4 ++:10F2900064010400FFFFFFFF64010400FFFFFFFFA4 ++:10F2A00064010400FFFFFFFF64010400FFFFFFFF94 ++:10F2B00064010400FFFFFFFF640104002000CB0194 ++:10F2C0006401040000005400640104000000AB0865 ++:10F2D00064010400000010046401040084000200C2 ++:10F2E000640104000000140064010400CF01020066 ++:10F2F000640104004400000064010400AF0802003F ++:10F3000064010400100464006401040002020000AF ++:10F31000640104001000CA016401040002003C0002 ++:10F32000640104000000AA08640104000200100443 ++:10F330006401040054000208640104000000080095 ++:10F3400064010400CE0100006401040034000000E8 ++:10F3500064010400AE0800006401040010044400CD ++:10F3600064010400020A0000640104000800C901ED ++:10F370006401040002003000640104000000A908D8 ++:10F380006401040002001004640104003C00021047 ++:10F39000640104000000040064010400CD010000C9 ++:10F3A000640104002C00000064010400AD080000AA ++:10F3B000640104001004340064010400021200001F ++:10F3C000640104000400C8016401040000002C0072 ++:10F3D000640104000000A808640104000000100497 ++:10F3E0006401040030000219640104000000000000 ++:10F3F00064010400CC010200640104002C00000040 ++:10F4000064010400AC080200640104001004300030 ++:10F4100064010400021A000064010400C0000A0430 ++:10F420006401040070000000640104003A010A0451 ++:10F430006401040028022CC064010400F2020A04E2 ++:10F440006401040000000001640104006000140471 ++:10F450006401040038000000640104000201140487 ++:10F460006401040014012CC064010400DE011404D2 ++:10F4700064010400000080006401040022003704DD ++:10F48000640104001500000064010400DF0037047B ++:10F490006401040065002CC0640104002E013704DF ++:10F4A0006401040000002F006401040011006E8458 ++:10F4B000640104000B00000064010400D4006E84A9 ++:10F4C0006401040033002CC064010400FC006E845D ++:10F4D00064010400000018006401040002008A9D19 ++:10F4E00064010400FB00020864010400C54EFA0038 ++:10F4F00064010400020A833464010400FE00021067 ++:10F50000640104006227F900640104000212421A37 ++:10F5100064010400FD00021964010400B113F80045 ++:10F5200064010400021A811164010400FC00021C41 ++:10F5300064010400C10FFC00600104007B030103AF ++:10F540006401040007001400640104001E000000B0 ++:10F55000600104008303010364010400000000F063 ++:10F5600064010400C3301092640104005031802211 ++:10F5700064010400C330000060010400880301033B ++:10F580006401040000001004600104008C03010306 ++:10F590006401040080000000600104008E03010388 ++:10F5A0006401040005000000600104000B04010375 ++:10F5B0006401040000000702600104001404010358 ++:10F5C000640104000100000060010400160401034E ++:10F5D000640104000C0000006001040053050103F5 ++:10F5E00064010400000018006001040055050103D7 ++:10F5F00064010400983A983A64010400A60E64007D ++:10F60000640104000000F40164010400050000002E ++:10F6100064010400A861A8616401040030751E0043 ++:10F62000600104005D0501036401040050C3000093 ++:10F63000600104005F05010364010400000014057B ++:10F640006401040050C3000060010400630501036D ++:10F6500064010400204E00006401040000000F005B ++:10F6600064010400F4010400600104006905010361 ++:10F670006401040000003100640104000000030084 ++:10F68000640104000100070064010400C8AF000029 ++:10F690006401040088130000640104002C17FF00BB ++:10F6A00060010400700501036401040000002C01E6 ++:10F6B000640104000000A00F600104007305010351 ++:10F6C00064010400000003006401040000002C0138 ++:10F6D00064010400C00000006401040088130000FD ++:10F6E000640104006400000064010400DC05401FA4 ++:10F6F000600104007A0501036401040001000100B7 ++:10F700006401040002000000600104007D050103A3 ++:10F710006401040002000000640104000000409C39 ++:10F7200064010400204E000064010400B80B0000D6 ++:10F730006001040082050103640104000000204E02 ++:10F74000640104000000050064010400DC053F00C2 ++:10F7500064010400710200006401040030750000BF ++:10F76000600104008A05010364010400C409A00FBC ++:10F77000600104008D050103640104000A00D00744 ++:10F78000600104008F05010364010400204E204E37 ++:10F79000600104009505010364010400BE0000003F ++:10F7A00060010400B105010364010400E8030000E6 ++:10F7B00060010400ED050103640104000000000085 ++:10F7C00060010400F60501036401040088130000D1 ++:10F7D0006001040003000200640104001F00000037 ++:10F7E000600104000400020064010400FF03000043 ++:10F7F0006001040005000200640104001F00000015 ++:10F80000600104000600020064010400070000001B ++:10F81000600104000700020064010400040000000D ++:10F82000600104000800020064010400FFFF000002 ++:10F8300060010400090002006401040000000000EF ++:10F84000600104000A0002006401040000000000DE ++:10F85000600104000B0002006401040000000000CD ++:10F86000600104000C0002006401040000000000BC ++:10F87000600104000D0002006401040000000000AB ++:10F88000600104000E00020064010400000000009A ++:10F89000600104000F000200640104000000000089 ++:10F8A0006001040010000200640104001F00000059 ++:10F8B0006001040011000200640104000000000067 ++:10F8C0006001040012000200640104000000000056 ++:10F8D0006001040013000200640104000000000045 ++:10F8E0006001040015000200640104000000000033 ++:10F8F0006001040016000200640104000000000022 ++:10F90000FFFF000000000000636275636B5F7377A8 ++:10F910006672657100000000E02E010101500000D8 ++:10F9200000000000C832020101490000899DD80092 ++:10F930004038030101420000AAAAAA00003C0401C9 ++:10F94000013E000000008000483F05010139000031 ++:10F95000D05E4200A0410601013900004992240016 ++:10F96000004B07010132000000000000584D080163 ++:10F9700001300000071F7C00204E0901013000000B ++:10F9800000000000A8610A0101260000666666000A ++:10F9900090650B0101240000C44EEC0030750C0191 ++:10F9A000012000000000000018920D020133000049 ++:10F9B000F93E560000960E020132000000000000E1 ++:10F9C000409C0F02013000000000000080BB1002CC ++:10F9D00001280000000000000000000000000000FE ++:10F9E0000000000009FA0100000000000800080003 ++:10F9F00008FA01000100000008000B0000000000F0 ++:10FA000000000000000000006D6B6565705F616CB8 ++:10FA100069766500746F655F6F6C00746F655F7306 ++:10FA20007461747300746F655F73746174735F6382 ++:10FA30006C65617200AAAA030000000014FA0100BC ++:10FA400000000000070000001BFA01000100000098 ++:10FA500008004C0025FA0100020000000000000030 ++:10FA6000000000000000000000000000D58D8600AE ++:10FA70000C00800001000000A98E86000B00000031 ++:10FA800001000000B58E86000300000005000000A4 ++:10FA9000C18E86000400000007000000D08E8600A2 ++:10FAA00005008000010000000000000000000000D0 ++:10FAB000000000005B574C414E5D636F756E742013 ++:10FAC0003D2025640A000000D550830021578300A3 ++:10FAD0000000000000000000627461006274616D4B ++:10FAE00070006274616D705F666C61677300627450 ++:10FAF000616D705F6368616E006274616D705F312B ++:10FB0000316E5F737570706F7274006274616D70C6 ++:10FB10005F6662006274616D705F73746174656CBE ++:10FB20006F6700414D502D253032782D25303278C9 ++:10FB30002D253032782D253032782D253032782D14 ++:10FB400025303278000000007DC5860000000000EE ++:10FB50000800240084C586000100000008000000A1 ++:10FB600093C586000200000008000C00A4C58600B2 ++:10FB7000030000000800E402AFC586000400000096 ++:10FB800007000000C0C58600050000000800240032 ++:10FB9000C9C586000600000001000000D1C586002E ++:10FBA0000700000007000000DBC586000800000019 ++:10FBB0000100000049C586000900000001000000A6 ++:10FBC000000000000000000000000000776C635F90 ++:10FBD00061757468656E74696361746F725F646F78 ++:10FBE000776E0025733A2063616C6C65640A00705F ++:10FBF000617463685F696F76617273006F747072AD ++:10FC00006177006175746800666162696400616DA6 ++:10FC10007064755F727473005856000243004000B0 ++:10FC2000207986000000004003000000FCFB01007A ++:10FC300007000800080000003D7D860001000880E4 ++:10FC40000800000003FC0100020000400600000064 ++:10FC50004FDB0100030010000700000008FC01005A ++:10FC60000400000005000000647D8600050000001F ++:10FC700008001C000EFC010006000000010000004E ++:10FC80000000000000000000000000004D84FF8321 ++:10FC90004CC4001FB784FF80B184FFDFB0C40808E4 ++:10FCA000FA84F7FFF9C4080001006C090200710929 ++:10FCB0000300760904007B09050080090600850918 ++:10FCC00007008A0908008F09090094090A009909A8 ++:10FCD0000B009E090C00A3090D00A8090E00B40931 ++:10FCE000CC0102000000D400000000000000000170 ++:10FCF0000000000000002D00A7901A0047090E0028 ++:10FD0000012007008B93030038CA01002AE5000098 ++:10FD1000977200004C390000A61C0000530E000032 ++:10FD20002907000095030000CA010000E50000005B ++:10FD300073000000390000001D0000006E840B00FD ++:10FD40000000D400000000000000000100000000DE ++:10FD50006030180C6C482412776C25643A20536389 ++:10FD6000616E20696E2070726F67726573732C20EC ++:10FD7000736B697070696E67207478706F776572E5 ++:10FD800020636F6E74726F6C0A00706F77657220FB ++:10FD900061646A210A002E6661622E0025732E6658 ++:10FDA00061622E25640063636B6277323032677064 ++:10FDB0006F0063636B62773230756C3267706F000F ++:10FDC0006C65676F66646D627732303267706F00A2 ++:10FDD0006C65676F66646D62773230756C32677020 ++:10FDE0006F006D6373627732303267706F006D63DE ++:10FDF0007362773230756C3267706F006D63736257 ++:10FE00007734303267706F006C65676F66646D625F ++:10FE100077323035676C706F006C65676F66646D44 ++:10FE200062773230756C35676C706F006C65676F28 ++:10FE300066646D6277323035676D706F006C656730 ++:10FE40006F66646D62773230756C35676D706F0008 ++:10FE50006C65676F66646D62773230356768706FA6 ++:10FE6000006C65676F66646D62773230756C3567FC ++:10FE700068706F006D63736277323035676C706FD6 ++:10FE8000006D637362773230756C35676C706F002C ++:10FE90006D63736277343035676C706F006D6373B8 ++:10FEA0006277323035676D706F006D6373627732E1 ++:10FEB00030756C35676D706F006D637362773430C9 ++:10FEC00035676D706F006D637362773230356768C8 ++:10FED000706F006D637362773230756C3567687070 ++:10FEE0006F006D637362773430356768706F006DD3 ++:10FEF00063733332706F006C65676F66646D3430A6 ++:10FF0000647570706F00616E7473776974636800F4 ++:10FF1000616135670074737369706F733267006570 ++:10FF2000787470616761696E3267007064657472BD ++:10FF3000616E6765326700747269736F3267006162 ++:10FF40006E74737763746C32670074737369706F67 ++:10FF50007335670065787470616761696E35670035 ++:10FF60007064657472616E67653567007472697379 ++:10FF70006F356700616E74737763746C35670070FA ++:10FF80006132677730613300706132677731613396 ++:10FF9000006D61787032676130006D617870326732 ++:10FFA00061310070613267773061300070613267B3 ++:10FFB0007730613100706132677731613000706194 ++:10FFC00032677731613100706132677732613000BA ++:10FFD0007061326777326131006D61787035676CBE ++:10FFE0006130006D61787035676C6131007061352A ++:10FFF000676C7730613000706135676C77306131E4 ++:020000022000DC ++:1000000000706135676C7731613000706135676C05 ++:100010007731613100706135676C77326130007023 ++:100020006135676C77326131006D61787035676179 ++:1000300030006D61787035676131007061356777C8 ++:100040003061300070613567773061310070613543 ++:1000500067773161300070613567773161310070E9 ++:1000600061356777326130007061356777326131B1 ++:10007000006D6178703567686130006D617870354A ++:100080006768613100706135676877306130007092 ++:100090006135676877306131007061356768773145 ++:1000A00061300070613567687731613100706135AA ++:1000B0006768773261300070613567687732613127 ++:1000C000006D61787035676133006D6178703567F8 ++:1000D0006C61330070613567773061330070613572 ++:1000E000676C773061330070613567773161330059 ++:1000F000706135676C7731613300706135677732D5 ++:10010000613300706135676C773261330062773438 ++:1001100030706F00636464706F0073746263706F3B ++:10012000006277647570706F00747870696432670C ++:100130006130007478706964326761310069747489 ++:100140003267613000697474326761310063636BD8 ++:100150003267706F006F66646D3267706F006D6339 ++:10016000733267706F30006D63733267706F310088 ++:100170006D63733267706F32006D63733267706FD7 ++:1001800033006D63733267706F34006D6373326771 ++:10019000706F35006D63733267706F36006D637317 ++:1001A0003267706F3700747870696435676C6130DE ++:1001B00000747870696435676C6131006F66646DD6 ++:1001C00035676C706F006D637335676C706F3000EE ++:1001D0006D637335676C706F31006D637335676C79 ++:1001E000706F32006D637335676C706F33006D63D1 ++:1001F0007335676C706F34006D637335676C706F47 ++:1002000035006D637335676C706F36006D637335E1 ++:10021000676C706F3700747870696435676130009F ++:100220007478706964356761310069747435676129 ++:10023000300069747435676131006F66646D3567CD ++:10024000706F006D63733567706F30006D63733569 ++:1002500067706F31006D63733567706F32006D6367 ++:10026000733567706F33006D63733567706F34007B ++:100270006D63733567706F35006D63733567706FCD ++:1002800036006D63733567706F370074787069641A ++:10029000356768613000747870696435676861310A ++:1002A000006F66646D356768706F006D63733567E6 ++:1002B00068706F30006D6373356768706F31006D03 ++:1002C0006373356768706F32006D6373356768708C ++:1002D0006F33006D6373356768706F34006D6373DF ++:1002E000356768706F35006D6373356768706F369A ++:1002F000006D6373356768706F3700656C6E6132CF ++:100300006700656C6E6135670074656D706F666659 ++:100310007365740070687963616C5F74656D706497 ++:10032000656C7461000C1218243048606C003CC489 ++:1003300007003BC407004C84FFE0B084F7F7F98462 ++:10034000F7FF000008040200350108300800030030 ++:100350001204020043010000010000001C0402001E ++:1003600048010800030000002C04020049010800B5 ++:1003700003000000390402004A01080003000000E5 ++:10038000470402004E01080003000000520402006E ++:100390003D014000070007005E0402007A010004EE ++:1003A000070000006C0402003F010000060000008E ++:1003B00077040200400100000200000082040200F5 ++:1003C0007C010000020000008F04020042010000D6 ++:1003D000070000009B040200280008000300000042 ++:1003E000AC0402002900000001000000B904020072 ++:1003F0007F0100000200000000000000000000007B ++:1004000000000000706879007478696E737470770A ++:1004100072007068795F6D75746564007068795FEB ++:10042000676C697463687468727368007068795F78 ++:100430006E6F6973655F7570007068795F6E6F6964 ++:1004400073655F64776E007068795F706572636171 ++:100450006C007068795F7278697165737400706898 ++:10046000796E6F6973655F73726F6D006E756D5F26 ++:1004700073747265616D0062616E645F72616E6754 ++:10048000650073756262616E643567766572006DD2 ++:10049000696E5F7478706F776572007068795F6FEE ++:1004A000636C736364656E61626C65007068795F2C ++:1004B0007278616E7473656C007068795F637273D3 ++:1004C0005F7761720000EB04C00100006A04FFFF67 ++:1004D000190036001A013A00250028000500120113 ++:1004E000FF001F010B0013010700FC00FD00FF00CF ++:1004F000C000CA00C5001200570059005C00780017 ++:100500009200980016012C016A000B001B001301D9 ++:100510001D0014012E002A011201F904010001003E ++:10052000FA04010000004C04001800184D0400609B ++:1005300000603809FF01FF013909FF019E003B04FB ++:10054000030003003C0403000000DA46FFFFDBC6A3 ++:100550000300D10604000400977A977A977A977A75 ++:10056000877A877A977B000006000000060000006B ++:1005700006000000060000003809040004003909E4 ++:1005800004000400A404001000104AC444004A44BB ++:1005900080004AC444004A448000A4040040000093 ++:1005A000A40400800080D00420000000A404FF0107 ++:1005B0000000A504FF00FF00A50400700050A50482 ++:1005C000000700000D04FF0040000D0400070004B8 ++:1005D000A204FF004000A20400070004A804FF00DA ++:1005E0000100D70401000100D704400000003706D5 ++:1005F00000C00080810400020002B704007F006C8C ++:10060000B10400200000390900020000380900028E ++:100610000002B00408000800B0040008000839090E ++:10062000000800003809000800081004080008004D ++:10063000DA062000000003050100000003050400A5 ++:100640000000A40400400000A40400800000D004C6 ++:1006500020000000A504FF00FF00A504007000506A ++:10066000A504000700000D04FF0040000D04000772 ++:100670000006A204FF004000A20400070006D904FF ++:1006800070002000D90400070003D9040070001096 ++:10069000DA0400100000DA0400200020A604008024 ++:1006A0000080D70408000800D70400700010D904A7 ++:1006B00004000000D9040800080000000000000049 ++:1006C0000000000000000000FFEEDDCCBB99887741 ++:1006D0006655443322110000DA46FFFF0305080087 ++:1006E000080025642009202564200A004572726FE5 ++:1006F000722067657474696E67206C6F772069710A ++:10070000206573740A004572726F72206765747495 ++:10071000696E672068696768206971206573740A6B ++:1007200000004AC480004A847F00D0040200000018 ++:10073000D204FF000000D20400FF0000D004080033 ++:1007400000004C04000800084D0400200000B00424 ++:1007500000010001B644FFFFB7040F000F004C0476 ++:10076000000800084D0400200020B0040001000132 ++:100770003B04010001003C04010001003C040100B5 ++:1007800000003B04010000004AC444004A448000C9 ++:10079000DAC64000DBC60300DA06200020001004A1 ++:1007A00008000000A60400800080A604FF01FF00EE ++:1007B0009A04FF01FF008007000400048007000284 ++:1007C0000002D60603000000DA06080008004249CD ++:1007D00002003B4900003C49000076068000000012 ++:1007E000DA06010000006C08040000006C084000FC ++:1007F00000006C0800040000D70408000000D804C2 ++:1008000001000000D804020000003B0404000400C2 ++:100810003C04040000003B04040004003C04040009 ++:10082000000084806782568034823B04010001000E ++:100830003C04010001003C04010000003B040100F5 ++:1008400000003B04020002003C04020002003C04E1 ++:10085000020000003B0402000000977A977A977A22 ++:10086000977A877A877A977B0F0900090109060929 ++:10087000070908090209030909090A090B090409FA ++:1008800005090C090D090E09110987466000424649 ++:1008900007003B84EDFF3C04020002004C84D0EFD3 ++:1008A0004D84D7BF4D04040004004D040300010033 ++:1008B000F984F8FFFA84F8FF3B04020002003C04CC ++:1008C000020000003B04100010003C044000000047 ++:1008D0004C04001000104D04004000404D04040082 ++:1008E00000004C04040004004C04080008004D04FF ++:1008F000080000004C04200020004D0420002000CF ++:10090000F90402000200FA0402000000F9040400E5 ++:100910000400FA0404000000F90401000100FA04D4 ++:1009200001000000DB04FF03A602DB0400700020CE ++:100930009A05FF0326009B05FF03A5009C05FF0306 ++:10094000A6009C0500FC00289D05003C001C9D05A0 ++:10095000FF03A800A40400800080A404004000401D ++:10096000A40400200020B004800000003B044000EC ++:100970000000A904008000802184238434838480C3 ++:100980006782568034823B04020002003C0402006D ++:1009900000003B04100010003C04400000004B44E9 ++:1009A000FFFFB10400040000B1040080000038091A ++:1009B00040004000380904000400390940000000EC ++:1009C000390904000400D70402000200D7048000A3 ++:1009D0000000D70401000100D70440004000D70404 ++:1009E00008000800D70400700020DA06400040002C ++:1009F000A40400200000D70408000800D7040070F9 ++:100A0000002031C61500D60603000000DAC68F00AC ++:100A1000100480000000A8440A000305A404D004C8 ++:100A2000D904DA04A60438093909D804D004D70453 ++:100A3000A5040D04A2044C04001000104D04004055 ++:100A400000404C04000800084D04002000003B0456 ++:100A5000020002003C04020000003B04010001000F ++:100A60003C04010000004C04080008004D0408008C ++:100A700008004C04200020004D0420000000F90470 ++:100A800002000200FA0402000200F904040004005B ++:100A9000FA0404000400F90401000100FA04010052 ++:100AA00001005344A90A3D49C000000000000000B5 ++:100AB000000000000000000000000000977A877A24 ++:100AC000877A977B760680008000DA0601000100B5 ++:100AD0006C08040004006C08400040006C0800042E ++:100AE000000410091E091F092409250926092009E7 ++:100AF000210927092809290922092309300931096F ++:100B000032091209D7440000D70401000100D704BC ++:100B100040000000D70401000100D704400040005D ++:100B20001004020000001004010000001004020084 ++:100B30000000100401000100100402000200100473 ++:100B4000010000007A46030073467017744644049F ++:100B500075463F00704681068C4649004AC44400F1 ++:100B60004A448000004001400240034004400540E8 ++:100B700006400740075B0780A3C60100A386FEFF6F ++:100B80000700FF001F013A001A01050082008600DD ++:100B90002E0113017D002800340600FF0000DAC694 ++:100BA00080000AC02802760680000000DA060100F4 ++:100BB00000006C08040000006C08400000006C0895 ++:100BC00000040000D80401000000D8040200000066 ++:100BD000D704080000004C84FFE73B840C005384DA ++:100BE000FF7F53C40080424907003B4917203C491E ++:100BF000C527D60603000100DA0608000000DA0661 ++:100C0000800000000A46A0006A4419000F0900098C ++:100C100001090609070908090209030909090A095E ++:100C20000B09040905090C090D090E091109C9462A ++:100C300000068046FF0081463F01CE460000CB46BD ++:100C40000000CC460000CD4600009D46FF07A446AC ++:100C50000000A5460000D90404000400D9040800DF ++:100C60000000A40400400040A40400400000DAC6D4 ++:100C700040000100D70408000800D70400700030CD ++:100C80004AC444004A4480003B0404000000380980 ++:100C900040000000380904000000D70402000000F2 ++:100CA000D70401000000D70408000000D8040100A8 ++:100CB0000000D8040200000000FC070069A5050040 ++:100CC000FF010000695D0A0000040800975E0A0049 ++:100CD0000102000097A60500D70401000100D70417 ++:100CE00040004000D70401000000D90401000100C9 ++:100CF000D904020000000000AA0A02009A05FF03BE ++:100D000026009B05FF0389009C05FF038A009C05C4 ++:100D100000FC00209D05003C002C9D05FF038C007D ++:100D20003B04010001003C040100000038090008F8 ++:100D30000008390900080008DA0600800080D306A0 ++:100D400000800080D30600800000DA0600800000EA ++:100D50000A80D7FDDA867FFFD7C6010031C60018AA ++:100D60003B4400003C4400004C440000E6440000CA ++:100D7000F9440000B044000038490000B0440000CD ++:100D80004E44000067C503004AC444004A44800042 ++:100D90004804000300010806FF0017000406FF07CF ++:100DA000EA0342490F004249000042490F004A4409 ++:100DB00084004A448000D3462222D34620223B4965 ++:100DC00017203C49C5270305010000000305040066 ++:100DD00000000305100010004249000042490F00C6 ++:100DE000424900003B4917003C49C5074AC444003A ++:100DF0004A448000D70408000000D7040070002097 ++:100E0000380904000400390904000400A404001097 ++:100E10000010D70404000400D704000F00008B4624 ++:100E200000007646A1B816012D012C016A00980039 ++:100E300097002F010B0013011D0014012E002A0141 ++:100E400009001F010700FF000500D0040100000099 ++:100E5000D304FF000000D30400FF0000D004100002 ++:100E60000000D004040000003A0980008000230440 ++:100E7000FF0049003404FF00FCFF1604FF00A4FF3C ++:100E8000160400FF009F240400FF002A230400FF33 ++:100E9000002D2504FF000F000005FF000F000005D6 ++:100EA00000FF000F2004FF000A00340400070001C7 ++:100EB0003204FF00BF00320400FF00B8FF0400FC52 ++:100EC0000018D106040000004B06400040002184B9 ++:100ED0002384348384806782568034824B060100E9 ++:100EE00001004B06080008005F36291F5F36291FE6 ++:100EF0005F36291F5F36291F000000000000000038 ++:100F000000000000000000000000000000000000E1 ++:100F100000000000000000000400000000000000CD ++:100F200004000000080000000100000005000000AF ++:100F3000090000000D0000004D0000008D000000C1 ++:100F40000D0000004D0000008D000000CD000000ED ++:100F50005200000092000000D2000000D600000005 ++:100F600016010000160500001609000056090000D1 ++:100F7000560D000056110000961100009651000019 ++:100F80009691000096D1000096110100000000002B ++:100F90000000000000000000000000000000000051 ++:100FA0000000000004000000000000000400000039 ++:100FB000080000000100000005000000090000001A ++:100FC0000D0000004D0000008D0000000D0000002D ++:100FD0004D0000008D000000CD0000005200000018 ++:100FE00092000000D2000000D600000016010000B0 ++:100FF000160500001609000056090000560D0000F5 ++:1010000056110000565100005691000056D10000C4 ++:1010100056110100565101005691010056D10100B0 ++:1010200000000000000000000000000000000000C0 ++:1010300000000000000000000000000000000000B0 ++:1010400000000000000000000000000000000000A0 ++:101050000000000000000000000000000000000090 ++:101060000000000000000000000000000000000080 ++:1010700000000000000000000A0009000600050052 ++:101080000A000900060005000A0009000600050024 ++:101090000A000900060005000A0009000600050014 ++:1010A0000A000900060005000A0009000600050004 ++:1010B0000A000900060005000A00090006000500F4 ++:1010C0000A000900060005000A00090006000500E4 ++:1010D0000A000900060005000A00090006000500D4 ++:1010E0000A000900060005000A00090006000500C4 ++:1010F0000A000900060005000E00000000020003BF ++:10110000000400060008000B00100110021003107C ++:10111000041005100610071007170720072D0740B9 ++:1011200000000000000000000000000000000000BF ++:1011300000000000000000000000000000020003AA ++:10114000000400060008000B00100110021003103C ++:10115000041005100610071007170720072D074079 ++:10116000000000000000000000000000000000007F ++:10117000000000000000000000000000000000006F ++:10118000000000000000000000000000000000005F ++:10119000000000000000000000000000000000004F ++:1011A00000000000000000000000004000000000FF ++:1011B000000000000000000000000000000000002F ++:1011C000000000000000000000000000000000001F ++:1011D000000000000000000000000000000000000F ++:1011E00000000000000000000000000000000000FF ++:1011F00000000000000000000000000000000000EF ++:1012000000000000000000000000000000000000DE ++:1012100000000000000000000000000000000000CE ++:1012200000000000000000000000000000000000BE ++:1012300000000000000000000000000000000000AE ++:10124000000000000000000000000000000000009E ++:1012500000000000F8410100F8210000FB2100001F ++:10126000FB410000DBFE01007B2100003321000078 ++:10127000EB400000A3FE01004B0200004D014D01B8 ++:101280004D014D014D014D014D014D014D014D01EE ++:101290004D014D014D014D014D014D014D014D01DE ++:1012A0004D014D014D014D014D014D014D014D01CE ++:1012B0004D014D014D014D014D014D014D014D01BE ++:1012C0004D014D014D014D014D014D014D014D01AE ++:1012D0004D014D014D014D014D014D014D014D019E ++:1012E0004D014D014D014D014D014D014D014D018E ++:1012F0004D014D014D014D014D014D01090F1418D6 ++:10130000FE070B0FFBFE0105080B0E111417000062 ++:1013100000000000000306090C0F1200000000008E ++:1013200000000000000306090C0F1215181B000036 ++:101330000000000003EB000001001000100020007E ++:101340000100300010004000220050002201600027 ++:101350002202700022038000220490002205A000D7 ++:101360002206B0002207C0002208D0002209F000A7 ++:10137000220A1000220B2000220C3000220D400017 ++:10138000220E5000220F600000000000000000004C ++:10139000000000000000000000000000000000004D ++:1013A0000000000000000000040000000000000039 ++:1013B000040000000800000001000000050000001B ++:1013C000090000000D0000004D0000008D0000002D ++:1013D0000D0000004D0000008D000000CD00000059 ++:1013E0004F0000008F000000CF000000D30000007D ++:1013F0001301000013050000130900005309000049 ++:10140000530D000053110000931100009351000090 ++:101410009391000093D1000093110100000000009F ++:1014200000000000000000000000000000000000BC ++:1014300000000000040000000000000004000000A4 ++:101440000800000001000000050000000900000085 ++:101450000D0000004D0000008D0000000D00000098 ++:101460004D0000008D000000CD0000004F00000086 ++:101470008F000000CF000000D30000001301000027 ++:10148000130500001309000053090000530D00006C ++:1014900053110000535100005391000053D100003C ++:1014A00053110100535101005391010053D1010028 ++:1014B000000000000000000000000000000000002C ++:1014C000000000000000000000000000000000001C ++:1014D000000000000000000000000000000000000C ++:1014E00000000000000000000000000000000000FC ++:1014F00000000000000000000000000000000000EC ++:1015000000000000000000000104020403040404C1 ++:10151000050406040704080409040A048B058C0565 ++:101520008D058E058F059000910092009301940126 ++:10153000950196019701980199019A019B019C01DF ++:101540009D019E019F01A001A101A201A301A4018F ++:10155000A5010000010101010101010101010101D9 ++:10156000010101010101010101010101010101016B ++:101570000101020301030201010101010101010155 ++:10158000010101010101010101010101010101014B ++:10159000010101010101010101010101010101013B ++:1015A000010101010101010101010101010101012B ++:1015B0000101020301030201010101010101010115 ++:1015C000010101010101010101010101010101010B ++:1015D000010101017C120200400000000200000035 ++:1015E0000000000010000000D411020040000000C4 ++:1015F0000100000000000000100000005412020072 ++:101600000A0000000B0000000000000020000000A5 ++:1016100038130200140000000C000000000000005D ++:1016200020000000A41A0200940000000D00000039 ++:101630000000000020000000081502002600000045 ++:101640000E000000000000001000000078100200F2 ++:10165000400000000F00000000000000100000002B ++:10166000081D020010000000100000000000000033 ++:1016700008000000FC1202003C0000001100000005 ++:101680000000000008000000881302006000000055 ++:1016900012000000000000002000000054150200AD ++:1016A000800000001400000000000000080000009E ++:1016B000EC1602009A000000170000000000000075 ++:1016C00010000000FC1002006C0000000000000090 ++:1016D000000000001000000020180200A000000020 ++:1016E0001800000000000000200000001A00340074 ++:1016F0004E0068009C00D000EA000401340068003D ++:101700009C00D0003801A001D40108024E009C00CA ++:10171000EA003801D4017002BE020C036800D00058 ++:101720003801A00170024003A803100418009C00B7 ++:10173000D0000401EA0038018601D0000401040150 ++:1017400038016C016C01A001380186018601D401C9 ++:10175000220222027002040138016C0138016C017E ++:10176000A001D401A001D401080208023C028601B4 ++:10177000D4012202D40122027002BE027002BE0213 ++:101780000C030C035A0336006C00A200D80044017D ++:10179000B001E6011C026C00D8004401B0018802CF ++:1017A0006003CC033804A2004401E6018802CC03A4 ++:1017B0001005B2055406D800B00188026003100578 ++:1017C000C0069807700818004401B0011C02E60129 ++:1017D00088022A03B0011C021C028802F402F402EF ++:1017E000600388022A032A03CC036E046E041005EA ++:1017F0001C028802F4028802F4026003CC03600336 ++:10180000CC0338043804A4042A03CC036E04CC03AC ++:101810006E041005B2051005B20554065406F6060E ++:101820000000080000000800000008000000080098 ++:101830000000080000000800000008000000080088 ++:101840000000080000000800000008000000080078 ++:101850000000080000000800000008000000080068 ++:101860000000080000000800000008000000080058 ++:101870000000080000000800000008000000080048 ++:101880000000080000000800000008000000080038 ++:101890000000080000000800000008000000080028 ++:1018A0000000080000000800000008000000080018 ++:1018B0000000080000000800000008000000080008 ++:1018C00000000800000008000000080000000800F8 ++:1018D00000000800000008000000080000000800E8 ++:1018E00000000800000008000000080000000800D8 ++:1018F00000000800000008000000080000000800C8 ++:1019000000000800000008000000080000000800B7 ++:1019100000000800000008000000080000000800A7 ++:101920000000080000000800000008000000080097 ++:101930000000080000000800000008000000080087 ++:101940000000080000000800000008000000080077 ++:101950000000080000000800000008000000080067 ++:101960000000080000000800000008000000080057 ++:101970000000080000000800000008000000080047 ++:101980000000080000000800000008000000080037 ++:101990000000080000000800000008000000080027 ++:1019A0000000080000000800000008000000080017 ++:1019B0000000080000000800000008000000080007 ++:1019C00000000800000008000000080000000800F7 ++:1019D00000000800000008000000080000000800E7 ++:1019E00000000800000008000000080000000800D7 ++:1019F00000000800000008000000080000000800C7 ++:101A000000000800000008000000080000000800B6 ++:101A100000000800000008000000080000000800A6 ++:101A20000000080000000800000008000000080096 ++:101A30000000080000000800000008000000080086 ++:101A40000000080000000800000008000000080076 ++:101A50000000080000000800000008000000080066 ++:101A60000000080000000800000008000000080056 ++:101A70000000080000000800000008000000080046 ++:101A80000000080000000800000008000000080036 ++:101A90000000080000000800000008000000080026 ++:101AA0000500000000000000000000000000001021 ++:101AB00000000000000000200000000000000030D6 ++:101AC0000000000000000040000000000000005086 ++:101AD0000000000000000060000000000000007036 ++:101AE00000000000000000800000000000000090E6 ++:101AF00008000000000000A008000000000000B086 ++:101B000008000000000000C008000000000000D035 ++:101B100008000000000000E008000000000000F0E5 ++:101B20000800000000000000090000000000001094 ++:101B30000900000000000020190000000000003033 ++:101B400019000000000000401900000000000050D3 ++:101B50001900000000000060190000000000007083 ++:101B60001900000000000080190000000000009033 ++:101B700019000000000000A019000000000000B0E3 ++:101B800019000000000000C019000000000000D093 ++:101B900019000000000000E019000000000000F043 ++:101BA00019000000000000001A00000000000010F2 ++:101BB0001A000000000000201A00000000000030A1 ++:101BC0001A000000000000401A0000000000005051 ++:101BD0000200000000000060020000000000007031 ++:101BE00002000000000000800200000000000090E1 ++:101BF00002000000000000A002000000000000B091 ++:101C000002000000000000C00A000000000000D038 ++:101C10000A000000000000E00A000000000000F0E0 ++:101C20000A000000000000000B000000000000108F ++:101C30000B000000000000200B000000000000303E ++:101C40000B000000000000400B00000000000050EE ++:101C50001B000000000000601B000000000000707E ++:101C60001B000000000000801B000000000000902E ++:101C70001B000000000000A01B000000000000B0DE ++:101C80001B000000000000C01B000000000000D08E ++:101C90001B000000000000E01B000000000000F03E ++:101CA0001B000000000000001C00000000000010ED ++:101CB0001C000000000000201C000000000000309C ++:101CC0001C000000000000401C000000000000504C ++:101CD0001C000000000000601C00000000000070FC ++:101CE0001C000000000000801C00000000000090AC ++:101CF0001C000000F80E020060000000120000004E ++:101D000000000000200000005F36291F5F36291FF9 ++:101D10005F36291F5F36291FE80E02001000000001 ++:101D200010000000000000000800000090E886009D ++:101D30000000800001000000000000000000000022 ++:101D4000000000007363616E0000000044EB860039 ++:101D50000100204005000000A2A5860002002040EE ++:101D60000500000090A5860003002040050000004B ++:101D70007EA58600040020400500000075998600BD ++:101D80000500104005000000EBE88600060020403A ++:101D9000020000004CEB86000C0000000100000077 ++:101DA0005EEB860007002000080000000000000035 ++:101DB00000000000000000006E6F63726300534477 ++:101DC000494F0043444300000D1680008D138000EE ++:101DD00025118000291480001D138000A1168000A9 ++:101DE000A90F0100011380002D13800000000000E6 ++:101DF0001D168000E9270000776C0000000000003D ++:101E00000000000000000000F025000000000000BD ++:101E100000000000000000000000000000000000C2 ++:101E20000000000005000000FFFFFFFF140000009D ++:101E30000100050605000000FFFFFFFF0500000090 ++:101E400005000000050000000E0E0E0E0E02090D2A ++:101E50000A080D01090D0A080D01090D0A080D01F6 ++:101E6000090D0A080D01090E0A090E060A0E0B09D2 ++:101E70000E02093A160E0E05093A160E0E050A0E46 ++:101E80000B090E050A0E0B090E020A0E0B090E02B3 ++:101E900014C0C015110514C0C015110514C0C0151B ++:101EA000110514C0C015110514C0C0151105093A5B ++:101EB000160E0E0514C0C015110514C0C01511056D ++:101EC000093A160E0E05093A160E0E05093A160EB7 ++:101ED0000E0514C0C0151105093A160E0E05093A73 ++:101EE000160E0E05093A160E0E0509B21C0E0E0549 ++:101EF00012B11911110800000000000000000000DC ++:101F00000000000065660200416602002D660200C6 ++:101F100055AA80000000000021AA800085AA800048 ++:101F200031AA80006DAA8000C993800095A9800025 ++:101F3000BDA98000D5938000B59380007593800083 ++:101F4000D191800000000000B1A98000736470632B ++:101F50006D6465760000000000000000041F0200B0 ++:101F60000000000000000000000000000000000071 ++:101F70000000000000000000000000000000000061 ++:101F80000000000000000000000000000000000051 ++:101F90000000000000000000000000000000000041 ++:101FA0000000000000000000000000000000000031 ++:101FB0000000000000000000000000000000000021 ++:101FC0000000000000000000000000000000000011 ++:101FD0000000000000000000000000000000000001 ++:101FE00000000000000000000000000000000000F1 ++:101FF00000000000000000000000000000000000E1 ++:1020000000000000000000000000000000000000D0 ++:1020100000000000000000000000000000000000C0 ++:1020200000000000000000000000000000000000B0 ++:1020300000000000000000000000000000000000A0 ++:102040000000000000000000000000000000000090 ++:102050000000000000000000000000000000000080 ++:102060000000000000000000000000000000000070 ++:10207000000000000000000004E301004100000037 ++:10208000440000000000000000000000000000000C ++:102090000000000000000000000000000000000040 ++:1020A0000000000000000000000000000000000030 ++:1020B0000000000000000000000000000000000020 ++:1020C0000000000000000000000000000000000010 ++:1020D0000000000000000000000000000000000000 ++:1020E00000000000000000000000000000000000F0 ++:1020F00000000000000000000000000000000000E0 ++:1021000000000000000000000000000000000000CF ++:1021100000000000000000000000000000000000BF ++:1021200000000000000000000000000000000000AF ++:10213000000000000000000000000000000000009F ++:10214000000000000000000000000000000000008F ++:10215000000000000000000000000000000000007F ++:10216000000000000000000000000000000000006F ++:10217000000000000000000000000000000000005F ++:10218000000000000000000000000000000000004F ++:10219000C8DC0100010000000100F918010DE40095 ++:1021A000F4DEF106FC0F27FAFF1DF01018090AF201 ++:1021B00010E01714041114F1FAF2DBF7FCE2FBE172 ++:1021C000EE130DFF1CE91A17180300DAE803E617EF ++:1021D000E4E9F3FF121305E104E225F706F2ECF15E ++:1021E000FC11E914F0E0F6F2E8091010011DD9FA2B ++:1021F000040F0F060CDE1C00FF0D07181AF60EE484 ++:10220000160FF905EC181B0A1EFF0026E2FFE50A6F ++:1022100014180705EA0FF2E4E6F6080808080808AB ++:1022200008090A0808070701020202020202020264 ++:102230000202020202020202020201010000000088 ++:1022400000000000C5011DFFE0FFC0FFE0FF00002F ++:10225000000000FF000000006B0382FEE7FFCCFFE0 ++:10226000E7FF080002000000D7010BFFEEFFDCFFD4 ++:10227000EEFFA7033CFEECFF1700ECFF720385FEA8 ++:10228000AEFEF801AEFE070004000000980160FFFA ++:10229000CBFF96FFCBFF9C0345FE2500C1FF250029 ++:1022A000B10316FEE4FEA501E4FE070014000100E0 ++:1022B000BF0131FFF20049FEF200870361FE33FFE8 ++:1022C000620133FF800378FEDAFEE900DAFE0800DF ++:1022D00015000100BF0131FF18010EFE1801870330 ++:1022E00061FE16FF7C0116FF800378FE8FFF9300CE ++:1022F0008FFF090016000100BF0131FF620055FF8A ++:102300006200870361FE1FFF6B011FFF79037EFEE2 ++:10231000F4FE5D00F4FE080017000100BC0131FF6F ++:10232000740042FF7400870361FE52FF020152FFF6 ++:10233000800378FE7FFFF1FF7FFF08001800010097 ++:10234000B40131FFDFFF1D00DFFF880361FE87FF5F ++:1023500090FF87FF7F0378FECDFEF401CDFE0800DD ++:1023600019000100AD0131FFB8FF3E00B8FF820344 ++:1023700061FEAAFFB1FFAAFF7F0378FEC7FEFE0140 ++:10238000C7FE08001A000100930154FFD9FF0C009A ++:10239000D9FF1B03C7FE4CFF38004CFF3303B8FEC8 ++:1023A00080FF280080FF08001B000100890154FF06 ++:1023B000CFFF1300CFFF1703C7FE00FF500000FF41 ++:1023C0002E03BDFE8BFF25008BFF08001E000100C1 ++:1023D000BB0119FFC3FF1D00C3FF6B0361FE66FF56 ++:1023E000480066FF7C0378FE56FF4F0056FF08004A ++:1023F0002C000100BF0131FFE00071FEE000870307 ++:1024000061FE8BFFC4008BFF800378FEB2FEC0002C ++:10241000B2FE0800010000006C0900000B0A000772 ++:102420000A88888002000000710900000B0A00077A ++:102430000A88888003000000760900000B0A000764 ++:102440000A888880040000007B0900000B0A00074E ++:102450000A88888005000000800900000B0A000738 ++:102460000A88888006000000850900000B0A000722 ++:102470000A888880070000008A0900000B0A00070C ++:102480000A888880080000008F0900000B0A0007F6 ++:102490000A88888009000000940900000B0A0007E0 ++:1024A0000A8888800A000000990900000B0A0007CA ++:1024B0000A8888800B0000009E0900000B0A0007B4 ++:1024C0000A8888800C000000A30900000B0A00079E ++:1024D0000A8888800D000000A80900000B0A000788 ++:1024E0000A8888800E000000B40900000B0A00076B ++:1024F0000A888880000001009F0152074000800088 ++:102500004000180378064000800040000A032E06B1 ++:1025100040008000400008000100010092013707E0 ++:1025200003013B0003019F02020744003600440000 ++:10253000600247075D00A7005D000800020001007F ++:102540009F01520740008000400018037806C00039 ++:102550008001C0000A032E064000800040000800F1 ++:10256000030001002E013107810002018100920267 ++:10257000B806CD009A01CD00F202E006AA0054018F ++:10258000AA0008001400010068015CFFF200C6FE0A ++:10259000F200F002B8FE33FFCB0033FFFF02E0FE93 ++:1025A00003FF49FF03FF08001500010068015CFFFD ++:1025B000950052FF9500F002B8FE33FFA40033FFF0 ++:1025C000FF02E0FE00FFEFFE00FF08001600010022 ++:1025D00068015CFF62009CFF6200F002B8FE33FFFE ++:1025E0007C0033FFFF02E0FE00FFA0FE00FF0800BA ++:1025F000170001005E015CFF8CFF52008CFFF002AF ++:10260000B8FE33FF280033FFFF02E0FE7FFF15FF17 ++:102610007FFF08001800010045015CFFE0FFD8FFC4 ++:10262000E0FFF402B8FE00FF29FE00FFFE02E0FE1C ++:10263000FAFEAA00FAFE0800190001002B015CFF57 ++:10264000CDFFC0FFCDFFE002B8FE00FF29FE00FF76 ++:10265000FD02E0FEFAFEAA00FAFE08001A000100E0 ++:10266000150197FFD9FF8BFFA8FF7D022EFFC0FF4A ++:1026700040FF70FF660248FF80FF80FEE0FE08001A ++:102680001B000100F50097FFCFFF6DFF92FF720264 ++:102690002EFF5EFF1BFE95FE650248FFC2FF46FF50 ++:1026A00075FF08001E0001002E0131FFC3FF86FFE9 ++:1026B000C3FF9202B8FE33FF66FE33FFF202E0FE74 ++:1026C00056FFACFE56FF08002800010068015CFFC1 ++:1026D000F200C6FEF200F002B8FECD0035FFCD00DC ++:1026E000FF02E0FEFF017201FF0108000501000882 ++:1026F0000001FFFF0000000000000000A200000039 ++:1027000000FF00FF00000000000000FF00000000CC ++:102710007802A0FE80FF00FF80FF0800010000009B ++:10272000760179FFF0FFE0FFF0FF1F0374FECEFF9C ++:10273000E0FFCEFFEE022BFE2CFF32002CFF080044 ++:1027400002000000770116FFDBFFB4FFDBFF1F0371 ++:1027500074FEE0FFECFFE0FFEC02F2FE80FF1E00E3 ++:1027600080FF080003000000770116FFDBFFB4FFC5 ++:10277000DBFF1F0374FEE0FFECFFE0FFEC02F2FE64 ++:102780006CFF23006CFF0800040000003301AEFF63 ++:10279000CBFF96FFCBFF0B0385FECBFF0A00CBFFE1 ++:1027A000FD022BFE2CFFCA002CFF080000000000D9 ++:1027B0000000000000000000000000000000000019 ++:1027C0000000000000000000000000000000000009 ++:1027D00000000000000000000000000000000000F9 ++:1027E00000000000000000000000000000000000E9 ++:1027F00000000000000000000000000000000000D9 ++:1028000000000000000000000000000000000000C8 ++:1028100000000000000000000000000000000000B8 ++:1028200000000000000000000000000000000000A8 ++:102830000000000000000000000000000000000098 ++:102840000000000000000000000000000000000088 ++:102850000000000000000000000000000000000078 ++:102860000000000000000000000000000000000068 ++:102870000000000000000000000000000000000058 ++:102880000000000000000000000000000000000048 ++:102890000000000000000000000000000000000038 ++:1028A0000000000000000000000000000000000028 ++:1028B0000000000000000000000000000000000018 ++:1028C0000000000000000000000000000000000008 ++:1028D00000000000000000000000000000000000F8 ++:1028E00000000000000000000000000000000000E8 ++:1028F00000000000000000000000000000000000D8 ++:1029000000000000000000000000000000000000C7 ++:1029100000000000000000000000000000000000B7 ++:1029200000000000000000000000000000000000A7 ++:102930000000000000000000000000000000000097 ++:102940000000000000000000000000000000000087 ++:102950000000000000000000000000000000000077 ++:102960000000000000000000000000000000000067 ++:102970000000000000000000000000000000000057 ++:102980000000000000000000000000000000000047 ++:102990000000000000000000000000000000000037 ++:1029A0000000000000000000000000000000000027 ++:1029B0000000000000000000000000000000000017 ++:1029C0000000000000000000000000000000000007 ++:1029D00000000000000000000000000000000000F7 ++:1029E00000000000000000000000000000000000E7 ++:1029F00000000000000000000000000000000000D7 ++:102A000000000000000000000000000000000000C6 ++:102A100000000000000000000000000000000000B6 ++:102A200000000000000000000000000000000000A6 ++:102A30000000000000000000000000000000000096 ++:102A40000000000000000000000000000000000086 ++:102A50000000000000000000000000000000000076 ++:102A60000000000000000000000000000000000066 ++:102A70000000000000000000000000000000000056 ++:102A80000000000000000000000000000000000046 ++:102A90000000000000000000000000000000000036 ++:102AA0000000000000000000000000000000000026 ++:102AB0000000000000000000000000000000000016 ++:102AC0000000000000000000000000000000000006 ++:102AD00000000000000000000000000000000000F6 ++:102AE00000000000000000000000000000000000E6 ++:102AF00000000000000000000000000000000000D6 ++:102B000000000000000000000000000000000000C5 ++:102B100000000000000000000000000000000000B5 ++:102B200000000000000000000000000000000000A5 ++:102B30000000000000000000000000000000000095 ++:102B40000000000000000000000000000000000085 ++:102B50000000000000000000000000000000000075 ++:102B60000000000000000000000000000000000065 ++:102B70000000000000000000000000000000000055 ++:102B80000000000000000000000000000000000045 ++:102B90000000000000000000000000000000000035 ++:102BA0000000000000000000000000000000000025 ++:102BB0000000000000000000000000000000000015 ++:102BC0000000000000000000000000000000000005 ++:102BD00000000000000000000000000000000000F5 ++:102BE00000000000000000000000000000000000E5 ++:102BF00000000000000000000000000000000000D5 ++:102C000000000000000000000000000000000000C4 ++:102C1000000000000000000083682DE9F0415B69BE ++:102C20000546152B0F460AD0182B08D01B2B06D0B3 ++:102C3000242B01D0272B04D12B8A7F2B05D80C23E2 ++:102C400004E0172B01D0182B01DD1423AB624FF0E9 ++:102C500004430022BB6100E00132BB69002B03DAB0 ++:102C60001D4B9A42F8D134E01C4B9A4231D8AE6ADF ++:102C70003C69331DAB83AC61A868298ADEF346F357 ++:102C8000022390FBF3F014F4807F68840AD0284676 ++:102C900039463246DEF352F3C0F30F1083B2E883B5 ++:102CA0002B8403E0AB8B2B846B8CEB83AB6913F42D ++:102CB000007F0AD0AA6A284639460132DEF33EF385 ++:102CC000C0F30F1083B2688400E02B8CAB842B8A96 ++:102CD000EB84BDE8F081C046809698007F9698000E ++:102CE00070B50446DEF33CF1002144220546DFF3D3 ++:102CF000A7F16369152B2B6001D0162B01D9104B5E ++:102D00006B60686808B9054617E0AC602046E8F3D8 ++:102D1000F1F1E8602046E8F3B5F1064618B920461F ++:102D20000121E8F3EDF16B6820469B689847054662 ++:102D30001EB920463146E8F3E3F1284670BDC0468F ++:102D4000C81D02002DE9F0470546884691469A467F ++:102D5000E8F398F1074618B928460121E8F3D0F1C5 ++:102D60002846E8F38FF1D0B12846E8F381F1B0B9F5 ++:102D70002846FFF7B5FF064610B94FF0FF3410E0C4 ++:102D80002846ECF763FD736830465C6941464A4665 ++:102D90005346A04704462846ECF75CFD01E06FF07F ++:102DA00018041FB928463946E8F3AAF12046BDE8C1 ++:102DB000F087C0460523C0F894310223C0F898314B ++:102DC0001E33C0F89C31234B4FF010021B68002BC0 ++:102DD0000CBF07230023C0F8A0314FF00103C0F857 ++:102DE000AC3103F16303C0F8B0314FF00603C0F813 ++:102DF000C03140F23C73C0F8C4314FF00803C0F852 ++:102E0000C83103F10D03C0F8A421C0F8B821C0F8FF ++:102E1000BC21C0F8CC31C0F8D02101D1032302E09D ++:102E20000D4B1B68013BC0F8D4311C230422C0F8B1 ++:102E3000DC310C23C0F8E0319B18C0F8E4310623E4 ++:102E4000C0F8EC310023C0F8D821C0F8E821C0F860 ++:102E5000F0317047EC260000D4250000D0F81012A5 ++:102E600070B5044609B90D460CE08068DFF39CF6A6 ++:102E7000D4F810120546E822A068E3F339F70023DE ++:102E8000C4F81032284670BD70B50024054680F89D ++:102E90007541006903F04AFC2846E6F30DF7E8683F ++:102EA0002146E7F3C7F7D5F8900128B1E3F306F21E ++:102EB000D5F89001E3F34CF2D5F88C0128B1E3F397 ++:102EC000FDF1D5F88C01E3F343F2E86805F0CAFCA4 ++:102ED000D5F8103223B11B7813B12846FFF7BEFF97 ++:102EE000A86829464FF40772E3F302F770BDC046A5 ++:102EF0001FB5044606238068E8210393E3F3E8F650 ++:102F0000C4F8100210B94FF0FF300CE00021E822A5 ++:102F1000DFF396F000230093A068D4F8101203AA00 ++:102F20001C33DFF3D9F604B010BDC0462DE9F047DD ++:102F30008AB01F46129D9C4B08461D601146904664 ++:102F4000E6F33CF6002800F02A8138464FF407717A ++:102F5000E3F3BEF60446002800F0218100214FF47F ++:102F600007720646DFF36CF0A76065612046FFF745 ++:102F700021FF8E4B1B68C4F80C320BB99A4605E052 ++:102F80001B78B3F1000A18BF4FF0010A884B04F117 ++:102F900028001A680121002A14BF31221122DFF310 ++:102FA0006DF70023009301930293404639462A4669 ++:102FB000139B05F095FDE060002800F0EA80E7F340 ++:102FC00051F72060E068E7F36BF7656960606B6854 ++:102FD000784A83F00103784903F00103002B0CBF0A ++:102FE00088469046226884F8763140F629039A4252 ++:102FF000D4F80890D4F80CC00AD120B905F5007EA9 ++:1030000005F5047508E005F5007E05F5087503E093 ++:1030100005F5007E05F50475D4F8B831D4F8BC2167 ++:10302000D4F8C411D4F8C00101934FF0FF330493D6 ++:1030300009330693002302920391059007934846B3 ++:103040004146624673460095EEF774FA60620028C6 ++:1030500000F09F80D4F80C12C1B10B78B3B1E1F34A ++:10306000C7F556492246D4F80C02DFF389F5D4F8A7 ++:103070000C0253492246DFF3BDF5BAF1000F05D02B ++:103080002046FFF735FF002840F0838001210A46E3 ++:10309000606AE1F3B5F520460021E2683B4603F0A3 ++:1030A00051FB2061002874D000210B462046454A80 ++:1030B000E3F370F10023C4F8900184F879314248B9 ++:1030C000E4F3D4F518B3DFF303F2012383403F4860 ++:1030D000C4F88031E4F3CAF510B1DFF3F9F108B1B7 ++:1030E000D4F88001C4F8840139490020DFF344F4A6 ++:1030F000030CA4F888319BB2A4F88A013BB10021EB ++:103100002046344A0B46E3F345F1C4F88C01002015 ++:103110003149DFF331F4012809D184F816022F492F ++:103120000138DFF329F4012804BF2D4B1860204635 ++:10313000E6F3A4F320B30025C4F8A051284629499A ++:10314000DFF31AF428B1012384F8F9312648EEF7A9 ++:10315000ABFA28462549DFF30FF488B12349284606 ++:10316000DFF30AF44FF0807300F00F000AA901F8B2 ++:10317000010D4FF44072009320460F23DFF7BEFC91 ++:103180001B481C492246E3F3B5F41B48EBF76CFDE2 ++:1031900006E0A06821464FF40772E3F3A9F5002684 ++:1031A00030460AB0BDE8F087F4260000BC260000D7 ++:1031B000EC260000AE278600B6278600DD9B800047 ++:1031C0007929000065A68000052886000E28860063 ++:1031D00017288600499B80001F28860078D50100AB ++:1031E000AC2702002A2886003428860089D50100F1 ++:1031F0004D288600E59A8000D596800010B50446DB ++:1032000060B1036806491868224600F09DDE236815 ++:10321000214658684FF4BC72E3F36AF510BDC0460E ++:10322000853B86007FB505464FF4BC714068E3F3EB ++:103230004FF508B9064619E000214FF4BC72064666 ++:10324000DEF3FEF60B4B356000930B4B002401932D ++:103250002868334609490A4A0294039400F03CDE88 ++:103260004FF49663C6F8603186F86441304604B086 ++:1032700070BDC04625110100E52C0000B0D501004D ++:10328000853B860070B5044608B906462AE0816889 ++:1032900009B90E460CE0C3689868ECF3DFF1E36807 ++:1032A000D0F1010638BF0026A1689868ECF3E8F178 ++:1032B000616F0025A56529B1E368A26F5868E3F343 ++:1032C00017F565672046EEF7D5FFE36806491868ED ++:1032D000224600F039DEE368214658684FF4B072A8 ++:1032E000E3F306F5304670BDEB3D860030B54FF494 ++:1032F000B07185B005464068E3F3EAF40446E0B1F6 ++:1033000000214FF4B072DEF39BF6E560C5F8184873 ++:10331000A8680D4922460023ECF3CEF1A06060B10D ++:103320000A4B2868009300230193029303930849F2 ++:10333000084A234600F0D0DD18B12046FFF7A2FF6F ++:103340000024204605B030BD152E0000D9E18000D4 ++:1033500034D60100EB3D8600034B012210B51A70F4 ++:10336000EBF7F2FF10BDC0463C28020070B50446E2 ++:10337000D0F884000D4608B102F0D8FCD4F88000E3 ++:1033800008B105F0E5FBE06F08B1FFF737FFA06F6C ++:1033900008B105F06BFC606F08B1FFF773FFA06820 ++:1033A00008B100F0CDFB284621468C22E3F3A0F4BF ++:1033B00070BDC0462DE9F04F064689B00D4600208D ++:1033C0008C2191469846139FE3F382F4044600282B ++:1033D00077D000218C22DEF333F62760304605F0EB ++:1033E000B1F807AB0190059383464FF0000A2046E1 ++:1033F00041F2E44142463B460295CDF800A0CDF8AB ++:103400000C90049400F06EFD054600285BD0A0608F ++:1034100002F066DB2B696060E3602F4B1021A36430 ++:103420002E4A3B46266164643046DEF34DF62B6936 ++:1034300039461B6E2A489A6B2A4BEEF735F93A4605 ++:1034400050461299284B0096CDF8049002F0ECFDFE ++:103450000746002837D16368012683F87860362153 ++:103460003246D5F87C0223F08FD9204B2846E363FF ++:10347000FFF73CFF606730B36368284683F8A460B9 ++:1034800005F006FCA067F0B12846FFF7CBFEE06729 ++:10349000C8B1284605F088FBC4F8800098B12846DA ++:1034A00002F072FCC4F8840068B1114B01970093DC ++:1034B0000297039728680F490F4A234600F00CDD56 ++:1034C00008B9204604E020465946FFF74FFF002088 ++:1034D00009B0BDE8F08FC04655F78000FB4186007B ++:1034E00008B10200A0D6010029FB8000EFBEAD0D9F ++:1034F00099F88000E8D60100C542860041F2E44315 ++:10350000984201D00020AFE044F22033994200F00D ++:10351000AA800533994200F0A680223B994200F030 ++:10352000A2801E33994200F09E800333994200F03E ++:103530009A800C3B994200F096800133994200F04A ++:1035400092800133994200F08E80093B994200F04D ++:103550008A800233994200F08680013B994200F054 ++:103560008280023399427ED0013399427BD001336D ++:10357000994278D00533994275D00133994272D07F ++:10358000013399426FD001F53C43D8339BB2022BF3 ++:1035900069D94BF6D543CB189BB2022B63D944F2C1 ++:1035A000413399425FD0013B99425CD001F53C43E5 ++:1035B000B0339BB2022B56D944F25333994252D0C6 ++:1035C000043399424FD04AF69D1399424BD044F2AE ++:1035D0005433994247D0253B994244D0013B99420C ++:1035E00041D0063399423ED0013399423BD001335A ++:1035F000994238D04BF6C943CB189BB2022B32D933 ++:1036000044F2167399422ED0113399422BD0A3F570 ++:103610007973994227D001F53C43A0339BB2012B2B ++:1036200021D901F53C43BA339BB2022B1BD94BF68F ++:10363000CF43CB189BB2012B15D94BF6AB43CB181C ++:103640009BB2012B0FD901F53C43A8339BB2012B50 ++:1036500009D944F26333994205D00D33994214BF1E ++:103660000020012000E001207047C0462DE9F84FFE ++:1036700000264FF0010842F601334FF0FF344FF0BF ++:10368000640B0746A0F8283680F8474680F8C44403 ++:103690000221224680F8288080F868B780F84266C8 ++:1036A00080F84C8680F8436680F8498680F8466644 ++:1036B00002F05ED938464146324602F059D90C2113 ++:1036C0002246384602F054D90B213846324602F0E1 ++:1036D0004FD90E212246384602F04AD90D213846EC ++:1036E000324602F045D90F212246384602F040D931 ++:1036F00004210222384602F03BD9D7F860364FF059 ++:10370000030987F8488683F80690D7F860364FF0AB ++:10371000020A83F8079040F62A13A7F82A36A7F87A ++:103720002C369BB2A7F82E3640F62A13A7F830366F ++:10373000A7F83236A7F83436A7F8363640F62B13FA ++:10374000A7F838363B68A7F87A6583F895604FF09C ++:103750000703A7F83A364FF00403A7F83C360F23C7 ++:1037600087F80C37D7F89034A7F83E96C7F8803220 ++:10377000A7F840A6A7F87C68A7F87EB887F8EA61A2 ++:1037800087F8EB6187F81E6287F8EE6187F8EC61D5 ++:1037900087F8FA8187F80B6787F8A0649E71D7F8DD ++:1037A00094340B22C7F8843283F80680D7F8983413 ++:1037B0003146C7F8883283F806A0D7F89C343546DE ++:1037C000C7F88C3283F806903B6887F8506783F817 ++:1037D0004D805C633B6807F5CC6483F842803B68AE ++:1037E000043483F843603B6887F8CF6183F839601D ++:1037F0003B68204683F8AA803B6887F8DF6187F83A ++:10380000E081C7F8E46187F8E161DE66DEF318F471 ++:103810006FF0220387F864362C3387F865364A4602 ++:1038200004EB0A001A49DEF3A7F33B6887F869A6A0 ++:1038300087F8568587F8578583F84C603A6887F88B ++:103840009267A7F89067A7F88CB892F8463013F003 ++:10385000030F0CD092F94C304BB1D7F8FC04243054 ++:10386000F1F3F6F4D7F8FC043230F1F3F1F44FF44D ++:103870004873A7F85C373B68012287F8252883F84E ++:10388000A2203A684FF0FF3382F8B530BDE8F88FD8 ++:103890000FD40100836B70B5002483F84C40C36BD8 ++:1038A000012583F84C500646816BDFF711FEF16B62 ++:1038B0003046DFF70DFE21463046F6F349F2B36B92 ++:1038C000304683F84D40F36B294683F84D40D6F8D7 ++:1038D00060364FF0FF34DD72D6F860369C81F6F327 ++:1038E00037F2D6F860369B78AB4214D9B36B83F8C5 ++:1038F0004D40F26B4FF0FF3382F84D3096F8CB34E9 ++:1039000096F8CC2443EA022343F0800386F8CB34B4 ++:103910001B0A86F8CC3470BDD0F8AC1110B5044643 ++:1039200029B18068EBF3ACF60023C4F8AC31D4F8CD ++:10393000C41129B1A068EBF3A3F60023C4F8C43185 ++:10394000D4F8741529B1A068EBF39AF60023C4F8F3 ++:103950007435D4F8F81629B1A068EBF391F600237A ++:10396000C4F8F836D4F8FC1629B1A068EBF388F651 ++:103970000023C4F8FC36D4F8E036196A31B1A068E7 ++:10398000EBF37EF6D4F8E02600231362D4F83C155E ++:1039900029B1A068EBF374F60023C4F83C35D4F8E1 ++:1039A000941729B1A068EBF36BF60023C4F89437A1 ++:1039B000D4F8B01829B1A068EBF362F60023C4F87C ++:1039C000B03810BD70B505462D4980682A460023E1 ++:1039D000EBF372F6C5F8AC0100284ED0A86829496F ++:1039E0002A460023EBF368F6C5F8C401002844D04A ++:1039F000A86825492A460023EBF35EF6C5F874054E ++:103A000000283AD0A86821492A460023EBF354F64F ++:103A1000C5F8F806002830D0A8681D492A460023BA ++:103A2000EBF34AF6C5F8FC0638B3A86819492A46EC ++:103A30000023D5F8E046EBF33FF62062E8B1A86832 ++:103A400015492A460023EBF337F6C5F83C05A0B12B ++:103A5000A86812492A460023EBF32EF6C5F894070E ++:103A600058B1A8680E492A460023EBF325F6C5F89D ++:103A7000B008003818BF012000E0002070BDC0462B ++:103A80003DAA81003D708100253E81009591810015 ++:103A9000858F8100256E810089598100396B8100F5 ++:103AA000496F810010B50446006805F0B3FED4F8F4 ++:103AB000583113B10023C4F85831D4F83C0120B177 ++:103AC00005F00EF90023C4F83C31D4F8400120B1D0 ++:103AD00001F080F80023C4F84031D4F84C0120B143 ++:103AE00002F09AF80023C4F84C31D4F8540120B104 ++:103AF00005F070FA0023C4F85431D4F8600120B105 ++:103B000007F000F80023C4F86031D4F8383113B15D ++:103B10000023C4F83831D4F8640120B101F0FEFE6E ++:103B20000023C4F86431D4F8000520B107F026F969 ++:103B30000023C4F80035204605F0D2FA10BDC04677 ++:103B40002DE9F041054608B9074695E001F046FB2E ++:103B50000746284602F06AD800B90137D5F8F016B2 ++:103B600049B16868D5F8F426E3F3C2F00023C5F83C ++:103B7000F436C5F8F0362846D5F81815F8F38AF764 ++:103B80002846D5F8D816F8F385F7D5F82015284635 ++:103B9000F8F380F7D5F82C1521B168684FF49662D8 ++:103BA000E3F3A6F0D5F87C0220B105F051FA00232A ++:103BB000C5F87C3200242B19D3F84C1211B12846D9 ++:103BC0001BF03ADC0434202CF5D10121284631F0D9 ++:103BD000C9DD284601F078FE2E6BB16911B1284687 ++:103BE00031F054D80024B461D5F85C0101F05EFFD7 ++:103BF0002846FFF791FE2846FFF754FF2846D5F8E0 ++:103C00002C18DFF75DFCC5F82C48D5F8B84404E063 ++:103C100068681022E468E3F36BF02146002CF7D1CA ++:103C2000C5F8B844286816492A4600F08DD9D5F859 ++:103C3000340718B101F010F9C5F83447D5F8680118 ++:103C400018B106F0C5FFC5F86841D5F8181759B185 ++:103C50006868D5F81C27E3F34BF0C5F8184703E074 ++:103C60002846696807F0B0D8D5F87822002AF7D13D ++:103C70002846696800F034FD3846BDE8F081C0464A ++:103C8000BB5C8600036870B55E6905461449304622 ++:103C9000DEF372F6C0B218B930461249DEF36CF6A4 ++:103CA00040B2431E0E2B0ED8012803D1D5F8603642 ++:103CB000002204E0022806D1D5F8603601229A716C ++:103CC000D5F86036DA71084930462C6BDEF354F6CD ++:103CD00084F804012846EFF3EFF1012070BDC046DF ++:103CE000C65C8600CB5C86000E5D8600036870B5FE ++:103CF0001B490546D0F860465869DEF33DF6207052 ++:103D00002B6818495869D5F86046DEF335F6E0703F ++:103D1000D5F8602613780BB10F2B01D10123137056 ++:103D2000D5F8603601211A785A70D5F860462046D9 ++:103D3000DEF3DEF3A070D5F86026D3780BB10F2B3D ++:103D400001D10123D370D5F860360121DA781A71D8 ++:103D5000D5F86046E01CDEF3CBF3607170BDC04661 ++:103D600019D7010021D7010070B50446214600682B ++:103D700007F012F8C4F8000508B929305EE02068A1 ++:103D800005F050FD2068214601F08AF8C4F8340798 ++:103D900008B92A3052E02A4B2046C4F8583104F0C2 ++:103DA000B9FFC4F83C0108B9313047E0204600F0C3 ++:103DB0004BFFC4F8400108B932303FE0204606F01E ++:103DC000B3FEC4F8600108B9353037E020682146F9 ++:103DD000A2681C4B05F058F9C4F87C0208B93930C8 ++:103DE0002CE0204601F0EAFDC4F8640108B93C303B ++:103DF00024E0154B0125C4F838310023A4F83038ED ++:103E000084F8883884F88A3884F88958204601F084 ++:103E100013FFC4F84C0108B93F300FE02368214676 ++:103E200083F83A50236883F8A950206805F062F9B6 ++:103E300008B1452002E0236883F8A05070BDC04659 ++:103E4000EFBEADDE9D6D8100EFBEAD0DF0B5D0F8DB ++:103E500040750021AC2287B006463846DEF3F0F00C ++:103E60004FF06403FB85032387F8603000220123B1 ++:103E7000D6F85C014FF42C5121F0D4DFFF2804D197 ++:103E8000336B18691968EEF787FE31687886A6F8F3 ++:103E9000260691F84640336B00F44065FF201A89EE ++:103EA00000211B68B5F5406F14BF1425282501902B ++:103EB00004F00304D6F8600600910294039580781C ++:103EC000049007F138002DF0D9D8336893F84630C4 ++:103ED00013F0030F03D0FB8843F02003FB8007B0EF ++:103EE000F0BDC0462DE9F04F8DB01A9F9A460023D1 ++:103EF00007910B930646934610461799189A199BFB ++:103F00009DF85890009709F08DF9044610B11E23D2 ++:103F10000B937FE3FFF720FA179851460BAA00F0A6 ++:103F20000DFD0546002800F07583179AD0F860361D ++:103F300042604FF0FF32D0F8008083F81C21836B81 ++:103F4000C8F804A00363436B8660C362179BC0F884 ++:103F50007871C8F80C30B54B88F82190C8F8B030AB ++:103F6000032380F86937C0F8CC2880F89D4151467A ++:103F7000FFF77CFB2846F7F323F7284605F0D4F833 ++:103F80000446002840F04F8328463146179A53468E ++:103F900006F03EFEC5F8680108B91F23D3E2A44B22 ++:103FA0000194009302940394A249A34A2B462868E3 ++:103FB000FFF392F7A14B0194009302940394A0495C ++:103FC000A04A2B462868FFF387F7189A199B179E7B ++:103FD00002920393284607995A465346CDF800901B ++:103FE0000196049701F04AFA04460B90002840F02D ++:103FF0001A832B69186EEBF767FCA5F8BE082846F4 ++:10400000F5F38EF508B914239DE2264631460AAA37 ++:104010002846F7F311F231462846BDF8282001362C ++:10402000F7F314F2062EF1D1012488F89A4005F531 ++:10403000BE72286908F1140118F054DC8249D8F8DE ++:104040001400DEF399F481498146D8F81400DEF3B8 ++:1040500093F47F49A5F86208D8F81400DEF38CF4D5 ++:10406000B5F86228A5F86408A5F87827A5F87A07B6 ++:104070007849D8F81400DEF37FF47749A5F854089E ++:10408000D8F81400DEF378F485F856087349D8F8A8 ++:104090001400DEF371F485F858087149D8F814005B ++:1040A000DEF36AF485F85A086E49D8F81400DEF396 ++:1040B00063F485F857086C49D8F81400DEF35CF413 ++:1040C00085F859086949D8F81400DEF355F485F8E5 ++:1040D0005B086749D8F81400DEF34EF485F85C08F5 ++:1040E0006449D8F81400DEF347F485F85E086249A5 ++:1040F000D8F81400DEF340F485F860085F49D8F87A ++:104100001400DEF339F485F85D085D49D8F8140031 ++:10411000DEF332F485F85F085A49D8F81400DEF36C ++:104120002BF485F861082846FFF7E0FDD5F86026F6 ++:104130002B6B85F8F04785F8F14718691178D2782C ++:10414000EEF77CFF2869EA6AD0F8A03005F5CB7459 ++:104150005360D0F8A43021469360D0F8A830D360E3 ++:10416000D0F8AC301361D0F8B0305361D0F8B4302F ++:10417000936118F0E7DC08F14E0021463246DDF38A ++:10418000FBF6B5F8822144F221339A4217D00E3B58 ++:104190009A4214D007339A4211D010339A420ED06B ++:1041A000143B9A420BD007339A4208D010339A42FC ++:1041B00005D025339A4214BF0024012400E00124D5 ++:1041C00005EB84039B6B28462B63FFF75BFD08B967 ++:1041D0001823B8E1296B4FF00F0340F2FF36A1F826 ++:1041E000063101F1FC0201F58073A1F8086128464F ++:1041F00000F0B4FE2A6BD2F8FC30C2F8F830C2F8F6 ++:10420000F030D2F80031C2F8F4301368022B07D135 ++:10421000013B53752B6B284603215A7D01F0A8DB27 ++:1042200019F0010F30D000222FE0C0465F7D5A0503 ++:1042300079DB810078D48500BB5C8600E94800000A ++:104240005CD8010029D70100D6688600E2688600A4 ++:10425000F5688600076986001C6986002B69860060 ++:104260003A698600496986005A6986006B6986004A ++:104270007C6986008A69860098698600A66986003E ++:10428000B6698600C6698600012288F846200A21A0 ++:10429000284601F06DDB296B28461C31F9F3C6F383 ++:1042A0007F23296B00932B68002293F8463001F19D ++:1042B0001C0003F003030193503113462CF01CDF64 ++:1042C000B4F1FF3F3FF45DAF2846F5F383F44FF4BC ++:1042D000D163C5F874382846FFF746FD04460B90B5 ++:1042E000002840F0A0812869214619F00FDB2869D9 ++:1042F00098F83A1018F052DF28465146FFF762FB53 ++:1043000008B920231FE1284601F0DAFBC5F85C015B ++:1043100008B9212317E12846FFF798FD2146AD4A49 ++:10432000AD4B28460094019506F008FDAB4B6E4658 ++:104330001A1D07CA1B6886E80700072128462A4677 ++:1043400006F094DC04212846A54AA64B009401956A ++:1043500006F0F4FC0028C5F88C0701DA2223F2E00D ++:104360002846179906F006DD08B96423EBE0C5F886 ++:1043700004084FF0FF3728469B499C4A9C4B009706 ++:10438000FEF342F6C5F82C08002800F04C812846C0 ++:1043900001F0A4FA044608B12323D4E02B684FF0BF ++:1043A000060293F8A130A8F86420012B04BF402333 ++:1043B000A8F86430D8F88C304FF006064FF4397204 ++:1043C0001E805A80D8F890304FF0C4024FF001069A ++:1043D00005F5007128461E805A80063107F09EDCE4 ++:1043E000D5F83C010CF028DD08B185F8CF61022337 ++:1043F00085F8C0341C3385F8CB3410222B6B85F83C ++:10440000CC245B89022B02D81C2385F8CB342846A8 ++:10441000214685F8CA7485F8C97485F8C874F6F31E ++:104420003BF12B68284683F8B4402146C5F8D47187 ++:10443000F1F34AF185F8DC412846FFF72BFA19F031 ++:10444000080F18BF85F8DC4119F0100F03D028467B ++:104450002146F1F339F119F0020F13D0AB6B83F859 ++:104460004D40EB6B83F84D4095F8CB3495F8CC2458 ++:1044700043EA022323F080039BB285F8CB341B0A66 ++:1044800085F8CC3419F0040F03D028462146F5F303 ++:104490007FF419F0800F0DD095F8CB3495F8CC242B ++:1044A00043EA022323F010039BB285F8CB341B0AA6 ++:1044B00085F8CC342B6893F842308BB119F0600F3B ++:1044C0000ED019F0200F0CBFFF21002119F0400F72 ++:1044D000284649B214BF00226FF0000200F068FBCA ++:1044E00006220DF122004349DDF346F5B5F882219D ++:1044F00044F221339A4217D00E3B9A4214D007332C ++:104500009A4211D010339A420ED0143B9A420BD0EB ++:1045100007339A4208D010339A4205D025339A4285 ++:1045200014BF0027012700E0012705EB8706B46BC5 ++:104530000DF122012846224630F06ADBB16BA06102 ++:10454000886910B937230B936DE04430503128222D ++:10455000DDF312F5B36BB7F1FF3F9B699F62BFD0EC ++:10456000D8F85C30179E43F00403C8F85C30224B47 ++:10457000F560B3602846ECF7C7FF1B9A0AB1002329 ++:1045800013602B681D495869DEF322F230B1002117 ++:104590000A46DEF3DDF01A4BC0B218602B681949E9 ++:1045A0005869DEF315F230B100210A46DEF3D0F08F ++:1045B000154BC0B218602B6814495869DEF308F235 ++:1045C00030B100210A46DEF3C3F0114BC0B21860CF ++:1045D00028462CE039AE820001AE820034D90100B9 ++:1045E000D5A18100ADA181002D57810041578100E7 ++:1045F0001957810056D80100B542820035D7010015 ++:10460000EC27020041D70100102C020055D7010011 ++:10461000142C02001B9B0BB9184608E00B9B1B9E39 ++:104620000020336003E02846FFF78AFAF2E70DB076 ++:10463000BDE8F08F20230360436040F23C73836049 ++:10464000092330B50361836107330362303383622A ++:104650000F230822036340F29E3304240125002126 ++:1046600042618263C3640322A3F56773C460C561BA ++:104670004462C46244630164456402654166436503 ++:104680008465C265036630BD70B505460C4631B31E ++:10469000496D11B1C022E2F32BF3D4F88C1039B17B ++:1046A00028464FF43972E2F323F30023C4F88C3028 ++:1046B000D4F8901031B12846C422E2F319F3002354 ++:1046C000C4F89030E16929B128466822E2F310F37A ++:1046D0000023E36128462146B822E2F309F370BDC6 ++:1046E00070B50D460446002800F0E580D0F8181596 ++:1046F00039B128464FF48472E2F3FAF20023C4F889 ++:104700001835D4F8201539B128464FF48472E2F3F5 ++:10471000EFF20023C4F82035D4F8B41439B1284698 ++:1047200040F2AC42E2F3E4F20023C4F8B434D4F82B ++:10473000401531B12846AC22E2F3DAF20023C4F886 ++:104740004035D4F86C1229B1284607F019DE002351 ++:10475000C4F86C32D4F8FC1431B128464022E2F39C ++:10476000C7F20023C4F8FC34D4F8841671B123686E ++:1047700063B1DB6953B19B690C22013303FB02F285 ++:104780002846E2F3B5F20023C4F88436D4F8BC140A ++:1047900019B12846B422E2F3ABF2D4F8901421B157 ++:1047A00028464FF4AE62E2F3A3F2D4F8581631B1C2 ++:1047B00028463822E2F39CF20023C4F85836D4F895 ++:1047C000601639B128464FF49072E2F391F200235B ++:1047D000C4F86036D4F8F81731B128460622E2F35F ++:1047E00087F20023C4F8F837D4F8D81639B1284630 ++:1047F0004FF48472E2F37CF20023C4F8D836D4F884 ++:10480000E01631B128462422E2F372F20023C4F804 ++:10481000E036D4F8EC1631B128466822E2F368F2AB ++:104820000023C4F8EC36D4F8441731B12846EC2202 ++:10483000E2F35EF20023C4F84437A16B21B12846AD ++:104840004FF40672E2F354F2616B79B1896A31B1C7 ++:1048500080222846E2F34CF2626B002393622846E2 ++:10486000616B2C22E2F344F200236363216821B1DF ++:104870002846FFF709FF002323602369ABB1D3F873 ++:10488000F81028461822E2F333F223690026D96F84 ++:10489000C3F8F86019B128465822E2F329F22846F5 ++:1048A0002169FC22E2F324F226612846214640F6E3 ++:1048B000D402E2F31DF270BD2DE9F0411646B82294 ++:1048C00007460D4607F0FADD044610B940F2E93319 ++:1048D0002BE038462946682207F0F0DDE06110B988 ++:1048E00040F2044321E0FFF7A5FE38462946C022E6 ++:1048F00007F0E4DD606510B940F2EB3315E03846AF ++:1049000029464FF4397207F0D9DDC4F88C0010B98C ++:104910004FF47B7309E038462946C42207F0CEDD08 ++:10492000C4F8900038B940F2ED3321463360384680 ++:10493000FFF7AAFE00242046BDE8F0812DE9F041F2 ++:10494000174640F6D40280460E4607F0B7DD05460E ++:1049500000283BD02623C0F82838314640463A4646 ++:10496000FFF7AAFF2860002800F018818F4B056030 ++:104970001B683146C0F89C30FC22404607F09EDDA3 ++:104980000446286110B940F2ED3306E185603146F6 ++:104990004046182207F092DDC4F8F800B0B1404656 ++:1049A000314658222C6907F089DDE06770B12B6928 ++:1049B0004046DA6F31462C32C3F880204FF48472BF ++:1049C00007F07CDDC5F8180518B105E040F2EE33BC ++:1049D000E3E040F2EF33E0E0404631464FF48472CA ++:1049E00007F06CDDC5F8200510B94FF47C73D4E0F6 ++:1049F0004046314640F2AC4207F060DDC5F8B404F1 ++:104A000010B940F2F133C8E040463146AC2207F01D ++:104A100055DDC5F8400510B940F2F233BDE031462E ++:104A20004046ECF709FF0146C5F86C0210B940F2A8 ++:104A3000F333B2E028461AF091D84046314640227E ++:104A400007F03CDDC5F8FC0410B94FF47D73A4E019 ++:104A50002B680C22DB6940469B693146013303FB1E ++:104A600002F207F02BDDC5F8840610B940F2F533E9 ++:104A700093E040463146B42207F020DDC5F8BC047F ++:104A800010B940F2F63388E0404631464FF4AE624A ++:104A900007F014DDC5F8900410B940F2F7337CE05C ++:104AA0002A464FF4AE71D5F89034CB1801F5AE71AB ++:104AB000C2F894340432B1F5AE6FF4D140463146B9 ++:104AC000382207F0FBDCC5F8580610B94FF47E73A6 ++:104AD00063E0404631464FF4907207F0EFDCC5F8D2 ++:104AE000600638B140463146062207F0E7DCC5F8DB ++:104AF000F80710B940F2F9334FE0404631464FF421 ++:104B0000847207F0DBDCC5F8D80610B940F2FA333E ++:104B100043E040463146242207F0D0DCC5F8E006E9 ++:104B200010B940F2FD3338E040463146682207F0C4 ++:104B3000C5DCC5F8EC0610B940F2FE332DE0404666 ++:104B40003146EC2207F0BADCC5F8440710B940F250 ++:104B5000FF3322E0404631464FF4067207F0AEDCE8 ++:104B6000A86358B100F58673EB63404631462C22AA ++:104B700007F0A4DC0446686318B105E040F2014385 ++:104B80000BE040F2024308E040463146802207F045 ++:104B900095DCA06238B940F203433B6028464146A9 ++:104BA000FFF79EFD00252846BDE8F081BC260000E9 ++:104BB000D0F84031B1F1FF3F18BF83F89C13B2F138 ++:104BC000FF3F83F89E1383F89F2318BF83F89D232C ++:104BD0007047C04670B50446002831D000256319DF ++:104BE000D3F8501221B12368F4225868E2F380F020 ++:104BF0000435282DF3D1A16B69B194F8A3331BB10F ++:104C000023689868EAF32AF52368A16B9868EAF3A9 ++:104C100037F50023A363D4F8781221B12368E82282 ++:104C20005868E2F365F02368064918682246FFF3E6 ++:104C30008BF12368214658684FF46A72E2F358F00A ++:104C400070BDC046678986002DE9F0434FF46A7154 ++:104C500085B006464068E2F33BF0054608B9814658 ++:104C6000CFE000214FF46A728146DDF3E9F12E6056 ++:104C70007068E821E2F32CF0C9F87802002800F00F ++:104C8000B1800021E822DDF3DBF1002101236A1865 ++:104C9000C91808299372F9D1013B2B746B742B73DB ++:104CA000EB721A460121AB185218082A83F89413A4 ++:104CB000F8D11023EB74062385F827304FF0FF332B ++:104CC00085F82830213385F8A233052385F829306B ++:104CD0004FF47A736B864FF0C803AB86002385F8D8 ++:104CE0002A30023385F82B302B682A75A9741B688B ++:104CF0002A4693F8A1308B4218BF032385F82C3045 ++:104D00004FF0FF3385F89E3385F89F334FF40063EF ++:104D1000EB63012385F82D3004336B750223AB75EB ++:104D20006B7DD375AB7DD377013205F108039A42D1 ++:104D3000F6D100244FF0010895F82910284685F88F ++:104D40002E4085F82F8007F09DDE284686F8C38424 ++:104D500009F0B8DC042130462C4A2D4B0094019513 ++:104D600005F0ECFFA04268603CDB2A4B3068009302 ++:104D7000294B2A4901932A4B2A4A03932B46029432 ++:104D8000FFF3AAF0074668BBB06827492A463B46AE ++:104D9000EAF392F4A86328B3244C85F87C82231D9F ++:104DA00093E807006B4683E807002A4623683046ED ++:104DB000062105F05BDF4FF0FF3385F8A133336840 ++:104DC000284693F842100AF0DDDCC823C5F8E0322B ++:104DD000284609F0BDDE28464146ECF7CBFB85F8B6 ++:104DE000A3730EE0D5F8781219B17068E822E1F3E8 ++:104DF0007FF7706829464FF46A72E1F379F74FF054 ++:104E00000009484605B0BDE8F083C04695CB820056 ++:104E10001DCB820045CF820011E7820054D90100EA ++:104E200079D982006789860085A2000044D90100F3 ++:104E300070B5182686B00C46324668460549DDF343 ++:104E40009BF02046694632466D46DDF395F006B08C ++:104E500070BDC04634DB010070B5D0F8AC530446D9 ++:104E6000D0F8B063284603F09DFFD4F8D013A868AB ++:104E7000EAF3F4F3A868D4F8D013EAF301F40023BA ++:104E80002246C4F8D03330460449FFF35DF0F068A1 ++:104E900021464FF47E72E1F32BF770BDAB9986008B ++:104EA0002DE9FF413C23C1F824370523C1F82837F9 ++:104EB00007460D46C0684FF47E71E1F309F70446DA ++:104EC00000283DD000214FF47E724FF00008DDF342 ++:104ED000B7F0C4F8AC53C4F8B07384F8018020462E ++:104EE000E5F752FAC4F8C003284603F071FF0646FE ++:104EF00038B1F86821464FF47E72E1F3F9F6404686 ++:104F00001FE0204604F56371FFF792FFA8680E4981 ++:104F100022463346EAF3D0F3C4F8D00380B12046EA ++:104F20000DF054DC094B38460093094B09490193B5 ++:104F3000094A234602960396FEF3CEF7204600E088 ++:104F4000002004B0BDE8F0818D25830011B400007D ++:104F5000190F0100E4D90100AB99860010B5044691 ++:104F60000846B0F80CE0194642F256039E4506D8B2 ++:104F7000013B9E452ED2053B9E4509D02AE042F2D8 ++:104F800060039E451BD04EF2F5439E451CD021E0A8 ++:104F9000C389012B04D16FF03B0313604B3303E053 ++:104FA0006FF0450313605A330B602368D3F88030E9 ++:104FB00013F4805F13D01368023B13600FE06FF0AF ++:104FC0004A0313605A3309E06FF09503136003F549 ++:104FD000967303E06FF04A0313605F330B6010BDFC ++:104FE00070B504460025E06820B1054B1B68984762 ++:104FF0000023E36001350434062DF4D170BDC046B2 ++:10500000E0A685000D4B82685362002380F886304D ++:105010004FF00303A0F88C304FF00203A0F88E305D ++:105020004FF00703A0F888304FF00403A0F88A304F ++:1050300042F60133A0F89C307047C04664A8E7BE32 ++:10504000426C1F2A01D9002004E04FF00073134185 ++:1050500003F001007047C046026EB0F84A1010B568 ++:10506000946AB9B1FF2901D8012014E00B0B013B70 ++:10507000012B0FD8C1F30323092B0BD853B1C1F374 ++:105080000313092B06D801F00F03092B8CBF002056 ++:10509000012000E00020D26A41F2E4439A4210D19C ++:1050A000A4F58263073B012B01D83F2907E040F2BA ++:1050B0000C439C4204D015339C4202D1502900D8A5 ++:1050C000002010BD00B58E46C16E4FF0407394466F ++:1050D0007046C1F8603115E00379C2781B0443EAD9 ++:1050E000026382791343427943EA0223C1F86431AF ++:1050F000437802781B0243EA024382780730134365 ++:10510000C1F86431CEEB00036345E5D300BDC04672 ++:10511000C16E4FF48030C1F860011D4AD1F8603192 ++:1051200010B5D1F86441C1F86001D1F86031C1F81F ++:105130006421C1F86001D1F86031D1F86431934243 ++:1051400024D1144AC1F86001D1F86031C1F864215A ++:10515000C1F86001D1F86031D1F86431934215D1C2 ++:10516000C1F86001D1F860310023C1F86441C1F891 ++:105170008C31D1F82001084B984201D1012006E082 ++:10518000064B984214BF0020012000E0002010BD13 ++:10519000AA5555AA55AAAA55000400040004008483 ++:1051A000D0F8501810B5044641B1D0F84C284068EA ++:1051B0009200E1F39DF50023C4F85038D4F8481864 ++:1051C00059B16068DDF3F0F46068D4F84818E8225B ++:1051D000E1F38EF50023C4F8483810BD70B50469BA ++:1051E0000646206E08B1EAF729FB2046FFF7F8FED5 ++:1051F000A56F686A18B104F035F800236B62606F20 ++:1052000003F0C2FF206F05F05BFC616E29B12068DE ++:10521000A26EE1F36DF500236366206E18B103F012 ++:1052200021FB002323662046E7F7C4FF3046FFF743 ++:10523000B7FF002070BDC0462DE9F04F0368076935 ++:105240008FB00890DE691446FB6B0CA80821704AE9 ++:10525000DCF33AF7FB68002B40F0CE80F96E386E35 ++:1052600001F50071D7F800B0DFF31EF3BB6801460B ++:105270009868EAF3B7F1002800F0C680D7F860E03C ++:105280000CB9A44602E0FB6E03F5007CFB6E03F54F ++:10529000087504B13468B168BB687268F068D3F807 ++:1052A000283803915B490DF130094FF0FF38029225 ++:1052B0000590724606930791634649465846009505 ++:1052C0000194CDF81080ECF735F93168F8603A6E4A ++:1052D000FB6E01914F4900240546079103F51073B9 ++:1052E00049465846009402940394CDF810800594E2 ++:1052F0000694ECF71FF9316838613A6EFB6E019144 ++:1053000044490990079103F5207349465846009493 ++:1053100002940394CDF8108005940694ECF70AF9F2 ++:10532000316878613A6EFB6E01913A490A900791B3 ++:1053300003F5307349465846009402940394CDF81F ++:10534000108005940694ECF7F5F83168B8613A6E70 ++:10535000FB6E01912F490B90079103F5407349466D ++:105360005846009402940394CDF810800594069456 ++:10537000ECF7E0F83168F8613A6EFB6E019125496F ++:105380008246079103F550734946584600940294AB ++:105390000394CDF8108005940694ECF7CBF8099AA5 ++:1053A000A54214BF002501250A9BA24208BF45F073 ++:1053B00001050B99A34208BF45F00105A14208BFB2 ++:1053C00045F00105A24508BF45F001053862A0423D ++:1053D00014BF284645F00100B0B90F4B3C46D3F846 ++:1053E00084600546E06818B10C49B047C4F8A000D5 ++:1053F00001350434062DF5D1B96F08980831002223 ++:10540000E7F714F9012000E000200FB0BDE8F08FAD ++:10541000FB41860014260000E0A68500C326860016 ++:105420001FB5022303930C330446C0F84C383821CF ++:105430004068E1F34DF4C4F85008D0B1D4F84C28DA ++:1054400000219200DCF3FCF56068E821E1F340F410 ++:10545000C4F8480868B10021E822DCF3F1F5012323 ++:1054600000936068D4F8481803AAB333DDF334F42A ++:1054700001E04FF0FF3004B010BDC0462DE9F04F01 ++:10548000056997B0DDF884A014469B469DF88020FE ++:10549000EB63EB6FA860AB672A710746C5F800A005 ++:1054A00028460E46FFF7AEFD249B05F1640205F188 ++:1054B000680100930192029120465146229A239B53 ++:1054C00003F00EFB2866002800F0D581D5F8648033 ++:1054D00095494046DDF37CF220B100210A46DDF318 ++:1054E00037F186B240469149DDF372F248B10021AE ++:1054F0000A46DDF32DF14FF6FF7380B2984218BFD4 ++:10550000044630462146FDF7F9FF08B90C30B7E1F3 ++:1055100040F612010022A5F84060A5F84240286E2E ++:10552000E5F36CF6E866286EE5F3BAF4D5F86C900E ++:105530006864C7F80C902846FFF782FD08B90D3063 ++:105540009EE1286EEAF77EF92846002116F0C4DBBA ++:1055500028464FF0FF31E7F7A7F82846FFF7D8FDB8 ++:1055600008B90E308CE140467149DDF305F2FF28A1 ++:1055700008BF0120A5F84A002846FFF76DFD08B9CD ++:105580000F307DE16B494046DDF3F6F16A4985F85D ++:1055900048004046DDF3F0F16849E8644046DDF339 ++:1055A000EBF1296E2865CA6A41F26B039A420AD16F ++:1055B0008B6A4E2B07D1B5F84A30402B03D9EB6CE0 ++:1055C00043F00203EB64EB6C13F0200F04D00121D5 ++:1055D00028460A4617F036DFB5F840200123A7F821 ++:1055E0008021C5F89830B5F842303A68A7F8823182 ++:1055F0002B6E284613616B6C936095F8483082F8E7 ++:105600007C303A68B5F84A30B968A2F87A30EB6C69 ++:10561000C2F880302B6DC2F88430D5F898305362D0 ++:105620003A4605F057FA286708B9193028E12B6E79 ++:10563000CDF810A005932B6FCDF81CB0B5F8402025 ++:1056400006936B6CADF8302008932A6EB5F84230A3 ++:10565000CDF82C80ADF83230936B04A80D93D36B4A ++:105660000E93136C0F9395F848301093936A11932F ++:10567000B5F84A301293D36A1393EB6C14932B6DE5 ++:10568000159353680993D3680A9303F085FD6867FF ++:1056900008B91030F4E0B5F8421044F221339942D1 ++:1056A00017D00E3B994214D00733994211D01033D2 ++:1056B00099420ED0143B99420BD00733994208D03F ++:1056C0001033994205D02533994214BF0026012694 ++:1056D00000E0012631462846E6F7CAFFAA6F002EF1 ++:1056E0000CBF02230123136056603A6B286E1360CF ++:1056F0005660FC6AE5F3C2F32060D9F85C31696C4E ++:105700000F4A6B65AB65062301FB0323AC6FC5F83D ++:10571000B830686F49462268434603F0D5FE6062A0 ++:1057200080B91130ACE0C046D1AD86004837860064 ++:1057300084AE8600E5AE8600863786009E798600B8 ++:10574000301E0200AB6F696D586AEDF747FBAB6F17 ++:1057500003F1220203F11C01586A009203F11E02B8 ++:10576000203303F0F9FCAC6F606A03F005FD84F8A8 ++:105770002800AB6F3C6B586A03F0FEFC2075AC6FE1 ++:10578000606A03F0FDFCA96FA061CB8B032B01D0F5 ++:10579000122075E03B6B4A6A38461A618A8B1A817F ++:1057A000CA8B5A810A8C9A814A8CDA8140F2FF3284 ++:1057B0004FF00F03CA828B8201223146FFF73CFD76 ++:1057C00008B913305CE0B6F1FF3F3FF464AFAB6F54 ++:1057D0003A68586A92F89910EDF704FB00212846C0 ++:1057E00016F062DF08212846E7F772F8284618F01D ++:1057F00093DA286E2449254A00230097E5F3BAF48A ++:105800002846002118F06ADA2846E6F7FBFE08B9B8 ++:10581000153035E005F1DC042146DCF3CDF62046F9 ++:10582000DDF38AF048BB2046DDF396F0044620BB4A ++:10583000284616F099D8AB681B68D3F89C00F0B1E5 ++:105840000378E3B112492A46DDF39AF1AB681149B6 ++:105850001B682A46D3F89C00DDF3CCF1A868FFF75B ++:10586000DFFDE86858B1AB681B68D3F89C10DFF324 ++:10587000BFF1204604E00B2002E0162000E00020EB ++:1058800017B0BDE8F08FC04669C1830085C18300B1 ++:1058900025C0830049C0830010B590F85E300446EF ++:1058A0005BB90648EBF700FF054B20461A6805492F ++:1058B000FFF708FC012384F85E3010BD67DB0100B0 ++:1058C000FC580300A4D2020010B5044619F058DFBA ++:1058D00001220146204619F0CBDF10BD37B5054641 ++:1058E00019F04EDF0023C5F84C0280F848302A68D2 ++:1058F000044692F82F10284600914E32214618F0A7 ++:10590000EDDC30B12846214619F096DD4FF0FF302E ++:1059100003E02846214619F035DE3EBD37B5044682 ++:10592000002847D0D0F8201131B103689868E9F316 ++:10593000A7F60023C4F820312268136893F82F30AB ++:105940003BB3D2F8000501A92FF0C4DB13E0536884 ++:1059500013F0400F0FD0D4F82C31D51807E00B68A6 ++:105960004822C5F8103123685868E1F3C1F1D5F831 ++:1059700010110029F3D101A82FF0B4DB0246002852 ++:10598000E5D106E00B684068C4F840314822E1F3F5 ++:10599000AFF1D4F8401120680029F3D1064922461E ++:1059A0000068FEF3D1F22368214658684FF4A472D0 ++:1059B000E1F39EF13EBDC04691BA8600F0B54FF4CA ++:1059C000A47185B005464068E1F382F1064608B946 ++:1059D000074655E000214FF4A4720746DCF330F38C ++:1059E000294B35600093294B29490193294B002409 ++:1059F00003932868284A33460294FEF36DF2314639 ++:105A00002A6B1368022B03D1537D0BB9163300E0C8 ++:105A1000302301340B744431042CF1D1A8681F49A0 ++:105A20002A460023E9F348F60446C6F8200130B9B7 ++:105A3000686831464FF4A472E1F35AF11FE04FF465 ++:105A40009673C6F81C3145F27353A6F838314FF0FF ++:105A50004603A6F83A31124B0024C6F840412846C6 ++:105A600000934FF48A710F4A0F4B019505F066F9C8 ++:105A7000A042C6F82C0103DA3046FFF74FFF274655 ++:105A8000384605B0F0BDC046F90C8400DD120100B7 ++:105A900094DB01007D0A840091BA86003D068400F3 ++:105AA000D9128400E5128400A512840010B50146C5 ++:105AB00020B10368B022D868E1F31AF110BDC046E6 ++:105AC0002DE9F34107680546B021F868E1F300F1DC ++:105AD000064608B980468BE00021B02201AC804622 ++:105AE000DCF3AEF20422002137607560C5F85C611A ++:105AF0002046DCF3A5F22A6892F87C30012B07D906 ++:105B00003D495069DCF364F7014690B120460AE054 ++:105B100050693A49DCF330F70928034609D8384977 ++:105B2000204601EB83010322DCF342F300238DF8CE ++:105B3000073001AC0322214606F10800DCF338F3FC ++:105B40000023F3722B682F495869DCF315F7396984 ++:105B5000F060CA6A41F26B039A420CD18B6A8B2BBC ++:105B600009D1022807D1204627490422DCF300F39B ++:105B700008B90323F360396941F26B03CA6A9A4298 ++:105B80000DD18B6A932B0AD101A820490422DCF3A2 ++:105B9000EFF220B9F368042B01D10233F36001AFB7 ++:105BA000284639461FF054DE044650B91849384695 ++:105BB0000322DCF3FDF2284639468DF807401FF03A ++:105BC00047DE05F5AA60394603220A30DCF3F0F21D ++:105BD000002405F5AA600F4985F85D450E300322C3 ++:105BE000DCF3E6F285F861453046394620F0BADA52 ++:105BF0004046BDE8FC81C046B3C48600B9C48600F7 ++:105C0000CE028600BCC48600C3C4860071C2860072 ++:105C1000C6C48600CAC4860070B50568044622461C ++:105C200028680449FEF390F1686821465022E1F3A8 ++:105C30005FF070BD3CE486002DE9FF410546502130 ++:105C40004068E1F345F0064608B904465AE00021F1 ++:105C500050220446DCF3F4F1FF210422356006F102 ++:105C60003B00DCF3EDF1284619F08ADD002790F8BF ++:105C7000483080F8387586F83B3096F840304FF061 ++:105C8000FF3843F00803202186F840301F4AC6F849 ++:105C9000488006F11800DCF317F27061304626F0F8 ++:105CA000B5DF042128461A4A1A4B0097019605F0E1 ++:105CB00045F8B84230611FDB174B02970093174B32 ++:105CC00017490193174B184A039328683346FEF38C ++:105CD00003F188B9012586F83A50304629F00ADAEE ++:105CE00018B13046294627F0FFD9A37BA4F84C8091 ++:105CF00043F00203A37305E0686831465022E0F3E5 ++:105D0000F7F70024204604B0BDE8F08140E48600A7 ++:105D10001DDF8400F9DE8400F51D01001DED840007 ++:105D200024E40100DDD084003CE4860070B5054623 ++:105D3000002826D00368134918682A46FEF304F1A8 ++:105D40006B6905E01C68596828462AF0E7DD2346A0 ++:105D5000002BF7D12B6905E01C68596828462AF00A ++:105D6000DDDD2346002BF7D1A96A21B12B689022F3 ++:105D70005868E0F3BDF72B68294658682C22E0F3F9 ++:105D8000B7F770BD91E6860030B52C21044685B08A ++:105D90004068E0F39DF708B9054618E000212C2281 ++:105DA0000546DCF34DF10823AB610A4B2C600093F0 ++:105DB0000023019302930393074A2B462068074967 ++:105DC000FEF38AF02268012382F896302B71284670 ++:105DD00005B030BD050B850091E6860004E50100A5 ++:105DE0002DE9F047154680460F461E46E5F346F07E ++:105DF000002181464046E5F313F200220446114695 ++:105E00000F480B185B6873B90C3302FB03F31D508A ++:105E10001A18636A576096600A4A45EA03031360DA ++:105E20006362012404E001320C31052AE8D1002428 ++:105E300040464946E5F3F4F12046BDE8F087C04608 ++:105E40003C260000782600002DE9F04705468846EC ++:105E5000E5F350F100212846E5F3E2F10646284635 ++:105E60006C69AF69E9F7E8FA0A2C814616D90F2C5C ++:105E700019D02846E9F768FD142C054603D9B36804 ++:105E800023F00803B360B36843F00103B36003D9A0 ++:105E9000B36843F00803B360012211E0022C02D87A ++:105EA000174D30220CE02846E9F758FDD6F8A4300B ++:105EB000054623F0FF0343F00203C6F8A430022294 ++:105EC000B36813F0010F07D107F01803082B14BFB4 ++:105ED0004FF4E115B5FBF2F507F0030700240BE0E2 ++:105EE00006F54073B8F1000F05D003EB04204946D6 ++:105EF0002A460023C0470134BC42F1DBBDE8F087ED ++:105F000000C63E0537B5134B1546136001E0114B33 ++:105F100013600432ADF17C039A42F8D3033020F0D1 ++:105F200003000D4BC0EB01041C600C4B00211960F9 ++:105F30000B4B05F5A05219600A4B083C19600A4B3F ++:105F400041601D60094B1A60094B1960094B0460E0 ++:105F500058603EBD4B415453C826000088260000BF ++:105F6000A4260000CC260000F8270200FC2702002F ++:105F700090260000C0260000436910B5142B01DDF7 ++:105F800002F09CFB10BDC0461FB5E8200021E0F3E5 ++:105F90003DF20C4C2060A0B10021E822DCF350F06F ++:105FA00004AA012342F8043D013B0093064B2168FB ++:105FB000186840F23C73DCF38FF620680E21DCF3A6 ++:105FC000D5F61FBDBC26000024280200B1F5E06F05 ++:105FD00073B505460C46164606D1036900910021AB ++:105FE00001911C680A460CE00D4B00221868E5F38D ++:105FF00005F1014680B12B690022009401921C68D2 ++:1060000028463346A04738B1064AA86113680020E5 ++:106010002B626E61156001E04FF0FF307CBDC04621 ++:106020008C260000202802002DE9F04710200E46A3 ++:10603000002117469946E0F3E9F1044610B96FF0E4 ++:106040001A001EE0104D2868E4F318F7099B8046FB ++:1060500023B9286831463A46E5F3D0F02868E4F3DE ++:1060600089F701238340094AE360089BC4F8049040 ++:10607000A36013682868236041461460E5F3D0F0FC ++:106080000020BDE8F087C0468C260000982600005E ++:1060900007B50021E5F3C4F0074B4FF40061186029 ++:1060A000064B00F57060186000200246044B00901B ++:1060B0000190FFF7B9FF0EBD9C260000F4270200F7 ++:1060C0006D60800037B5234B234C02AD00211C22AC ++:1060D00045F8043D2046DBF3B3F7012323601F4B53 ++:1060E000A5F5A0551B6843F8044C00F00DF92946AE ++:1060F0002A461B48FFF706FFE0F344F300F042F89E ++:10610000002002F01FFA174B174C186002F0BCFC7D ++:106110002060FFF7BDFF206800F01EF9E9F716F8D0 ++:10612000206800F0A5F8002210481149E0F3E2F4DD ++:10613000002210481049E0F3DDF410490022104815 ++:10614000E0F3D8F42068FFF717FFFFF71DFF206882 ++:106150003EBDC046ADDEADDE00280200F81E0200E6 ++:1061600000590300242802008C260000D81F860056 ++:1061700059EF0000DB1F8600656580008D608000A0 ++:10618000DE1F860070B5A4200021E0F33FF1124D20 ++:10619000286080B10021A422DBF352F74FF4806025 ++:1061A00000212C68E0F332F1A060286884682CB9E3 ++:1061B000E0F392F02C604FF0FF300CE04FF480627F ++:1061C000C2608460446100212046DBF339F72A680D ++:1061D000024B00201A6070BD38280200D42600004F ++:1061E00070B51C4D06462B6833B91B4C23680BB9A0 ++:1061F000FFF7C8FF23682B60164C184B20685861C6 ++:1062000030B3002505604560336CC0F89C500E3BF0 ++:10621000012B03D930461249FFF716FE114A936845 ++:1062200013B12368C3F89C20246807E0D4F89C00CD ++:1062300018B1A368595DE0F349F4013523699D4223 ++:10624000F4D3094809492246E0F354F4014B186895 ++:1062500070BDC046D4260000382802000028020085 ++:106260009562020028280200BD218600A5688000F2 ++:1062700010B54022002305490446FFF7B1FD044B49 ++:1062800000229A602046FFF7ABFF10BDA96980008D ++:106290002828020070B51B4DAE68002E31D11409BC ++:1062A0002C60AB8104F561444FF4E13394FBF3F4CB ++:1062B000A8606960284603218022E0F3FDF32846A8 ++:1062C0003146E2B2E0F3F8F3284601212212E0F36E ++:1062D000F3F303210A462846E0F3EEF301210A46D0 ++:1062E0002846E0F3E9F3284604210822E0F3E4F32A ++:1062F000284602210122E0F3DFF34FF47A70E0F345 ++:106300002BF270BD28280200104A0721136843F0C1 ++:1063100010031360136843F008031360136823F439 ++:1063200000731360E832136843F0807343F48033E2 ++:106330001360074B00221960043B1A6008331A6887 ++:106340001960044B20221A607047C04614ED00E02B ++:10635000241000E000E400E02DE9F041054600F0E3 ++:10636000ADF82A48E8F778FC2846E9F73BF8284BCF ++:10637000284AC318B3FBF2F3274A28461360E9F70B ++:10638000D9FA00F5787007304FF47A73B0FBF3F068 ++:10639000224B234A18602B6A2249002BCCBF6FF096 ++:1063A0007F4340F2FF3313601D4A1F4F1368B3FB56 ++:1063B000F0F31360284620220023FFF711FD002090 ++:1063C0001A49DCF3D9F204463860E8B12846E9F707 ++:1063D00009F8B4FBF0F0861E002E15DD144C0021E8 ++:1063E00034222046DBF32CF6124B4FF47A71A36073 ++:1063F0006560204606FB01F10122DFF3FBF618B1D0 ++:1064000028463968DEF306F2BDE8F08191F100001C ++:106410003F420F0040420F00D0250000C825000079 ++:10642000CC25000001678000E8260000BEE60100E0 ++:1064300040280200E56680002DE9F04707461E4629 ++:1064400015460C46E4F356F63846E4F317F52946AC ++:10645000324681463846E4F3D1F63846E4F38AF50D ++:1064600040F62A01064600223846E4F3C7F6054600 ++:106470008CB1012414FA06F3826932EA030802D1CE ++:106480002046E8F7A9FB701C14FA00F0E8F786FB39 ++:10649000C5F818800CE00124701C14FA00F0E8F72D ++:1064A0009BFB2046B440E8F779FBAB691C43AC6129 ++:1064B00038464946E4F3B4F6BDE8F0872DE9F047E5 ++:1064C0000746E4F317F6384640F60E010022E4F3DF ++:1064D00095F60446002831D0D0F80080056838468B ++:1064E000E4F3DEF40428064604D827D1C5F30243BA ++:1064F000032B23D100204849DCF33EF2F0B9474991 ++:10650000C8F3031212E0013A072E22610AD90C2EB9 ++:1065100008D0236C13F4806F02D013F4006F01D104 ++:1065200008B903E0012041F004516161002AEAD179 ++:10653000D4F8E83123F01003C4F8E831002240F623 ++:106540002A013846E4F35AF6354C20603846E4F325 ++:10655000A7F4344B22681860136843F6A12443F073 ++:1065600080731360136843F0020313600023C2F8C2 ++:10657000E03103E00A20E0F3EFF00A3CDFF8A090FE ++:10658000D9F80030D3F8E03113F4003F01D1092CE1 ++:10659000F0D100210B4638464FF40062FFF74CFF64 ++:1065A00000210B46384640F61202FFF745FF002156 ++:1065B0000B46384640F62902FFF73EFF38460121D8 ++:1065C000E8F73EFF00201849DCF3D6F1E0B1384689 ++:1065D000E4F354F440F62A01804600223846E4F3FE ++:1065E0000DF646690446D0F898503846E4F346F470 ++:1065F0000123834045F00105334363613846C4F805 ++:1066000098504146E4F30CF6D9F80020136A43F0A1 ++:1066100003031362BDE8F0872DE70100FF7F01004F ++:106620007428020078280200BEE6010010B58469D3 ++:10663000A068FCF729FCE068E9F7E4F8002010BD49 ++:1066400010B584690021342204F11C00DBF3F8F456 ++:10665000034BA06863622462EBF794F8002010BD3E ++:1066600005AA80002DE9F347DFF8AC809946D8F8F9 ++:1066700000300546072B0F46924643DC01F062FFCF ++:1066800050210646E0F324F3044600283AD00021C6 ++:106690005022DBF3D5F4D8F8003065602360A4F80D ++:1066A00014902761E660204641F2E4414A463346B1 ++:1066B0000097CDF804A0FCF739FCA06010B30020CF ++:1066C0000A990B9A114B0095CDF804A0FFF7ACFC8A ++:1066D00018B1A068FCF7D8FB14E0A068E2F3B4F6A8 ++:1066E0000B49A061D8F800202846DBF3FDF40948E7 ++:1066F0002946EAF7D9FFD8F8003020460133C8F818 ++:10670000003000E00020BDE8FC87C04631AA8000D0 ++:106710005CB102003CB102007C280200014610B5C9 ++:1067200050228068E0F3E4F210BDC046C36B10B5A0 ++:106730001BB100225A62836B5A62C068FFF7EEFFFA ++:1067400010BDC0462DE9F041184E1C46337807466F ++:10675000072B904626D820464C21E0F3B9F2054697 ++:1067600000B300214C22DBF36BF46C602F60C5F8A2 ++:1067700008803378204685F8443001333370022393 ++:10678000AB640821E0F3A4F20446286420B10021A0 ++:106790000822DBF355F406E029464C22E0F3A8F288 ++:1067A000254600E000252846BDE8F081802802004B ++:1067B0002DE9F04FD1F8FC3091B00F93054603F569 ++:1067C0006063079335E10FAF0E2200232846394658 ++:1067D000D9F37AF60F28044600F0368100222846C5 ++:1067E00039461346D9F370F610F00E0640F02681B4 ++:1067F00040F23B43B3EB145FC4F30B21C0F3041826 ++:1068000004D140F6FF73994200F01381C0F3442293 ++:106810000992002A00F00D81C0F3C443C0F3843B09 ++:1068200013EB0B02089319D140F26733994240F001 ++:1068300000810EAB01930DAB02930CAB03930BAB3A ++:1068400004932846394613460092D9F3DBF5002815 ++:1068500000F0EF800E9BC5F85433EAE0D5F8CCA0E9 ++:1068600005EB8A03C3F8D4423446C3F81403C3F8D3 ++:10687000D0100BE00122284631461346D9F324F606 ++:1068800000F00E00022840F0D980013444450FAEDC ++:10689000F0D1002213460DF138090DF134080CAF88 ++:1068A0000BAC284631460092CDF80490CDF8088014 ++:1068B00003970494D9F3A6F50246E8B94023009360 ++:1068C000284631461346CDF80490CDF8088003974A ++:1068D0000494D9F397F510B14FF001080EE00D9B29 ++:1068E000002B40F0AB800B9B002B40F0A7800C9B53 ++:1068F000B3F5805F40F0A2804FF000080E9A05EBE0 ++:106900008A03C3F810210C9A0124C3F8D0210EABDE ++:1069100001930DAB02930CAB03930BAB00220493DA ++:1069200028460FA923460092D9F36CF508B9012730 ++:1069300027E0012C40F086800C99B1F5805F40F093 ++:1069400081800E9B05EB8A02C2F89031C2F81012CA ++:1069500078E00024002300930EAB01930DAB02936B ++:106960000CAB03930BAB049328460FA93A4623467E ++:10697000661CD9F347F508B13446EBE7002E5DD02D ++:106980000137099A9742E4D100241FE0C023009305 ++:106990000EAB01930DAB02930CAB03930BAB0493C3 ++:1069A00028460FA922460023D9F32CF5002845D00C ++:1069B0000B9B002B42D10C9BB3F5805F3ED124B9D9 ++:1069C0000E9B05EB8A02C2F8943201345C45DDD19E ++:1069D000002423E0802300930EAB01930DAB0293C0 ++:1069E0000CAB03930BAB049328460FA9012F0CBFEC ++:1069F0002246621C0023D9F305F5F8B10B9BEBB9D5 ++:106A00000C9BB3F5805F19D1BBF1000F05D124B900 ++:106A10000E9B05EB8A02C2F894320134089B9C421B ++:106A2000D8D1B8F1000F04D1D5F8CC300133C5F876 ++:106A3000CC300F9B079A9342FFF4C5AE0023C5F8F4 ++:106A4000CC3001E0013462E711B0BDE8F08FC04600 ++:106A500082604160016070470EB4F3B581680646FC ++:106A6000012901D8002044E008AB4068079A01934F ++:106A7000DBF31CF4B0F1FF3F074603D0B368023BE1 ++:106A8000984203DD00231846B36032E070683D2170 ++:106A9000DBF33AF330B373683568C3EB00041EE0F0 ++:106AA00028462246DBF34CF2A8B92B5D3D2B12D1D0 ++:106AB0002846DBF355F37268441CBA1829190132D1 ++:106AC0002846521ADBF38EF273681B1B7360B3689F ++:106AD0001B19B36006E015F8013B002BFBD1716870 ++:106AE0008D42DDD3B368781C1B1AB36073681B1822 ++:106AF0007360BDE8FC4003B07047C0462DE9F0412B ++:106B0000C1EB0204012C0E461F46DDF8188010DD93 ++:106B10002146E0F3DDF0054610B96FF01A000DE0F4 ++:106B200031462246DBF328F200203D60C8F80040E1 ++:106B300004E000233B60C8F800301846BDE8F0814F ++:106B40002DE9F04FA5B008914FF4805109900792BC ++:106B50000693E0F3BDF00A9018B96FF0010401F05C ++:106B600029B921A80A994FF48052FFF771FF4FF419 ++:106B700080520A980021DBF363F200234FF0FF32CA ++:106B80008DF844300B930D930E9201F0DEB80D9BFF ++:106B9000089A002152F8239001230C910F930F9B28 ++:106BA00019F8012073B1531EDBB2FD2B01F101086E ++:106BB00098BF19F808B016468CBF4FF0000B08F1CB ++:106BC00001080CE002F1FF33DBB2FE2B93462CBF31 ++:106BD0001646802628BF4FF0000B01F101080BEB91 ++:106BE0000803B3F5607F81F2AD80202E2AD005D84E ++:106BF000152E0AD01B2E6DD001F078B8222E3AD077 ++:106C000036D3802E72D001F071B808EB09035A78A0 ++:106C100019F8083003EB0223072B13DD09F10204F6 ++:106C2000444421AD874922462846FFF715FF2046F8 ++:106C3000DBF396F209F1030200EB080382492846D0 ++:106C4000D2184FE008EB0904637819F8082021AD49 ++:106C500002EB032228467D49FFF7FEFEE378A27887 ++:106C600028467B4902EB0322FFF7F6FE01F03EB80F ++:106C700019F8082003E00C9B0C2B03D100220C9286 ++:106C800001F036B89DF84430002B41F0318019F8FE ++:106C90000830042B41F02C8009F1020404EB0805B4 ++:106CA0002846DBF359F6002841F0228014F808301A ++:106CB00013F0010F41F01C80284611A9DBF394F476 ++:106CC0000E9BB3F1FF3F41F0138008EB09039A7963 ++:106CD000DB790DE108EB0903DC799A795D4921A89C ++:106CE00042EA0422FFF7B8FE01F002B819F80830B2 ++:106CF000822B00F2FD87DFE813F09200B300380129 ++:106D00003B02D4021102CB01DA014701EA02FB0285 ++:106D100010031703FB077F020302FB073603570329 ++:106D200097007A037F0390039503F700E903FB07BD ++:106D3000770107047F01FB07FB07FB071004220410 ++:106D4000270472045305FB07FB0721068D0088000A ++:106D50008300AE06D306DA06E106FB0726037101BF ++:106D6000FB07FB070001F007E806FB07FB07FB0733 ++:106D7000FB07FB07FB07FB07FB0787011307280738 ++:106D8000490764077F079907B307CD07D407FB07B7 ++:106D90008E01FB07FB07FB07FB07FB07FB07FB0756 ++:106DA000FB07FB07FB07FB07FB07FB07FB07FB07D3 ++:106DB000FB07FB07FB07FB07FB07FB07FB07FB07C3 ++:106DC000FB07FB07FB07FB07FB07FB07FB07FB07B3 ++:106DD000FB07FB07FB07FB07FB07FB07FB07FB07A3 ++:106DE000FB07FB07FB07FB07FB07FB07FB07FB0793 ++:106DF000FB07FB07FB07FB07FB07FB07FB07DE07A0 ++:106E000009EB0804002500F00BBE09EB080400257F ++:106E100000F0F4BD09EB0804002500F0DEBD0E49CA ++:106E200008EB090321A8DDE008EB0901CA780B791A ++:106E3000120442EA03624B7821A81A438B7807496F ++:106E40007EE2C04640B202009CB40200FEB10200E5 ++:106E500093B5020062B80200D9B3020075B1020016 ++:106E600008EB0904A378627821AE02EB0322AE4955 ++:106E70003046FFF7F1FD2379E2783046AB4902EB6B ++:106E80000322FFF7E9FDBBF1060F40F23187A3793A ++:106E900062793046A64902EB0322FFF7DDFDBBF124 ++:106EA000080F40F22587237AE2793046A14902EBA8 ++:106EB0000322FFF7D1FDBBF10A0F40F2198709F158 ++:106EC0000A0409F1090514F8083015F808209A4950 ++:106ED00002EB03223046FFF7BFFD14F8083015F827 ++:106EE0000820964930464CE008EB09039A785B7815 ++:106EF00003EB02220E9200F0FBBE0623904ABBFB7E ++:106F0000F3F309EB08074FF0000A137027E019ADFF ++:106F1000534610218B4A1DAE2846DBF3D5F053466D ++:106F20001021894A3046DBF3CFF0BB787A7821AC68 ++:106F300042EA032229462046FFF78EFD7A79BB7983 ++:106F4000120442EA0362FB7820461A433B79314639 ++:106F500042EA0322FFF780FD0AF1010A0637784B67 ++:106F60001B789A45D3DB00F0C3BEBBF1020F21A80A ++:106F700008EB090202D175495278B3E69378734958 ++:106F8000527802EB0322ADE608EB0904A27863789D ++:106F9000BBF1040F03EB022505D92379E2781B0628 ++:106FA00003EB02431D4321AE304669492A46FFF7F1 ++:106FB00053FDBBF1060F40F29B86A2796379BBF1CA ++:106FC000080F03EB022505D9237AE2791B0603EBB0 ++:106FD00002431D435F4930462A4683E65E4908EB7B ++:106FE000090321A85A787DE608EB09039C785A78B2 ++:106FF000524921A800F05BBE0BF101035FFA83FB4D ++:1070000000230F9300F074BE08EB09039C785A78B4 ++:10701000524921A864E64A4B4FEADB0209EB080714 ++:107020004FF0000A1A702DE01DAD53461021454A5D ++:1070300019AE2846DBF348F053461021424A304649 ++:10704000DBF342F0FA783B79120442EA03627B7880 ++:1070500021AC1A43BB78294642EA03222046FFF7B7 ++:10706000FBFCFA793B7A120442EA03627B79204600 ++:107070001A43BB79314642EA0322FFF7EDFC0AF1DD ++:10708000010A08372E4B1B789A45CDDB00F030BE45 ++:1070900021AD08EB0904284631496278FFF7DCFC92 ++:1070A000BBF1020F40F224862E49284659E121AD5A ++:1070B00008EB0904002228462B496378FFF7CCFC33 ++:1070C000BBF1020F40F20F86012228462649A37821 ++:1070D000FFF7C2FCBBF1030F00F005860222284631 ++:1070E0002149E378FFF7B8FCBBF1040F00F0FB8502 ++:1070F00028461D4903222379FFF7AEFC00F0F3BDBB ++:1071000021AC08EB090517496A782046FFF7A4FC73 ++:107110001549AB782046012200F0DCBD134908EB8D ++:10712000090321A85EE7C046B4B6020075B70200A5 ++:10713000BEB502000AB2020021B3020021B2020071 ++:107140008128020038E7010043E7010056B302003E ++:1071500037B7020082B2020054B40200CAB702007C ++:1071600081B10200ACB7020081B4020045B8020050 ++:10717000ABF10203082B00F2BB85DFE813F0090036 ++:10718000B905B905B905B9052B001C0015000E009D ++:10719000A74908EB090321A824E708EB090321A864 ++:1071A000A4495A7AFFF758FC08EB090321A8A04923 ++:1071B0001A7AFFF751FC09F1070521AC9E4915F831 ++:1071C00008202046FFF748FC20469C4915F8082077 ++:1071D000FFF742FC9A4D09EB0804A3786278294630 ++:1071E00002EB032221A8FFF737FC964B0935023446 ++:1071F0009D42F2D100F07CBDBBF1140F19D0BBF160 ++:10720000170F04D0BBF1130F1AD000F071BD21ACE1 ++:1072100008EB09058C49AA7D2046FFF71DFC8B4928 ++:107220006A7D2046FFF718FC204689492A7DFFF732 ++:1072300013FC08EB090321A88649DA7CFFF70CFC54 ++:10724000854D09EB0804A3786278294602EB0322F6 ++:1072500021A8FFF701FC814B093502349D42F2D190 ++:1072600009EB08057E4E2C46237AE279314602EB83 ++:10727000032221A8FFF7F0FB7A4B0B3602349E4223 ++:10728000F2D1794CAB7B6A7B214602EB032221A829 ++:10729000FFF7E2FB754B0B3402359C42F2D100F054 ++:1072A00027BD08EB0901C8784A788B7800900879E7 ++:1072B00001904879029088790390C8790490097AFE ++:1072C00021A805916A49FFF7C7FB00F011BD09EB42 ++:1072D000080400256378FF2B04D021A865492A46BD ++:1072E000FFF7BAFB01350134042DF3D100F000BDE6 ++:1072F00008EB09035A780AB19B7823B921A85E49A3 ++:10730000FFF7AAFB03E021A85C49FFF7A5FB08EB08 ++:1073100009035B49DA7821A8E4E408EB09039C78C7 ++:107320005A78584921A8DBE408EB0901CA780B799F ++:10733000120442EA03624B7821A81A438B7852491F ++:1073400042EA0322CEE421AD08EB090428464F4966 ++:107350006278FFF781FBBBF1020F40F2C9844C4910 ++:107360002846A278BEE409F1010515F8082021ACF1 ++:10737000484902F00F022046FFF76EFB15F808207F ++:107380004549120909F102052046FFF765FB15F88A ++:107390000820424902F007022046FFF75DFB15F87E ++:1073A00008203F4920461FE009F1010515F8082093 ++:1073B00021AC3C4902F00F022046FFF74DFB15F8C7 ++:1073C00008203949120909F102052046FFF744FB5C ++:1073D00015F80820354902F007022046FFF73CFB6C ++:1073E00015F8082032492046C2F3C1027AE4314937 ++:1073F00008EB090321A8F5E521AC08EB09052E49A6 ++:107400006A782046FFF728FB2C49AA782046FFF728 ++:1074100023FB2B49EA78204664E42A4908EB090358 ++:1074200021A8DFE5284908EB090321A8DAE5C046D1 ++:10743000ECB60200ADB602009FB50200E3B1020057 ++:1074400022B402003DB40200D4B10200EDB2020049 ++:1074500049B30200F1B1020002B602001DB60200FB ++:10746000EEB302000FB40200F9B602001AB7020030 ++:1074700050B7020097B1020025B802003AB80200E6 ++:1074800058B802005DB4020004B80200B6B70200AA ++:10749000E4B3020068B102003DB40200B3B10200DF ++:1074A00047B7020091B7020075B20200F7B70200B9 ++:1074B000C1B7020010B8020068B40200A4B602000E ++:1074C0004AB4020046B502000AB3020009F1010401 ++:1074D00004EB08052846DBF33FF2002840F008845F ++:1074E00014F8083013F0010F40F00284284611A967 ++:1074F000DBF37AF00E9BB3F1FF3F40F0F98308EB2A ++:1075000009035A799B79F3E408EB09039A785C78CC ++:107510008C49120621A8FFF7E3BB08EB090421AD53 ++:10752000894962782846FFF797FA8849A278284661 ++:10753000FFF792FA2379E2788549284621E58549C3 ++:1075400008EB090321A84DE508EB0906B378747828 ++:1075500021AD04EB0324A4B2E20A7F492846FFF7D9 ++:107560007BFA7E49C4F302222846FFF775FA7C496C ++:10757000C4F3C4022846FFF76FFA7A49C4F3410204 ++:107580002846FFF769FA2846774904F00102FFF719 ++:1075900063FABBF1040F40F2AB833379F47873499B ++:1075A00004EB0324A4B2E20A2846FFF755FA704917 ++:1075B000C4F302222846FFF74FFA6E49C4F3C4020F ++:1075C0002846FFF749FA6C49C4F341022846FFF701 ++:1075D00043FA6A49284604F00102FFF783BB08EB2F ++:1075E000090621AF664972783846FFF735FA4FF041 ++:1075F000000A6449B2783846FFF72EFACDF800A0A9 ++:107600003279F378604903EB022301930222534657 ++:107610003846FFF721FACDF800A0B27973795A49BC ++:1076200003EB02230193022201233846FFF714FAE9 ++:10763000CDF800A0327AF379384603EB0223022218 ++:10764000019351491346FFF707FABBF11E0F40F2B1 ++:107650004F834E49727A3846FFF7FEF94C49B27AA9 ++:107660003846FFF7F9F94B49F27A3846FFF7F4F953 ++:107670004949327B3846FFF7EFF9CDF800A0B27BDD ++:10768000737B414903EB022301930522534638469D ++:10769000FFF7E2F9CDF800A0327CF37B3A4903EB27 ++:1076A00002230193052201233846FFF7D5F9CDF8CF ++:1076B00000A0B27C737C344903EB022301930522C2 ++:1076C00002233846FFF7C8F9CDF800A0CDF804A092 ++:1076D000327DF37C314903EB0223029305226C23B4 ++:1076E00001253846FFF7B8F90095CDF804A0B27D22 ++:1076F000737D2A4903EB0223029305226C2338464B ++:107700000224FFF7A9F90094CDF804A0327EF37D9E ++:10771000224903EB0223029305226C233846FFF72C ++:107720009BF9CDF800A0CDF804A0B27E737E384658 ++:1077300003EB02230293194905226823FFF78CF912 ++:107740000095DFE0D7B5020086B5020050B5020013 ++:1077500077B502002BB70200E7B7020093B2020030 ++:10776000A0B2020071B80200A4B1020046B6020045 ++:107770008EB80200C1B802008BB40200D8B7020074 ++:10778000E3B102005DB5020080B702002AB6020034 ++:107790002FB30200E4B5020048B202000FB40200A9 ++:1077A00008EB090621AFAF4972783846FFF754F964 ++:1077B0004FF0010AAC49B2783846FFF74DF9CDF8E1 ++:1077C00000A03279F378A94903EB02230193022246 ++:1077D00000233846FFF740F9CDF800A0B27973795D ++:1077E000A24903EB02230193022253463846FFF7D6 ++:1077F00033F9CDF800A0327AF379384603EB02234F ++:107800000222019399491346FFF726F9BBF11E0F97 ++:1078100040F26E829649727A3846FFF71DF9954913 ++:10782000B27A3846FFF718F99349F27A3846FFF7EB ++:1078300013F99249327B3846FFF70EF9CDF800A0D4 ++:10784000B27B737B894903EB02230193052200235A ++:107850003846FFF701F9CDF800A0327CF37B83496D ++:1078600003EB02230193052253463846FFF7F4F851 ++:10787000CDF800A0B27C737C7C4903EB022301931A ++:107880000522022300253846FFF7E6F80095CDF8DB ++:1078900004A0327DF37C7A4903EB02230293052294 ++:1078A0006C233846FFF7D8F8CDF800A0CDF804A037 ++:1078B000B27D737D724903EB0223029305226C2390 ++:1078C00038460224FFF7C8F80094CDF804A0327EB1 ++:1078D000F37D6B4903EB0223029305226C233846A8 ++:1078E000FFF7BAF80095CDF804A0B27E737E384653 ++:1078F00003EB02230293624905226823FFF7ACF8E9 ++:10790000CDF800A0CDF804A0327FF37E384603EB1B ++:1079100002230293052268235949FFF79DF800943A ++:10792000CDF804A0B27F737F384603EB02230293A5 ++:10793000534905226823FFF78FF8D9E108EB0904C2 ++:10794000A378627821AD02EB03224E492846FFF767 ++:1079500083F86279A379120402EB0362E378284684 ++:10796000D2182379484902EB0322FFF775F8BBF1DF ++:10797000120F40F2BD81627AA37A120402EB036215 ++:10798000E3794249D218237A284602EB0322FFF713 ++:1079900063F8627BA37B120402EB0362E37A28465E ++:1079A000D218237B3A4902EB0322FFF755F8627C99 ++:1079B000A37C120402EB0362E37BD218237CABE0CE ++:1079C000A278637821A803EB0223009331492B4668 ++:1079D0000222FFF741F801350234B5EB5B0FEFDD12 ++:1079E00086E1A278637821A803EB0223009329495A ++:1079F0002B460522FFF730F801350234B5EB5B0F5B ++:107A0000EFDD75E10095A278637821A803EB0223EE ++:107A10000193214905226C23FFF71EF8013502343A ++:107A20004FEA9B06B542EDDD002411E008EB5B0355 ++:107A30004B44009403EB44039A785B7821A803EB52 ++:107A400002230193144905226823FFF705F8013446 ++:107A5000B442EBDD4CE108EB09039C785A780F49FE ++:107A600021A824E1FCB202006AB5020080B702003E ++:107A700038B602003CB30200F3B5020057B2020070 ++:107A80000FB402004BB802009EB70200C9B5020055 ++:107A900066B2020030B2020056B60200ABB4020079 ++:107AA00008EB09039C785A78934921A8FFE008EB7A ++:107AB00009039C785A78914921A8F8E008EB09035A ++:107AC0009C785A788E4921A8F1E008EB0904E27805 ++:107AD0002379120402EB0362637821ADD218A378F4 ++:107AE000884902EB03222846FEF7B6FFE279237AA3 ++:107AF000120402EB036263792846D218A379824903 ++:107B000002EB0322FEF7A8FFE27A237B120402EBCA ++:107B10000362637AD218A37A7C492846FFF731BA08 ++:107B200008EB0904A378627821AD2846784902EB76 ++:107B30000322FEF791FFBBF1040F40F2D9802379B5 ++:107B4000E27874492846FFF71CBA08EB0904E2788A ++:107B50002379120402EB0362637821ADD218A37873 ++:107B600028466D4902EB0322FEF776FFBBF1060FB4 ++:107B700040F2BE80E279237A120402EB0362637959 ++:107B80006649D218A3792846FFF7FBB9644E09EB82 ++:107B900008040225AB45C0F2AB80E27823791204D9 ++:107BA00002EB036263783146D218A37821A802EB76 ++:107BB00003220435FEF750FF043418361A2DE9D19C ++:107BC00096E0584E09EB08040225AB45C0F29080C0 ++:107BD000E2782379120402EB036263783146D2180B ++:107BE000A37821A802EB03220435FEF735FF043405 ++:107BF00013360E2DE9D17BE04B4E09EB080402252C ++:107C0000AB4575DBE2782379120402EB03626378FB ++:107C10003146D218A37821A802EB03220435FEF7DF ++:107C20001BFF043414360E2DEAD161E03F4E09EB00 ++:107C300008040225AB455BDBE2782379120402EBF2 ++:107C4000036263783146D218A37821A802EB03229D ++:107C50000435FEF701FF043414360E2DEAD147E057 ++:107C6000334E09EB08040225AB4541DBE27823796A ++:107C7000120402EB036263783146D218A37821A87C ++:107C800002EB03220435FEF7E7FE043414360E2D12 ++:107C9000EAD12DE008EB09039C785A78254921A800 ++:107CA00005E008EB09039C785A78234921A802EBE8 ++:107CB0000422FFF717B808EB0901CB780A791B04F7 ++:107CC00003EB02634A788C789B181C4921A8012297 ++:107CD00003EB0423FEF7C0FE0AE0194908EB090391 ++:107CE00021A8FFF77FB901220B9201E0FF2E29D0D6 ++:107CF0000BEB0801FEF753BF19B802008BB102006D ++:107D00001DB60200C9B5020066B2020072B40200DC ++:107D10009BB80200AEB80200C0B60200D6B60200A0 ++:107D2000B6B4020064B30200B1B202009DB3020017 ++:107D300068B6020014B30200C0B102001AB7020014 ++:107D4000ACB502000D9B01330D930D9A079B9A422F ++:107D50007EF41DAF0E9AB2F1FF3F03D021A8174960 ++:107D6000FEF77AFE9DF8443023B121A8144911AAE8 ++:107D7000FEF772FE00201349DAF32AF638B90B9B9E ++:107D80002BB91A4621A81049FF33FEF765FE229A47 ++:107D9000002302F8013B2E9B0A9900930998069B49 ++:107DA0002292FEF7ABFE0A9904464FF480520998DE ++:107DB000DEF39EF7204625B0BDE8F08F82B80200C2 ++:107DC0002FB802000E5D860081B402002DE9F04F4D ++:107DD0009A468FB000230D936D4B06461C7889465A ++:107DE0000592002C40F0C180142208A82146DAF345 ++:107DF00027F17369232B05DC01224FF0040B069455 ++:107E0000079214E01C222346304621460094E3F3F7 ++:107E10003DF00028ACBF03230123ACBF00220122A8 ++:107E200007930692ACBF4FF00C0B4FF0020B30469D ++:107E3000E2F3E0F70128054602D0022806D013E05D ++:107E400030464946DAF330F040000CE03046FAF7AD ++:107E500047FF044640B1D9F3D5F710F4807F03D033 ++:107E60002046D9F3C5F70D900D99002900F08480C4 ++:107E70004846DEF32DF7044610B96FF01A0083E090 ++:107E8000012D0746DDF8348003D0022D0ED00025E9 ++:107E90001CE0002102900091CDF80480039130464F ++:107EA000059A4B46D9F3FAF705460DE00EAB4FEABB ++:107EB000580243F8042D304601212246D9F356F7E3 ++:107EC0000D9B05465B000D93002D45D123884FF691 ++:107ED000FD72013B9BB2934205D94846214642467A ++:107EE000DEF306F74AE0069B1BB104EB4B03089355 ++:107EF00015E0638804EB0B01227901EB132303EBFC ++:107F00000223A3F580530993E3880891CB18A3F5C6 ++:107F100080530A932389C918A1F580510B91DDB9CB ++:107F2000189A4846009208A9079A5346FEF708FE99 ++:107F300090B91849DAF320F538B1189B3046DAF8D1 ++:107F400000101A6800F024FB06E0189B3046DAF8AF ++:107F500000101A6800F004FB27B148463946424633 ++:107F6000DEF3C6F60A4B01221A700023189A18464F ++:107F7000CAF80030136007E00D468846064B00271C ++:107F8000089301230793CAE70FB0BDE8F08FC046FE ++:107F9000402700004EE7010019B2020013B5049C0F ++:107FA0009E4605994CB141B1002323600B600091BE ++:107FB00023467146FFF70AFF00E000201CBDC046C3 ++:107FC000094A13888B4201D1002206E093888B4234 ++:107FD00002D04FF0FF3005E00122034B03EB820398 ++:107FE00093F902007047C0461CB902002DE9F04128 ++:107FF000074614461E46002B7ED0E7F783FA054657 ++:1080000002E0B34205D00C35002D75D02B88002B33 ++:10801000F7D12B88002B6FD0D4F80036AA78C3F3A1 ++:108020008403934268D0D4F81836642023F0C073D8 ++:10803000C4F81836D4F81C3643F6A12623F0C073D2 ++:10804000C4F81C36DEF388F303E00A20DEF384F381 ++:108050000A3ED4F8E03113F4003F01D0092EF4D1E8 ++:108060000023C4F86036EA782B79D4F864161B062E ++:10807000120502F4700203F07063134321F07F6174 ++:108080000B43C4F864360223C4F86036D4F864366F ++:108090006A7923F0FE5323F4781343EA025343F43E ++:1080A0008023C4F864360323C4F86036D4F8642609 ++:1080B000AB6802F07F4223F07F431343C4F8643679 ++:1080C0003B6A012B05DDD4F8003643F48063C4F825 ++:1080D0000036AA782988D4F8000692004FF68373F8 ++:1080E0007F3102F07C0200EA0303C9111A4301390F ++:1080F00042EA0142C4F80026BDE8F081036A70B587 ++:10810000092B054601DC00242CE0E2F3B7F6002140 ++:1081100006462846E3F384F0D0F80836044613F404 ++:10812000807001D1044619E04FF00043C4F86C366A ++:108130004FF47A70DEF310F3D4F86C360022DB04CF ++:10814000DB0C5B03C4F86C2603F54243064A03F5D7 ++:10815000A873B3FBF2F3642203FB02F42846314612 ++:10816000E3F35EF0204670BDA086010070B50446C2 ++:10817000E2F384F6002105462046E3F351F0236A3A ++:10818000012B04D1D0F8003623F4007304E005DDA0 ++:10819000D0F8003643F40073C0F800362046294674 ++:1081A000E3F33EF070BDC0462DE9F04104461646AB ++:1081B0000D46E2F363F6002180462046E3F330F0FB ++:1081C0002946024633462046FFF710FF2046414627 ++:1081D000E3F326F0BDE8F0812DE9F043002485B0FB ++:1081E000074603940294E2F349F621468146384655 ++:1081F000E3F316F07B6A4E4A0546C3F3042605E016 ++:10820000137AC5F82036D368C5F82836494B083AA2 ++:108210009A42F5D14FF0000820E008216846464A0E ++:108220004346D9F351F700206946DAF3D1F398B108 ++:1082300000210A46DAF38CF23B6A0C2B08DDB0F51C ++:10824000803F05D200F0FF02C0F3072342EA03405B ++:10825000C5F82086C5F8280608F10108B045DCD12C ++:10826000364C28E0E36A13B13846984710B3002132 ++:108270001EE001238B40226A134218D0C5F8201655 ++:1082800094F924302BB1012B05D0B3F1FF3F07D077 ++:108290000DE0A36A09E0D5F82436A26A134304E08E ++:1082A000D5F82436A26A23EA0203C5F82436013140 ++:1082B000B142DED1103C224B9C42D3D1002614E0C7 ++:1082C000082168461F4A3346D9F3FEF60020694666 ++:1082D0006C46DAF37DF338B10021C5F820660A4612 ++:1082E000DAF336F2C5F8240601364645E8D103A98B ++:1082F00002AA3846DDF31CF5029B039941EA03020A ++:10830000D5F81C3642EA0303C5F81C360AB1C5F895 ++:108310001C2609B1C5F818164FF4FA600292DEF374 ++:108320001BF238464946E2F37BF705B0BDE8F0831F ++:1083300014B90200F4B8020051368600D4B8020025 ++:10834000A4B80200563686002DE9F04385B00546F4 ++:10835000E2F394F5002181462846E2F361F72B6AA7 ++:108360008046042B6B6A01DDDF0E01E0C3F3436737 ++:10837000002614E0102168460D4A3346D9F3A4F6CE ++:10838000002069466C46DAF323F338B100210A462F ++:10839000DAF3DEF1C8F85066C8F854060136BE427A ++:1083A000E8D128464946E2F33BF705B0BDE8F08343 ++:1083B0005B3686002DE9F043036A85B0042B436ADF ++:1083C0000546CCBFC3F38458C3F34358E2F356F5D4 ++:1083D000002181462846E2F323F70026074615E0F0 ++:1083E000102168460E4A3346D9F36EF600206946DE ++:1083F0006C46DAF3EDF238B100210A46DAF3A8F15F ++:10840000C7F85866C7F85C06731CDEB24645E7D16C ++:1084100028464946E2F304F705B0BDE8F083C046BC ++:1084200063368600F7B5053A06461F46062A2BD85E ++:10843000DFE802F00A0C12040E2A060005250CE003 ++:108440001125032402230AE0012502E0052500E0AE ++:1084500011250F24042302E000251F240323009389 ++:1084600000214FF4CB624FF0FF333046E2F30EF5BC ++:1084700004EA0703AB4030460093002140F25C62FF ++:1084800014FA05F3E2F302F5FEBDC0462DE9F04112 ++:1084900005460E4600201749DAF36EF2164984B2FB ++:1084A0000020DAF369F240F2DC51002C18BF2146BB ++:1084B000C7B22846FFF784FDC0B210F0800F0CD180 ++:1084C000C4B23146284607222346FFF7ABFF2846B1 ++:1084D000314608222346FFF7A5FF2FB12846314633 ++:1084E0003A460123E7F748F828463146FFF762FF8E ++:1084F000BDE8F0816F36860008F9010070B50546C9 ++:108500000C46FFF721FF002221462846DDF364F5E3 ++:108510002846E2F3B3F40A4904460020DAF32CF2C9 ++:108520004FF4002210F001034FF00001284618BF5D ++:108530001346DDF385F428462146E2F371F670BD5B ++:108540007836860070B5002105461020DDF35EF711 ++:10855000002110220446D9F373F52046656070BDF2 ++:1085600070B50C461546E2F3C5F51021DEF3B0F305 ++:1085700010B96FF01A0008E0044A10234360136832 ++:10858000C460036085601060002070BD6C2700002F ++:1085900070B515460C46E2F3ADF51021DEF398F305 ++:1085A000024610B96FF01A0010E01023436008492A ++:1085B000002303600B68C46085601BB9086018461F ++:1085C00004E0034618680028FBD11A6070BDC0465D ++:1085D0006C27000070B50C461546E2F38BF51021B0 ++:1085E000DEF376F310B96FF01A0008E0044A1023A6 ++:1085F00043601368C460036085601060002070BD34 ++:108600006C270000064B10B51B683BB9054B196879 ++:1086100021B1054B1A680AB1FFF7DCFF002010BD3D ++:108620006C270000FC1E0200001F020001207047A2 ++:108630000020704710B50020DAF39EF110BDC0464F ++:1086400010B50B490446FFF7F5FF80B278B9E06F2B ++:108650000749DAF391F180B248B9E06F0549DAF3DE ++:108660008BF14FF6FF7380B2002808BF184610BD8B ++:10867000483786004E37860041F2E44370B5C36246 ++:1086800004460D4629B108460949DAF375F1A0629E ++:1086900040B900200749DAF36FF1A06210B94FF634 ++:1086A000FF73A36228460449DAF366F1206370BDC4 ++:1086B000543786005B37860086378600836973B53A ++:1086C00013F0005F04466FD08268B2F5026F01D1EB ++:1086D00001220AE040F604039A4201D0002204E09D ++:1086E000C3680C2B94BF002201224FF00003D5B2C7 ++:1086F000ADF8063055B920464FF400612A46D4F84B ++:10870000C860E2F37BF500284ED005E0D4F8843051 ++:1087100013F5405048D000266369222B03DC002368 ++:10872000C0F8683100E00023C0F86431C0F860315F ++:108730006369222B03DC1F4BC0F8443105E00123A1 ++:10874000C0F84831FE33C0F84C316369222B07DC96 ++:108750000023C0F88031C0F87C31C0F8783104E0E3 ++:108760000023C0F87431C0F870311DB9204631467D ++:10877000E2F356F520460DF10601FFF759FF0546D5 ++:10878000A8B9BDF8063093B163690B49222B204686 ++:10879000D8BF4FF48021CCBF40224FF480222B461B ++:1087A000E2F38EF3284603E04FF0FF3000E00020B4 ++:1087B0007CBDC0460000FBBF400055552DE9F04789 ++:1087C000002104461F46DDF82080DDF82490E2F306 ++:1087D00027F505462046E2F363F360610A28C4BF2B ++:1087E000EB6A63646B68A3616369222BC4BFD5F82D ++:1087F000AC30E361A36913F0805F05D0D5F804368F ++:10880000636203F0FF0323624FF4E063A3604FF061 ++:10881000FF33E360254612330026236116E031461C ++:108820002046E2F3FDF42046E2F31CF32046E2F397 ++:1088300037F31FB1D5F810319F4203D0D5F88830F7 ++:10884000994501D1C8F8006001360435D4F8CC3020 ++:108850009E42E4D32046D8F80010E2F3E1F4012070 ++:10886000BDE8F08730B585B00190002504A840F838 ++:10887000045D01A90422D9F37FF3019CD4B12246FF ++:108880002946D2F8883013B10023C2F8883001316C ++:1088900004321029F5D10398D9F30CF30398E6F7C5 ++:1088A000B7FF054B9C4205D0606D21464FF45672D0 ++:1088B000DEF31EF205B030BD8C2802002DE9FF4723 ++:1088C0000C9E1446DDF834808A464FF4567200211F ++:1088D00005461F46DDF83890012E08BF0026D9F363 ++:1088E000AFF311232B61C5F88470C5F858806C650F ++:1088F0006E60002E40F0B98028463146524643460D ++:10890000FFF794FE002800F0B0804FF0C0542268BA ++:108910002846130F2B6013041B0CAB63C2F30343F5 ++:10892000C2F303522A640E3A012A8CBF00220122AC ++:10893000EB6385F8482021465246FDF739FFD5F80C ++:10894000CC30002B00F0918004AB43F8046D009311 ++:1089500028462146324633460197FFF72FFF00286D ++:1089600000F083802846FFF74DFE0F9A6B6D284676 ++:10897000019231463A46CDF80090FFF70FFB0028F0 ++:1089800073D1B9F1000F01D14E4601E0D9F8006072 ++:1089900028463146FFF770FE364B1C78002C30D14C ++:1089A0006B69132B0BDD4FF4006128462246E2F37E ++:1089B00025F48465C46503992846E2F331F428461A ++:1089C000696DFFF7D3FB2846696DFFF797FD3046C9 ++:1089D0002949D9F3D1F7024620B92846696DFFF736 ++:1089E0008DFB02462846696DFFF7DEFB2846696D60 ++:1089F000FFF7F2FB2846696DFFF748FD1D4B01228A ++:108A00001A706B690F2B0FDD1C493046D9F3B4F790 ++:108A10001B4B0021002808BF1846009088222846DA ++:108A20004FF0FF33E2F332F230461649D9F3D0F774 ++:108A300038B114493046D9F39FF701462846E7F785 ++:108A4000A5F86B69142B11DD00242146082223466A ++:108A500028460094E2F31AF2214640F0040308226B ++:108A600028460093E2F312F200E00025284604B005 ++:108A7000BDE8F087E42B0200E2388600EB38860080 ++:108A80005A000A00F13886001FB5104C864621783E ++:108A9000C9B90F4A0F4B002808BF024608BF03465A ++:108AA00000910191029303920B4844F210717246B7 ++:108AB0004FF0C053FFF702FF00B905E0074A20233B ++:108AC000136001232370044804B010BD88280200FD ++:108AD0000C290200082902008C28020074270000DB ++:108AE0002DE9FF4781460D4608464FF456719246E0 ++:108AF0001E460D9FDDF83880DEF3EAF0044610B321 ++:108B00000C9B494601932A46534600960297CDF89E ++:108B10000C80FFF7D3FE064638B9284621464FF4AD ++:108B20005672DEF3E5F030460EE00FB93B4600E04A ++:108B30003B68E367B8F1000F01D1434601E0D8F884 ++:108B40000030C4F88030204604B0BDE8F087C0464D ++:108B500070B5044628B30368124918682246FBF32F ++:108B6000F3F12546002610E0296A29B123689868A8 ++:108B7000E6F386F500232B62E96921B123682A8B8D ++:108B80005868DEF3B5F00136183561688E42EBDBCC ++:108B9000182201FB02F22368214658681032DEF3E6 ++:108BA000A7F070BD08FA01002DE9F043036885B015 ++:108BB00081467021D868DEF38BF0044608B906467A ++:108BC00048E0002170220646D9F33AF2042363609C ++:108BD00027464FF0B40325464FF00008C4F8009034 ++:108BE000A38112E0182208FB02F210322C61D9F89E ++:108BF00008001A49A2180023E6F35EF5286218352A ++:108C000008B905461CE008F1010863689845E9DBEE ++:108C1000134BD9F8000000930023019302930393B0 ++:108C20001049114A2346FBF357F113E0396A29B181 ++:108C300023689868E6F324F500233B620135183772 ++:108C400063689D42F2DB2368214658687022DEF398 ++:108C50004FF00026304605B0BDE8F0839DFE0000D1 ++:108C600021FD0000E4F9010009FA010010B50446F5 ++:108C700058B10368054918682246FBF365F123687B ++:108C8000214658685422DEF333F010BD2B7A86005B ++:108C900030B55421044685B04068DEF319F008B9B8 ++:108CA000054611E0002154220546D9F3C9F1084BCD ++:108CB0002C600093002301930293039320680549DD ++:108CC000054A2B46FBF308F1284605B030BDC046E7 ++:108CD000390301003CFA01002B7A8600002070471E ++:108CE00010B5044698B107F0ADDE09496068224628 ++:108CF000FBF32AF1E16E21B163683C22D868DDF311 ++:108D0000F7F763682146D8687022DDF3F1F710BDEC ++:108D1000D58D86007FB5054670214068DDF3D8F714 ++:108D2000064608B9044631E0002170220446D9F312 ++:108D300087F12B683560736068683C21DDF3C8F704 ++:108D4000E066F8B100213C22D9F37AF1114B1249C7 ++:108D50000093002301930293104B114A0393706810 ++:108D60003346FBF3B9F068B94FF001037382B38265 ++:108D700030462946FFF7B2FF002803DB304607F0F4 ++:108D80005DDF03E03046FFF7ABFF0024204604B070 ++:108D900070BDC046390B83006CFA0100290C8300BA ++:108DA000D58D860070B5D0F8305704466DB10749AF ++:108DB00022460068FBF3C8F0606829464FF40A6257 ++:108DC000DDF396F70023C4F8303770BD529E86005D ++:108DD0002DE9FF4106464FF40A614068DDF378F75C ++:108DE000074618B9C6F830070138E1E000214FF412 ++:108DF0000A62D9F325F107F120033B6033680822AA ++:108E000000247A613C61DC211A6630466A4A6B4B69 ++:108E10000094019601F092FFA042B86105DA304655 ++:108E2000FFF7C0FF6FF00100C2E0A6462546644B85 ++:108E300000221EF0010FEA501FD0624B19780D2955 ++:108E400002DD4FF4004C03E04A1C012303FA02FC4C ++:108E50005C4BD8780D2802DD4FF4004403E0421C3F ++:108E6000012313FA02F4012313FA00F28B401A4390 ++:108E700042EA0C02524B2243EA501EF0020F24D069 ++:108E80004F4B55F803804F4B58780D2802DD4FF4B7 ++:108E9000004C03E0421C012303FA02FC494B997881 ++:108EA0000D2902DD4FF4004403E04A1C012313FAAC ++:108EB00002F4012313FA01F283401A4342EA0C023E ++:108EC00022433F4B42EA0802EA501EF0040F24D02E ++:108ED0003B4B55F803803B4B18790D2802DD4FF4CE ++:108EE000004C03E0421C012303FA02FC354B597984 ++:108EF0000D2902DD4FF4004403E04A1C012313FA5C ++:108F000002F4012313FA01F283401A4342EA0C02ED ++:108F100022432B4B42EA0802EA501EF0080F24D0ED ++:108F2000274B55F80380274B98790D2802DD4FF425 ++:108F3000004C03E0421C012303FA02FC214BD979C7 ++:108F40000D2902DD4FF4004403E04A1C012313FA0B ++:108F500002F4012313FA01F283401A4342EA0C029D ++:108F60002243174B42EA0802EA500EF1010E043583 ++:108F7000BEF1100F7FF45BAF134B0025134C03932E ++:108F80002946134A33463068009501950295FAF355 ++:108F9000A3F7231D93E807006B4683E807003046DC ++:108FA00023680321324601F061DEC6F83077284697 ++:108FB00004B0BDE8F081C04601578300A15683008C ++:108FC0008427000090E085009D508300C8FA0100CE ++:108FD000529E86002DE9F041066805461B4930681F ++:108FE0002A46FAF3B1F72C460027D4F8081121B12C ++:108FF0007068B4F81021DDF37BF6D4F80C1121B1C0 ++:109000007068B4F81221DDF373F601374034042F91 ++:10901000EBD1D5F80C1221B17068B5F81022DDF350 ++:1090200067F6D5F81C1211B1B068E6F329F3D5F84C ++:10903000201219B170683A46DDF35AF67068294675 ++:109040004FF42372DDF354F6BDE8F081D8FA010045 ++:1090500010B50446E7F7F2FDA16961B1237D23B1A4 ++:10906000E068E6F3FBF200232375E068A169E6F30C ++:1090700007F30023A36123692146D8682C22DDF37E ++:1090800037F6002010BDC0462DE9F041074688465E ++:10909000C0682C2114461E46DDF31AF608B90546B1 ++:1090A00019E0054600212C22D8F3CAF7EC602046CF ++:1090B000EE61C5F808802F6108492A460023E6F3CF ++:1090C000FBF20446A86130B92B692946D8682C22E6 ++:1090D000DDF30EF625462846BDE8F0813D668400A6 ++:1090E00010B5034900220068FAF32EF7002010BDE6 ++:1090F00049C586001FB5094A0B460092002201921D ++:10910000029203920649074AFAF3E6F6002814BFD2 ++:109110004FF0FF30002005B000BDC0460968840054 ++:1091200048FB010049C586001FB5084A0346009266 ++:1091300000220192029203920549064A0068FAF35E ++:10914000CBF6003818BF012005B000BD7D18010026 ++:1091500020FC0100EFFB010010B5B0F8BC400C8012 ++:10916000B0F8C0101180B0F8C6201A8090F8C8205E ++:10917000029B01201A8010BD90F8D4007047C046B1 ++:10918000D0F8CC007047C04610B5014618B18068D1 ++:109190009822DDF3ADF510BD70B598210446006846 ++:1091A000DDF396F508B9054633E00021982205461F ++:1091B000D8F346F72368AB606368EB60A3682B6164 ++:1091C000E3686B6023696B61238CAB84638CEB84F5 ++:1091D000636AAB62A36AEB62E36A2B63236B6B6324 ++:1091E000636B6B64A36BAB64E36BEB64236C2B6509 ++:1091F000636C6B656369AB65A369EB650F232B66D5 ++:109200002D336B663C33AB660323EB66002385F896 ++:109210009430284670BDC04670B501210446E9F778 ++:1092200029FB2046E9F7B2FBC0F30F33A4F8C630A0 ++:10923000B4F8C620030F84F8C83042F2640300F08B ++:109240000F009A4284F8C90005D002339A4202D036 ++:109250004FF0FF3500E0002520460021EAF77AF8BC ++:10926000284670BD70B5044600282DD0D0F8E430F3 ++:109270005D1EC0F8E4503DBB41F2C826815921B1C2 ++:10928000C3691869F3F78EFFA55141F2DD13E55468 ++:109290002046E9F73FFFE1690A68A24203D1D4F80A ++:1092A000B4300B6005E0D2F8B430A34208BFC2F876 ++:1092B000B450E36E0BB120469847E36921469868A5 ++:1092C00041F26832DDF314F570BDC04670B5D0F8D8 ++:1092D000B8400E46E9B10846D8F342F70546C0B19A ++:1092E0000FE0204631462A46D8F32AF628B9635DB6 ++:1092F0003D2B02D1631C58190CE014F8013B002BE4 ++:10930000FBD114B12378002BEBD13046DEF3AEF461 ++:1093100000E0002070BDC0462DE9F34141F2383530 ++:10932000435B064688462BB30846D8F319F7044634 ++:109330001448D8F315F724181034F369A7B29868C5 ++:109340003946DDF3C5F4044608B9054617E0735BFA ++:109350000D4A009339464346D8F3B6F621463046C7 ++:10936000EBF79EF9F3690546214698683A46DDF326 ++:10937000BFF425B930464146EBF792F90546284639 ++:10938000BDE8FC8196FD01009CFD01002DE9F04F38 ++:1093900041F2383B85B0039330F80B3006468946DE ++:1093A0009246D0F8B880002B38D00846D8F3D8F6CB ++:1093B00004462448D8F3D4F62418F3691034A7B22D ++:1093C00098683946DDF384F4054608B9044634E06C ++:1093D00036F80B30394600931B4A4B46D8F374F6E7 ++:1093E00030462946EBF76AF9834668B1404629467C ++:1093F000D9F75CFA40B1504506DD40462946524651 ++:10940000D9F3C8F2044600E0039CF3692946986842 ++:109410003A46DDF36DF4BBF1000F0ED140464946EC ++:10942000D9F744FA40B1504506DD40464946524618 ++:10943000D9F3B0F2044600E0039C204605B0BDE835 ++:10944000F08FC04696FD01009CFD010070B590F8BC ++:10945000C43001229A401A49013A0446D5B2EBF7CA ++:1094600061F941F21202C0B2A0540138C0B2FD2825 ++:1094700001D97323A354A25C41F21303E2542046A2 ++:109480001049EBF74FF941F21402C0B2A05408B1F1 ++:109490000F2801D10523A35441F21203E25C0233E9 ++:1094A000E35CD21A41F21503E25400220133E25484 ++:1094B0000233E25445EA0512013BE25470BDC04656 ++:1094C00075B902004FB902002DE9F84F8846002116 ++:1094D000846807469246C0680A469B46E1F3BAF4A0 ++:1094E00010F0080F814615D03E689EB130465146B7 ++:1094F00000F084FA002800F07481F369D6F8CC10EB ++:10950000186927F0CDD8D6F8E43030460133C6F8D4 ++:10951000E4306DE1204641F26831DDF3D9F30546D0 ++:10952000002800F05C81002141F268320646D8F341 ++:1095300087F5012105F59053303341F2D41285F8B7 ++:10954000E110AB50FA6C41F26B039A42C5F8B0805F ++:10955000EF6105D17B6C932B02D1A5F8221603E0B5 ++:109560004FF01802A5F822266423002185F8E03088 ++:1095700041F218230422E9540133EA540133E95437 ++:109580000133BAF1020FC5F8B8B0EA5406D119F0A8 ++:10959000010F1CBF4FF40053C5F8CC30EB69D5F870 ++:1095A000CC10186927F07CD8D5F8B030B3F8E03388 ++:1095B0009CB2EB69D868E6F787F941F23833E85294 ++:1095C000C4F30323C5F8BC3004F00F03C5F8C03062 ++:1095D000EB699A6A874BD318012B06D94AF6E60342 ++:1095E0009A4202D0043B9A4207D1EB69DB6A023B04 ++:1095F000012B02D80923C5F8C030D5F8BC30092B9F ++:1096000007D10423C5F8BC30D5F8C0301033C5F8F5 ++:10961000C030012385F8C430230BC5F8D030D5F80D ++:10962000BC30022B0CD9042B0AD0052B08D0062BFA ++:1096300006D0082B04D00A2B02D0072B40F0D18093 ++:109640003C23C5F8F43F0023C5F8F83F4FF400630E ++:10965000A5F8DE3042F6013241F62433BAF1020FAA ++:1096600008BF1346A5F8DA3095F8DA30284685F8B1 ++:1096700000376149EBF722F890B15F492846EC6961 ++:10968000EBF750F85C4920672846EC69EBF74AF89D ++:10969000EA69BAF1020F60670CBF136F536FD366AC ++:1096A0000A2241F2E613EA5403210133E95401236B ++:1096B000002485F8E83005F59053013A1C7041F21A ++:1096C0001B03EA54EB6985F8E94585F8EE4585F812 ++:1096D000F34585F8F84585F8FD45284683F893104D ++:1096E000FFF7B4FE41F21903EC544FF6CE7241F28B ++:1096F000C423EA5285F8F440621901347F23652CB3 ++:1097000082F82C3682F8913682F8B232F4D14FF0DA ++:10971000FF33A5F8FA36002385F8AC3028465146C9 ++:1097200001F03AF900285CD02846E9F797F8284676 ++:10973000FFF772FD0446002853D13049062228461F ++:10974000EAF7E4FF41F2E623E8542D4901222846D6 ++:10975000EAF7DCFF41F2F423E8542A49224628467E ++:10976000EAF7D4FF41F23A33E85427492846072262 ++:10977000EAF7CCFF41F23B33E8542246284623491E ++:10978000EAF7BEFF631903F5985301343833182CF8 ++:109790001871F2D10024224628461D49EAF7B0FF8D ++:1097A000631903F59A53013410330E2C1871F2D15A ++:1097B000D5F8E430EA690133C5F8E4301368D068BD ++:1097C000C5F8B4303D60FEF779FF05F1B803C5F880 ++:1097D000B830284605F1BC011C22D8F3CDF3284649 ++:1097E00006E0B868314641F26832DDF381F20020CC ++:1097F000BDE8F88F1D57FFFF80B9020024B90200B1 ++:1098000043B9020036B9020060B902006EB9020025 ++:109810002FB9020010B502490268FAF395F310BDA2 ++:10982000040402001FB5094B09490093002301936A ++:1098300002930393074A0368FAF34EF3002814BF18 ++:109840004FF0FF30002005B000BDC0463147010099 ++:1098500044030200040402002DE9F0410025804683 ++:109860000F4616462C4607E004EB0800E1190522D6 ++:10987000D8F382F301350534B542F5D1BDE8F08166 ++:10988000022970B505460C460AD0032911D00129DA ++:1098900016D106220B49E8F793FFEA69002305E099 ++:1098A00006220949E8F78CFFEA69012382F8813032 ++:1098B00006E006490622E8F783FFEB6983F881405A ++:1098C00070BDC046200B02002C0B0200380B0200BA ++:1098D00070B5D0F8A840002394F8C113C4F87435CB ++:1098E0000F4A104B022914BF15461D46C3694FF499 ++:1098F00020719868DDF3ECF1C4F8740578B180222A ++:109900002946FFF7A9FF94F83A35022B06D1D4F87F ++:1099100074050549A0301522FFF79EFF012070BD98 ++:1099200084C90200A8C4020048CC02002DE9F04717 ++:10993000D0F8A8308146D3F87C55D3F878A54FF0FD ++:10994000000817E0142403FB04F42B191A695B6860 ++:109950002F5903FB02F3DE08D9F81C303146986812 ++:10996000DDF3B6F108F10108285140B1394632461D ++:10997000D8F302F35FFA88F35345E3D30120BDE83F ++:10998000F087C0462DE9F041194BD0F8A8501A686D ++:10999000C369002614210746C5F87C65C5F87825FB ++:1099A000986802FB01F1DDF393F10446C5F87C05EC ++:1099B000E0B1B0460FE0FB6906EB04001B6D08F157 ++:1099C000010813F4805F14BF0A490B49142271186F ++:1099D000D8F3D2F21436D5F878359845EBD338461B ++:1099E0000121FFF7A3FF003818BF0120BDE8F08177 ++:1099F000A01A0200C4C2020084D102002DE9F04185 ++:109A0000884686B07A490546D0F8A860EAF78AFE0B ++:109A1000784930722846EAF785FE77497072284601 ++:109A2000EAF780FE7549A5F8FC002846EAF77AFEB9 ++:109A30007349A5F8FE002846EAF774FE7149A5F8B7 ++:109A400000012846EAF73AFE38B128466D49EAF7A0 ++:109A500069FE10B1012386F8E83396F8E8330BB3BA ++:109A600068492846EAF75EFE6749A5F802012846DC ++:109A7000EAF758FE6549A5F804012846EAF752FEC0 ++:109A80006349A5F806012846EAF74CFE614986F8C5 ++:109A900024052846EAF746FE002241F21B0386F819 ++:109AA0002505EA545C492846EAF73CFE5B49C6F8BE ++:109AB000340414222846EAF729FE5949A6F83C0442 ++:109AC0005A222846EAF722FE564986F8540408220C ++:109AD0002846EAF71BFE544986F84C040322284620 ++:109AE000EAF714FE514986F84D0408222846EAF7A1 ++:109AF0000DFE4F4986F84E0403222846EAF706FE7B ++:109B00004C4986F84F0408222846EAF7FFFD4A49E7 ++:109B100086F8500403222846EAF7F8FD474986F8FC ++:109B2000510408222846EAF7F1FD032286F8520480 ++:109B300043492846EAF7EAFD424986F85304284695 ++:109B4000EAF7F0FD404986F8580402222846EAF771 ++:109B5000DDFD3E4986F8C1042846EAF7AFFD28B18D ++:109B600028463A49EAF7DEFDF07400E0F074284632 ++:109B70003749EAF7A3FD28B128463549EAF7D2FD6F ++:109B8000307501E00823337528463249EAF796FD1F ++:109B900028B128462F49EAF7C5FD707501E0022378 ++:109BA000737528462C49EAF789FD28B128462A49C9 ++:109BB000EAF7B8FDB07501E00423B37528462749DC ++:109BC000EAF77CFD28B128462449EAF7ABFDF07599 ++:109BD00001E00823F37528462149EAF76FFD0028C4 ++:109BE00040D028461E49EAF79DFD30763CE0C0464D ++:109BF00045C10200E3C002002ABE020030BE0200DE ++:109C000036BE0200C3C00200E2BD0200CDBC0200AD ++:109C1000D5BA0200EABA02009AC202006BBD020085 ++:109C2000A6C102001DC202007EBF0200EBC10200FD ++:109C3000ABB90200FCC10200BCB90200DAC10200EB ++:109C4000B3C202009ABC02000BBB02001ABC0200A5 ++:109C500007BC020065C0020015C202000DC202006E ++:109C60003DC1020002233376B7492846EAF75AFD80 ++:109C7000B649B0722846EAF755FDB549F072284654 ++:109C8000EAF750FDB17AF27AC3B230737173B273EE ++:109C9000F37331747274B374AE492846EAF742FD27 ++:109CA000B5F8FC2041F21A33EA5205F599531A80AF ++:109CB000B5F8FE2041F21C33EA520633EA52B5F8F9 ++:109CC0000021043BC7B2EA52063385F81A71EA5202 ++:109CD0002846A149EAF726FD002480B22A1900F09F ++:109CE0000F030134A7EB43030009042C82F81E3153 ++:109CF000F4D128469949EAF715FD2A1900F00F0317 ++:109D00000134A7EB430300090C2C82F81E31F4D177 ++:109D100093492846EAF706FD924904462846EAF7A1 ++:109D200001FD80B240EA0441716014202A1801F05C ++:109D30000F030130A7EB430309091C2882F81631F1 ++:109D4000F4D189492846EAF7EDFC88497083284612 ++:109D5000EAF7E8FC864930772846EAF7E3FC8549CC ++:109D600070772846EAF7DEFC8349B0772846EAF7A1 ++:109D7000D9FC8249F0772846EAF7D4FC804986F876 ++:109D800022002846EAF7CEFC7E4986F821002846C4 ++:109D9000EAF7C8FC7C4986F8E0042846EAF7C2FCEA ++:109DA0000127C6F8E40401AC784920463A46D8F3C6 ++:109DB0009BF1D5F8B8002146D8F30AF630B100215E ++:109DC0000A46D8F3C5F4F31983F8E70401370F2FD7 ++:109DD000E9D16F492846EAF7A5FC6E4986F8F604F2 ++:109DE0002846EAF79FFC6C4986F8F7042846EAF70C ++:109DF00099FC6A4986F8F8042846EAF793FC684912 ++:109E000086F8F9042846EAF78DFC664986F8FA04D4 ++:109E10002846EAF787FC644986F8FB042846EAF7F7 ++:109E200081FC624986F8FC042846EAF77BFC60491D ++:109E300086F8FD042846EAF775FC5E4986F8FE04BC ++:109E40002846EAF76FFC5C4986F8FF042846EAF7E3 ++:109E500069FC5A4986F800052846EAF763FC584928 ++:109E600086F801052846EAF75DFC564986F80205A2 ++:109E70002846EAF757FC544986F803052846EAF7CE ++:109E800051FC524986F804052846EAF74BFC504934 ++:109E900086F805052846EAF745FC4E4986F806058A ++:109EA0002846EAF73FFC4C4986F807052846EAF7BA ++:109EB00039FC4A4986F808052846EAF733FC484940 ++:109EC00086F809052846EAF72DFC464986F80A0572 ++:109ED0002846EAF727FC444986F80B052846EAF7A6 ++:109EE00021FC424986F80C052846EAF71BFC40494C ++:109EF00086F80D052846EAF715FC3E49A6F8140534 ++:109F00002846EAF70FFC4FF00042A6F816053A493A ++:109F10002846EAF7FBFB3949C6F810052846EAF758 ++:109F200001FC374986F824002846EAF7FBFB35494F ++:109F300086F823002846EAF7F5FB334986F8200027 ++:109F40002846EAF7EFFB61E0E7B902000CBF020028 ++:109F5000C5BD0200F2BD020077BD020044BC020094 ++:109F600096B902008DB902008DBE0200DDB9020073 ++:109F7000F6BF020001C00200CDB90200B2BC02006F ++:109F8000E3BC0200B9BE0200FFBE020033BC020007 ++:109F90003CBE02008CBF02009DBF0200B7BF0200A2 ++:109FA000FEC002000FC102002BC202004CC2020020 ++:109FB0006FBE02009ABE0200C7BE020020C10200AE ++:109FC0000CC0020056C1020068C102007AC1020042 ++:109FD0006DC202007FC2020031BA02005BBA020009 ++:109FE00074BB02009DBB020088BC0200A9BA02003B ++:109FF000FCBA020034BD020059BB0200B1C102002C ++:10A00000BDC102005DC2020046C00200B94985F828 ++:10A0100026062846EAF786FBB74986F8C103284694 ++:10A02000EAF780FBB54986F8C2032846EAF77AFBCF ++:10A0300086F8C30395F8261611B12846FFF720FCD1 ++:10A040004FF0FF32AE492846EAF760FB80B210F4C9 ++:10A05000004F18BF4FF0FF324FF0FF33A6F86200F9 ++:10A06000A6F8663018BFA6F86220A6F86830284621 ++:10A07000A449EAF723FB58B12846A249EAF752FB64 ++:10A0800080B210F4004F04BFA6F86600A6F868007E ++:10A0900028469D49EAF712FB48B128469A49EAF753 ++:10A0A00041FB80B210F4004F08BFA6F866002846B6 ++:10A0B0009649EAF703FB48B128469449EAF732FB90 ++:10A0C00080B210F4004F08BFA6F8680090494FF026 ++:10A0D000FF322846EAF71AFB4FF0FF32A6F8C40316 ++:10A0E0008C492846EAF712FB8B49A6F8C603284696 ++:10A0F000EAF718FB8949A6F8C8034FF4CF7228463F ++:10A10000EAF704FB8649C6F8CC0347F69A6228466C ++:10A11000EAF7FCFA8349C6F8D0030A222846EAF790 ++:10A12000F5FA8149C6F8D40308222846EAF7EEFA80 ++:10A130007E49C6F8D80341F26E022846EAF7E6FAED ++:10A140000A22C6F8DC037A492846EAF7DFFA794999 ++:10A15000C6F8E0032846EAF7E5FA7749A6F8E403EB ++:10A160002846EAF7DFFA96F8E83380B2A6F8E60365 ++:10A170002BB103B2002BC4BF0022A6F8E623502265 ++:10A180006E492846EAF7C2FA6D4986F8EA0328467E ++:10A19000EAF7C8FA6B4986F8EC032846EAF7C2FAF0 ++:10A1A000694986F8ED032846EAF7BCFA674986F85C ++:10A1B000EE034FF0FF322846EAF7A8FA644986F822 ++:10A1C000F0034FF0FF322846EAF7A0FA4FF0FF34D1 ++:10A1D00086F8F1035F49224686F8EF432846EAF7FE ++:10A1E00095FA5D4986F8F20322462846EAF78EFA88 ++:10A1F0005A4986F8590522462846EAF787FA584907 ++:10A2000086F85A0522462846EAF780FA554986F824 ++:10A21000F30322462846EAF779FA534986F85B05A4 ++:10A2200022462846EAF772FA504986F85C0522462B ++:10A230002846EAF76BFA4E4986F8F4032246284688 ++:10A24000EAF764FA4B4985F8DA0522462846EAF728 ++:10A250005DFA4949A6F8F60322462846EAF756FA77 ++:10A260004649A6F8F80322462846EAF74FFA444939 ++:10A27000A6F8FA0322462846EAF748FA4149A6F822 ++:10A28000FC0322462846EAF741FA3F49A6F8FE03B6 ++:10A2900022462846EAF73AFA3C49A6F80004224644 ++:10A2A0002846EAF733FA3A49A6F802042246284635 ++:10A2B000EAF72CFA0022A6F8040436492846EAF701 ++:10A2C00025FA0022A6F85E0533492846EAF71EFA69 ++:10A2D0000022A6F8600531492846EAF717FA00225D ++:10A2E000A6F862052E492846EAF710FA2D49A6F885 ++:10A2F000640559E04FBA020043BA0200A7C0020049 ++:10A300008DBD02004BC0020094C10200C0BB020020 ++:10A31000D2BB020067BF020035BB02005BC0020077 ++:10A32000A0BA0200BEBD0200D9BB02004DC10200AE ++:10A33000EBBD02009AC002007FBD0200BCBC02005F ++:10A34000AEBF020010BA0200DCBF020095BA0200E4 ++:10A3500002BD020032C1020039C0020090BB0200FF ++:10A36000A6BC02003EBB0200BBBA0200F0BB02006A ++:10A37000EBBE02001FBE0200C9BA02006DC002009F ++:10A38000B3BD02004CBB0200F4BC020016BF0200C9 ++:10A390005CBC02007AC002006EBF020059BF02001E ++:10A3A000D3C00200C6BC02002846EAF7BBF9B8F1E8 ++:10A3B000020F86F8060414D12846A449EAF77EF96C ++:10A3C000002800F0A382344600273A4628469F49D9 ++:10A3D000EAF796F90137C4F80C040434052FF4D1D8 ++:10A3E00016E0B8F1010F13D128469949EAF766F94A ++:10A3F000002800F08B82344600273A4628469449CC ++:10A40000EAF77EF90137C4F820040434052FF4D1AB ++:10A4100090494FF0FF322846EAF778F98E49A6F8BE ++:10A420003E044FF0FF322846EAF770F98B49A6F850 ++:10A4300040044FF0FF322846EAF768F98849A5F84A ++:10A44000DE0F2846EAF73AF930B128468449EAF7A0 ++:10A4500069F941F2EA23E852824928464FF0FF3277 ++:10A46000EAF754F941F23433E8527F492846EAF7D3 ++:10A4700025F930B128467C49EAF754F941F2EE2338 ++:10A48000E852284679490022EAF740F9C0B286F836 ++:10A490004D0358B176492846EAF744F97549C6F89C ++:10A4A00050032846EAF73EF9C6F860032846724989 ++:10A4B000EAF704F928B3D5F8B8006F49D8F7F6F9E8 ++:10A4C00006281ED1344600273A466B49D5F8B80015 ++:10A4D000D8F360F284F895037A1C6749D5F8B80080 ++:10A4E000D8F358F284F89703BA1CD5F8B80062493B ++:10A4F000D8F350F2033784F899030134062FE3D1DF ++:10A5000011E0012386F89533313386F896330E3304 ++:10A5100086F8973386F89833042386F899334FF0FA ++:10A52000FF3386F89A3355492846FF22EAF7EEF8BA ++:10A530004FF0FF03A6F85403A6F85633A6F8583395 ++:10A54000A6F85A3328464E49EAF7B8F828B3D5F8A2 ++:10A55000B8004B49D8F7AAF934460328B4BF80465F ++:10A560004FF00308002707E03A4628464449EAF737 ++:10A57000C7F80137A4F8540302344745F4DB06EB6F ++:10A58000470303F55473063304E0B6F85623013746 ++:10A5900023F8022C0233022FF7DD01223949284625 ++:10A5A000EAF7B4F8384986F840032846EAF7BAF8DB ++:10A5B000012286F84B0335492846EAF7A7F83449C3 ++:10A5C00086F841032846EAF7ADF8324986F84C038D ++:10A5D0004FF0FF322846EAF799F82F4986F84903E9 ++:10A5E0004FF0FF322846EAF791F82C4986F84A03E3 ++:10A5F0004FF0FF322846EAF789F8294986F85C03CC ++:10A600004FF0FF322846EAF781F8264986F85D03C5 ++:10A610002846EAF753F8002846D0012421490022B1 ++:10A6200086F8BB442846EAF76BF81E4986F8BC0456 ++:10A6300022462846EAF764F81A4986F8BD04022241 ++:10A640002846EAF75DF886F8BE042FE0E3BB020077 ++:10A65000EFBA02001ABD0200CCC002000CBE02001C ++:10A660000EBD02003CC202001EC0020066BB02001A ++:10A67000C8BF020050BD0200AFBB020037BF0200DE ++:10A68000A3C20200EAC002006ABC020016BB0200BC ++:10A6900022BF020079BA0200FBBD0200E5BF020042 ++:10A6A0004DBE020091C2020086F8BB04FF22994908 ++:10A6B0002846EAF72BF8FF2286F8BF049649284679 ++:10A6C000EAF724F8954986F8C0042846EAF72AF8FC ++:10A6D0000022A6F8C20492492846EAF717F8002299 ++:10A6E00086F818058F492846EAF710F8C0B286F8B0 ++:10A6F0001A05EB69DB685B6C03F00703052B03D9D4 ++:10A7000010B1002386F81A35874900222846E9F758 ++:10A71000FDFF864986F81C0500222846E9F7F6FF6A ++:10A72000834986F81D054FF0FF322846E9F7EEFF12 ++:10A73000804986F81E0500222846E9F7E7FF7E4992 ++:10A7400086F895054FF0FF322846E9F7DFFF7B4991 ++:10A75000A6F8200501222846E9F7D8FF784986F8AF ++:10A7600027054FF0FF322846E9F7D0FF7549A6F8D4 ++:10A770002A054FF0FF322846E9F7C8FF7249A6F8CC ++:10A780002C0500222846E9F7C1FF704986F83A05F2 ++:10A7900000222846E9F7BAFF6D4986F83B054FF0DD ++:10A7A000FF322846E9F7B2FF6A4986F83C05284699 ++:10A7B000E9F784FF30B128466649E9F7B3FF86F828 ++:10A7C000420503E04FF0FF3386F8423528466249E0 ++:10A7D000E9F774FF30B128465F49E9F7A3FFA6F80F ++:10A7E000440503E04FF0FF33A6F844355B492846A3 ++:10A7F0004FF0FF32E9F78AFF5949A6F8900528463D ++:10A80000E9F75CFF30B301245549002286F8524530 ++:10A810002846E9F775FF524986F85305224628462F ++:10A82000E9F76EFF4E4986F8540502222846E9F7FB ++:10A8300067FF4B4986F8550503222846E9F760FF74 ++:10A84000474986F8560504222846E9F759FF86F855 ++:10A85000570501E086F8520542494FF0FF3228467D ++:10A86000E9F754FF404986F858054FF0FF32284673 ++:10A87000E9F74CFF3D4986F859054FF0FF3228466D ++:10A88000E9F744FF3A4986F85A0500222846E9F7D5 ++:10A890003DFF384986F8700500222846E9F736FF63 ++:10A8A000032286F8800534492846E9F72FFF33490B ++:10A8B00086F881052846E9F735FF314986F8820593 ++:10A8C0002846E9F72FFF2F49A6F884052846E9F71F ++:10A8D00029FF2D49A6F886052846E9F723FF2B49CD ++:10A8E000A6F888052846E9F71DFF2949A6F88A0534 ++:10A8F0002846E9F717FF2749C6F88C0500222846A5 ++:10A90000E9F704FF86F89405012000E0002006B076 ++:10A91000BDE8F08145C102008CC10200DABA020034 ++:10A920001DBA0200CFBD02005EBE0200B2C002002E ++:10A93000ACBE020003BA0200FABB0200F1B9020089 ++:10A940002ABB020081BE020086BB02009FB9020042 ++:10A950009CBD0200D6BC02006DBA02000FBC020012 ++:10A960008ABA0200A6BD020039C0020090BB0200F4 ++:10A9700043BD02004DBC020022BC02007FBC0200AD ++:10A9800028C0020088C00200D9BE020047BF0200F2 ++:10A9900022BD0200CBC10200C36970B504460E4659 ++:10A9A00098684FF4B961DCF393F1C4F8A80000286B ++:10A9B0005CD000214FF4B962D7F342F3E369D4F8D5 ++:10A9C000A8501B6D13F4803F05D1012241F22403EE ++:10A9D00084F81A26E254E369D868E4F7B5FF41F237 ++:10A9E0000803E0500023EB63214B20462362214BF8 ++:10A9F00031466362204BA362204BE362204BA36786 ++:10AA0000204BE367204BC4F89030204BC4F88430CF ++:10AA10001F4B23631F4B63631F4BE3631F4B636435 ++:10AA20001F4B63651F4BA3651F4BC4F88C301F4B36 ++:10AA3000C4F888301E4BE3661E4BC4F89C301E4B96 ++:10AA4000C4F8A0301D4BC4F8A430FEF7D7FF68B19E ++:10AA50002046EBF757FD2046FEF73AFF30B120467F ++:10AA6000FEF790FF003818BF012000E0002070BD05 ++:10AA7000A9D00100E54A010091CD010055A20100D5 ++:10AA8000B9A001001D4F010075A901005DA90100D9 ++:10AA9000CD9B0100BD8701003D9C0100FD840100AC ++:10AAA0009D550100A15701007DCC0100C54B01005F ++:10AAB000B1530100198801001582010045CC010045 ++:10AAC00010B5014620B103680C221868DCF310F1C0 ++:10AAD00010BDC0462DE9F04105460F4600680C2127 ++:10AAE0001646DCF3F5F008B9044607E004460021F9 ++:10AAF0000C22D7F3A5F225606660A7602046BDE86A ++:10AB0000F081C04610B5044650B10649224640685F ++:10AB1000F9F31AF263682146D8688822DCF3E8F07A ++:10AB200010BDC04603E88600F0B5882185B0054613 ++:10AB30004068DCF3CDF0074608B904463BE000214D ++:10AB400088220446D7F37CF22B683D607B600026A8 ++:10AB500004212846194A1A4B0096019700F0EEF896 ++:10AB6000B042B86021DB174B019600930296039622 ++:10AB700078681549154A3B46F9F3AEF1A8B91E238A ++:10AB80007B610423FB7302233B74083301227B7433 ++:10AB90004FF6AF7384F82000FA773A73BA61A07465 ++:10ABA0006073A073BB83BA7705E068683946882272 ++:10ABB000DCF39EF00024204605B0F0BD5123850053 ++:10ABC00025238500811485002C1D020003E88600E2 ++:10ABD00070B50468CCB1D4F8F811A56829B1A8689B ++:10ABE000E4F34EF50023C4F8F831084928682246FA ++:10ABF000F9F3AAF1216819B168681C22DCF378F036 ++:10AC0000686821466269DCF373F070BD441D020080 ++:10AC10002DE9FF4740F2C45681468A461046314628 ++:10AC200017469846DCF354F00446002879D00021FA ++:10AC30003246D7F305F238461C21DCF349F00546CD ++:10AC4000206030B9384621463246DCF351F02846C0 ++:10AC500067E000211C22D7F3F3F122684FF0FF33A5 ++:10AC6000A36100254FF014036661C4F80890E76003 ++:10AC7000C4F804809571A4F808324FF02803A4F8B2 ++:10AC800006324FF02D03A4F804324FF0FA03A4F873 ++:10AC90000A320223146084F80C324FF06403A4F8E3 ++:10ACA0003E3284F80D5250461F4922462B46E4F3AB ++:10ACB00003F5C4F8F80108B30523C4F81C32373390 ++:10ACC000C4F8283204F51072184BC4F81822C4F8DE ++:10ACD000142204F53D72C4F82422C4F82022009303 ++:10ACE000134BD9F8000003931249134A23460195E8 ++:10ACF0000295F9F3F1F008B9206812E0D4F8F811E0 ++:10AD000011B15046E4F3BCF4216819B138461C2255 ++:10AD1000DBF3EEF73846214640F2C452DBF3E8F7A6 ++:10AD2000002004B0BDE8F087C13C8500F537850000 ++:10AD300035D201004C1D0200441D020070B5D0F850 ++:10AD400000451E46A3698E460F2B154602D94FF0CB ++:10AD5000FF3011E01801E1690133A361049B42183F ++:10AD60009360059B5660D36062694550D31C734461 ++:10AD700023F003036361104670BDC04610B5014661 ++:10AD800040B190F820200368D200D86802F5927292 ++:10AD9000DBF3AEF710BDC046C36908221B692DE97D ++:10ADA000F041073393FBF2F3DFB2FB0003F5927639 ++:10ADB00005463146C068DBF38BF708B9044614E05A ++:10ADC000044632460021D7F33BF104F12403E3614A ++:10ADD000FAB204F59273E36003EB820323614FF44C ++:10ADE0000373256084F8207063612046BDE8F0811C ++:10ADF0007047C0462DE9F04F3B4F89B038683B495A ++:10AE0000D7F3BAF50128DFF81881DFF8189157D089 ++:10AE1000DFF800C1364EDCF8001000220091354901 ++:10AE200013680968344D354C0291316834480193F8 ++:10AE300004912B68216803930691036831490593B7 ++:10AE40000B68DFF8D4E007932A4B02602E481A60A3 ++:10AE50000A602E4B08F10401D7F800A0DEF800B01C ++:10AE60003A60CEF80020CCF8002032602260091A47 ++:10AE7000013A2B60D7F3D4F5254B9842FCD11A4BFD ++:10AE80000099C3F800A0234B1960234B0021C3F89D ++:10AE900000B00A68214B1A60019A164B0A600299A9 ++:10AEA000039A1960144B04991A60114B059A1960A2 ++:10AEB000134B06991A60114B079A1960114B1A60CF ++:10AEC00098F81B3089F8003098F81C3089F8013068 ++:10AED00098F81D3089F8023098F81E3089F8033050 ++:10AEE00009B0BDE8F08FC046FC1E0200B81D02008C ++:10AEF00044EC000048EC000034EC000050EC000092 ++:10AF00004CEC000054EC000000000000DDBAADBBCA ++:10AF1000E320BBDE001F0200F81E020038EC000038 ++:10AF2000005903001C2802002DE9F04F91B0FFF7F3 ++:10AF300061FF684B1B68043B012B03D8664B186804 ++:10AF4000FFF756FFFBF7BEF800210746E0F3AEF12E ++:10AF500038460021E0F364F128B1036A002BBCBF3E ++:10AF60004FF0004303620EA90822B86BD7F3F6F244 ++:10AF7000FA6B0B9038460C92E4F7E6FC574E00F55E ++:10AF8000424000F5A870B0FBF6F00D903846E4F7AB ++:10AF9000DBFC04463846E4F7D7FC00F54248384667 ++:10AFA000E4F7DCFC00F5424A3846E4F7D7FC04F548 ++:10AFB000424408F5A87804F5A874B8FBF6F808FB35 ++:10AFC000164804463846E4F7C9FC00F542453846C1 ++:10AFD000E4F708FA00F542493846E4F703FA04F5C5 ++:10AFE000424405F5A87504F5A874B5FBF6F505FB14 ++:10AFF000164504463846E4F7F5F9394A00F542406B ++:10B00000019204F542440B9A00F5A870B0FBF6F0EB ++:10B010000AF5A87A09F5A87904F5A874BAFBF6FA36 ++:10B02000B9FBF6F9029200FB16460C9ADFF8D4B091 ++:10B0300003920D9A2B4B04922B492C4AB8FBFBF838 ++:10B04000B5FBFBF5B6FBFBF629480093CDF8148061 ++:10B05000CDF818A00795CDF820900996E6F724FBC7 ++:10B06000244840F60D0144F2F432FAF7AFFF48B13C ++:10B07000204840F6290144F2F432FAF7A7FF08B15C ++:10B08000002403E01C4A1D4B1A4C1A603846FDF799 ++:10B09000D7FA44F218334FF6FF72904214BF0246BB ++:10B0A0001A4640F612011648FAF790FF144B002892 ++:10B0B0000CBF194600214CB141B1104B20461B6812 ++:10B0C0005B689847236920465B689847384611B00B ++:10B0D000BDE8F08F54EC000050EC000040420F003F ++:10B0E000A0D60100ABFF8600BE1D0200C31D0200FA ++:10B0F000E8D102004C1F0200281F0200F8260000C1 ++:10B10000F81D0200A0860100776C25643A20427287 ++:10B110006F6164636F6D2042434D25642038303287 ++:10B120002E313120576972656C65737320436F6EE1 ++:10B1300074726F6C6C65722025730A0025733A2057 ++:10B1400042726F6164636F6D20534450434D4420DD ++:10B15000434443206472697665720A0073647063C5 ++:10B160006D6463646325640072737369736D663222 ++:10B17000673D2564007874616C667265713D256475 ++:10B1800000616132673D3078257800627734307035 ++:10B190006F3D30782578006C6564626825643D30C9 ++:10B1A0007825780074737369706F7332673D3078F7 ++:10B1B0002578007273736973617632673D25640088 ++:10B1C0006C65676F66646D3430647570706F3D30A8 ++:10B1D0007825780070613168696D61787077723DAB ++:10B1E0002564006D617870326761303D3078257874 ++:10B1F000007061316974737369743D2564006D6119 ++:10B200006E6669643D307825780073756276656E88 ++:10B210006469643D30782578002004D0023643FF0D ++:10B22000FF626F617264747970653D3078257800D3 ++:10B230006D6373256467706F25643D3078257800F1 ++:10B240006D616E663D2573006D61787035676C6168 ++:10B25000303D30782578006D61787035676C6131EC ++:10B260003D30782578006F66646D35676C706F3D92 ++:10B27000307825780072737369736D6335673D2587 ++:10B280006400626F617264666C616773323D30782E ++:10B29000257800747269736F32673D3078257800C5 ++:10B2A0007064657472616E676532673D30782578C9 ++:10B2B000006D63736277323035676C706F3D307844 ++:10B2C00025780000006D637362773230756C3567E6 ++:10B2D0006C706F3D30782578006D63736277343021 ++:10B2E00035676C706F3D30782578000000706131F3 ++:10B2F0006C6F6D61787077723D2564006D61787058 ++:10B30000326761313D30782578007278706F35672B ++:10B310003D2564006D63733332706F3D307825785E ++:10B320000073756264657669643D307825780069DC ++:10B330007474356761303D307825780069747435F0 ++:10B340006761313D30782578007061316D617870CA ++:10B3500077723D256400626F6172647265763D307C ++:10B36000782578006D6373627732303267706F3D95 ++:10B37000307825780000006D637362773230756C29 ++:10B380003267706F3D30782578006D637362773473 ++:10B39000303267706F3D307825780000006D637340 ++:10B3A0006277323035676D706F3D307825780000F8 ++:10B3B000006D637362773230756C35676D706F3D09 ++:10B3C00030782578006D63736277343035676D703F ++:10B3D0006F3D3078257800000073726F6D7265766E ++:10B3E0003D2564007770736C65643D256400706171 ++:10B3F000316C6F62303D2564007061316C6F623179 ++:10B400003D2564007061316C6F62323D25640070CF ++:10B410006125646725637725646125643D3078255F ++:10B42000780070613062303D2564007061306231B7 ++:10B430003D25640070613062323D25640072737393 ++:10B4400069736D6332673D2564007472693567689E ++:10B450003D25640075736266733D25640063636B0C ++:10B46000706F3D307825780074726935676C3D25C2 ++:10B4700064006F66646D356768706F3D307825785D ++:10B4800000616725643D30782578006578747061C7 ++:10B490006761696E35673D307825780070726F643A ++:10B4A0007563746E616D653D257300636464706FD0 ++:10B4B0003D30782578006C65676F66646D62773221 ++:10B4C0003035676C706F3D307825780000006C6512 ++:10B4D000676F66646D62773230756C35676C706F5C ++:10B4E0003D30782578006C65676F66646D627732F1 ++:10B4F0003035676D706F3D307825780000006C65E1 ++:10B50000676F66646D62773230756C35676D706F2A ++:10B510003D30782578006C65676F66646D627732C0 ++:10B5200030356768706F3D307825780000006C65B5 ++:10B53000676F66646D62773230756C356768706FFF ++:10B540003D30782578007278706F32673D25640051 ++:10B550007278636861696E3D30782578006974742B ++:10B56000326761303D3078257800697474326761E4 ++:10B57000313D3078257800616E7473776974636843 ++:10B580003D30782578007478636861696E3D307865 ++:10B5900025780070726F6469643D3078257800709A ++:10B5A00061306974737369743D25640063636B640F ++:10B5B000696766696C74747970653D2564006368B9 ++:10B5C00069707265763D2564006F66646D356770DD ++:10B5D0006F3D30782578006C656464633D30782574 ++:10B5E000303478006D61787035676861303D30784F ++:10B5F0002578006D61787035676861313D30782558 ++:10B60000780070613162303D2564007061316231D3 ++:10B610003D25640070613162323D256400627764CB ++:10B620007570706F3D30782578006D617870356782 ++:10B6300061303D30782578006D6178703567613113 ++:10B640003D3078257800616E74737763746C35676C ++:10B650003D30782578006D63732564672563706FCE ++:10B6600025643D30782578006D637362773230351C ++:10B670006768706F3D307825780000006D637362F5 ++:10B68000773230756C356768706F3D30782578009B ++:10B690006D637362773430356768706F3D3078253D ++:10B6A0007800000074726935673D2564006F706F23 ++:10B6B0003D25640076656E6469643D3078257800C8 ++:10B6C0006C65676F66646D627732303267706F3DAC ++:10B6D0003078257800006C65676F66646D6277323C ++:10B6E00030756C3267706F3D307825787061306DE1 ++:10B6F00061787077723D25640070613168696230ED ++:10B700003D256400706131686962313D25640070D7 ++:10B710006131686962323D256400637573746F6DD1 ++:10B7200076617225643D30782578007265677265B0 ++:10B73000763D3078257800626F617264666C61676F ++:10B74000733D307825780062786132673D2564006A ++:10B750006F656D3D2530327825303278253032786E ++:10B7600025303278253032782530327825303278DD ++:10B77000253032780064657669643D30782578003C ++:10B7800070612564677725646125643D307825788C ++:10B790000072737369736D6635673D2564006F666B ++:10B7A000646D3267706F3D30782578006161356770 ++:10B7B0003D30782578007770736770696F3D256438 ++:10B7C0000062786135673D25640075736265706E4F ++:10B7D000756D3D307825780074737369706F7335BB ++:10B7E000673D3078257800616E74737763746C32CE ++:10B7F000673D3078257800727373697361763567B9 ++:10B800003D2564006F66646D706F3D30782578006B ++:10B8100074726932673D25640073746263706F3DB2 ++:10B82000307825780063636F64653D307830006D53 ++:10B830006163616464723D25730063636F64653D99 ++:10B84000256325630063633D25640063636B326792 ++:10B85000706F3D30782578006363746C3D307825D7 ++:10B86000780072656777696E646F77737A3D2564D7 ++:10B870000065787470616761696E32673D30782564 ++:10B880007800626F6172646E756D3D25640074723C ++:10B8900069736F35673D307825780063636B627735 ++:10B8A00032303267706F3D30782578000000636376 ++:10B8B0006B62773230756C3267706F3D3078257807 ++:10B8C000007064657472616E676535673D30782518 ++:10B8D0007800000080000000FF0000000C00000065 ++:10B8E0000000000000040000FF0000000C00000049 ++:10B8F0000000000000000800FF0000000E00000033 ++:10B90000000000000200000001000400030000002D ++:10B91000010002000A00000002006000DC050000D7 ++:10B9200008071700747870777262636B6F66003275 ++:10B93000675F6367610072737369636F72726E6FC2 ++:10B94000726D00747373696C696D75636F640074F4 ++:10B95000656D70735F687973746572657369730080 ++:10B9600072737369636F7272617474656E003567A8 ++:10B970005F6367610074656D7074687265736800F9 ++:10B98000696E746572666572656E6365006D63737A ++:10B990003267706F30006D63733267706F3100749F ++:10B9A000786761696E74626C356700747373696F70 ++:10B9B00066667365746D696E35676C007473736960 ++:10B9C0006F66667365746D696E35676D0074656D5D ++:10B9D0007073656E73655F736C6F7065006D656124 ++:10B9E00073706F7765720072737369736D66326717 ++:10B9F00000706C6C646F75626C65725F6D6F64650E ++:10BA000032670069716C6F7374316F6666326700FC ++:10BA100072667265673033335F63636B00706C6CA2 ++:10BA2000646F75626C65725F656E61626C653267CA ++:10BA3000006F70656E6C706761696E696478613102 ++:10BA400034300065787470616761696E35670065D0 ++:10BA5000787470616761696E3267006F70656E6CD3 ++:10BA6000706761696E69647861313439007478692E ++:10BA7000716C6F7061673267006E6F6973655F63C9 ++:10BA8000616C5F7265665F3267006C6F67656E5FE1 ++:10BA90006D6F646500706163616C69647832670022 ++:10BAA00074656D705F616464006F70656E6C706763 ++:10BAB00061696E6964786131363500706163616C0B ++:10BAC000696478356768693100706163616C6174BD ++:10BAD0006832673100706D696E00706163616C700F ++:10BAE000756C7365776964746800706D6178007354 ++:10BAF000776374726C6D61705F3567006F70656E2F ++:10BB00006C7074656D70636F727200747373696DBD ++:10BB100061786E7074006E6F6973655F63616C5FEE ++:10BB2000656E61626C655F356700706163616C7042 ++:10BB30007772326700747869716C6F746600706137 ++:10BB400063616C69647835676C6F31007061636143 ++:10BB50006C61746835676869006F70656E6C7070D1 ++:10BB600077726C696D006E6F6973655F63616C5F9E ++:10BB7000646267006F70656E6C706761696E69649E ++:10BB800078613135330074786761696E74626C0076 ++:10BB9000706163616C69647835676869006F7065AE ++:10BBA0006E6C706761696E69647861313537006EFB ++:10BBB0006F6973655F63616C5F7570646174650064 ++:10BBC0006F66646D64696766696C747479706535F5 ++:10BBD000670070616763326700766261745F6D75DC ++:10BBE0006C740073776374726C6D61705F326700A0 ++:10BBF000706163616C616C696D0069716C6F636128 ++:10BC00006C70777232670076626174736D63006185 ++:10BC10006463726673657132670076626174736D16 ++:10BC2000660072786761696E6261636B6F666676E3 ++:10BC3000616C006F70656E6C706761696E696478C5 ++:10BC4000622564006F66646D3267706F007278679A ++:10BC500061696E74626C776C6267610070616361C8 ++:10BC60006C6174683567686931006E6F6973655F10 ++:10BC700063616C5F706F5F626961735F32670072EE ++:10BC800066726567303838006F70656E6C7067611A ++:10BC9000696E696478613136310064796E707772EB ++:10BCA0006C696D656E00706163616C69647835679D ++:10BCB000310074656D70636F7272780064616372D5 ++:10BCC0006174653267007061726670730070613014 ++:10BCD00062325F6C6F00747869716C6F706170753F ++:10BCE00032670074656D7073656E73655F6F707435 ++:10BCF000696F6E00706163616C61746835676C6F49 ++:10BD00003100706163616C69647832673100747806 ++:10BD1000616C706662797032670064616367633278 ++:10BD20006700756E6D6F645F727373695F6F6666CF ++:10BD3000736574006F70656E6C70766F6C74636F92 ++:10BD400072720072786761696E74626C31303000B3 ++:10BD50006E6F6973655F63616C5F6E665F7375625A ++:10BD60007374726163745F76616C00747373697469 ++:10BD70007864656C61790063636B3267706F006330 ++:10BD8000636B507772496478436F72720063636BC0 ++:10BD900064696766696C7474797065006C6F63635D ++:10BDA0006D6F646531006C6F696461636D6F6465AC ++:10BDB000356700706163616C617468356700746534 ++:10BDC0006D705F71007273736973617632670073AF ++:10BDD00070757261766F69645F656E61626C653201 ++:10BDE000670070613062315F6C6F00766261745F12 ++:10BDF00071006D61787032676130006E6F697365D4 ++:10BE00005F63616C5F7265665F3567006F66646D66 ++:10BE1000616E616C6F6766696C746277326700701F ++:10BE20006163616C61746832670070613062300018 ++:10BE30007061306231007061306232006F70656E27 ++:10BE40006C706761696E696478613336006E6F6922 ++:10BE500073655F63616C5F61646A5F356700697118 ++:10BE60006C6F63616C69647832676F666673006FCC ++:10BE700070656E6C706761696E69647861313030CD ++:10BE800000706163616C7077723267310072617744 ++:10BE900074656D7073656E7365006F70656E6C7040 ++:10BEA0006761696E696478613130340069716C6F03 ++:10BEB00063616C6964783267006F70656E6C707076 ++:10BEC00077726374726C006F70656E6C7067616915 ++:10BED0006E696478613130380072786761696E74B8 ++:10BEE000656D70636F727235676D0074785F746F23 ++:10BEF0006E655F706F7765725F696E646578006FFD ++:10BF000070656E6C707265667077720072737369BB ++:10BF1000736D63326700706163616C61746835676B ++:10BF200031006E6F6973655F63616C5F706F5F6234 ++:10BF30006961735F3567006E6F6973655F63616C1C ++:10BF40005F706F5F32670072786761696E74656DEC ++:10BF500070636F727235676C00706163616C6964E5 ++:10BF600078356731746800706167633567007061A8 ++:10BF700063616C69647835676C6F317468007473E1 ++:10BF800073696F66667365746D696E006F70656E58 ++:10BF90006C706761696E696478613430006F7065D8 ++:10BFA0006E6C706761696E696478613434007266C2 ++:10BFB000726567303333006F70656E6C70676169EE ++:10BFC0006E696478613438006E6F6973655F6361B0 ++:10BFD0006C5F686967685F6761696E007266726549 ++:10BFE00067303338006E6F6973655F63616C5F61E2 ++:10BFF000646A5F3267006D656173706F7765723177 ++:10C00000006D656173706F77657232006F70656E79 ++:10C010006C706761696E6964786131313600627095 ++:10C0200068797363616C650072786761696E7465C5 ++:10C030006D70636F7272326700706163616C696406 ++:10C040007835676C6F0061613267006F66646D649C ++:10C05000696766696C74747970650074656D705F8A ++:10C060006D756C74007662617473617600706163E3 ++:10C07000616C61746835676C6F00706163616C69D5 ++:10C08000647832673174680072786761696E7465CC ++:10C090006D70636F72723567680063636B5077729F ++:10C0A0004F6666736574007478707772696E646544 ++:10C0B000780069716C6F63616C69647835676F666D ++:10C0C00066730070613062305F6C6F00676D67632C ++:10C0D000326700706163616C6964783567686931E3 ++:10C0E0007468007278706F3267006E6F6973655F95 ++:10C0F00063616C5F656E61626C655F3267006F7073 ++:10C10000656E6C706761696E696478613532006F65 ++:10C1100070656E6C706761696E6964786135360050 ++:10C120006F70656E6C706761696E696478613131DA ++:10C130003200706163616C69647835670074656DA5 ++:10C140007073617600747269736F32670076626132 ++:10C15000745F616464006F70656E6C706761696EB6 ++:10C1600069647861313230006F70656E6C70676140 ++:10C17000696E69647861313234006F70656E6C701D ++:10C180006761696E6964786131323800747269641C ++:10C19000783267006F66646D64696766696C747491 ++:10C1A000797065326700696E69747869647832679E ++:10C1B0000068775F697163616C5F656E00697163C8 ++:10C1C000616C5F7377705F646973006D75785F672A ++:10C1D00061696E5F7461626C6500747373696F6628 ++:10C1E000667365746D617835676800747373696F21 ++:10C1F00066667365746D617835676C007473736916 ++:10C200006F66667365746D617835676D0074656D12 ++:10C2100070736D630074656D70736D660074737315 ++:10C22000696F66667365746D6178006F70656E6CBA ++:10C23000706761696E696478613630007478616C2A ++:10C24000706662797032675F63636B006F70656EF2 ++:10C250006C706761696E6964786136340066726516 ++:10C26000716F66667365745F636F7272006F70657D ++:10C270006E6C706761696E69647861313332006F2A ++:10C2800070656E6C706761696E69647861313336B0 ++:10C29000007874616C6D6F646500747373697469A0 ++:10C2A0006D65006E6F6973655F63616C5F706F5F72 ++:10C2B000356700747373696F66667365746D696E54 ++:10C2C00035676800B8C70200600000001200000077 ++:10C2D000000000002000000028C702002600000027 ++:10C2E0000E0000000000000010000000B4CC0200AE ++:10C2F000980000000D000000000000002000000079 ++:10C3000074C702004400000011000000000000009B ++:10C310000800000074D102001000000010000000AE ++:10C3200000000000080000000000000040000000C5 ++:10C3300080000000C00000000100000005000000B7 ++:10C3400002000000060000000A0000004A00000091 ++:10C350008A000000CA0000000A0100004A01000033 ++:10C360008A0100008A0500008A0900008A0D000089 ++:10C370008A1100008A5100008A9100008AD10000D1 ++:10C380008A1101008A5101008A9101008900000090 ++:10C390008AD101008A1102000000000000000000A4 ++:10C3A000000000000000000000000000000000008D ++:10C3B000000000000000000000000000000000007D ++:10C3C000000000000000000000000000000000006D ++:10C3D000000000000000000000000000000000005D ++:10C3E000000000000000000000000000000000004D ++:10C3F000000000000000000000000000000000003D ++:10C40000000000000000000000000000000000002C ++:10C41000000000000000000000000000000000001C ++:10C42000000000000000000000000000000000000C ++:10C4300000000000000000000000000000000000FC ++:10C4400000000000000000000000000000000000EC ++:10C4500000000000000000000000000000000000DC ++:10C4600000000000000000000000000000000000CC ++:10C4700000000000000000000000000000000000BC ++:10C4800000000000000000000000000000000000AC ++:10C49000000000000000000000000000000000009C ++:10C4A000000000000000000003001300410300131F ++:10C4B000004003001200410300120040030011007D ++:10C4C0004103001100400300100041030010004030 ++:10C4D000030010003E030010003C030010003A036C ++:10C4E000000F003D03000F003B03000E003D030062 ++:10C4F0000E003C03000E003A03000D003C03000D4B ++:10C50000003B03000C003E03000C003C03000C0049 ++:10C510003A03000B003E03000B003C03000B003B02 ++:10C5200003000B003903000A003D03000A003B032F ++:10C53000000A0039030009003E030009003C030023 ++:10C5400009003A0300090039030008003E0300080F ++:10C55000003C030008003A0300080039030008000B ++:10C5600037030007003D030007003C030007003AC3 ++:10C5700003000700380300070037030006003E03EE ++:10C580000006003C030006003A03000600390300E1 ++:10C5900006003703000600360300060034030005DA ++:10C5A000003D030005003B030005003903000500C2 ++:10C5B000380300050036030005003503000500338D ++:10C5C000030004003E030004003C030004003A039F ++:10C5D00000040039030004003703000400360300A0 ++:10C5E000040034030004003303000400310300049A ++:10C5F0000030030004002E030003003C030003008E ++:10C600003A03000300390300030037030003003638 ++:10C61000030003003403000300330300030031036D ++:10C6200000030030030003002E030003002D03006D ++:10C6300003002C030003002B030003002903000266 ++:10C64000003D030002003B0300020039030002002A ++:10C6500038030002003603000200350300020033F5 ++:10C6600003000200320300020030030002002F0327 ++:10C670000002002E030002002C030002002B030026 ++:10C6800002002A030002002903000200270300021F ++:10C69000002603000200250300020024030002001C ++:10C6A00023030002002203000200210300020020F5 ++:10C6B000030001003F030001003D030001003B03B4 ++:10C6C00000010039030001003803000100360300B7 ++:10C6D00001003503000100330300010032030001B3 ++:10C6E0000030030001002F030001002E03000100B1 ++:10C6F0002C030001002B030001002A030001002984 ++:10C7000003000100270300010026030001002503A8 ++:10C7100000010024030001002303000100220300A4 ++:10C7200001002103000100200004000400040004B3 ++:10C7300000040004000400040004000400040104D8 ++:10C7400080048204830484040004000400040004C0 ++:10C7500000040004000400040004010480048204B6 ++:10C760008304840485048604050506050705080579 ++:10C7700009050A05090C12181818090C12181818BE ++:10C7800000000C076F7A060C0F7B7E0105080B0E6C ++:10C79000110000000000000000000306090C0F1249 ++:10C7A000000000000000000000000306090C00006B ++:10C7B0000000000000000000000000000400000075 ++:10C7C0004000000080000000C000000001000000E8 ++:10C7D000050000004500000085000000C5000000C5 ++:10C7E00005010000450100008501000085050000ED ++:10C7F00085090000850D000089090000890D0000F1 ++:10C8000089110000895100008991000089D1000040 ++:10C8100089110100854D0000858D000085CD000047 ++:10C820008951010089910100000000000000000012 ++:10C8300000000000000000000000000000000000F8 ++:10C8400000000000000000000000000000000000E8 ++:10C8500000000000000000000000000000000000D8 ++:10C8600000000000000000000000000000000000C8 ++:10C8700000000000000000000000000000000000B8 ++:10C8800000000000000000000000000000000000A8 ++:10C890000000000000000000000000000000000098 ++:10C8A0000000000000000000000000000000000088 ++:10C8B0000000000000000000000000000000000078 ++:10C8C0000000000000000000000000000000000068 ++:10C8D0000000000000000000000000000000000058 ++:10C8E0000000000000000000000000000000000048 ++:10C8F0000000000000000000000000000000000038 ++:10C900000000000000000000000000000000000027 ++:10C910000000000000000000000000000000000017 ++:10C920000000000000000000000000000000000007 ++:10C9300000000000000000008000800080008000F7 ++:10C9400080008000800080008000810082008300E1 ++:10C9500084008500040105018000800080008000C3 ++:10C9600080008000800081008200830084008500B8 ++:10C9700004010501060107011901870188018901E8 ++:10C980008A018B0107001F004807001F00460700AF ++:10C990001F004407001E004307001D004407001C41 ++:10C9A000004407001B004507001A00460700190055 ++:10C9B0004607001800470700170048070017004601 ++:10C9C0000700160047070015004807001500460736 ++:10C9D000001500440700150042070015004007003D ++:10C9E00015003F0700140040070013004107001323 ++:10C9F000004007001200410700120040070011002C ++:10CA000041070011004007001000410700100040DE ++:10CA1000070010003E070010003C070010003A0716 ++:10CA2000000F003D07000F003B07000E003D070010 ++:10CA30000E003C07000E003A07000D003C07000DF9 ++:10CA4000003B07000C003E07000C003C07000C00F8 ++:10CA50003A07000B003E07000B003C07000B003BB1 ++:10CA600007000B003907000A003D07000A003B07DA ++:10CA7000000A0039070009003E070009003C0700D2 ++:10CA800009003A0700090039070008003E070008BE ++:10CA9000003C070008003A070008003907000800BA ++:10CAA00037070007003D070007003C070007003A72 ++:10CAB00007000700380700070037070006003E0799 ++:10CAC0000006003C070006003A0700060039070090 ++:10CAD0000600370700060036070006003407000589 ++:10CAE000003D070005003B07000500390700050071 ++:10CAF000380700050036070005003507000500333C ++:10CB0000070004003E070004003C070004003A0749 ++:10CB1000000400390700040037070004003607004E ++:10CB20000400340700040033070004003107000448 ++:10CB30000030070004002E070003003C070003003C ++:10CB40003A070003003907000300370700030036E7 ++:10CB50000700030034070003003307000300310718 ++:10CB600000030030070003002E070003002D07001C ++:10CB700003002C070003002B070003002907000215 ++:10CB8000003D070002003B070002003907000200D9 ++:10CB900038070002003607000200350700020033A4 ++:10CBA00007000200320700020030070002002F07D2 ++:10CBB0000002002E070002002C070002002B0700D5 ++:10CBC00002002A07000200290700020027070002CE ++:10CBD00000260700020025070002002407000200CB ++:10CBE00023070002002207000200210700020020A4 ++:10CBF000070001003F070001003D070001003B075F ++:10CC000000010039090C12181818090C121818180C ++:10CC100000000C076F7A060C0F7B7E0105080B0ED7 ++:10CC2000110000000000000000000306090C0F12B4 ++:10CC3000000000000000000000000306090C0000D6 ++:10CC4000000000000000000007001000390700107D ++:10CC500000380700100036070010003407001000ED ++:10CC60003307001000310700100030070010002FBC ++:10CC7000070010002D070010002C070010002B07E4 ++:10CC80000010002A070010002807001000270700E6 ++:10CC900010002607001000250700100024070010D0 ++:10CCA00000230700100022070010002107001000D9 ++:10CCB0002000000000000000400000000000000014 ++:10CCC00040000000000000004000000000000000E4 ++:10CCD00040000000000000004000000000000000D4 ++:10CCE00040000000000000004000000000000000C4 ++:10CCF00040000000000000004000000000000000B4 ++:10CD00004000000000000000400000000000001093 ++:10CD1000400000000000000048000000000000206B ++:10CD20004800000000000030480000000000004003 ++:10CD300048000000000000504800000000000060B3 ++:10CD4000480000000000005050000000000000609B ++:10CD50005000000000000070500000000000008043 ++:10CD6000500000000000009050000000000000A0F3 ++:10CD700050000000000000B050000000000000C0A3 ++:10CD800050000000000000D050000000000000E053 ++:10CD900050000000000000F050000000000000E023 ++:10CDA00058000000000000005900000000000010C2 ++:10CDB0005900000000000020590000000000003071 ++:10CDC0005900000000000040590000000000005021 ++:10CDD0005900000000000060590000000000000041 ++:10CDE00040000000000000004000000000000000C3 ++:10CDF00040000000000000004000000000000000B3 ++:10CE000040000000000000004000000000000000A2 ++:10CE10004000000000000000400000000000000092 ++:10CE20004000000000000010400000000000000072 ++:10CE30004800000000000020480000000000003012 ++:10CE400048000000000000404800000000000050C2 ++:10CE50004800000000000060480000000000005092 ++:10CE60005000000000000060500000000000007052 ++:10CE70005000000000000080500000000000009002 ++:10CE800050000000000000A050000000000000B0B2 ++:10CE900050000000000000C050000000000000D062 ++:10CEA00050000000000000E050000000000000F012 ++:10CEB00050000000000000705100000000000080E1 ++:10CEC0005100000000000090510000000000002010 ++:10CED0005900000000000030590000000000004030 ++:10CEE00059000000000000505900000000000060E0 ++:10CEF00059000000000000A059000000000000B030 ++:10CF000059000000000000000000000000000000C8 ++:10CF10000000000000000000080000000000000009 ++:10CF200008000000000000000800000000000000F1 ++:10CF300008000000000000000800000000000000E1 ++:10CF400008000000000000000800000000000000D1 ++:10CF500008000000000000000800000000000010B1 ++:10CF60000800000000000020080000000000003061 ++:10CF70000800000000000040080000000000005011 ++:10CF800008000000000000401000000000000050F9 ++:10CF900010000000000000601000000000000070A1 ++:10CFA0001000000000000080100000000000007071 ++:10CFB0001800000000000080180000000000009031 ++:10CFC00018000000000000A018000000000000B0E1 ++:10CFD00018000000000000C018000000000000D091 ++:10CFE00018000000000000E018000000000000F041 ++:10CFF00018000000000000001900000000000010F0 ++:10D00000190000000000002019000000000000309E ++:10D01000190000000000004019000000000000504E ++:10D0200019000000000000601900000000000070FE ++:10D03000190000000000008019000000000000003E ++:10D0400008000000000000000800000000000000D0 ++:10D0500008000000000000000800000000000000C0 ++:10D0600008000000000000000800000000000000B0 ++:10D070000800000000000010080000000000002070 ++:10D080000800000000000030080000000000004020 ++:10D0900008000000000000500800000000000040F0 ++:10D0A00010000000000000501000000000000060B0 ++:10D0B0001000000000000070100000000000009050 ++:10D0C0001100000000000070180000000000008047 ++:10D0D000180000000000009018000000000000A0F0 ++:10D0E00018000000000000B018000000000000C0A0 ++:10D0F00018000000000000D018000000000000E050 ++:10D1000018000000000000F01800000000000000FF ++:10D1100019000000000000101900000000000020AD ++:10D12000190000000000003019000000000000405D ++:10D13000190000000000005019000000000000600D ++:10D1400019000000000000701900000000000080BD ++:10D1500019000000000000A019000000000000B04D ++:10D1600019000000000000000000000000000000A6 ++:10D17000000000005F36291F5F36291F5F36291F18 ++:10D180005F36291F28C30200600000001200000063 ++:10D19000000000002000000038C902002600000046 ++:10D1A0000E000000000000001000000014CF02007C ++:10D1B000980000000D0000000000000020000000AA ++:10D1C00004CC020044000000110000000000000038 ++:10D1D0000800000074D102001000000010000000E0 ++:10D1E00000000000080000000A5254452028257362 ++:10D1F0002D25732573257329202573206F6E2042FA ++:10D20000434D25732072256420402025642E25641B ++:10D210002F25642E25642F25642E25644D487A0A17 ++:10D22000000000002DE9FF4106460D460846FC219E ++:10D2300017469846D9F34CF5044608B91E302DE040 ++:10D240000021FC22D4F3FCF60A9B04F1640204F1F1 ++:10D250006801009301920291304629463A464346BE ++:10D26000FBF73EFC206608B90B2017E040F61201E0 ++:10D270000022DDF3C3F700210A46E0662560206E38 ++:10D28000DDF3E0F52046F8F707FB206EFBF7EAFA3E ++:10D2900028462146FC22D9F32BF5002004B0BDE836 ++:10D2A000F081C04601BC600300104E03BFDE02F0F7 ++:10D2B0000C0E0280C12700000403BFDE02F00D6FD8 ++:10D2C000035B5E02F0000601BC6013001043000126 ++:10D2D0005E02F0000000025E02F0117A00025E02BF ++:10D2E000F0118F020200BF00007302045EFF000015 ++:10D2F0000E006B446557800E01846002F7F7BF0192 ++:10D30000BC6003000AAE00025E02F00F960202DE6D ++:10D31000FF000013006B44655620130182E002F702 ++:10D32000F7BF03BFDE02F005A200682B6F000018F4 ++:10D330000280DEFF000073006B44655B6073018454 ++:10D34000E006F577AB00025E02F0112F020480C701 ++:10D3500000001A028180C700001C01806002F7F7FC ++:10D36000BF01BC6003000AE200682B070000270031 ++:10D37000E844655837A1006DDE8557402300682BCF ++:10D380004300002700E844655A17A1006DDE855769 ++:10D39000402503BFDE02F0002701BC6003000AC283 ++:10D3A00001BC6003000AC101BC6003000AD001BCDB ++:10D3B0006003000AC80202DEB300002A0200420332 ++:10D3C00000002A00025E02F00B1602845EB3000029 ++:10D3D000730068AB0F0000730283DEB700002E02FB ++:10D3E0000180C700004800B02ACB0017A202802BA2 ++:10D3F000F300003500B02B230017A1006DDE855C23 ++:10D40000E06400685E8700003500682C0700003586 ++:10D4100000B02C070017A200682B0B00003A00E8B0 ++:10D4200044655857A1006DDE86F4406400E05E85D7 ++:10D4300055F7A1006DDE86F440640202DEBB0000F9 ++:10D440004800682ABB00004800E8446556D7A100A0 ++:10D45000E02ABB0157A2006EDE86F440420182E062 ++:10D4600002F5D7AE01BC6003000AAE03BFDE02F0D6 ++:10D47000004800E82ABAF437A100902ABB0037A27E ++:10D48000006E2ABEF4404600B02ABF0017A2006911 ++:10D49000DE86F4404803BFDE02F000640283DEB79C ++:10D4A00000005C028881AB00005A02035EB70000F6 ++:10D4B00073020480C700004D02005EFF00005A02A4 ++:10D4C0008080BF00005A0204DEB700005100682BC4 ++:10D4D0001708607303BFDE02F0005A028400C70021 ++:10D4E0000053028600C700005500682B0B00005A4D ++:10D4F00002812C4700005A00E844655737A1006DAF ++:10D50000DE8558005A006CC46557607300B04467EC ++:10D51000000ABB02845EB700007300025E02F011D5 ++:10D520004903BFDE02F0007301BC63FF1FF7A100D7 ++:10D53000684586F4205A0203C57300006402845EC5 ++:10D54000B7000064020100C7000073006B44655718 ++:10D5500080730020E3FE1460730282DEBB00007360 ++:10D5600002022C470000670282DEBB00006703BF97 ++:10D57000DE02F0005A028881AB0000730282DEB343 ++:10D58000000073028080BF0000730284DEAF0000E1 ++:10D590007302825EBB00007303A0DE02F0006F0224 ++:10D5A00000420300006F00025E02F00B1601836070 ++:10D5B00002F5B7AD0184E006F577AB01BC6003006E ++:10D5C0000AC300B04467000AC4018060020D906C79 ++:10D5D00003595E02F0007503D85E02F0007603D8AE ++:10D5E000DE02F0007701BC618300112900B0007BEE ++:10D5F00000112B01BC630300112303125E02F00A29 ++:10D600008F03975E02F00B2703D05E02F002F40353 ++:10D61000D0DE02F0051003D5DE02F00A4C03915E65 ++:10D6200002F005760396DE02F00A470288C1730015 ++:10D63000009E03C45E02F006E703C75E02F0071611 ++:10D6400003DCDE02F011CF03AA5E02F00759038665 ++:10D65000DE02F00A870287C037000A8703835E0272 ++:10D66000F008AB0391DE02F005F803C2DE02F00A17 ++:10D67000EC00025E02F00F9500025E02F0117A03E8 ++:10D68000D4DE02F0068103A3DE02F0000200025E97 ++:10D6900002F00C6300025E02F00EC403A25E02F010 ++:10D6A000009B03565E02F000980186600609104850 ++:10D6B000031F5E02F00098006A5E2300009700B02E ++:10D6C000002700178800E85E2300378803A65E0263 ++:10D6D000F0010500025E02F00F5D0028600E08E117 ++:10D6E0002803C4DE02F00B5E0020C20300213003D9 ++:10D6F000BFDE02F0017D03815E02F000A00300DEC8 ++:10D7000002F000820188E0020B905C03BFDE02F0B1 ++:10D7100002F1028740630000A20282C1070000A359 ++:10D7200001866006F43018028640630000A500B050 ++:10D730005E870017A10002DE02F00000028740634E ++:10D740000000A800B05E8B0010190186E006F430DE ++:10D75000180281DEAF0000AD0286C0630000AC009D ++:10D76000B05E870017A10002DE02F0000001BC607D ++:10D77000030280060280DE070000B901DA6002F0D1 ++:10D78000178002085E070000C901BC60031E17A1D4 ++:10D7900000E05E02F4306501BC60031C17A100E0EC ++:10D7A0005E02F4306401BC600300281803BFDE028F ++:10D7B000F000CF01105E030017A100885E870037DC ++:10D7C000A200E05E86F457A100E0015AF430630243 ++:10D7D0008600C30000C200B0560B00106200B054B7 ++:10D7E0000300106201BC600300281803BFDE02F0D2 ++:10D7F00000D100B0418F0010620109DE030017A1C3 ++:10D8000000885E870057A100E05E850597A100E0D3 ++:10D810005E8703C00601BC600300481803BFDE0238 ++:10D82000F000D101BC60070217A100E05E02F430F5 ++:10D830006501BC60070017A100E05E02F4306401DE ++:10D84000BC600318000601BC600300081800B05A51 ++:10D850000300106200B0580300106301050143008B ++:10D8600017A10088001AF420060002DE02F0000072 ++:10D8700001BC600306379201BC63FF1FF0C301BC0B ++:10D8800060031890E301BC63FF1FF0C501BC63FF98 ++:10D890001FF0C601BC63FF1FF0C700B02C5B001077 ++:10D8A000E500B02C5F0010E600B02C630010E7022A ++:10D8B00080AC470000E701BC600300101000B040DE ++:10D8C0004300180000B040470010E501BC600300B1 ++:10D8D000301000B0404300180000B040470010E690 ++:10D8E00001BC600300501000B0404300180000B0BD ++:10D8F00040470010E701BC63FF1FF0C40002DE02D6 ++:10D90000F0000000E840330097A100B0400B001782 ++:10D91000A3006D5E86F460EE00905E8F0037A30377 ++:10D92000BFDE02F000EF00905E870037A301BC600D ++:10D930001F1417A100E05E8EF437A301F041970099 ++:10D9400017A1006DDE86F461030287C1970000F71E ++:10D9500001385A030017A1013C5A030017A203BF64 ++:10D96000DE02F000F9013C5A030017A101385A0702 ++:10D970000017A200685E86F480FE00D85E8B003738 ++:10D98000A200E14196F4506500E1C19700306503C3 ++:10D99000BFDE02F000F100D85E8B0037A200E1414B ++:10D9A00096F457A100E1DE870037A101F05E870001 ++:10D9B00017A1006EDE86F4610401BC63FF1FF7A4AB ++:10D9C0000002DE02F000000020E38E090002031EC8 ++:10D9D000DE02F0010B039F5E02F0010B01BC60430D ++:10D9E0000117A100A84122F4304803BFDE02F00075 ++:10D9F0000200689B6F0000990208411F00010801A6 ++:10DA0000816005620B1000025E02F00B1600B00090 ++:10DA1000AB00108600B0016300108A00025E02F0C5 ++:10DA20000D9601BC600304179200B0003B00111D6D ++:10DA30000190600609104803A1DE02F00122018175 ++:10DA4000E00609104801BC600300904201BC60037D ++:10DA500000112D039EDE02F0012501846002F29781 ++:10DA60009400B0451700178F00B05E1700179002A2 ++:10DA700000441F00012001856002091048018160F7 ++:10DA80000700104701F0DE0F0037A100A044B6F4F4 ++:10DA90003145039EDE02F0012501BC613712B080E2 ++:10DAA00003BFDE02F0000200A044B42A314501BCED ++:10DAB000612712708003BFDE02F000020020E082C6 ++:10DAC000090002010CDE530017A101885E870010D7 ++:10DAD0004701BC60030050420108411F0017A1012B ++:10DAE0008CDE86F2979403BFDE02F000020002DEB5 ++:10DAF00002F000000020E07E09000200025E02F059 ++:10DB00000F670283C21F000002020280F300013A85 ++:10DB100000B044670017A1017C5E862357A30283EF ++:10DB20005EFF00013900E000FAF46830018360060E ++:10DB3000F7F7BF006BDE8D06013E0206D003000141 ++:10DB40004200E950862337A100E8D08A2357A2007B ++:10DB500069DE8B00014200025E02F00B160191604B ++:10DB60001684F42700E020C300883003BFDE02F0F3 ++:10DB700002CC00025E02F002CF020400BF00014AA4 ++:10DB800003945E02F000020020C28F02000200A097 ++:10DB9000428F01F78000685E002DC00200025E0225 ++:10DBA000F00B1603BFDE02F000040201C28F00007A ++:10DBB00002011400630017A100685E870060020084 ++:10DBC000025E02F00B160194600F00001800025E66 ++:10DBD00002F0015103BFDE02F000040114006300F3 ++:10DBE00017A100B05E870010A501BC601311106082 ++:10DBF00000685E8700015800E0418306D06000E8BD ++:10DC00005E870037A103BFDE02F00154028050C3DB ++:10DC1000000162018760040310A000B000630010DF ++:10DC2000B400B042D3001800008841830030B60130 ++:10DC3000BC60030B10B500B0006300B0B40317DE86 ++:10DC400002F0015F0397DE02F0016001806006864A ++:10DC500014300002DE02F000000020E01280417C5F ++:10DC6000018760040310A000B000630010B401BC81 ++:10DC700060030E10B500B0006300F0B401BC605743 ++:10DC80000490B600B000630010B401BC600302D081 ++:10DC9000B50207500B00017901BC600303D0B50148 ++:10DCA0008E6002F297940204500B0001720204D0BD ++:10DCB0000B00017201866006F2979400E042D700E3 ++:10DCC000D0B500A0500B1117A10068DE87110178B4 ++:10DCD0000186E006F2979400E042D70050B50207B3 ++:10DCE000D00B00017800E042D70090B500B042D7D9 ++:10DCF0000011E100B0006300B0B40317DE02F001D0 ++:10DD00007A0397DE02F0017B0002DE02F0000000E1 ++:10DD10006820DF000180006CC46506E00401BC607F ++:10DD200003000837006820D7000183006CC4650633 ++:10DD3000C00401BC60030008350020E0BE090002F9 ++:10DD400003905E02F0000403A25E02F001BE020234 ++:10DD500000BF0001880203C5730001B100682F6B8A ++:10DD600000018C00E844657B57A1006D5E857B2136 ++:10DD7000B101BC6003000BDA00682D9B0001B10209 ++:10DD800082C1070001B1028042030001B10285C5D2 ++:10DD9000230001B1028640370001B10181E006F5A0 ++:10DDA00077AB00B02D9F0017A101BC602F1077A2A8 ++:10DDB00001BC60030017A300025E02F0131200B062 ++:10DDC0002DA30017A101BC602F1777A201BC60032F ++:10DDD0000017A300025E02F0132001BC60131A17A3 ++:10DDE000A100025E02F000A200B040670417A2008A ++:10DDF000025E02F000A800E0446700D7A1006CC4F6 ++:10DE000066F4219F01BC60130ED7A100025E02F0F0 ++:10DE100000A200A040673FF7A201BC601314D7A185 ++:10DE200001BC62030017A300B05E8AF477A200026F ++:10DE30005E02F000A800B02D9F0017A101BC602F6A ++:10DE40000D37A201BC60030017A300025E02F013AD ++:10DE50001200B02DA30017A101BC602F13B7A201BF ++:10DE6000BC60030017A300025E02F013200181E0F2 ++:10DE700002F577AB01BC6003000B6600025E02F0A6 ++:10DE80000E74020200BF0001BD0284DEAF0001B8C3 ++:10DE900002035EB70001BD00025E02F010FB020348 ++:10DEA0005EB70001BD03BFDE02F0000202035EB7F1 ++:10DEB0000001BB020480C70001BD02805EFF0001BB ++:10DEC000BD00025E02F010BC03BFDE02F0000200E3 ++:10DED000025E02F00F670200421F0001D600684296 ++:10DEE000F30001C1006D42F30041D601140063004C ++:10DEF00017A100B05E870017A203A25E02F001CA5C ++:10DF00000183E0020D906C03145E02F001D8006EF4 ++:10DF1000C4568061D8028145230001D8006E5E8717 ++:10DF20000061D601BC60030077A200886006F45748 ++:10DF3000A300885E8B01001800E85E8B0037A2000A ++:10DF400020C28EF461D0006ADE86F441CA03BFDECF ++:10DF500002F001D6020400BF00020200900063013B ++:10DF60000165008085970217A100E064820DA1661B ++:10DF700000025E02F00F1D03BFDE02F0020201820A ++:10DF8000600209104803BFDE02F0000201BC60031A ++:10DF900000111500B0017F0017A6031F5E02F001FB ++:10DFA000E7020300C30001DD0020C28F0201E1038C ++:10DFB000255E02F001E70020C28F0201E1006881C6 ++:10DFC00053FFE00403BFDE02F001E301946013009D ++:10DFD000001803BFDE02F00202039EDE02F001E63B ++:10DFE0000068DE980BC1E60201411F000CB40185F8 ++:10DFF000600209104800685E980BC1EB00695E9FE3 ++:10E000000062070298428F0001EB03BFDE02F002BC ++:10E01000070201411F000CB4020400BF0001F2021C ++:10E0200018428F000CB400025E02F00EFF00025E88 ++:10E0300002F00F1D0194058700001803BFDE02F0F7 ++:10E040000202020013BB0001FB0200156B0001FE7F ++:10E0500000B013470017A10068DE84A7A1FB00B041 ++:10E06000134B0017A10068DE84A7C1FB00B0134F5B ++:10E070000017A10068DE84A7E1FB029E1397000150 ++:10E08000FE0201C28F0002000194600F000018031D ++:10E09000BFDE02F002020201C28F000200018060B6 ++:10E0A000060D906C0200C28F000CB4019460070052 ++:10E0B000001800025E02F00151020400BF000237A6 ++:10E0C000028500630002370183E0060D906C03BFF8 ++:10E0D000DE02F0023701BC60031810600129500B0A ++:10E0E00000179200B0017B001065006800EB000291 ++:10E0F0001000885A130117A100E84466F437A10004 ++:10E100006EDE8407421000E0029B0020A603BFDE03 ++:10E1100002F0067A019060120910480194601F0015 ++:10E12000001801085A0F00178101885E0681540A01 ++:10E1300001345A0F00178000025E02F000AF00B0F9 ++:10E14000017B00106500B056230017A100E05E8639 ++:10E15000A097A100E85E8400F40300E85E8400F468 ++:10E160001600B05A0300141300B05A07001414002C ++:10E17000B05A0B0014150068DE0700422800E800C2 ++:10E18000970057A101BC5E86F0141B017C5E8700DE ++:10E19000F41C00B0206300178100025E02F00D9AAB ++:10E1A00000B0017B00106501085A0F00178100B014 ++:10E1B0005E8700141E03BFDE02F0022B00B056176C ++:10E1C00000141B00B0561B00141C00B054130014A4 ++:10E1D0001E00B05013001086006D00A700823101B0 ++:10E1E00090016300108A00B0418F00106200025E4F ++:10E1F00002F0119C00B0422B00140601BC60031811 ++:10E2000017A1006DC18C20023401BC60030297A1EC ++:10E2100000E05E840377A100E05E86B0111D03BFBD ++:10E22000DE02F002AB020300C7000247020CD0037B ++:10E23000000247011400630017A102850063000279 ++:10E24000470080DE8701F7A201BC601B0257A200D5 ++:10E25000E05E8A0DB06500B041970014320080DEA8 ++:10E260008700B7A201BC60171FD7A200E05E8A0D2D ++:10E27000B06400B041930014330068D81300025218 ++:10E2800002005A1B0002490180600684F42703BF84 ++:10E29000DE02F005A20201D00300024900B0509B4B ++:10E2A00000142F0281D0C70002C900025E02F002F2 ++:10E2B000CF010BD0030017A1013C502B0017A20186 ++:10E2C0008C5E86F457A1014801430017A200685EE6 ++:10E2D00086F442520191601284F42703BFDE02F0FB ++:10E2E00002CC00025E02F0016300B0501300108601 ++:10E2F00000B0501700108A00682FC300025D029121 ++:10E30000D01700025B0291D01B00025B0291D01F6C ++:10E3100000025B0291D02300025B03BFDE02F00229 ++:10E320005D0191600284F42703BFDE02F002CC039A ++:10E33000A25E02F0028A020CD003000279020300FE ++:10E34000C700027800B050CB00106500025E02F0FA ++:10E350001235020350C700026601BC60230097A17A ++:10E3600000A85002F4340003BFDE02F0027D020474 ++:10E3700081AB000268006D4246C0800400B05A13B1 ++:10E3800000178000025E02F000B900B0540F0014C4 ++:10E390001E00B05A070017A100B05A1300178001E1 ++:10E3A000875A16F0178000B0418F00106500025E9A ++:10E3B00002F011A500E05E86A0740302875E0300F0 ++:10E3C00002770109DE030017A300E05E8B0077A24D ++:10E3D00000E05E8AF477A200885E8B0037A100E03F ++:10E3E0005E86F4508903BFDE02F0027D006D424A72 ++:10E3F000848004010650070017A1028CD00300029C ++:10E400007C00685E8700027D0182DE8686343101F1 ++:10E410008260028634310020D00304028300B050B1 ++:10E420004F0011F200B050530011F300B0505700EC ++:10E4300011F401BC60030091F003945E02F0028AC3 ++:10E44000020650030002860287DEAF00028A0281C4 ++:10E4500050030004F10202D0C70002890208502BC9 ++:10E4600000028A0285D003000508019060128634FC ++:10E470003103A25E02F0029700B0500F00111602A5 ++:10E4800002D0C700028F00B0505B0011160282D08C ++:10E4900003000297028147C30002900280504F00A0 ++:10E4A0000295002047C73F82970020C7DB00C2CB00 ++:10E4B00003BFDE02F0029703A55E02F0029702801E ++:10E4C000C7DF0002CB028850C70002B10129500B00 ++:10E4D000001792020300C70002A4020CD00300023E ++:10E4E000A4028350C70002A400B050CB0010650105 ++:10E4F000385A1300178001825A17005781010E5AAB ++:10E50000130017A1018E5E86F037810202D0C7008A ++:10E5100002B100B0501B00108A03BFDE02F002B14E ++:10E520000282D0C70002AB013850270017800108D3 ++:10E530005013001781010250130017A101825E865B ++:10E54000F0378100B0507F00108903BFDE02F00277 ++:10E55000B10138506F0017800108502B001781015E ++:10E5600006D0070017A101825E86F0378100B05007 ++:10E570001B00108A00B0508300108900025E02F078 ++:10E5800000AF00025E02F00D8D0102421B001781F8 ++:10E5900001825E0503178100025E02F00D9A00E021 ++:10E5A0005E840117A101D9DE8700108301BC6137A9 ++:10E5B00003B79100685E4B0282DF020400BF0002D5 ++:10E5C000BD028750030002BD03945E02F002BE0349 ++:10E5D000225E02F002C001BC610300308003BFDE96 ++:10E5E00002F0000201BC613303B791032BDE02F09D ++:10E5F00002C6009000630097A100E06482F43065D9 ++:10E60000006E5A130022C60188E006F237910068B6 ++:10E61000DE4B0482C801BC61BB03B79103BFDE02BD ++:10E62000F002DF0191600E84F42703BFDE02F002E6 ++:10E63000CC0191600684F42701BC60030010B40192 ++:10E6400081E00686343103BFDE02F005A2011C50D2 ++:10E650008F0017A100E0015EF43065010C5A4700FD ++:10E6600017A10080DE870197A200E0015E0DB06572 ++:10E6700002805A7F0002DE02815A7F0002DA020322 ++:10E68000DA7F0002DE00685A870002DE008860063A ++:10E69000F437A1002019FAF422DE00025E02F00B2A ++:10E6A000160191601E84F42700015E02F000000351 ++:10E6B000BFDE02F002CC0002DE02F0000003C4DE86 ++:10E6C00002F00B5E020650030002E70207DEAF0015 ++:10E6D00002E701BC6103003791020750030002E525 ++:10E6E00001BC620300F79100E0010B00204203BF70 ++:10E6F000DE02F002E801BC600300204200B05E4789 ++:10E70000001080020400BF0002F000B0058B001072 ++:10E7100064006E45170000020068DE4B0282EF00C5 ++:10E72000A044B42A314503BFDE02F0000200025EBD ++:10E7300002F00DA70068C51700000203D05E02F0CA ++:10E7400002F400025E02F00DA703BFDE02F0000239 ++:10E7500001836002F7F7BF01BC600300900400A8CA ++:10E76000412330104801BC620F0011E001816002BA ++:10E77000F5D7AE020200BF0003050068DE4B0202BF ++:10E78000FC00025E02F0130C0068DE4B062305025B ++:10E79000045EB30003050200456F00030500E84472 ++:10E7A000655737A100E82AB6F437A100695E8708EB ++:10E7B00023050183E0022B915C020701AB000305F6 ++:10E7C0000180E00209D04E0187E002F577AB0068D6 ++:10E7D000810B00230800B044670000430182E0067B ++:10E7E000091048018160020D906C01826006289139 ++:10E7F000440188E0020B905C00025E02F00F95017C ++:10E8000085E002F7F7BF0288421B0003100185E094 ++:10E8100006F7F7BF035B5E02F0031201BC60130052 ++:10E82000104301BC600300108501BC60030010B8F8 ++:10E83000008850770090B90208502B000319013866 ++:10E8400050730017A1017C506EF437A100885E87D9 ++:10E850000090B9020047A300031D01BC6003001132 ++:10E86000EA009042E70091EB00B047A300D1E80234 ++:10E870000047B300031F01B0E08E3D91EC01D2E0F0 ++:10E880000210908403A95E02F0041601BC6003002C ++:10E89000108400E001C30020700320DE02F0037347 ++:10E8A00001816006F5B7AD0068DE4B04A3370203B3 ++:10E8B000DEBB00032900E02C9300106503BFDE02DD ++:10E8C000F0032A01BC602301D06500A05E7FFE102A ++:10E8D000EC00B05A030010ED00B05A070010EE0033 ++:10E8E000B05A0B0010EF00B05A0F0010F001BC63DB ++:10E8F000FF1EF08401BC600300308501BC60030092 ++:10E9000010B401BC600301D0A601BC60030450B583 ++:10E9100001BC602304D0B400E002AF0020AB03BF11 ++:10E92000DE02F003BB0068DE4B05233D01BC600343 ++:10E930000010B401BC60071350A601BC600302D0F4 ++:10E94000B501BC602304D0B403BFDE02F00347006E ++:10E9500068DE4B0243540285C38F00034000E05E33 ++:10E960002700378901DA5E270010EE01BC63FF1F24 ++:10E97000F0CE01BC60030010B401BC600300D0A65F ++:10E9800001BC600303D0B501BC602304D0B400E037 ++:10E9900001D300207401BC61FF1FF08401BC60033F ++:10E9A000001085018460070011E00282DEB30004DC ++:10E9B000D802045EB30004D80183E00609104800C1 ++:10E9C000B0412300180001BC600306B78E0181E04E ++:10E9D00006F5D7AE00B054130017A100E05E840125 ++:10E9E00017A100885E8700708303BFDE02F004D8A1 ++:10E9F00001BC60031FF0840103DE530017A200680E ++:10EA0000121B00035900B0121B0017A2009019FA44 ++:10EA1000F457A202005EFF00035B01BC60030037F5 ++:10EA2000A200682B6F00035D01BC60030037A201E8 ++:10EA3000865E8A1C70E3006AC39300036700E843A4 ++:10EA40009000D0E40202421B0003650090001B000E ++:10EA500037A10020421B00436400B020B30017A17F ++:10EA600000E04392F430E40069C39300036701BC03 ++:10EA700060030010E400682B6F00036900E043911D ++:10EA80005C30E401BC60030010B401BC6003001002 ++:10EA9000A601BC60030210B501BC602304D0B40021 ++:10EAA000685E4B06A37100E001CB00207201BC60E0 ++:10EAB0000300083803BFDE02F003BB00E001CF0013 ++:10EAC000207303BFDE02F003BB03205E02F003C22B ++:10EAD0000181E00209104800E001D7002075031E03 ++:10EAE000DE02F003A201BC60030017A2006A5E23ED ++:10EAF00000037B0102428F0017A201855E8A091084 ++:10EB0000480180E0061030810284DE530003820059 ++:10EB1000B000770017A100E05E840437A100885E92 ++:10EB2000870057A100E05E870D57A103BFDE02F00A ++:10EB3000038301BC60030D57A1006800270003A2F6 ++:10EB400000E05E8401F7A101BC60230150650088EC ++:10EB500041970030B601BC60030010B400905E879E ++:10EB60000050A601BC60030110B501BC602300B0D9 ++:10EB7000B40317DE02F0038B0397DE02F0038C0070 ++:10EB800020DE870043950020DE8700239201B85ED7 ++:10EB900022D0168001805E8AD0368103BFDE02F06B ++:10EBA000039B01BC5E22D0168001845E8AD0368130 ++:10EBB00003BFDE02F0039B0020DE8700239901B82B ++:10EBC0005E22D0368101805E8AD0568203BFDE028B ++:10EBD000F0039B01BC5E22D0368101845E8AD05650 ++:10EBE0008201886002F430A800B05A030010B0001F ++:10EBF000B05A070010B1028042A300039E00E04219 ++:10EC0000A30090A800B05A0B0010B000B05A0F003B ++:10EC100010B10187600610908400E05E27003789FC ++:10EC200001DA5E270010EE01BC60030010B401BCE5 ++:10EC300060030350A600B000330010B50284DE5319 ++:10EC40000003AC00E0606803B0A600E04298043026 ++:10EC5000A600B000370010B501BC602304D0B40199 ++:10EC6000846006F2979401866002091048039EDED4 ++:10EC700002F003B60280441F0003B900B05E3F00FB ++:10EC8000114501BC600300178F00B05E430017857B ++:10EC900000B05E0F00179003BFDE02F003B900B0B2 ++:10ECA0005E0F0017850280441F0003B900A044B620 ++:10ECB000F0B14501BC600301104201836006F29788 ++:10ECC00094018460070011E003A05E02F004D60204 ++:10ECD000065EAF0004D80186E006F577AB01BC60A4 ++:10ECE0000300108000025E02F00B1C03BFDE02F086 ++:10ECF00005F803A15E02F0043D011400630017A1B2 ++:10ED00000068DE8700E3C70181600609104803BF81 ++:10ED1000DE02F0043D01816006F5D7AE011C508F84 ++:10ED20000017A100E0015EF43064010C58470004B4 ++:10ED3000870206508F0003D100B044670010F30033 ++:10ED4000B0446B0010F401BC63FF1FF0D301BC633F ++:10ED5000FF1FF0D400B042170310850020600E861C ++:10ED600023F5018760040310A000B000630010B415 ++:10ED700001BC60030B10B500B0006300F0B40203E7 ++:10ED800000C70003E3020CD0030003E3028050C776 ++:10ED90000003DB00B054130017A100E05E8680740E ++:10EDA0001A00B0506B0010E400B04213021084024D ++:10EDB00009502B0003E300B0421300308401D2E07D ++:10EDC0003AA030E0028050C70003E901D2E052A02F ++:10EDD00030E003BFDE02F003E90202D0C70003E91E ++:10EDE00000B0505F0010E000B050630010E100B0D0 ++:10EDF00050670010E200B0506B0010E400B0421306 ++:10EE000002F084020050C70003F000B0006300105D ++:10EE1000B401BC60030210B500B0006304D0B401BB ++:10EE20008460070011E001BC600300178E03BFDEA1 ++:10EE300002F004DA00E001C700207100B0006300B6 ++:10EE400010B401BC600302D0B500B0006304D0B4BC ++:10EE500003BFDE02F0046D01856006F7F7BF010312 ++:10EE600050030017A100B85E870037A101875E86B6 ++:10EE7000101080020CD00300043C020300C7000401 ++:10EE80000C00B050CB00106501BC6003001685007B ++:10EE9000E05A3300368C020350C700040100E05AE8 ++:10EEA0002700368903BFDE02F0043D01BC60030089 ++:10EEB00017B200B05A0B000B2501385A130017A1E6 ++:10EEC00001BC5A06F430E0013C5A130017A1017C42 ++:10EED0005A06F430E10181E0061090840185E007D4 ++:10EEE0000010E30185E0070010C30282D0C70004D0 ++:10EEF0001103BFDE02F004140202D0C700041600A2 ++:10EF0000B02A4B0017A101B8506EF430E000B050A9 ++:10EF1000730017A101B82A4EF430E10282421300B7 ++:10EF2000041400B0507B0010E400B04213021084BF ++:10EF30000185E0061C30E100B042130070840187B7 ++:10EF400060040310A0020300C700042B00B050CBE4 ++:10EF5000001065006D5ECAD1C41C0185E002187006 ++:10EF6000C300E05ECB00368E01BC601B09D065009B ++:10EF7000E04196F6506500B050970016800068DEBC ++:10EF8000CB00042301BC60230150B800682C97001B ++:10EF9000242903BFDE02F0043500B05ECB0010B5BB ++:10EFA00000B000630870B4028342D300042501BCA2 ++:10EFB00060030170B80068AC9700243501BC6003A1 ++:10EFC0000170B802BC506700043403BFDE02F004D5 ++:10EFD00033010CD0030017A103A95E02F004300135 ++:10EFE000BC60230150B800685E8700643303BFDE55 ++:10EFF00002F0043501BC60030170B800685E870050 ++:10F00000443501BC60030170B80181E0021710B8FB ++:10F0100001BC600300F0A501BC60030E10B500B098 ++:10F0200000630010B400B0006300F0B400B042D33D ++:10F03000001800018860080310B4018160060D907B ++:10F040006C03BFDE02F0046D0202D0C7000443006F ++:10F05000B0506F0010E000B050730010E100B050ED ++:10F06000770010E20282421300044200B0507B009D ++:10F0700010E400B0421302F08400E05E9F0037A766 ++:10F0800003A15E02F0044C01BC60030017A70187D6 ++:10F0900060040310A000B000630010B401BC600362 ++:10F0A0000E10B500B0006300F0B4018860080310D2 ++:10F0B000B403BFDE02F0046200B0017B0010650003 ++:10F0C000B05A030010E501BC63FF1FF0C500B05A41 ++:10F0D000070010E601BC63FF1FF0C600B05A0B002A ++:10F0E00010E701BC63FF1FF0C70068A0670004556C ++:10F0F00000E05E2700378900682067000459018519 ++:10F10000E0070010E30185E0070010C300B04213E0 ++:10F1100001108401DA5E270010EE0187600610906E ++:10F120008400B042131C108401BC60030010B400C2 ++:10F13000E0606803B0A600B000970010B501BC60A5 ++:10F140002304D0B4018460070011E003BFDE02F0A5 ++:10F1500004C601085E4B0017A100685E8700246D9D ++:10F160000202500300046C029E509F0004690201D9 ++:10F17000D00300046900E05E2700378901585E274C ++:10F1800000142D01DA50B70010EE018760061090D0 ++:10F190008403BFDE02F0046D01BC600300142D0186 ++:10F1A00004C1070017A10068121F00047200B0120A ++:10F1B0001F0017A1009019FAF437A103BFDE02F077 ++:10F1C000047403225E02F004740103DE530017A1ED ++:10F1D00000B05E870017A202005EFF00047701BC4A ++:10F1E00060030037A200682B6F00047901BC600344 ++:10F1F0000037A202885E4B00047C00685E4B0684E8 ++:10F200007C01BC60030017A20068921F00047E010D ++:10F2100083DE86F297940183DE8684F4270281C21E ++:10F220001300048401865E8B0010E30186600700F2 ++:10F2300010C30181E00610908403BFDE02F0048653 ++:10F2400001865E8A1C70E3018660061870C302B8EE ++:10F2500047A70004C202A047B70004C403A95E0286 ++:10F26000F0048E01085E4B0017A100685E87002441 ++:10F27000C3021E509F00048E0185E0061C70E3014E ++:10F2800085E0061870C3011400630017A10068DE52 ++:10F290008700849700B001530017A20068DE8BFF3F ++:10F2A000E493006842470024940068DE8A84C4978F ++:10F2B000018560020910480186E0021C70E30186A6 ++:10F2C000E0061870C3011050070017A600685E9B87 ++:10F2D0000004C301BC60030011E4013A50070017A9 ++:10F2E0008000885E0300778000E000AEF0106400CC ++:10F2F00068DE9B0044A80207D0030004A201BC60A2 ++:10F300002B12B7A200E05E000B37A300025E02F0F2 ++:10F310000DE801BC602307978100E0418301706321 ++:10F3200000E0418F00B06500025E02F00DBD01BC3F ++:10F33000602307506401BC60470017A200025E0210 ++:10F34000F00E1000685E9B0044C401A46046F47196 ++:10F35000E00068DE9B00C4B601BC611300B7A102E7 ++:10F360000600F30004AF01BC601300B7A10192C214 ++:10F370001AF437A203295E02F004B401BC60030052 ++:10F3800011EE009042E70091EF0192E00EF437A2F7 ++:10F3900000B05E8B0011EC03BFDE02F004C4006815 ++:10F3A0005E9B0064BB00685E9B00A4BB00B0502F56 ++:10F3B0000011E200B050330011E203BFDE02F0049E ++:10F3C000C4018760023D11E80068DE9B00A4BE0115 ++:10F3D0008760063D11E801BC60030011EA0090421D ++:10F3E000E70091EB0192C21B00B7A201B85E8A3D13 ++:10F3F00011E803BFDE02F004C4018460070011E0DD ++:10F4000001BC600300112D00B0448300142C03A341 ++:10F41000DE02F004D901BC600300178E00685E4B69 ++:10F4200005A4CA020050030004D30183E0060910BA ++:10F430004800B0412300180001BC600304B78E03EC ++:10F44000A95E02F004D800685E4B0424D801BC60B9 ++:10F450000306378E00685E4B05A4D801BC60030626 ++:10F46000B78E03BFDE02F004D801816006F577ABEA ++:10F4700000B05E0F00178500025E02F00DA701BC10 ++:10F48000600300178C01BC600300178D0323DE02AC ++:10F49000F004DA0187E0061070830185E002F5B719 ++:10F4A000AD03295E02F004EE020300C70004E90088 ++:10F4B000B050CB0010650282D0C70004E100E05AD2 ++:10F4C0002300368803BFDE02F004E200E05A270082 ++:10F4D000368900682C970024E900E05ECB0037B243 ++:10F4E000010A5ECB0017A100E050CAF4306500D0DD ++:10F4F0006006F657A200205A1AF444E903BFDE0260 ++:10F50000F004E300025E02F00F9503D5DE02F00A7C ++:10F510004C03D6DE02F00A640350DE02F004E90375 ++:10F52000BFDE02F0051002055EAF0004F00187E0C7 ++:10F530000626713303BFDE02F000020190600A86E6 ++:10F5400034310282D0C70004FA013C5027001780F2 ++:10F550000109502B001781010750070017A10182F4 ++:10F560005E86F0378100B0501F00108A00B0500F47 ++:10F5700000111603BFDE02F005000138505F0017CE ++:10F5800080010A502B0017810107D0070017A10145 ++:10F59000825E86F0378100B0502300108A00B050A0 ++:10F5A0005B001116020300C7000505020CD0030022 ++:10F5B000050502085E07000505013854070017809D ++:10F5C0000190422AA1308A028050C700050E01BC7A ++:10F5D000600305B79203BFDE02F0028F0190600660 ++:10F5E000863431020300C70004F2020CD003000489 ++:10F5F000F200B0001F0017A100E05E8680741A03BD ++:10F60000BFDE02F004F201BC600306379203BFDEE6 ++:10F6100002F0028F02055EFF00051F01856002F700 ++:10F62000F7BF032BDE02F0051F020000F3000516F2 ++:10F6300000E8002300514201BC600A2851420394B3 ++:10F640005E02F0051B00B0058B00106400685803D3 ++:10F6500000051B00B0446700111200B058030011F0 ++:10F66000150068451F00051F03A25E02F0051F017B ++:10F6700085E006F577AB00025E02F00ED70201C20C ++:10F68000E3000549020300C700052400682C970029 ++:10F690002534006E4246F6453403BFDE02F00526EF ++:10F6A000006E4247002534020300C70005310355B0 ++:10F6B000DE02F00526018060028614300138508396 ++:10F6C0000017A100B050CB001065006DDA32F42AAB ++:10F6D0004C00A84123141048011400630010650079 ++:10F6E000E041970ED06500E05A0300368001BC620D ++:10F6F0001F0011E003BFDE02F000040181E0068676 ++:10F7000034310191600E84F42703BFDE02F0054915 ++:10F71000013C50670017A101AC5E861750BA01BCCE ++:10F7200060030190B8020300C70005430068AC976E ++:10F7300000253E0181E0021710B803D5DE02F00A71 ++:10F740004C03D6DE02F00A640350DE02F0053A03F1 ++:10F75000BFDE02F0054900E82C97002B2500B05EC3 ++:10F76000CB0010B500B000630870B4028342D30030 ++:10F77000054103BFDE02F005440186E0040310A04A ++:10F7800000025E02F0015A03D5DE02F00A4C03D6F5 ++:10F79000DE02F00A640350DE02F0054503BFDE021C ++:10F7A000F0031001BC600300F0A50182E002091023 ++:10F7B0004801BC621F0011E001BC60030011EC01B4 ++:10F7C000BC600F0011E80285500B000550018260FB ++:10F7D0000209104803A0DE02F0055403D5DE02F052 ++:10F7E0000A4C03D6DE02F00A6403205E02F00556DE ++:10F7F0000188600209104803BFDE02F0000401BC6A ++:10F8000060030037A100025E02F00C5303A3DE0286 ++:10F81000F00004020050C700056201BC6003001044 ++:10F820008001826006091048018060028634310040 ++:10F8300068921F0005600104C1070017A10183DE63 ++:10F8400086F2979400E001CB00207203BFDE02F045 ++:10F85000017D00B0010B0017A1006DDE840805A238 ++:10F8600000E844640877A1006E5E840825A2018741 ++:10F87000E006F577AB020200BF000575028881AB98 ++:10F88000000575028400C70005750129500B00179B ++:10F89000A10068DE870205750282DEBB00057502E5 ++:10F8A00003C5730005740283DEB30005740282DEB3 ++:10F8B000BB00057100682B07000575006DDE2F0188 ++:10F8C000E5750182E006F7F7BF00E04465564AB1EE ++:10F8D00003BFDE02F0000403BFDE02F005A20282D5 ++:10F8E0005EAF00058501826006F577AB00B0446726 ++:10F8F00000082300B0014B0017A20208421B0005BC ++:10F900007C00B0016B0017A200685E8B00058200CE ++:10F9100090452B0097A10080DE86F457A1006E2051 ++:10F92000D60DA58200B041B700083500E020D623EF ++:10F9300028360185E002F5B7AD02055EAF0005850A ++:10F9400001BC610300113300E844650477A500B0F1 ++:10F950004467000BDA006D5E97010080020200BF71 ++:10F960000005940068DE4B06A58B0184E002F7F7E2 ++:10F97000BF0068DE4B04058E0282DEB300058E01F7 ++:10F98000BC6003000B1202045EB30005910068DE48 ++:10F990004B06259100025E02F0112300025E02F088 ++:10F9A0000F9603A3DE02F005940183E002F597AC05 ++:10F9B00001BC60131497A100025E02F000A201BC1A ++:10F9C00063830017A100A04066F437A20068DE8AB6 ++:10F9D000F425A001BC60130E77A100025E02F000C6 ++:10F9E000A200A040673FF7A200985E8B0037A200FC ++:10F9F000685E8B00059F0068DE8B0FE5A001BC6090 ++:10FA00002300104301826002F577AB03D15E02F060 ++:10FA10000002020050C30005F10325DE02F005A636 ++:10FA20000183600684F42703BFDE02F005D8020CD0 ++:10FA3000D0030005D6020300C70005C5011400630A ++:10FA40000017A1006DDE870085D601BC600300179A ++:10FA50008000B050CB00106500B050CF00106401A2 ++:10FA60008160060D906C0182600686343100B05AC8 ++:10FA7000230017A101BC600300168801BC5A2AF4B8 ++:10FA800037A101BC600300168A00B05E8700148FA6 ++:10FA900000B05A270017A101BC600300168901BC01 ++:10FAA0005A2EF437A101BC600300168B00B05E87AC ++:10FAB00000149000B05A1B00148D00B05A1F00149F ++:10FAC0008E01BC60030016040068DE030005C2025C ++:10FAD0000350C70005C10100509F00178001805EE0 ++:10FAE0000291B48D01BC5E0292149001BC600300CF ++:10FAF000378000025E02F0128100B05E0300148CB9 ++:10FB000003BFDE02F005D10068C2470005CA0181CB ++:10FB1000E0068634310191600E84F42701BC600355 ++:10FB200000143003BFDE02F0000200B0509F001747 ++:10FB3000A100025E02F0015900B05E8700142701A7 ++:10FB400086E0040310A000B04283001800010CD02E ++:10FB5000030017A10068DE870065C5010250C700D9 ++:10FB600017A101805E8684F427018AE00E84F427C1 ++:10FB700000B050BF00142603BFDE02F005D8018696 ++:10FB8000E0040310A00200509F0005D80286C107C0 ++:10FB90000005EC03295E02F005DD00B052330014CD ++:10FBA0002D00B052370017A1019E5E8684F4270015 ++:10FBB000B0509F0017A10180DE86F437A100B0503D ++:10FBC000BB00108F00B050B700108E00B0509B00EB ++:10FBD000108D01806006F4308C020250C70005EBE6 ++:10FBE00000B0524300108F00B0523F00108E00B0A2 ++:10FBF000523B00108D011A52370017A10198DE8781 ++:10FC00000437A101B85E8691B08C0182600286340F ++:10FC100031018160020D906C0325DE02F005EF01D9 ++:10FC20009C600284F42703BFDE02F005F3028550D6 ++:10FC30000B0005F100A850C70D143101BC60030092 ++:10FC4000143001816002F5D7AE0183600284F4278D ++:10FC50000185E00209104801BC600300142E03A2D4 ++:10FC60005E02F0017D03BFDE02F000040323DE022A ++:10FC7000F0065C03A35E02F0065C03A2DE02F0065F ++:10FC80005C01816006F577AB03AA5E02F0065C01B9 ++:10FC900083E0020910480351DE02F0061B02045EF5 ++:10FCA000B300060801846002F597AC0183E0020905 ++:10FCB000104800B02B5F0017A1006D2B0EF420023E ++:10FCC00000E0027B00209E01BC6003000AC300022A ++:10FCD0005E02F0112603BFDE02F000020203DEB373 ++:10FCE0000006180183E002F597AC00E02A9B002A89 ++:10FCF000A602015EBB00061800B02A9F0017A100F3 ++:10FD00006D2A9AF4261301BC6003000AA600E002E3 ++:10FD10007F00209F03A95E02F006160191601A84FD ++:10FD2000F42703BFDE02F002CC01BC63FF1FF7A182 ++:10FD300000025E02F00C5303295E02F006180191E6 ++:10FD4000601A84F42703BFDE02F0061800E0026B9D ++:10FD500000209A0180E006F577AB03BFDE02F006D3 ++:10FD6000200301DE02F0061E00685E4F06261E011B ++:10FD7000BC60030017A803A45E02F0062003C1DEE6 ++:10FD800002F0065F01846002091048020400BF000F ++:10FD9000062501BC6003001115011400630017A1C2 ++:10FDA00000E06602F4306500025E02F00DAC0182F4 ++:10FDB000600209104803A95E02F0064000685E3B3D ++:10FDC00004A63001F0DE1700378500A05E16F0971C ++:10FDD0008500685E3B0626300201500300062F02B4 ++:10FDE0008780BF00062F0185E0060910480280D0F9 ++:10FDF0000300064000B05E1B0017A300B0008B009C ++:10FE000017A4020400BF000636006E419730663624 ++:10FE100001185A030017A3011A5A030017A4006817 ++:10FE2000C18318063900E002930020A403BFDE025C ++:10FE3000F0063B006D5E2EF4863B0182E0068634C0 ++:10FE40003100E05E3300378C0068DE32F4663E003D ++:10FE5000B05E0F001785006DDE2EF4664C03BFDE2A ++:10FE600002F0065700B05E1F0017A300B0008F001D ++:10FE700017A4020400BF000646006E419730664694 ++:10FE8000011C5A030017A3011E5A030017A4006D9A ++:10FE90005E2EF486480182E00686343100E05E374B ++:10FEA00000378D0068DE36F4664B00B05E0F001739 ++:10FEB00085006D5E2EF466570185E0020910480347 ++:10FEC000D1DE02F0064E00025E02F00DA70068418E ++:10FED0008318067A020300C7000655020CD00300FF ++:10FEE0000655028350C70006550068DE4B05A6552F ++:10FEF00003BFDE02F011FF0181E00686343103BF4B ++:10FF0000DE02F005A200025E02F00DA70181600290 ++:10FF100009104803295E02F0065C028300C7001145 ++:10FF2000FF03BFDE02F005A203D1DE02F0065D038F ++:10FF3000A5DE02F005A203BFDE02F00004020650B7 ++:10FF40000300066500B001030017A1006D810AF4EB ++:10FF5000266500E844640877A1006E5E8408266583 ++:10FF60000187E006F577AB01085E4B0017A100683A ++:10FF70005E8700266800B05E0F00178500025E02F3 ++:10FF8000F00DA700685E3B06266E01BC60030017FB ++:10FF90008C0200D00300067301BC600300178D03C0 ++:10FFA000BFDE02F0067301BC600300178C02030081 ++:10FFB000C700017D020CD00300017D019C6002841A ++:10FFC000F42703BFDE02F0017D0068418318067943 ++:10FFD0000180600684F42703295E02F005A20182F5 ++:10FFE0006006863431028300C70011FF03BFDE02C2 ++:10FFF000F005A200E002970020A50181600209102F ++:020000023000CC ++:100000004801BC600300081900E0017B00A05E010C ++:10001000BC601310D7A1006D017AF4200401BC600C ++:100020001309405E03BFDE02F0000400025E02F02E ++:100030000B160338DE02F00004039EDE02F000041B ++:1000400000E8444C00F7A100E85E840117A1006AB3 ++:10005000DE8401068A00E85E8401118701BC60032A ++:1000600000118801A5E02230118001BC600300115D ++:100070001301BC600300111400B044670017A10015 ++:10008000B0446B0017A200B05E8700110400B05EA0 ++:100090008B00110503B8DE02F0068C03BFDE02F010 ++:1000A000000401BC600304B79201BC60030417A103 ++:1000B00001BC63FF1FF0CB01BC63FF1FF0CC01BC90 ++:1000C00063FF1FF0CD01BC63FF1FF0CE01BC63FFD7 ++:1000D0001FF0CF01BC63FF1FF0D000B0521700101B ++:1000E000E801BC63FF1FF0C800B0521B0010E9011B ++:1000F000BC63FF1FF0C900B0521F0010EA01BC63CF ++:10010000FF1FF0CA01BC60030010E4028600C300B8 ++:1001100006AD00B0540F0017A20069DE8A9086A5D4 ++:1001200000E85212F450E40068A0630006AD01BC80 ++:1001300060030010E400B054270010E000B0542F1A ++:100140000010E103BFDE02F006B603A4DE02F008F1 ++:10015000AB03A9DE02F008AB01BC600301D7A1022A ++:100160000600C30006AF0280DE5F0006B400B05494 ++:10017000070010E0006820630006B201D2DE86A00E ++:1001800030E000B0540B0010E103BFDE02F006B611 ++:1001900001BC5E869010E001BC601F0010E101BC54 ++:1001A00060030010E200B052230010E501BC63FFC1 ++:1001B0001FF0C500B052270010E601BC63FF1FF01E ++:1001C000C600B0522B0010E701BC63FF1FF0C70050 ++:1001D000B0004700108601082063001781013852E3 ++:1001E000030017800102C0270017A600025E02F07C ++:1001F0001198006820630046C400B05407001780BF ++:1002000000025E02F00D8D006820630026CD0068BC ++:10021000A0630006C8021A54070006CD006800A7B4 ++:100220000106CB0103C0270017A103BFDE02F006C1 ++:10023000CC0106C03B0017A101825E8610D0860368 ++:10024000A9DE02F008EB00685E4F0426DF01BC6304 ++:10025000FF1FF0C300685E4F05A6D501BC60031AFE ++:1002600090E301BC600306B79200685E4F0526DF8D ++:1002700003BFDE02F006D901BC6003063792029884 ++:1002800044070009C0028046070009C001BC6003A2 ++:100290001890E300B0206300178100025E02F00DA9 ++:1002A0009A00E85E8400D7A1006A5E869086DF002F ++:1002B000E85212F430E403BFDE02F006E201BC6053 ++:1002C000030010E40338DE02F006E20187E0061CBA ++:1002D00090E40190600A09104801BC610304379161 ++:1002E00000685E4F05A9C003835E02F008AB03BF40 ++:1002F000DE02F0000201866002F7F7BF0182E00231 ++:10030000F5B7AD0185E002F5B7AD02044163000623 ++:10031000F2018460020B105802055EAF0006EE0188 ++:1003200087E006267133020400BF0006F10185E074 ++:1003300002F577AB00025E02F00ED703BFDE02F0DB ++:1003400000020283C0370006FA006CC4656C26FB0D ++:1003500001BC601B1A77A100025E02F000A20180BE ++:10036000E0060337A200025E02F000A80180E0026E ++:10037000F457A200025E02F000A800E044656C4B56 ++:10038000610285C52300070A018460060B1058022C ++:1003900000DEFF0007010180E002F7F7BF00682BD5 ++:1003A0006F00070100E044655B4ADB0207AC0F0009 ++:1003B000070A0280456F00070A01BC63FF1FF7A10F ++:1003C0000068DE862C270A01BC60130217A1000218 ++:1003D0005E02F000A201882C0E0337A200025E022A ++:1003E000F000A801BC6003000B0302055EAF00072C ++:1003F0000C01BC6103001133020580BF000712012C ++:10040000BC60131157A100025E02F000A2019660C9 ++:100410000E03301900B040670017A200025E02F020 ++:1004200000A80283C03700000400E0021F002087FC ++:100430000182600628914403BFDE02F000040281BD ++:100440004013000002020042030007190184600209 ++:10045000F597AC01BC600300108003A3DE02F00737 ++:100460001C0190600209104800B0446700179E000C ++:10047000B0446B00179D00B0446F00179C00B0445F ++:100480007300179B0068DE7A23271C00E00223001C ++:1004900020880115403B00179700B001430017A1C9 ++:1004A00001C9DE8405280501BC6003107795019120 ++:1004B000E0020D906C0286403700072A00E002BB84 ++:1004C0000020AE03BFDE02F00A8A01BC6003001404 ++:1004D0008001BC600300148101B8600A049024010B ++:1004E000BC600304082B01BC600300482A01BC6007 ++:1004F0000300D02A01B3600700100401BC600300B0 ++:10050000080E01BC600300080F01BC600300081066 ++:1005100001BC60030008110183E002F5D7AE028739 ++:10052000C037000A8600025E02F0117A00025E0205 ++:10053000F00F9503435E02F00736006D403300CAAA ++:10054000F700685E5F00474E00685E5F00274B0063 ++:100550006800A700C740006800A701074000688046 ++:10056000A700A74100E0446690283701BC62C300A1 ++:1005700017A102805203000744019652030017A1FD ++:100580000080DE8690379A0203520300074900E09C ++:100590005E6A90379A0207D20300074900E85E6B53 ++:1005A00000379A029E5E6B000AF703BFDE02F00777 ++:1005B000530152D2030017A10185D206F4379A03E2 ++:1005C000BFDE02F00753013C52030017A101BC52E9 ++:1005D00006F4379A006E5E680BAAF700682FC30016 ++:1005E0000753028E5207000AF70204C03B00075D62 ++:1005F0000181E0060D906C02874037000A8A0002F4 ++:100600005E02F0117A00025E02F00F950287C0AF21 ++:100610000007550287C0AF000A86015840AF001797 ++:100620009A01BC603F1E17A1006DDE6AF42A8603A2 ++:100630005B5E02F0075F01BC601300104300B04135 ++:100640002328104801806002F297940184E0020997 ++:100650001048015840AF00102A006840AB002A86BD ++:1006600001BB5E5600900402035E5700076E020055 ++:1006700047A300076B01BC621E3C11E001BC600394 ++:100680000011EA00B05E6B0011EB0198601E3D1195 ++:10069000E8020047B300076E00B05E6B0011EF0187 ++:1006A000B0E0CE3D91EC03835E02F0077200025E83 ++:1006B00002F0117A00025E02F00F95006D403304E3 ++:1006C000C76E03AADE02F0078E01BC63FF1FE4863B ++:1006D00001BC601B19D06401BC600300B7A101BC60 ++:1006E00063FF1FE66D00E04186F4306501BC63FFE7 ++:1006F0001FF60000E05E870077A100025E02F00CAA ++:10070000AE0200C077000784012940770017A200DD ++:100710006D5E8B04C78200E85E8B04D60001BC606E ++:100720001B0FF06300E0418EC01063010C56030004 ++:1007300004860068DE8701678400B05E8B00066D6A ++:10074000006DDE8701C78700E0419300306403BF7E ++:10075000DE02F0077703B05E02F0078D01836002CE ++:100760000D906C00681B3BFFE78E01BC601B0FF017 ++:100770006500E04194D9D06502005A0300078E015C ++:100780008360060D906C0020402F08A79001BC608C ++:100790000300048601BC60030008020188E00F002A ++:1007A0000803006D40330208A50129520F0017937A ++:1007B0000109520F0017AA01966002F2979400E017 ++:1007C000418701F06501BC600F0017A10028DE869B ++:1007D00090679C01866006F2979400E04197007054 ++:1007E0006500E020AF00C82B01065E530017A20091 ++:1007F000A05E4F0477A10068DE870447AA0186E067 ++:1008000006F2979400B85E8B0037A200B05A03003E ++:1008100017A0020ADA030007A401876006F2979482 ++:100820000284C03B0007AA0203DA030007AA03AB55 ++:100830005E02F007A8020441070007AA01806005D4 ++:1008400000680301065E530017A20182DE8A009051 ++:100850000403AADE02F007DB03AB5E02F007C50269 ++:1008600087D2130007DB00B0521300118601A5E008 ++:100870000A301180018460020D906C01BC63FF1F7F ++:10088000F79900B01B430017A20068DEAB0027B742 ++:1008900000A05E4FFF77A10068DE870727C303BF74 ++:1008A000DE02F007B90284520F0007C30204D20F20 ++:1008B0000007BC03B15E02F007C200B01B3F001787 ++:1008C000A203BFDE02F007BD03B35E02F007C2025F ++:1008D0000052170007C300685E8BFFE7C300E0010A ++:1008E0005EF4506502015A470007C300B019B70013 ++:1008F0001799018460060D906C020052170007DB07 ++:1009000003315E02F007DB01866002301180018056 ++:10091000E001620B10020052170007C90202AB4F40 ++:100920000007D60068DE5F0007D600B02BB70017BF ++:10093000A100682ABB0007D600B02BB30017A200A5 ++:100940006DAABAF447D60068DEAB0047D2006D2B23 ++:10095000BAF427D100B02C6B000B190184E006F724 ++:10096000F7BF0068DE4F0287D600025E02F0130C6C ++:100970000206DEFF0007D600E02BE7002AF9006838 ++:10098000DE5F0007D90068DEAB0047D90180E005D3 ++:10099000620B1000682B6F0007DB0180E006F7F7A1 ++:1009A000BF0207520F000856028047A300085302F7 ++:1009B0008047B300085300E020AF00882B00E820F8 ++:1009C000AB00882A01BC60030011E401BC63FF1F77 ++:1009D000F7A501BC600303D1E102065E530007E501 ++:1009E00001BC60030491E10206DE530007E900E068 ++:1009F00047870051E10207D20F0007E900E047876F ++:100A00000091E1006D403302C8A500685E4F058784 ++:100A1000EC0068DEAB00485603AB5E02F007EF0265 ++:100A2000005217000856020580F30007F500681908 ++:100A3000B7FFE7F200B019B70017A500E05E970016 ++:100A400097A50068DE97FFE7F50280521700085669 ++:100A5000020700BF00085601BC601F1417A20090D7 ++:100A6000478700306500E04196F4506500E0478715 ++:100A700001082103835E02F007FD00025E02F0110F ++:100A80007A00025E02F00F95006D40310427F900F4 ++:100A90006D40310428A501BC600B1D57A10068DE24 ++:100AA00097FFE80D010F5A070017A5031EDE02F09D ++:100AB000080D0200521700080D032C5E02F00856C4 ++:100AC00000685E67FFE80D00E05E6700979900E050 ++:100AD0005E66F43064012A58030017990100DE971E ++:100AE0000017A500E05E66F4B79900E05E67003786 ++:100AF00099011558030017A603BFDE02F0081D0078 ++:100B0000E05E96F43064012A5803001799020580CC ++:100B1000F300081C0182E002F3379902005217002B ++:100B2000081C0116D8030017A6010F5A070017A4C6 ++:100B3000010CD8030017A10068DE92F4281800E029 ++:100B40005E6702179903BFDE02F00821010DD8038A ++:100B50000017A10068DE92F4285600E05E670417D3 ++:100B60009903BFDE02F00821011058030017A60008 ++:100B700068DE9B00C8210181DA030017A100B85E7E ++:100B800086C017A10281DE8700085600885E6700D4 ++:100B9000778000E000AEF0106401AADE6500480234 ++:100BA0000068DE9B00483B0207818700082E006D2D ++:100BB000DE030C082E0285520F00082E0298523BCD ++:100BC00000082E0181E00500680300E05E000B379D ++:100BD000A300E05E8F0097A300E041870077A200AA ++:100BE000025E02F00DE800E820AB01082A01BC60BB ++:100BF0002307978100885E970077A100E85E86F45E ++:100C0000B06301BC60070E17A100E0418EF43063B1 ++:100C100000B056170017A100B0561B0017A20068BD ++:100C2000DE86D048560068DE8AD0685600025E0232 ++:100C3000F00DBD01BC602307506401BC624F00177A ++:100C4000A200025E02F00E1000685E9B0048530195 ++:100C5000BC621EF471E00068DE9B00C84601BC6106 ++:100C60001300B7A1020600F300084201BC601300A4 ++:100C7000B7A101BC60030011EE00B05E6B0011EF84 ++:100C80000192E00EF431EC03BFDE02F0085300687D ++:100C90005E9B0068480068DE9B00A85301986006D0 ++:100CA0003D11E800E020AF00882B00E820AB008871 ++:100CB0002A01BC60030011EA0068DE5F00484E00B4 ++:100CC000B05E6B0011EB0192DE5E3D11E8018760C2 ++:100CD000023D11E80068DE9B00A852018760063DD6 ++:100CE00011E8019860163D11E80181E00500480215 ++:100CF00001AADE6500480203BFDE02F0085B01BC0A ++:100D0000620F0011E001BC60030011E40181E00109 ++:100D100000680301BC600F0011E801BC6003001112 ++:100D2000EC0200200F00086200E020AAF3482A002D ++:100D3000B020AF00102500E820AA04A82A006AA06D ++:100D4000AB01C86201B860060490240182E006F29B ++:100D500097940188600A00900401BC60031877959D ++:100D600003A0DE02F0086F00685E4F06A874013829 ++:100D7000520300178000B05E5F0017810203DEB7E8 ++:100D800000086E00685E0700086D01BC6003017713 ++:100D90008001BC600300378103BFDE02F0086E01F2 ++:100DA000BC600301578000025E02F000AF0068DE05 ++:100DB000AB00487400A05E4F0477A100685E870016 ++:100DC0004A3500685E87044A3503BFDE02F00BE94E ++:100DD0000386DE02F00A870287C037000A86000217 ++:100DE0005E02F0117A00025E02F00F9503035E02CC ++:100DF000F0087403A9DE02F0088000025E02F01120 ++:100E00007A00025E02F00F950207403700087A036D ++:100E100086DE02F00A870287C037000A8600025E7B ++:100E200002F00C60006E40300208AB0301DE02F0FD ++:100E300008AB0068DEAB000892032B5E02F0088668 ++:100E400000E0022B00208A03BFDE02F0088A028045 ++:100E5000521700088900E0024300209003BFDE0221 ++:100E6000F0088A00E0025700209500685E4F040BEE ++:100E70006900685E4F028B6900685E4F0209C70017 ++:100E8000685E4F048A2E00685E4F050BDA00685ECC ++:100E90004F060BDA00685E4F068BE303BFDE02F0FD ++:100EA0000BE90068DEAB0028A3032B5E02F0089676 ++:100EB00000E0022F00208B03BFDE02F0089A0280C0 ++:100EC000521700089900E0024700209103BFDE029C ++:100ED000F0089A00E0025B00209600685E4F06A9C9 ++:100EE0009B00685E4F042C0100685E4F04AC01005B ++:100EF000685E4F05AA3B00685E4F06299B00685E4E ++:100F00004F052BD800A05E4FFF77A100685E8707D2 ++:100F10002BF403BFDE02F009C000E00213002084BE ++:100F200003BFDE02F009C400E0020F00208301BC11 ++:100F300060030011EC01BC600F0011E80284C03BAB ++:100F40000008560184E00609104803BFDE02F008DD ++:100F5000560200C09300000203A35E02F008AF0334 ++:100F6000C35E02F008AE03BFDE02F00AF300025EC9 ++:100F700002F0117A00025E02F00F950207C0AF0086 ++:100F800008B3020740370008AF0107C0AF0017A140 ++:100F900000B85E870037A101825E860D906C00B0BC ++:100FA000447F000804018360020910480287C037AB ++:100FB000000A860386DE02F00A8700025E02F01154 ++:100FC0007A00025E02F00F9503435E02F008B80259 ++:100FD00087C037000A860301DE02F008D303305EC3 ++:100FE00002F008D301BC601B1F506500E04194DF94 ++:100FF0003065012D406B0017A200885E8B0137A27F ++:101000000138402B001680028840270008C7018461 ++:101010006006D0168000B05A02F456800205C02740 ++:101020000008CA0187E006D0168001BC601B0DD7FE ++:10103000A100025E02F000A200B04067001681012C ++:10104000BC601B0DF7A100025E02F000A200B040E0 ++:101050006700168200E01BE70066F900691BE701E4 ++:1010600088D301BC60030006F90280200F0008D578 ++:10107000006E40300209960381DE02F008DF00E0D6 ++:10108000021700208503A9DE02F008DB0184E006D8 ++:101090000910480180E0020910480184E002F7F7D6 ++:1010A000BF0386DE02F00A87018060050048020166 ++:1010B000806006F2979403BFDE02F009620183604C ++:1010C00002F7F7BF0386DE02F00A87032B5E02F009 ++:1010D000090503A9DE02F008E80068DEAB00490557 ++:1010E00000B0523B00179F00B0523B0017BE01BC3E ++:1010F000600300280E03BFDE02F0090502875E537D ++:1011000000091203A0DE02F008F403BFDE02F006BD ++:10111000920182E0060D906C0190600A091048006F ++:10112000B0523B00179F00B0523B0017BE019E5EBD ++:101130008300B0EB0106520F0017A100B85E8700D4 ++:1011400037A10182DE86F577AB01BC6103003080F8 ++:1011500000E8523AF3F7A2006BD23AF3E8F700E85E ++:101160005E7E91D7A200905E8B0097A101BC6023A8 ++:1011700001D064006B523AF3E90201185E87001750 ++:10118000A2010A5E870017A300886006F457A20038 ++:10119000E04192F4706400B05802F45600006BDE37 ++:1011A000FA91C90500B0523B0017BE03BFDE02F042 ++:1011B000090500025E02F011EA00B0203B00280E93 ++:1011C00000B0523B00179F0320DE02F00912020715 ++:1011D0005E530009090180E00209104803BFDE02E6 ++:1011E000F009120068DE5F00090F021A54070009B7 ++:1011F0000D0103C0270017A101825E8610D0860171 ++:1012000002C0270017A100E0422AF4308A0180E0E2 ++:101210000500480203A9DE02F0091200B05E470093 ++:10122000108001085E4F0017A100685E8700293614 ++:1012300003AB5E02F0093A0200521700092500686C ++:10124000DEAB00491800E0025300209402865E5392 ++:101250000009620284520F000AF70284D20F0009CB ++:101260001D03AC5E02F0092303BFDE02F0092E036A ++:101270002C5E02F0092E00685E4F0409230106D29D ++:101280000F0017A10080921B0197A200E0015E0DE4 ++:10129000B0640181DE86C3F61F00685E4F020962FA ++:1012A00003BFDE02F00952031EDE02F0092B0331F8 ++:1012B0005E02F0092B0068DEAB00492B0080921B18 ++:1012C0000197A200E0015E0DB0640181E002C3F667 ++:1012D0001F0068DEAB00493000E0023F00208F03B2 ++:1012E000BFDE02F0093300685EAB00493302805272 ++:1012F0002F0009620202410700093300685E4F04B3 ++:10130000096200685E4F0289620284410700096237 ++:1013100001806006F2979403BFDE02F00962032B9E ++:101320005E02F0096200685E4F05A95200685E4FD8 ++:1013300005295203BFDE02F009620068DEAB0049F6 ++:101340004201BC6003000ABD01826002F5D7AE0213 ++:10135000805EFF00094000682B6F00094200E044F6 ++:10136000655B4ADB00682B8BFFC94200E02B8B00DA ++:101370002AE202065E5300094500E002630020985D ++:1013800003BFDE02F009620323DE02F0094D0129EA ++:10139000500B0017A30068DE8F05294D0187E0027E ++:1013A0001070830184600209104800B05E87001746 ++:1013B000A1006EE00300294C03D1DE02F0094D00CC ++:1013C00068DEAB00494F00E0022700208900685E1C ++:1013D0004F00096200685E4F01096200685E4F05B8 ++:1013E0008962028047C70009940329DE02F0095888 ++:1013F0000102DEAF0017A10106520F0017A200384C ++:101400005E86F449620182DE8AF577AB00B0522332 ++:101410000011F200B052270011F300B0522B00115E ++:10142000F40106520F0017A100E05E870031F500BD ++:10143000B0005B0011F000B047C30018000134C7D2 ++:10144000C70017A1006EDE8402A96201BC60030818 ++:1014500010420283C1070009660301DE02F009653C ++:1014600003B55E02F0096602805E53000AF700B021 ++:1014700040330017A10108A00F0017A200685E8B7F ++:1014800000696E00E840310577A10281200F000954 ++:101490006E00B020AF0017A10280A00F00096E00FF ++:1014A000B05E630017A1006E5E8402099600B05E14 ++:1014B000870007FA018160010048020202C01300A0 ++:1014C000097400E05E840347FA0181600500480268 ++:1014D0000201200F00098F01035E530017A101874D ++:1014E000DE850048020386DE02F00A8700025E0203 ++:1014F000F0117A00025E02F00F9503855E02F0099A ++:1015000077018E60023D11E80107C7830017A10132 ++:10151000825E850048020201A00F0009810103C715 ++:10152000970017A101825E8500680300B0204B0080 ++:1015300017A1018E5E850068030207C0AF000C444E ++:1015400001BC60030011EC01BC600F0011E80184D4 ++:10155000600500680300B040270007FC00B0402B86 ++:101560000007FD00B0406B0007FE00B0406F0007B1 ++:10157000FF0184600500680300025E02F00C600158 ++:10158000BC63FF1FD7A800025E02F00DAC00025E34 ++:1015900002F00C4401A8600A0090040201200F0030 ++:1015A00011D500A8401300500403BFDE02F005F877 ++:1015B00000E002870020A103BFDE02F0099700E0EF ++:1015C000020B00208203A9DE02F00AF70184600604 ++:1015D0000910480184E00609104803BFDE02F00A42 ++:1015E000F7032B5E02F009B80068DE4F06A99F00E2 ++:1015F000E0023B00208E03BFDE02F009A000E00203 ++:101600003700208D0323DE02F009C00068DE4EF1B2 ++:10161000C9C00187E002107083018460020910488C ++:1016200000B05E870017A1006EE0030029A603D179 ++:10163000DE02F009A700685E4F0629B601BC600310 ++:10164000000AA603295E02F009AC0203DEB300091A ++:10165000AD0191601A84F4270183E002F597AC0292 ++:101660000200BF0009B50203456F0009B00185E023 ++:10167000062B715B02045EB30009B50187E002101E ++:1016800070830183E00209104800025E02F0112716 ++:1016900003BFDE02F009C00205500B0009C0018241 ++:1016A000600609104803BFDE02F009C0028700C3CC ++:1016B0000009BD0068DE4F06A9BD0068D21300090D ++:1016C000BD01BC600300118301BC600300118200F6 ++:1016D00068DE4F0629C000E0024F00209303BFDE02 ++:1016E00002F009C003AB5E02F009C2020441070028 ++:1016F00009C5028341070008AB03BFDE02F009C53C ++:10170000028441070008AB01806006F2979403BF92 ++:10171000DE02F008AB039F5E02F009CA039EDE0200 ++:10172000F00BE902035E53000BE902048143000958 ++:10173000CE010001630017A10102C0270017A2001B ++:1017400038DE86F449C403AB5E02F009D0020052D1 ++:10175000170009C40280522F0009D203335E02F041 ++:101760000BE902181B330009F201BC601F15F0657C ++:1017700001BC60031BB7A400025E02F000E900B0E8 ++:101780005E8F0017A60068DE931BA9EE0207C197C3 ++:101790000009DF01385A070017A1013C5A0700175A ++:1017A000A201BC5A0AF457A2013C5A0B0017A3012C ++:1017B000BC5A0EF477A303BFDE02F009E2013C5AE3 ++:1017C000030017A100B05A070017A200B05A0B007F ++:1017D00017A3006D5E870089E801BC61BF0A17A5E9 ++:1017E0000068DE8AF4A9E801BC60271357A50068E9 ++:1017F000DE8EF4A9E803BFDE02F00A2A00D85E8775 ++:101800000037A100E14196F4306500E1C197003056 ++:101810006501F041970017A200E05E8B0077A200FF ++:101820006D5E8AF4C9D500E840330097A5006E5E6E ++:1018300096004A2A00B01B2F0017A10068DE840A18 ++:101840000BE9023C523F000A03013C523F0017A142 ++:101850000068DE84048A2801BC600316106401BCA1 ++:10186000601F16106500685E870029FF00B05A03EC ++:101870000017A20068DE8AC00A2800E04197003005 ++:101880006500E0419300306400E85E870057A100E6 ++:101890006A5E870029F800685E87000A0401385AEA ++:1018A000030017A1013858030017A20068DE86F470 ++:1018B0004A2803BFDE02F00A040285C107000BE9D3 ++:1018C00001BC601F15F06501BC600305B7A40002F0 ++:1018D0005E02F000E9028000C3000A2801BC601328 ++:1018E00010D7A600E0017F00B7A5006D5E96F4CA90 ++:1018F0000C01BC60130957A500685E940BCA2C004C ++:10190000B0017B00106500B052270017A200B05252 ++:101910002B0017A3006841940BEA170068DE8ED0F5 ++:101920004A1300685E8AD02A2800E0419700B0651B ++:10193000006D4196F4CA1001BC601309506503BFE5 ++:10194000DE02F00A1000E0028B0020A200B0017F4E ++:1019500000106500B0522300168000B05227001618 ++:101960008100B0522B0016820080921B0197A200CA ++:10197000E0015E0DB0640203587F000A2101BC60E3 ++:101980002F0037A103BFDE02F00A2201BC5202F28F ++:10199000F7A101A95E02F436830090446701168422 ++:1019A000020281AB000A260068DE9305AA270184A3 ++:1019B0006006D0968400B05E9700005F020781AB9E ++:1019C000000A2A01806006F2979403AB5E02F006DB ++:1019D000AA03BFDE02F008AB00E0028F0020A303E1 ++:1019E000BFDE02F009C4039EDE02F00BE903AB5E2A ++:1019F00002F00A31020052170009C403335E02F0FC ++:101A00000BE901846006F2979403AB5E02F006AA2C ++:101A100003BFDE02F008AB03835E02F00A38000267 ++:101A20005E02F0117A006D4033038A35006D403359 ++:101A30000389C4032B5E02F00BED03BFDE02F00648 ++:101A4000AA032B5E02F00A3E00E0023300208C0362 ++:101A5000BFDE02F006AC00E0024B0020920103C0A2 ++:101A60002700178101825E0503178100025E02F0E4 ++:101A70000D9A008800230037A200E05E8800F7A2DC ++:101A800000E05E86F451890186E00630118003BFD4 ++:101A9000DE02F009C003A2DE02F0008103A3DE0231 ++:101AA000F00A6400E001FF00207F01BC6003001722 ++:101AB000A303BFDE02F00A66018760040310A001E1 ++:101AC000BC60030051E400B0479300180001BC6003 ++:101AD0000302900401BC620F0011E001BC600F0121 ++:101AE00031E800B047A300180001BC600F0011E806 ++:101AF00001BC60030131EC00B047B300180001BC29 ++:101B000060030011EC018460060910480020601E8B ++:101B1000090A5B00E001FB00207E03BFDE02F00A41 ++:101B20006C01BC60030ED7A1011400630017A20072 ++:101B3000E05E86F4506500E05A0300368002030040 ++:101B4000C7000A6103A95E02F00A660291509F0075 ++:101B50000A650191601A84F42703BFDE02F00A656A ++:101B600000E001FF00207F01BC60030037A30323D6 ++:101B7000DE02F00A6C0183E0020910480184600271 ++:101B8000F597AC01BC600300178E0187E00210706E ++:101B9000830182600209104803D0DE02F00A6D035F ++:101BA000D05E02F00A6E0182E00209104803D5DE21 ++:101BB00002F00A7001BC60030010B401BC600300B5 ++:101BC000F7A1006800A7000A740185421AF437A142 ++:101BD00000025E02F000A200B040670017A501BC41 ++:101BE00063FF1FF7A200025E02F000A800886007F2 ++:101BF0000157A400B85E86F497A100025E02F000CF ++:101C0000A80283C21F000A7B00E044670117A102FB ++:101C1000044523000A80006B4466F42A7D00025EBE ++:101C200002F0116100685E8F0000020020E01E09D2 ++:101C30000A8400B05E9700142E03BFDE02F002CCCF ++:101C400000A8412300F04803BFDE02F00002018338 ++:101C5000600209104801BC6007001042006E40306D ++:101C6000020A8A00E0027700209D00025E02F01264 ++:101C7000A703A35E02F008AB03C6DE02F00A8D01E3 ++:101C800084E00609104803BFDE02F00AF70068206E ++:101C9000E3000A9500E844650717A101BC609F02B4 ++:101CA00017A2006D5E86F44A9501BC6003000838F7 ++:101CB00000025E02F00B160020E10209007C002009 ++:101CC000628A090A9900025E02F0117A03BFDE02FD ++:101CD000F0007C0284452300007C03915E02F0004A ++:101CE0007C0396DE02F0007C03965E02F0007C002E ++:101CF000025E02F00B1601BC600300602000680168 ++:101D000073000AAF00025E02F000D400B044670026 ++:101D1000083800B001730010E401BC600300000645 ++:101D200001BC600300005C01BC600301D78201D2EA ++:101D3000DE087570E000B00EB30010E100B000479F ++:101D400000108600B00ECF00108A01BC600300377F ++:101D50008100025E02F00D8D0190600A09104801B9 ++:101D6000BC610300308003BFDE02F0000201BC60F2 ++:101D7000030030420187E00224712300025E02F07A ++:101D8000109301BC600306778000680DEF000AB66F ++:101D900000B00DEF00178100025E02F00E440397C1 ++:101DA0005E02F00B2703125E02F00AB601BC60036C ++:101DB00000402001BC618300112500B0007B0011B0 ++:101DC0002701BC600702578000025E02F00E3F0050 ++:101DD000B05E07000B3001BC600702778000025E36 ++:101DE00002F00E3F00B05E07000B3101BC6013092A ++:101DF00097A100025E02F000A200B04067000B63F2 ++:101E000001BC601309405E01BC601309405F0180A2 ++:101E1000E006F5D7AE0107C1070017A101805E8675 ++:101E2000F577AB01BC600F0011E801BC620F001137 ++:101E3000E000025E02F00AD801BC61CF0C105C0128 ++:101E4000BC600300105D01BC61CF01F05E01BC60AD ++:101E50003B0AF05F00025E02F0106301BC60030009 ++:101E60000835020300C700000401BC60030006023D ++:101E700001BC600300060701BC600300060C01BC46 ++:101E8000600300061103BFDE02F0000401BC6043E2 ++:101E90000017BB00A04122F770480185E002F5B7AA ++:101EA000AD01BC63FF1FF05401BC63FF1FF055017F ++:101EB000BC63BF1FF05601BC63FF0FF05700025E0A ++:101EC00002F012A70187E00624712301BC60030021 ++:101ED000105401BC600300105501BC600300105693 ++:101EE00001BC600300105701BC600F002017010601 ++:101EF000C1070017A101825E8402E01701074107B4 ++:101F00000017A100B85E870037A10180DE870000BE ++:101F1000160002DE02F000000285C0370000020059 ++:101F2000025E02F0117A00025E02F00F9502864016 ++:101F300037000AEC00E0021B0020860386DE02F078 ++:101F40000A870287C037000A870158600300102AF9 ++:101F500001BC600300900400B040130017A103BF50 ++:101F6000DE02F0000401B8600A04902403AA5E02B5 ++:101F7000F00AFA0158600300102A01BC60030290C5 ++:101F80000400B040130018000183600209104801EA ++:101F9000BC60030051E400B0479300180001BC622C ++:101FA0000F0011E00180600100680300025E02F092 ++:101FB0000F9503855E02F00B0101BC620F0011E07A ++:101FC00001BC600F0131E800B047A300180001BC5C ++:101FD000600F0011E801BC60030157A100E85E87B3 ++:101FE0000037A10068DE87000B0801BC6003029087 ++:101FF0000400B0401300180001BC60030131EC0084 ++:10200000B047B300180001BC60030011EC0324DEEC ++:1020100002F005F801866006F577AB00025E02F07B ++:102020000B160180600610308100B05E870017A19A ++:102030000180600210308103BFDE02F005F801BCB0 ++:10204000610300108000B04203001800006EE0033E ++:10205000002B1903505E02F00B1C00015E02F00021 ++:102060000003BFDE02F002F401846002F597AC00C9 ++:10207000A8412304F048018260020910480206DEEC ++:10208000AF000B2203D5DE02F00B220350DE02F07C ++:102090000B2001BC60030010B40284C783000B2531 ++:1020A00001BC600B0011E0018E6002F577AB00020D ++:1020B000DE02F0000003A2DE02F0007C02BC4287D8 ++:1020C000000B2E01BC60030037A401BC60031FF7A6 ++:1020D000A3011400630017A200886006F457A2034E ++:1020E000BFDE02F00B33008860070117A401BC6358 ++:1020F000FF0017A3011400630017A200E05E8B012C ++:1021000017A200886006F457A201BC601311106585 ++:1021100001BC601B02506401BC60030017A50020D5 ++:10212000C286F48B3D00E0419706D06500E0419304 ++:1021300001F06400E05E970037A500885E930037E9 ++:10214000A400205E92F46B5C03BFDE02F00B36004D ++:1021500068DE92F44B4200680083006B4203A0DE0D ++:1021600002F00B420020C123160B3700025E02F082 ++:102170000B16006DDE93200B58020300C7000B4CBA ++:10218000006DDE97008B4C01BC600300160801BC9B ++:10219000600300160901BC600300160A01BC60035D ++:1021A00000160B01BC600300160C01BC6003001696 ++:1021B0000D01BC600300160E02005AC3000B57024B ++:1021C0003C5A9F000B5700680083006B570385DE65 ++:1021D00002F0007C03855E02F0007C03A2DE02F0C8 ++:1021E000007C03A3DE02F0007C0397DE02F0007C9B ++:1021F00000B041970010600191600A84F42703BF8A ++:10220000DE02F002CC01806002D616B000B05E9310 ++:102210000010A101836002F7F7BF01BC600300302A ++:102220004303BFDE02F00B370068808300607C034D ++:10223000BFDE02F00AB70283C21F00000200B05ED8 ++:10224000870017A103D0DE02F0051001BC60030473 ++:102250001042039EDE02F0000400B05E3F00114514 ++:1022600001BC600300178F00B05E4300178500B00B ++:102270005E0F00179000025E02F00B1603BFDE0235 ++:10228000F00004006D40330589C503AC5E02F00B1D ++:102290006E00685E4F028BC000E002670020990369 ++:1022A000BFDE02F00BC000685E4F028BC000E00290 ++:1022B0005F00209701856002F5B7AD01826002F5ED ++:1022C000D7AE01BC6003000ABD039EDE02F00B82A4 ++:1022D0000321DE02F00B8200E0026F00209B00026F ++:1022E0005E02F00B16018660020910480180600250 ++:1022F0000910480181E00209104801BC6003021086 ++:10230000420280441F000B8100B05E3F0011450176 ++:10231000BC600300178F00B05E4300178500B05EFD ++:102320000F00179003BFDE02F00B8200A044B6F04E ++:102330007145028200C3000BC000B000730017A1FA ++:1023400000E05E86B017A100E15E7AF4379E00E1FE ++:10235000DE7700179D00E1DE7300179C00E0DE6F62 ++:1023600000179B039EDE02F00B91006E5E6E924B97 ++:10237000D6006D5E6E924B91006E5E72922BD6000F ++:102380006D5E72922B91006E5E76920BD6006D5E42 ++:1023900076920B91006DDE7A91EBD6028201AB0052 ++:1023A0000BA200B0446700083400B0446B0008334F ++:1023B00000B0446F00083200B04473000831006878 ++:1023C000A0D2232B9100E920D2F3D79E00E9A0CE22 ++:1023D000F3B79D00E9A0CAF3979C00E8A0C6F37785 ++:1023E0009B00E15E7A91F7A100B05E8700111900B1 ++:1023F000E1DE7692111A00E1DE7292311B00E0DE1E ++:102400006E92511C0068DE86232B9B03BFDE02F018 ++:102410000BC000E9523EF3D7A100E9D242F3B7A2C4 ++:1024200000E9D246F397A300E8D24AF377A40088E4 ++:10243000121B0057A500E0015EF4B06400E95E865F ++:10244000C9A6D200E9DE8AC9C6D300E9DE8EC9E694 ++:10245000D400E8DE92CA06D50080921B0197A50140 ++:10246000BC601B11778000E05E020DB06500885AE9 ++:102470000F00B7A500B05E970217A50125DA0F007F ++:1024800017A600E95E94DA57A500E8DE98DA77A689 ++:10249000017ADE96F4D7A500685E96D06BC000E89E ++:1024A0005E96D077A600B05E9700168300685A1338 ++:1024B000000BBA00E05A16F4D68500685A1B000BD0 ++:1024C000BC00E05A1EF4D68700B05E8700164D00AF ++:1024D000B05E8B00164E00B05E8F00164F00B05EEF ++:1024E00093001650031EDE02F00BD6039F5E02F02F ++:1024F0000BD600685E4F028BD6032C5E02F00BD623 ++:1025000001BC601F16B06501BC600300B7A40002E7 ++:102510005E02F000E90068DE9300ABD60207C197C7 ++:10252000000BCC013C5A07001788013C5A0B0017DE ++:10253000A103BFDE02F00BCE01385A070017880155 ++:10254000385A0B0017A10080921B0197A200E001EE ++:102550005E0DB06400B05E230016280181DE86C3E4 ++:10256000F61F0187DE86249124020680F3000BD635 ++:102570000181E002C3F61F0187E00224912403AB2E ++:102580005E02F006AA03BFDE02F008AB032B5E0278 ++:10259000F009C403BFDE02F006AA03AB5E02F00B33 ++:1025A000DD032C5E02F009C403BFDE02F00BED0078 ++:1025B000B052230011F200B052270011F300B052C4 ++:1025C0002B0011F401BC60030091F500B0005B002A ++:1025D00011F003BFDE02F006AA0138523F0017A136 ++:1025E00002065E53000BE60138524B0017A100684B ++:1025F000DE87008BE903AB5E02F006AA03BFDE02B2 ++:10260000F008AB0068DE4F020BEC020781AB000B59 ++:10261000EC01806006F2979403AB5E02F006AA021A ++:102620000000F3000BF20206DE53000BF201185E0D ++:10263000830017A10068DE8700ABF201BC600B02CB ++:102640005142020052170009C403BFDE02F008AB7A ++:1026500001BC600300118301BC6003001182032CE4 ++:102660005E02F00BF90199E00620110003BFDE02C3 ++:10267000F00BFD0119402F0017A100685E870009CB ++:10268000C00199DE8620110003315E02F009C0000E ++:10269000A05E3B0097A200205E4EF449C00184601A ++:1026A0000209104803BFDE02F009C0032B5E02F0EE ++:1026B00009C00068DE4F042C0600B0523300179F9B ++:1026C00000B0522F0010EB0281522F00069200E062 ++:1026D00002AB0020AA0281522F0009A003295E024A ++:1026E000F00C0C0203DEB3000C0C0191601A84F4B0 ++:1026F000270183E002F597AC0208522F0006AA03D7 ++:10270000BFDE02F008AB01BC600300106701BC60D3 ++:10271000030010460180E0060930490282C11F0013 ++:102720000C1601BC602F1FF06501BC600300168011 ++:1027300000E841970030650069C197000C1301BCA7 ++:10274000600B00179401BC60030017AB01BC600371 ++:102750000017AC01BC60030017AD01BC600300179B ++:10276000AE01BC60030017BF01BC60030020200164 ++:10277000BC60030017A100025E02F000A201384015 ++:1027800067000028011C406700002901BC600300AD ++:10279000504901BC60030017A701BC60030017A8E3 ++:1027A00001BC60030017A901BC60030017AC01BCA9 ++:1027B00060030017AD0182E0060F10780206C1E346 ++:1027C000000C28006880A7000C2B03BFDE02F00C71 ++:1027D0002C006880A7008C2C01BC600B1EA000019F ++:1027E000BC600300200101BC634F01A00201BC6179 ++:1027F000DB06800301BC600300400401BC604309A8 ++:10280000200501BC601F14106101BC601317D0606B ++:1028100001BC600300082900B05E0F00178500A00E ++:1028200044B6F07145028741D7000C3701BC600304 ++:10283000000BF001BC600300107D01BC60030010C0 ++:102840007C01BC606300107B01BC600300107A0156 ++:10285000AC607F00107501BC63470897A10068C198 ++:10286000DAF42C43011A41DF0017A10068DE87016A ++:102870006C4301BC637B15ABF003BFDE02F00A9E24 ++:1028800001885E5CFF87FC01BC601F1F500701BC14 ++:102890006003019008018860060090040386DE0250 ++:1028A000F00A870305DE02F00C480386DE02F00A18 ++:1028B000870385DE02F00C4A00B05E870017A10096 ++:1028C0006EE003002C4E0386DE02F00A87006EC025 ++:1028D000146F2C5101BC60070010420207C0AF000A ++:1028E00007590002DE02F0000003215E02F00C57DF ++:1028F00000E02066F4281900B0206700178B03BFA2 ++:10290000DE02F00C5F028150C7000C5C011C509F7E ++:1029100000178B00E05E2EF4378B019C5E2E84F452 ++:102920002703BFDE02F00C5F011E509F00178B00D3 ++:10293000E05E2EF4378B019E5E2E84F4270002DECB ++:1029400002F000000107402700082800E020A30053 ++:1029500028280002DE02F0000000B044670017A241 ++:10296000017ADE8A2357A10090012F00B7A601BC8F ++:10297000601B11706501BC60030017A201BC601BE5 ++:102980000DD06401BC601B1B906300685A03000CEF ++:10299000A8006B5E86D06C7E00B05A030017A300BF ++:1029A000E05A0EF4D58000E05A0EF4768300E85A1F ++:1029B0002F00368B0069DA2F000C7200E85A0700EE ++:1029C000368B006CDA0EF42C6D01BC60030036000F ++:1029D00001BC600B00104301BC60030026DA00203C ++:1029E0005A0B080C7901BC60030026DB03BFDE0232 ++:1029F000F00C7E00205A0B140C7E01856006F5B7A2 ++:102A0000AD0088009B00D1260090009B0151280159 ++:102A1000BC6303001124006B5E86B00C8600685A0C ++:102A200013000C8301886006D0568200B056030064 ++:102A300017A400E05E92D0968500E05A0EF4D5808F ++:102A400000205A0B080C8601BC60030006DB0068FE ++:102A50005A13000C8E006B5E86D0AC8E0188600A23 ++:102A6000D0568200B056030017A400E05E92D096C4 ++:102A70008501BC600300360101BC600B00104301FE ++:102A8000BC60030026DA00685A1B000CA8006B5ECD ++:102A900086D0ECA802015A0B000C9D00E85A1B00DE ++:102AA000368600B05A270017A300E05A1EF4768736 ++:102AB00001BC601B1C106200E0418AF4506200B04F ++:102AC0005A2B0017A300E05402F475000202D4034D ++:102AD000000C9B00E05A1F003687012054030015AC ++:102AE0000001816002D0568203BFDE02F00CA0001C ++:102AF000B05A230017A300E05A1EF47687018160C4 ++:102B000006D0568200685A1B000CA2006CDA1EF434 ++:102B10002C9002015A0B000CA501BC600300360288 ++:102B200003BFDE02F00CA601BC600300360301BC4B ++:102B3000600B00104301BC60030026DA00E04197FF ++:102B400001906500E05E8B0037A200E041930090A9 ++:102B50006400E0418F003063006D5E8B008C6A0082 ++:102B600002DE02F0000000B05A0300101F00B05A4D ++:102B70000700102000B05A0B0010210180600700F0 ++:102B8000101D02804077000CB20002DE02F000004F ++:102B90000187E002F577AB03915E02F000020020AE ++:102BA000E3FE09000200025E02F00C6301BC601B40 ++:102BB00011706400E041930617A20068D82F000C42 ++:102BC000BC0281D80B00000200E041930190640038 ++:102BD0006D4192F44CBA0287C49300000200689BD6 ++:102BE0006F00000202815E53000CC90283411F0086 ++:102BF0000CC30281DE53000CCF01BC6003001151F5 ++:102C000001BC600300115201BC620300115301BCFE ++:102C1000600300515001896006F2979403BFDE0201 ++:102C2000F000020280C54300000201F0C547001118 ++:102C3000560107C5470017A101F0C54AF4315501F7 ++:102C400089600AF2979401BC60030810470392DE82 ++:102C500002F00D1C01BC601B11706501BC6003001B ++:102C600037A101BC63FF1FF7A201BC60030017A3DB ++:102C700001BC60030017A600685A03000D0B01BCDD ++:102C800060030017A502035A0B000CDE02805A0BEA ++:102C9000000D1C00E944080977BB00E8C40F0017C9 ++:102CA000A4017ADEEEF497A400685A13000CEA033C ++:102CB000BFDE02F00CE70203DA0B000CF200B05AA0 ++:102CC0000F0017A400685A07002CE300685A2F0071 ++:102CD0002CE301BC60030037A500685A13000CE721 ++:102CE000006CDE92D0ACE700B05A170017A401BC0C ++:102CF00060030037A5002019FAF42CEA00685A1B7B ++:102D0000000D0503BFDE02F00CED00885E87009722 ++:102D1000BB002019FAF76D1C02015A0B000D1C00B4 ++:102D20006CDE92D0ED0500B05A1F0017A4002019E8 ++:102D3000FAF42CF101BC60030037A503BFDE02F0FA ++:102D40000D050202DA0B000D0B0204C107000D1C79 ++:102D500000B05A0F0017A400E85A2F0037BB0069D3 ++:102D6000DEEF000CF800E85A070037BB013C016FAA ++:102D70000017800068DE03000CFE0138016F0017A9 ++:102D80008000685E03000D0100E85E030037BB03AE ++:102D9000BFDE02F00D0100E85E030037800080DE38 ++:102DA00002D0378000E05EEE0DB7BB00685EEF003A ++:102DB0000D0500E05E92D017A400E85EEF0037BB7F ++:102DC00003BFDE02F00D0100685E8F000D08006B8E ++:102DD0005E92F44D0903BFDE02F00D0B01BC6003EF ++:102DE0000037A300B05E930017A200B05E970017F3 ++:102DF000A600885E870037A100E04197019065003A ++:102E00006D5E87020CD500685E8F000D1C00B0441B ++:102E1000670017A5017ADE962357A500E85E8AF4BD ++:102E2000B7A400885E9300A6D700905E930166D891 ++:102E300000B0012B0017A300689B63000D17006E04 ++:102E40009B5EF46D1C03A65E02F00D1C00B05E9B41 ++:102E50000006D900E91B5EF4681400E89B630008D3 ++:102E60001503BFDE02F00D1E00681B6700000203A1 ++:102E7000BFDE02F00D6F01BC610300112300692069 ++:102E800057000D220180E006F2979403BFDE02F0A6 ++:102E90000D240180E002F2979403BFDE02F00002ED ++:102EA00000684127000D3002844523000D2500B045 ++:102EB00044670017A100E84466F437A2006D5E8BFA ++:102EC000004D270280C127000D2B0392DE02F00D7A ++:102ED0006F0392DE02F00ACA00025E02F010970051 ++:102EE000025E02F00E4F00025E02F00E4A00025E29 ++:102EF00002F00E5A01BC600F0011E8031EDE02F062 ++:102F00000D3701BC600300105C01BC600300105D64 ++:102F100001BC605304105E01BC600300105F03BF7E ++:102F2000DE02F00D3B01BC600B00105C01BC6003D5 ++:102F300000105D01BC604304105E01BC6003001022 ++:102F40005F01BC6003008020028500BF000D80008F ++:102F5000B0205300115100B02057001152006E20D4 ++:102F6000522A8D430068A057000D4300E0205223F1 ++:102F7000281603BFDE02F00D4500B04467000816B6 ++:102F800001BC600300315001BC60030C90400000A4 ++:102F9000DE02F000000068C103000D4A02804543D4 ++:102FA000000D45006B446502CD4501BC6003001176 ++:102FB0005002844543000D4B00B044670017A10048 ++:102FC000685E86232D4D01BC6003004020018660B1 ++:102FD0000620110000E920522A37A100E8A0562A55 ++:102FE00057A200E14466F4311900E1C46AF4511AB1 ++:102FF00000E1C46F00111B00E0C47300111C00B09D ++:10300000441F001800008844230157A30090442364 ++:1030100000D7A400B0440B0017A100B0440F001764 ++:10302000A200E95E862337A100E8DE8A2357A200CA ++:1030300069DE8B000D6500E1440AF4710200E0C412 ++:103040000EF4910300E02AF7002ABD00E85E230099 ++:1030500037880069DE23000D5900E8002700378813 ++:1030600003BFDE02F00D59018660022011000068E6 ++:10307000C103000D6F00681B67000D6F01BC60434A ++:103080000017A100E04466F4378001BC600300062D ++:10309000DA00025E02F00C63006C4466F00D6F0013 ++:1030A000681B6B000D6B03BFDE02F00CCF0200DE6D ++:1030B00053000D820180E002F2979400025E02F05C ++:1030C0000E4D01BC600300104003BFDE02F00D7521 ++:1030D000020080C3000D7900E044640957A100E8B4 ++:1030E0005E862137A1006CC466F42D7703BFDE0233 ++:1030F000F00D8200E8012A21281401BC60030008B9 ++:103100001500B0205300115101BC600300115201A1 ++:10311000BC600300315002804543000D7E03BFDEDA ++:1031200002F00D4F01BC600300104000B0012B0005 ++:1031300011090068AAE7000D8300B0012F001109F2 ++:1031400001BC61CF0C105C01BC600300105D01BCD0 ++:1031500061CF01F05E01BC603B0AF05F00025E02DD ++:10316000F00E5600025E02F00E5F00025E02F00EEC ++:103170005301BC60030006D903BFDE02F00ACA0196 ++:10318000885E0610D08601025E070017A101825EEC ++:103190008610D08601BC600306778000B00DEF007A ++:1031A00017810288421B000D9400B00DEB001781BF ++:1031B00000685E07000D9600025E02F00E44020BEE ++:1031C000421B000D9803BFDE02F00D99018B20A277 ++:1031D00010D0860002DE02F0000000B05413001789 ++:1031E000A10200DE07000DA100B0418B00106501B7 ++:1031F000BC600301D7A100025E02F011A500E05EF1 ++:103200008400F7A103BFDE02F00DA6020480F300E4 ++:103210000DA602025E07000DA602805E07000DA645 ++:103220000090001B0037A200E85412F457A10002DE ++:10323000DE02F00000020400BF000DAA00025E02E0 ++:10324000F00F4E03BFDE02F00DAB00A044B6F0B1AC ++:10325000450002DE02F00000020000BF000DBC00CD ++:1032600068AC0F000DBC00E05EA30037A8006D5EE7 ++:10327000A005CDBC00B02CB70017A100025E02F083 ++:1032800000A200B040670017A20068DEA3FFEDB9FE ++:1032900000B05E8965D7A2006D00A7008DB8006DF3 ++:1032A000A0A3004DBA03BFDE02F00DB90068A0A3D1 ++:1032B000000DBA00B85E8965D7A200025E02F00078 ++:1032C000A801BC60030017A80002DE02F0000000A5 ++:1032D000D85A030117A201B85A06F457A200B056F3 ++:1032E0000300083C00B0560700083D00B0560B0034 ++:1032F000083E00B0560F00083F00B05613000840CB ++:1033000000E05612F4484100B05A0300083A013870 ++:103310005E8B00083B00B021070017A401BC6003CE ++:103320000017A200B0419300106500B85E92D0175C ++:10333000A400E05E06F4506300F05E930017A30063 ++:10334000F05E930077A400E05E8B0037A200B85EC9 ++:1033500092F477A400E04192F4506500E05602F444 ++:10336000958000B056030017A4006EDE8B00ADCA36 ++:1033700000B85E92C0D7A200D85E8B0037A200E0F2 ++:1033800020F2F4483C00B020F30017A400B85E928D ++:10339000C0F7A200D85E8B0037A200E020F6F44808 ++:1033A0003D00D820F70037A200E020FAF4483E00A4 ++:1033B000D820FB0037A200E020FEF4483F00D820D0 ++:1033C000FF0037A200E02102F4484000D8210300AA ++:1033D00037A200E02106F4484100B021070017A2FF ++:1033E00000B85E8AC017A200905E8B0037A201BCB5 ++:1033F0005E8907683B0002DE02F000000180600683 ++:103400003C91E4018760063CD1E601A860023CD112 ++:10341000E6018B60023CD1E600B05E8F00106300D5 ++:10342000B056030011E700B056070011E700B05690 ++:103430000B0011E700B0560F0011E701A960423CF4 ++:1034400091E401A860023CD1E6018B60063CD1E624 ++:1034500000B05E8B00106301BC60030057A1020442 ++:103460005603000DF801BC60030117A100E0418E76 ++:10347000F4306300B056030011E700B056070011A6 ++:10348000E700B0560B0011E700B05E8B001063013F ++:10349000BC600300B7A10204D603000E0201BC60A9 ++:1034A000030117A102065E53000E0201BC60030176 ++:1034B00097A100E0418EF4306300B056030011E79D ++:1034C00000B056070011E700B0560B0011E701BC31 ++:1034D00060030017A10206DE53000E0D00B05E8BE4 ++:1034E00000106302065E53000E0C00A0563F01F769 ++:1034F000A103BFDE02F00E0D00A0563301F7A100BC ++:10350000B05E870011E701BC60030011E70002DE36 ++:1035100002F0000000685E9B00CE2A01BC6007023A ++:1035200011E30068DE9B004E1D00E847870111E1B2 ++:1035300001BC60030011E201BC60030011E201BCA8 ++:1035400060030011E201BC60030011E201BC6003F2 ++:103550000011E201BC60030011E201BC6003001134 ++:10356000E201BC60030011E200B06142F451E000EE ++:10357000B058030011E200B058070011E200B05843 ++:103580000B0011E200B0580F0011E200B058130018 ++:1035900011E200B058170011E200B0581B0011E210 ++:1035A00000B0581F0011E200B05E9B0017A4006835 ++:1035B000DE9B00AE2801BC60030077A40192DE937D ++:1035C0000217A30002DE02F0000001BC6007001138 ++:1035D000E300B058030011E200B058070011E20008 ++:1035E000B0580B0011E200B0580F0011E200B058C3 ++:1035F000130011E200B058170011E200B0581B0090 ++:1036000011E200B0581F0011E200E00146F0106422 ++:1036100001BC60070031E300B058030011E200B0C4 ++:1036200058070011E200B0580B0011E200B0580F2B ++:103630000011E200B058130011E200B05817001159 ++:10364000E200B0581B0011E200B0581F0011E20167 ++:1036500092E01B0017A30002DE02F0000002874088 ++:10366000C3000E3F01866006F01030028640C300A2 ++:103670000E4100B040C70017810002DE02F00000DA ++:10368000028740C3000E4400B05E0700103101867F ++:10369000E006F010300002DE02F00000006800A733 ++:1036A0000112E303BFDE02F00E5E00025E02F00EC6 ++:1036B0004D00025E02F00E5F0002DE02F00000002C ++:1036C0006800A70112AC0002DE02F0000001816078 ++:1036D00006093049006800A7008E5200025E02F021 ++:1036E0000E6F0002DE02F0000000025E02F00E6FBC ++:1036F000018160020930490002DE02F00000018809 ++:10370000E00E09304900B0412700180000B0002B3E ++:103710000010020002DE02F0000001BC6003001095 ++:10372000020182E0020F107801BC60030010490022 ++:10373000B041270018000002DE02F000000068001F ++:10374000A7010E600280DE53000E6601BC60130705 ++:1037500077A100025E02F000A2019060020337A28E ++:1037600000025E02F000A80002DE02F0000001BCD0 ++:1037700060130797A100025E02F000A20190601E94 ++:103780000337A200025E02F000A801BC60130777B5 ++:10379000A100025E02F000A20190601E0337A200A9 ++:1037A000025E02F000A80002DE02F000000100DE6E ++:1037B000530017A60181DE9A09304900B041270065 ++:1037C00018000002DE02F000000002DE02F000003D ++:1037D00000B044670017A2017D5E8A2357A300B0A2 ++:1037E0001C770017A100B85E84E3D7A2025A5E8B53 ++:1037F000000E7C0180E006F4271E01825E86F297AF ++:103800009400B05E8F00071B02001C7B000EC300FB ++:10381000E85E8CE377A2006D5E88E38EC300E0442F ++:10382000670287210285C523000EC00020E3FE0940 ++:103830000EC001BC60130997A100025E02F000A255 ++:103840000068C067000EC001BC60131617A100021B ++:103850005E02F000A20068C067000EC001BC6013E9 ++:1038600009D7A100025E02F000A20068C067000E46 ++:10387000C001BC63FF1FF7A10068DE862C2EC002CA ++:10388000009C7B000EB40180E000E3C71E01BC6019 ++:10389000230F57A100025E02F000A200B0406700B3 ++:1038A00077A400B05E930017A200025E02F000A8A9 ++:1038B00001BC601B1B57A100025E02F000A2018147 ++:1038C000E0060337A20186E006F457A200025E027A ++:1038D000F000A801BC601714D7A101BC600300B7B9 ++:1038E000A200025E02F000A801BC60171457A101FB ++:1038F000BC60031877A200025E02F000A801BC6061 ++:103900001714B7A101BC600300F7A200025E02F029 ++:1039100000A801BC60171077A101BC600F0417A2BA ++:1039200000025E02F000A801BC60171097A101BC64 ++:1039300060030017A200025E02F000A801BC60173D ++:1039400010B7A101BC600B0017A200025E02F000DC ++:10395000A801BC601710D7A101BC60030017A2002A ++:10396000025E02F000A801BC60171017A101BC6044 ++:103970000B0037A200025E02F000A801BC60230F1A ++:1039800057A100A85E930077A200025E02F000A893 ++:1039900001BC60171017A100025E02F000A2020035 ++:1039A0004067000EB9006CC464E42E8003BFDE02E1 ++:1039B000F00EC001BC60171277A100025E02F00099 ++:1039C000A20068C0671FEEC001806000E3C71E014F ++:1039D000BC600300904301806000E3C71E01826069 ++:1039E00002F297940180E004E3C71E01BC6003006B ++:1039F000071A03BFDE02F00EC30002DE02F0000071 ++:103A00000201C11F000ED602855EAF000EC90185FE ++:103A10006006F577AB00B0446700082500B0446B42 ++:103A200000082600E9446504B7A100E8C46904D78A ++:103A3000A200D05E870077A101E1DE8AF437A20000 ++:103A4000E95E862697A100E8DE8A26B7A200695EB5 ++:103A50008B000ED601BC610300113300E144DAF49F ++:103A6000313600E144DEF4513701856002F577AB71 ++:103A700001BC600301104701BC6003005043000219 ++:103A8000DE02F0000000B0451F00178100B005B74E ++:103A90000017A601BC600704106401BC601311107C ++:103AA0006501BC60030017A10205DEAF000EEF0048 ++:103AB000B0580F00178000685E842C2EF702005E5D ++:103AC0009B000EEF0280DA03000EE50118581F007C ++:103AD000178200E05E0B00378201985E0AC0F6078D ++:103AE00003BFDE02F00EE8011A581F00178200E043 ++:103AF0005E0B003782019A5E0AC0F60701F0DE0312 ++:103B000000378000A05E02C0578000B05E03001640 ++:103B10000300A044B6F0178200B05E0B001605004B ++:103B2000E05E0AC0960603BFDE02F00EF700B05852 ++:103B30001300178200E85E06F057A5006ADE9700C2 ++:103B40000EF500E85816F4B6050069D817000EF512 ++:103B500001BC600300160500B058170017A500E06F ++:103B60005812F4B60600E0419302106400E0419759 ++:103B700006D06500E05E870037A100905E9B0037AD ++:103B8000A60068DE87008EDC01BC600300114701DF ++:103B9000BC600300016D0002DE02F0000001BC60A9 ++:103BA0000300016C01BC600300016D01BC60070AE9 ++:103BB000106401BC60030077A100B0428F00178041 ++:103BC00000A05E0301F78000B05E0300016E01BC3F ++:103BD00063FF1FF7A20068DE03000F0901BC60034A ++:103BE0000017A200886006F43781002005BAF02F84 ++:103BF0000E0068DE8AC0CF0E00E005B300216C0025 ++:103C0000B005B6F0216D00685E03000F1200205E63 ++:103C100006F00F18006EDE8AC0CF1803BFDE02F078 ++:103C20000F13006DDE8AC0CF1800B05E870017A3A7 ++:103C300000B0419300016600B0581B0017A201BC00 ++:103C4000600300016C01BC600300016D00E841935A ++:103C500002106400E85E870037A10069DE87000F6C ++:103C60000900B05E8F0001650002DE02F000000076 ++:103C7000B0059B001064006E581B002F2100E05817 ++:103C80001B00314503BFDE02F00F2200B0581B00BD ++:103C9000114500B0059B00016200B005970001616D ++:103CA00000B0580F00178500B0580700178300B008 ++:103CB000580B0017840118581F00178C011A581F41 ++:103CC00000178D0002DE02F0000000B0059700171B ++:103CD0008000685E002C2F4D01BC600300111201B2 ++:103CE000BC600300111500B0059B00106402004584 ++:103CF00023000F3700B0451F00178100E80592F040 ++:103D00003780006ADE03000F3500B05E0300114506 ++:103D100003BFDE02F00F3801BC600300314503BF72 ++:103D2000DE02F00F3800B0059300114500B00583A6 ++:103D300000016900B0058B00016A00B0058F000129 ++:103D40006B00B0058700016800B005AB001065028C ++:103D5000845A1F000F4100B05E1700168301985E61 ++:103D600032D0F687019A5E36D0F68701846002D0A1 ++:103D7000F68700B0059300016000B0059B0001626A ++:103D800000B0059F00016300B0059700016100B01D ++:103D9000058B00106400B0580F00178500B058075D ++:103DA00000178300B0580B0017840198581EF19734 ++:103DB0008C019A581EF1B78D03BFDE02F00F4D0043 ++:103DC00002DE02F0000000B0058B001064006E41BE ++:103DD000932A0F5B00A044B6F0B7A100B05E870045 ++:103DE000160500E05812F4360600B0581B001145C5 ++:103DF000020000F3000F58006D4193280F58020095 ++:103E0000DEAF000F5801BC600B02514200B05E876C ++:103E100000016F02015EAF000F5B00B05E1700167D ++:103E20000301816002F577AB0002DE02F0000002C0 ++:103E3000014523000F660287C493000F660182606C ++:103E400002F5D7AE02012C43000F6300E02C4B00BB ++:103E50002B1201816001620B1002055EB7000F6634 ++:103E600000E02AF7002ABD01856002F5B7AD000227 ++:103E7000DE02F00000020200BF000F7400025E02CA ++:103E8000F00F960202DEB3000F6C0020428F000C90 ++:103E9000B403BFDE02F00002028881AB000F74029F ++:103EA000845EFF000F6A02845EB3000F6A0282DE46 ++:103EB000FF000F6A02822B4F000F7200682ABB00BE ++:103EC0000F740284DEAF000F6A02835EB7000F6AD0 ++:103ED00000B05E870017A10002DE02F00000018240 ++:103EE000E002F597AC0203DEFF000F7E028445235B ++:103EF000000F7E02012B4F000F7E0180E006F2973B ++:103F00009400025E02F00E6F0180E002F2979400CE ++:103F1000025E02F00E6F0180E002F29794028400CC ++:103F2000C7000E4803BFDE02F00E4A020400C700BD ++:103F30000F880284C56F000F9402844523000F850B ++:103F400002004203000F9400685E4B04AF940068C7 ++:103F50005E4B06AF9400685E4B062F940182E0062C ++:103F6000F597AC02844523000F8B0323DE02F00F8C ++:103F70008C0183E006F597AC0180E006F29794028D ++:103F80008400C7000E4800B02AF70017A2006DDEBB ++:103F900089560E4802872B4F000E4A02005EFF0032 ++:103FA0000E480287AB4F000E4A03BFDE02F00E48F8 ++:103FB0000002DE02F00000020200BF0013000068F1 ++:103FC0002B0B000F9B00E844655857A101BC63F719 ++:103FD0001D17A2006D5E86F44F9B00E84466F44A0C ++:103FE000C2006CC465576F9D00E84467002ABB029D ++:103FF00080456F000FD10203DEB70010580183E047 ++:1040000002F5B7AD0202DEB3000FA3018360062BF9 ++:10401000915C00025E02F00F7602835EBB000FA689 ++:1040200000E845895BF7A1006E5E8555AFBE0204CE ++:10403000DEB7000FBA00E02BB7002AED01BC600329 ++:10404000000AEF00682C67000FAB00E82C67002B1C ++:104050001900B02BB70017A201856002F5B7AD02B9 ++:1040600004DEFF000FB0006D5E895DCFB00184E01B ++:1040700002F7F7BF0206DEFF000FBA00E02BE702EF ++:104080000AF900B04467000B0401182BE70017A1E0 ++:10409000011A2BE70017A2006E5E87000FB8006DB3 ++:1040A000DE895F4FB803BFDE02F00FBA01BC6003C8 ++:1040B000000AF90186E002F7F7BF02025EFF001076 ++:1040C000580068AB0B00105800B02AE7000AC20085 ++:1040D00002DE02F000000182E002F7F7BF02025E9A ++:1040E000FF000FC8020600C7000FC102025EFF00FA ++:1040F0000FC800E845895BF7A1006DDE85614FC6FA ++:1041000000E844656177A1006D5E85618FC800B0ED ++:104110004467000AC20002DE02F000000204DEB7BB ++:10412000000FD000E8446556CABE00682C67000F37 ++:10413000CC00E82C67002B1900E02BBF002AEF0011 ++:10414000B02BC30017A1006D2BBEF42FD001BC60B3 ++:1041500003000AED0002DE02F000000203DEB700F9 ++:104160000FD80282DEB30010580203C57300104A54 ++:1041700000E844655737A1006D5E8556B05801834D ++:104180006006F5D7AE03BFDE02F0105801BC600335 ++:10419000000ADF006D45871F4FDB00B04587000A2E ++:1041A000DF00E044655BF7BB00E85EEE2C2AB90156 ++:1041B000836002F5D7AE0183E006F5B7AD0184E078 ++:1041C00002F5B7AD01826002F7F7BF01846002F526 ++:1041D000B7AD0101456F0017A101875E86F577AB8A ++:1041E00001BC6003000B0D00025E02F0130100E849 ++:1041F00044655737A1006D5E855ECFE6006D5E8534 ++:1042000056AFEA00E02B83002AE000B02AB3001783 ++:10421000B3020680C7000FED02075EAF000FF00289 ++:104220000680C7000FF20184600561AB0D03BFDE9D ++:1042300002F00FF201826006F7F7BF00B02AE70034 ++:104240000AC10200C56F000FF601846006F5B7AD24 ++:10425000020480C3000FF60184E00561AB0D020289 ++:10426000DEBB000FFC0284DEFF000FF90206DEFF5A ++:10427000000FFC00B02BB70017A1006DDE855DCFED ++:10428000FC0182E00561AB0D00E05ECD55B7B301E6 ++:10429000826002F5D7AE00B02C4B0017A100B02A07 ++:1042A000F70017A2006D5E8956100302855EB70005 ++:1042B000100C03BFDE02F01005006D5E8560F00E8D ++:1042C00002812C4300100C00B0440B0017A300B077 ++:1042D000440F0017A200E95E8E2337A300E8DE8AB0 ++:1042E0002357A200695E8B00100E0068DE8B001061 ++:1042F0000E006E5E8EF6700E01826006F5D7AE007F ++:10430000025E02F0114902045EB70010230206802B ++:10431000C700101102075EAF00102300682ADB00FF ++:10432000101C00E8446556D7A201BC60371597A35E ++:10433000006D5E8AF47023006E5E895D90230184B7 ++:10434000E006F5B7AD00685E8B00101C00B05E8B18 ++:10435000000AAE0182E006F5D7AE006E5E896110FC ++:104360001C0182600561AB0D00E844655737A10070 ++:10437000B044670017A300E85E8EF42AB60068AB6D ++:104380001708902200B02BCB0017A200E82ADAF41D ++:104390004AB601846002F7F7BF0282DEB30010580C ++:1043A0000203C57300104A00B02ACB0017A200B068 ++:1043B0002AD30017A300685E8F00102D00682B0B16 ++:1043C00000102D00E844655857A100E05E8EF457B8 ++:1043D000A2006D5E86F4502D0181600561AB0D0277 ++:1043E00081AB4F00103202005EFF00103202044524 ++:1043F0002300103203A0DE02F010320183E00561D9 ++:10440000AB0D0281AC4700104702862C37001058D4 ++:104410000286AC37001058028080BF00105802821C ++:104420005EBB00105802822BF30010470281AC37AC ++:104430000010470280AC3700104702812C37001073 ++:104440004702822C37001047028881AB00104702D8 ++:1044500082AC3700104002842C370010470284AC35 ++:10446000370010470283AC3700104702835EB70065 ++:1044700010460204DEAF0010460281DEBB0010468B ++:104480000184E002F577AB00025E02F0113303BF56 ++:10449000DE02F010580183E0022B915C020701ABB1 ++:1044A00000104A0180E00209D04E00E84465573709 ++:1044B000A1006D5E8555B058028101AB001050021D ++:1044C0000081AB00105202842C370010520280ACE5 ++:1044D00037001052018360022B915C03BFDE02F0B3 ++:1044E0001058018360022B915C00025E02F00F8184 ++:1044F00002835EB70010580184E006F577AB00E058 ++:104500002B47002AD103BFDE02F0111B0002DE029E ++:10451000F000000184E002F5B7AD01836002F5D739 ++:10452000AE0182E002F5D7AE0182E002F7F7BF01EB ++:1045300084E002F7F7BF01BC6003000ADB01BC6046 ++:1045400003000AD001BC6003000AC8018760016053 ++:104550006B030002DE02F00000020200BF001089BF ++:104560000283DEFF0010920183E006F7F7BF01BC73 ++:10457000600302115D00B02AB700115E018560067C ++:104580000B705B018560060BF05F0280456B0010CD ++:104590006D018B60022B915C0188600E2B515A00DB ++:1045A000682ADB00107001846006F7F7BF01BC6069 ++:1045B00003000AB600025E02F0105900E844696088 ++:1045C000D7A1006EDE8700307A00B02BF7000AF822 ++:1045D00001BC6003000AF700682B0B00107A00B0E2 ++:1045E0004467000AC100E84465564AC200B02AD3B5 ++:1045F0000017A100E82B0AF42AC2028080BF001035 ++:10460000800281DEBB0010840200456F0010800232 ++:1046100083C57300108001BC63FF1FF7A10068C54C ++:1046200086F43084018B600E2B915C0183E002F5EF ++:10463000B7AD0184E002F577AB03BFDE02F01126CF ++:10464000018360022B915C00025E02F00F81018306 ++:10465000E006F5B7AD0184E006F577AB03BFDE02F7 ++:10466000F01126018D60020BF05F0188600E2B5166 ++:104670005A028181AB00108E018B60062B915C0386 ++:10468000BFDE02F0108F018B60022B915C0183E092 ++:1046900002F5B7AD0184E002F577AB00025E02F0EF ++:1046A00010590002DE02F0000000B0446B000B065F ++:1046B0000202DEB3001097018360062B915C0002BA ++:1046C0005E02F00F76020200BF00109F0183E0023D ++:1046D000F7F7BF0203C57300109D020080BF0010F2 ++:1046E0009D018B600E2B915C03BFDE02F0109E01DA ++:1046F0008B60022B915C0182E002F597AC0002DE38 ++:1047000002F0000001BC600300701001BC63FF1FD9 ++:10471000F0C501BC63FF1FF0CB00B040470010E5BF ++:1047200000B040470010EB01BC600300901001BCDA ++:1047300063FF1FF0C601BC63FF1FF0CC00B0404711 ++:104740000010E600B040470010EC01BC600300B070 ++:104750001001BC63FF1FF0C701BC63FF1FF0CD0059 ++:10476000B040470010E700B040470010ED01BC60CA ++:104770000300101000B0404300180001BC63FF1F8D ++:10478000F0C800B040470010E801BC6003003010E2 ++:1047900000B0404300180001BC63FF1FF0C900B027 ++:1047A00040470010E901BC600300501000B04043D6 ++:1047B00000180001BC63FF1FF0CA00B040470010A2 ++:1047C000EA0002DE02F0000001BC60030037A20034 ++:1047D00020E3FE0910FA0020E0420D90FA02804228 ++:1047E000030010FA028445230010FA03915E02F0E0 ++:1047F00010FA0068AB6F0010FA0282DEFF0010FAB8 ++:1048000002805EFF00112F020180C7001126028284 ++:10481000DEB30010FA020480C70010E700685E8B68 ++:104820000010D300B02BA30017A1006EAB8AF430A8 ++:10483000D30203C5730010E700682ABB0010D20042 ++:10484000682ADB0010D300E8446556D7A100E82AA7 ++:10485000BAF437A1006ADE8555F0E7006ADE855BB1 ++:1048600050E700682B070010E70203DE530010D664 ++:1048700000B02BA7000AAF03BFDE02F0112601BC77 ++:10488000600302579201BC63FF1FF0C301BC6003C9 ++:104890000910E301865E8A1C70E3018460061C70C7 ++:1048A000E300682B0F0010DD0185E0061C70E301BA ++:1048B000BC600303978200025E02F0110401BC6336 ++:1048C000FF1FF0C400B054130010E400E043915CFB ++:1048D00030E400025E02F010A001BC60030010EEA4 ++:1048E00001BC63FF1FF0CE00E02B0F002AC303BF03 ++:1048F000DE02F010F402835EB70010FA00025E02DE ++:10490000F000D400B05ECF0010E400682ABB0010B5 ++:10491000F100B02AFB0010E40280456F0010F100A6 ++:10492000E8446556D7A100E82ABAF437A100695EC9 ++:10493000870010F100E05E8557D0E401BC60030100 ++:10494000D78200025E02F0110403BFDE02F010F411 ++:1049500000B0004700108600025E02F011980002CD ++:104960005E02F00D8D0190600A0910480184600616 ++:10497000F597AC01BC61330070800002DE02F000EC ++:104980000002805EFF0010FF0281DEBB0010FF020C ++:104990000180C7001126020480C700112601806033 ++:1049A00002F7F7BF0280C28F0011270201DEBB00B1 ++:1049B000112701BC60030017A203BFDE02F010BD87 ++:1049C00001BC63FF1FF0C001BC63FF1FF0C1028583 ++:1049D000DEFF00111400685E4B06310D00B02B574E ++:1049E0000017A1006DAB0EF4311401BC6003013758 ++:1049F0008000B02B5B0017A1006D2B0EF4310F026D ++:104A0000812BF300110F01BC600301778001BC60B2 ++:104A10000300378100025E02F000AF01D2DE0AA07F ++:104A200030E000B0540B0010E103BFDE02F0111AB9 ++:104A30000280ABF300110D01BC600301578001BC83 ++:104A4000600300178100025E02F000AF00B054075F ++:104A50000010E000885E0B0070E10002DE02F00052 ++:104A60000000682B130011260204DEAF001126009F ++:104A7000E844655897A4006E5E9155F12600885E63 ++:104A8000930037A4006D5E9155F12600025E02F09E ++:104A9000115603BFDE02F0113300E844655897A4B5 ++:104AA00000885E930037A400025E02F0115603BF37 ++:104AB000DE02F011330284DEAF00112A0181E00230 ++:104AC000F5D7AE03BFDE02F0113300682B8700116B ++:104AD0002F00E044655C2ADB00682B8B00112E0060 ++:104AE000E044655B4ADB0002DE02F000000180600A ++:104AF00006F7F7BF00682B1300113300E844655830 ++:104B000097A400025E02F0115601846002F597AC92 ++:104B100001BC6003000AC401BC6003000ADB01BCE5 ++:104B20006003000AC30104DEAF0017A101835E86A3 ++:104B3000F5B7AD0284DEAF00113C018060060D9038 ++:104B40006C0002DE02F00000028600C700113E0287 ++:104B5000025EFF00114400B02AAF0017A302040058 ++:104B6000C300114100B02ACF0017A30202DEBB0030 ++:104B7000114300B02AAB0017A300E04466F46ABBFF ++:104B800000B04467000B0B0183E0022B915C02072D ++:104B900001AB0011480180E00209D04E0002DE02A4 ++:104BA000F000000202DEB300114C018360062B917D ++:104BB0005C00025E02F00F760203C5730011510221 ++:104BC00084DEAF0011510281DEBB00115102805E14 ++:104BD000FF00115102035EB7001155018B600E2BCF ++:104BE000915C01836006F5B7AD0184E002F577AB17 ++:104BF00001BC6003000AC30002DE02F0000000688E ++:104C00002B7B00115800B02B7B0017A4006D5E9128 ++:104C100056515A00B02ACB0017A400882B27003722 ++:104C2000A500E82B2AF4AACA00885E930037A400E6 ++:104C3000E02B2AF48ACA00902B2B00AAC900B02BC3 ++:104C400027000AAF0002DE02F000000286410700E2 ++:104C5000116101BC60130917A100025E02F000A2FD ++:104C6000018760060337A200025E02F000A800B0D0 ++:104C70005E870017A100B05E870017A100B05E87B5 ++:104C80000017A101876002F457A200025E02F00043 ++:104C9000A801BC60130957A100025E02F000A20146 ++:104CA0008060060337A200025E02F000A800E00266 ++:104CB000B30020AC01806002F457A200025E02F053 ++:104CC00000A801BC60270857A100025E02F000A204 ++:104CD0000068C06701F17901BC60030017A20002FF ++:104CE0005E02F000A801BC600301F7A200025E02B0 ++:104CF000F000A80002DE02F0000003905E02F01156 ++:104D00008D03875E02F0118D0390DE02F0118D029B ++:104D10000445230011840283C21F00118D0068A086 ++:104D2000B700118100B0446700082D00E844650514 ++:104D3000B7A1006E5E877D118803BFDE02F0118E81 ++:104D40000286C03700118D00E0446700D7A102063B ++:104D5000403700118D006CC466F4318600025E029B ++:104D6000F00B1600025E02F0116101BC6003000846 ++:104D70002D00025E02F00AD803BFDE02F00004013B ++:104D8000BC600300082D0002DE02F0000002804239 ++:104D900003001197028545230011960285DEB700B6 ++:104DA00011940185E006F5B7AD00E0446B002B21BE ++:104DB000006CC46964319700025E02F011610185E4 ++:104DC000E002F5B7AD0002DE02F00000010C814305 ++:104DD0000017A101BC600300508A00685E07001143 ++:104DE0009C00685E8700119C00685E070011A401AA ++:104DF00090422AA1308A00685E070031A4019042E7 ++:104E00002AA0108A0109DE030017A2018F5E8A1111 ++:104E1000508A00685E8B0011A40191E00E11508A47 ++:104E20000002DE02F000000109DE030017A400E02A ++:104E30005A06F497A500905E96F497A50203DE0348 ++:104E40000011AC0282DE030011AC01BC61EF085717 ++:104E5000A60080DE96F4D7A50116DE870017A30012 ++:104E6000885E870077A100E15E8702D7A100E0DEBF ++:104E70008F0017A301BC60030017A2020E5E03009F ++:104E800011B301BC60030037A200905E96F457A5F1 ++:104E90000080DE96F437A100E141B7FFF7A600E1FC ++:104EA000DE8701F7A10080DE96F477A300E1DE86BD ++:104EB0000DB7A100E0DE8F0017A3017A5E86F477BC ++:104EC000A100885E86F457A100B05E870017A20299 ++:104ED00087DE030011C000885E870057A103BFDE94 ++:104EE00002F011CD02875E030011C701BC639B0C69 ++:104EF000D7A50080DE86F4B7A100E141B7FFF7A592 ++:104F000000E0DE870017A100885E870057A103BF7D ++:104F1000DE02F011CD00885E870057A101BC639BC3 ++:104F20000CF7A50080DE86F4B7A101BC6203001770 ++:104F3000A500E141B6F4B7A500E0DE870017A100A7 ++:104F4000E05E8400D7A10002DE02F0000002002033 ++:104F50000F0000040282DE530011D50188600204B4 ++:104F6000902400E020AEF3082B00E820AAF3082AE2 ++:104F700003BFDE02F0096201B8601604902401BC90 ++:104F8000600301D02503055E02F011E70287C037F8 ++:104F9000000A860386DE02F00A8700025E02F00F36 ++:104FA0009500025E02F0117A035CDE02F011D70078 ++:104FB000D8409B0117A100E05E8702379800A85EE9 ++:104FC000630077980102DE530017A10182E002F22C ++:104FD00097940188DE85006803006EA0AAF311E7AC ++:104FE00000E85E6301D02501B8600604902403BF89 ++:104FF000DE02F000020181600500680301B8600A6A ++:1050000004902403BFDE02F0000202285E87001134 ++:10501000FD00B041930017A400E0419300706401CB ++:105020000A5E870017A200E84192F4506301185EFF ++:10503000870017A100E86042F437A200885602F406 ++:1050400036000068418EF491F900E8418F0030632A ++:1050500000E8419300306400685E8B0211F100901B ++:105060005602F457A300B05806F4760103BFDE02DF ++:10507000F011F100684192F491FD00E84193003095 ++:105080006401BC600300160003BFDE02F011F900EA ++:10509000B05E870017A10002DE02F0000001806010 ++:1050A0000286143000B050CB0010650138508300E8 ++:1050B00017A10068DE3B06320500E05A3300368C4B ++:1050C000006EDA32F4200400B05A0B0017A200E0A0 ++:1050D00001F700207D00E001D2F4407401BC63FFC1 ++:1050E0001FF7A300B050CF001064006EDA32F43224 ++:1050F0000C00B05A370017A300B0581300178201F4 ++:10510000BC600300160401BC601B09D7B60102D0C5 ++:10511000C70017A100E04196F4306500E050CB00D5 ++:10512000D06401BC60030017B401BC6003001780A9 ++:1051300001BC6003003781018760040310A0009068 ++:1051400052330097A400E0418701B7B500685ED2F2 ++:10515000F0523300E05EDAF690630020D802F032BD ++:1051600027020250C700122D009056030097A1009D ++:10517000E85E86F497A1019E6002F437A1006DDE1F ++:105180008708122D010A5E870017A201DA6002F477 ++:1051900037A100E05ED6F4506300886006F437A1C2 ++:1051A00000205602F4322D00B05802F0360000E024 ++:1051B0005A2B00368A006ADED2F472290068DED2E9 ++:1051C000F0122E00E05E0300378000685E030032BC ++:1051D0002E0186E0040310A003BFDE02F0122E00B1 ++:1051E0006ADED2F4722900E05ED30037B400D05EEC ++:1051F0000700378102985ED300121800E041930047 ++:10520000306403BFDE02F0121800685E0300000481 ++:1052100003BFDE02F005AB0282D0C700123D00B032 ++:105220002A4F0017A101B82A4AF43684010250130C ++:10523000001685013C50830017A100B050A700174D ++:10524000A4006D5A32F432460182E00686343102FF ++:1052500088502B00124200B05A330017A1019E5E05 ++:105260008684F427018360068634310002DE02F072 ++:10527000000000B050730017A101B8506EF43684DE ++:105280000106D00700168500B050AB0017A400D06F ++:105290006006C0978000E0419700D7B5010A581317 ++:1052A0000017A100E05ED6F437B500B0580F00102B ++:1052B00063011656030017810068D81300125B01C2 ++:1052C0001400630017A10068DE87001251008801F6 ++:1052D0003B01168003BFDE02F012560068DE870035 ++:1052E000725400A0013BE0168003BFDE02F01256AC ++:1052F00000E05E870970620088540301168000E8B0 ++:105300005A0330168001BC600300168101BC6003A3 ++:1053100000168201BC600300168303BFDE02F01298 ++:105320006000E0418EC09063006EC18EC0326000AC ++:10533000E8418EC0306300E858030037A100E04127 ++:105340008EF43063013850A30017A500685813038A ++:10535000F27B0068418EC0527B006DDA0AF4B27BAA ++:10536000011656030017A10068DE86F0327B015853 ++:1053700056030017A100E05E870DD7A200B05ED7EC ++:105380000010620020DE02A0127200E05E86D037BC ++:10539000A300E05E8ED077A3006D5A02F4527B002A ++:1053A0006E5E8EF4927B00E86002F4368300B05E9D ++:1053B0008F00168100A05A0F00768300E05A0B0080 ++:1053C000368200E85A02F4568000D05E030037802F ++:1053D00000E0581300360400E0418F00306302986B ++:1053E000581300127800E05ED70037B5006EC18E0A ++:1053F000C0326100B0580300106303BFDE02F01238 ++:105400006100B058130017A10068DA3700127E005F ++:10541000B05E8700168D006DDE86D1B28000B05E72 ++:105420008700168D0002DE02F0000001BC60030060 ++:1054300017A1018760040310A001BC60030990B5A7 ++:1054400000B0006300F0B401BC60570490B601BC2A ++:1054500060030090B500B0006300B0B400B042D368 ++:105460000018000317DE02F012890397DE02F01223 ++:105470008A00B02A4B00142F018EE00C0310A0000C ++:105480006DDE02D1B29000E85A36F0168D03BFDE11 ++:1054900002F0129201BC600300168C01BC60030094 ++:1054A000168D006E5A3AF0129501BC600300168EFC ++:1054B00003BFDE02F0129600E85A3AF0168E00B0F2 ++:1054C00058070017A100E0580EF01603006ED80E22 ++:1054D000F4329C00E85E86C017A100E8580EF4364E ++:1054E0000300E8580F00360301185E030017A100FF ++:1054F0006DDE030212A400E86042F437A200905A65 ++:105500001AF4368600885A1EF457A200905A1EF4E8 ++:10551000368700B05A1AF4568603BFDE02F012A690 ++:1055200000905A1EF4368601BC6003001687000204 ++:10553000DE02F000000158600300102A01B8600A82 ++:1055400004902401BC60030290040189E0020D90E4 ++:105550006C0002DE02F000000200DE530012D101F6 ++:10556000BC601309B7A100025E02F000A201A560B1 ++:10557000020337A20199E002F457A200025E02F092 ++:1055800000A801BC60130997A100025E02F000A20E ++:1055900001A4607E0337A20199E03EF457A2000205 ++:1055A0005E02F000A801BC601316F7A100025E02C3 ++:1055B000F000A201B460020337A200025E02F00014 ++:1055C000A801BC60131637A100025E02F000A20120 ++:1055D00086E0020337A201856002F457A200025E52 ++:1055E00002F000A801BC60131617A100025E02F0D1 ++:1055F00000A20181E0060337A20185E006F457A26C ++:1056000001836006F457A200025E02F000A801BC0C ++:1056100060131F57A100025E02F000A20181E002A8 ++:105620000337A2028600C70012CB0181E0060337D0 ++:10563000A200025E02F000A801BC60131F37A100A7 ++:10564000025E02F000A20181E0060337A200025EC2 ++:1056500002F000A80002DE02F0000001BC601309A5 ++:1056600097A100025E02F000A201A460020337A22B ++:105670000199E002F457A201886002F457A20002E7 ++:105680005E02F000A801BC60131617A100025E02C2 ++:10569000F000A20181E0020337A20185E002F45785 ++:1056A000A201836002F457A200025E02F000A80289 ++:1056B0000600C70012E201BC60131F37A100025EA2 ++:1056C00002F000A20181E0020337A200025E02F0B4 ++:1056D00000A80002DE02F000000200DE530012D13A ++:1056E00001BC601309B7A100025E02F000A20187AD ++:1056F00060020337A20181E002F457A2018860062C ++:10570000F457A200025E02F000A801BC60130997E2 ++:10571000A100025E02F000A2020400C70012EF0125 ++:1057200088600E0337A203BFDE02F012F10186602B ++:10573000060337A20181E006F457A200025E02F0E0 ++:1057400000A803BFDE02F012C60068DE930012F765 ++:1057500000E05E030057A201095E8B0017A103BFA2 ++:10576000DE02F012FF0068DE930032FB01105E03E0 ++:105770000017A200E05E8B0097A103BFDE02F012CB ++:10578000FF01305E030017A200E05E8B0197A100CD ++:105790006D5E870592FF01BC60030597A10002DEE4 ++:1057A00002F000000200456F00130B02872C0F006F ++:1057B000130B01BC60130217A100025E02F000A2ED ++:1057C0000200C06700130B0287AC0F00130801082A ++:1057D0004067000B030187E005606B0301886006EA ++:1057E0000337A200025E02F000A801876005606B2B ++:1057F000030002DE02F0000000682BEB0013110032 ++:10580000B02C130017A100E05E8560B7A1006BDE2D ++:10581000862333110186E006F7F7BF0002DE02F0AF ++:10582000000000B05E8F00106400B05E870017A318 ++:1058300000B05E8B00106500B05A030017A100682D ++:10584000419300131A00025E02F000A200B040670C ++:1058500000160100E0419300506400B05A070017A1 ++:10586000A200025E02F000A800E04197005065002F ++:10587000E85E8F0037A30068DE8F0013150002DE9C ++:1058800002F0000000B05E8F00106400B05E870080 ++:1058900017A300B05E8B00106500B05A030017809C ++:1058A0000068419300132800025E02F00E3F00B032 ++:1058B0005E0700160100E0419300506400B05A07F3 ++:1058C00000178100025E02F00E4400E04197005094 ++:1058D0006500E85E8F0037A30068DE8F00132300A9 ++:1058E00002DE02F00000020200BF0001880203C5D0 ++:1058F000730001B1000000000000000057860000A6 ++:10590000A5C1E142055AC359DC0175513E5B2349EB ++:105910004728676945005E55F8F5C97D420AB30915 ++:1059200001BD32080100343333363261322D726FDB ++:105930006D6C2F7364696F2D672D706E6F2D706B9A ++:105940007466696C7465722D6B656570616C6976DF ++:10595000652D776170692D776D652D7032702056D9 ++:10596000657273696F6E3A20352E39302E313935B4 ++:105970002E3839204352433A20626431653365350D ++:105980006120446174653A204D6F6E2032303133AE ++:105990002D30342D32322031373A32343A343420FB ++:0559A0004353547D009B ++:00000001FF +diff --git a/firmware/ap6210/fw_bcm40181a2_apsta.bin.ihex b/firmware/ap6210/fw_bcm40181a2_apsta.bin.ihex +new file mode 100644 +index 0000000..df14f32 +--- /dev/null ++++ b/firmware/ap6210/fw_bcm40181a2_apsta.bin.ihex +@@ -0,0 +1,12890 @@ ++:100000000000000019A40000DDA20000DDA2000035 ++:10001000DDA20000DDA20000DDA20000DDA20000E4 ++:10002000DDA20000DDA20000DDA20000DDA20000D4 ++:10003000DDA20000DDA20000DDA20000DDA20000C4 ++:10004000DDA20000DDA20000DDA20000DDA20000B4 ++:10005000DDA20000DDA20000DDA20000DDA20000A4 ++:10006000DDA20000DDA20000DDA20000DDA2000094 ++:10007000DDA20000DDA20000DDA20000DDA2000084 ++:100080000048004719A40000000000000000000024 ++:100090000000000000000000000000000000000060 ++:1000A0000000000000000000000000000000000050 ++:1000B0000000000000000000000000000000000040 ++:1000C0000000000000000000000000000000000030 ++:1000D0000000000000000000000000000000000020 ++:1000E0000000000000000000000000000000000010 ++:1000F0000000000000000000000000000000000000 ++:10010000D11E8000B5228000BD248000491F8000E0 ++:10011000F9218000BDF00000F1208000D120800096 ++:10012000594880006948800015648000E1628000C1 ++:10013000296280003D6580008D628000C56280007C ++:10014000596380005D6580007D6380009D63800051 ++:100150000D668000A961800061618000756080008B ++:1001600095608000DD6380009D65800029668000C9 ++:10017000FD618000B96580001D618000F16580002F ++:100180009D6680006D658000916C8000CD6B800065 ++:10019000316C80008D6B8000556C8000AD6A8000F2 ++:1001A000C16A8000D56A8000496B80001D6A8000AA ++:1001B000FD6A8000AD688000C1698000D168800060 ++:1001C000356B8000B1698000D5A80000D166800041 ++:1001D000E16780008D678000CD6780009D688000AA ++:1001E000ED678000BD678000A1678000ED6680003C ++:1001F00009678000616780004D4880001D488000CD ++:1002000085988000DD96800051948000B19B80002D ++:100210003994800005988000199880002D988000FE ++:10022000C59B8000D19A8000899D8000D193800079 ++:10023000D9918000ED9A8000892800007DF10000AE ++:1002400059290000A5F10000519B80009D29000064 ++:1002500049A9800099988000D529000031A8800024 ++:1002600005A7800021A28000BD938000DD9380005F ++:10027000199E80007D93800045988000E59B80005A ++:100280006DA68000C19C8000C59F8000A19D80005C ++:10029000F598800069F10000DD2A000029AA80009D ++:1002A000B9A9800075AA8000E1A9800039AA800060 ++:1002B0008DAA80005DAA80000DAA8000C5A98000DB ++:1002C0009DA98000A90C8000850D8000C1068000DA ++:1002D00029088000694680004D468000D94480008E ++:1002E0004146800021448000F54380001544800091 ++:1002F000E1438000E1428000854680007544800033 ++:100300002D448000A9428000F9428000CD43800046 ++:10031000B9458000F544800039458000090080001F ++:100320003D00800049018000D10480000D04800060 ++:10033000910380004D038000E503800035038000B9 ++:100340006503800029028000CD02800051028000F8 ++:1003500085028000F5028000950680003906800045 ++:100360008105800005068000FD048000690F800083 ++:100370002516800015168000451380001513800097 ++:100380002513800009138000351380000D1E8000A6 ++:10039000F91D8000291D80001D1C8000391C800073 ++:1003A0003116800059138000F1F801009513800088 ++:1003B000B91C8000F11B8000211E8000751D80008B ++:1003C000E1EA00003D1D80000D1B8000E910800067 ++:1003D000790F8000A9168000311480002D11800053 ++:1003E000A51E8000B11E8000BD1E8000692B80000C ++:1003F000AD28800011298000892B8000FD2B800012 ++:10040000E128800065288000B52C8000912C8000B8 ++:100410001D2B8000752D8000252C80004D30800024 ++:10042000DD2D80005927800031318000D9F2000095 ++:100430008D268000C5268000E5248000FD268000F2 ++:1004400021258000B12A80006525800025288000B4 ++:100450006129800041298000D92980009D298000E0 ++:1004600081298000893080004D2E8000B12B8000D2 ++:10047000312C8000E12C8000613280002D32800020 ++:10048000C93380004D368000693A8000B535800060 ++:10049000F9348000A93480003D3380009D33800012 ++:1004A000013480003536800031388000353A8000D4 ++:1004B000213A8000AD3280000D338000DD328000B3 ++:1004C000953A8000D937800099368000193780002E ++:1004D000593880004938800019398000313D80004A ++:1004E000D53A8000C93C8000E13B8000513D80004E ++:1004F000D93D8000AD3E8000593F80009941800089 ++:1005000041478000CD5B8000895380002D4D8000E5 ++:10051000A94C8000E14D8000E94F8000B14F800080 ++:10052000C94E80008D4E8000F15180005D528000E8 ++:10053000D15180002D52800001528000C94F8000AF ++:10054000594C80006D4C8000455B8000395680001E ++:10055000155A8000C9588000315A800081578000A8 ++:10056000F95980001D568000AD55800091558000DE ++:100570004D5A80002D558000714B800071548000D1 ++:1005800009548000F54D80001D4C8000F94B80001F ++:10059000094C8000114E80001558800061EC00006D ++:1005A0002D508000E5588000555680007D5A80000F ++:1005B000054F8000354E8000D9558000515880008D ++:1005C0009D57800059518000614D8000B1488000E6 ++:1005D0005D5B800081528000494C800049EF000043 ++:1005E000F15B8000E55C8000E15F8000A55E80003B ++:1005F0007D5E80008D5C8000015C8000A15F8000DA ++:10060000895D800005608000395D8000D15E8000DA ++:10061000495E8000ED6C8000656D8000DD6D8000BE ++:100620000D6D8000296D8000896D8000F96C80005F ++:10063000D96C80003D6E8000616F8000756E800017 ++:10064000056E8000A974800055758000D574800007 ++:1006500005748000D17C8000457D8000757C800021 ++:10066000117E8000897E8000E97E8000917D80007F ++:100670003D7E8000517F8000A581800065848000E0 ++:10068000418480008D8380006583800035858000F3 ++:10069000E58480009D848000218580007584800031 ++:1006A000BD8380005D858000BD858000158F800042 ++:1006B000918D8000D58980001986800019AB80005B ++:1006C0005DAC8000A1AA8000B5AB80005DAB80006E ++:1006D000FDB080007DB1800065B080006DAE80000F ++:1006E00085AE8000EDAD800041AF80001DAE800082 ++:1006F00031B180003DB18000B9AE8000F5B180001D ++:1007000079B08000FDAD800009B180008DB080001F ++:1007100049B1800069B180004DAE80003DAE8000DF ++:1007200095AE800029B38000C9AE8000CDAF8000B7 ++:10073000E5AF800025B080008DAF8000B5B28000AD ++:10074000FDB2800019B38000EDB080005DAE800086 ++:100750002DAE800029B28000A9B08000A1B1800038 ++:1007600005B2800039B28000A9AE80007DAF800064 ++:10077000ADB38000A9BD80009DC1800025C7800069 ++:10078000DDC8800065CA8000E1CB8000DDCE80003E ++:1007900019CE800099CE800015CF80000531000071 ++:1007A0000DD88000DDD7800091D78000FD2D00009E ++:1007B000B92E000069D880007DCF800045D9800027 ++:1007C000D12F000099D18000C5EB0000F9E0800036 ++:1007D00071F5800035310000D1DE8000C5F60000E3 ++:1007E00009EA8000A1E480007DF50000E1EC8000D2 ++:1007F00011E3800039EA800039E3800099E380004A ++:1008000029DF80003DF70000D9F50000ADF70000BA ++:100810006DF80000B5F80000BDEB8000B5310000B8 ++:100820003532000051F70000C9F7000005F700005D ++:10083000E1E18000A9E98000B5F6000031F6000092 ++:10084000EDF58000D90081009DF68000C5F780009D ++:1008500085FF800045018100D50281004D038100A4 ++:10086000E50081007DF6800081F78000D5F58000ED ++:1008700051F9800031FB8000F1F68000F9F580002D ++:1008800041FF8000D9F98000DDFC8000A9F78000DD ++:100890002DB6000059FB80008DF78000A5F980007F ++:1008A0008DF9800029F68000A1F880005DF78000B6 ++:1008B00065F6800095FD8000A1B70000F50281007B ++:1008C0002D028100890181000501810091B800009D ++:1008D00099FF800019F7800089F68000C1F680003A ++:1008E00009B7000085F5800005F78000DDF680007F ++:1008F000B1F68000AD6A8100BD6A8100DD2F810004 ++:10090000E1578100F56D8200A98D820009258200E2 ++:10091000196E820001AA81005D608200A537820005 ++:10092000ED69810079598200E55882001D598200E5 ++:10093000FD6D8100493A810041BC8200E95A820084 ++:10094000CD608100D59681001D6181002961810003 ++:1009500089BF81001DAB8100A93282000D330000E8 ++:100960002569810005A6810021AD820029588100FA ++:10097000BD3E8100A540810035958100599B8100D5 ++:100980003D3682001D4582000928810099A0810022 ++:10099000D1288100E93B81008D288100416E8200D1 ++:1009A000859B8100295D81006D398200FD398200BF ++:1009B000253A820095698100C97A810091578100AA ++:1009C0005D57810075308200852F82003557810088 ++:1009D000D12F82002157810049578100F5288100DD ++:1009E00095A8820009EC000089D38100D56B8100B5 ++:1009F0005959810075598100F55A820005AD810071 ++:100A0000F1D2810039378100ED718100C5968100F6 ++:100A10008957820091618200CD618200A9588100CE ++:100A20001D2782004543820001448200156A81002F ++:100A3000614A8100ED4E810071228200055A8100D9 ++:100A40004D8A81007549810071248200B14981007D ++:100A5000B144810075AC8200292B8200595281007B ++:100A6000E12A8200B529820071A7810035A78100A3 ++:100A700001D48100F5BE810055B48100D16A8200A5 ++:100A8000D19C81009D9C8100959B8100B59D81003A ++:100A9000459D8100C59D81006170820009358100FE ++:100AA000A1AB82008DAB820075AB8200F193810017 ++:100AB0009968810015D7810071C182007D2B81006A ++:100AC000E92F81000DB6810025BD82008D4F810088 ++:100AD0000D5081008543820031D78100B1BD820075 ++:100AE00095C182005DB38200DD3400008DD18100AC ++:100AF000A9368100E9BC820029378100E9368100EE ++:100B0000A1D68100A53B81006DAB810041B0810081 ++:100B100045AE8100C9F1000041BD820095BE820052 ++:100B2000CD2E82009D6B8100CD458200453981002C ++:100B3000353B8100BD3A8100F1D58100419F8100A4 ++:100B4000119F810071A48200ADD58100C130810068 ++:100B5000A13982004D618100995B8100A5728100FD ++:100B600089DA810061BF81006157820081218200A2 ++:100B7000A9218200D1AD820009BC8200B5A181000B ++:100B80009DCA8100B92F8200D9BB8200113082003A ++:100B90007DAD8200CDA4810099A48100CDAB8200FF ++:100BA00015AB8200C1AA8200B998810081A581009D ++:100BB000D9D08100A9CF8100E93B8200EDCF81002F ++:100BC00065D1810079D1810051D0810065D081004B ++:100BD000E521820011228200D1350000FD4900008C ++:100BE000FD9C81009145820055AE820041B4810098 ++:100BF00095BD8100F18A8200098B820079D981003C ++:100C00007D618200CDA4820041918100A13F8200DC ++:100C10003594820049948200898982005DC18200F6 ++:100C2000F1C18200D13B8200D5958200E560810050 ++:100C30000920820015F20000BD3B820075A18200F0 ++:100C400025A58200253B8200E93A8200753A8200A0 ++:100C5000F1308200B130820071D781004599820065 ++:100C600091D7810089948200DDC18200A96A820047 ++:100C7000256B8200C944810029458100596B8100A0 ++:100C800059498100EDAA810069618200AD2482008A ++:100C900005368100D535810079D08100A5D081004D ++:100CA000715C8100E1AD8100EDD0810049C9810016 ++:100CB0004DD88100893D82004920820065968200DE ++:100CC000F925820089CF8100856A82001593820010 ++:100CD0002D5D8200E9CA81006D4082006130820092 ++:100CE00015488200313C810061D68100114E81009F ++:100CF0000129810041A1810015A681000999820086 ++:100D0000E5C98100B1D7810035C08200294A810040 ++:100D100041AD8100EDBE82002DBE820005BE820085 ++:100D200079BE820055328100A5958100B1598100BC ++:100D3000E54781009152810015638100956481002F ++:100D40008D668100592C8100392C8100212E810073 ++:100D500065358200D5578200352B8200996082006C ++:100D6000016182001D4082001D2082001DD881008B ++:100D7000A9AC8200F1AB8200F52B820041AE82006B ++:100D8000A9EC0000356A810009AE8200696D82001D ++:100D9000098C8100D58B8100116F810081908100C9 ++:100DA000296C8200DDA18100E92B8100552F820092 ++:100DB000398C8100A55A8200355C820045BB8200D7 ++:100DC00091BE81002D6E8100115C8200258A810018 ++:100DD0004D93810089388200D5378200555A8100B1 ++:100DE000013882008D038100E9208200E13E82000B ++:100DF000914581002D6D81000D58820021478200B0 ++:100E0000FDCE810011CA81005936820051CB81008C ++:100E100025CB8100912E81002D2F8100B93A8200CF ++:100E2000CDE80000DDA9810031D48100D1B382007A ++:100E3000ADA98100D53882008DD88100555E820031 ++:100E4000719A81001541820035DA810019258200EE ++:100E50006926820035358100E93600003D71810048 ++:100E6000012D810009A282000D238200FD71810005 ++:100E7000D960820051728100416182004528810061 ++:100E8000C12382008D6C81006D2382009547810013 ++:100E9000B9D98100B534810075C98100F134810070 ++:100EA0002DBF810059AF8200D93C8100494F81009C ++:100EB000E5AB810009F000007931810005958200E1 ++:100EC0006D638200DD938200A56682000DC88100FB ++:100ED000095E81007D758100156281009159810054 ++:100EE000D575810011498100C1488100B9BF8100D9 ++:100EF000A5458200F5598200F1A9820041A6820031 ++:100F000039588200BD428200BDA782004D22820076 ++:100F100071A78200A5A78200E15C8100ED418200FB ++:100F2000D1A78200D1688100B5CC810015AF8200C5 ++:100F300095418100E1C8810089AA8100E99681007C ++:100F40007D2F8100C548000049428200594482003B ++:100F5000D1E80000313182006149820051F2000085 ++:100F60000DA58100095E8200253E8200CDCD810065 ++:100F700029B382002151810045B18200A91D820060 ++:100F800079BC8200D1568100599D8100999D8100D4 ++:100F9000191C8200513F82001D308100C9BD8100B3 ++:100FA00015388100794A8100DD9B8100199E8100FE ++:100FB00069618100896E8100B5708100D132820043 ++:100FC000F1578100A93382009D5A81003D3582008E ++:100FD00089338200D96E810045708100FD618100F6 ++:100FE000594B81000D9C8100558B8200F18E82004F ++:100FF000E59A8100BD35820049368100291F8200B3 ++:10100000655C82001DEF0000516F8100299B81000B ++:10101000A56D8100B5A28200E1AF8200A9568200D1 ++:10102000894481003D578200E16F8200016F820098 ++:10103000DD728200E53E810095518100FDD4810082 ++:10104000F5BC810081B48100F199810019318100E2 ++:10105000358A8200DDDA8100413D81002D3E81002C ++:10106000E9898200C1D48100FD8D820099B681009A ++:10107000BDA781003D9F82005D0381006D928200CB ++:10108000218B8200599A8100ED278100ED94820026 ++:10109000FD8A81009D8A8100416B8100E16F8100A2 ++:1010A0005D468200A19482009D898200C9928200DF ++:1010B00079998100B1908200219182001D348100D4 ++:1010C00099B28200DD6A82008DC9810059278200B1 ++:1010D000B9EC0000D9908100A56B82006D3C8200C4 ++:1010E000E56D820005C28200C96A8100ED4582007B ++:1010F000816B8100353F8200FD90820071BC8100D0 ++:10110000F16B81003D4E8200514A82003DA2810078 ++:10111000F1E8000079738200B97E8200698882005C ++:10112000695A8200DD2E810015138200117381003F ++:10113000698082009D9181005D8B8100816C8200BD ++:101140008D8F81004D8F810009888100BD6D8200E7 ++:10115000018E81001D5E820091718100C127810096 ++:10116000797582002DBE81002D5B8200E9A5820089 ++:10117000B5728200FD5C0000217D82004D808200FE ++:101180008D7F820001A08100ED7F82002D418100D2 ++:10119000F98481006185820045728200F9548100E2 ++:1011A000692B820069518100C5558100315681004B ++:1011B000A1A6810071508100392A8200615381000B ++:1011C000C5738100F5630000F1978100A99B810040 ++:1011D000FD3B820025A08200DD398100715D810028 ++:1011E000D1EE00004995810009CC810021A3820045 ++:1011F00045AA8100AD818200916782002962820048 ++:101200007D708200E12F8200E903810081DB810093 ++:10121000952482006989820089C38200C5C4820046 ++:10122000F1F20000B1EB820009CB82000DCC82000C ++:1012300059EB820061E9820015F18200E9CD82005C ++:1012400045DF820009F182008DF782008DCA82009D ++:1012500089F38200D5CA8200A1098300C9F7820000 ++:10126000FDEF820099F8820025F9820039FA8200A8 ++:1012700089ED820069810000ADE5820065DA8200B7 ++:101280007DC582002DE6820065EE820031E4820099 ++:10129000E5F182009DC8820055F3820089EF0000CD ++:1012A00061C78200CDE182006DE18200A5E282008B ++:1012B00059DF820029F4820009C7820055EF8200BD ++:1012C000E9EC8200E9DB8200BDDD8200E1C582003D ++:1012D0004DE5820005E08200A5F982000DC582007F ++:1012E00039820000D18400008D85000091E68200E3 ++:1012F000BDCC8200FDE982008DD182002DF18200FB ++:101300002DF7820095FB820069CE8200A1F0820059 ++:10131000D5F08200F5CC820059CB820081D98200C1 ++:1013200045C58200FDCB820025CB8200BDEB82004B ++:101330001DDB820015CD820071860000CDE68200A3 ++:101340004DCF82009DCB8200450C8300E50D8300CC ++:10135000590E8300410E8300010B83004D0A830068 ++:10136000D10D8300310C8300590C8300710A830076 ++:10137000650E8300F10D8300410B8300A11E8300E5 ++:10138000B11E8300012B8300F54E8300112B8300D7 ++:10139000B127830099238300014A8300ED4983002C ++:1013A000FD478300CD4C8300BD4C8300714C83000E ++:1013B000D52783004D25830095258300E14C8300CC ++:1013C000414C8300A1EC000065118300E1448300DF ++:1013D00021288300BD2883007929830065288300A4 ++:1013E000652B830041458300D5298300491D830077 ++:1013F000A12A83005D30830051488300E5488300C3 ++:1014000029488300F5238300114A8300793483003F ++:1014100091188300A5338300ED3483001D118300F0 ++:101420009D4E8300954D8300B51A8300614783006C ++:101430001D4D8300ED1083000D458300C11E830008 ++:1014400001208300E9218300F1258300F91D830039 ++:1014500061EE0000B52B830049108300C10F8300AB ++:1014600021248300A5248300B94A8300B52F83007B ++:10147000C1458300FD1C8300711D8300F5188300A6 ++:1014800059198300F1198300F9E90000492A830002 ++:1014900085890000B957830029578300654F830071 ++:1014A00001608300E559830039518300F54F8300C3 ++:1014B000555483001D5E83002152830065598300CB ++:1014C00079508300714F8300095983003D63830085 ++:1014D000C5578300815C8300B15B8300DD538300CB ++:1014E000115383009D4F830029508300254F8300B3 ++:1014F000D5588300CD62830039608300F95C830096 ++:1015000069F200005D5F83002D548300DD5083008D ++:1015100039578300A555830091638300A16283003E ++:10152000C15D83002D5E8300455F8300A151830070 ++:10153000D58F0000195B83006D5A8300A956830084 ++:10154000A5508300095783000D748300DD63830079 ++:10155000297A830001668300B9B28300D5A783008E ++:101560007D848300819383005DB38300A193830016 ++:10157000E9938300C1E90000BD90000035910000AF ++:10158000717A83005D67830051668300CD708300AC ++:1015900055718300DD7483008DAA830051A88300F8 ++:1015A000A9B183009D918300D18483008992830037 ++:1015B00061848300AD77830081818300158283007D ++:1015C000B1808300E5B583006D7E8300B57983002B ++:1015D00091910000916E8300758F83005587830081 ++:1015E000A1ED00001996830025678300C188830060 ++:1015F000D98F8300F5AC8300E97783009D6D83006C ++:10160000A1A78300FD998300C9A48300619600000F ++:10161000558B8300E58A8300CD6A8300F5868300BD ++:10162000596A8300B9AA83001566830051B283000A ++:101630009DB38300D9B6830059B1830091828300A2 ++:10164000D5B0830081868300C97A83000585830035 ++:10165000797C83008965830055A58300C9AF830029 ++:10166000A1EF00007999830091898300C5B58300BB ++:101670000DB8830099D483002DC083009DC28300E0 ++:10168000ADC38300A1C68300B1C68300C5C2830079 ++:10169000A9D0830055BF8300F9CF830029BF830001 ++:1016A000C5E18300C1C0830095C083004DD883008D ++:1016B0000DD7830015D88300F1D7830079BD83004F ++:1016C000A1E1830035C28300C5E08300DDE0830033 ++:1016D000C5DC830099DA830001DA83004DB883000A ++:1016E00075C0830019C28300F9C983003DD6830009 ++:1016F00015BE8300C9D683005DBA830029D6830056 ++:1017000031B9830035BC83009DD883005DDC830044 ++:1017100029C18300A9C28300E5C0830025DB8300C3 ++:1017200075C283001DD083005DBC830061C6830049 ++:10173000D5C2830005BC830001C98300B5C88300FE ++:10174000EDC8830055D6830015D98300A5D1830049 ++:10175000F1D5830001D9830081B8830089E083003B ++:10176000E1BC8300A5DB8300EDE1830071C1830050 ++:10177000E9B783006DC783008DC183001DC8830056 ++:10178000B5D1830071DC8300E1C18300A9C183006E ++:1017900019DC830039D883004DCB8300A5B78300C3 ++:1017A00069CB83008DC98300C9D48300B59700003D ++:1017B00099D68300E5DC83004DD483001DC38300EC ++:1017C00021DD830045D983007DD383003DD2830092 ++:1017D00041DA8300CDD88300D9BF830095BD830053 ++:1017E000EDBD830051C083002DB8830049BB830049 ++:1017F00031BB8300CDDA8300D5D0830049CA830092 ++:101800009DD5830081BF8300D5CF83003DC9830070 ++:10181000DDD18300B9D7830025C78300BDC3830012 ++:101820005DBE830021E18300F9E0830071B983008C ++:101830008DE1830025D9830049D78300DDDB830058 ++:10184000A9B9830085BA83001DF1000059EB83001C ++:10185000C5E7830041E2830025E283006DF5830044 ++:1018600065EB830085F2830089F78300B1F2830082 ++:10187000A9F58300AD008400E100840019FD830018 ++:1018800035EE8300FDF383003DEC830089FB83008C ++:10189000B9FA830021F98300F1FA8300D9F88300B3 ++:1018A000D9F9830031008400C5FE830049E7830035 ++:1018B000050084004DFF83006DF3830059FE830013 ++:1018C00001FE830025EB83000DEB830031018400D2 ++:1018D00035FD830081EB830059FD830011F88300FF ++:1018E000FDF78300C5ED8300ADED8300A101840009 ++:1018F000E9E78300B1F38300DDF2830025F3830081 ++:10190000F9E68300E5E2830071ED0000A5E98300BC ++:101910008DF5830051EE830079F8830071E2830036 ++:10192000F1E8830045E6830099F783006DEE8300BC ++:1019300041F48300B9EB830075E78300B1E88300CD ++:10194000DDA0000061F1830035F2000089EE830024 ++:10195000E9A10000FDE58300A9FD830085ED0000FD ++:10196000B5FB8300F1F183002D108400E1158400A4 ++:10197000B1198400C5158400D90F8400CD218400DD ++:10198000491E84004D1F8400E1128400ED0884008C ++:10199000F10184002D0F8400ED238400F51E8400E6 ++:1019A000E520840049208400AD128400F11A8400EF ++:1019B000711F8400C9198400AD188400450B840090 ++:1019C000910B84000D2484008D2384000D18840065 ++:1019D000210684008D168400310384006909840087 ++:1019E000FD158400E902840001028400A909840035 ++:1019F0008D148400811E8400E10B8400751C84001A ++:101A0000AD0A840049108400712084000121840003 ++:101A1000850A8400291D840045078400390C840050 ++:101A200029198400551E840089038400E51D840063 ++:101A30002125840049138400291A840055ED0000F3 ++:101A4000ED12840045068400010D84008943840062 ++:101A50006D2A8400014D84001528840069288400C3 ++:101A600021D7000009408400112C8400F92784004C ++:101A7000912D8400794C84008934840019338400CA ++:101A80006D2F8400C92D8400F12E84007D2E8400EA ++:101A900065258400DD348400FD2584001929840037 ++:101AA000B5408400D944840079298400B92B84008E ++:101AB0003D45840095328400B9288400D1388400E3 ++:101AC00031488400A93084006D2C8400994384003F ++:101AD000D13284006D338400FD2F84005D45840085 ++:101AE00011348400B54A840075488400C5488400D8 ++:101AF000B1278400314A8400D949840059328400D6 ++:101B0000014C840039388400314D840055448400F0 ++:101B1000D93D840055438400513C840091398400B0 ++:101B20009536840091378400F5368400E1478400BF ++:101B300015478400CD4C8400F52B84002546840095 ++:101B4000E53A8400C937840049428400292A840088 ++:101B5000A53F840059268400952A8400452B8400E3 ++:101B6000C95D8400A95B8400A15684009556840059 ++:101B700019578400E956840005578400355F8400B6 ++:101B80001D628400B557840065638400ED628400A3 ++:101B900021638400BD628400194E8400B95384001F ++:101BA000B15D8400B5518400D55F8400F95584008F ++:101BB0006560840059538400E5538400E94D840036 ++:101BC000DD518400E15F84008D5384007D5B8400DF ++:101BD000B55B840031568400A5638400CD60840029 ++:101BE00091638400ED5084002D5E840031518400A7 ++:101BF000155C840061548400F55E8400F15D84000E ++:101C0000315A84007152840059588400815C8400E8 ++:101C1000715784002557840071588400AD568400A4 ++:101C2000415984006D4F840029508400E1548400A0 ++:101C3000BD6184006D61840005598400A56684003F ++:101C4000D9678400456684000D658400916784002F ++:101C5000B96384005D67840079678400F966840055 ++:101C60002165840021678400C56684008D66840038 ++:101C70006566840011688400516C8400AD6E840038 ++:101C8000016E8400F97084004D7F84007D6C8400B7 ++:101C90002D748400456A84000D7B840099EC00005B ++:101CA000156E8400457A8400E56C8400456F8400DD ++:101CB000C17C8400297E8400756D8400956B84004E ++:101CC000B56D84007D7D84005D6B8400D56A8400E1 ++:101CD000816A840085748400B1808400857E8400DC ++:101CE000CD7F84004981840069818400ED8984006E ++:101CF0006D8A8400FD8984008D8984009D8984001B ++:101D0000E9858400F982840025858400518A840055 ++:101D100075858400958484008181840071838400AA ++:101D2000C18984005D898400D58984006D8984001F ++:101D30007D8984000D8A840009868400798C840062 ++:101D40007D8A84000D8B8400499484008D928400E8 ++:101D5000E98D84009D8B8400FD8C84007990840043 ++:101D60000D8C8400458C8400E9A68400A5AD840018 ++:101D700029968400C598840015C1840009A98400AF ++:101D800099C2840045B7840031C18400D1B8840071 ++:101D90008D998400B99A840025AC8400D9BF840051 ++:101DA000C9BE8400A196840025B18400519B8400A3 ++:101DB000919884004D9784001D9784007DA684002F ++:101DC000D1B784002DAB84008595840019B08400C0 ++:101DD000F5AD840029A98400C1A98400219F840055 ++:101DE00025A28400B1AE8400C1AF8400D5A38400D5 ++:101DF00075B7840041A28400E1BC84006DA8840012 ++:101E0000BD9D840095B884005D95840075BE8400F6 ++:101E100051B98400A9958400C5C18400599A8400F1 ++:101E2000419684003DB884009DA88400E5A8840004 ++:101E3000A59B8400F5A684003DAF8400159A84001C ++:101E4000F9988400EDA984006DB18400FDF0840050 ++:101E500025DF840025ED8400E5D08400CDF18400E9 ++:101E600009F2840035F2840055F28400CDF284003A ++:101E7000B1D38400F5D384002DD48400C1D4840070 ++:101E8000A5048500F90585006D0585009904850088 ++:101E90008D04850079D4840045E88400B1C58400B0 ++:101EA00095DF840031DF840075E484001DE0840048 ++:101EB000BDC9840005ED8400A500850091FB840068 ++:101EC000F9ED840091EF84009DFB840081EA840099 ++:101ED00079E2840059C6840061EB8400A1EB8400A0 ++:101EE000D1E484009D028500A1F3840015CC840018 ++:101EF0005DFB840081C5840015D5840099D68400DB ++:101F000035E78400B9DF840045F48400B9C7840054 ++:101F100001DF84002D018500E1C7840025D1840004 ++:101F20006DFA8400BDDD84004DF38400E1C98400B6 ++:101F300041E084002DCA84009DD4840005EB840018 ++:101F4000D900850079CB840021FC8400B9E88400A5 ++:101F5000B5D8840031FD8400BDFB84001D048500DC ++:101F60005D048500B9E90000450685005DEC84004C ++:101F700025C384001DF38400D9C684002DEC8400A1 ++:101F8000F1C5840059E9840019C88400B1EF8400C8 ++:101F9000B100850049D3840001C98400E1D28400E6 ++:101FA0008DCB8400DDEB840011F4840009FC8400F7 ++:101FB000D9F3840069C38400A1C884002DEE840095 ++:101FC00071D6840079018500D9EC000025D8840001 ++:101FD000DDF9840009F0840035F7840029F98400D4 ++:101FE000D9FC840015D78400DDD584001DDE840073 ++:101FF000D9F5840019F1840099F1840049F1840035 ++:10200000F1F48400A1F48400F1D084003DCC84007C ++:1020100069D2840089E9840071CD8400C9D3840029 ++:102020008506850089078500E90685004D0785003E ++:102030001107850025078500710685009506850036 ++:10204000BD06850075078500B10785009D078500E1 ++:10205000A9068500D1068500FD06850039078500A3 ++:10206000610785005D0685001509850079098500F1 ++:10207000350A8500BD0985000D0A850019A20000FA ++:10208000E9EC00004D0A8500A909850025098500B5 ++:10209000DD0A85006D0A850081088500C507850079 ++:1020A0000D0B8500590F8500ED118500C9128500C3 ++:1020B00021108500F90D8500D5118500511085008E ++:1020C000AD118500011185006D10850065A401002A ++:1020D000850F850085108500990D850011128500FA ++:1020E0000D22850041178500D917850075208500D0 ++:1020F0007D2C8500352F8500B92285002D25850092 ++:102100009D238500612F8500A5278500C92A8500AC ++:102110006D2985009D22850031228500A52485003A ++:10212000E1238500B12F8500BD2C85005914850061 ++:10213000C9138500A11C8500452C8500A9178500C1 ++:10214000B1208500311A8500FD178500291D850005 ++:1021500021148500AD218500B5308500453185000D ++:1021600035278500D1318500C5148500BD2D85003A ++:102170002D23850059238500891485004D4685004F ++:102180006547850025368500514785003D46850019 ++:102190008D3C8500514A8500994A85007547850028 ++:1021A0001D478500553685005D468500D53B850079 ++:1021B00049498500D53A8500E139850041398500D6 ++:1021C000E53885000937850045358500C93C85001F ++:1021D000754B8500B9458500ED4885002146850091 ++:1021E000213A8500A940850001328500F53285003D ++:1021F000FD378500894E8500DD508500ED50850056 ++:102200005D57850009558500495085005D50850062 ++:10221000D1528500F5528500E54E8500C9558500EF ++:1022200065568500C9508500094F850025A5010028 ++:102230009D5585000D538500A94C8500B957850033 ++:10224000A55785000D518500FD5A8500D5518500A3 ++:10225000A9518500B15285009D53850039558500EF ++:102260009D4E8500C95785006D578500954C8500AA ++:10227000095785008D4F850091A50100FD59850006 ++:10228000014D8500ED598500D9598500194C85000F ++:10229000756C8500816E8500516C8500295C850018 ++:1022A000416E8500795E850059EA0000AD6E8500BB ++:1022B000B56C85006D6585001D5F8500196B850017 ++:1022C0008579850071738500B58E8500E19585005F ++:1022D00001828500519085002D828500D190850076 ++:1022E000FD908500BD9285006D8F8500CD928500A3 ++:1022F00055968500C58E8500857285005D8D8500AB ++:1023000001838500C1918500257085000D918500B0 ++:10231000C17685006971850041718500F97F85006E ++:1023200079708500F19385009D958500F574850091 ++:10233000497485006D788500BD728500ED8A850041 ++:10234000C98C850099918500597D8500BD718500F6 ++:10235000758185000D818500A9798500217785002B ++:102360002193850089928500D194850095968500FA ++:1023700065838500D973850065828500D5A5010038 ++:102380005975850021768500556F85006D9585000E ++:10239000E583850029848500AD8F8500F16E850079 ++:1023A0006D0101004DFB0000F90001007109010001 ++:1023B000C5000100EDFD000069FE0000750401008C ++:1023C0002DFE0000FDFD0000F5FD00002D0F0100B9 ++:1023D000390101000D0A01006DFB000045030100F9 ++:1023E000CD04010095FD0000A9FB0000851201004D ++:1023F000A5FB000085130100B5150100AD0001002B ++:10240000ADFD00001D0101006D0501005D09010029 ++:10241000BD0001009DFB000095FB000031030100A1 ++:1024200001070100F506010029030100250601004E ++:10243000510301005D050100E5FF0000C9FE000039 ++:1024400095180100E9FF0000C9000100D10001005A ++:1024500059030100710D0100C50D010081FF00004D ++:10246000A50001005108010025A3000061A30000A0 ++:102470009DA30000E1A6000025AC0000B9F9010011 ++:102480008DAC000095AC000055AF000045B00000D9 ++:10249000ADB0000005B20000B9B60000F9B8000008 ++:1024A00031B9000055B9000061B90000B1B90000B0 ++:1024B0008DBB0000C9BC0000B932000055330000DC ++:1024C000613400009DE800006537000099E80000D5 ++:1024D000D5510000C16B0000E9750000757E000059 ++:1024E0002DC7000065C800008DD10000C5D50000D3 ++:1024F00009F10000B998000081E800007DE80000C3 ++:102500006DE8000075E800001DD700008DE80000B0 ++:1025100089E8000091E8000095E8000069E8000003 ++:1025200071E8000079E8000085E8000039D7000074 ++:102530003DD7000045D7000049D700004DD7000027 ++:1025400039E7000055E7000075E7000035E70000B7 ++:1025500031E7000071E7000051E700004DE700009F ++:1025600049E7000045E7000041E700003DE70000C3 ++:10257000C5E70000D1E7000001E8000021E8000005 ++:1025800025E8000039E8000035E8000031E80000E7 ++:102590002DE8000029E80000C5E80000BDE80000C3 ++:1025A000B5E80000C9E80000B1E80000A5E80000B7 ++:1025B000B9E80000A1E80000A9E80000C1E80000B7 ++:1025C0003DE8000001000000200000001F000000A6 ++:1025D00050000000020000000100000001000000A7 ++:1025E000010000000000000015A701000A07080014 ++:1025F0002157020051FB800055B900002DB60000A4 ++:1026000000000000D1F980000000000029FB8000DC ++:1026100000000000000000009C1800409600FFFF32 ++:10262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA ++:10263000FFFFAAAA0300409600000000000000006F ++:10264000000000000000000000000000000000008A ++:10265000000000000000000000000000000000007A ++:10266000000000000000000000000000000000006A ++:10267000000000000000000000000000000000005A ++:10268000000000000000000000000000000000004A ++:10269000000000000000000000000000000000003A ++:1026A000000000000000000000000000000000002A ++:1026B000000000000000000000000000000000001A ++:1026C000000000000000000000000000000000000A ++:1026D00000000000000000000000000000000000FA ++:1026E00000000000000000000000000000000000EA ++:1026F00000000000000000000000000000000000DA ++:1027000000000000000000000000000000000000C9 ++:1027100000000000000000000000000000000000B9 ++:1027200000000000000000000000000000000000A9 ++:102730000000000000000000000000000000000099 ++:102740000000000000000000000000000000000089 ++:102750000000000000000000000000000000000079 ++:102760000000000000000000000000000000000069 ++:102770000000000000000000000000000000000059 ++:102780000000000000000000000000000000000049 ++:102790000000000000000000000000000000000039 ++:1027A0000000000000000000000000000000000029 ++:1027B0000000000000000000000000000000000019 ++:1027C00000000000407C704713B500F001D90246BC ++:1027D00008B904460FE000240AE0104601A90022CF ++:1027E000FFF3B6F7019A13782C2B08BF013201349E ++:1027F0001378002BF1D120461CBDC046B0F8423002 ++:1028000070B50446C3B142F2197503E00A2003F023 ++:10281000A3DF0A3D236B1B6913F0704307D0B3F1AC ++:10282000005F04D0B3F1405F01D0092DEED1226BDF ++:10283000136823F01003136070BDC04670B50446E2 ++:10284000D0F8B40030B1037823B1FFF7BBFF0546E1 ++:1028500010B10BE0012509E0D4F8B400012100F02B ++:10286000DDD903E0606A002204F05ADA0121204633 ++:1028700002F0BCDA01460028F4D125B9D4F8B4003E ++:10288000294600F0CBD970BD70B590F87831054677 ++:10289000FF2B1FD0104C406AE36E9847D4F89C3051 ++:1028A000686A984701280BD895F8141241B90B466D ++:1028B00028460A4A03F07CDE012385F8143209E039 ++:1028C000054B686AD3F89C3095F805419847241861 ++:1028D00085F8064170BDC046E0A685003D988000A1 ++:1028E00070B590F818320446012B32D00123002530 ++:1028F00080F8183206E025B1A0682946012204F0CC ++:102900000FDA3546134B606A00219B6B98470646E9 ++:102910000028F0D1D5B1D4F80C323BB11B782BB1E3 ++:10292000A0682946012204F0FBD908E0D4F8F4108D ++:1029300019B1A068012204F0F3D9C4F8F450D4F816 ++:10294000F830AB4202D10023C4F8F830002384F8F9 ++:10295000183270BDE0A6850010B5084671B191F837 ++:102960000832012B0AD091F875313BB14B691A6AD4 ++:10297000034B02EA03030BB10CF000FC10BDC04690 ++:1029800000FC0101D0F8943110B59942044601D9F8 ++:10299000002002E00CF0F2FBE08D10BDD0F88011B9 ++:1029A00010B5044691B10223C068D4F8842108F020 ++:1029B00015DB074B1B684BB9D4F88011D4F8842180 ++:1029C000E06881EA0202023308F008DB10BDC0466D ++:1029D000A8F401002DE9F04190F817320446012BCC ++:1029E00077D00123002780F8173243E0A0683146F2 ++:1029F00000F092DBD4F8F0301B68984205D92846E5 ++:102A00000021324600F01EDB42E02046FFF73CFF8B ++:102A100035690023AB7194F8783131462B7294F804 ++:102A2000063184F80731DBB26B72D4F8FC31606A8E ++:102A30000133C4F8FC316A79274BD20982F00102D4 ++:102A40005B6A9847B0B9D4F8F8106B7900293CD08C ++:102A500013F00F0F39D06A782B7843EA02230F3333 ++:102A60001B091A0A0A6918BF0023937194F8783178 ++:102A700013722AE0D4F8F0301B68012B08D904F156 ++:102A800028052846002100F05FDA06460028ADD16F ++:102A9000002384F81732C4F8F8302FB16269043388 ++:102AA0005364204607F04CDFE28DD4F8C8319A42D7 ++:102AB00003D9206901F0D4DD0BE0D4F8CC319A427F ++:102AC00007D2206901F0BEDD03E00127C4F8F860F9 ++:102AD000D0E7BDE8F081C046E0A685002DE9F041D1 ++:102AE00090F816520023066A044603626DB18D4BBE ++:102AF0001B686BB3D0F88011D0F88421022381EADF ++:102B00000202C06808F06ADA22E090F87931FBB17D ++:102B1000D0F88011E1B1D0F884210223C06881EAA5 ++:102B2000020208F05BDA94F8153284F8795184F8DF ++:102B30007C5123B1204607F06BD984F8155294F8E4 ++:102B40007B312BB1D4F88C0103F0B8DB84F87B51D6 ++:102B500016F0804706D0204607F0AED820460CF08D ++:102B600003FB34E0002E2FDA63695B6813F0040581 ++:102B700018D094F8743133B92046394607F0BEDDD9 ++:102B8000204607F009D9206984F8747101F044DC0B ++:102B9000626920461368022143F00403136006F0C3 ++:102BA00077DE11E0012384F87431206901F044DDFF ++:102BB0002046294607F0A2DD204607F0EDD86269DD ++:102BC000136823F00403136094F874510DB10027C7 ++:102BD000A5E016F0010F07D02046012107F08EDD99 ++:102BE0002046012106F054DE16F0020F09D0012321 ++:102BF00084F87731D4F8FC301BB12046294606F022 ++:102C000047DE16F4807F04D0D4F864310133C4F871 ++:102C1000643116F4007F12D0D4F86831D4F8F4107F ++:102C20000133C4F8683131B1A068012204F078D8CA ++:102C30000023C4F8F4302046002107F05FDD16F0D1 ++:102C4000007F04D0D4F86C310133C4F86C3116F035 ++:102C5000806F04D0D4F870310133C4F87031324839 ++:102C600006EA000018B12046314606F03FDE16F0B5 ++:102C7000040F074623D0D4F8801101B30123626901 ++:102C800084F87931136A526A134013F0F00503D0C7 ++:102C9000204607F055DE12E0D4F884210223E068D4 ++:102CA00081EA020208F09AD994F87B3184F87C51C9 ++:102CB0002BB1D4F88C0103F001DB84F87B51E68D55 ++:102CC0006EB3D4F8A051012D02D0072D0CD023E013 ++:102CD00094F87A211ABBD4F89001D4F8981103F033 ++:102CE00089DA84F87A511AE094F87A3173B1D4F819 ++:102CF00094319E420AD2002104F1280000F05AD9F2 ++:102D000003695B7803F00F03032B08D1012E03D96D ++:102D1000204631460CF046FA2046FFF75BFE384667 ++:102D2000BDE8F081A8F4010000FC01012DE9F041AB ++:102D30000746884616461D4642F2197403E00A20EB ++:102D400003F00ADD0A3C79690B6D002B02DA092CCD ++:102D5000F5D11FE0AB191B0243F00042069BB3F113 ++:102D6000807F04D198F8003043F08073D21842F28B ++:102D700019740A6503E00A2003F0EEDC0A3C7B6963 ++:102D80001B6D002B02DA092CF5D103E0012088F835 ++:102D9000003000E00020BDE8F081C0460022C36B97 ++:102DA0000BB1013BC363531CDAB21030102AF6D1C9 ++:102DB0007047C0462DE9F041066805460F46706829 ++:102DC0004FF4BC7103F084DF08B9044612E000211F ++:102DD0004FF4BC720446FFF333F1D5F8603126603E ++:102DE000C4F8603195F86431C4F8687184F86431CE ++:102DF0006B6863602046BDE8F081C0462DE9F04174 ++:102E00009846036817461B680C6993F895308E8ABC ++:102E10003BB1CB8A13F0800F03D104F11E010120D6 ++:102E200020E00D2E3FDD04F10C014B78227B43EABC ++:102E30000223B3F5C06F01DB002013E0152E32DD55 ++:102E400004F10E051A4829460622FFF379F018B955 ++:102E500004F11401013005E0294606221548FFF36C ++:102E60006FF020E04A780B7842EA0322B2F5014F76 ++:102E700008D104318A1CA3199A4214D84A780B78D5 ++:102E800042EA032240F606039A420CD18A1CC4EBA4 ++:102E90000203C3EB06031C2B00DC04D13A6088F864 ++:102EA0000000002001E04FF0FF30BDE8F081C04697 ++:102EB00014D28500B0A6010003682DE9F74F012A5E ++:102EC00014BF2A25322506460F46586829469146E2 ++:102ED00003F056DF834640B9336801381B68D3F8E6 ++:102EE0008C20136D013313656CE007F10E0A046941 ++:102EF0005146042201A8FFF33FF0019B06F1280888 ++:102F000003F47F421B0643EA02234AF6FE12B2EBA9 ++:102F1000134F0BBF2C4907F108012046204606221B ++:102F2000FFF32AF00622A01D4146FFF325F004F12D ++:102F30000C02B9F1000F0DD02B0A237304F10E001F ++:102F4000557022490622FFF317F008232375062344 ++:102F5000637503E008232373062353706419A4F1F7 ++:102F60001C05394606222846FFF306F0002304F824 ++:102F7000163C023304F8153C4146062205F10800D0 ++:102F8000FEF3FAF707F11801042205F10E00FEF333 ++:102F9000F3F707F10801062205F11200FEF3ECF742 ++:102FA0005146042205F11800FEF3E6F7D6F85C312D ++:102FB00030680133C6F85C315946D6F8682125F0EF ++:102FC000F1D80120BDE8FE8F2C9E850014D285002B ++:102FD0002DE9F74F012B14BF2A25322599460368A6 ++:102FE00006460F465868A91C934603F0C9DE804682 ++:102FF00040B9336801381B68D3F88C20136D013356 ++:10300000136579E0036907F1180A9C1C838A51460D ++:10301000023B83820422046101A8FEF3ADF7019B09 ++:1030200003F47F421B0643EA02234AF6FE12B2EB88 ++:10303000134F0BBF314907F10801204620460622F5 ++:10304000FEF39AF70622A01D5946FEF395F704F108 ++:103050000C02B9F1000F0DD02B0A237304F10E00FE ++:10306000557027490622FEF387F7082323750623A8 ++:10307000637503E008232373062353706419A4F1D6 ++:103080001C05394606222846FEF376F7002304F88D ++:10309000163C023304F8153C5946062205F1080097 ++:1030A000FEF36AF75146042205F10E00FEF364F7C1 ++:1030B00007F10801062205F11200FEF35DF707F1A2 ++:1030C0000E0105F118000422FEF356F7D6F8483138 ++:1030D000D6F868110133C6F84831012386F8643107 ++:1030E0003368986801B189680123424608F058FBAB ++:1030F000002386F864310220BDE8FE8F2C9E8500F7 ++:1031000014D2850010B50368D3F800481B6893F803 ++:10311000AB306BB1FFF742FE08E0A16829B1012096 ++:1031200008F070FA08B1FFF739FE2468002CF4D1DA ++:10313000002010BD7047C046C3682DE9F041064627 ++:103140000D4658683821174603F0C2DD044610B911 ++:103150006FF01A002BE000213822FEF371F70123F3 ++:10316000294623606360A360062204F10C00FEF38D ++:1031700003F76B8E05F10901A3742B7A04F1140097 ++:10318000E3742A7AFEF3F8F66D8D3046A586E7865D ++:103190002146382221230BF003DC00B907E0F36855 ++:1031A00021465868382203F0A3DD4FF0FF30BDE818 ++:1031B000F081C04630B50C4690F8CF1091B09446DF ++:1031C0009E460380194D91B94FF0FF33029303934C ++:1031D000049305930D330094019106910791089192 ++:1031E00009910A950B900C930D910E9115E04FF0FB ++:1031F000FF33029303930493059300F1D0030693E6 ++:103200004BB2002207930C2300940192089209927A ++:103210000A950B900C930D920E927146044A6346E8 ++:10322000C06823F069DE11B030BDC04631F6000041 ++:103230002C9E85001FB5836D0446012B17D1B0F875 ++:10324000583113F0010F12D1C36893F8703273B97B ++:1032500002AA01A903AB0CF071FA029A3AB1204616 ++:103260000199039BFFF7A6FF08B90223A3651FBDC1 ++:1032700010B579B1B0F8583143F00103A0F85831D6 ++:10328000836D022B15D1C3680C21D3F8680151F06E ++:103290008FD90EE0B0F8583113F0010F09D023F0A8 ++:1032A0000103A0F85831836D1BB101238365FFF73B ++:1032B000C1FF002010BDC046642912DC632920DA5A ++:1032C0004A291ED006DC07291EDB082919DD3C2906 ++:1032D00017D019E0502914D016DBA1F15C03032BA1 ++:1032E0000EE0C32905DCC2290BDAA1F1A803022BE9 ++:1032F00006E0B1F5847F04D006DBA1F58973012BCC ++:1033000002D86FF0160000E00020704730B5072AA1 ++:103310001C469DF80C5001DD496809B9036B19681A ++:10332000032906D04B1E012B10D8036B1B68994252 ++:103330000CD12DB190F8293013B96FF00A0007E0D5 ++:103340000CB9204604E00020216001E06FF00C0081 ++:1033500030BDC046C88810F0080018BF6FF01600D6 ++:103360007047C046D1F8D83270B50546188C16465D ++:1033700010BB8B6D40F2371203EA0202002A0CBF29 ++:10338000012411242A6B1368022B07D195F85C36AF ++:103390000133DBB2012B98BF44F02004537D53B1BD ++:1033A000B06B06F13C0122F055DE20B195F94736AD ++:1033B0000BB144F48064204670BDC04691F801C052 ++:1033C00030B5BCF1010F45DDCA788B7843EA0223A2 ++:1033D000012B3FD1ACF10203032B3EDDACF1060320 ++:1033E000012B3ADD0B1D1D1D6A781B79002043EA75 ++:1033F0000222864600E00130ACF10803904203EB64 ++:103400000E0406D0AEF1040EACF104037344042B99 ++:10341000F1DCC0EB0203A4EB830001281DDD05EB0A ++:103420008203DA789B7843EA022E821E002301E0B1 ++:103430000133043A734501D0032AF9DCC3EB0E03D0 ++:10344000A2EB8303012B08DD023B06D0C3EB0C0388 ++:103450004B7002E06FF0160000E0002030BDC04667 ++:103460002F2A30B50446964602D86FF00D0034E09E ++:10347000B0F88031056B0B60B0F88231AA894B60DF ++:10348000EB891B0743EA023302688B601069BEF1C7 ++:103490003B0FC36BCB6093680B61836A4B61C36A5C ++:1034A0008B61B2F87A30CB61D4F884314B62D2F8B8 ++:1034B000B0300B6243688B62836BCB620CD92B8973 ++:1034C00000220B636B89BEF13F0F4B638A6303D904 ++:1034D000036C1046CB6300E0002030BD2DE9F041C5 ++:1034E000064633680F4693F84630154613F0030F2F ++:1034F000C2F3072402F07F00C2F3C01E15D0BEF154 ++:10350000000F12D0032C54D8202807D1B6F8263645 ++:1035100003F44063B3F5406F4BD10CE0072801D9A9 ++:10352000032419E0032C44D015E0244B00F07F0263 ++:103530009B56002B02DA012C3BD80CE0022A05D066 ++:10354000042A03D00B2A01D0162A32D13B68022B61 ++:103550002FD174BB05E024B1D6F860369B78012BDF ++:1035600027D00146BEF1000F05D0022C40F00061CB ++:1035700008BF40F0016141EAC42415F0804F18BF34 ++:1035800044F0804415F4000F18BF44F4000430B137 ++:10359000304621463A68012327F0DCDE48B1C5F306 ++:1035A000405044F0004110B10020B96403E0796458 ++:1035B00001E06FF01C00BDE8F081C046401B8600B2 ++:1035C00010B519B14068302203F092DB10BDC0463F ++:1035D00010B50446D0F860068E46C37A90F80AC04B ++:1035E00093B182894FF6FF739A420DD0837B43B922 ++:1035F0008378012B05D0037B03F0010383F00101E5 ++:1036000000E00021C9B20BE0216B71450ED1837B34 ++:103610002BB98378012B02D091F84C1000E00021E7 ++:103620008C4503D08172206938F03ADE002010BD4D ++:103630004FF0FF33A0F83C3210B5044600F50E7091 ++:10364000063000210C22FEF3FBF423685B6B23B9E8 ++:103650004FF0FF33A4F840320DE04FF00F03A4F811 ++:103660003E324FF0F003A4F840324FF47063A4F8F8 ++:1036700042324FF20003A4F8443210BD70B5044644 ++:10368000D4F8741580680BF0E9DFD4F8F816D0F19F ++:10369000010538BF0025A0680BF0E0DF00B9013557 ++:1036A000A068D4F8FC160BF0D9DF00B90135D4F8C6 ++:1036B000E036A068196A0BF0D1DF00B90135D4F803 ++:1036C000E0260023D360A068D4F83C150BF0C6DFD9 ++:1036D00000B90135A068D4F894170BF0BFDF00B92A ++:1036E0000135284670BDC0462DE9F041069F0646CB ++:1036F0000C46A3F10E0519F0A7DC18B1304621469F ++:103700000FF014DFB5F5106F1DD3D4F8F01040F6AC ++:103710000E1240F6081300290CBF114619466268C4 ++:103720000B4B02EA030303B102398D420BD9A37E8E ++:1037300013F0010F07D121F001026B1E9B18B3FBA0 ++:10374000F2F03A6001E03D600120BDE8F081C04642 ++:103750004000018010B5044625F03CDE204616F0FE ++:1037600055DF10BD2DE9F04F07461069A5B0D1F81F ++:103770001090884601F124011A900792069318913F ++:1037800099F80130D2F87CA199F80020339C42EAE4 ++:103790000323C3F38102022A786808930B9201D0B5 ++:1037A000002302E0089DC5F3C013DBB24146169327 ++:1037B000FFF330F504300A90329888B1037A0B2B6E ++:1037C00008D197F8F0375BB197F8F13743B18379B7 ++:1037D000072B05D832990A9A91F90F30D2180A921C ++:1037E000D7F88831002B1CDA329BD3B11B7A022B1D ++:1037F00017D197F8A034A3B91A9DAB6D13F0080F39 ++:103800000FD132988379292B0BD8032B09D90B2B95 ++:1038100007D82F99012904D10A9A199108320A92DE ++:1038200001E000231993D8F81030B8F81420A3F160 ++:10383000760676329D1FA8F8142000217022C8F861 ++:10384000106030460595FEF3FBF31898036813F4F7 ++:10385000806F01D0828827E00799A64B4A6802EA68 ++:103860000303D3B1089A02F0FC03882B15D199F811 ++:10387000043013F0010F10D1B8F816302F9D03F06B ++:1038800007032E9801EB43016B1E9842B1F8BE204E ++:103890000AD1531CA1F8BE3006E00B99012914D0BF ++:1038A00000224FF0100B04E00B9B012B0DD04FF0CA ++:1038B000000B2E9D05F00F0343EA02139BB289F81B ++:1038C00016301B0A89F8173001E04FF0000B3098D2 ++:1038D000042807D138461A9932460EF091DFADF828 ++:1038E0008C0019E02F992E9D4B1E9D42B7F846255E ++:1038F00002D1531CA7F846352E98309900F00F03DB ++:1039000043EA02135B0147F6E07203EA020201F0A8 ++:1039100007031A43ADF88C20079A92F8DF3023B9D9 ++:10392000089D05F0FC03802B01D14BF0200B724B5E ++:1039300004EA03031BB10020209421941FE00B999B ++:10394000012906D9189A1368002B02DB13F0100026 ++:1039500008D0079C002594F8483003F07F0320939B ++:10396000219349E0396B644B8A6C02EA030343B14B ++:1039700099F8043013F0010F03D0209221920F9098 ++:103980003BE099F8043013F0010009D007980021BA ++:1039900090F848300F9103F07F03209321932CE09F ++:1039A0004A6C554B02EA0303002BE6D120ABD7F853 ++:1039B000600100930DF18F0301930DF18E030293CB ++:1039C0000DF18A03039323AA21AB07994FF072D913 ++:1039D000189A136843F00062189B1A60BDF88A3089 ++:1039E00013F0010F03D0189C42F4005323602E9D66 ++:1039F000D5F1010538BF00250F95D7F86036219A1B ++:103A00009C7A3B6893F8463013F0030100F035814F ++:103A100012F0006F02F07F0104D0072906D9202997 ++:103A200004D02EE0354B5B56002B2ADA12F0804F83 ++:103A300001D1002A25DB22F4401121F4605112F05B ++:103A4000006F21911AD0D7F860068378012B15D921 ++:103A50003B6B93F94D20012A0BD0079D6B6813F047 ++:103A6000804F0BD0B2F1FF3F08D1037B13F0040F5E ++:103A700004D041F4801343F4805301E041EAC423AD ++:103A80002193209911F0006F01F07F0204D0072AE2 ++:103A900006D9202A04D036E0184B9B56002B32DA88 ++:103AA000219B13F0804F01D1002B2CDB21F440121D ++:103AB00022F4605211F0006F209221D0D7F86006F6 ++:103AC0008378012B1CD93B6B93F94D1001290BD046 ++:103AD000079D6B6813F0804F12D0B1F1FF3F0FD1FB ++:103AE000037B13F0040F0BD042F4801343F4805394 ++:103AF00008E0C046400001807F000008401B8600AF ++:103B000042EAC4232093B7F8283603F44063B3F5A0 ++:103B1000406F30D13B6B18690CF070F9219B00F4B9 ++:103B20004070B0F5007F14BF0222032213F0006F33 ++:103B300003F07F0111D0202902D1154605222EE085 ++:103B400097F9CA34B3F1FF3F12D10798436813F4D1 ++:103B5000002F23D01546042221E09C4B5B56002BFE ++:103B6000B4BF97F9C93497F9C834B3F1FF3F15D002 ++:103B700015469AB213E0219B03F07F03202B04BF6C ++:103B80004FF000632193209B03F07F03202B04BFA1 ++:103B90004FF00063209302252A4600E01546219B42 ++:103BA000110223F4E06341EA03032193209B23F4F1 ++:103BB000E06213F0006F14BF41EA020342EA0523FA ++:103BC0002092219A209312F0006F06D097F9DC31F1 ++:103BD000012B02D142F4000304E097F9DC3113B960 ++:103BE00022F400032193209A12F0006F06D097F977 ++:103BF000DC31012B02D142F4000304E097F9DC31FF ++:103C000013B922F4000320930799384612F088D89C ++:103C1000219911F0006202D111920E921DE0D7F8A5 ++:103C2000583693F90530022B02D000220E9207E09D ++:103C3000C1F30223043B012B8CBF002301230E930D ++:103C400011F4000F05D001F07F03072B03D9202BBF ++:103C500001D0119001E004231193209911F000622A ++:103C600001D112921DE011F4000F16D001F07F0374 ++:103C7000072B14D9202B12D00FE0209B22F4E062F6 ++:103C800023F4E06342F4007243F4007302252192AE ++:103C9000209311910E91129103E0129001E00424FF ++:103CA00012940F9888B11A99219BD1F810231A9871 ++:103CB00001EBC201C1F814332F9C0132E3B202F0D0 ++:103CC0003F02C1F81833C0F81023BAF1000F36D004 ++:103CD000FA68DAF80434D2F880410AEBC303C3F877 ++:103CE0000442D2F884013A4AC3F80802B8F8163000 ++:103CF00003F00703D35C022B11D1DAF800100AEBB2 ++:103D0000C102C2F80441C2F80801219B013153608D ++:103D10002F9C01F01F01E3B29360CAF80010DAF89B ++:103D20000424219B0AEBC201C1F808342F98013208 ++:103D3000C3B202F03F02C1F80C34CAF8042421993E ++:103D400011F000642AD011F4000F01F4E06312D0E6 ++:103D50001B0A043B012B1F4801F07F0205D81423E6 ++:103D600002FB0303D3F80C801AE0142302FB0303C5 ++:103D7000D3F8088014E01B0A043B012B154801F01E ++:103D80007F0205D8142302FB0303D3F8048007E065 ++:103D9000142302FB03F353F8008001E001F07F08D5 ++:103DA0000B9A022A00D0BAB9B7F838360A98984266 ++:103DB00004DC189A136813F0806F0DD099F8043062 ++:103DC00083F0010303F0010307E0C046401B8600B7 ++:103DD000C4D285008418860000230D933B6B587D68 ++:103DE00050B1D7F858361B7833B12CB9924A01F04C ++:103DF0007F03D356002B0BDB3B6893F8463013F060 ++:103E0000030F2CD05CB3D7F8583693F9053033B391 ++:103E10002F9A012A13D9D7F858361B780BB11623DD ++:103E200000E03023189C20932193236823F0006343 ++:103E30002360209B43EA0523209321930FE070B178 ++:103E4000D7F858361B7853B14CB97B4A01F07F0341 ++:103E50000E98D35630EA230028BF01200E90219AF5 ++:103E600012F0006F15D102F07F03022B05D0042B56 ++:103E700003D00B2B01D0162B0BD1069939B1022B95 ++:103E800005D097F95C36013B18BF012300E0002301 ++:103E90001193209B13F0006F16D103F07F03022BC8 ++:103EA00005D0042B03D00B2B01D0162B0CD1069C74 ++:103EB00044B1022B06D097F95C36013B18BF0123B1 ++:103EC000129301E0002012900B99079C022904BF75 ++:103ED000079BC3F86021636813F4803F40D097F8D4 ++:103EE000CE31002B3CD097F8D131002B38D0D7F809 ++:103EF000583693F90530032B32D0219B13F0006F15 ++:103F000009D103F07F03022B2AD0042B28D00B2BDE ++:103F100026D0162B24D099F8043013F0010F1FD1AE ++:103F2000089800F0FC03882B1AD1189901240B681B ++:103F30004BF4A04B43F480530B60079B1094D3F8D1 ++:103F4000F0204FF69F73002A0CBF18221E2239F86A ++:103F5000021001EA030343F0200329F8023001E0D4 ++:103F600000201090384621990A9A059B0DF17A0499 ++:103F700019F072DB2346384620990A9A19F06CDB57 ++:103F8000062206F136002146FDF3F6F7209B13F0DA ++:103F9000006F10D103F07F03022B05D0042B03D058 ++:103FA0000B2B01D0162B06D10A99C1F3072386F8F3 ++:103FB0003A1086F83B30189B1A6812F4806F13D0C1 ++:103FC000219B13F0006F0FD0329C14B1237A042B85 ++:103FD0000AD1189842F40063036097F8C3340D992E ++:103FE000002B18BF01210D91219911F0006F0AD10A ++:103FF000114A01F07F03D356002B04DA059A137897 ++:1040000003F00F0301E0059B1B78089C0C93A42C84 ++:1040100014D099F8043013F0010F0FD1109878B92B ++:10402000119A319B38460FF0B9DD89F80200C0F3D0 ++:104030000F2089F803001DE0401B8600109A62B132 ++:10404000119A384640F62A1319F09CD8023080B2F3 ++:1040500089F80200000A89F80300089BA42B09D103 ++:1040600099F8023099F8032043EA022386F83C309D ++:104070001B0A09E099F8043013F0010F01D1109CDC ++:104080002CB1002386F83C3086F83D300BE02099B7 ++:10409000129A319B38460FF081DD86F83C00C0F360 ++:1040A0000F2086F83D001898036813F4007F0DD0A8 ++:1040B00083894BF4005B86F842301B0A86F8433054 ++:1040C000C38986F844301B0A86F845302E9909B911 ++:1040D0004BF0080B09F104021B9299F8043013F01D ++:1040E000010F14D1189B1A6812F4805F0FD197F852 ++:1040F000D03113B112F0400F09D112F4806F04D106 ++:10410000169C14B197F8F8310BB94BF0010B0B98D2 ++:10411000022814D197F8CE318BB1B8F1040F0ED923 ++:10412000A44B30995B5C07EB4303B3F8FE3123B13A ++:10413000189A136813F4806F01D04BF4805B3B6BCB ++:1041400018690BF05BFE199B00F44060B0F5406FFE ++:1041500008BF4BF4807B0BB14BF4004B4FEA1B23A1 ++:1041600086F800B07370329CECB197F8A034D3B9E4 ++:104170001A98836D13F0080F15D1237A0B2B08D1F1 ++:1041800097F8F0377BB197F8F13763B1A379072B34 ++:1041900009D832998A79292A05D80B7B03F00703BD ++:1041A00043EA021A01E04FF0000A189A129C1368C1 ++:1041B000494613F0005F18BF4AF0080A631EDBB2DD ++:1041C000012B98BF4AF4005A301D0222FDF3D4F6A9 ++:1041D0000023B371F37186F82C3086F82D303298B5 ++:1041E000002849D097F8A034002B45D11A998B6D3F ++:1041F00013F0080040D1329B1A7A0B2A0BD197F8A2 ++:10420000F037002B38D097F8F137002B34D0329CA0 ++:10421000A379072B30D832998B79292B2CD8089C7D ++:1042200009F1180104F44073B3F5407F169B08BFF1 ++:1042300009F11E0103B10231022A11D13246329C2A ++:104240002318B3F8BC309375C3F30723D375831CCD ++:1042500002320A2B1846F2D106F12000032209E0AF ++:104260000B2A06F1160002D10231053202E0329B20 ++:1042700093F90E20FDF380F6062206F126001B9925 ++:10428000FDF37AF69DF88C30002286F84C309DF8CC ++:104290008D3086F84E2086F84D3086F84F2086F80F ++:1042A000502086F8512086F8522086F8532086F850 ++:1042B000542086F8552086F8562086F857200D9C05 ++:1042C0000CB10E9203E00E98002800F01D81002230 ++:1042D00021992B46384622F0AFDD209980460022F6 ++:1042E00038462B4622F0A8DD18F00061834609917C ++:1042F00006D1314B08F07F029B56002B2ADA36E0BC ++:1043000018F4000F08F4E06310D01B0A043B012BE3 ++:104310002A4808F07F0204D8142302FB0303DB6859 ++:1043200014E0142302FB03039B680FE01B0A043B09 ++:10433000012B224808F07F0204D8142302FB030358 ++:104340005B6803E0142302FB03F31B58023B18BF16 ++:10435000012302E0931E18BF012343B197F95C3695 ++:10436000012B04D001224AF4804A139201E0002379 ++:1043700013931BF0006F06D10F4B0BF07F029B567F ++:10438000002B31DA3DE01BF4000F0BF4E06317D093 ++:104390001B0A043B012B09480BF07F0204D81423AD ++:1043A00002FB0303DB681BE0142302FB03039B688F ++:1043B00016E0C04698E08500401B86008418860001 ++:1043C0001B0A043B012B9D480BF07F0204D81423E9 ++:1043D00002FB03035B6803E0142302FB03F31B5897 ++:1043E000023B18BF012302E0931E18BF012343B113 ++:1043F00097F95C36012B04D001244AF4004A149446 ++:1044000001E0002514950E983278737820B142EAC5 ++:10441000032343F4006303E042EA032343F006036B ++:1044200033701B0A73700E9A06F158011591002A19 ++:104430000CBF14250E252A461DAC38464146159B57 ++:1044400019F00AD923462A463846594619F004D9A4 ++:104450002146062206F12E00FDF38EF5119C139BDA ++:104460000A9D019400240E9900934246219B0295D7 ++:104470000394384619F010D986F86000C0F30F2075 ++:1044800086F8610014981299209B009001915A4679 ++:104490000E9902950394384619F0FED886F8340038 ++:1044A000C0F30F2086F835000E9A06F162004AB17B ++:1044B0006FF03B0309F10A01062286F85E3086F8A8 ++:1044C0005F4008E06FF04B0386F85E300E9B0C22D5 ++:1044D00086F85F301B99FDF34FF5099C54B9584A93 ++:1044E00008F07F03D356002B04DA159D2B7803F0D8 ++:1044F0000F0301E096F858300C981B0243EA0000C5 ++:1045000006F15E090C901BE00E99062206F1580098 ++:10451000FDF396F50E99102206F15E00FDF390F57D ++:104520000E9906F12E000622FDF38AF50E9986F803 ++:10453000341086F8351089461391149188468B46BD ++:10454000189A136813F4806F0BD0219A12F0006F41 ++:1045500007D0D7F8400107990A9B2AF011DF86F8A7 ++:1045600033004FEA1A2386F802A0F3700C9BB37451 ++:104570000C9C230AF374209B13F0006F02D097F871 ++:10458000C0A40EE003F07F03022B07D0042B05D05C ++:104590000B2B03D0163B18BF012300E000231FFAAA ++:1045A00083FA18F0006F03D097F8C0349D000EE036 ++:1045B00008F07F03022B07D0042B05D00B2B03D070 ++:1045C000163B18BF012300E000239B009DB21BF0A7 ++:1045D000006F03D097F8C0341C010EE00BF07F038E ++:1045E000022B07D0042B05D00B2B03D0163B18BF92 ++:1045F000012300E000231B019CB23B6B18690BF008 ++:10460000FDFB45EA0A032343C0B243EA00233375A6 ++:104610001B0A7375219B13F0006F02D097F8C044FA ++:1046200012E003F07F03022B0CD0042B0AD00B2BDB ++:1046300008D0B3F1160018BF012004E084188600EA ++:10464000401B8600002084B2119D6B1EDBB2012B43 ++:1046500007D83B6844F01004D3F88C2093690133E9 ++:1046600093612199384615F089DA44EA000080B256 ++:104670003072000A7072219938461FF0B3DDB072B3 ++:10468000C0F30F20F072209938461FF0ABDD307375 ++:10469000C0F30F2070730D9808B90E9979B1414697 ++:1046A00038461FF09FDDB073C0F30F20F0735946FA ++:1046B00038461FF097DD3074C0F30F2070742199D5 ++:1046C00011F0006F0CD0119A042A09D10A9A3846C9 ++:1046D00018F00ADE86F83E00C0F30F2086F83F008F ++:1046E000209911F0006F0CD0129B042B09D10A9A6B ++:1046F000384618F0F9DD86F84000C0F30F2086F840 ++:104700004100079C636813F0400F00F0CE80169DB7 ++:10471000002D00F0CA806A4B30981B5C179307EBA2 ++:104720004303B3F8FE31002B00F0BF8018990B68EB ++:1047300013F4806F40F08D802E9A002A40F089801B ++:10474000219C38462146119A0A9B18F01BDD8246AF ++:10475000B9F1000F1AD04146139A38460EF0E0DF47 ++:10476000149A0446594638460EF0DADF99F80320C9 ++:1047700099F8023043EA022303EB040896F8352047 ++:1047800096F8343043EA022318181BE0109B13B14B ++:104790008046484616E02146119A4B4638460FF0AF ++:1047A000FDD9209C129A21460A9B00EB0A08384644 ++:1047B00018F0E8DC21460546129A38464B460FF0C1 ++:1047C000EDD940191FFA88F3B3711B0AF37183B254 ++:1047D00086F82C301B0A86F82D30179C07EB440313 ++:1047E000B3F8FE51CAEB0804A54225D31898036814 ++:1047F00013F0400F02D0309901291DD0384621997D ++:10480000119AC4EB05030EF093DFFF2802D84FF492 ++:10481000807304E0B7F82A36834228BF034699B272 ++:10482000309B07EB4302B2F82C368B4204D0A2F83F ++:104830002C16384626F02AD83B6893F84430002BD3 ++:1048400033D0309C032C30D8D7F8640117994246F6 ++:1048500028E03B6893F844303BB3309D032D24D8C7 ++:10486000B9F1000F0CD0139A384641460EF058DFCC ++:1048700099F8032099F8023043EA02231A180EE04F ++:10488000219C119A21460A9B384618F07BDC119A2C ++:104890000546214638464B460FF080D94219D7F8D5 ++:1048A00064011799079B3DF08DDC1898036843F06D ++:1048B00084030360BDF88C0025B0BDE8F08FC046CE ++:1048C00098E085002DE9F0479946536A064613F4AF ++:1048D000007F884617469DF920A0146902F124053F ++:1048E00015D0E86883B2000C84F8423084F84400A4 ++:1048F0001B0A000A84F8433084F845002378607866 ++:1049000043EA002343F4005323701B0A63703368A7 ++:104910002D6993F8443093B1F36A03EB4803B3F97C ++:104920001C3063B95DB12B69D3F8D43293F89D3054 ++:10493000032B04D9D6F864012B463DF023DDB8F1F2 ++:10494000040F22D194F84D3094F84C2042EA03240D ++:10495000336893F83830D3B1384612F0A3D806EB59 ++:104960008000D0F84C12D1F85835D1F860055A1CA7 ++:10497000C1F85825C369A1F8C8409A4288BFC261EE ++:10498000D1F86025136A013313624FF6FF74B9F151 ++:10499000000F05D0F26A02EB4802938B53449383D5 ++:1049A0004FF6FF739C4204D03069A821224639F0AB ++:1049B00051D93369394603EB8803D8680C4B4A4612 ++:1049C0005B6A9847002810DA0A480AF077FB0A4A1F ++:1049D000136801331360B9F1000F06D0F26A02EBDD ++:1049E0004802938BCAEB03039383BDE8F087C0466C ++:1049F000E0A68500BC568600E4F4010070B50D46C3 ++:104A0000D0F860160446CB7AAB420CD025B10C31FD ++:104A1000B0F8282615F0F6D8D4F860362046DD72B6 ++:104A2000216BFEF7D5FD002070BDC0462DE9F04F8B ++:104A30008FB000230C461D99074604921A9DDDF89D ++:104A40006C800D930C93DDF860B0DDF864903AF063 ++:104A5000D1DC049A824602F00106009638682146AD ++:104A60002A4643461EF030DC0590002840F0438182 ++:104A7000B4F90630002B1CDAA18822895EB11C9B98 ++:104A8000CDF8008003930195CDF80880490038697E ++:104A900001312B4609E01C9BCDF800900393019552 ++:104AA000CDF80880386949005B4638F059D8059040 ++:104AB00021E1B9F1030F0DD904220DA85946FDF3E8 ++:104AC0005BF2B9F1070F05D90CA80BF10401042220 ++:104AD000FDF352F2049A0D99931E202B22D8DFE8A1 ++:104AE00013F02400260028002A002F0032003A008C ++:104AF0003C004E005000570059005B005D005F0015 ++:104B00006100630021006900700078007A008C0069 ++:104B10008E009200940099009B00A0002100AC0040 ++:104B2000A200B4006FF01603E4E0754B09E0744B8B ++:104B300075E0744B05E0002900F3DA80714B06E064 ++:104B4000714B1B687FE00029C0F2D2806E4B196068 ++:104B50006E4B00223BE06E4BF3E721B16D4B1B68BF ++:104B6000002B00F0C5806A4B002219606A4B1A6066 ++:104B70006A4B1A606A4B1A606A4B013A27E0654B30 ++:104B8000DFE7644A1368002B40F3B2801160B2E0A3 ++:104B9000654BD6E7644B42E0644BD2E7634B3EE0A3 ++:104BA0005D4BCEE75C4B3AE0D7F86C32D3F8D832A5 ++:104BB0009B6848E05E4B1A685E4B1B6843EA024301 ++:104BC00041E05B4B0A141A605A4B01F0FF021A6075 ++:104BD00091E0594BB5E7584B1960002900F08B80E4 ++:104BE000564B00211960564B4FF0FF321A60554B5F ++:104BF0001A60554B1960554B11E0554BA1E7002940 ++:104C000076DD534B0BE0534B9BE74B1E092B6FD8C4 ++:104C1000504B04E0504B94E7002969DD4E4B19607E ++:104C200069E04E4B8DE79AF80630002B5CD14C4B77 ++:104C30000A1E18BF01221A705DE09AF80630002B98 ++:104C400052D1474B1B782B6055E038468E2121F01E ++:104C500087DA400080B200F10A03ADF8243000F199 ++:104C60001003ADF8263000F11603ADF8283000F13E ++:104C70001C03ADF82A3000F10C03ADF81C3000F134 ++:104C800012034FF00008ADF81E3000F118031E307B ++:104C9000ADF82030ADF822004646C14609AB39F8E0 ++:104CA0000310384621F05CDA07AB044639F80310EC ++:104CB000384621F055DA24B200B2241A032304FB4B ++:104CC00003F40BAAC4F34714B45464B21F2C01DDDF ++:104CD0001C33B354B3560136042E984409F102092B ++:104CE000DCD1C5F8008006E06FF00602059202E014 ++:104CF0006FF01C03059305980FB0BDE8F08FC04618 ++:104D0000E8F40100D4F40100DCF40100B4F4010083 ++:104D1000BCF4010030ED0100D0F40100CCF401003E ++:104D2000C4F40100B0F4010020ED010034ED0100F5 ++:104D3000ECF80100E8F80100B8F40100E0F401002B ++:104D40001CED010028ED0100C0F40100D8F40100C1 ++:104D500024ED01002CED010018ED0100C8F4010064 ++:104D6000ACF4010037B5036804465B7E002B40F0CD ++:104D7000C480026992F8EA305BB1D36ED3F8202187 ++:104D800040F2044302EA0303B3F5806F40F0B580BC ++:104D900005E0106E06F0DEF8002840F0AE802368D3 ++:104DA00093F8203033B9206904F072FE22680123A1 ++:104DB00082F8203023681B6FFBB9206904F0E6FD00 ++:104DC00010F1090F19D12268136F13F0020114D1E9 ++:104DD00043F0020313670D4604EB8503D3F84C122E ++:104DE00041B18B7933B94B7923B18B7C13B1204618 ++:104DF0003AF046D80135082DEED123681D6F1DB15C ++:104E0000204612F081D876E0012384F8293020462C ++:104E100020F00CDF2368596B39B103234FF4807203 ++:104E2000009320462946134605E0032300932046BD ++:104E30004FF480720B461EF0C7DEA0680AF034DC27 ++:104E4000236801221A7694F89D3173B120460AF046 ++:104E5000E1F9D4F840352046598E23F0E7DD0023F0 ++:104E600084F89D3120461DF0CBD8B4F85C1720465D ++:104E700021F054DE206904F0B3FE236893F82F304C ++:104E80001BB1D4F834072FF045DF236893F8313095 ++:104E90007BB1002504EB8503D3F84C1231B18B793B ++:104EA00023B94B7913B1204635F002DE0135082DC8 ++:104EB000F0D1204615F016DE204615F04FFB0125F7 ++:104EC000D4F8AC114FF47A720123A0680AF07EDBAB ++:104ED000204684F8F15125F0D9DC204614F07ADE22 ++:104EE000204626F035D850B1204626F00FD820466F ++:104EF000294626F015DA002001E06FF008003EBDDB ++:104F0000D0F8403570B55D8E064605F44063B3F5C4 ++:104F1000406F22D1036893F8463013F0030F0BD093 ++:104F200005F47041D0F85C01B1F5805F14BF002139 ++:104F3000012141F0BFD980B92846FEF373F1044640 ++:104F40002846FEF36FF144F430640E288CBF4FF412 ++:104F500080504FF400500443A5B2326B05F4704307 ++:104F60005268B3F5805F14BF00230123934205D03C ++:104F7000D6F85C01012140F0C1DC0546D6F85C01A1 ++:104F8000294641F00BDA80B905F47043B3F5805F30 ++:104F900014BF38233C23F358346BD6F85C013363D9 ++:104FA000012140F0ABDC34630546284670BDC046A5 ++:104FB00070B50025044680F8E85124F0BFDCE36AB0 ++:104FC0002946986A8022FDF33BF0206905F048F8F5 ++:104FD000D4F840012AF0A6DBC4F8885670BDC0465C ++:104FE0002DE9F04390F8A03187B00446002B40F043 ++:104FF000ED8003681B7E002B00F0E880012380F821 ++:10500000A031006904F0BAFD2269074692F8EA303F ++:105010005BB1D36ED3F8202140F2044302EA0303CC ++:10502000B3F5806518BF012503E0106E05F092FF0F ++:105030000546002D6FD1D4F8680104214FF0B8DA8D ++:10504000204621F0ABDD00B90137A94604EB090386 ++:10505000D3F84C62002E59D096F80680B8F1000FB4 ++:1050600054D1304633F072DB73793F18002B4DD0AA ++:10507000236893F83130002B3FD0D6F8CC3013F0B2 ++:10508000010F3AD0204631460AF0D4F823683F1881 ++:1050900093F89530002B39D0D4F86C122046BC31EF ++:1050A00050F07CDB0546002830D02046294621F010 ++:1050B00093DF2B7E13F0020F19D0284602214FF008 ++:1050C000BFDFB17CD4F86C32D1F1010138BF0021CF ++:1050D000082201920291204631460332BC33CDF8BA ++:1050E0000080CDF80C80CDF8108017F017DDD4F8D3 ++:1050F0006C22012382F8F03008E02046314639F076 ++:10510000BFDE3F184FF47A6001F026DB09F1040995 ++:10511000B9F1200F9AD10025D4F8B434EA18136BF2 ++:1051200013B1506A98473F18343540F2AC439D4262 ++:10513000F2D194F8F1314BB1A068D4F8AC110AF077 ++:105140008DDA00B90137002384F8F1312046FEF7EB ++:1051500095FA236800211976236B4FF0FF32C619A8 ++:1051600018690AF023FE204615F092D9D4F8785237 ++:1051700007E00023291D606801220093FDF362F619 ++:105180002D68002DF5D1236893F82F3073B1631982 ++:10519000D3F84C1239B18B792BB10B791BB1204666 ++:1051A0000AF048F836180435202DF0D1D4F87C02E6 ++:1051B00010B109F0E1FA3618206904F091FC0023DF ++:1051C000801984F8293084F8A03100E0002007B06D ++:1051D000BDE8F0832DE9F04F9DB005462798089271 ++:1051E0000793827AC37A0F4642EA0323289A00F192 ++:1051F0000C010C3A08980B9115930C92C27D837D9B ++:105200000DF1600943EA0223C3F3C70ABAF10E0F96 ++:1052100094BF00210121109102794379079942EA54 ++:105220000323099315F01EF9269A11900A321146AC ++:105230000A922846109A50F0BBDA0024804617AE36 ++:1052400028462799289A4B461794189400961CF0E4 ++:10525000E1DE30B928462799289A4B4600961EF081 ++:10526000D9DEB8F1000F06D0D8F8043013F0010FE2 ++:1052700001D00D9427E00C990B983222FDF31EF219 ++:10528000014620B14078023120F0E4DE58B90C9993 ++:105290000B980122FDF312F2014638B14078023139 ++:1052A00020F0D8DE10B101230D9301E000200D9015 ++:1052B000B8F1000F07D00D9929B9D8F8043043F0A0 ++:1052C0000103C8F804300B980C990322FDF3F6F1A2 ++:1052D000044608B14378A3B92B6893F83F3053B123 ++:1052E000B5F82606C3B2534503D0FDF39BF75045EE ++:1052F00001D1012300E0002300225FFA83FB0E921C ++:1053000011E02B6893F83F3043B1B5F82606FDF362 ++:1053100089F7A378834201D1012300E000235FFADB ++:1053200083FBCDF838B0BBF1000F01D15B4602E042 ++:105330003B1E18BF01235FFA83FA2B6893F84630AF ++:1053400013F0030002D11290139024E095F872320A ++:1053500063B9BAF1000F09D0D7F8D432DB8813F063 ++:10536000200003D112901390149018E00B990C9A1E ++:10537000284620F0E1DE0B9913900C9A284620F085 ++:10538000A7DE2B68129093F94C0020B128460B99A8 ++:105390000C9A1DF0CBDB1490BAF1000F69D02B688A ++:1053A00093F8463013F0030F63D0129B002B60D0AC ++:1053B000139800285DD019785A7828460FF0E2DD5E ++:1053C000B5F82696064609F47043B3F5005F0CBFA6 ++:1053D00038233C23EC58D5F85C01616840F08ED945 ++:1053E00010F0080F01D0002104E094F8EC30191EF1 ++:1053F00018BF0121139A137813F0020317BF1298F4 ++:105400001A464378C3F3800209F44063B3F5406F52 ++:1054100018D1B5F82636B34202D100210F912EE003 ++:105420002B6893F82F30002B40F04A843046FDF370 ++:10543000F9F60446B5F82606FDF3F4F6844240F08A ++:105440003F8414E0A9B1A2B106F44063B3F5406F04 ++:105450000FD12B6893F82F3073B93046FDF3E2F685 ++:105460000446B5F82606FDF3DDF6844204D10F9616 ++:1054700005E000220F9202E000230F939A462B6B67 ++:105480005B7D002B3AD0BBF1000F37D095F872321C ++:1054900033B995F87432002B30D0BAF1000F2DD10A ++:1054A00095F849365BB1179B002B08DD189B1B78DC ++:1054B00013F0040F03D0D5F858260423136195F890 ++:1054C000493653B10D9850B9159911F0200F0ED1EE ++:1054D000D5F858260423D36009E00D9A3AB1179BFA ++:1054E000002B08DD189B1B7813F0010F03D0D5F8B3 ++:1054F000582604231362284625F06EDD2B6893F8A6 ++:10550000463013F0030F46D0BBF1000F43D095F89F ++:10551000723233B995F87432002B3CD0BAF1000FD7 ++:1055200039D1B5F8263603F44063B3F5406F14BFA4 ++:1055300000210121129B13B90D9830B916E0129A7F ++:10554000937803F00303032B05D1D5F858260423E1 ++:105550009361129B53B11298837803F00303022BDB ++:1055600004D119B1D5F858260233D362139A7AB10F ++:10557000129B6BB113985A78037813F0020F07D17E ++:1055800012F0040F04D019B1D5F858260423D362C1 ++:10559000284625F0D3DD2B6893F82F30E3B1D5F8FA ++:1055A000FC341B78C3B10E99B1B9284613992FF07A ++:1055B00021D988B128460E992FF01EDA28462FF0FF ++:1055C00011DAB5F8263603F44063B3F5406F03D122 ++:1055D000284601212FF082D9B8F1000F29D0D8F840 ++:1055E000F03033B300230C997C4A0B9800931CF0E5 ++:1055F00089DE41460246284620F0C2D82B6893F83F ++:10560000463013F0030F14D0139A2AB1149B284686 ++:105610000093129B41460AE0D8F8043013F4803F0F ++:1056200007D01398139A00904146284613461DF060 ++:10563000DDDA95F87032002B00F05B830FB93E463F ++:1056400001E0D7F8DC62BAF1000F77D02B6893F84D ++:10565000463013F0030F32D0BB7C43B9B8F1000FD2 ++:1056600008D128460A99109A50F0BCD98046B8F162 ++:10567000000F24D0139971B1149A129B00922846FE ++:105680004146139A1DF0B2DAB7F8343523F02003FF ++:10569000A7F834350DE0BB7C5BB9D8F8043013F4BF ++:1056A000803F06D0139B284641461A4600931DF0C2 ++:1056B0009DDA28460B990C9A434620F087D8089922 ++:1056C00028461EF069D941B238461EF0A7D938469F ++:1056D0001EF0FCD80899284612F0F2D90146384647 ++:1056E00011F054D9BB797BB9D7F8E032D7F8D4227E ++:1056F000188A9B8A5085938573792BB9BB7C1BB123 ++:105700003846012135F046DE0023B371F371BC7CCD ++:10571000A4B996F88530012B10D186F88540D5F8CC ++:10572000400126F00BDF284639460F22234600941D ++:10573000019402940394049417F0F0D9002F5AD0E6 ++:10574000BB79002B57D1BB7C002B54D027992798CD ++:105750008B784A781B0443EA02230A781343CA78F9 ++:10576000043143EA02698B784A781B0443EA022336 ++:1057700002791343CA7843EA0264F26912B9336AC0 ++:1057800013B935E0944204D3944231D1336A994538 ++:105790002ED2DDF898E00023009301930293039347 ++:1057A00004932846394616220EF1100317F0B6D995 ++:1057B00038460899079A279B24F0B0DEBBF1000F0A ++:1057C00016D0FB7963B1BB7C23B107F1BC00FDF3BC ++:1057D000C3F028B907F1BC0104E0C046C3A601002C ++:1057E00007F1D601002228461346009222F038DC49 ++:1057F000C6F82090F461BAF1000F00F01A82BB796C ++:10580000002B40F09181BB7C002B00F08D8116AB0A ++:10581000009327993846289A0DF16F0316F024DA81 ++:10582000BDF85810D7F8E462A7F8201595F8EB41B9 ++:10583000002C65D100284FD03378022B19D138467F ++:105840002146B6F8269009F037FAB5F8303885F8D1 ++:10585000324803B1F38438461EF0B4DED7F8E432A0 ++:10586000A6F826905B8B002B4AD0384611F070D9F1 ++:1058700046E02B685B6B4BB195F8FA3133B1B8F168 ++:10588000000F14D098F8D2300F2B10D0B27822B17C ++:105890002846394622F0E4DF32E04FF0FF33009330 ++:1058A000284607F1BC01134622F0DADB28E095F820 ++:1058B0000D372BB3B3785BB1B8F1000F05D0D8F832 ++:1058C000043023F00063C8F80430384616F0AADA32 ++:1058D000384623F0C7DC13E0337A23B1718911B95C ++:1058E000384623F0EDDCD7F8E4325B8B43B13378F4 ++:1058F000022B05D1336A012B02D138461EF04EDE51 ++:10590000F3781BB13846002123F0CEDB737A3BB924 ++:1059100038460EF095D818B13846012123F0BCDD89 ++:10592000737A5BB1099A3846C2F3C011279B119A6A ++:1059300024F09ADD3846002123F0AEDD2B6B5B7D31 ++:10594000002B41D0159B2846C3F3802124F0AEDC08 ++:10595000189A002A38D0179B002B35DDD5F8581639 ++:1059600091F90130B3F1FF3F09D11378C3F340023D ++:105970000B78934203D0284601211FF0F9DF189BD2 ++:105980001B7813F0040318BF012385F8463695F9F8 ++:105990004636012B03D0D5F858361B690BB10023CE ++:1059A00000E0012385F84236B8F1000F0CD0D8F89A ++:1059B000043023F00402C8F8042095F946361BB9D8 ++:1059C00042F00403C8F804302B6893F8463013F013 ++:1059D000030F35D01298002832D0D5F8582692F906 ++:1059E0000630B3F1FF3F26D1837892F9052003F00A ++:1059F00003039A4204D028460B211A461FF0B8DF51 ++:105A000012998B78C3F38002D5F85836DB7993422C ++:105A100003D028460D211FF0ABDF129A9378C3F311 ++:105A20000012D5F858369B7A934209D028461021A7 ++:105A30001FF09EDF04E0012B0CBF032300235371F2 ++:105A4000D5F85C01B5F8261640F070DA90B1D5F8BB ++:105A50005C01B5F826163FF0A9DE2B6B18690AF039 ++:105A6000CDF9B5F82636834204D1002128460A46EE ++:105A70001EF092DAB8F1000F3FD0D8F8043013F0DE ++:105A8000400F00F029810B9B0C981A93199006E0A7 ++:105A9000284621461AAA19AB1DF060DD40B91A98B4 ++:105AA0001999DD22FCF30AF604460028F0D10CE136 ++:105AB000A11C0E79012E40F00F818A7995F80C32E5 ++:105AC00002F00F0203F00F039A4200F0058105F582 ++:105AD0000074063420461822FCF34EF22B6893F82B ++:105AE00030303BB1D5F83407214600F563701822F9 ++:105AF000FCF342F238463146ECE028460B990C9A0A ++:105B000010F084DB012802D128460EF015D90F9938 ++:105B1000002900F0EE8095F86D35002B40F0E9800B ++:105B2000284617F0D7DFE4E0BB7C002B40F08180F3 ++:105B30000D9A0AB1012102E0159BC3F34011CCB2CA ++:105B4000B8F1000F15D0D8F8043014B143F00403B5 ++:105B500001E023F00403C8F804300C990023664ADE ++:105B60000B9800931CF0CEDB4146024628461FF0FE ++:105B700007DE2B6B5B7D13B3179B002B11DD189B8E ++:105B80001B7813F0040F03D0D5F8582604231361B3 ++:105B9000189B1B7813F0020F03D0D5F85826042366 ++:105BA00053620D9818B9D5F858260423D3611CB94F ++:105BB000D5F858260423D360284625F00DDA2B6843 ++:105BC00093F8463013F0030F00F09380129941B11F ++:105BD0008B7803F00303032B03D1D5F85826013348 ++:105BE0009362139ACAB1139852780378B5F82616BF ++:105BF00043EA022010F0100F03D1D5F858260423F1 ++:105C0000536310F0020F08D101F44063B3F5406F05 ++:105C100003D1D5F8582604231363129929B90D9A94 ++:105C20001AB1D5F8582604235361284625F086DAA0 ++:105C30005FE095F85735002B5BD0BBF1000F58D0D3 ++:105C4000159B13F0020F54D00B980C990022FCF313 ++:105C500035F5034600284CD02846991C5A7839F06F ++:105C600081DB0446002844D0837C002B41D1089975 ++:105C7000079A16F0C7DD00283BD027982899269B65 ++:105C8000D4F8D06203F110020090019128460899DF ++:105C90000123029620F066DB024650BB296BD5F843 ++:105CA0006036503106F138009B784BF067D9289860 ++:105CB00008990090079A2046279B34F047DC18E0AB ++:105CC00000218A460F91FFF7DABB022385F80E32D6 ++:105CD000384601211CF064D800230C990B98064A21 ++:105CE00000931CF00FDB4146024628461FF048DDBA ++:105CF00003E71DB0BDE8F08FC3A601002DE9F04F0A ++:105D0000D2F81080C1B0D8F8D8A2064609910892FE ++:105D1000DAF82C00DAF8301000220793FCF3CEF406 ++:105D200020B1831C109342780B9205E0099A099BDD ++:105D3000093210921B7A0B932CAF0021282238468F ++:105D4000FCF37EF10021282222A8FCF379F1DAF895 ++:105D500030100122DAF82C00FCF3B0F4DAF830103D ++:105D600004463222DAF82C00FCF3A8F405463CB1D4 ++:105D70006278102A04D8381DA11C2C92FCF3FCF088 ++:105D80003DB16A78102A04D823A8A91C2292FCF3FA ++:105D9000F3F0099AD38813F0010F0BD0316B4B7DD0 ++:105DA00043B10A6D2DA854312C92FCF3E5F0002389 ++:105DB000229309E022AB0093099B304603F138029D ++:105DC00041462CAB20F042D8B8F86250DAF82C40AB ++:105DD000B5F5806FDAF8307059D0B5F5006F04D1A1 ++:105DE0000022934611920C9257E020463946FDF36B ++:105DF00071F2119020B143784FF0000B0C930BE03F ++:105E0000204639463022FCF359F4834610B9119AE2 ++:105E10000C9201E043780C93402D09D0802D07D0DF ++:105E2000102D05D0B5F5807F02D0B5F5007F33D1B8 ++:105E3000D8F8582040F2371302EA030363B30C9AF0 ++:105E4000BBF1000F08BF1422402D0C922ED14FF051 ++:105E500000094F4616E0162307FB03F303F5B4735E ++:105E600008EB03040998211D0622FCF369F040B9F0 ++:105E700040AB03EB890204F10A0342F8B83C09F194 ++:105E800001090137D8F8CC329F42E4D310E0002258 ++:105E9000934611920C9200E045B1D8F8582040F298 ++:105EA000371302EA03030BB118230C934FF00009D8 ++:105EB00040F2EE5301933FAB0293079B099A002BEC ++:105EC00014BF20210021304608F1C20300921CF0CB ++:105ED00073DA0D9030B930460D99B8F80C2332F0D2 ++:105EE000FDDD83E23F9A304602F5BC630E330A9231 ++:105EF0004146099A0E93FDF735FA0A9A1070C0F3DD ++:105F00000F2050709AF8223093709AF82330D37093 ++:105F1000131D3F93079B8BB10AF124042046FCF329 ++:105F20001BF510B93F98214602E03F9808F1D601D1 ++:105F30000622FCF321F03F9B06333F933F9A00215A ++:105F40000F921046109B0B9A26F00ED92DAB012113 ++:105F50002C9A3F9026F008D90C9B3F90002B7CD0C8 ++:105F6000BBF1000F11D0B9F1000F03D030465946F4 ++:105F7000FDF724FA3F9C5946204617F0C7DB3F90B7 ++:105F80009BF80130A346637019E0402D09D0802DA5 ++:105F900007D0102D05D0B5F5807F02D0B5F5007F74 ++:105FA0005BD1A649834617F0B1DB099B3F9003F113 ++:105FB0007B02304641460BF1040313F015DA402D05 ++:105FC00009D0802D07D0102D05D0B5F5807F02D0E7 ++:105FD000B5F5007F41D1B9F1000F01D14C4626E063 ++:105FE0009BF801300BF1020202F80390D7184FEA38 ++:105FF00019237B709BF80130002402338BF80130A9 ++:106000003F9B02333F9312AB07EB041053F824106D ++:1060100002301022FBF3B0F79BF80130013410334B ++:106020008BF801303F9B10334C453F93EBD1D6F8B2 ++:106030006C32D3F8D8325B68022B0ED16CB10022DF ++:1060400000920192CDF808B09BF80130304602333F ++:106050000393572113461DF02BDD229A2AB13F9856 ++:10606000322123AB26F080D83F90DAF82C401CE098 ++:106070006278C1F102031B199B18671C83421CD86C ++:10608000119BA34219D02378012B0BD9302B09D0B7 ++:1060900002323F982146FBF36FF73F9B6278023351 ++:1060A0009B183F933B78A21CD41834B1DAF82C101B ++:1060B000DAF830000B189C42DAD3336893F8463094 ++:1060C00013F0030F18D0089A536813F4803F13D0CD ++:1060D000326B0DF1DB041368404621466532022B1A ++:1060E00014BF0023012325F0A1DF3F982D211A22A0 ++:1060F000234626F039D83F9096F8653633B106F539 ++:10610000CC613F98043117F001DB3F90336893F87E ++:10611000463013F0030F1FD0089A536813F4803FE2 ++:106120001AD0326B0DF1DB0113684046022B14BF0D ++:1061300000230123653225F079DF3F990E9B8B42C6 ++:1061400001D2002202E00E9BC1EB030230460DF1AA ++:10615000DB0325F029DE3F9033685B6B4BB3099A74 ++:10616000D38813F0040F24D00DF1F5003449032235 ++:10617000FBF302F702238DF8F83000238DF8F93095 ++:1061800001338DF8FA3096F8FA313BB1099A92F959 ++:106190006A30002B02DA96F80A3700E000238DF807 ++:1061A000FB303F98DD2107220DF1F50325F0DCDF00 ++:1061B0003F90B5F5806F02D0B5F5006F06D1D8F8E5 ++:1061C0002C3543B33F98D8F8281505E00C9B13B342 ++:1061D000119A2AB13F98114617F098DA3F901AE0C9 ++:1061E000402D18D0802D16D0102D14D0B5F5807FFD ++:1061F00011D0B5F5007F0ED03F9C1249204617F014 ++:1062000085DA099B3F9003F16B023046414604F169 ++:10621000080313F0E9D86B1E9BB2012B03D9042DA0 ++:1062200001D0082D10D1099A506E002838D0B2F84C ++:1062300068100C300C39FDF34DF01BE0CCD285001A ++:10624000CBA60100E2D28500402D09D0802D07D0D9 ++:10625000102D05D0B5F5807F02D0B5F5007F1FD198 ++:10626000099B586EE0B1B3F868100C300C3930223D ++:10627000FCF324F2A0B1D6F86C32D3F8D8325B68C4 ++:10628000022B0DD14378102B0AD902330022029041 ++:106290000393304657210123009201921DF008DC40 ++:1062A000D8F8583013F0040F01D004230EE013F097 ++:1062B000020F01D0022309E013F0010F01D00123E6 ++:1062C00004E013F4807318BF4FF48073089A1364CA ++:1062D000336893F8463013F0030F2DD0089A136CEF ++:1062E000013B012B09D8536813F4802F05D01146C8 ++:1062F0003046062224F0D4DC1EE0089A536813F4DA ++:10630000802F19D011463046062224F06DDC30462D ++:1063100016F09ADE012801460ED1D6F8F83742F27F ++:106320000E721B88013B9BB2934202D83046013962 ++:1063300000E0304628F0CADE3F9C0E9BA34201D20B ++:10634000002302E00E9AC4EB020300932023019382 ++:10635000002123464FF0FF32404639F0E5DE0F9B27 ++:1063600000273F90C01A03930490414655223B46B4 ++:10637000304600970197029716F0D0DB0A9A3F9BB0 ++:10638000A2F11805C5EB0304DAF834100D9B9C82CA ++:1063900021B17068DAF8382000F0AADC0A9A706837 ++:1063A000C5EB0203E41A214600F092DCCAF834007F ++:1063B00040B1079BCAF838408AF83C300A99224617 ++:1063C000FBF3DAF5099A3046B2F862300197C3F36D ++:1063D000401300930297089B0D99D6F804281FF0EC ++:1063E000A1DB0D9B002808BF00230D930D9841B041 ++:1063F000BDE8F08F2DE9F04F93B006911969059231 ++:1064000004930A9101F1060A8A799AF80130064646 ++:1064100042EA0323059A0793C0F87828C3F381055D ++:1064200013465B79127942EA0323089303F00303CE ++:10643000022B08D1079C14F4004F04D0D5F10103BE ++:1064400038BF002300E00023DBB204990B930B9AC2 ++:106450008B8AA3F10A0993001DB918339945C0F23C ++:10646000A881079B03F0FC08B8F1A40F05D0B8F190 ++:10647000840F02D0B8F1940F03D1B9F10F0F40F39C ++:1064800098810AF1040409949AF8043013F0010386 ++:106490000C9303D000210F460D9108E03046099976 ++:1064A00038F03CDF021E18BF012207460D9225B1CD ++:1064B00000239B460E930F9310E00AF11004304620 ++:1064C000214638F007DF0E9010B183460F9505E0A6 ++:1064D0003046214638F068DF83460F9096F8C83181 ++:1064E00023B9326892F82C3033B92AE03046059946 ++:1064F000049A00230FF084DCB8F1A40F05D0B8F1A2 ++:10650000840F02D0B8F1940F01D10D9C5CBBB8F19F ++:10651000800F28D0B8F1500F25D0002D40F04883CF ++:106520000D9901BB0998FCF307F2002800F04083A5 ++:10653000BBF1000F17D10AF11000FCF3FDF190B987 ++:1065400036E30C9B7BB90D9C3CB192F8383053B1CB ++:106550004DB9BBF1000F06D12FB9D2F88C20936F43 ++:106560000133936724E396F8C8317BB9BBF1000F80 ++:1065700001D05C4601E0D6F86C4294F8E5302BB1CE ++:1065800030460599049AA3680FF03ADC012D12D128 ++:10659000B8F1C40F0FD0B8F1D40F0CD00AF10A0033 ++:1065A000FCF3DAF1002840F003839AF80A3013F084 ++:1065B000010F40F0FD82049930460B69A1F8149058 ++:1065C00006330B6133685146D3F88C20D36C01330A ++:1065D000D3641FFA89F30093059A11AB11F088DF99 ++:1065E00030B13368D3F88C20D36F0133D367DFE247 ++:1065F000119A12B133689B6A1362012D3DD1049A3E ++:10660000049B1069998A00F11002049C1A61A1F19F ++:106610001003A3820B9B2BB100F11402A1F1140310 ++:106620002261A3820499B8F1A40F8C8A0FD1119929 ++:106630000B699B79002B00F0BB8291F8DF30002BB7 ++:1066400000F0B6823046079A2FF0F2DCB0E23368F1 ++:1066500093F84230002B00F0AB82B8F1840F03D0E6 ++:10666000B8F1940F40F0A482D6F840011199234666 ++:10667000CDF8008028F0D4DE9AE2059B0C9C9A7D30 ++:10668000DB7D42EA0321002C66D19AF816309AF895 ++:10669000172043EA0227119B5BB9C1F3C7023046BA ++:1066A0000AF10A010E2AD4BF002201224FF080D83D ++:1066B0001190079911F4006905D0119B1BB1B3F833 ++:1066C000BC30BB4225D0119B0BB1A3F8BC70119B11 ++:1066D0008BB141E006EBC20303F5F3642046FCF303 ++:1066E0003BF170B90AF10A0021460622FBF328F4B7 ++:1066F000013508B906E01D4696F8E837EAB293423C ++:10670000E8D20024B9F1000F0CD064B1E388BB4299 ++:1067100021D13368D3F88C20D2F8BC310133C2F8D0 ++:10672000BC3145E2BCB996F8E8370AF10A0106EB3C ++:10673000C30202F5F364013386F8E83706222046E7 ++:10674000FBF31AF496F8E8170A23B1FBF3F202FB05 ++:10675000131386F8E837E7800D9A62B10E9B53B1A8 ++:106760009BF806303BB9DBF8E4321B7A1BB1584684 ++:10677000079910F0C9DD049C2069A18A00F1180274 ++:10678000226191460B9AA1F11803A38232B100F164 ++:106790001C02A1F11C032261A3829146049C07996B ++:1067A000089BA78A11F48044C3F3C0150DD0072FAE ++:1067B00006DC3368D3F88C20536E01335366F7E15F ++:1067C000B8F1B00F40F0F48130E0B8F1500F00F0B4 ++:1067D000848013D8B8F1200F00F0B98107D8B8F140 ++:1067E000000F00F0B481B8F1100F49D0E0E1B8F12A ++:1067F000300F45D0B8F1400F57D0D9E1B8F1B00F04 ++:1068000011D007D8B8F1800F7ED0B8F1A00F00F0FA ++:106810003E81CDE1B8F1C00F00F09681B8F1D00F04 ++:1068200000F0B481C4E1052F40F3BC81BBF1000F3F ++:1068300000F0BE819BF806309BB19BF80430002B22 ++:1068400000F0B681059A00970195137CD6F83407BD ++:1068500003F008030293594652464B462CF0A6D942 ++:10686000A6E1D6F8403593F93430002B00F0A08132 ++:10687000584651464A463B46009532F0A9DB97E11F ++:10688000052F40F38F81BBF1000F00F091819BF841 ++:106890000630002B40F08C81119B584600935146E6 ++:1068A0004A463B4632F052D982E1336893F895303C ++:1068B00023B996F87232002B00F07A8107F11803A1 ++:1068C000039330462C210AF10A02234600940194D6 ++:1068D000CDF808A01DF0ECD86AE10B2F40F36281DF ++:1068E000D6F868319B79002B00F062810D9B002B5C ++:1068F00000F05E81304605990A9A5346CDF8009023 ++:10690000019710F063DE53E10B2F40F34B810A9B9C ++:1069100030460E99059ACDF800A0CDF80490029764 ++:10692000FEF758FCD6F868319B7943B1304605999B ++:106930000A9A5346CDF80090019710F047DE96F87A ++:106940007232002B2ED199F80A3013F0010F29D0A2 ++:10695000304649463A4616F05DDF18BB059CA37DDC ++:10696000E27D43EA0223C3F3C7040E2C8CBF00234D ++:10697000012363B109F10C00A7F10C010322FBF321 ++:106980009DF678B143786BB18378A3420AD1336B1B ++:10699000186909F033FAC0B2844203D1D6F868010D ++:1069A0004DF0CEDF0F9909B10D4607E030460AF1F0 ++:1069B000100138F0F9DC0546002844D0AA79002AF5 ++:1069C00041D109F10C00A7F10C01D5F8D842D5F856 ++:1069D000DC82FBF373F6A26882460B2A07D12846B5 ++:1069E00005990A9A4B46009733F0B0DD0CE0336806 ++:1069F00093F8313043B10F2A06D1284605990A9AF7 ++:106A00004B46009734F072D9AB7CE3B198F85A301A ++:106A1000CBB1D6F86801514601224EF039D830B1D9 ++:106A200098F859301BB9013388F859300BE0D6F883 ++:106A30006801514601224EF02BD820B998F8593000 ++:106A40000BB188F859000E9A002A00F0B180DBF8EB ++:106A5000D8329B680C2B40F0AB804B4658460599CA ++:106A60000A9A23F05BDD5846002131F025DF3368B8 ++:106A700093F82F3023B1D6F834072EF04BD997E096 ++:106A8000DBF8E4325846997808F016F990E0012FC7 ++:106A900040F38880BBF1000F00F08A809BF806303D ++:106AA000B9F80050002B2BD13046119920F094DA20 ++:106AB0001198037E13F0020F13D002214EF0C0DABA ++:106AC000119B1B7E13F0080F0BD13046594622460E ++:106AD0000AF10A0300950194CDF80890039707F096 ++:106AE0006FFF0E9B002B63D0DBF8D8329B6813B18D ++:106AF000584631F02BDE5846032134F04BDC57E08A ++:106B000011990B695B4553D1304620F065DA119835 ++:106B1000037E13F0020F13D012214EF091DA3046AB ++:106B2000594622460AF10A0300950194CDF80890CF ++:106B3000039707F045FF304611994EF041DE37E0EC ++:106B400010214EF07DDA33E0012F2BDD30E0032FF2 ++:106B500028DDBBF1000F2BD09BF8043043B39BF82A ++:106B600006302BB30AF110000BF1BC010622FBF337 ++:106B7000E7F1E8B9119BD6F834070193594652461C ++:106B80004B460097029508F06BF911E00A99059CB5 ++:106B900002913046119952464B460097019410F0ED ++:106BA0000DDC05E03368D3F88C20136F01331367D5 ++:106BB00006980499002200F0B3D813B0BDE8F08F16 ++:106BC0002DE9F04F436899B0164689460493918B9E ++:106BD00096F82A30126880460292D9F810A00BB9B4 ++:106BE000059302E096F82220059296F82C00B0B9A1 ++:106BF00011F4006F13D0059A09EB4203B3F8AC20EF ++:106C0000B6F87E309A420AD1D8F80030D3F88C20FA ++:106C1000D2F8BC310133C2F8BC3100F082BC9AF822 ++:106C20000630C1F3802B0BBBDAF8E442237A6BB158 ++:106C300060B9BBF1000F09D199F8D230726A1341E3 ++:106C400013F0010F02D1504610F05EDBD8F800308F ++:106C50005B6B5BB1237E4BB196F82A3033B196F86B ++:106C600028301BB15046002121F094DE338C13F004 ++:106C7000040440F05684B38B03F4804373634BB930 ++:106C8000DAF8582040F2371302EA03032BB39AF8DC ++:106C9000603013B3059BB4630093404604994A46A1 ++:106CA00033464FF035DF08B122460EE0736B23B157 ++:106CB000D9F86C310133C9F86C31D8F8003093F849 ++:106CC0009530002B00F02D840122736B33B1D9F87D ++:106CD00068310133C9F8683100E0002296F82C30A1 ++:106CE0000BB1002708E0059909EB4103B6F87E10C7 ++:106CF000B3F8AC70A3F8AC10D8F8000090F8953059 ++:106D000013B1002A40F00D8496F82C50002D40F06D ++:106D10000081B6F87E20059B12F00F0C4FEA830E1F ++:106D200040F081800EEB0907F96E41B104982A46C4 ++:106D3000FFF3F6F7FD66C7F88C50C7F83051BBF18A ++:106D4000000F00F0E6807369F168FB66D8F8003048 ++:106D50007269DB6903919C681169D368908ACB18CA ++:106D600092681B189B1A09185B1AA34223DA04982D ++:106D7000214600F005D8F866002800F0D283736938 ++:106D8000006919699C689A8AC4EB0104091BA2185E ++:106D9000FBF3F2F07169FA6E08698B68C01A136927 ++:106DA0001B181361938A1B1A93828B8A049893820F ++:106DB0002A46FFF3B5F7D8F80030D8F82828DB6961 ++:106DC00003999B68AA489B1A5B1A063BC7F88C304C ++:106DD00071680822FBF3B4F050B1A648716806222E ++:106DE000FBF3AEF048B97368DB88B3F5407F04D19C ++:106DF000D9F8043043F0080303E0D9F8043023F055 ++:106E00000803C9F804309C4871680822FBF398F025 ++:106E1000D9F8083010B943F0200301E023F0200333 ++:106E2000C9F8083075E00EEB0904E16E11B9D0F82D ++:106E30008C2017E022F00F0227F00F039A4204D1B2 ++:106E400007F00F0301339C4510D02A460498FFF346 ++:106E500067F7D8F80030E566D3F88C20C4F88C507A ++:106E6000C4F83051136E013313665AE3B068D4F896 ++:106E70008C309842E9D8049B09EB0E0200900193F4 ++:106E800040468C3273680CF0ABD8049871692A467E ++:106E9000FFF346F7BBF1000F3BD1E36EC4F88CB0B3 ++:106EA0007361C4F86CB07369C4F830B11A69998A17 ++:106EB00002F118037360A1F11803B36096F829304A ++:106EC0003260F1602BB102F11E037360A1F11E0369 ++:106ED000B36096F82A3043B1736805990233736042 ++:106EE000B36886F82210023BB36032681378527898 ++:106EF00043EA0223B383736B5BB1B16B49B191F980 ++:106F00000E2073689B18736091F90E20B3689B1A6A ++:106F1000B360B36B73B11B7A042B03D14046314687 ++:106F20004FF0A4DEB36B1B7A0B2B03D140463146E6 ++:106F30004FF0B8DFBBF1000F40F04D83D8F80030C0 ++:106F400093F89530002B73D0DAF808309B7913F062 ++:106F5000010F40F005836BE010F4000F00F4E063D4 ++:106F600010D01B0A043B012B444A00F07F0004D8D8 ++:106F7000142300FB0323DA6814E0142300FB03232B ++:106F80009A680FE01B0A043B012B3C4A00F07F008B ++:106F900004D8142300FB03235A6803E0142300FBE6 ++:106FA00003F39A584FF4FA73B2FBF3F007E000F0E2 ++:106FB0007F034FF4FA7203FB02F3B3FBF2F0C0F36A ++:106FC00007238DF825300DF11B05C0F307438DF81D ++:106FD00024008DF826300127030E316805F10F00DB ++:106FE00018228DF827308DF82970FAF3C5F796F836 ++:106FF0002F30DBB19DF82B209DF82A3005F11904C4 ++:1070000043EA022343F400738DF82A3021461B0A19 ++:10701000062205F11F008DF82B30FAF3ADF7D8F8F2 ++:107020006C122046BC310622FAF3A6F7BB4601E0FB ++:107030004FF0000BD8F8003093F8953013B91C4688 ++:107040001A4602E00DF11B042D2273695B6A13F0EE ++:10705000400F15D013F0800F00F063820092D8F833 ++:107060003C0149463246234629F0F2DDB3E2C046F0 ++:10707000401E8600E0A60100481E86008418860097 ++:1070800031680DF15A07043106223846FAF374F7D5 ++:10709000316815AD0A3106222846FAF36DF73168DA ++:1070A0000DF14E04204610310622FAF365F796F8EA ++:1070B00029302BB1316812A818310622FAF35CF797 ++:1070C000B38B13F4807F03F4007305D1002B14BF3E ++:1070D00023462B46776704E074670BB9356701E0F8 ++:1070E00012AB33677468BBF1000F00F003813368A3 ++:1070F000F3662378AA2B23D16378AA2B20D1A37817 ++:10710000032B1DD1E378DBB92379CBB9637943B97C ++:10711000A379E179404641EA03210BF0D5DB50B178 ++:107120000EE0F82B0CD1A379E179404641EA032126 ++:107130000BF0CADB20B1A279E37943EA022500E033 ++:107140003589D8F8003093F89530D3B1DAF8E030CB ++:107150005BB9736BABB9DAF8582040F2371302EA27 ++:10716000030373B19AF860305BB1059A404601920F ++:1071700049465246334600950DF006DA002840F0A5 ++:10718000D081B36B6BB11B7A012B0AD0032B08D0D3 ++:10719000404604994A46334607F05EFC002800F05A ++:1071A000C081736F1B7813F0010F08D0D8F800303E ++:1071B000D3F88C20D2F8D0310133C2F8D031B36B80 ++:1071C00033B11B7A022B03D1404631464FF04EDDDE ++:1071D000726B22B996F82A3023B3144602E0B36BDF ++:1071E00093F90E4096F82A305BB1336802341A786E ++:1071F000597842EA012222F0800292B21A70120AF1 ++:107200005A707368581E03E063421B5C00F8013932 ++:1072100071690A699042F7D28B8A12191B1B0A61A5 ++:107220008B82326096F82F30BBB130684278037899 ++:1072300000F10A0443EA022343F4007303701B0ABB ++:107240004370214606221030FAF396F6D8F86C12F5 ++:107250002046BC310622FAF38FF69AF9103093B12A ++:1072600048F68E039D420ED13168726BDAF80C003D ++:107270001231003A18BF01220AF1180351F092DED0 ++:10728000002840F04E819AF830358BB148F68E03D5 ++:107290009D420DD13168726BDAF814001231003A58 ++:1072A00018BF01224B4606F013F9002840F039813F ++:1072B00071690A698B8A9B18CA68D21A2C2A40F213 ++:1072C000308100238DF829308B8A08692D22181807 ++:1072D0000DF11B01FAF350F6716996F82220CB8A62 ++:1072E00002F0070223F007031A43CA8296F8292006 ++:1072F000009110E1D6F814B02378DBF81070AA2BB7 ++:10730000C7EB040529D16378AA2B26D1A378032BD8 ++:1073100023D1E3780BBB2379FBB9637943B9A37914 ++:10732000E179404641EA03210BF0CEDA50B114E096 ++:10733000F82B12D1A379E179404641EA03210BF001 ++:10734000C3DA50B17269A91F7B18CBF81030938A49 ++:107350005B1A93821369F36628E0DAF8583013F069 ++:10736000200F0FD020469D490822FAF3E9F548B9CD ++:107370007269281D1169938A09181B1A1161938279 ++:10738000F16613E07269A5F10E00938A11691B1A68 ++:10739000938233890918116103F0FF021B0A43EA43 ++:1073A0000223F1660B73C3F30F234B73B36B6BB103 ++:1073B0001B7A012B0AD0032B08D0404604994A4679 ++:1073C000334607F049FB002800F0AB80B36B33B1C4 ++:1073D0001B7A022B03D1404631464FF047DC062290 ++:1073E000716FF06EFAF3C8F5F06E06220630316F59 ++:1073F000FAF3C2F5716996F82220CB8A02F00702EF ++:1074000023F007031A43736FCA821B7813F0010F2E ++:1074100008D0D8F80030D3F88C20D2F8D03101331E ++:10742000C2F8D0319AF8613093B199F8183013F05E ++:10743000100F0DD1F36E1A7B5B7B43EA022348F6F3 ++:107440008E02934204D073695B6A13F0100F68D008 ++:107450009AF86530BBB199F8183013F0100F12D1BB ++:10746000F36E1A7B5B7B43EA022248F6B4039A422E ++:1074700009D0263B9A4206D073695B6A002B02DB77 ++:1074800013F0100F4DD09AF8063023B9DAF8E42241 ++:10749000013382F82A3098F83238013388F83238CC ++:1074A0009AF91030EBB1F16E0B7B4A7B42EA032272 ++:1074B00048F68E039A4214D10B8A03F0FF021B0A8E ++:1074C00043EA0223B2680C3A93422AD8726BDAF884 ++:1074D0000C00003A18BF01220AF1180351F062DDD6 ++:1074E000F8B99AF8303593B1F16E0B7B4A7B42EADA ++:1074F000032248F68E039A4209D1726BDAF814001F ++:10750000003A18BF01224B4605F0E2FF48B9736903 ++:1075100096F82920009340464946736F1FF034D9EE ++:1075200059E0D8F80000436BA3B171692C4ACB8AAB ++:10753000D0F8904003F00703D25C2A4B04989B5C80 ++:1075400004EBC304636EA56E01336366FBF362F65E ++:107550004019A066049871690022FFF3E1F33AE054 ++:10756000D8F8303005991A8940468DF81B20130A47 ++:10757000120E8DF81C308DF81E200023B2698DF894 ++:107580001D30937DD27D43EA0223C3F3C7038DF8F8 ++:107590001F3009EB410393F8AC30D6F8801003F0AC ++:1075A0000F0301338DF828301CF0F6D9029A40B24F ++:1075B000030E8DF82000911FD6F880008DF8213041 ++:1075C0008DF822308DF8233012F04CFF10F0006F50 ++:1075D0007FF4C2ACEBE419B0BDE8F08FF7E38500AF ++:1075E000C4D2850098E085002DE9F04F0024A7B0B3 ++:1075F0008DF832408DF83B408DF838408DF8704062 ++:107600008DF83F409A4609939B8A0546212B0291AB ++:107610001746259412940D940A9224921B9450D9E3 ++:10762000DAF810901046494612F01CFF09F10602E4 ++:1076300003900492527899F8063043EA0223ADF899 ++:107640002C30C3F38103ADF82E30BDF82C30C3F3DA ++:10765000031203F44073B3F5407F14BF00230123EA ++:107660008DF83930BDF82E30ADF83020022B0ABF2E ++:10767000BDF830302346C3F3C0038DF83A303B7970 ++:1076800003F00303022B08D1BDF92C30002B04DAE0 ++:10769000BDF83030C3F3C00300E00023D9B29DF839 ++:1076A00039009DF83A308DF83B1000280CBF22229B ++:1076B000282203B1023201B10432099B9B8A934212 ++:1076C00006D22B68D3F88C20536E01335366A5E3A2 ++:1076D00004990B7903F001038DF83C3020B10023AD ++:1076E0001E468DF8403015E0BDF82C3013F4807F35 ++:1076F00001D0043105E013F4007F01D00A3100E02D ++:107700001031284637F0E6DD031E18BF0123064678 ++:107710008DF840309DF83C303BB90499284604313F ++:1077200037F0FCDD08B1012400E0002495F8C831F1 ++:1077300023B92B6893F82C3033B92FE0284639460B ++:10774000099A00230EF05CDB2B6893F83F300BB9ED ++:107750008DF8403054BBBDF82C3013F4807F05D138 ++:107760009DF83C3013B19DF840303BBB9DF839305B ++:1077700013B19DF83C300BBB2B6893F82C30002BD9 ++:1077800000F04C839DF84030002B00F04783B37924 ++:10779000002B40F043834FF0010B11E09DF83C308B ++:1077A0001BB9002C00F03A8300E03CB19DF8393061 ++:1077B00023B99DF84030002B00F030834FF0000BD0 ++:1077C0002B6893F895304BB346B39DF83C30D6F810 ++:1077D000DC405BB914F0010F00F02083049806F13F ++:1077E000C20104300622FAF3ABF314E0049804302B ++:1077F000FBF3A2F020B114F0080F00F00F830DE0AE ++:1078000014F0040F0AD114F0020F00F00783284689 ++:1078100004990EF061DA002840F00083099A136998 ++:1078200006331361938A063B9382049A02F118038C ++:1078300005939DF8393013B102F11E03059300231F ++:107840008DF83D309DF83A306BB3059B5A781B7824 ++:1078500043EA0221C1F3C0138DF83D307BB126B15C ++:1078600096F81935002B40F0D98295F8CF31002BCE ++:1078700000F0D482099A536A43F040035362844B68 ++:1078800001F007028DF832209A5C824B9B5C0D93CD ++:10789000C1F300138DF83830059B023305939DF832 ++:1078A00032308DF870309DF83D3023B9099A938AB3 ++:1078B000043B938206E002980999FBF323F1838A43 ++:1078C000043B8382099A059C938A12690793A41A40 ++:1078D0001B1B514602980693FBF39CF40499001B72 ++:1078E00008908B7DCA7D43EA0223ADF88E30BBF150 ++:1078F000000F2ED1079B284600933A4625AB10F087 ++:10790000F7DD002840F08A82BDF82C3013F4407F68 ++:107910003BD1BA7DFB7D049942EA0322C2F3C70240 ++:1079200028460A310E2AD4BF002201224EF05AD82E ++:10793000259030B92B68D3F88C20D36E0133D366F1 ++:107940006CE20369D3F8CC30C3F3C0138DF83F3039 ++:107950001BE0BDF82C3013F4407F16D09DF8393071 ++:107960009BB9259B8BB9BA7DFB7D284642EA032251 ++:10797000C2F3C7020A310E2AD4BF002201224EF000 ++:1079800031D82590002800F04982259B1C69D4F845 ++:10799000DC82BBF1000F23D19DF8393003BB9DF889 ++:1079A0003C3023B1BDF82C3013F4807F11D1A37982 ++:1079B000BDF82C201BB112F4807F0AD010E0A37C0C ++:1079C00002F44072002B14BF4FF4007300239A425C ++:1079D00006D02B68D3F88C20936D013393651DE29C ++:1079E00095F82D370AF1240A33B99DF83F1019B9DB ++:1079F000A3790BB10E4608E0284639461BF0CCDFD0 ++:107A0000C0B246B208B18AF80900A379FBB99DF863 ++:107A10003F30E3B9314620461CF000D820461BF029 ++:107A200055DF3946284610F04BD8014620460EF067 ++:107A3000ADDF9DF8403053B1A37C43B1E37933B15E ++:107A400098F805301BB92046012133F0A3DC95F8E6 ++:107A50002D3733B99DF83F301BB9259BD3F8FC3047 ++:107A600073B16EB1259AD2F8F810D2F8F43043F819 ++:107A70002160D2F8F830013303F00703C2F8F83080 ++:107A80009DF8393043B1B4F86200ADF8780040E0B9 ++:107A9000C4D2850098E08500A3792599002B35D0C4 ++:107AA0008A8FADF878204A6812F0400F20D09DF8F8 ++:107AB0003A30EBB1049B9B7D13F00F0F18D191F876 ++:107AC000DF30ABB18B7E13F0010F11D1BDF82C303C ++:107AD00013F4805F0CD012F4003F09D00D9A91F896 ++:107AE000D130134113F0010F02D028462DF0EEDE05 ++:107AF000BDF82C30259913F4805F15BF4B684B6897 ++:107B000043F4003323F400334B6002E0898FADF877 ++:107B1000781095F82D371BB9259BD3F8FC3073B13D ++:107B20006EB1259AD2F8F810D2F8F43043F82160FB ++:107B3000D2F8F830013303F00703C2F8F830259B80 ++:107B4000D3F87C1159B1D1F80836039801EB8302C0 ++:107B5000013303F03F03C2F80C06C1F80836A379DD ++:107B60005BB9A37C4BB19DF83C3033B9BBF1000F3E ++:107B700003D188F806B088F807B09DF83C30FBB117 ++:107B8000A379002B40F04A81A37C4BB1296804986B ++:107B90004E3110300622FAF3D3F1002800F03E8176 ++:107BA00004980430FAF3C8F650B92B6893F83E30C5 ++:107BB00033B9284604990EF08FD8002840F02E8162 ++:107BC000039ACAF814209DF83C308BB999F802202A ++:107BD00099F80130134399F800201A4308D0BB7C70 ++:107BE000FA7CD5F86001039943EA02224BF0DCD914 ++:107BF000DAF8142012F0006F26D012F4000F02F40D ++:107C0000E06310D01B0A043B012B964802F07F0270 ++:107C100004D8142302FB0303DA6817E0142302FBE1 ++:107C200003039A6812E01B0A043B012B8D4802F003 ++:107C30007F0204D8142302FB03035A6806E01423CE ++:107C400002FB03F31A5801E002F07F02864B1A6030 ++:107C500099F90330002B07DA2B68D3F88C20D2F87F ++:107C6000D8320133C2F8D83299F8033003F0300328 ++:107C7000102B07D12B68D3F88C20D2F8E0320133D7 ++:107C8000C2F8E0329DF83C30002B40F09780DAF8E3 ++:107C900014102B6811F0006FD3F88C2026D011F44B ++:107CA000000F01F4E06310D01B0A043B012B6D4868 ++:107CB00001F07F0104D8142301FB0303D96817E006 ++:107CC000142301FB0303996812E01B0A043B012BF8 ++:107CD000644801F07F0104D8142301FB03035968B1 ++:107CE00006E0142301FB03F3195801E001F07F01C2 ++:107CF00016293AD00CD80B2925D004D8022916D041 ++:107D000004291AD05AE00C2923D0122927D055E093 ++:107D100030293CD004D818292DD0242931D04DE069 ++:107D2000602940D06C2944D0482936D046E0D2F8AA ++:107D300070320133C2F8703240E0D2F8743201334D ++:107D4000C2F874323AE0D2F878320133C2F87832AD ++:107D500034E0D2F87C320133C2F87C322EE0D2F823 ++:107D600080320133C2F8803228E0D2F88432013305 ++:107D7000C2F8843222E0D2F888320133C2F8883265 ++:107D80001CE0D2F88C320133C2F88C3216E0D2F803 ++:107D900090320133C2F8903210E0D2F894320133BD ++:107DA000C2F894320AE0D2F898320133C2F898321D ++:107DB00004E0D2F89C320133C2F89C3225994B681A ++:107DC00013F4802F0BD09DF83C3043B9BBF1000F6A ++:107DD00005D1D5F8400104AA00F02EFA03E02846A8 ++:107DE00004AAFEF7EDFE049B1B7C13F0010F05D1E6 ++:107DF000259AD2F858310133C2F85831049B1B7CC4 ++:107E000013F0010F05D0259AD2F85C310133C2F886 ++:107E10005C31259B0398C3F864011FE02868436B1D ++:107E2000BBB19DF83C30A3B90999104ACB8AD0F870 ++:107E3000904003F00703D25C0D4B02989B5C04EB6F ++:107E4000C304636EA56E01336366FBF3E3F140196F ++:107E5000A066029809990022FEF362F727B0BDE8F8 ++:107E6000F08FC04684188600C8F40100C4D2850093 ++:107E700098E085002DE9F341089C05460E4617461B ++:107E80009846009407F0D2FA10F1170F06D1284651 ++:107E900031463A464346009408F0A2DABDE8FC8138 ++:107EA0002DE9F0410368054693F83F30D0F80C8087 ++:107EB00013B1B0F8267602E0FDF722F8074600225B ++:107EC0002869394602F086F85621286935F0A8DB82 ++:107ED000D5F888314000002BC5F8040506DA28697A ++:107EE000B22135F09DDB4000C5F80805A2212869C4 ++:107EF00035F096DB4000C5F8EC07284614F058D85A ++:107F000095F8CD313BB928694C2135F089DBC0F3B8 ++:107F1000C71085F8CD0128461EF0B0DD28463FF099 ++:107F200081DA002605EB8603D3F84C422CB12046BB ++:107F300020F060DF204620F053DD0136082EF1D11D ++:107F40002B6893F83F309BB1002205EB8203D3F8F6 ++:107F50004C0250B1037943B1D0F8D432DB8D1B040D ++:107F6000C8F8883121F07ED902E00132082AECD12C ++:107F7000284639460BF0CCD828467421B5F87A2526 ++:107F800024F028D995F8D13142F21072002B18BF95 ++:107F90004FF4BC622846822124F01CD92B6B95F843 ++:107FA000D111186908F0D4F901221346B5F87817F1 ++:107FB00028460CF085DA0123B5F87A170022284606 ++:107FC0000CF07EDAD5F8400127F0FADB2846FBF703 ++:107FD000C1FB2B685B6B5BB1B8F88836D5F86C02D7 ++:107FE0009BB243F00403A8F88836002119F0D8DECC ++:107FF0002846FBF71DFBD5F8841161B928461EF011 ++:10800000AFD80404C5F88441284602211EF0A8D840 ++:108010002043C5F884012B6893F8A130012B03D1CC ++:10802000D5F8400128F0B8DC284619F0E9DF2846E9 ++:108030000AF0D8DBB5F85C1728461EF06FDD28463D ++:1080400012F026DA424BEA68002185F84410C2F8A3 ++:10805000DC33012385F8A83185F8AA312B6893F821 ++:1080600038303BB14A1901314FF0FF33082982F80B ++:108070009538F7D100244FF44076314628461EF05B ++:108080006FD805EB4401B1F8203213F00F0F06D181 ++:1080900023F00F0300F00F021343A1F82032B1F8D0 ++:1080A000202212F0F00F06D100F0F00322F0F002CF ++:1080B0001343A1F82032B1F8202212F4706F06D1D8 ++:1080C00000F4706322F470621343A1F82032B1F817 ++:1080D00020321A0B06D11B0500F470421B0D1A4307 ++:1080E000A1F8202201340236042CC6D12B68284680 ++:1080F00093F94C100DF098DA2A68137E03B392F8C6 ++:108100002F30EBB1002605EB8603D3F84C426CB15F ++:10811000A3795BB12B6893F838302BB12846D4F89B ++:108120004C15002237F014DE0023E3710136082ECF ++:10813000E9D1002385F87232D5F834072CF0EADD56 ++:10814000D5F8680104214CF033DABDE8F081C0466F ++:108150008096980003681A6819B1012382F8AA3042 ++:1081600001E082F8AA1070472DE9F04717469846BB ++:10817000D2F8F030D278894603EB4203B3F8BE2040 ++:10818000B7F85630B7F85A100133D21A1205120D4B ++:1081900008EB02038B4207DD036842461B68244854 ++:1081A000596806F08BFF40E0C2EB0103C8EB030304 ++:1081B000A7F85A30BB784344BB7033E0F97809F133 ++:1081C0001000FAF3C1F6436AD7F8F01043F4806365 ++:1081D0004362FB78024601EB4301B1F8BE0007F1B0 ++:1081E0004406431CA1F8BE30C0F3C20504050121BA ++:1081F00000F007008140240D1485735D0B43735517 ++:10820000D7F8F010A7F85640D1F82C31FC789D6CC7 ++:10821000D86C084B04F007041B5DA84708F1FF3336 ++:108220001FFA83F8B8F1000FC8D1BDE8F087C04647 ++:10823000E0AB010090E085002DE9FF47138C054677 ++:10824000082B0F46164692F822A0D0F8008001D0E5 ++:10825000404623E04368126851F80390941F09EBED ++:108260008A03D3F8F800E0B9B3691B7903F003037C ++:10827000022B10D112F8033C13F0080F0BD009EBBE ++:108280004A02012382F81831D5F87822D2F8B430A6 ++:108290000133C2F8B430404639463246FEF790FC0E ++:1082A00014E14B6813F4803F16D1B3691B7903F0D6 ++:1082B0000303022B10D112F8033C13F0080F0BD06C ++:1082C00009EB4A02012382F81831D5F87822D2F856 ++:1082D000B4300133C2F8B430B3691B7903F003033F ++:1082E000022B35D1E17811F0080F1DD0D5F8782296 ++:1082F000D2F89C300133C2F89C30D2F8A030013360 ++:1083000011F0800FC2F8A03004D0D2F8AC300133A5 ++:10831000C2F8AC3001F03003102B20D1D2F8B030CD ++:108320000133C2F8B0301AE0A278637813432278A0 ++:108330001A43D5F8782205D1D2F8A0300133C2F81B ++:10834000A0300CE0D2F8A4300133C2F8A43006E02B ++:10835000D5F87822D2F8A8300133C2F8A830B6F8A0 ++:108360007E3013F00F0F40F09C801A09C3889A42A8 ++:1083700024D101230371D3181B051B0D0DF10A0431 ++:10838000C380BD6A07F11A0106222046F9F3F4F50D ++:10839000404639463246FEF713FC404621462A46FF ++:1083A0004DF006DA002800F09180B84240F08E804F ++:1083B00040464946524625F071DF87E0C3EB020391 ++:1083C00002F00F0741781A05120D8A4203D200EB22 ++:1083D00087039B6813B9B2F5006F0DD90022D8F856 ++:1083E00004007169FEF39CF4D5F87822D2F8C0300D ++:1083F0000133C2F8C03069E08A4234D3C1F10103CD ++:10840000D3189BB240464946524625F0DBDE09EBC5 ++:108410008A03D3F8F8404CB1736904EB8702936088 ++:10842000D6F880309364A3780133A3705246404657 ++:10843000494625F033DFD5F87832D3F8C820013229 ++:10844000C3F8C820A378002B40D095F8A333002BA5 ++:108450003CD1013385F8A333D8F80800A96B642216 ++:1084600007F0B4D832E0736900EB87029360D6F866 ++:108470008030936483780133837095F8A33343B9D4 ++:10848000013385F8A333D8F80800A96B642207F0FC ++:108490009DD8D5F87822D2F8BC300133C2F8BC3070 ++:1084A00014E0D8F8040071690022FEF339F4D5F81D ++:1084B00078322846D3F8DC2049460132C3F8DC2064 ++:1084C000012300935246013B26F03CD8BDE8FF87CC ++:1084D0002DE9F0471546937AD27A046843EA022AD6 ++:1084E0002B79074603F007064FF0000929E00B69D6 ++:1084F00060681A785B7842EA0328D7F87822936E8E ++:10850000013393660122FEF30BF4236893F8A12054 ++:10851000012A03D0C8F34123032B08E0204631464B ++:1085200022F062DA09F101031FFA83F9D1450AD07A ++:108530002369022103EB8603D868134B9B6B984792 ++:1085400001460029D3D1236893F8A130012B05D02F ++:108550002046314697F92C2022F046DAAB7913F009 ++:10856000020F0ED0002506E00120FEF3F5F06B1C93 ++:10857000DDB20B2D05D0E368D3F8703113F0010F95 ++:10858000F2D0BDE8F087C046E0A685002DE9F347AC ++:10859000D0F80090044601A9D9F800054CF09ADD06 ++:1085A00000263AE07B6813F4802F36D063684FF0E2 ++:1085B0000008FD58AA46D5F8F8205FFA88FE32B3C5 ++:1085C00091781379002918BF01261BB1002313717C ++:1085D000D3701CE0D9B1D3780133D9B2D1707B68A4 ++:1085E00013F4807F14BF628EA28E6423B2FBF3F279 ++:1085F00091420BD3D4F878224846D2F8C430514681 ++:108600000133C2F8C430724625F0ACDD012608F112 ++:1086100001080435B8F1080FCDD101A84CF062DD96 ++:1086200007460028BED136B9236884F8A36398684A ++:10863000A16B07F013D8BDE8FC87C04610B50368EE ++:1086400004465B7E6BB90749074806F037FD2046B4 ++:10865000FCF7C6FC0548034906F030FD2046FCF750 ++:1086600081FB10BD36AC01001CAC01002AAC01003E ++:108670002DE9F04FD0F800B089B0064607A9DBF825 ++:1086800000054CF027DD00220492E8E0039A5368CD ++:1086900013F4802F00F0E380DBF840315B6852F880 ++:1086A00003800023C146C2460593059ADAF8F830E4 ++:1086B000D7B223B1002388F8193188F8183198F817 ++:1086C0001831A3B198F8193100240133DBB2022B21 ++:1086D00088F8184188F8193109D9262388F81941F2 ++:1086E0003046009349463A46234625F02BDFDAF818 ++:1086F000D840002C00F0A9802378032B00F2A5803D ++:10870000DFE803F092025D7A3046494622460123B3 ++:1087100025F048DF94F8E750DDB1012D11D1E17863 ++:1087200009F11000FAF310F4014650B1DBF8003003 ++:108730002A46D868FEF3F4F2D6F87822D36B0133D8 ++:10874000D363002284F8E7203046214625F06CDE12 ++:108750007BE094F8E830312B08D92723009330468A ++:1087600049463A46012325F0EDDE6EE094F8E63006 ++:1087700023B184F8E65084F8EB5066E0A37823B187 ++:1087800094F8EB30013384F8EB3094F8EB30022BA3 ++:108790005BD1D6F8783230465A6E494601325A6675 ++:1087A000272300933A46012325F0CCDE01233046EF ++:1087B00049463A4623F010DF0123049345E094F83C ++:1087C000E920531C032A84F8E93004D9484621469D ++:1087D00023F0D0DE39E0B27CF37C009296F82E20B4 ++:1087E0003068019203993A4626F0E4D9D6F8782207 ++:1087F000136D0133136528E094F8EA20531C012A15 ++:1088000084F8EA3009D9D6F878223046536E4946C2 ++:10881000013353663A46012303E0304649463A465F ++:10882000002323F0D9DE10E094F8EC20531C3B2AFF ++:1088300084F8EC3009D9304649463A46002325F001 ++:1088400069D910B1042380F8E930059A0AF1040AC5 ++:108850000132082A059208F102087FF426AF07A822 ++:108860004CF040DC039000287FF410AF049B0A4AD0 ++:1088700013B11368013300E0049B074C13602368B5 ++:10888000012B04DD5846FFF7D9FE002323600020AA ++:1088900009B0BDE8F08FC046ECF40100D0F8AC039D ++:1088A0007047C046D0F8C0037047C046C0F8C01338 ++:1088B0007047C046D0F8AC331B68DB6918690A28DA ++:1088C000A8BF0A207047C04610B50446FDF332F633 ++:1088D000B0F5C05F05DD20464CF0F2DB20464CF0E1 ++:1088E000EFDB10BD02292DE9F0410646D0F8AC536C ++:1088F00001D0002401E000F575742B68D3F88C20BA ++:108900005368126C9B1822692361C2EB0302A369AE ++:108910009A4223780ED24BB9E26863699A4205D332 ++:108920000123237063680133636028E0E368013347 ++:10893000E36024E00027E7600BB3012904D1284657 ++:10894000023121F06BDB18E0022916D1A868D6F8B5 ++:10895000D01306F083DED6F8CC3373B12B6893F8CE ++:108960007430012B07D02869012134F0A9DD2A6871 ++:10897000012382F87430C6F8CC7300232370BDE85D ++:10898000F081C0462DE9F04F97B0DDF894B0D0F8F3 ++:10899000AC630023D0F8B0930C46074659463046E6 ++:1089A0000392DDF888A014931393129336F022DD1E ++:1089B0000399054601F001030093484621465246BB ++:1089C000239B1AF081DC1490002840F0FF82219A4A ++:1089D000032A0DD9042213A82099F9F3CDF2219B83 ++:1089E000072B05D9209A12A8111D0422F9F3C4F20D ++:1089F000139C129AB4F1000818BF4FF00108BBF1A4 ++:108A0000000F01D1D5F808B003998B1E472B00F257 ++:108A1000D982DFE813F0F900FE00010104016A00C9 ++:108A20007D008C00D7028E00D7029700D702070185 ++:108A30000A01480058007F0195010D011F014E01F8 ++:108A400054012002D7029900A000AD00B00033010C ++:108A50003601FC00D70236023A02D702D702D7020B ++:108A6000D702D702D702D702D702D702D702D7023E ++:108A7000D702D7026F0281028602E500EF00DA0218 ++:108A80009C02D702D702AC02AF02B802BB02BE0200 ++:108A9000C102C402D702D402C702D702D702D7024A ++:108AA000D7020C021302D9F83430002B00F08A826E ++:108AB0000DAC304607F56371224623F0BDD8504611 ++:108AC00021461022C3E0D9F83430002B00F07A821E ++:108AD00011AC514604222046F9F34EF2304607F518 ++:108AE0006371224623F0C4D81FE0219A0023052A8F ++:108AF0008DF8573040F22781384620990DF1570202 ++:108B000029F0CADF9DF8573014908AF800305CE2F3 ++:108B1000514630464CF042DE0146002800F01E82ED ++:108B200038469AF806202CF0B5D914904DE29B4BAC ++:108B300000E09B4B0093384629465246239B29F080 ++:108B400045DFF2E7974BF5E7D6F83407FFF7AAFEC3 ++:108B5000CAF8000039E2D6F834572846FFF7AAFED3 ++:108B6000844200F3268228462146FFF79FFE2CE22E ++:108B7000D5F850353BE03368DB691F692B79002B52 ++:108B800040F06381BC4200F31482C5F85045139C49 ++:108B9000184619467318D3F84C2222B1937913B1B1 ++:108BA000954218BF013004312029F3D1002800F08C ++:108BB0000C82C4EB070393FBF0F000217318D3F889 ++:108BC0004C224AB193793BB1954205D0D2F8503549 ++:108BD000834288BFC2F8500504312029EED1F4E168 ++:108BE00096F9A838002B01DA002300E00123CAF827 ++:108BF0000030EAE1B8F1000F01D0002301E04FF0AE ++:108C0000FF3386F8A838E0E195F83C30EFE7AB7920 ++:108C1000EDE785F83C80D8E1D6F82837E7E7C6F8D5 ++:108C20002847D2E1D7F8BC33E1E7C7F8BC43CCE131 ++:108C30006A7E049222B105A805F11A01F9F39CF1AC ++:108C4000049B1A1D239B93427DDB504604A9F9F334 ++:108C500093F1BAE1202C02D96FF01103B4E123990A ++:108C6000231D99426FDB2B79002B40F0EE802846C4 ++:108C70000AF10401224635F07FDFA6E195F83A308B ++:108C8000B5E7AB7985F83A8085F83B80002B00F09A ++:108C90009C812B79002B00F098813046294614F0F6 ++:108CA00005D830464FF000614FEAC8621AF082DF03 ++:108CB0008BE199F83830003B18BF012397E799F80A ++:108CC00038301C1E18BF0124444500F07E81304618 ++:108CD00022F0BCD810B96FF0150375E154B13046DD ++:108CE00001F082FA736A23F4C0137362002389F8D7 ++:108CF00038306AE1736A304643F40023736202231A ++:108D000089F83830D6F8AC38013B86F8A938FFF737 ++:108D1000DBFD5AE1219A032A15D9002C05DB3046E8 ++:108D2000214614AA36F0AADA05460DB12B795EE782 ++:108D3000149B13F11E0F40F04881CAF8005044E123 ++:108D4000239B072B02DC6FF00D033DE1032A01D1C9 ++:108D5000002703E0022A14BF00270127002C2DDB87 ++:108D60003046214614AA36F089DA054630BB149BFA ++:108D700013F11E0F22D1129B002B1FDD87F0010380 ++:108D800000932A462B463046139935F011DF0546ED ++:108D900050B96FF01A03149310E0C046991E830077 ++:108DA000A91E8300F92A83003046294636F0EADB03 ++:108DB000149018B13046294636F03EDB129B032B47 ++:108DC00000F00381022B00F00081149A3AB112F1F5 ++:108DD0001E0F40F0FA80002B40F0F780F4E0002BEB ++:108DE0001CDD2B79002B40F0F08033681B6F13F0F3 ++:108DF000030F02D06FF00803E6E0AA7922B13046F3 ++:108E0000294636F0F1D990E66B7E30460092019209 ++:108E1000294605F11A0230F0ABDDD6E06B79002B64 ++:108E200000F0D3803046294636F02AD8CDE015B17F ++:108E300095F96435DBE6CAF800501FE0F5B1002C67 ++:108E40001CDB012C1ADC2B7913B16FF00403BBE09F ++:108E500085F86445B9E099F818307BB199F82F305E ++:108E600063B199F830304BB999F83F3033B9D6F83F ++:108E700068319B7913B9B6F81637B8E66FF001037D ++:108E8000A2E0336893F83030B1E6336893F83030BD ++:108E9000434500F09A80304636F072DC0446B8F163 ++:108EA000000F05D043791BB13046214635F0E8DF8D ++:108EB0002146304688F0010236F06ADC0446149000 ++:108EC000002840F082803368012283F82F20B8F117 ++:108ED000000F03D0D6F8403583F83420336830468D ++:108EE00083F8308012F06CDF86F8DD41304606F002 ++:108EF00015F86AE0BAF80200FAF3AEF1E8B99AF8A8 ++:108F00000400BAF802109AF800209AF80130009094 ++:108F100028462BF011DB08E6D6F83437B3F8A43333 ++:108F200065E624B9D6F83437A3F8A4434DE0D6F863 ++:108F30005C01A1B23DF032DA10B96FF0130343E0E7 ++:108F4000D6F83437BDF84C10A3F8A4133DE0BBF1BC ++:108F5000000F03D09BF80430022B02D06FF01D03EA ++:108F600032E03846DBF8101029F06ADDDDE597F8CD ++:108F7000F0333CE6E3B287F8D53387F8F033384670 ++:108F800029F024DC21E0D7F8E83330E6C7F8E843DD ++:108F90001BE0D7F8EC332AE6C7F8EC4315E097F866 ++:108FA000D43324E6D6F86C32D3F8D432DB8D9C422D ++:108FB00002DD6FF01C0307E0A7F8C84305E0B7F82F ++:108FC000C83314E66FF016031493149817B0BDE875 ++:108FD000F08FC0462DE9F7430F699146D0F830274E ++:108FE0000E46136897F948104FF4887401FB043457 ++:108FF0009369054606EB0308D4F80431013BC4F835 ++:109000000431D369013BD361002386F8DF3096F841 ++:10901000781101222CF006DAB368284623F4F043D5 ++:10902000B3603146032221F03BDED4F8043143BB68 ++:10903000D7F8CC3013F4806F23D1B5F8263603F47B ++:109040007043B3F5805F14BF40234423F9582B6865 ++:1090500093F838301BB128462CF00AD811E081F87B ++:10906000DF30EB6AB3F924305BB195F8763243B95F ++:1090700001214022009385F87612284613461AF003 ++:10908000A3DD002388F8C83088F8CA3088F8CC30CF ++:10909000C8F8D030B9F1000F09D1284631464FF653 ++:1090A000FF7200232CF0B8D80028F6D103E0284640 ++:1090B00031462CF071D8BDE8FE83C0462DE9F0435F ++:1090C0000568064687B028468946174698461DF02B ++:1090D0008DDE10B128461DF081DE284639464CF061 ++:1090E00077DC044698B1B268A86894F8783102B188 ++:1090F000527900923946072207F000D8D5F8440883 ++:1091000094F8781107F0E2D8002384F878310E9BA8 ++:109110002846029300230393049331460B223B46D7 ++:10912000CDF80090CDF8048013F0F8DC07B0BDE86E ++:10913000F083C04670B5114686B0054616464CF021 ++:109140002DDB044608B390F8DF3023B128462146D2 ++:109150000122FFF73FFF20464CF0A6D8E3681BB181 ++:10916000284621463EF08ADE002203230092019326 ++:10917000029203920492284621690532334613F085 ++:10918000CDDC284621464CF01BDB06B070BDC04646 ++:109190002DE9F04F0668D0F8D022D0F8D81297B059 ++:1091A0000746D0F8E8B230460691079220F09AD9E7 ++:1091B000069BB068196806F051DA384602212FF094 ++:1091C0007BDBF7E1D6F8D83603EB82035D686C8E63 ++:1091D00004F47043B3F5805F14BF38233C2356F882 ++:1091E000039004F44063B3F5406F28D1336893F8DB ++:1091F000463013F0030F15D0D6F85C01D9F80410EF ++:109200003CF07CDA10F0080F0CD199F8EC304BB13F ++:10921000D9F80030022B12D1D6F8FC349B7813F029 ++:10922000020F0CD02046F9F3FDF70E2894BF4FF43F ++:1092300000534FF4805340F4306003439CB2D6F89F ++:109240005C0121463DF0AAD8002800F0AE81688E6E ++:10925000F9F3E8F70446688EF9F3E4F744F4306470 ++:109260000E288CBF4FF480504FF400500443A1B23D ++:1092700038462EF0D5DB002800F09781D7F8E83289 ++:10928000002B78D0D3F8DC30002B74D04FF00001E5 ++:10929000A7F85C1095F8AA004FF00C0800FB08B086 ++:1092A000EA8814A982F08002C2F3C0121C30FAF3DB ++:1092B0001FF1BDF850200DF1540AA7F8622095F86F ++:1092C000AA00514600FB08B02030FAF36FF1159B5D ++:1092D00033BB95F8AA1013AC01FB08B1042224316A ++:1092E0002046F8F349F620469A490422F8F328F676 ++:1092F00048B995F8A920A2F10803DBB2022B40F28D ++:1093000054818DF84F2020465146FAF34FF1024622 ++:1093100030B90090CDF8048095F832300293FAE02D ++:10932000159B8D4913F0040F1CBF43F002031593E6 ++:10933000159B304613F0020F1CBF43F00103159339 ++:1093400015AB00930423019301230293BB68002211 ++:10935000039313461AF024D80022072301920093A6 ++:1093600095F8AA3030460293039204923946183297 ++:109370002B4613F0D3DBB5F8623013F0100F0FD08B ++:10938000BA6D40F2371302EA03034BB9734B1A78F4 ++:1093900032B901230092019395F832300293FCE038 ++:1093A0002846F9F3C9F218B100230222009327E0FE ++:1093B0003B6D002B32D0336893F83030002B2DD129 ++:1093C0001C46984609E0796D284641440622F8F388 ++:1093D000B7F508F1060818B10134FB6C9C42F2D3D2 ++:1093E0003B6D012B03D1FB6C9C4206D316E0022B94 ++:1093F00014D1FB6C9C420DD210E000230093032299 ++:10940000019295F832200393029204933046394634 ++:109410001722C7E0002304220093F1E7336893F892 ++:10942000953083B1D6F84C35012B09D1284606F585 ++:10943000AA610622F8F384F5002840F0B68002E025 ++:10944000022B00F0B28095F9344074B9D6F85C0173 ++:10945000698E3CF037DE40B105230094019395F806 ++:109460003230039402930494D0E7B7F862306BB1C2 ++:10947000BA6D40F2371302EA03033BB13046394676 ++:109480002A462EF0EFDC002840F08F80D9F800301B ++:10949000022B0AD199F815203AB9FD33009305F152 ++:1094A000380009A90123019214E0336805F138005E ++:1094B00093F8463009A913F0030317BFD7F8CC304F ++:1094C0001A46C3F3003383F001020192FF23002206 ++:1094D0000093134647F010DE336B09F1500493F804 ++:1094E000EC1039B16B8E03F44063B3F5406F14BFD9 ++:1094F00014212821204647F0A7DDD6F86036002247 ++:1095000009A821469B7847F039DD024630B9009022 ++:109510000923019302920392049277E79DF8382081 ++:1095200096F838379A4240D195F93430C3B96A8EEB ++:10953000304602F47042B2F5805F14BF022201226D ++:1095400005F138012EF032DA024648B90A230090BC ++:10955000DFE7C0460CA7010017738600ACF40100DA ++:10956000336893F8303053B3294630464CF016D95F ++:10957000014620B3037E13F0020F06D0436813F4B4 ++:10958000805202D10D230092C3E7D1F8F030B3B17D ++:1095900000220F230092019302920392049230461C ++:1095A000394617322B4613F0B9DAD6F8DC36013BD0 ++:1095B000C6F8DC36D6F8DC26002A7FF403AED6F8EF ++:1095C000DC46FCB1069B00219977D6F8DC26D6F85C ++:1095D000D836013A03EB8203C6F8DC26069A9C686B ++:1095E0005368012B0AD000910191029103910491DB ++:1095F000304639462022234613F090DA384630F0C0 ++:109600005FDF29E00799FA7991F934304AB1384699 ++:1096100001212246D3F1010338BF00232EF034DEAE ++:1096200009E038460121D3F1010338BF002300923D ++:1096300001922EF063DF97F91030022B03D1F86806 ++:1096400000214FF08FDF96F87532384623F004037F ++:1096500086F875322EF000DF17B0BDE8F08FC046F7 ++:109660002DE9F04F062989B007460D4692469B46E4 ++:109670009DF848900468D0F8D86246D061BBB9F133 ++:10968000000F03D12046394636F090DA94F8723252 ++:10969000002B3AD0D4F8000507A94BF01BDD03E0FE ++:1096A0001B7E13F0020F30D107A84BF01BDD0346E1 ++:1096B0000028F5D151E0236B186906F09FFBD7F81D ++:1096C000D4325B8E834220D020462AF005DFD4F8C6 ++:1096D00034072BF01FDB18E0B368093B012B14D8CB ++:1096E000204611464CF05AD810B10C214BF0A8DCA2 ++:1096F000022D07D0A068316805F0B0DF052D01D03C ++:10970000012D02D14FF0010801E04FF00008139B3A ++:109710000095CDF804B00293336C20460393736C2C ++:1097200039460493B9F1000F0CBF072209225346B2 ++:1097300013F0F4D9B8F1000F13D0052D01D0022D8C ++:1097400007D1B27F337F9A4203D2384630F0B8DE79 ++:1097500007E03846FFF71CFD03E07368032BAAD12E ++:10976000D3E709B0BDE8F08F00487047F0B00100C2 ++:109770000048704710B2010010B5836F40F2EE222E ++:109780001C6A044B94219C4208BF4FF4166234F0CB ++:1097900061DA10BD50200800816F10B50831044611 ++:1097A00032F064DDFFF7E0FF0146204632F03EDD97 ++:1097B00010BDC0462DE9F04104460D469046BDF867 ++:1097C00018E09DF81C701E4633B18368DA6A02EB1C ++:1097D0004102938BFB1893834FF6FF739E4503D092 ++:1097E000A821724634F036DA04EB8503D868084BBA ++:1097F000414632465B6A9847002807DA36B1A368CB ++:10980000DA6A02EB4502938BDB1B9383BDE8F081A0 ++:10981000E0A6850010B507490446406EF9F3D8F07C ++:10982000034620B9606E0449F9F3D2F003461846A6 ++:1098300010BDC04649A801000AAA860070B50D46B1 ++:109840000669144608460A220021F8F3F9F36B88EA ++:109850001C43F36C6C8013F0200F03D02B8843F46F ++:1098600080632B80B16F42F250030A8C9A4206D17A ++:109870004B8C052B03D86B8843F004036B8070BDC1 ++:109880004FEA810210B513188E468168DB6F5218BB ++:109890008367936B0B6390F8EB3063B190F8E8301B ++:1098A0004BB94FF40051006EBEF1000F0CBF0A46D9 ++:1098B000002201F0B7DA10BDB1F1FF3F2DE9F04110 ++:1098C00004460E4605D1836F596A09B90E4600E079 ++:1098D0009E6994F8E9701FB92046394632F0FCD9E8 ++:1098E000206E01F0FFDB80B1002504EB8503D86812 ++:1098F00010B1254B9B6898470135062DF5D1E368DB ++:109900001BB12046002132F033DA94F8E8203AB156 ++:10991000A3680022DA612046032133F069DB30E0DE ++:10992000206E46F0040184F8EA2001F08BDAA06F83 ++:10993000012184F8EA1018B1406A08B106F034F940 ++:10994000204632F0EDDAE26E206ED2F8E0310121ED ++:1099500023F02003C2F8E031FCF31EF3002120467F ++:1099600032F0BAD9204633F035DC2046012133F0FD ++:1099700009D8A2680023D3611FB92046022132F022 ++:10998000ABD9BDE8F081C046E0A6850070B50121E5 ++:10999000044634F0A3D9206E01F0DAFA2046002103 ++:1099A00032F09AD9204633F0F5DD054630B1204635 ++:1099B000002134F093D96FF0080005E020464FF005 ++:1099C000FF31FFF779FF284670BDC04673B50469C3 ++:1099D000054620460E46FFF7DFFEA36F3146586A64 ++:1099E00007F050FC2A68012382F87430204632F0D8 ++:1099F00075DBA36F2046998A33F008DFA36F2046FA ++:109A0000D98A33F0F1DE204694F8861032F0F6D889 ++:109A1000A36F204652219A8B34F01CD9A36F50219A ++:109A2000DA8B204634F016D9204632F079DB204616 ++:109A3000FFF7A2FE032300932046042108220023FF ++:109A400033F0E8DA204631F0A9DE7CBD10B50469B8 ++:109A50004FF440412046002233F0CADAD4F8F830FF ++:109A60001B691BB1204631F099DE02E0204632F03E ++:109A700051DCE26C206E02F00202002A0CBF11469B ++:109A80004FF400710A46002301F07CDA10BDC04695 ++:109A900070B5836804461B6893F82050F5B901211E ++:109AA00034F01CD9206E01F053FA2046294632F0DA ++:109AB00013D9204632F02EDCA068D0F848381B7845 ++:109AC0000BB132F059DAA36F586A06F05FF8A36859 ++:109AD00084F85E501A68012382F8203070BDC046B9 ++:109AE00070B5054690F89000002846D0AB6F002175 ++:109AF00085F89010586A06F05DF8AB681A6992F81C ++:109B0000EA305BB1D36ED3F8202140F2044302EA7D ++:109B10000303B3F5806018BF012002E0106E01F06E ++:109B200019FA68B10024AB6F85F8EB4085F8EA407C ++:109B3000586A214606F038F8A86832F067D91BE069 ++:109B4000286E01F0CFDA044680B1EB6ED3F82031F5 ++:109B500013F0010F02D0284633F0F0DEAB689868AE ++:109B600001F020FF0446284634F0D6D895F8E810D6 ++:109B700011B9284634F0B2D8204670BD70B50546FC ++:109B800090F8900050B3AB681A6992F8EA305BB174 ++:109B9000D36ED3F8202140F2044302EA0303B3F565 ++:109BA000806418BF012403E0106E01F0D3F904466D ++:109BB000AA6814B1002313620CE0906805F08ADDF6 ++:109BC0002846214632F088D895F8E83013B928465F ++:109BD00032F0A0DBAB6F586A06F0B0FC70BDC04637 ++:109BE0000121836F10B580F890100446586A05F083 ++:109BF000E1FF2046022132F06FD8A368986805F093 ++:109C000073DD002010BDC0462DE9F34186680627AC ++:109C100033680DF10204DB6905461B6AD0F86C80DD ++:109C2000C6F8AC3830493A462046F8F3A5F16B6CDB ++:109C30002E48214603FB07003A46F8F39DF1042322 ++:109C4000C6F8AC38013B86F8A938A86821F0FED8E0 ++:109C500008B93C4604E0D6F8AC389B0001339CB20E ++:109C6000D5F8B8700026F05D04F0FF01201880B22E ++:109C7000421E02F0FF0341EA032102F48072C4F3A2 ++:109C800000231A43330243F4004301369BB2062EED ++:109C9000A8F840350446A8F82015A8F82C25A8F8FF ++:109CA0004035E0D1284698217A7833F0D3DFD5F8D3 ++:109CB000B83028469A219A7833F0CCDFD5F8B830FE ++:109CC0002846DC781A789C2142EA042233F0C2DF6D ++:109CD000D5F8B83028465C791A799E2142EA0422E8 ++:109CE00033F0B8DFBDE8FC8113AE010020ED0100C8 ++:109CF0002DE9FF41056907469221284633F090DCA3 ++:109D0000400080B2A7F8420000282FD04FF0000892 ++:109D10000DF101060F213046154A4346F8F3D4F100 ++:109D2000686E3146F8F354F660B13146686EB7F8A4 ++:109D30004240F8F321F604EB480482B2214628465B ++:109D400033F088DF08F10108B8F1770FE0D1686ED1 ++:109D50000849F8F33DF648B1686E0649D5F8F84071 ++:109D6000F8F30AF62081284631F074DFBDE8FF8160 ++:109D7000AEAC8600177C86002DE9F041056986B0FF ++:109D80004FF0FF318A4A80462846EC6E33F030D9D6 ++:109D9000D5F8F8302846196832F00CDBAB6D3BB1D2 ++:109DA0004FF00303A4F8B4364FF0FF03A4F8B8361D ++:109DB000EB6C13F0010F09D02B6D286E13F0800FA0 ++:109DC00001D0032100E0012101F070F94FF0FF31D3 ++:109DD000C4F828112846774A33F00AD9764E03E0B2 ++:109DE0000A20FCF3B9F40A3ED4F8283113F0010F2D ++:109DF00001D1092EF4D14046D4F82831FFF726FED0 ++:109E0000D5F8F4302BB92B6E9A6A40F294539A42EB ++:109E100013D1286E694B826BD318012B07D94AF6F0 ++:109E2000E6039A4203D04AF6E5039A4205D1082395 ++:109E300000212822009301F029D800210A46286E2B ++:109E400001F008D8FFF794FC0146284632F0EED91D ++:109E50002846FFF7D9FE4FF48033009328460623A7 ++:109E600098210DF10E0232F021DDD8F8003093F880 ++:109E70003830D3B1404620F0E9DF012815D1002366 ++:109E80001E461F4605930AE04FF4C023009339464F ++:109E9000284605AA042332F02FDD01362437D8F8EE ++:109EA0000030DB691B6A9E42EED3284680210822DF ++:109EB00033F0D0DE28465C210A2233F0CBDE4FF0AF ++:109EC00080733F4AC4F8003128463E4933F090D8A9 ++:109ED0004FF00043C4F8883103F10243C4F88C31D9 ++:109EE0004FF48043C4F8283103F5404363620121F5 ++:109EF000284633F06BD8286E01F070F883B2A8F8CA ++:109F000018001621A4F8A8362846B5F8442033F0E6 ++:109F1000A1DE2846C021B5F8542033F09BDE284648 ++:109F2000C221B5F8562033F095DE274B2846C4F8F9 ++:109F30006031D4F86031B5F888304421C4F8643118 ++:109F4000224BB5F88C20C4F86031D4F86031B5F8F4 ++:109F50008A30C4F8643133F07DDE28464621B5F8F6 ++:109F60008E2033F077DEB4F888361B051B0DA4F87D ++:109F700088364FF00103A4F89C360023C8F8483017 ++:109F80001C4605EB8403D86810B1114B5B689847F9 ++:109F90000134062CF5D10E4CE868236D9847E36E2A ++:109FA000E86898474046FFF7A3FE06B0BDE8F08199 ++:109FB000040400040204020449420F001D57FFFF7D ++:109FC00000000240000006400600020007000200F8 ++:109FD000E0A685002DE9F04790F8E97004460E46AA ++:109FE0009046856817B9394631F076DEA86805F0E5 ++:109FF00071DB06F47041B1F5805F14BF00210121CF ++:10A0000081462046FFF73CFCA36F3146586A05F0B5 ++:10A01000F1FEA36F586A05F0D3FD2846FFF7ACFEAA ++:10A02000B8F1000F04D0012120460A4633F04ED883 ++:10A0300028463146FFF7CAFCA868494605F05EDBB2 ++:10A04000D4F8D43043F00403C4F8D4300123C4F866 ++:10A05000D0301FB92046022131F03EDEBDE8F08746 ++:10A06000816810B50B680446D3F88C20D2F8B43060 ++:10A070000133C2F8B4300A6992F8EA3063B1D36EA2 ++:10A08000D3F8202140F2044302EA0303B3F5806FC2 ++:10A0900014BF0020012006E0106E00F05BFFD0F13D ++:10A0A000010038BF002020B120464FF0FF31FFF7FC ++:10A0B00003FCA06831F0AADEA0681CF005DD10BD2D ++:10A0C000D0F8EC1010B5044631B100680C22FCF356 ++:10A0D0000FF60023C4F8EC3010BDC046D1F8CC30E8 ++:10A0E00073B543F40053C1F8CC3005460C4635F047 ++:10A0F00049DA0646002873D1B5F8822144F22133AB ++:10A100009A421AD00E3B9A4217D007339A4214D083 ++:10A1100010339A4211D0143B9A420ED007339A4220 ++:10A120000BD010339A4208D025339A4205D0AB6B3E ++:10A130005B7D13B96FF00B0652E02B6B93F8EC309C ++:10A140000BB91E4608E0B5F8263603F44063B3F5B4 ++:10A15000406F14BF142628262B6893F8463013F05E ++:10A16000030305D0D4F8CC30C3F3003383F00103EC ++:10A170000093284633462146022234F095DB0646FA ++:10A1800070BBD5F84C01214645F058D9C4F8F0020F ++:10A1900010B96FF01A0623E0A379D3B194F8F53221 ++:10A1A000312B11D82B681B7E2BB1284694F8F41262 ++:10A1B0000C4A1FF03BD9D5F84C0194F8F41245F045 ++:10A1C00081D8322384F8F43294F8F53284F8F432EA ++:10A1D00006E0D5F84C0104F53D7145F037D8064648 ++:10A1E00030467CBD329E850070B505460026AB1911 ++:10A1F000D3F84C425CB1A3794BB163791BB12846CB ++:10A20000214634F03DDE2846214635F015D9043686 ++:10A21000202EECD170BDC046F0B50E4649691569D7 ++:10A22000908A0A68002A01DA821831D44C6813191E ++:10A2300083422DD8B36801F1080C0CEB040705EB41 ++:10A24000020E6BB9184608E010F80E3010F80C201A ++:10A25000C15D134099421BD10130A042F4DB19E0EB ++:10A26000012B15D12B18C4EB03050DE010F80E30AF ++:10A2700010F80C20C15D1340994203D10130A04277 ++:10A28000F4DB07E00EF1010EAE4501D80020F6E741 ++:10A29000002000E00120337B0BB180F00100F0BD15 ++:10A2A000036870B504465868A36A0D46164623B97C ++:10A2B0009021FCF30DF5A06270B1A06A0123AA8A77 ++:10A2C00003607F3382604660C360296910309A4220 ++:10A2D00028BF1A46F7F350F670BDC046684683693A ++:10A2E000416920300BB5203803695A4651460EB4F7 ++:10A2F0004A46414606B4C36882684168FEB40368B2 ++:10A30000C269EFF303810EB48269EFF3058106B4ED ++:10A31000034801680029FED06846884714B000BD94 ++:10A32000C4A300000A49084202D062B6C9430840EB ++:10A330000849084202D061B6C943084006490840AE ++:10A34000002803D005490A6802430A6070470000EC ++:10A350000000008000000040FFFF000000E100E07E ++:10A360000A49084202D072B6C94308400849084267 ++:10A3700002D071B6C943084006490840002804D0FD ++:10A3800005490A68C04302400A6070470000008027 ++:10A3900000000040FFFF000080E100E00249096882 ++:10A3A0009022885870470000D0A300000249096835 ++:10A3B0009C22885070470000D0A30000DDBAADBBDE ++:10A3C000000000000000000000000000000000008D ++:10A3D000000000000000000000000000000000007D ++:10A3E000024A11681060081C70470000C4A30000F6 ++:10A3F000024A11681060081C70470000C8A30000E2 ++:10A4000003490860034801680029FED08847FEE739 ++:10A41000BCA30000C8A300006348644900220A509E ++:10A420000168634A0A40634F0F403F4232D1002324 ++:10A4300098469A46604A0A401821CA405F494358E4 ++:10A440005F4C1C405F4DAC4204D180465E4D4519C7 ++:10A45000A9460EE05D4DAC420BD182465A4D4519DE ++:10A46000AB460F241D1C2340594C25402D0A2B437D ++:10A470009C460023984501D09A4504D1554BC018FD ++:10A48000013ADCD105E05046004202D0404600428D ++:10A4900029D1FEE7FC2141580A680F2313400F2BF6 ++:10A4A000F1D0012B01D00431F6E708314A4B1340BB ++:10A4B0004A4CA34206D100F0BBF8804600F0C4F835 ++:10A4C0008146E9E7464CA342E6D10B1F1B68454C89 ++:10A4D00023401824E3409C4600F0AAF8824600F08E ++:10A4E000B3F88346D8E74049212242502E4A3F49DB ++:10A4F0008958FF23194219D051683D4B194215D094 ++:10A5000011683C4B1940D36A10E0A3420ED0C046FC ++:10A510000CE039498958194208D0384989581940FE ++:10A520009942FAD12B4B11691942FCD049463F425E ++:10A5300004D19823CB581024E34001E0304BCB5892 ++:10A540001C242340002B01D000F08CF840462D49FC ++:10A55000086048462C49086050462C49086060460F ++:10A560002B4908602B490F602B4D2C490D60043D91 ++:10A57000AD46009DEC431023DD41AC4201D081B0DB ++:10A5800009E0240CA400264D2C606B461B1B254DB6 ++:10A590002B60043B9D4624482449002204C081428C ++:10A5A000FCD810F07BF8FEE700000018140600004D ++:10A5B000F8FF0000000000F00000000FFC0F00009A ++:10A5C000F08F0000A0820000000F0000E08000007B ++:10A5D000007000000010000000FF0F00002A0800BB ++:10A5E000000E0800000000FFE0010000040600006B ++:10A5F00000003800FFFF0000180600000C060000F5 ++:10A6000008040000D0A30000D4A30000D8A30000D9 ++:10A61000DCA30000CCA3000000C00300E8ED0100B3 ++:10A62000F0ED0100ECED0100A8F40100F0F80100EC ++:10A6300008680F2204310240052AF9D1014A10406E ++:10A64000F746000000F0FFFF08680F2204310240C7 ++:10A65000052AF9D180221042F6D0014A1040F7466F ++:10A6600000F0FFFFFEE7000010B57146034804F05C ++:10A6700025FD40F2E370FFF7C3FE10BD8E1F86007C ++:10A6800010B5002128220446F7F3DAF40A4B2360C0 ++:10A690000A4B63600A4BA3600A4BE3600A4B2361D9 ++:10A6A0000A4B63610A4BA3610A4BE3610A4B2362C5 ++:10A6B0000A4B636210BDC04600000000EBEC0100D5 ++:10A6C000ECEC0100A8F40100A8F40100F0F801008E ++:10A6D000F0F80100F59D0200F89D0200BE24030081 ++:10A6E0002DE9F04399B00CA8FFF7CAFF0C9B0D9918 ++:10A6F000DFF8DC91C91A0F9D0E9BD9F80060ED1AA6 ++:10A70000119C109B06F5A0566048E41A76180B9130 ++:10A7100004F0D4FC0B9905F57E73761907333619CE ++:10A7200001F57E729B0A019404F57E740732009352 ++:10A7300007340523A40A920A039355482B46029432 ++:10A74000DFF8848104F0BAFC524BD8F80040196855 ++:10A75000D9F80050C4EB010303F57E7001F57E7259 ++:10A7600007300194039504F57E7405F57E75800A23 ++:10A77000073207340735920A0090A40AAD0A46480A ++:10A780000294049504F09AFC444B45481968D8F8A3 ++:10A790000030C91806F57E7301F57E7207339B0AF7 ++:10A7A0000732920A0093334604F088FC3D4B3E4842 ++:10A7B000196804F083FC3D4B1F683D4B3A689A4290 ++:10A7C00003D03C4804F07AFC24E0179705E0326897 ++:10A7D000374B9A4205D1331D1793179E16AB9E42F5 ++:10A7E000F5D3354BC7EB06001A6817ABC7EB03016F ++:10A7F000C3EB0204C6EB02050092019102910390A3 ++:10A80000049039462D4832460594069407950895DC ++:10A8100004F054FC2A4C2068002834D0C588F8F392 ++:10A820009FF12368013D5C894FF4806104FB05F6CC ++:10A83000443405FB04F406F57E73073393FBF1F310 ++:10A84000009304F57E73073393FBF1F30246029302 ++:10A85000294633461B48019404F030FC1A4B0F4A3A ++:10A860001B681268C6EB03069B181B1B03F57E7161 ++:10A8700006F57E720731890A073200911348314686 ++:10A88000920A04F01BFC19B0BDE8F083E11F8600BA ++:10A89000F01F8600C82600002E208600A426000097 ++:10A8A0007220860090260000AC208600F4F401009F ++:10A8B0004B415453C6208600F8F40100E92086007D ++:10A8C000BC260000662186008826000092218600B2 ++:10A8D000CC2600000D4B10B51A680D4CD2F814169A ++:10A8E000D2F8143699420B4B18BFD2F814162268CE ++:10A8F0001B68C2EB0100984201D2002004E0B0FBCB ++:10A90000F3F003FB0023236010BDC0469C2600002B ++:10A91000E4260000C82500002DE9F04301688FB04F ++:10A92000022907461AD15A4B5A481A680023536124 ++:10A93000046814F4805F11D0574B584A1960C169FC ++:10A94000043B196013680423136024F4805343F418 ++:10A9500000530360524804F0B1FB96E03B680C2BB7 ++:10A9600014D14C4C236813F4005F0FD023F4005330 ++:10A9700043F40063236067604A48F96C04F09EFB6F ++:10A98000236803F40063002BFDD17EE03B68103B9D ++:10A990000F2B02D8FBF31EF577E03E4B4248D969F6 ++:10A9A00004F08CFBBA6C786CBC68FD683968FB6C91 ++:10A9B000009201903A463D480294039504F07EFBD4 ++:10A9C0003B4B7E6C1B68F869D7F828E03C6A7D6ACF ++:10A9D0009B1B39697A694FEA9309BB690090354836 ++:10A9E000CDF80CE00194029504F068FBB86BFC6BA9 ++:10A9F0003D6CF96A3A6B7B6B00902F48019402958D ++:10AA000004F05CFBF06831687268B36800902B4812 ++:10AA100004F054FBF06931697269B3690090284809 ++:10AA200004F04CFB04A8FFF72BFE264804F046FB7D ++:10AA30000024A04625461CE0725912F0010F13D0E5 ++:10AA4000FF2A11D9059B9A4208D91F4B1B0D1B05E4 ++:10AA50009A4209D303F580139A4205D81B48294628 ++:10AA600004F02CFB08F101080435B8F10F0F02D8EF ++:10AA700001344C45E0D1074A40F203301368576077 ++:10AA800043F480631360FFF7BBFC0FB0BDE8F083B5 ++:10AA900070F50100FCF40100241000E0281000E033 ++:10AAA00054AF010058AF010064AF010071AF010065 ++:10AAB000E8ED0100A5AF0100D8AF010007B001002B ++:10AAC00025B00100FC1C86009D66800042B001009C ++:10AAD000F0B51F4E8BB06846FFF7D2FD3578F5B95B ++:10AAE0000698079B1C1A07D029462246F7F3A8F2BE ++:10AAF00006982146FBF394F32146164804F0DEFA4B ++:10AB0000154B1D7001233370144B1968E9B10B7894 ++:10AB1000DBB1134B2A461868F8F386F015E0114FA5 ++:10AB20003D7895B90898099B1C1A07D029462246FA ++:10AB3000F7F386F208982146FBF372F30A482146A0 ++:10AB400004F0BCFA012335703B700BB0F0BDC04679 ++:10AB500038F5010059B001003AF50100BC260000AB ++:10AB600020F5010039F501008BB0010010B5044655 ++:10AB700000F0C0DA0146204600F0FEF810BDC046E5 ++:10AB800070B5044600F0B6DA204600F0F3D9054669 ++:10AB9000204600F073D90022064640F62A012046DE ++:10ABA00000F02CDB0123AB408269134201D0002569 ++:10ABB00000E001352046314600F032DB284670BD0A ++:10ABC00010B5FFF7DDFF10BD2DE9F04107460C463B ++:10ABD00000F090DA384600F051D940F62A0180465C ++:10ABE0000022384600F00ADB83690646456944B115 ++:10ABF0004FF4004043F0004445F00045FFF792FB5E ++:10AC000007E04FF4004023F0004425F00045FFF733 ++:10AC1000A7FBB46138467561414600F001DBBDE831 ++:10AC2000F081C0462DE9F0410E465021804617467E ++:10AC30001D46FCF34DF0044618B300215022F7F3F3 ++:10AC4000FFF140F23C736363A3F55573E363A3F52F ++:10AC5000737323640C23636404230020E56026607F ++:10AC60006760C4F80880A3640749F7F385F6C0B2AB ++:10AC700084F84C000138C0B2012802D9022384F8BC ++:10AC80004C302046BDE8F0813E29860000487047E0 ++:10AC9000A8C201000048704720C301000048704767 ++:10ACA00000A60E00D2F8003670B50546C3F3840442 ++:10ACB000FFF7ECFF03E08378A34204D00C3020B10F ++:10ACC0000388002BF7D1038813B92846FFF7E2FF6A ++:10ACD00003884FF47A7003FB00F070BD0123C2F8C3 ++:10ACE000603610B5D2F86446FFF7D8FF04F0FF04D1 ++:10ACF000B0FBF4F34FF47A7003FB00F010BDC046D4 ++:10AD00002DE9F0411C460646154600F0B7D8002153 ++:10AD10000746304600F084DA0223C0F8583654B1B2 ++:10AD2000D0F85C3605F03F0223F4FC4343EA4223AB ++:10AD3000C0F85C3603E0D0F85C36C3F345253046F6 ++:10AD4000394600F06DDA2846BDE8F08170B504465A ++:10AD50000D4600F093D800210646204600F060DA48 ++:10AD6000294602462046FFF7B9FF314605462046F0 ++:10AD700000F056DA284670BD10B5FFF7E7FF10BDAA ++:10AD800070B504460D4600F079D8002106462046ED ++:10AD900000F046DA294602462046FFF783FF314697 ++:10ADA0000546204600F03CDA284670BD2DE9F0410A ++:10ADB000DFF860800646D8F8004034BB00F05ED86B ++:10ADC00021460746304600F02BDAD0F81456D0F86A ++:10ADD000143604469D4218BFD0F8145642F2107043 ++:10ADE000FBF3BAF4D4F81426D4F8143630469A4259 ++:10ADF00018BFD4F814263946C5EB0203642203FBBE ++:10AE000002F3C8F8003000F00BDA024B1868BDE816 ++:10AE1000F081C04680F501002DE9F04F1746C7F8D4 ++:10AE200020361D46036A85B00C2BCBBFD2F82836DE ++:10AE3000D2F82836C3F3094BC3F3072B01230024B0 ++:10AE4000AB4080468946029403940094FAF346F797 ++:10AE50000646012212FA04F3334207D0009240461C ++:10AE600049463A46FAF33AF726EA000601341F2C1F ++:10AE7000EFD1404603A902AAFAF35AF7039B002533 ++:10AE80006FEA030A2C460123A34006EA0A021A428B ++:10AE900008D0404649463A46E3B2FFF7BDFF854237 ++:10AEA00038BF054601341F2CEDD10BF102004019CB ++:10AEB00005B0BDE8F08FC0462DE9704305468846D1 ++:10AEC000FFF3DCF700218146284600F0A9D90446AB ++:10AED000284600F0ADF8224606464146182328468B ++:10AEE000FFF79AFF0B23023000FB03F0074C4946A3 ++:10AEF0003419B4FBF6F404FB00F4284600F090D9B2 ++:10AF00000A23B4FBF3F4A0B2BDE870833F420F0004 ++:10AF100010B508B1FBF3E0F110BDC04670B5094BA8 ++:10AF200006461D6808E030462C6800F0E3D8294644 ++:10AF30006A68FBF3DDF62546002DF4D1014B1D6058 ++:10AF400070BDC0466C270000002343667047C046B2 ++:10AF50007047C046002070472DE9F04106460D4677 ++:10AF6000144600F08FD8804618B93046012100F011 ++:10AF7000C7D8304614F020FD074610B96FF01D0405 ++:10AF800015E014B96FF0190418E04FF000032B809E ++:10AF9000002404F182013846F6F3CCF6C0B2A0409A ++:10AFA0002B8801341843052C2880F2D10024B8F1F5 ++:10AFB000000F03D13046414600F0A2D82046BDE83C ++:10AFC000F081C04607B54FF0000302A921F8023D09 ++:10AFD0000122FFF7C1FFBDF806000EBD416E2DE94D ++:10AFE000F041044661B1D0F8C83000EB8303D3F8D8 ++:10AFF000D020C36D9A4203D1006E8847064600E018 ++:10B0000000262046616DFFF757FFA56E07465DB12C ++:10B01000D4F8C83004EB8303D3F8D020E36D9A4210 ++:10B0200002D1206E3146A8473846BDE8F081C046BF ++:10B0300010B5044600F05ED801462046FFF7B6FE84 ++:10B0400010BDC04610B5044600F054D80146204655 ++:10B05000FFF796FE10BDC046416E2DE9F041044653 ++:10B0600061B1D0F8C83000EB8303D3F8D020C36DB2 ++:10B070009A4203D1006E8847064600E0002620462B ++:10B08000616DFFF763FEA56E07465DB1D4F8C83069 ++:10B0900004EB8303D3F8D020E36D9A4202D1206EF3 ++:10B0A0003146A8473846BDE8F081C04643692DE9DE ++:10B0B000F743222B06460F4640F3A08000F096D8B7 ++:10B0C000002800F09B80072F00F29880B268B2F54C ++:10B0D000026F01D101220AE040F604039A4201D036 ++:10B0E000002204E0F3680C2B94BF002201225FFAD7 ++:10B0F00082F8B8F1000F0BD130464FF400614246A0 ++:10B10000D6F8C89000F07AD80546002877D006E037 ++:10B11000D6F8843013F5405571D04FF00009032F55 ++:10B1200003D03046012100F0FBD8D5F8303123F0B0 ++:10B130000403C5F8303101239F42C5F8303103D9EB ++:10B14000042F01D0083300E00D23C5F83031D5F8C5 ++:10B150003031012F23F00103C5F8303101D9042F1C ++:10B1600036D1FF2400214FF4E2722346304600948A ++:10B17000FFF38CF62223009300214FF4EE72234656 ++:10B180003046FFF383F62823009300214FF4E67244 ++:10B1900023463046FFF37AF68123009300214FF4D3 ++:10B1A000E87223463046FFF371F601230093002135 ++:10B1B0004FF4A4724FF0FF333046FFF367F630468A ++:10B1C00000214FF4A6724FF6FF730094FFF35EF672 ++:10B1D000D5F8303123F0700343EA0713C5F8303156 ++:10B1E000D5F8303123F00803C5F83031B8F1000F3D ++:10B1F00005D13046494600F013D800E00025284626 ++:10B20000BDE8FE8370B50446FFF3F0F7002839D09F ++:10B21000A268B2F5026F01D101220AE040F60403F0 ++:10B220009A4201D0002204E0E3680C2B94BF002274 ++:10B230000122D5B24DB920464FF400612A46D4F818 ++:10B24000C860FFF3DBF7E8B105E0D4F8843013F50C ++:10B25000405017D00026D0F8303123F00403C0F856 ++:10B26000303143F00103C0F83031C3F30213032B34 ++:10B2700003D02046002100F053D81DB920463146A6 ++:10B28000FFF3CEF770BDC0462DE9774100220121C2 ++:10B2900013460546FAF3D4F50024804621462822B9 ++:10B2A000234628460094FFF3F1F501210646434664 ++:10B2B00028464FF0FF32FAF3C3F5284621462822EC ++:10B2C0004FF0FF330096FFF3E1F5BDE87E81C04605 ++:10B2D000D0F86C32994201D0002004E08B79D3F190 ++:10B2E000010038BF002070472DE9F04100260546D7 ++:10B2F0000446374608E02B68216A986804F0AED906 ++:10B3000000B90136013718346B689F42F3DB3046D1 ++:10B31000BDE8F08103682DE9F0411E680546B76875 ++:10B32000884614463846296904F098D944B13368F0 ++:10B330001B7E2BB1384629694246012304F046D9C9 ++:10B34000BDE8F08170B50546044600260DE0616950 ++:10B3500049B1236A3BB1182006FB00F010302818D1 ++:10B360000122FFF7D7FF013618346B689E42EEDBEF ++:10B37000002070BD2DE9F3411F460368044601918A ++:10B380000092DDF820801E6809B10D2941DD616859 ++:10B390000022FFF7BFFFE1680025656031B1236837 ++:10B3A00022891B685868FBF3A3F4E560009B2BB16E ++:10B3B000B3F5967F02DA6FF01C002CE03046414670 ++:10B3C000FFF786FF28B3019969B123681B685868A5 ++:10B3D000FBF37EF4E06010B96FF01A001BE0394611 ++:10B3E000019AF6F3C9F501A90422C4F8148004F106 ++:10B3F0000800F6F3C1F5201D69460422F6F3BCF5FA ++:10B40000009840B1204661680122FFF783FF0020C9 ++:10B4100001E06FF00100BDE8FC81C0462DE9F04776 ++:10B42000154686B00268DDF84080DDF844A005F0DE ++:10B43000010300930646534610684246DDF84C90DF ++:10B4400017F042DF0746002840F0A180022D54D0BB ++:10B45000032D1FD0012D02D06FF0160797E0414653 ++:10B46000042203A8F6F388F5022208F104010DF185 ++:10B470001600F6F381F556F8100B4946BDF8164054 ++:10B48000039D33F0B7DF214600902A46304608F18D ++:10B4900006032EE00222414605A8F6F36DF50422CC ++:10B4A00008F1040103A8F6F367F502220DF1160076 ++:10B4B00008F10801F6F360F5BDF81430012B02D055 ++:10B4C0006FF0240763E098F80A7073689F425CDAB3 ++:10B4D00049463068BDF81640039D33F08BDF1823D2 ++:10B4E00007FB03F3103300902146F0182A4608F1B9 ++:10B4F0000B03FFF73FFF074649E00E9B1A6873688E ++:10B500009A4242DA002A40DB4FF00103ADF81430D2 ++:10B5100004924FF00B030DF116012A4608F10200C8 ++:10B52000ADF81630F6F328F505A92A464046F6F39D ++:10B5300023F504991824013101FB04612A4608F11E ++:10B540000800F6F319F5012204A908F10A00F6F340 ++:10B5500013F50499042201FB046108F1040014317D ++:10B56000F6F30AF5049B013303FB04F39A5B991984 ++:10B5700002F10B039A4502D26FF00D0707E008F1C4 ++:10B580000B004968F6F3F8F401E06FF00107384664 ++:10B5900006B0BDE8F087C046F7B5016805460E68FD ++:10B5A00096F87032002B2CD0028947693AB93046A0 ++:10B5B00007F1BC01134600921CF052DD21E089899D ++:10B5C00070688918FBF3DCF32A68044618B993689D ++:10B5D0000133936015E09289A38A00699B1A801851 ++:10B5E000A382E9682A892061F6F3C6F404F12402F3 ++:10B5F0005389304643F0400353812146BA681CF01A ++:10B60000D1DDFEBD012801D0002000E08868704730 ++:10B6100010B50C4641B18B6823B9C06F0968F7F7C4 ++:10B62000C9FBA060A06800E0C06F10BD2DE9F0412B ++:10B630008D692B69994202D100273E4604E0CE6A0B ++:10B640000EB9374600E037686B681146D868FBF3DF ++:10B6500085F3AB6804461B6893F895301BB1C38A29 ++:10B6600043F08003C3822846214604F033DB98B9B7 ++:10B670006B6893F8AB308BB128463146FFF7C8FFB3 ++:10B6800060B1214601F084DD022807D16B682146B4 ++:10B69000D8680122FBF344F301200BE02846214641 ++:10B6A00004F07ED8A86821463A461CF07BDD0038BD ++:10B6B00018BF0120BDE8F081536873B5112B064611 ++:10B6C000154608D0122B01D0102B1CD1AB7803F0FB ++:10B6D0000103337517E002AA002342F8043D806895 ++:10B6E00095F82F1033F0CADD044660B1837923B991 ++:10B6F0006988C1F380011EF083DDA3791BB1B068B6 ++:10B70000214600F0CFFF7CBD2DE9F3471F4643687B ++:10B710000646D3F80C9003699246D3F82480B8F11A ++:10B72000000F34D048463C21FBF3D2F200282ED043 ++:10B73000054605F10C0400213C22F6F381F46C600F ++:10B740002F6004F03BD873682061A661CDF800A09B ++:10B750001021114A5B682046F6F3B6F40F4BE56200 ++:10B760001B6840465B682146984700280ADD7871CF ++:10B77000736893F8AB305BB1F06F3946F7F71AFB9B ++:10B78000A86005E0484629463C22FBF3B1F20025BB ++:10B790002846BDE8FC87C04647438600F8260000DF ++:10B7A0002DE9F341044601920E4611B9D0F81080FC ++:10B7B00001E0D1F804800199D8F82450CB8A13F421 ++:10B7C000006201D001271CE02046174603F0DADFB3 ++:10B7D000636893F8AB30A3B120463146FFF718FFFA ++:10B7E00078B1019901F0C6DB042801D0012804D109 ++:10B7F00063680199D8683A4646E0052801D10126D8 ++:10B8000000E00026636893F8953023B11FB9019AD0 ++:10B81000938A2D339382002D32D0DFB9EB6913F078 ++:10B82000010F07D0637D2BB12046019904F0B6D8F3 ++:10B83000024658B176B9636893F8963053B1D4F89C ++:10B840008400019903F050FA024618B9636801991F ++:10B85000D86819E0204601A904F098DAB0B9636805 ++:10B860000199D868FBF3B6F22B690446DB684046C1 ++:10B8700029462246984748B12046FBF3E7F105E008 ++:10B8800063680199D8682A46FBF34AF2BDE8FC8157 ++:10B890004B6A10B591F8432043F480134B62D0F803 ++:10B8A000883002F00702D21892F88030013382F813 ++:10B8B0008030D0F88820012382F88630D0F88810B4 ++:10B8C00091F8812091F87B309A4211D291F8802032 ++:10B8D00091F87A309A420BD291F8822091F87C301C ++:10B8E0009A4205D291F8832091F87D309A4201D393 ++:10B8F00004F0FCDC002010BD1FB5084B024600938D ++:10B90000074B08460193074B0749DB69029312680E ++:10B91000064BF6F301F605B000BDC046E1C30100D9 ++:10B92000A4C30100FCF40100B2C30100D5C30100AF ++:10B9300010B5436804461B7E53B1D0F88000FFF772 ++:10B94000D3FCA068F9F74CFB6268002382F8203032 ++:10B9500010BDC04610B58069FFF7EAFF002010BD9A ++:10B9600070B50446636880681E7E0EB1002515E040 ++:10B97000F9F7F8F9054620B9D4F88000FFF7E2FCA2 ++:10B980000546FFF7A5F86368D3F89C1031B10B7832 ++:10B9900023B1034B32461868F7F346F1284670BDD1 ++:10B9A00020F5010010B58068F9F702FB002010BDFA ++:10B9B00010B50446FFF7F6FFA068FCF771FA10BD5A ++:10B9C00013B54FF0000310F00104ADF8063006D0B7 ++:10B9D000002904DD10F8013B01398DF8073010F023 ++:10B9E000030F05D0012903DD30F8022B023913E0E3 ++:10B9F000002211E00368D218436828BF0132D21830 ++:10BA0000836828BF0132D218C36828BF0132D21818 ++:10BA100028BF01321030103931F00F03EAD113047E ++:10BA20001B0C03EB124203E030F8023C0239D2183F ++:10BA3000034602300129F7DC04BF1B788DF806307D ++:10BA4000BDF80630D3181A04120C02EB134213048B ++:10BA50001B0C03EB124024B1030243EA1023180429 ++:10BA6000000C1CBD10B5FFF7ABFF02E003041B0C7C ++:10BA70009818020CFAD1C04380B210BD2DE9F041F4 ++:10BA8000BDF818500C46294616469846FFF798FF11 ++:10BA90003204120C02EB14422404240C121905F097 ++:10BAA000FF0302EB16421B0202EB082243EA1523B6 ++:10BAB000D218101802E003041B0C9818020CFAD1DB ++:10BAC000C04380B2BDE8F0812DE9F0418D8A164671 ++:10BAD0000D2D1F460C6952DDA38904F10C0003F003 ++:10BAE000FF021B0A43EA0223B3F5C06F0BD2152DE8 ++:10BAF00045DD254804F10E010622F6F321F2002867 ++:10BB00003DD104F11400038803F0FF021B0A43EA4D ++:10BB10000223B3F5014F0AD10430821C63199A4203 ++:10BB20002DD8038803F0FF021B0A43EA0223B3F572 ++:10BB3000006F24D1811CC4EB0103C3EB0504132C5B ++:10BB40001DDD82781309042B19D102F00F039A002E ++:10BB5000132A14D9A24212DC8A78CB7843EA022352 ++:10BB6000A34201DA1C4600E009DC8A79CB7943EA7A ++:10BB700002239804800C10B931603C6001E04FF062 ++:10BB8000FF30BDE8F081C04631C401002DE9F0432B ++:10BB9000436887B013F0020F0546884600F08F8097 ++:10BBA00005AA04ABFFF790FF0028C0F28880059833 ++:10BBB000037803F00F039E003146FFF753FF48B1AF ++:10BBC000B8F8163023F01003A8F816302B6A0133AA ++:10BBD0002B6274E0EB69059F0133EB6197F80990E4 ++:10BBE000B9F1060F24D107F10C01042202A8049C2C ++:10BBF000F6F3C2F1059904221031A41B03A8F6F351 ++:10BC0000BBF1A4B2B8190299039A4B460094FFF70E ++:10BC100035FF48B1B8F8163023F01003A8F81630F5 ++:10BC2000AB6A0133AB624AE06B6A01336B623EE0A0 ++:10BC3000B9F1110F24D107F10C01042203A8049CCF ++:10BC4000F6F39AF1059904221031A41B02A8F6F329 ++:10BC500093F1A4B2B8190399029A4B460094FFF7E6 ++:10BC60000DFF48B1B8F8163023F01003A8F81630CD ++:10BC70002B6B01332B6322E0EB6A0133EB6216E09E ++:10BC8000B9F1010F13D10499B819891B89B2FFF7D3 ++:10BC9000E9FE48B1B8F8163023F01003A8F81630C2 ++:10BCA000AB6B0133AB630AE06B6B01336B63B8F8CA ++:10BCB0001630002043F01003A8F8163001E04FF0D2 ++:10BCC000FF3007B0BDE8F0832DE9F043436887B04B ++:10BCD00013F0010F804600F08780CB8A13F0080F25 ++:10BCE00003D18368013383607EE005AA04ABFFF7CC ++:10BCF000EBFE002878DB059A00271378977203F093 ++:10BD00000F039E00D77231460598FFF7ABFE059BE7 ++:10BD10009872C0F30F20D872D8F80C30059901330F ++:10BD2000C8F80C3091F80990B9F1060F21D18D199E ++:10BD3000049C0C3104222F746F7402A8F6F31CF1DA ++:10BD4000059904221031A41B03A8F6F315F1A4B23F ++:10BD50004B4628460299039A0094FFF78FFE2874F9 ++:10BD6000C0F30F206874D8F810300133C8F81030D1 ++:10BD70003AE0B9F1110F22D18D19049CAF71EF7126 ++:10BD8000059904220C3103A8F6F3F6F00599042274 ++:10BD90001031A41B02A8F6F3EFF0A4B24B462846DC ++:10BDA0000399029A0094FFF769FEA871C0F30F206F ++:10BDB000E871D8F814300133C8F8143014E0B9F140 ++:10BDC000010F11D18C1904992046891BA770E770C7 ++:10BDD00089B2FFF747FEA070C0F30F20E070D8F8DB ++:10BDE00018300133C8F8183007B0BDE8F083C046FA ++:10BDF0002DE9F34114460A9F0268DDF82C8004F017 ++:10BE0000010300930546434610683A4617F05CDA92 ++:10BE1000064618BB052C04D8DFE804F00A06140314 ++:10BE2000030D6FF0160619E0281D3946042213E0B1 ++:10BE30006B683B6012E005F1080000214C22F6F32C ++:10BE4000FFF00BE0B8F14B0F02D86FF00D0605E0E4 ++:10BE5000384605F108014C22F6F38EF03046BDE875 ++:10BE6000FC81C04610B58C6B00200BE00B1893F8DA ++:10BE70003C30064A03F07F03D356002B01DA012041 ++:10BE800003E00130A042F1D1002010BD401B86002C ++:10BE90002DE9F84F022983460E4690469A4614BF74 ++:10BEA0004FF0FF37002714BF002401244FF0000992 ++:10BEB0002EE0022E14BF4FF0FF3300239F4211D01B ++:10BEC000022E08D1B8F1040F07D0B8F1060F04D044 ++:10BED000B8F1080F01D0042200E00022C7EB0403F0 ++:10BEE000934214DD0E2CCCBF4FF480534FF400531B ++:10BEF00044F4306213439DB2DBF85C0129463AF00A ++:10BF00004DDA20B12AF81950274609F10109013408 ++:10BF1000022E0CBF0E2300239C4202DCB9F11F0F3E ++:10BF2000C7D90A9BC3F80090BDE8F88F2DE9F04F00 ++:10BF300088469BB040210027DDF890B09DF8949092 ++:10BF40000646C0F82077C0F81C1740689A46FAF3F6 ++:10BF5000BFF60446C6F8180710B96FF0150473E071 ++:10BF6000D8F800306BB92033C6F82037336B304631 ++:10BF70001A8906F5E463009359462346FFF788FFC4 ++:10BF80001FE0202B6CD8454617E0AC88D6F85C0142 ++:10BF900021463AF003DA002862D01FB12B78E2B2D2 ++:10BFA0009A425DD9D6F82037D6F81827013722F8FB ++:10BFB00013400133C6F820370435D8F800309F42CB ++:10BFC000E3D3D6F82037002B4AD070681021FAF35B ++:10BFD0007FF60746002835D0279B002411AD44602A ++:10BFE000836004732146066080F80DB080F80E90DF ++:10BFF00024222846F6F324F0A24514BF002301238F ++:10C0000001934FF0FF330293039304930593D6F803 ++:10C01000183730460693D6F8203702210793144B81 ++:10C02000144A0A9303230C930123089409940D9452 ++:10C030000E9400950B971AF05FDF044698B9269B83 ++:10C040007B6010E06FF01A04D6F8181759B17068C9 ++:10C05000D6F81C27FAF34CF60023C6F8183702E08E ++:10C060006FF00104F0E720461BB0BDE8F08FC0463A ++:10C07000F9C500002C9E850030B590F8143789B0C2 ++:10C080000446002B3ED0D0F868319D79002D62D156 ++:10C09000036880F814571B7E002B5CD0B0F816376D ++:10C0A000002B58D0036B186903F0A8FEB4F81617DC ++:10C0B000884250D020461CF073DE204603F0AAF8D8 ++:10C0C0002046B4F816171CF0B1DC236893F82F3023 ++:10C0D0006BB1D4F86C322046D3F8D412383117F053 ++:10C0E0005DDB0146C4F8AC06204610F0F5DB2046C7 ++:10C0F0001EF00CDF204629461FF012D9204615F00D ++:10C100007FDF28E003681B7E2BB3D0F868319B7972 ++:10C110000BBBD0F8000507A948F0DCDF03E02B7E5D ++:10C1200013F0020F17D107A848F0DCDF05460028FE ++:10C13000F5D1236B05901B6805A900930323019398 ++:10C1400002900390012220462B46FFF7EFFE10B924 ++:10C15000012384F8143709B030BDC0462DE9F74FEC ++:10C160000192D0F800A090F80D801F460C464FF0C9 ++:10C17000000BE5E0072200212046F5F361F70C9A59 ++:10C18000B8F1020F12F81B00207001D0022308E062 ++:10C19000042F05D0062F03D0082F01D0434600E01E ++:10C1A0000023C3EB0002B8F1020F14BF00230123E8 ++:10C1B0009A4210DBB8F1020F01D0022108E0042FEF ++:10C1C00005D0062F03D0082F01D0414600E0002102 ++:10C1D000C1EB00060FE0B8F1020F14BF00260126E4 ++:10C1E00006E0DAF85C0131463AF096D818B9013623 ++:10C1F00023789E42F5D9B8F1020F207802D00022B0 ++:10C2000002230BE0042F07D0062F00F0A680082F92 ++:10C2100000F0A3804346A1E00E2200231B189342A6 ++:10C220000FDCB8F1020F01D0022108E0042F05D085 ++:10C23000062F03D0082F01D0414600E000210D1841 ++:10C240000FE0B8F1020F0CBF0E25002506E0DAF86A ++:10C250005C0129463AF060D818B9013D23789D4227 ++:10C26000F5D24FF0000963E002EB89039968CB88AF ++:10C27000B1F832E013F020035FFA8EF00DD00EF427 ++:10C280004072B2F5807F02D1821C023806E0B2F51E ++:10C29000007F02D1821E023000E00246B04201D38C ++:10C2A000A84203D9B24241D3AA423FD8B3B1B04267 ++:10C2B00014D3A84212D80EF44073B3F5807F05D191 ++:10C2C0002379FF2B0AD00133237107E0B3F5007FF8 ++:10C2D00004D16379FF2B01D001336371CB8813F054 ++:10C2E000200F0BD0B24209D3AA4207D8824205D010 ++:10C2F000A379FF2B1AD00133A37117E023780E2BFB ++:10C300000FD85046FFF7AEFD28B1E378FF2B0DD0D4 ++:10C310000133E3700AE0A378FF2B07D00133A37049 ++:10C3200004E06378FF2B01D00133637009F1010948 ++:10C33000DAF818251368994596D30BF1010B0734E9 ++:10C340000D9B9B4504DA019A13689B45FFF612AFDB ++:10C35000019BC3F800B0BDE8FE8F00230E225DE70D ++:10C360002DE9F84F5FFA83FC1E4603F44073B3F5E2 ++:10C37000007F14BF4FF000094FF0010905468A46BF ++:10C3800093460CF10200ACF10203B9F1000F02D0A8 ++:10C390008646984601E09E4680460027394629E0B9 ++:10C3A00011F80A40ACF105039C4221DB0CF10503B6 ++:10C3B0009C421DDC0AEB010082783AB9C3782BB9A4 ++:10C3C00003791BB943790BB983798BB1744506D1D5 ++:10C3D000837993B9B9F1000F08D0037907E0444598 ++:10C3E0000BD152B9C37843B9037933B9437923B92F ++:10C3F000013707315F45D3DB1BE0BEF10E0FD4BF21 ++:10C400004FF400534FF480534EF4306213439CB208 ++:10C41000D5F8FC341B7893B12846002128F0ECDADB ++:10C42000284628F0DFDA0AE02846012128F0E4DA7D ++:10C4300004E0D5F8FC341B78002BF5D134462046B7 ++:10C44000BDE8F88F2DE9F04FD0F8008090F80DA0EE ++:10C45000D8F83010DDB00989814614464FF0000B42 ++:10C460005B9300E0042100225B98964608E01EF8EA ++:10C4700004300EF1070E052B01D9934602E001327C ++:10C480008242F4DB082900F2B08001A252F821F0C8 ++:10C49000B5C40000EBC50000BBC40000EBC5000044 ++:10C4A00067C50000EBC50000EBC50000EBC5000050 ++:10C4B00065C400004FF6FF761AE00025AE464FF641 ++:10C4C000FF7612E00EEB0B0292FBF0F300FB13235E ++:10C4D000072203FB02F16218937823B9D378B342A1 ++:10C4E0003CBF655C1E460EF1010E8645EADB15B9C0 ++:10C4F0000025AC4621E00E2D94BF4FF400524FF4BE ++:10C50000805245F4306343EA02006FE00CEB0B020B ++:10C5100092FBF0F300FB1323072203FB02FE04EB64 ++:10C520000E0359789A78DB785218D218B242BCBF01 ++:10C5300014F80E5096B20CF1010C8445E6DB3DB9BF ++:10C540009BFBF0F300FB13B3072203FB02F31D5D1B ++:10C550000E2D94BF4FF400534FF4805345EA03036C ++:10C5600043F4306042E0BAF1020F3ED15AAB00937F ++:10C5700000244046514652464AAB5A94FFF788FC85 ++:10C58000D8F818771FB3D8F8206706B35A9925460C ++:10C5900010E000243AAB37F81520E05A904205D15C ++:10C5A0005CAA02EB410323F8480C01310234402C11 ++:10C5B000F0D10135B542ECDB20230E485B935A9154 ++:10C5C00002F07CFD4AAB00935A9B02AC04E02023AE ++:10C5D0003AAA5B9302AC00920193214648465BAABB ++:10C5E0000223FFF7BBFD02213DE700205DB0BDE85F ++:10C5F000F08FC046B0C40100F0B50546BDB0046878 ++:10C600000E4609B108292DD12023D4F818273B93D1 ++:10C61000236B03AF1B890092D4F82027394601927F ++:10C620003BAAFFF79BFD6B7B022B13D1D4F8FC34A4 ++:10C630001B787BB1D4F83437B3F8A4E30EF440632D ++:10C64000B3F5406F06D1204639463B9A7346FFF753 ++:10C6500087FE05E02846002103AA3B9BFFF7F2FE78 ++:10C66000A4F816076B6813B1A86831469847D4F848 ++:10C670001817D4F81C276068FAF33AF30023C4F8BB ++:10C680001837606829461022FAF332F33DB0F0BD46 ++:10C69000002070470020704700207047012380F879 ++:10C6A0007A3070477FB591F8943006460C4643B314 ++:10C6B000D0F8000503A948F00DDD10E02B7E13F043 ++:10C6C000020F0CD02B69A34209D101230093DB1880 ++:10C6D0000193304621462A46002348F013DE03A882 ++:10C6E00048F000DD05460028E8D13C23C4F88C3032 ++:10C6F000F9F388F70123C4F8900084F8945084F883 ++:10C7000084307FBD036870B545680E4658680C21BB ++:10C71000FAF3DEF2044610B96FF01A0005E00021CA ++:10C720000C22F5F38DF47451002070BD70B50446F1 ++:10C730000E4640684FF48471FAF3CAF208B9054610 ++:10C740000AE000214FF484720546F5F379F4D4F839 ++:10C7500048312C606E60AB60284670BD83682DE95F ++:10C76000F0415D6803684C5907460E4601EB050829 ++:10C7700058684FF48471FAF3ABF2606000282FD050 ++:10C780007359002158684FF48472F5F359F43B68EB ++:10C79000C42158687459FAF39BF2A06000B373592E ++:10C7A00000219868C422F5F34BF473592B499C6817 ++:10C7B0003B683A4623603B689868002302F07CDFC0 ++:10C7C000A06668B1735926499C683B683A469868E8 ++:10C7D000002302F071DFC4F8C00008B100203AE085 ++:10C7E000D8F80030996831B3896E41B13B689868D8 ++:10C7F00002F046DFD8F800309A6800239366D8F834 ++:10C8000000309B68D3F8C01049B13B68986802F0CB ++:10C8100037DFD8F800309A680023C2F8C0303B6890 ++:10C82000D8F8002058689168C422FAF361F2D8F869 ++:10C83000002000239360D8F80030596849B13B6864 ++:10C840004FF484725868FAF353F2D8F800200023AA ++:10C8500053606FF01A00BDE8F081C046A9D6000011 ++:10C86000E1D0000010B5014628B103684FF484728E ++:10C870005868FAF33DF210BDD0F8483170B55D68E4 ++:10C880000646E9420C4640D0495900293DD0496846 ++:10C8900059B14CF0DBDE63594FF48472596870680B ++:10C8A000FAF326F26259002353606359996800290C ++:10C8B0002BD0896E61B1B06802F0D0DE6359B068E8 ++:10C8C0009B68996E02F0DCDE63599A6800239366D8 ++:10C8D00063599B68D3F8C01071B1B06802F0BEDE36 ++:10C8E0006359B0689B68D3F8C01002F0C9DE635981 ++:10C8F0009A680023C2F8C0306359C42299687068EE ++:10C90000FAF3F6F162590023936070BDC16810B567 ++:10C91000044621B10068FFF7AFFF0023E36010BDBC ++:10C9200070B5044600680D46FFF7A6FF2068002199 ++:10C930004318D3F84C3233B15A6922B1D368AB42B1 ++:10C9400001D10023D36004312029F1D164682B196F ++:10C950003BB1295929B140680C22FAF3C9F10023EF ++:10C960002B5170BD70B50568044604F1DE01284600 ++:10C97000102215F0CFDE284604F1EE01102215F04A ++:10C98000C9DE70BD2DE97043A4B004680DF18306C3 ++:10C9900081460DF163050D2230461949F5F3ECF29D ++:10C9A00020462946102215F0B5DE05F110011022AF ++:10C9B000204615F0AFDE3046F5F3D2F3D9F8042067 ++:10C9C0002024C23200920622034601920DF1130880 ++:10C9D00021463246284609F17E05CDF808800394A9 ++:10C9E000FBF3B2F2414622462846F5F3C5F209F1BF ++:10C9F0009E0029462246F5F3BFF224B0BDE87083BD ++:10CA0000C2C4010070B500F17E0405462021204615 ++:10CA1000F7F326F0204605F19E012022F5F390F26F ++:10CA200010B92846FFF79EFF70BDC046F0B58B6D6C ++:10CA3000DFB013F0010F07460C464CD113F0020F84 ++:10CA400005D113F0040F46D04FF0100301E04FF072 ++:10CA5000200359ADA7F87C302049142205AE2846A2 ++:10CA6000F5F38AF204F1C201062207F1BE04304652 ++:10CA7000F5F382F207F17E0120222046F5F37CF2E5 ++:10CA80003846FFF7BFFF214620220DF11A00F5F3CB ++:10CA900073F22846F5F364F345AC26220096019222 ++:10CAA0000294B7F87C200346039220212A4607F11E ++:10CAB000DE00FBF349F22146B7F87C2007F15A006B ++:10CAC000F5F35AF207F1FE0000210822F5F3B8F25F ++:10CAD0003846FFF7E3FD5FB0F0BDC046CFC40100AC ++:10CAE0007FB50292436802AE9B680D4600930068D2 ++:10CAF000B72132460823FBF7BDF9044610B14FF0C9 ++:10CB0000FF3005E0284631460822F5F335F220468D ++:10CB100004B070BD2DE9F04700F1FE088946924649 ++:10CB20001788414690F87B200646FFF7D9FF20B1D1 ++:10CB3000404600210822F5F383F209F171056FF0F8 ++:10CB40002203EB5596F87C30EC1906336370A01C79 ++:10CB500003221349F5F310F20123637196F87A303A ++:10CB6000BC1DA4B203F003032B55281906F15A018A ++:10CB7000B6F87C200230F5F3FFF1B6F87C3009F10D ++:10CB80004F00023341460822E418F5F3F5F1A4B250 ++:10CB9000AAF80040B6F87C000830BDE8F087C0462F ++:10CBA0006EA701002DE9F74F99460368B0F87C4065 ++:10CBB00005468B46586820219046FAF389F00746CF ++:10CBC00008B904467BE02B684FF480715868FAF38B ++:10CBD0007FF08246002862D02B684FF4817158683C ++:10CBE000FAF376F0064600286DD0B8F1010F03D0B5 ++:10CBF000B8F1020F24D064E005F18E01102238460E ++:10CC0000F5F3BAF10BF19C01102207F11000F5F3D6 ++:10CC1000B3F105F15A0122464846F5F3ADF1384625 ++:10CC200020213246FBF396F4504632464FF4807191 ++:10CC3000FBF3C0F4484621463246FBF3BBF42AE03E ++:10CC4000B5F87C300F2B09D805F15A000019C4F152 ++:10CC500010020021F5F3F4F110240EE014F00703A4 ++:10CC60000BD005F15A000019C3F108020021F5F3B9 ++:10CC7000E7F124F0070308339CB210200BF19C016C ++:10CC8000224605F15A03CDF80090F3F359F2C0B9EA ++:10CC900004F108039CB20C9B1C80012414E006469E ++:10CCA00004462B68394658682022FAF321F036B141 ++:10CCB0002B68314658684FF48172FAF319F0204618 ++:10CCC0000AE0002008E004462B68514658684FF4FB ++:10CCD0008072FAF30DF0E4E7BDE8FE8F2DE9F04F26 ++:10CCE0009FB0059202680746884606921E46002BB2 ++:10CCF00000F0E88183685B68F358D3F804909B6880 ++:10CD00000793059B022B37D0042B00F00A81002BE0 ++:10CD100040F0D8811046796806F11A0271334AF062 ++:10CD2000C9DA8246002800F0CD8105694FF4BE4281 ++:10CD300005F112062A8205995F223046F5F380F14B ++:10CD400048F08802130AEB742A75B9F8182009F123 ++:10CD50001C04130A6B75AA7521460698202215F04B ++:10CD6000D9DC214605F11F002022F5F305F1059CD1 ++:10CD70000B23C9F80030A8E1B9F80221B2F5007F11 ++:10CD800002D141F472780AE0802A04D141F49E581D ++:10CD900048F0080803E0042A08BF41F4E4787B68FF ++:10CDA000B9F804A09B6DADF876A013F0020F0CBF8C ++:10CDB00004250225802A30D118F4805F2DD03B8ACB ++:10CDC00013F001041BD13846FFF7CCFD38467968D3 ++:10CDD000FFF72CFE97F87A20B7F87C3000920122FA ++:10CDE0000392019502940698796807F15A024CF073 ++:10CDF000FBDA3B8A87F87B0043F001033B82B7F8FC ++:10CE00007C3010339AB2BDF8763013F0070105D0AC ++:10CE100002F108035B1A9AB200E000220AF17103E2 ++:10CE2000D3180698796806F11A029BB24AF042DAE2 ++:10CE30008246002800F0468105694FF05F0305F146 ++:10CE4000120600215F222B823046F5F3F9F04FEAFB ++:10CE50001823EB7485F81480B9F8182009F11C0127 ++:10CE6000130A6B75AA7505F11F002022F5F384F0F3 ++:10CE7000B9F8042005F17100D9F80810F5F37CF039 ++:10CE8000BDF8763003F0FF021B0A43EA022386F85E ++:10CE90005D30C3F30F2386F85E30B9F80231802B82 ++:10CEA0002ED118F4805F2BD00DF17602384629463A ++:10CEB000FFF730FEBDF8763005F13F0003F0FF02CA ++:10CEC0001B0A43EA022386F85D30C3F30F2386F87A ++:10CED0005E30AB7B022B04D100211022F5F3B0F0C1 ++:10CEE00004E007F18E011022F5F346F0304641468A ++:10CEF00009F19C020023F6F30BF5002800F0E48012 ++:10CF000096F85D3096F85E2042EA03222B8AD2180A ++:10CF100092B202F0FF031B0243EA12232B820C237E ++:10CF200080E090F87A304FF000021B0103F03003EC ++:10CF300041EA0303ADF8762043F460731FFA83F8E7 ++:10CF4000B0F87C30796871339CB218F0020F1CBFC6 ++:10CF500004F108039CB2069806F11A0223464AF02F ++:10CF6000A9D98246002800F0AD8005694FF05F0323 ++:10CF700005F112060021A4F112022B823046F5F3CE ++:10CF80005FF04FEA1823EB7485F81480B7F87C2023 ++:10CF900007F1BE01130A6B75AA7505F11F00202267 ++:10CFA00005F13F0407F18E0BF4F3E6F71022594622 ++:10CFB0002046F4F3E1F7082207F1FE0105F14F00E6 ++:10CFC000F4F3DAF70DF176030093384605F17103B7 ++:10CFD000494608F00302FFF7E5FDAB7B022B05D1C4 ++:10CFE000204600211022F5F32BF004E0204659469C ++:10CFF0001022F4F3C1F7BDF8762002F0FF01130A06 ++:10D0000043EA012386F85D30C3F30F2386F85E30D0 ++:10D010002B8AD21892B202F0FF031B0243EA1223BA ++:10D020002B820F230124C9F800304EE0022301E0D7 ++:10D030006FF001033370701D09F15C010822F4F3F5 ++:10D040009BF78CB10DF12604284608F0030109F185 ++:10D050008C022346F6F31AF5002833D006F14D0072 ++:10D0600021461022F4F388F7B9F80231B3F5007FB6 ++:10D0700005D1DAF8243043F08073CAF82430069AD8 ++:10D08000136893F895305BB1059B0BB1022B07D168 ++:10D09000DAF8243023F4403343F48033CAF82430E0 ++:10D0A0007B6851469A6806981BF07CD8069A079BC5 ++:10D0B0009068D3F8C0104FF47A72002302F086DA39 ++:10D0C000012009E0002007E004460323EB73B9F8D0 ++:10D0D0000231802BAAD0ABE71FB0BDE8F08FC0466D ++:10D0E00070B5C5680446002D4FD083685B68EB5867 ++:10D0F0005968002949D00B8A042B14BF0126022647 ++:10D100000B680C2B1CD00F2B2AD00B2B3DD191F888 ++:10D110000421531C022A81F8043108D9C16821B1C5 ++:10D1200040681A310F224CF035DA20461FE001F139 ++:10D130005C000821F6F394F420463146002221E0F9 ++:10D1400091F80421531C022A81F804310FD801F10F ++:10D150005C000821F6F384F420463146022211E0F7 ++:10D1600091F80421531C022A81F8043102D9FFF7F7 ++:10D17000CDFB0AE001F15C000821F6F371F42046D2 ++:10D18000314604222B46FFF7A9FD70BDF0B50C46D1 ++:10D19000B5B00546002838D0002936D0038A4FF6AE ++:10D1A000FD7103EA010101826388228813F0010FF7 ++:10D1B0001CD0A2F108039BB2382B26D8402A1AD1E2 ++:10D1C00003AF00233846211D00934CF0A5D8064636 ++:10D1D00088B905F11A0007F148012022F4F3CCF6D2 ++:10D1E0002B8A304643F002032B8210E0202A0CD118 ++:10D1F00041F002030382211D228805F11A00F4F395 ++:10D20000BBF6248800202C8301E06FF0010035B0CC ++:10D21000F0BDC04613B58E46144601461A4670B19D ++:10D220006BB183685B68D3580A8B986852B1C38826 ++:10D2300043B91A31734600944CF06ED803E04FF0B6 ++:10D24000FF3000E000201CBD2DE9F04F89B00746FB ++:10D250000C46D0F800900593002B00F032818368D3 ++:10D26000059A5B68D3585D68D3F808A0002D00F0DC ++:10D270002881BAF1000F00F024812B8A042B14BFFF ++:10D28000012302230793B5F80231802B05D0B3F5B3 ++:10D29000007F02D0042B40F0148105F15C031A4694 ++:10D2A00094F81380267D0120069304F117010823CA ++:10D2B000F6F3C8F1069A904200F005812B6846EA21 ++:10D2C00008260C2B5FD00F2B00F0E1800B2B40F0D9 ++:10D2D000FA8006F4DC73B3F5847F40F0F48005F146 ++:10D2E0003C09202204F11F014846F4F345F6059B52 ++:10D2F000796803F11A0B0AF148030093BAF8063073 ++:10D3000005F18C080193CDF80880AB8AC2310393F4 ++:10D31000584605F11C024B46F6F3FAF116F4807FED ++:10D3200008D0204606F003014246F6F351F20028E9 ++:10D3300000F0C98094F8702094F86F3052EA03230B ++:10D3400008D0EA889A4205D104F17100E968F4F343 ++:10D35000F7F528B17868594611224CF01BD9B2E094 ++:10D3600085F804013B68DAF8C010986802F076D9B5 ++:10D3700006980821F6F374F3384607990222059BB4 ++:10D38000FFF7ACFC9FE006F4D873B3F5807F40F064 ++:10D390009A8016F4807F09D0204606F0030105F13B ++:10D3A0008C02F6F315F2002800F08D80002385F83A ++:10D3B00004313B68DAF8C010986802F04FD9059A3A ++:10D3C0002B8B02F11A082A8ACDF804800092484675 ++:10D3D000796805F1AC024CF077D8B5F80241802CA1 ++:10D3E00002D110232B6034E0042C32D10D232B60AA ++:10D3F0003B8A13F0010622D13846FFF7B3FA3846CC ++:10D400007968FFF713FB97F87A20B7F87C30012A88 ++:10D4100014BF0122022287F87A2000922A8A0296FB ++:10D420000192012203924846796807F15A024BF0B3 ++:10D43000DBDF3B8A87F87B0043F001033B820698E1 ++:10D440000821F6F30DF3384607992246059BFFF7AE ++:10D4500045FCB5F80231B3F5007F04D1D9F8440199 ++:10D46000414601F075F9B5F80231802B01D0042B4B ++:10D4700008D17B6848469B68792100934246062381 ++:10D48000FAF7F8FCB5F80231802B1CD115E016F440 ++:10D49000807F07D0204606F0030105F18C02F6F3E9 ++:10D4A00097F180B1002385F804313B68DAF8C010A9 ++:10D4B000986802F0D3D810232B603846FFF726FA7D ++:10D4C00001E0002000E0012009B0BDE8F08FC04677 ++:10D4D00070B50E46054670B1CC7B032C0BD1456967 ++:10D4E000012D08D18C7C022C01D0FE2C03D1FFF73A ++:10D4F000ABFE284600E0002070BDC0462DE9F34792 ++:10D50000DDF82C800646924699460C46002943D009 ++:10D51000B8F1000F40D0836800685B6858F80330AA ++:10D520005D689F6829464CF091D809232B602378C9 ++:10D530003068302B736829460BBFB3F86230B3F8FC ++:10D54000623003F0800303F00403A5F802310A9B64 ++:10D55000224601935346CDF800904CF097D8D8B1AD ++:10D560007369012B01D1FB88B3B1002485F8044114 ++:10D570003368D7F8C010986802F070D8298A0A2357 ++:10D580002B603046042914BF012102212246434664 ++:10D59000FFF7A4FB012000E00020BDE8FC87C046A7 ++:10D5A00007B59E4660B101290AD14161059B11462C ++:10D5B0000093069B72460193049BFFF79FFF00E0D8 ++:10D5C00000200EBD2DE9F04146681546D6F8D4324C ++:10D5D000D0F800805A8EADF5067D02F47042044604 ++:10D5E000B2F5805F14BF00220122404648F0E0D827 ++:10D5F0000746002853D04FF40073859345B1E36884 ++:10D60000002B4CD120463946FFF7A8F8002846D118 ++:10D61000A36820465B68FB589D68FFF7B3F9B6F82E ++:10D620006230BB8703B1E760238A13F0020F09D091 ++:10D6300005F1480004F11A012022F4F39DF44FF0A3 ++:10D640002003EB80EB88202B17D185AB009340465D ++:10D6500050213A6905AB01F0D7FC08AB0093859BDC ++:10D6600020460C3B0193E36801210293D7F8E820A0 ++:10D67000D7F8EC30FFF794FF11E06368B3F862303D ++:10D68000B3F5007F04D1706906F1BC01062203E006 ++:10D690007069727E06F11A013B46FFF7BBFD0DF57E ++:10D6A000067DBDE8F081C0462DE9F047C768054614 ++:10D6B000D0F800907FB383685B68FB589C6854B3D4 ++:10D6C00004F16C0630464FF48071FAF35DF3804646 ++:10D6D000D0B904F1480120223046FAF395F34FF017 ++:10D6E0002003E3806B6807F11A01B3F86230B3F5E9 ++:10D6F000007F04D1D9F8440101F026F80BE0284658 ++:10D700004246FFF75FFF06E00022D9F80800A16E4D ++:10D71000134601F05BDFBDE8F087C0467047C046A6 ++:10D7200010B5C3F8A010082019461C4635F098D84B ++:10D7300084F8A40010BDC04600207047002010608F ++:10D740007047C04600207047002070472DE9F04721 ++:10D75000044688464768002110469146C922F4F3E2 ++:10D760006FF42046414638F019DE78B997F8503703 ++:10D77000002B00F0DB8707F5AA6138460E3138F040 ++:10D7800067D80646002800F0D18700E0266908F433 ++:10D790007043B3F5805F14BF38233C233078FF58C3 ++:10D7A00038F0E8D90446B07837F0ECDD637C5FFAF6 ++:10D7B00088F513F00102064602D097F904E106E06D ++:10D7C00097F90431182BD4BF9646A3F1180E934B4A ++:10D7D0009C4203D158214FF0520C0BE0904B9C42DD ++:10D7E00005D0904B9C4202D04FF07F0C01E04FF0EF ++:10D7F000580C61463B68022B5FD1012D01D80023F4 ++:10D8000003E00A2D8CBF02230123E31893F90620BD ++:10D81000854B9C4203D10B2D10D14C2240E0834B11 ++:10D820009C4203D10E2D3BD1362239E0804B9C42E5 ++:10D8300002D0804B9C4204D10B2D30D00E2D2ED027 ++:10D840002EE07D4B9C4203D10E2D29D12A2227E0C8 ++:10D850007A4B9C4207D1022D01D1582220E00A2D9B ++:10D860001ED154221CE0764B9C4203D10A2D17D1C5 ++:10D87000502215E0734B9C4203D10E2D10D128226B ++:10D880000EE0714B9C4203D10B2D09D13E2207E0E3 ++:10D890006E4B9C4204D10C2D02D1442200E0402268 ++:10D8A000CEEB020323EAE3738B42A8BF0B460022B0 ++:10D8B00002F809300132042AFAD1654B9C4208D0A3 ++:10D8C000644B9C4205D0644B9C4202D0634B9C420B ++:10D8D00007D197F90431182BD4BF4FF0000EA3F1F4 ++:10D8E000180E3A68022A40F00D81012D01D8032359 ++:10D8F00003E00A2D8CBF05230423E31893F90600E7 ++:10D90000494B9C4201D10B2D6CE0554B9C4204D1FC ++:10D91000022D00F00B810A2DD2E0444B9C4201D134 ++:10D920000B2D58E0424B9C4202D0424B9C4201D10D ++:10D930000B2D11E04B4B9C4202D04B4B9C4204D12F ++:10D940000D2D40F004812E2001E1484B9C4206D170 ++:10D950000B2D00F0F1800D2D00F0F080F7E03E4B34 ++:10D960009C4258D0344B9C4204D10B2D40F0EF80A8 ++:10D970003E20ECE0314B9C4219D0314B9C4206D109 ++:10D98000022D00F0E1800A2D00F0DE80DFE0384B50 ++:10D990009C4206D1022D00F0D5800A2D00F0D280E5 ++:10D9A000D5E0344B9C4202D0334B9C4206D1022D31 ++:10D9B00000F0C6800A2D00F0C380C8E02F4B9C42C7 ++:10D9C0000CD1022D00F0BA800A2D00F0B780032D93 ++:10D9D00000F0BC80092D00F0B980B8E0284B9C42D3 ++:10D9E00003D10A2D00F0A480B1E0164B9C4205D172 ++:10D9F000A5F10C03012B40F29D80A8E0214B9C4235 ++:10DA000003D10B2D00F29A80A1E01F4B9C423DD127 ++:10DA10000C2D00F093800D2D43E0C046BC10860015 ++:10DA2000F0108600241186004009860080C50100A0 ++:10DA3000BC0C8600D00C8600700D86007C09860028 ++:10DA400090098600840D86001CC60100B8C701003D ++:10DA5000340D86005C0D860080118600FC0D86006A ++:10DA6000A4C70100E40C86000C0D8600A4CA0100C6 ++:10DA7000CC098600A4098600B8098600F40986004E ++:10DA800018098600980D8600381186008B4B9C4241 ++:10DA900003D1022D52D00A2D29E0894B9C4202D19C ++:10DAA0000B2D49D053E0874B9C4203D10B2D4ED117 ++:10DAB00032204CE0844B9C4204D10B2D3CD00C2DE9 ++:10DAC00034D044E0814B9C4205D10C2D3ED00D2D2D ++:10DAD0003DD13A203BE07E4B9C4204D1A5F10B03A3 ++:10DAE000012B23D933E07B4B9C4202D10B2D21D05B ++:10DAF0002DE0794B9C422AD10C2D25D00D2D26D11D ++:10DB0000442024E0332D01D800200BE03D2D01D826 ++:10DB1000012007E0632D01D8022003E0942D8CBF83 ++:10DB200004200320231893F9060010E04A200EE099 ++:10DB300042200CE03C200AE0382008E0402006E0CB ++:10DB4000502004E0482002E04C2000E04620CEEBCC ++:10DB5000000323EAE3736345B4BF18466046022A14 ++:10DB600004D199F800309842A8BF1846002209EB6A ++:10DB700002030132082A1871F9D1C0B2CC464A46D4 ++:10DB800000210023013182F83430107382F83C30D8 ++:10DB900001320829F5D1337F13F0010202D097F941 ++:10DBA000044106E097F90431182BD4BF1446A3F1C1 ++:10DBB00018043B68022B01D16B1E0FE0332D01D8F6 ++:10DBC00000230BE03D2D01D8012307E0632D01D890 ++:10DBD000022303E0942D8CBF04230323F2569B19E8 ++:10DBE000997B3E4B9E4205D1A5F16403022B01D8DF ++:10DBF0003E2110E03A4B49B29E4203D1642D00F021 ++:10DC00006C850BE0374B9E4205D1A5F16403022BD6 ++:10DC100001D83E2108E0344B9E420ED0334B9E4249 ++:10DC20000BD0334B9E4208D0324B9E4205D0324B34 ++:10DC30009E4202D0314B9E4214D1A5F16803242BA1 ++:10DC400010D82B4B9E421BD02A4B9E4218D02B4BF8 ++:10DC50009E4215D0254B9E4223D0274B9E4220D07A ++:10DC60004A214422264B9E420CD1A5F16803202B69 ++:10DC700003D98C2D00F04E8548E04021442201E07C ++:10DC80004A2142221F4B9E420DD1642D06D0A5F1A0 ++:10DC900068030C2B3AD83C2140226BE0342140220F ++:10DCA00001E044221146184B9E422FD1A5F1640396 ++:10DCB000102B2BD8422152225FE0C0466809860013 ++:10DCC0001CC6010008C6010050C60100B8C701000B ++:10DCD000A8C90100CCC70100E0C70100B508860053 ++:10DCE00030CA0100D2088600DC0586002E058600B9 ++:10DCF0004B0586006805860085058600330686008C ++:10DD0000F90586006D0686008A0686009F4B9E42B6 ++:10DD10001AD1A5F16403082B98BF3021A5F16E0339 ++:10DD200098BF3422162B98BF4621A5F18603022BFB ++:10DD300098BF3E218C2D08BF3622A5F1950308BF60 ++:10DD400048210F2B98BF4422914B9E4212D1A5F13E ++:10DD50006E03162BA5F1860398BF442198BF3A2283 ++:10DD6000022B98BF3E2198BF3A228C2D08BF482134 ++:10DD700008BF3622874B9E4202D0874B9E4204D179 ++:10DD8000A5F18403082B98BF2C22C4EB020323EADD ++:10DD9000E370C4EB010323EAE37E4A4613790021D2 ++:10DDA000137582F8441009F1080301329A42F5D143 ++:10DDB0004B460A460132187783F84CE00133082AB3 ++:10DDC000F8D1764B9E425BD0754B9E4258D0754B36 ++:10DDD0009E4255D0744B9E4252D0744B9E424FD0BF ++:10DDE000734B9E4236D0734B9E4249D0724B9E423B ++:10DDF00046D0724B9E4243D0714B9E4240D0714BF5 ++:10DE00009E423DD0704B9E423AD0704B9E423DD0D8 ++:10DE10006F4B9E4234D06F4B9E4231D06E4B9E4230 ++:10DE20002ED06E4B9E422BD06D4B9E4228D06D4B18 ++:10DE30009E4225D06C4B9E4222D06C4B9E421FD0FE ++:10DE40006B4B9E421CD06B4B9E4219D06A4B9E423C ++:10DE500016D050E0032D02D14FF03C0E0FE02B1FE7 ++:10DE6000042B0AD9092D00F05984A5F10C03012BCC ++:10DE700000F22E842C2000F02CBC4FF0400E4020ED ++:10DE8000524B9E4202D0524B9E4206D1EB1E402086 ++:10DE9000082B94BF86464FF0000E584B9E4221D16E ++:10DEA000A5F124030C2B03D84FF0300E382019E0D5 ++:10DEB000A5F13403082B02D84420864612E0A5F1D0 ++:10DEC0006403022B03D84FF03E0E34200AE0A5F184 ++:10DED0006803202B03D84FF04A0E442002E08C2D1B ++:10DEE00008BF32204B4600220132187583F844E007 ++:10DEF0000133082AF8D14B4600220021013283F871 ++:10DF0000241083F854100133082AF6D14B460A46F0 ++:10DF1000013283F82C0083F85CE00133082AF7D142 ++:10DF20001E4B89F864E09E4206D01D4B9E4220D0D5 ++:10DF30001D4B9E4277D0E5E0012D00F0BE80022D02 ++:10DF400000F0A380032D00F0BD802B1F042B03D80D ++:10DF500038273C223E21B8E0092D03D13027342256 ++:10DF60003621B2E00A2D00F090800B2D00F0A58044 ++:10DF70009FE0012D00F0A180022D00F08B80032D89 ++:10DF80003ED13227362238219FE0C046A2058600C6 ++:10DF9000BF0586002C078600F40486007E0A8600F2 ++:10DFA0009B0A8600B80A8600F20A8600BD0B86002E ++:10DFB000980E860094C5010050C90100EBC5010010 ++:10DFC00069C7010011C80100F4C70100630F860092 ++:10DFD00014108600B50E860064C6010081C60100DB ++:10DFE000F5C6010012C70100B1C50100CEC5010090 ++:10DFF0002FC701004CC70100880C8600DC05860095 ++:10E000002B1F042B5ED9092D04D130273422362151 ++:10E010004A205BE00A2D3DD00B2D4AD10022174645 ++:10E020001146362052E0012D04D100221746114638 ++:10E030002C204BE0022D37D0EB1E052B15D8032DDD ++:10E0400003D128272C222E212CE0042D27D0082DA7 ++:10E0500025D06B1F022B8CBF002734278CBF0022DA ++:10E0600038228CBF00213A211CE0092D04D12A2737 ++:10E070002E223021422029E00A2D15D00B2D18D157 ++:10E080000022174611462A2020E00022174611469A ++:10E0900040201BE00022174611463E2016E03227A2 ++:10E0A00036223821442011E00022174611463C2038 ++:10E0B0000CE000221746114608E0002217461146E0 ++:10E0C000382003E0342738223A214C204B460024E4 ++:10E0D000042C94BF83F84C7083F84C2001341877DB ++:10E0E0000133082CF4D1C7B24B460024032C94BF53 ++:10E0F00083F85C2083F85C10013483F82C700133C2 ++:10E10000082CF3D1A44B9E4206D0A44B9E420DD0C6 ++:10E11000A34B9E4221D062E0032D45D0092D43D070 ++:10E120002B1F042B38D83027342233E0032D03D1A2 ++:10E130004227462248243AE0042D31D06B1F022B9F ++:10E1400003D84C275022522431E0082D28D0092D25 ++:10E1500022D13E274222442429E0032D03D12E2739 ++:10E160003022322423E0042D03D1302732223424FC ++:10E170001DE06B1F022B03D8322736223A2416E00B ++:10E18000082D03D130273422382410E0092D03D183 ++:10E190002E27322236240AE000221746144606E0D3 ++:10E1A00046274A224C2402E028272C222E244B46C4 ++:10E1B0000021042994BF83F84C7083F84C2001316E ++:10E1C00001330829F5D14B460021032994BF83F878 ++:10E1D0005C2083F85C40013101330829F5D1714B93 ++:10E1E0009E422AD1032D0CD02B1F042B03D8382498 ++:10E1F0003E213C2708E0092D03D000210C460F46A4 ++:10E2000002E034243A2138274B460022042A94BFE6 ++:10E2100083F84C4083F84C7001320133082AF5D161 ++:10E220004B460022032A94BF83F85C7083F85C108D ++:10E2300001320133082AF5D136E05B4B9E422CD1E6 ++:10E24000A5F124030C2B03D84FF0340E38201AE02C ++:10E25000A5F134030C2B03D84FF0340E3A2012E012 ++:10E26000A5F16403282B03D84FF0400E3C200AE0B0 ++:10E27000A5F19503102B8CBF4FF0000E4FF0480E08 ++:10E280008CBF002046204B4600220132187583F8CF ++:10E2900044E00133082AF8D10AE0444B9E4269D099 ++:10E2A000434B9E4200F0DF80424B9E4200F0DB80F9 ++:10E2B000414B9E4200F0D780404B9E4200F0D380FD ++:10E2C0003F4B9E4200F0CF803E4B9E4200F0CB8001 ++:10E2D0003D4B9E4200F0C7803C4B9E4200F0C38005 ++:10E2E0003B4B9E4200F0BF803A4B9E4200F0BB8009 ++:10E2F000394B9E4200F0B780384B9E4200F0B3800D ++:10E30000374B9E4200F0AF80364B9E4200F0AB8010 ++:10E31000354B9E4200F0A780344B9E4200F0A38014 ++:10E32000334B9E4200F09F80324B9E4200F09B8018 ++:10E33000314B9E4200F09780304B9E4200F0F281BC ++:10E340002F4B9E4200F08F802E4B9E4200F08E801D ++:10E350002D4B9E4200F087802C4B9E4200F0838024 ++:10E360002B4B9E427FD02B4B9E427CD02A4B9E4211 ++:10E3700072D0B5E0A5F12403082B01D8382069E05C ++:10E38000A5F12E03022B40F29980A5F13403082B4E ++:10E3900044D84FF0400E95E0D50A8600A00B8600C9 ++:10E3A000DA0B86004E0C860011058600F905860002 ++:10E3B000BCC90100D9C901006ACA01002EC8010008 ++:10E3C00033C90100F9C80100D8C601006DC90100B8 ++:10E3D00030C60100DCC801008AC901004DCA010035 ++:10E3E00085C80100F6C9010016C9010061C5010018 ++:10E3F000A2C8010030CA010087CA010086C7010017 ++:10E400009EC60100BBC6010013CA0100BFC80100BF ++:10E410004BC8010068C8010016068600A5F13E033E ++:10E42000022B03D84FF0380E342050E0A5F16403DE ++:10E43000082B02D84FF0380E42E0A5F16E031E2BD8 ++:10E4400003D84FF0400E322041E0A5F19503102B88 ++:10E4500034D9002086463AE0A5F124030C2B36D8A7 ++:10E460004FF0340E2EE09E4B9E4201D1242D5AE1F6 ++:10E470009C4B9E4203D18C2D29D13A2027E09A4B08 ++:10E480009E4204D1642D1FD08C2D1DD01FE0974BD0 ++:10E490009E4203D1A5F19503102B0DE0944B9E42B3 ++:10E4A00015D1A5F124030C2B10D9A5F134030C2BA5 ++:10E4B0000CD9A5F16403282B08D908E04FF0400ED1 ++:10E4C000442004E0382002E0482000E03C204B4695 ++:10E4D00000220132187583F844E00133082AF8D18C ++:10E4E000844B9E420BD0844B9E4208D0834B9E426D ++:10E4F00005D0834B9E4202D0824B9E426DD1A5F146 ++:10E500002403082B0DD87F4B9E4201D13A2006E010 ++:10E510007D4B9E4202D13420024655E03420382201 ++:10E5200052E0A5F12E03022B08D8774B9E4214BF70 ++:10E530004220402014BF3822342245E0A5F13403A4 ++:10E54000082B02D8442046223EE0A5F13E03022BD0 ++:10E5500006D86D4B3A229E4214BF34202C2033E063 ++:10E56000A5F16403082B06D8674B3E209E4214BFDA ++:10E5700044223A2228E0A5F16E031E2B17D8A5F1FC ++:10E580008603022B09D85F4B9E4201D1442005E04F ++:10E590005D4B9E4201D13C2000E048208C2D10D1E3 ++:10E5A000584B9E420FD0584B9E420CD009E0A5F12B ++:10E5B0009503102B8CBF00204A208CBF00224622DE ++:10E5C00002E0442200E03C224B46002101311A7552 ++:10E5D00083F8440001330829F8D14C4B9E4202D005 ++:10E5E0004B4B9E421ED1A5F124030C2B01D83821A0 ++:10E5F0000EE0A5F134030C2B09D9A5F16403282BF7 ++:10E6000005D9A5F19503102B01D9002100E0402187 ++:10E6100008464B4600220132187583F84410013336 ++:10E62000082AF8D14846002202EB090191F83C3053 ++:10E630001BB990F84C3081F83C304AB999F83D301C ++:10E640000BB1013204E090F84C30012289F83D30E2 ++:10E6500001320130072AE7D94A46002192F84430B6 ++:10E660001BB992F84C3082F844300131013208294C ++:10E67000F4D14846002202EB090191F834301BB96D ++:10E6800090F8443081F834304AB999F835300BB1FC ++:10E69000013204E090F84430012289F8353001322B ++:10E6A0000130072AE7D900229CF824301BB99CF8D6 ++:10E6B0001C308CF824309CF854301BB99CF84C303A ++:10E6C0008CF854300132082A0CF1010CECD12DE009 ++:10E6D00040204FF0000EFFF7E0BB3822FFF79BBA57 ++:10E6E000BBC6010013CA01004BC80100DCC8010011 ++:10E6F0004DCA01004B058600680586008505860029 ++:10E7000033068600A2058600BF058600A7068600A0 ++:10E710005006860036221146FFF7F8BA4FF0380E41 ++:10E72000FFF7ADBB642D3FF4CDAED0E6BDE8F0877A ++:10E730007047C04600207047002070470020704797 ++:10E740007047C0467047C0467047C04600207047BB ++:10E750007047C04603680246D3F86C32D3F8E432FF ++:10E76000987818B1938A181E18BF01207047C046C8 ++:10E770007047C0467047C04670B5037D04469BB1E4 ++:10E78000457D8DB9C068A16900F068DF012363751C ++:10E79000E36906460BB1A0689847D6F1010038BF7F ++:10E7A00000206575257500E0002070BD0846002139 ++:10E7B00010B501614181017201730622F3F340F447 ++:10E7C00010BDC04610B50068F6F70AFC10BDC04683 ++:10E7D00090F832007047C04602460868430D5B055A ++:10E7E0006BB922F07F4323F46003520D83422CBFA8 ++:10E7F0004FF40013002352059B1803430B6070472E ++:10E8000070B510600D461C46084619461646FFF7BF ++:10E81000E3FF2368AB4202D233680133336070BD3B ++:10E82000002070477047C0460020704700207047A6 ++:10E830007047C0467047C0467047C04630B505684F ++:10E84000B5B061B10DF107040171C9220021204664 ++:10E85000F3F3F6F32B6B2146186902F0E3FA35B0B7 ++:10E8600030BDC046406B70477047C04600207047BF ++:10E870007047C046002070477047C0460020704770 ++:10E880007047C046002070477047C0467047C0467A ++:10E890007047C0467047C0467047C0467047C04684 ++:10E8A0007047C0467047C0464FF0FF307047C046C3 ++:10E8B0007047C04600207047002070477047C04630 ++:10E8C0007047C0467047C046002070477047C0463A ++:10E8D00010B513F08BDF024640B1416A11F4002FEE ++:10E8E00004D1036813B141F400234362104610BD04 ++:10E8F0002DE9F3411E46036804461B7E0F469046F1 ++:10E90000002B4BD090F87532002B47D10D6828466C ++:10E91000FFF7A8FF016902468B79B3B1837E13F03C ++:10E92000010F12D0D1F8CC3013F4806F0DD1B4F8B0 ++:10E93000263603F47043B3F5805F14BF40234423AD ++:10E94000CB5813B193F8DF3043BB5168002925DB66 ++:10E95000164B01EA03030BB9184602E0EB8A03F0F9 ++:10E96000070011F0400F19D0114B02A91B5C204683 ++:10E9700041F8043D33600CF083D8B0F1FF3F0DD077 ++:10E98000019A3368934209D00A4B32609A5CEB8A51 ++:10E9900002F0070223F007031A43EA8220463946B1 ++:10E9A0004246334616F000DBBDE8FC8140000180A2 ++:10E9B000C4D2850038AB010010B540F0B9D910BD04 ++:10E9C000F0B585B00A9C0D4600940B9C1F4601943F ++:10E9D0000C9C064602940D9C03942AF0BFDDAB7993 ++:10E9E00043B13946304646F0F3DF014610B13046B8 ++:10E9F00046F0E6DE05B0F0BD2DE9F041D0F8B043B9 ++:10EA0000D0F8AC7323F096D894F82F30064603B3B1 ++:10EA100000257B19D3F84C42C4B1A379B3B1237953 ++:10EA2000A3B1A36D13F0020F10D094F884306BB132 ++:10EA3000F7F3E8F5D4F890102AF09EDC30B100230B ++:10EA4000C4F88830C4F88C3084F884300435202D24 ++:10EA5000DFD13046BDE8F0812DE9FF4107461D4674 ++:10EA60009E6B146947F02CDE8046002834D1337A3F ++:10EA7000022B31D1A3797BB3B5F8683063B3A26DB3 ++:10EA800040F2371302EA030333B394F884301BBB1C ++:10EA9000D4F888303A6853B9D2F88C30D3F8E421EE ++:10EAA0000132C3F8E4213C23C4F8883009E0D2F8ED ++:10EAB0008C30D3F8E4210132C3F8E421012384F837 ++:10EAC0009430002394F94820384600930293296F2C ++:10EAD0001133019647F0CCD9404604B0BDE8F0812F ++:10EAE0002DE9F74F80460E4693461F46002B5FD018 ++:10EAF00001295DD14FF4C0730193FCF3FBF24FF495 ++:10EB000040718246F8F3E4F0044610B94FF0FF3547 ++:10EB100055E000214FF44072F3F392F24046314643 ++:10EB2000224601ABF3F322F110F11E0F3AD1019B03 ++:10EB30004FF0FF325D004A2323700B2363701533BF ++:10EB40002371042363716FF02F03A3719233237237 ++:10EB50006FF0560363724FF002096319A270E270FE ++:10EB600084F8079003F8022C03F8012C07F10C033A ++:10EB70009D4202DC6FF00E050DE059463A4604F165 ++:10EB80000A00F3F3F9F195FBF9F3404631462246CA ++:10EB9000F3F342F10546504621464FF44072F8F334 ++:10EBA000A7F00CE0504621464FF44072F8F3A0F075 ++:10EBB000404631465A463B46F2F304F205462846A3 ++:10EBC000BDE8FE8FF0B587B0119C0D4616461F4676 ++:10EBD00024B1A16811B10120FCF714FD10B96FF048 ++:10EBE00016000FE00C9B294600930D9B32460193C3 ++:10EBF0000E9B059402930F9B0393109B04933B463B ++:10EC0000FEF39EF307B0F0BD2DE9F0411F4690F8EA ++:10EC10004038054613F0080F0E461ED0536A02F125 ++:10EC2000240413F0100F18D1002B16DB896811F49F ++:10EC3000807F0CD15FB1E36913F0006007D1C1F3AD ++:10EC4000402223F0004343EAC273E36106E0284612 ++:10EC500031463B461BF0EADA00E00020BDE8F081D7 ++:10EC600070B50546D0F8B40058B103784BB1F3F74E ++:10EC7000A9FD044630B9D5F8B4000121F3F3CEF76D ++:10EC800000E001242846F6F38FF224B9D5F8B40049 ++:10EC90002146F3F3C3F770BD10B5FFF787FD10BD34 ++:10ECA00010B5F9F71FFE10BDB0F8543810B50BB110 ++:10ECB0001BF0F2DB10BDC04610B5044638B1026847 ++:10ECC0002AB121B992F80B370BB182F80B17204605 ++:10ECD0001AF044DA10BDC04610B521B11AB1536E16 ++:10ECE0000BB140F0EBD810BD036A10B50C46002BF9 ++:10ECF0002CD0036809691B68B4F814E093F89530C8 ++:10ED00002BB1E38A13F0800F01D11E2200E00C2208 ++:10ED100002F10B039E4519D38B188A5C591C5B7852 ++:10ED200003EB02239BB2B3F5006F0FD14B784A1C63 ++:10ED30001B09042B0AD1537A012B07D1436A0133F3 ++:10ED40004362C3680133C360002002E0214641F002 ++:10ED5000FFDF10BD036810B51A68536B2BB192F832 ++:10ED6000443013B133F072DA00E0002010BDC04629 ++:10ED700010B50C462FF084DC18B994F8F53284F8FD ++:10ED8000F43210BD70B5012205460C46D1F84C1581 ++:10ED900030F0DEDF284621462FF0AEDB70BDC046E6 ++:10EDA0000C2A70B504460E4615464DD80122AA40DD ++:10EDB00041F2485302EA0303002B45D0D0F8B436A1 ++:10EDC0004BB1D3F8D83233B15B68012B3CD0032B65 ++:10EDD0003AD0022B38D0204618F008D8002833D17A ++:10EDE000D4F868014369012B2ED05EB1B3794BB1E1 ++:10EDF000B36D13F0020F05D0D6F8883013B16FF061 ++:10EE000019002BE0082D01D00C2D02D183790BBB0A ++:10EE10000EE083790BB3D4F82835022B04D094F894 ++:10EE2000F43713F0010F15D0092145F0C1DB14E0D0 ++:10EE3000082D12D1204631460222002327F004DC9F ++:10EE400058B14FF0FF3009E0204631462A462BF0FA ++:10EE5000AFDF03E06FF0180000E0002070BDC04697 ++:10EE60002DE9F043054685B099460E4690460D9C27 ++:10EE70009DF83870F9F712FDD5F8B03393F84630A5 ++:10EE800013F0030F17D0B26D40F2371302EA0303F9 ++:10EE90008BB190F8693713F0010F0CD0636813F44D ++:10EEA000803F08D0236C012B05D100222146134658 ++:10EEB000009213F09BDE0C9B28460093314642469D ++:10EEC0004B460194029724F0DBDB05B0BDE8F083EC ++:10EED0002DE9F04107461CF0D5DA0026BB19D3F81E ++:10EEE0004C42B4B1D4F88C509DB9A3798BB1A36DC9 ++:10EEF00013F0020F0DD094F8843053B1F7F382F37E ++:10EF0000D4F890102AF038DA18B1C4F8885084F890 ++:10EF100084500436202EE1D1BDE8F08170B590F820 ++:10EF2000A131054663B903681B6F4BB1D0F81C488B ++:10EF3000F7F368F3D5F82038E41A2418C5F81C480C ++:10EF4000284616F0B1DE70BD10B588B00A9C00945A ++:10EF50000B9C01940C9C02940D9C03940E9C0494B5 ++:10EF60000F9C0594109C0694119C0794F5F3B8F43B ++:10EF7000044B0421D3F88C300A46044698472046B7 ++:10EF800008B010BDE0A6850070B504460D4620F01F ++:10EF900041DC294606462046F9F7DCF8304670BDCC ++:10EFA0002DE9F0410546D5F8D8320E465B68174684 ++:10EFB000012B0068D5F8DC4202D14FF0000805E0D3 ++:10EFC000042914BF4FF000084FF001080368DB6903 ++:10EFD0001A6D636A934238BF62624EB9D4F89010DA ++:10EFE00031B1406894F89420F7F382F6C4F8906049 ++:10EFF000284631463A4627F0EBDBB8F1000F01D046 ++:10F0000000236362BDE8F0812DE9F04385B00C9FD9 ++:10F0100005469846D7F80090D2F8D4621446009777 ++:10F020000CF0E6DF296891F8463013F0030F3FD06B ++:10F03000D4F8CC2012F4805F3AD196F93430002B0A ++:10F0400036D14B6B002B33D012F0020F30D13B681E ++:10F050000DF109001849032208EB0304F2F38CF7C1 ++:10F0600095F8FA3133B196F96A30002B02DA95F847 ++:10F070000A0700E0002008EB0901A14201D20021AB ++:10F0800000E0091B02238DF80C3000238DF80D30B1 ++:10F0900001338DF80E300DF109038DF80F00009348 ++:10F0A00020460723DD221DF071D83B6809333B6001 ++:10F0B00005B0BDE8F083C04672A701000FB430B5BB ++:10F0C000104BADF5037D9E4501D1002513E002A84C ++:10F0D00087AB053840F20121869A8193F3F3E6F07D ++:10F0E0000024054605E002AB053BE05CF7F328F59C ++:10F0F0000134AC42F7DB28460DF5037DBDE8304016 ++:10F1000004B07047DB62820010B502490248FFF785 ++:10F11000D5FF10BD5FCB01003CCB0100C36970B5CA ++:10F1200013F4006F0E460546016915D00368D3F845 ++:10F130008C20936B5C1C4FF47A739463B4FBF3F2F2 ++:10F1400002FB134323B90748C96B2246FFF7B6FFFA ++:10F15000EB6923F40063EB61284631462EF032DE82 ++:10F1600070BDC046FCAD010010B50446FAF3C6F20E ++:10F17000002384F8173284F8183210BD10B5074CFC ++:10F180002378012B09D0064B1B78012B05D00123D6 ++:10F190002370FBF381F20023237010BDE2F801001D ++:10F1A000E3F8010070B50546F3F7ECFB01280146D2 ++:10F1B00007DD044C012328462370FBF3FBF00023FA ++:10F1C000237070BDE3F801002DE9FF410B9F0D4650 ++:10F1D000B7F862400A9E14F00F0FDDF8308014D0AB ++:10F1E00040F2371406EA04047CB100960197CDF88A ++:10F1F00008800BF0F3DF98F934302BB16B78022BD9 ++:10F2000002D9023B02386B700546284604B0BDE8BF ++:10F21000F081C04610B5064902690B782BB1D2F8CF ++:10F22000D03013B100230B7001E01BF039D810BDB2 ++:10F23000E4F8010010B58B7913B1044B01221A7068 ++:10F240002FF09EDE014B00221A7010BDE4F8010081 ++:10F2500010B5044C24780CB1002001E015F076DBE9 ++:10F2600010BDC046E1F801002DE9F0410546084611 ++:10F2700016461F460C46FFF7F5FA95F84038024649 ++:10F2800013F0080F18D0D0F8F00008B91369986887 ++:10F29000E38A0F4A03F00703D35CC0680D2B01DD3E ++:10F2A0000F2200E05A1C0C2302FB03039B8A032B52 ++:10F2B00002D9084B01221A7032463B4628462146A5 ++:10F2C00026F044DF034B00221A70BDE8F081C046EF ++:10F2D00090E08500E1F8010070B5044C8568A54216 ++:10F2E00001D1002001E0F3F3ADF170BD0800002072 ++:10F2F00070B505460E461CF0CFDF0446C0B131465E ++:10F30000284640F26C521DF0D9D8064620B928464E ++:10F3100021461DF035D80AE0214640F26552F2F34D ++:10F320002BF62846214640F26552F7F3E1F43446C5 ++:10F33000204670BD2DE9F04385B000230C4611999D ++:10F3400017460546DDF83880039330F053D807F0B0 ++:10F350000103009306462146286842460F9B13F09E ++:10F36000B3DF814600285ED10D9B032B04D903A88F ++:10F370000C990422F2F300F6092F06D8DFE807F013 ++:10F38000080D0505141F333A474C6FF0160949E084 ++:10F3900028460AF0D3DC40B229E0284603990AF057 ++:10F3A000F7DC00283CD03DE0B6F95E300BB102201E ++:10F3B0001DE0B6F95C30181E18BF012017E0039B52 ++:10F3C000022B06D14FF00003A6F85C304FF001038A ++:10F3D00006E0003B18BF0123A6F85C304FF00003A5 ++:10F3E000A6F85E301EE0D5F83407F9F75BFAC8F8E6 ++:10F3F000000017E0D5F83407039CF9F75BFA844264 ++:10F400000EDCD5F834070399F9F750FA0AE095F8BD ++:10F41000C334C8F8003005E0039B85F8C33401E02D ++:10F420006FF01C09484605B0BDE8F0832DE9F041B6 ++:10F4300086B00E4698460C9900230546174605935C ++:10F440002FF0D8DF044687B1B8F1030F04D905A81F ++:10F4500039460422F2F390F53FB1B8F1030F04D915 ++:10F4600005A839460422F2F387F51C2E2ED004DCC1 ++:10F47000152E0BD0162E15D005E0D72E56D0D82E2F ++:10F480005FD09F2E28D06FF0160074E0B4F95E3084 ++:10F490000BB1022004E0B4F95C30181E18BF012043 ++:10F4A000386067E0059B022B06D14FF00003A4F8FB ++:10F4B0005C304FF0010306E0003B18BF0123A4F8C5 ++:10F4C0005C304FF00003A4F85E3053E02B6801215C ++:10F4D0001869FBF3EBF64DE0A8F104030622B3FB39 ++:10F4E000F2F33B60D5F80005002304A9059345F02D ++:10F4F000F1DD14E0237E13F0020F10D0059B591CA0 ++:10F500003B688B4202D26FF00D0034E0B81E062239 ++:10F51000059101FB020004F11A01F2F32DF504A894 ++:10F5200045F0E0DD04460028E4D121E02B681B7E95 ++:10F53000DBB1D5F868319879B8B9B5F816373B60C2 ++:10F5400019E02B681B7E83B1D5F868319C7964B9CA ++:10F550002B6B01221B6828460093394623460192F3 ++:10F5600002940394FCF7E2FC05E06FF0010002E076 ++:10F57000059B3B60002006B0BDE8F0812DE9F04717 ++:10F5800004468946FFF358F5F7F33CF094F85431FC ++:10F590008046012B1ED82546002717E06E69B379F7 ++:10F5A000022B11D1B4F86C3013F4807F0CD02046BC ++:10F5B00049464246F3F7C0FD30B90423B37194F8CD ++:10F5C000CD30013B84F8CD3001370435B4F910302B ++:10F5D0009F42E3DBBDE8F08730B54FF0000E0446F4 ++:10F5E00091B08C461546704609E023185A690EF111 ++:10F5F000010ED1794DF80010536B0430D371B4F97A ++:10F6000010309E45F1DB204661462A46FEF308F79E ++:10F610000020014606E063185A695DF801300130A8 ++:10F62000D3710431B4F910309842F4DB11B030BD1D ++:10F630002DE9F0410C2904460D46164690F8537109 ++:10F640000DD100210122FEF3EBF62046002101221C ++:10F65000FEF3A2F6002384F8CE3084F8CD30A36EFA ++:10F660002046B3F1FF3F08BF84F8563129463246A1 ++:10F67000FEF3F6F7B4F86C3003F0C003C02B16D1DC ++:10F68000D4F85C319BB194F85331BB420FD9E36895 ++:10F69000A1689868FFF3E2F7E368A1689868D4F876 ++:10F6A0005C210123FFF392F74FF0FF33A366BDE81F ++:10F6B000F081C046836E10B5B3F1FF3F01D0FEF379 ++:10F6C00003F310BD2DE9F04104460D46866EFFF3AD ++:10F6D00029F4074690B9042204F5AE7005F114012F ++:10F6E000F2F34AF4D4F85C314FF47A7203FB02F37C ++:10F6F000B6F1FF3FC4F85C3108BFA6663846BDE8E6 ++:10F70000F081C0460E2937B505468E4614460BD00B ++:10F710000F2910D1114601A80422F2F32DF4284636 ++:10F720000199F3F7A5FD08E0B0F85831002003F087 ++:10F730000103136001E0FEF34DF73EBD70B51446C2 ++:10F740000546FEF303F723680BB10223AB6570BDDA ++:10F7500070B50D460446FEF361F5014610BBA36D7E ++:10F76000EDB1FBB9D4F854210F4B02EA03037BB18E ++:10F7700094F85431022B04D194F8573113F0010F4F ++:10F7800005E0012B07D194F8573113F0020F02D195 ++:10F790006FF0010300E0002384F8563102E00BB162 ++:10F7A00084F85601084670BDFF0000FF10B50446FE ++:10F7B000FEF3C6F4002384F85731A4F85831C4F896 ++:10F7C0005C3184F8563110BD2DE9F041A2B0882299 ++:10F7D00005460C4690F8558190F8567190F85461A2 ++:10F7E0006846F2F3C9F328462146FEF313F40246B5 ++:10F7F000002836D1009B85F856719E4285F85461E9 ++:10F800002CD01BB995F8573173B112E0022B04D1FB ++:10F8100095F8573113F0010F05E0012B07D195F84A ++:10F82000573113F0020F02D16FF0010314E096B9C3 ++:10F830000DE0012E02D113F0010F05E0022E05D1DB ++:10F8400095F8573113F0020F05D107E036B995F856 ++:10F850005531434502D2002385F85631009B85F887 ++:10F860005431104622B0BDE8F081C0462DE9F04188 ++:10F8700004460E46154690F85671FEF3C7F18646CB ++:10F88000A0B92A4601460DE07318DB88083113F051 ++:10F89000100F06D194F8573143F0010384F8573123 ++:10F8A00002E0083A072AEFD884F856717046BDE89E ++:10F8B000F081C0462DE9F04104460D46164690F809 ++:10F8C0005671FEF33FF1864698B9294632460CE060 ++:10F8D0004B6A13F0100F06D194F8573143F002032E ++:10F8E00084F8573103E0383A3831372AF0D884F8B1 ++:10F8F00056717046BDE8F081012902D14FF6FF70C4 ++:10F9000010E0D0F8BC304FF00002082BD0F8B03037 ++:10F9100008BF41F40071A3F8D813B3F8DA33A0F8A4 ++:10F92000202698B27047C046D0F8B030A3F8D8135C ++:10F93000A3F8DA237047C046D0F8B0300021A3F80E ++:10F94000D8134FF0010230B5B3F8DA434FF0020597 ++:10F95000A3F8D823B3F8DA23A3F8D853B3F8DA33EB ++:10F9600092B29BB2A0F82016C4F3031040EA0470D0 ++:10F9700042EA032240EA023030BDC04670B5054677 ++:10F980000E461446FFF7B8FF314600EA0402284647 ++:10F99000FFF7CAFF70BDC04670B505460E46144657 ++:10F9A000FFF7AAFF40EA04023146284692B2FFF769 ++:10F9B000BBFF70BD2DE9F0411546064688461C4642 ++:10F9C000FFF79AFF2C4020EA0502224330464146C9 ++:10F9D00092B2FFF7A9FFBDE8F081C0462DE9F041E2 ++:10F9E0001C46069B90461980079D0E46FFF784FF34 ++:10F9F000089B28801E802B8804EA080423EA080359 ++:10FA0000099A23431380BDE8F081C046D0F8B03096 ++:10FA10004FF00002A3F8FC13A0F82026B3F8FE0371 ++:10FA200080B27047D0F8B03041EA0242C3F8FC23FC ++:10FA30007047C046D0F8B030A3F8FC13B3F8FE13FB ++:10FA40000A40A3F8FE234FF00003A0F820367047C9 ++:10FA500010B5D0F8B040A4F8FC13B4F8FE339BB254 ++:10FA60001A434FF00003A4F8FE23A0F8203610BD7F ++:10FA700010B5D0F8B0401340A4F8FC13B4F8FE134E ++:10FA800089B221EA02010B43A4F8FE334FF00003D0 ++:10FA9000A0F8203610BDC0462DE9F04106460C46C0 ++:10FAA0002CE0254635F8023B571E990403F44043E9 ++:10FAB000890CB3F5804F11D001DC3BB11CE0B3F5EC ++:10FAC000004F10D0B3F5404F12D015E03046628899 ++:10FAD00035F8023FFFF7CCFF013F0DE0304662886A ++:10FAE000FFF7A0FF08E030466288FFF7A3FF03E0BE ++:10FAF00030466288FFF7ACFFAC1C7A1E002AD0DCCF ++:10FB0000BDE8F0812DE9F0411C46069B9046198026 ++:10FB1000079D0E46FFF77AFF089B28801E802B88E2 ++:10FB200004EA080423EA0803099A23431380BDE882 ++:10FB3000F081C046002380F8E3304FF0FF3241F2FD ++:10FB40000A03C25400F58A500270704710B531B1F3 ++:10FB500040F23B414FF6F872FFF76CFF03E00249B9 ++:10FB60000422FFF799FF10BD32D2010060B1B0F856 ++:10FB7000DE00B0F5006F05D0B0F5406F04D1A0F500 ++:10FB8000386002E0402000E000207047012380F848 ++:10FB9000E130704780F824167047C04690F924067B ++:10FBA0007047C0467047C04610B1C06900B1417788 ++:10FBB0007047C04610B1C06900B101777047C046B8 ++:10FBC00010B590F8E3300446002B45D14FF06401A6 ++:10FBD0004FF44872A0F87428A0F86C18A0F86E18BA ++:10FBE000C0F870381A46A31802324FF06401102A88 ++:10FBF000A3F87618F7D14FF00003A4F82438A4F83E ++:10FC0000AC37A4F8AE374FF00A034FF00A02A4F85D ++:10FC10003038A4F83238636A4FF01401A4F8282869 ++:10FC2000A4F83628A4F82A28A4F83828A4F820280C ++:10FC3000A4F82228A4F89027A4F892274FF05002A5 ++:10FC4000A4F82618A4F89427A4F834180BB1204679 ++:10FC50009847012384F8E33010BDC04610B5FFF784 ++:10FC60006BFE10BD2DE9F84F0C46D1F810A00D68C1 ++:10FC70009B468968E368064643EA812311469AB2A7 ++:10FC8000BDF82880FFF7CEFE0027B9461EE0BAF186 ++:10FC9000200F0BD159F8052030465946120CFFF7BA ++:10FCA000C1FE39F80520304641460AE0BAF1100F8E ++:10FCB00004D135F817203046414602E07A5D3046DF ++:10FCC0004146FFF7AFFE013709F1040963689F421F ++:10FCD000DDD3BDE8F88FC0462DE9F74F0D460193FF ++:10FCE000D1F810B00E68EB688968074643EA8123B3 ++:10FCF00011469AB2BDF83090FFF794FE4FF000081D ++:10FD0000C24626E0BBF1200F0FD149463846FFF727 ++:10FD10007DFE019904464AF806003846FFF776FE54 ++:10FD200044EA00444AF806400FE0BBF1100F06D148 ++:10FD300038464946FFF76AFE26F8180005E03846BF ++:10FD40004946FFF763FE08F8060008F101080AF1CA ++:10FD5000040A6B689845D5D3BDE8FE8F7FB5029342 ++:10FD6000089B03910593099B0192049301A90A9BA7 ++:10FD7000984707B000BDC0467FB50293089B03912A ++:10FD80000593099B0192049301A90A9B984707B028 ++:10FD900000BDC0460B46D0F8F81012B141EA03038B ++:10FDA00001E021EA0303C0F8F830704700B5D0F84D ++:10FDB000F8308E4621B143F01003C0F8F83012E05D ++:10FDC00023F0100312F0010FC0F8F8300BD041F20D ++:10FDD000C413C258C369196A986E814294BF7146B0 ++:10FDE000091AC2F8901000BD00207047A0F8DE107C ++:10FDF0007047C046A0F8DA107047C046B0F8DA0085 ++:10FE00007047C04640F6C313984201D800200BE06B ++:10FE100041F2C843984201D8012005E041F2446311 ++:10FE200098428CBF032002207047C0467047C046EE ++:10FE300000B5002286460748910030F8223073450D ++:10FE400002D10B18588803E001320E2AF3D10020AA ++:10FE500000BDC046C0CB010010B5C8B2FFF7E8FF37 ++:10FE6000FFF7D0FF10BDC04610B541F21823C45CA7 ++:10FE70004FF0000C134B3CF803E0BEF10E0F8CBFAB ++:10FE80004FF480524FF400524EF4306342EA0300C4 ++:10FE90002CB1BEF1940F02D9BEF1A50F0AD90229E7 ++:10FEA00003D1BEF10E0F0BD904E0012902D1BEF13E ++:10FEB0000E0F05D80CF1040CBCF1380FDAD1FF207D ++:10FEC00010BDC046C0CB010010B590F8B232144648 ++:10FED0000B6090F82B3653B190F8F83690F92A263B ++:10FEE00023B1534243F080430B6000E00A6014B139 ++:10FEF00090F8F7362370002010BDC04610B5864636 ++:10FF00001C4641F20B031EF8033002989B000E2999 ++:10FF1000137008D80028ACBF0EEB00030EF10003ED ++:10FF200093F81E3127E07F23237030EA200028BF9A ++:10FF300004200022114BD35A994202D00432382AAD ++:10FF4000F8D1A1F122031E2B04D80EEB000393F885 ++:10FF500083312370A1F16403282B04D80EEB000336 ++:10FF600093F8E8312370A1F19503102B04D80EEB20 ++:10FF7000000393F84D32237010BDC046C0CB010082 ++:10FF80002DE9FF4700250746884691469A46FF26F9 ++:10FF90002C461EE0009341460DF10E020DF10F03B9 ++:10FFA0003846FFF7ABFF41F2D623FA5C9DF80F10FD ++:10FFB00053B2994201DC002302E0C2EB0103DBB241 ++:10FFC0008DF80F30AB4228BF1D46B34238BF1E46E6 ++:10FFD0000134142CE3B2DDD189F800508AF80060B6 ++:10FFE000BDE8FF877047C04690F829067047C046B5 ++:10FFF000B0F8DA3003F47043B3F5805F09D1032A17 ++:020000021000EC ++:1000000018DDA2F16503032B14D9A2F1C9030F2B4C ++:1000100010D9132A0EDCA2F13403642B0AD9A2F101 ++:10002000A9031F2B06D9A2F1D103072B94BF0020EF ++:10003000012000E00020704770B590F8DA500446C7 ++:100040002846FFF7F5FEB4F8DA3003F47043B3F551 ++:10005000005F01D0002004E02B1903F598533F33D3 ++:10006000187940B270BDC04600B54FF0000E00EBED ++:100070000E021EF801300EF1010EBEF1040F82F8DF ++:100080002C36F4D14FF0000E01EB0E0200EB0E0304 ++:1000900012790EF1010EBEF1080F83F83026F3D16C ++:1000A00000BDC04680F8E0107047C046C369996142 ++:1000B0007047C04680F8D5104176704780F8D91057 ++:1000C0007047C0467047C04690F81A067047C04651 ++:1000D00041F21403C35C33B141F20C2380F81A16C9 ++:1000E00080F81B16C154704790F8D83013B1002324 ++:1000F00080F8D83000207047C369012093F8813020 ++:100100000B70704722B10023C0F8D83FA0F8DC3F45 ++:1001100041F21003C15001207047C0460022C1695E ++:1001200010460B1893F982300130D2180828F8D104 ++:1001300092FBF0F040B270477047C0466FF0160077 ++:100140007047C04670B541F20E23C35C04468B4233 ++:100150000D46164603D0D0F8883003B1984741F2D7 ++:100160001023E652023BE55470BDC0460021C3692E ++:10017000CB180131082983F88220F8D10021C36906 ++:100180006FF05B02CB180131082983F88220F6D189 ++:10019000C2690023C2F88C30D36E032B08D1D0F88B ++:1001A000E83F13F0010F03D0136A0833C0F8E03FB3 ++:1001B00000F58A530233002204E0002241F2C21308 ++:1001C000C25470474FF6A47101321980198402336A ++:1001D000102AF7D1F1E7C04649F675334B6000238A ++:1001E0000B60F0B50C469842ACBF01214FF0FF31D7 ++:1001F00003F5340301FB03F103F53403081890FB06 ++:10020000F3F202FB1303581A03D4C31301335B1038 ++:1002100004E04342DB1301335B105B425A2BD4BF33 ++:100220000023012313B1A0F5340014E0002803DB00 ++:10023000C31301335B1004E04342DB1301335B1053 ++:100240005B4213F15A0FACBF002301230BB9012607 ++:1002500003E000F534004FF0FF364FF0000EF44697 ++:100260007546604561682268144F0BDD41FA0EF354 ++:100270009B18236042FA0EF3C3EB01036360EB5952 ++:100280009C440BE041FA0EF3C3EB0203236042FAF5 ++:100290000EF35B186360EB59C3EB0C0C0EF1010E0F ++:1002A0000435BEF1120FDCD1636806FB03F3636013 ++:1002B000236806FB03F32360F0BDC0460CCC0100AD ++:1002C00080EAE071A1EBE0710022D0B251FA00F3B4 ++:1002D0000132002BF9DC70470146002000B586464C ++:1002E0004FF0804343FA0EF31A188A424FEA500047 ++:1002F00002D8891A43EA00000EF1020EBEF1200F67 ++:10030000EED1884238BF013000BDC046C36983F8D2 ++:100310009010C36983F89120C36983F89210C36970 ++:1003200083F893207047C046C36983F892107047E2 ++:1003300041F20633C256013BC0568242B4BF01208F ++:10034000022070470048704754CC010000207047DD ++:100350007047C046084670470020704741F2C813F6 ++:10036000C05803E0C3888B4202D000680028F9D14E ++:100370007047C04610B5B0F8DA10FFF7EFFF10BDB8 ++:10038000C3699B6913F0005F09D0D0F8B0304FF01B ++:100390000302A3F8B4264FF0FF02A3F8B826704773 ++:1003A000D0F8F83013F0060F0CBF00200120704782 ++:1003B0002DE9F0410F46B0F8DA10044615461E4606 ++:1003C000FFF74AFD40B9B4F9FC302B60B4F9FE30B8 ++:1003D0003360B4F900313B60BDE8F081D0F8A8008B ++:1003E0007047C04670B541F2C813C15805460AE0CF ++:1003F0000B6841F2C8142B51EB694FF43D729868B9 ++:10040000F6F376F429590029F2D141F2C81305F523 ++:100410009152E950043BEA504FF6CE70F033E85267 ++:10042000C2F8901070BDC04610B590F8E93094B095 ++:1004300043F0010380F8E93004460021302201A88E ++:10044000F1F3FEF5002110220DA8F1F3F9F50021DA ++:10045000042213A8F1F3F4F511A800210822F1F306 ++:10046000EFF594F8E930002023F0010384F8E93037 ++:1004700014B010BD70B506460D4610461446002156 ++:100480001C22F1F3DDF500200F4BC25A41F2182374 ++:10049000F35C1BB1942A01D9A52A10D9022D02D1EF ++:1004A0000E2A04D90BE0012D09D10E2A07D9D10853 ++:1004B00002F0070301229A40635C13436354043043 ++:1004C0003828E1D170BDC046C0CB010010B50C4644 ++:1004D000002103F01DF82070012010BD10B500218F ++:1004E00003F016F840B210BD41F2C41310B5C45861 ++:1004F000F433C15819B1C369186940F02DD90023EC ++:100500006370A37010BDC04610B59E462BB941F272 ++:10051000F713C35C704613600FE041B1012906D0A8 ++:10052000022904D0032902D06FF01C0005E041F23B ++:10053000F713C154FFF7D8FF002010BD41F2B823D4 ++:10054000C15810B509B9084607E0C369186940F0F9 ++:1005500003D9D0F1010038BF002010BD10B541F221 ++:10056000E423C35C0BB104F08BFD10BD10B503F0A8 ++:10057000ADFB10BDC36970B5DC681B6D054613F09B ++:10058000010F0E4608D02046FAF392F420B1EB6931 ++:100590009B6913F0005F12D1EA69136D13F0010F2C ++:1005A0003BD0536D13F0800F37D1D068FAF31EF6AD ++:1005B000002832D0EB699B6913F0005F2DD0D5F88D ++:1005C000F83013F0020F28D1EEB106F47043B3F502 ++:1005D000005F18D163691149232BB4BF00230C239A ++:1005E000F2B2B8BF0F2120469A400123FAF368F413 ++:1005F00063690B49222B2046D8BF7021CCBF4FF432 ++:100600000072102206E0636904492046222BD8BFFD ++:100610000F2100220123FAF353F470BD00F0555569 ++:10062000000E5555D0F8B030C269D3F82031136DA3 ++:1006300070B513F0010F04460D4608D0D068FAF3E8 ++:1006400037F420B1E3699B6913F0005F11D1E269CF ++:10065000136D13F0010F18D0536D13F0800F14D1E8 ++:10066000D068FAF3C3F580B1E3699B6913F0005FCA ++:100670000BD025B920462946FFF77CFF0AE020462B ++:10068000B4F8DA10FFF776FF00E01DB10449204608 ++:10069000062202E0034920460E22FFF7FDF970BD55 ++:1006A0003AD2010046D2010010B514299E46D0F876 ++:1006B000A82004D015290CD06FF016000CE092F998 ++:1006C0001A3002A941F8043F70460422F1F354F4B1 ++:1006D00001E0039B9376002010BDC04610B590F852 ++:1006E0001A360C462BB10231224601F089FDA3785F ++:1006F000637010BD10B5012103F06AFA10BDC04649 ++:100700002DE9F0418A79CB790D4642EA03216B79D4 ++:100710002A79074642EA0328C3695B690A2B07D98D ++:10072000EB7C1B0213F4807002D10123EB7735E0E0 ++:100730002A7A6B7A384601F0FF0442EA0326FFF773 ++:100740004DFE7F2C1B4AC8BFA4F58074B30AD35654 ++:1007500090F85F00E21818F4006F14BF41F22B33D9 ++:1007600041F22A33FB56D11843B2C918AA7DEB7D5A ++:100770007F2942EA0322C2F3C702C8BFA1F58071F4 ++:100780000E2AD4BF4FF400534FF4805342F430622A ++:10079000384649B243EA0202FFF7DCFD6A79C1B28A ++:1007A0002977384649B2C2F3801201F005FBBDE853 ++:1007B000F081C04614EF010010B590F8E93096467C ++:1007C00053B313F0010F19D0D0F8F0308B420FD192 ++:1007D000C369D3F88C209B1883F882E0C269D2F8F1 ++:1007E0008C30072B01D1002300E00133C2F88C309C ++:1007F00090F8E93023F0010380F8E93090F8E9300F ++:1008000013F0020F08D023F0020380F8E930C36927 ++:10081000724618693FF0B4DF10BDC04690F8E93069 ++:1008200010B5A3B9012902D0022902D003E0C0F813 ++:10083000F02080F8E910C3691B6AC0F8EC3090F82A ++:10084000F53F23B111466FF05E02FFF7B5FF10BD13 ++:1008500037B5044602F016FFE3691A6A01321A62DC ++:1008600094F8E830002B77D041F25233E35A1BB1B1 ++:10087000A4F85E38A4F8603841F25633E35A1BB14D ++:10088000A4F85838A4F8543841F25433E35A1BB151 ++:10089000A4F85238A4F85638E369196A1A6EB1FB05 ++:1008A000F2F302FB131323B92046B4F8DA10FFF772 ++:1008B00061FED4F8F83013F00E0F05D12046012167 ++:1008C00094F8DA20FFF7AAFF94F8E9304BB1E36916 ++:1008D000D4F8EC201B6A9B1A052B02D9002384F85C ++:1008E000E93041F21805615929B1E3691A6A1B6EB2 ++:1008F000521A9A420BD3D4F8F83013F0020F06D1F3 ++:100900002046FFF771FA10B1E3691B6A6351D4F80E ++:10091000F83013F00F0F1FD1D4F88C300BB12046F4 ++:100920009847E36918693FF09FDE68B1E36901A960 ++:1009300018690DF107023FF0A1DE20469DF807106F ++:10094000BDF80420FFF7FEFBD4F8F83013F00F0FCA ++:1009500002D1204603F0BAF900203EBD10B504468E ++:10096000FFF74CFA0221C2B22046FFF757FF10BD35 ++:10097000C36973B5012983F8811004460D46C36924 ++:1009800006D918690122032300930021134605E0CC ++:10099000186900210323009301220B463FF094DEE7 ++:1009A000E269537F002B30D0D4F8B030D3F8203137 ++:1009B00083F0010313F0010602D110693FF0EADE73 ++:1009C000012D0FD90222134620464FF48261FFF712 ++:1009D0004FF820464FF482610122022D14BF0023FC ++:1009E00001230BE020464FF4826102220023FFF72F ++:1009F0003FF820464FF4826101222B46FFF738F87A ++:100A00001EB9E36918693FF0B1DE7CBDC36970B5FA ++:100A100047F67F750446582118692A463FF088DE5C ++:100A2000E3695A2118692A463FF082DEE3697021A2 ++:100A300018692A463FF07CDEE369722118692A466C ++:100A40003FF076DE70BDC046F7B5C2690546537FFC ++:100A5000002B62D090F81A36002B45D0106928215F ++:100A60003F223FF065DEEB692421186910223FF038 ++:100A70005FDEEB6995F829261869262112013FF0FF ++:100A800057DEEB6932211869B5F8FC263FF050DEDD ++:100A90002E460027EB691869204BF95C3FF020DEF9 ++:100AA000EB6996F914250446A11D186992B23FF02E ++:100AB0003FDE96F914250223E96992FBF3F25242D4 ++:100AC000086992B204F10E0101373FF031DE0136C0 ++:100AD000082FDFD1EA6903230093106980220121E6 ++:100AE00013463FF0F1DD18E00146042091F914357A ++:100AF0000822073393FBF2F3DB00013081F8143551 ++:100B000001310C28F2D195F91425EB6907321869E7 ++:100B10004E21C2F3CF023FF00BDEFEBD29D2010011 ++:100B200010B5012102F0B0FC40B210BD10B500219B ++:100B30000446621801317F23652982F89136F8D185 ++:100B40002046FFF7EDFF2046FFF7C8FC10BDC0466A ++:100B50002DE9F04FB0F8DA30A5B003F47041B1F5EB ++:100B6000805F14BF022201220592D0F8A83004460B ++:100B70000693C3695A6C40F239539A4204D05233F7 ++:100B80009A4201D0002304E0B1F5805F14BF002336 ++:100B90000123DBB2002165220DF129000893F1F356 ++:100BA0004FF2B4F8DAA00AF44073B3F5407F02D1F3 ++:100BB0005FFA8AF810E0B3F5007F5FFA8AF104D19A ++:100BC000DD2904D801F1020806E0022902D84FF01D ++:100BD000000801E0A1F1020820460599FFF7A6FFF1 ++:100BE0002046FFF729FA4FF0000BC0B2FF255E4602 ++:100BF00007900395CDF810B070E0204651462A4684 ++:100C0000FFF7F6F9002867D005EB040999F8B262FE ++:100C100024AA571907F8676C94F8AC3043B1059AC9 ++:100C2000204641462B46FFF791FB301807F8670C2A ++:100C300041460DF18E020DF18F0320460095FFF71E ++:100C40005DF999F82C269DF88F309A4234BF1146F1 ++:100C5000194641F2D623E25C53B2994201DC0020EE ++:100C600002E0C2EB0103D8B224AB591911F8673C7A ++:100C7000984234BF02461A4601F8672C94F8E030D7 ++:100C8000642B06D803FB02F3642293FBF2F301F812 ++:100C9000673C11F8673C9DF88E20079E9A4238BF4A ++:100CA0001A462B1993F891368DF88F00934294BF12 ++:100CB000C6EB0306C6EB0206049AF3B25B4588BF97 ++:100CC0002A46049201F8673C039D5B4528BF9B467A ++:100CD000AB4238BF1D460395099E01360996099A15 ++:100CE000142AD5B289D104F5A26000215132F1F362 ++:100CF000A7F1039B049D84F8293684F82A36002343 ++:100D0000184684F818B684F8F83684F8195616E0B0 ++:100D100024AE731813F8672C94F81A36091981F861 ++:100D200075250BB1089B1BB194F818369B1A03E08C ++:100D300094F82936C3EB020381F8103501301428EA ++:100D4000C1B2E5D121460020069D91F91035B5F9D3 ++:100D5000E623D218431CD8B281F8102501310428AB ++:100D6000F2D1E36A0BB12046984725B0BDE8F08F79 ++:100D700070B505460E462C46FFF776F92946002049 ++:100D80003218137D03B91379013081F838360131F7 ++:100D90000828F5D10021721892F8443003B913796C ++:100DA000013184F8483601340829F4D1EB69186917 ++:100DB0003FF0F0DC2846FFF7CBFEEB6918693FF007 ++:100DC000D5DC70BD7F2970B5044601D9052028E027 ++:100DD000002213190132652A83F8B212F9D10023D7 ++:100DE000E26984F8F736137FD3B1D4F8F83013F002 ++:100DF000020F15D1D4F8B030D3F8203183F00103BD ++:100E000013F0010502D110693FF0C4DC2046FFF762 ++:100E10009FFE2DB9E36918693FF0A8DC284600E081 ++:100E2000002070BD70B5054600F52C70042202301C ++:100E30000C46F1F3A1F005F52C70211D08220630B7 ++:100E4000F1F39AF005F52E700822063004F10C013A ++:100E5000F1F392F005F538700822063004F1340100 ++:100E6000F1F38AF005F53A700822063004F13C01EE ++:100E7000F1F382F005F530700822063004F1140118 ++:100E8000F1F37AF005F532700822063004F11C0106 ++:100E9000F1F372F005F534700822063004F12401F4 ++:100EA000F1F36AF005F536700822063004F12C01E2 ++:100EB000F1F362F005F53C700822063004F14401BC ++:100EC000F1F35AF005F53E7004F14C0108220630AA ++:100ED000F1F352F005F540700822063004F1540198 ++:100EE000F1F34AF005F542700630082204F15C0186 ++:100EF000F1F342F094F8643085F81633D5F8B03049 ++:100F0000D3F8203113F0010309D11C462846FFF71E ++:100F10001FFE54B1EB6918693FF028DC05E0EB696E ++:100F2000012418693FF036DCF0E770BD2DE9F0418F ++:100F30000F460546FFF712FA07F47043B3F5805FDA ++:100F4000EB69FAB208BF42F480720446A021186926 ++:100F50003FF0EEDBAE6A14B104F5177201E005F55F ++:100F6000915241F2C413EA5016B128463946B047AF ++:100F70002CB341F2C413EA58537873B1EB6941F2D0 ++:100F8000B824295918693FF0E7DBEB69002218699A ++:100F9000295913463FF05EDB11E041F2F713EB5C99 ++:100FA0006BB1032B0BD0E969D2F890200B6A9B1A26 ++:100FB0008A6E934203D328460221FFF7DBF92846C5 ++:100FC0003946FFF7D7FABDE8F081C046E02910B5F1 ++:100FD0000B46044602DD6FF0120012E043F430636A ++:100FE0000E29D4BF4FF400514FF48051194389B2F8 ++:100FF000FFF79CFF0123204684F8D83008F08CFFCF ++:10100000002010BD70B50C460546FFF76DF844B9D9 ++:10101000284605F0D5FE28464FF4404106F0AAF9CF ++:1010200010E0214628460022FFF7D0FF044648B9C9 ++:10103000284621467022234605F046FB28465E21BD ++:1010400006F0EAFD204670BD2DE9F0410D4604464C ++:10105000FFF74AF845B92046294602F0B1FC2F4671 ++:1010600041F2C423E55213E0204629460122FFF74E ++:10107000ADFF074660B941F2C426A35B23B9204601 ++:101080000A21FEF7C3FCA0532046294602F098FC33 ++:101090003846BDE8F081C04670B50E460546D0F82A ++:1010A000B040FFF721F83EBB41F2C6240A21284692 ++:1010B0002A5BFEF7B7FC284640F24B413246FEF76A ++:1010C000B1FC2846314602F0DBFBEB692E531B6D69 ++:1010D00013F0020F56D041F2C823D5F8B020EB5AD6 ++:1010E0004FF47A70A2F89C3441F2CC23EB5AA2F868 ++:1010F0009E34F5F331F345E0EB691B6D13F0020FFD ++:101100001FD0D5F8B01041F2C822B1F89C344FF48A ++:101110007A709BB2AB50B1F89E3404329BB2AB50A4 ++:10112000B4F89C3423F400731B041B0CA4F89C3407 ++:10113000B4F89E349BB243F40073A4F89E34F5F3E4 ++:101140000BF3314628460122FFF740FF0646C8B997 ++:1011500041F2C6242B5B5BB90A212846FEF756FCF8 ++:1011600040F24B4128534FF6FF722846FEF75AFCD7 ++:101170002846012102F084FB28460A214FF494728C ++:10118000FEF766FC304670BD2DE9F0418AB005AE31 ++:10119000D0F8B07005468846142238493046F0F33E ++:1011A000EBF6142236496846F0F3E6F6EB690021C7 ++:1011B0006C461869142288450CBF234633463FF01D ++:1011C000C1DA4FF00003A7F86835B8F1000F4FF40B ++:1011D0008073A7F8C0370CBF40234123A7F80C3514 ++:1011E00041F60223A7F814354FF00003A7F808359D ++:1011F000A7F80A35A7F84C354FF01403A7F86A355D ++:1012000040F62603A7F868354FF00003A7F800352D ++:101210004FF0D003A7F80235B7F802350CBFFA2516 ++:101220001E25002402E00A20F5F396F2AC420ADA09 ++:10123000B7F80E35013413F0800FF4D103E00A2023 ++:10124000F5F38AF200E0002401340B2C09D0B7F842 ++:101250000E3513F4806FF2D003E00A20F5F37CF230 ++:1012600000E0002401340B2C04D0B7F8903613F4BE ++:10127000807FF2D10AB0BDE8F081C04662D20100A1 ++:10128000F8CB010070B590F8E2200446002A6CD13A ++:10129000012380F8E230D0F8B030A0F8DA10D3F8AB ++:1012A000203141F21003C250D0F8F82012F0020FA2 ++:1012B00006D190F8703E1BB942F02003C0F8F83018 ++:1012C000256A002D51D001212046FEF73FFCB4F8DD ++:1012D000DA30B4F8DE2003F44061914203D0E369D0 ++:1012E00018693FF0D3D9012141F2BD23E1542046D2 ++:1012F000FFF798F92046A847002384F8E1302046FC ++:10130000FFF7A2FBE369204693F88110FFF730FB5B ++:10131000E26992F88030012BB4F8DA300BD103F493 ++:101320007043B3F5005F01D1936F0BE0D36F012BD6 ++:1013300088BF002306E003F47043B3F5005F0CBFE1 ++:10134000136F536FD366E3690022D96E2046FEF710 ++:10135000D9FE002384F8E230E369922118693FF056 ++:10136000C9D941F212234000E05270BDC36910B5E3 ++:1013700018693FF0C9D910BDC36910B518693FF0AD ++:10138000CDD910BDF7B5089F04460D461E463BB1AA ++:10139000032A05D9684619460422F0F3EDF501E069 ++:1013A00000230093A82D009900F0FB8015DC5C2D34 ++:1013B00000F0AE8008DC3C2D00F0A0804A2D00F04B ++:1013C00093801B2D2AD020E05E2D30D0C0F2A88063 ++:1013D0005F2D3DD0872D1BD017E0C32D75D006DCC7 ++:1013E000AA2D49D07BDBC22D00F0DB800DE0D42D8F ++:1013F00000F0AB8003DCD32D00F09B8005E0A5F569 ++:101400009A73033B012B40F2D2806FF01605CFE0B8 ++:101410002046FEF783FE40B23060C8E0E3691D7FDE ++:10142000002D40F0B8802046FEF784FBC0E0012389 ++:101430003B70E3695B7F002B00F0B0802046FFF734 ++:101440009BFF2046BDF80010FEF7E0FA30600FE089 ++:1014500001233B70E3695B7F002B00F09F802046F7 ++:10146000FFF78AFF009A204691B2120CFEF7DAFAD3 ++:101470002046FFF77BFF9AE0E269537F002B00F0E4 ++:101480008D8010693FF086D900252046FFF774FF54 ++:101490003560D4F8BC30082B13D10DF1060220467C ++:1014A0000DF107018DF807508DF8065000F0A8FEE9 ++:1014B0009DF907209DF9063092B29BB243EA0223C0 ++:1014C00033602046FFF752FF60E0E3691B7F002B8B ++:1014D0006AD03388022B64D96FF0010568E0E369B4 ++:1014E0001B7F002B60D05CE0E3691B7F002B52D197 ++:1014F000236B002B5BD02046984718E0E3691B7FE5 ++:10150000002B48D120467268B368FFF7C5FD0EE096 ++:10151000E3691B7F002B3ED12046FFF773FD06E0F9 ++:10152000E3691B7F002B36D12046FFF78DFD054672 ++:101530003EE0E369DA6E3260D4F8E83F13F0010F61 ++:1015400035D042F08003336031E0042902D96FF0D6 ++:101550001C052DE0E269D36E8B4228D0137FD16643 ++:101560002BB310693FF016D9009B23B12046002110 ++:101570000122FEF7C7FDE36901222046D96EFEF77E ++:10158000C1FD002814BF00256FF00205E36918694A ++:101590003FF0ECD80CE06FF0040509E06FF00A05AD ++:1015A00006E06FF00C0503E06FF0030500E0002596 ++:1015B0002846FEBD2DE9F04389B09946109B0026D0 ++:1015C000032B07460C46DDF84480139D079604D98B ++:1015D00007A849460422F0F3CFF4079940F2862386 ++:1015E0000A1E18BF01229C4200F013812CD80C3B2C ++:1015F0009C427CD00FD8532C08D8522C80F04081CC ++:10160000502C00F03D81512C6AD02DE140F26A232C ++:101610009C4250D028E1B4F5207F00F0E48009D846 ++:1016200040F27B239C4200F0A48003339C4200F0F4 ++:10163000D58019E1B4F5217F00F0E48040F28523E4 ++:101640009C4200F0DB800FE140F2D6239C4200F088 ++:10165000178114D8413B9C423ED006D8043B9C42A3 ++:1016600034D002339C4234D0FEE0B4F5277F00F042 ++:10167000D78040F29D239C4200F0D680F4E040F2F7 ++:10168000DD239C4200F0EB8008D8033B9C4200F035 ++:10169000D180B4F5377F00F0D680E5E0B4F53D7F2A ++:1016A00000F0F380C0F0E080A4F53E73063B012B10 ++:1016B00000F2DA80E9E03846FFF75EFE3846414640 ++:1016C000FFF70CF83846FFF751FE50E041F2523375 ++:1016D00004E041F2543301E041F25633F95246E05E ++:1016E0000123009338464346FEF728FDCFE0FA6910 ++:1016F000137F13B96FF00300C9E0D7F8B030D3F807 ++:10170000203183F0010313F0010902D110693FF089 ++:1017100041D83846FEF734FE3846FFF72DFE41F239 ++:10172000D61341F2D910F95C385C0133FA5C01330D ++:1017300017F803E0009041F2DA103D5C01303C5CA8 ++:101740001630385C7346039038460195029404962F ++:10175000FEF76AFEC8F800003846FFF707FEB9F149 ++:10176000000F40F08D80FB6918693EF0FFDF3046C6 ++:101770008DE0C1F3036CBCF1010F00F28380C1F373 ++:10178000015EBEF1010F7DD8C1F38155032D79D0E3 ++:10179000C1F30344012C75D8C1F30722A2F10A0357 ++:1017A000DBB2052B6ED8C8B2012801D9032869D154 ++:1017B0000E2A28BF0E2241F2D613FA540133F854F0 ++:1017C0000133FC54013307F803E00133FD540133C6 ++:1017D00007F803C00A0F1633FA54C8E708A9012313 ++:1017E00041F8043D07E0B7F8DA103846FEF734FB5D ++:1017F00008A941F8040D40462A462DE041F20B03AA ++:10180000F954B4E741F20B03FB5C08A941F8043D2D ++:1018100017E0D7F8F830C3F30013C8F80030A6E794 ++:1018200038464246334602E0384642460123FEF738 ++:101830006BFE9CE70121384601F038FF08A941F80A ++:10184000046D404607E007AC38463146224601F0B9 ++:1018500091FF404621460422F0F38EF387E7384695 ++:10186000324601F087FF82E7019102923846214615 ++:101870004A4643460095FEF717FF10F1170F04D0B4 ++:10188000002004E06FF01C0001E06FF0160009B0CA ++:10189000BDE8F0832DE9F04391460A6801230B73FC ++:1018A00042F008030B60B0F9FA3685B0B3F1FF3FA0 ++:1018B00004BF42F009030B6090F81A3605460C4647 ++:1018C0001BB10B6843F002030B602F4626464FF016 ++:1018D000000897F8B2322846B37749460DF10E0357 ++:1018E0000DF10F02CDF80080FEF708FB9DF80E30D9 ++:1018F00008F1010886F8B03197F87535013786F898 ++:1019000079320136B8F1140FE3D195F81A3633B3B2 ++:10191000EB691B7F1BB32846FFF72EFD95F81836A1 ++:101920002846A37595F81836E37595F81936A37609 ++:1019300095F81936E37600F059FC236810B143F0AE ++:10194000030301E023F003032846236004F10D01A3 ++:1019500004F1150200F054FC2846FFF707FD05B01E ++:10196000BDE8F08310B5054B1B78012B03D1013B7B ++:1019700018461B7001E014F095FA10BD38F501000F ++:1019800010B5054B1B78012B03D1013B18461B708A ++:1019900001E014F0ADFA10BD38F501002DE9F04179 ++:1019A00005460E4617461C46FFF7EAFF30B12346B0 ++:1019B000284631463A4614F0D5FA04462046BDE89A ++:1019C000F081C04610B50023FFF7E8FF10BDC04608 ++:1019D00010B51446FFF7D4FF20B100210A46F0F3FA ++:1019E000B7F60446204610BD10B50022FFF7F0FF01 ++:1019F00010BDC0461FB5079B0C890093089B11467C ++:101A00000193099B224602930A9B03930069069B5C ++:101A10002BF0CCDB04B010BD00B5B0FBF1FE01FB38 ++:101A20001E0001F0010C0CEB51010BE0884228BFB5 ++:101A3000C1EB00034FEA4E0E26BF0CEB43000EF144 ++:101A4000010E4000531EDAB2FF2AEFD1884228BFB0 ++:101A50000EF1010E704600BD00FB01F19202800103 ++:101A600003FB002001F5004101EB4000490090FB21 ++:101A7000F1F07047D0F8A8304FF001025A86704755 ++:101A80002DE9F04798469DF820308A4691469DF80A ++:101A90002470B3B100246FF000462546204651461D ++:101AA0004A464346FFF7D8FFB04204DA6B1CDDB26A ++:101AB000BD421AD006460134802CEFD16FF00040B1 ++:101AC00013E07F244FF0FF361D46204651464A461C ++:101AD0004346FFF7C1FFB04204DD6B1CDDB2BD42DF ++:101AE00003D00646013CF0D22046BDE8F087C04650 ++:101AF00010B5B0F8DA300446DAB203F47043B3F547 ++:101B0000005FD0F8A81003D1531893F8E72486E0BB ++:101B1000702A5ED01CD8382A49D00CD82C2A3DD047 ++:101B200004D8242A34D0282A35D02FE0302A38D0BF ++:101B3000342A39D02AE0642A42D004D83C2A39D049 ++:101B4000402A3AD022E0682A3DD06C2A3ED01DE0DF ++:101B5000882A50D00CD87C2A44D004D8742A3BD090 ++:101B6000782A3CD012E0802A3FD0842A40D00DE071 ++:101B7000992A49D004D88C2A40D0952A41D005E032 ++:101B8000A12A47D0A52A48D09D2A40D0002246E06D ++:101B900091F8F62443E091F8F72440E091F8F82416 ++:101BA0003DE091F8F9243AE091F8FA2437E091F811 ++:101BB000FB2434E091F8FC2431E091F8FD242EE080 ++:101BC00091F8FE242BE091F8FF2428E091F80025FD ++:101BD00025E091F8012522E091F802251FE091F817 ++:101BE00003251CE091F8042519E091F8052516E07D ++:101BF00091F8062513E091F8072510E091F80825E3 ++:101C00000DE091F809250AE091F80A2507E091F81E ++:101C10000B2504E091F80C2501E091F80D25D1F891 ++:101C2000E40494F82A36C01A801840B210BDC046A9 ++:101C30000846704749B24B1C5B104910C3F10803BA ++:101C4000083141EA031188B27047C046B0F8DA3073 ++:101C500003F47043B3F5005FD0F8A82005D192F8E3 ++:101C60003C05FF2801D0C0B200E000207047C0460C ++:101C700070B50546D0F8A840FFF7E8FF10B994F812 ++:101C8000460540B1B5F8DA3003F47043B3F5005FB0 ++:101C900014BF0020012070BD10B50C468EB0D0F8E6 ++:101CA000A8109646002000220DF10603C254013010 ++:101CB0003228F8D1BEF1FF3F91F8E93306D114B1D3 ++:101CC000B1F93EE503E0B1F940E514E09CB1A02B89 ++:101CD00009D000238DF806308DF807308DF80830D4 ++:101CE0008DF8093004E000238DF806308DF80830B7 ++:101CF0008DF80A3033E0A02B17D001238DF81A306D ++:101D00008DF81B306FF0010300228DF81E308DF826 ++:101D10001F3001338DF81C208DF81D208DF82020F8 ++:101D20008DF821308DF8242019E002238DF81A3027 ++:101D30006FF003038DF81E30023300228DF81F3040 ++:101D40008DF820308DF8213006338DF81B208DF86A ++:101D50001C208DF81D208DF824208DF832300EAA1D ++:101D600002EB0E0313F9320C0EB010BD30B5C4698E ++:101D7000D0F8F03F226AD0F8A8509A4202D3C3EBC1 ++:101D8000020101E0DB43991895F8BC2290F8DA30A3 ++:101D90009A4201D0012004E0A36E994234BF002092 ++:101DA000012030BD7047C046D0F8A83093F8060433 ++:101DB000002808BF1020704700B5D0F8A8008E4654 ++:101DC000D0F8D4240EF0FF0343EA0223110EC0F82A ++:101DD000D434D0F8D8347F29C8BFA1F580717344BA ++:101DE0005B1AC0F8D8349B10C0F8DC3400BDC04684 ++:101DF000844610221B4810B5964600244EF3460335 ++:101E00005FFA83FE10EA0C0F4FFA8EF104D088407F ++:101E10000EEB0203DAB203E0C840CEEB0203DAB203 ++:101E20000134042CEAD110EA0C0FD3B201D1013BEA ++:101E3000DAB251B2032301FB03F30329DAB20EDD58 ++:101E4000CB1E2CFA03F00D2801D9D31C06E00A287A ++:101E500001D9931C02E0082801D9531CDAB250B210 ++:101E600010BDC0460000FFFFD0F8A820002382F874 ++:101E7000903382F8913382F8923382F8933382F868 ++:101E8000943370477047C04670B540F22341D0F894 ++:101E9000A8500446FDF7BAFDC0B2A5F864034FF49C ++:101EA000AA612046FDF7B2FD8005800DA5F8680304 ++:101EB00040F234412046FDF7A9FDC0B27F28C8BFDB ++:101EC000A0F58073A5F8660340F23241C8BFA5F8BB ++:101ED00066332046FDF79AFDC0B27F28C4BFA0F547 ++:101EE000807398B285F8BC0370BDC0462DE9F047F9 ++:101EF000884640F2B76104469146FDF787FD40F2FF ++:101F0000B66105462046FDF781FD40F2B561064603 ++:101F10002046FDF77BFD40F2B46107462046FDF701 ++:101F200075FD4FF0000C6246644650FA04F313F05E ++:101F3000010101D0012103E00CF101035FFA83FCF0 ++:101F4000531CDAB2102A12D001340029EDD00EE071 ++:101F5000A2F1100357FA03F313F0010F01D001218E ++:101F600003E00CF101035FFA83FC531CDAB21F2A71 ++:101F700011D80029ECD00EE0A2F1200356FA03F3A9 ++:101F800013F0010F01D0012103E00CF101035FFA0E ++:101F900083FC531CDAB22F2A11D80029ECD00EE0B2 ++:101FA000A2F1300355FA03F313F0010F01D0012120 ++:101FB00003E00CF101035FFA83FC531CDAB23F2A01 ++:101FC00001D80029ECD04FF03F0E00220F2455FA23 ++:101FD00004F313F0010101D0012103E00EF1FF33FE ++:101FE0005FFA83FE531CDAB2102A12D0013C00299A ++:101FF000EDD00EE0C2F11F0356FA03F313F0010F08 ++:1020000001D0012103E00EF1FF335FFA83FE531C80 ++:10201000DAB21F2A11D80029ECD00EE0C2F12F034A ++:1020200057FA03F313F0010F01D0012103E00EF181 ++:10203000FF335FFA83FE531CDAB22F2A11D800292E ++:10204000ECD00EE0C2F13F0350FA03F313F0010F9E ++:1020500001D0012103E00EF1FF335FFA83FE531C30 ++:10206000DAB23F2A01D80029ECD088F800E089F8DC ++:1020700000C0BDE8F087C04670B50D4640F239415A ++:102080000646FDF7C3FCC0F3C210E88040F2B5413C ++:102090003046FDF7BBFC40F2FB4104463046FDF7FD ++:1020A000B5FC04F0FF03C0B2C4F307242B806C809E ++:1020B000A88070BD2DE9F047B0F8DA30074603F488 ++:1020C0007043B3F5805FD0F8A82009D1B2F892052B ++:1020D00003B2B3F1FF3F0CBF4FF4C87080B24CE0C5 ++:1020E000B2F8904523B2B3F1FF3F01D0A0B244E073 ++:1020F00040F2A541FDF78AFC40F2A54181463846F1 ++:10210000FDF784FC40F20D4106463846FDF77EFCA3 ++:1021100040F20D4104463846FDF778FC40F2A241FA ++:1021200005463846FDF772FC40F2A241804638462B ++:10213000FDF76CFCC6F30236012313FA06F6C0F372 ++:102140000220C5F3022513FA05F58340E4B25FFAD5 ++:1021500089F94C44B6B2A419ADB29BB25FFA88F8C3 ++:102160006419434404EB430464005034A4B2B4F54E ++:10217000C86F2CBF20464FF4C860BDE8F087C0464A ++:1021800010B540F2FB41FDF741FCC0F3062010BD45 ++:1021900070B540F2A4410446D0F8A850FDF736FCD3 ++:1021A000C0F38130032814D141F21403E35C83B1FE ++:1021B000204640F27341FDF729FC95F96635C005CC ++:1021C000C00D013303FB00F3022293FBF2F3D8B2FC ++:1021D00001E095F8C10240B270BDC04610B540F2B2 ++:1021E000A441FDF713FC00F4404010BD10B5FFF70B ++:1021F000F5FFB0F5404F14BF0020012010BDC046D0 ++:1022000070B5002313700B7041F21403C35C0446D5 ++:102210000D4616461BB340F2AB41FDF7F7FB10F439 ++:10222000004F03D0204640F2AB410AE0204640F286 ++:102230003C61FDF7EBFB10F4004F07D0204640F265 ++:102240003C61FDF7E3FBC0F3470028702046FFF731 ++:10225000CDFF08B194F810052B781B18337070BDB2 ++:102260002DE9F04140F2FF340E46054690463346D4 ++:10227000224640F24561FDF7FBFB284622464346D5 ++:1022800040F24661FDF7F4FB28462246334640F211 ++:102290004761FDF7EDFB2846224643464FF4C961EE ++:1022A000FDF7E6FB28462246334640F24961FDF73A ++:1022B000DFFB284640F24A6122464346FDF7D8FB41 ++:1022C000BDE8F08170B5002914BF4FF4807300237E ++:1022D00004460D1E18BF01254FF480724FF496611D ++:1022E000FDF7C6FB0122204640F24C412B46FDF78C ++:1022F000BFFB2B0320464FF496614FF4805203F44A ++:102300007043FDF7B5FB6B0320464FF496614FF425 ++:10231000005203F46043FDF7ABFB6B0120229BB23C ++:1023200020464FF49661FDF7A3FB6B0203F47E4356 ++:10233000204640F2AE414FF40072FDF799FBB4F82D ++:10234000DA3003F47043B3F5005F11D1AB022046DD ++:102350004FF496614FF4806203F47C43FDF788FBF1 ++:10236000EB009BB2204640F2E5410822FDF780FBDE ++:1023700070BDC04670B50C02A4B20546234640F2BB ++:10238000FB414FF4FE42FDF773FB284640F2FD414E ++:102390004FF4FE422346FDF76BFB70BD70B500297C ++:1023A00014BF802300230C1E18BF012480224FF489 ++:1023B00096610546FDF75CFBA303A40128464FF494 ++:1023C00096614FF4804203F44043A4B2FDF750FB02 ++:1023D000284640F23B4140222346FDF749FB70BDB1 ++:1023E00070B540F239440D4621460646FDF70EFB16 ++:1023F00040F67F4300EA030343EAC5133046214613 ++:1024000040F6FF729BB2FDF733FB70BD2DE97043C0 ++:102410000C460646FFF7B4FE628823884FF6FF7924 ++:1024200043EA022305464A46304640F2B5419BB294 ++:10243000FDF71EFB2D02A388ADB247F6FF783046AC ++:10244000424645EA030340F2FB41FDF711FB628877 ++:102450002388304643EA022340F2FC414A469BB2BD ++:10246000FDF706FBA3883046424645EA030340F2E7 ++:10247000FD41FDF7FDFA3046E188FFF7B1FF304638 ++:102480000121FFF78BFFBDE87083C04610B50249FC ++:102490000C22FDF701FB10BDCADA01002DE9F0475F ++:1024A0009846BDF82CA0BDF824308946BDF8201010 ++:1024B0000AF00304164603F00F03BDF8282044EA8F ++:1024C000032301F00F0102F0030243EA013343EA60 ++:1024D000821343EA021343EA840340F2B6414FF603 ++:1024E000FF720746BDF83050FDF7C2FA0F2208EA26 ++:1024F0000203384640F2B741FDF7BAFA4FEACA2361 ++:102500009CB22346384640F2B1414FF460522D034D ++:10251000FDF7AEFAADB2062238462049FDF7BCFA07 ++:102520007602384640F2AE414FF470422B46FDF73A ++:102530009FFA384640F2B1414FF4007206F47E43F0 ++:10254000FDF796FAD9F1010338BF0023012238467E ++:1025500040F24D41FDF78CFAB7F8DA3003F47043DE ++:10256000B3F5005F10D1384640F2B1414FF4C0528C ++:102570002346FDF77DFA4FEACA039BB2384640F284 ++:10258000E6411822FDF774FA384640F2AE414FF4A6 ++:1025900070422B46FDF76CFABDE8F0878ED501003E ++:1025A00010B5044686B021B90D490E22FDF774FA24 ++:1025B00014E00C490922FDF76FFA002103220623DB ++:1025C000009302920423039220460A460491019349 ++:1025D000FFF764FF20460121FFF774FE06B010BD2F ++:1025E000D6D40100F2D4010010B5D0F8A830D3F849 ++:1025F000741529B1C3694FF420729868F4F378F325 ++:1026000010BDC0462DE9F041D0F8A8300646D3F8F9 ++:102610007C55D3F8787500240DE0142302FB03F3F6 ++:10262000EA1811695268F06902FB01F28068E95802 ++:10263000D208F4F35DF3E2B20134BA42EDD3BDE85F ++:10264000F081C04670B5D0F8A8500446D5F87C3566 ++:102650006BB10121FFF7D6FFE369D5F87845142265 ++:102660009868D5F87C1504FB02F2F4F341F370BDD1 ++:1026700000F59753196810B5044629B1C36942F6AD ++:1026800008529868F4F334F32046FFF7ADFF204674 ++:10269000FFF7D8FFE369D4F8A81098684FF4B9623F ++:1026A000F4F326F310BDC04610B54FF48052044633 ++:1026B000002340F2C961FDF7DBF9D4F8A820B2F895 ++:1026C000C234EBB192F8E933A02B04D1204640F29A ++:1026D0008961232203E0204640F289613022FDF720 ++:1026E000A1F9D4F8A830B3F8C234022B0ED14FF4BC ++:1026F0008052204640F2C9611346FDF7B9F905E062 ++:10270000204640F289612322FDF78CF904222046FD ++:102710002749FDF7C1F90022204640F27961FDF713 ++:1027200081F9082220462349FDF7B6F9D4F8A830EC ++:102730002046B3F8C2244FF4D961FDF773F906229D ++:1027400020461D49FDF7A8F9D4F8A8304FF480724F ++:10275000B3F8C23420461A41013A4FF4D06192B224 ++:10276000FDF760F9D4F8A8304FF4A072B3F8C23482 ++:1027700020461A41013A92B240F28161FDF752F9C6 ++:10278000D4F8A830B3F8C224012A04D0022A14BF16 ++:102790003422082200E01822204640F27F61FDF733 ++:1027A00041F9204605490E22FDF776F910BDC046D5 ++:1027B00024D80100EEDA01002CD80100FEDA010075 ++:1027C0002DE9F04740F23C4631460446FDF71EF93C ++:1027D00040F23B48824641462046FDF717F94AF051 ++:1027E000010281463146204692B2FDF71BF949F0BD ++:1027F0000102204641464FF6FE7592B2FDF712F9EE ++:10280000204631460AEA0502FDF70CF9204641460A ++:1028100009EA0502FDF706F9204631465246FDF762 ++:1028200001F9204641464A46FDF7FCF8BDE8F0872D ++:10283000802270B513460C4640F2D1610546FDF783 ++:1028400017F90CB1012C05D128464FF4DA610F229B ++:10285000FDF7E8F82846FFF7B3FF70BD2DE9704398 ++:102860000E46B0F8DA10054601F47041B1F5005F8C ++:1028700014BFA521892199469046FDF73DF8B5F88A ++:10288000DA10044601F47041B1F5005F14BFA521D0 ++:1028900089212846FDF730F804F00F04C0F3031037 ++:1028A000241A3470B5F8DA10284601F47041B1F5F5 ++:1028B000005F14BFA6218A21FDF71EF8B5F8DA10D3 ++:1028C000044601F47041B1F5005F14BFA6218A21CE ++:1028D0002846FDF711F804F00F04C0F30310241A82 ++:1028E00088F80040B5F8DA10284601F47041B1F5D7 ++:1028F000005F14BFA7218B21FCF7FEFFB5F8DA10AB ++:10290000044601F47041B1F5005F14BFA7218B218B ++:102910002846FCF7F1FF04F00F04C0F30310241A5B ++:1029200089F80040B5F8DA10284601F47041B1F595 ++:10293000005F14BFA8218C21FCF7DEFFB5F8DA1088 ++:10294000044601F470412846B1F5005F14BFA82188 ++:102950008C21FCF7D1FF04F00F04C0F30310069B99 ++:10296000241A1C70BDE87083B0F8DA1010B501F4B9 ++:1029700070410446B1F5005F14BFA521892188226A ++:10298000FCF7D2FFB4F8DA10204601F47041B1F53B ++:10299000005F14BFA6218A218822FCF7C5FFB4F886 ++:1029A000DA10204601F47041B1F5005F14BFA72191 ++:1029B0008B218822FCF7B8FFB4F8DA10204601F426 ++:1029C0007041B1F5005F14BFA8218C218822FCF76B ++:1029D000ABFF10BD10B5D0F8A830044693F8E9332A ++:1029E000A02B03D110490422FDF756F820460022FF ++:1029F0004FF48E71FCF798FF204618220B49FDF723 ++:102A00004BF841F2DE23E35A2046FF2240F23461C4 ++:102A1000002B08BF0C23FDF72BF8204604490922A0 ++:102A2000FDF73AF810BDC046C0DD0100C8DD010069 ++:102A300026D5010070B504220D4607490646FDF76C ++:102A40002BF80024054B625BE15A30460234FCF758 ++:102A50006BFF302CF6D170BDFAD701005ED40100B7 ++:102A60002DE97043054698461646B0F8DA40FFF760 ++:102A7000E1F804F47044B4F5005F14BFA524892480 ++:102A80000246214628469DF81890FCF74DFF314636 ++:102A90002846FFF7CFF8B5F8DA40024604F4704450 ++:102AA000B4F5005F14BFA6248A2428462146FCF70B ++:102AB0003BFF41462846FFF7BDF8B5F8DA4002462D ++:102AC00004F47044B4F5005F14BFA7248B24284697 ++:102AD0002146FCF729FF49462846FFF7ABF8B5F831 ++:102AE000DA40024604F47044B4F5005F14BFA82431 ++:102AF0008C2428462146FCF717FFBDE87083C046AA ++:102B000070B505460E460024074BA25BE15A2846E5 ++:102B10000234FCF709FF182CF6D128460349224657 ++:102B2000FCF7BAFF70BDC046DCD901008ED80100A9 ++:102B300070B506220E4644490446FCF7ADFF002559 ++:102B4000424B2046E95AFCF7D7FEA8530235182D10 ++:102B5000F6D1072101222046FCF7E6FE1022FF21D4 ++:102B600013462046FCF726FF04221346204640F277 ++:102B70001F11FCF71FFF0C2220463549FCF78CFF84 ++:102B800001223A2113462046FCF714FF04223A2181 ++:102B900013462046FCF70EFF0822134620464FF44A ++:102BA0008D71FCF707FF0822052113462046FCF72C ++:102BB00001FF0122134620464FF48D71FCF7FAFE07 ++:102BC000122220462349FCF767FF20228221134668 ++:102BD0002046FCF7EFFEB4F8DA3003F47043B3F5A7 ++:102BE000005F02D000252E4608E0D4F8A8309A7A7B ++:102BF000D97A42F400721D7B42EA01160122204676 ++:102C000013464FF49B61FCF733FF2046B3004FF4AB ++:102C10009B6140F6FC72FCF72BFF02222046134614 ++:102C20004FF49B61FCF724FF2B0320464FF49B617C ++:102C30004FF4E04203F47043FCF71AFF20460649C4 ++:102C40000622FCF729FF70BDBEDC0100DCD90100C3 ++:102C5000B2DA01003ED6010062D601002DE9F74F3D ++:102C6000D0F8A830814693F80B809C7A1A7E1F7B9F ++:102C70004FEA081844F4007493F817B09E7D44EAB4 ++:102C80000804009293F814A0DD7C44EA07345B7DCD ++:102C900047F2FF38A4B2092223490193FCF7FCFE56 ++:102CA00048464246234640F2DB41FCF7E1FE4846F7 ++:102CB0004246234640F2DC41FCF7DAFE48464246F3 ++:102CC000234640F20A41FCF7D3FE4FEA0A1A019B61 ++:102CD00045F4007545EA0A0545EA0335484642468B ++:102CE000ABB240F20B41FCF7C3FE4FEA0B1B009A5C ++:102CF00046F4007646EA0B0646EA02364846424665 ++:102D0000B3B240F20C41FCF7B3FE202248468221C8 ++:102D10001346FCF74FFE012248467C211346FCF780 ++:102D200049FEBDE8FE8FC046E8D70100012970B515 ++:102D300005460C4616D106222949FCF7ADFE284669 ++:102D40003A2122462346FCF735FE08222846134640 ++:102D50004FF48D71FCF72EFE28467F210022FCF7F0 ++:102D6000E3FD33E079B91F490622FCF795FE2846BA ++:102D70003A2101222346FCF71DFE082228464FF483 ++:102D80008D71134620E0022920D1B0F8DA3003F427 ++:102D90007043B3F5005F02D17D21032201E07D2164 ++:102DA0002246FCF7C1FD284628210F220123FCF70B ++:102DB00001FE8022134628464FF48971FCF7FAFD84 ++:102DC0002846052107220223FCF7F4FD284640F29D ++:102DD00037614FF440420023FCF74AFE70BDC04605 ++:102DE000FAD3010006D401002DE9F047C369D0F8F9 ++:102DF000A8501B6D0C4613F4805F40F2234114BFB2 ++:102E00004FF006094FF00909064695F844A3FCF770 ++:102E1000FDFD40F2344107463046FCF7F7FD204601 ++:102E2000FEF7E6FF95F84433C1B2B5F8642395F890 ++:102E300048030BB9012092E007F0FF07C0EB010344 ++:102E4000C2EB07029B1A5FFA83F84FFA88F4002C52 ++:102E50001DDAF36930461B6D03F48053002B0CBF61 ++:102E60000B21042114BF0322082263429A42A8BF07 ++:102E70001A46B5F8683301FB02324FF4AA6192B2E8 ++:102E8000FCF7D0FD14F1030F06DAFB1C05E0032C60 ++:102E900002DDFB1E9BB200E0BBB2B5F8640319B2C1 ++:102EA00002B2D31C994201DDC31C03E09142ACBFC6 ++:102EB0000B4613469CB2BAF1000F13D023B2BB42AB ++:102EC00010D02346304640F22341FF22FCF7D0FDCC ++:102ED000304624490422FCF7DFFD1420F3F33CF4D0 ++:102EE000002700E00127B5F866434FFA88F220B2C8 ++:102EF000C9EB000352429A42B8BFC9EB040391B236 ++:102F0000B8BF99B20AB200F109039A42C4BF04F1F2 ++:102F1000090399B2B6F8DA3003F47043B3F5005FF1 ++:102F20000CBF95F94B3395F94C335B189BB2BAF152 ++:102F3000000F05D0304640F23441FF22FCF798FDE7 ++:102F4000304640F22341FCF761FD95F8BC33C0B236 ++:102F500085F8BD0385F8BE0385F8BF333846BDE864 ++:102F6000F087C046ACD7010070B5D0F8A850044631 ++:102F7000FF22B5F8663340F23441FCF779FDB5F82D ++:102F800064332046FF2240F22341FCF771FD2046C6 ++:102F9000B5F868234FF4AA61FCF744FD20460449C4 ++:102FA0000422FCF779FD1420F3F3D6F370BDC0467C ++:102FB0004EDD0100082270B5134605465721FCF787 ++:102FC000F9FC56212846FCF797FC00F0F80456213E ++:102FD00022462846FCF7A8FC0120F3F3BDF3562156 ++:102FE00044F003022846FCF79FFC0120F3F3B4F3FE ++:102FF000562144F007022846FCF796FC4FF49670E1 ++:10300000F3F3AAF32846572108220023FCF7D2FC49 ++:1030100070BDC0462DE9F04140F24A463146804637 ++:10302000FCF7F4FC40F04404A4B24FF6BF754046F0 ++:103030003146224604EA0505FCF7F4FC31462A46EF ++:103040004046FCF7EFFC25F004050420F3F384F37D ++:10305000404631462A46FCF7E5FCBDE8F081C04613 ++:103060002DE9F04706460C461546384906221F460C ++:10307000DDF82090BDF82480FCF70EFD304640F2CC ++:1030800082414FF6FF722346FCF7F2FC304640F2D5 ++:103090008141FF222B46FCF7EBFC3FB9304640F262 ++:1030A00081414FF480723B46FCF7E2FC30462849F0 ++:1030B0000322FCF7F1FC0A2308FB03F5002407E0D8 ++:1030C000AC4201DD002439E06420F3F345F3013420 ++:1030D000304640F28141FCF799FC10F4007FEFD1BB ++:1030E00040F283413046FCF791FC40F284410446B3 ++:1030F0003046FCF78BFC40EA0440C9F8000040F27F ++:1031000085413046FCF782FC40F286410446304659 ++:10311000FCF77CFC40EA0440C9F8040040F2874117 ++:103120003046FCF773FC4FF4916104463046FCF7DF ++:103130006DFC40EA0440C9F8080001243046054906 ++:103140000622FCF7A9FC2046BDE8F087ECDB010075 ++:10315000F8DB0100FEDB010070B50546002407E046 ++:103160006420F3F3F9F2013441F289339C4207D031 ++:10317000284640F25141FCF749FC10F4404FEFD192 ++:10318000284640F25141FCF741FC10F4404F14BF77 ++:103190000020012070BDC04610B540F24C414FF6F2 ++:1031A000FC72FCF747FC10BDC36970B504460D46C0 ++:1031B00018698E2116463DF09DDAE36941194900F0 ++:1031C000186932463DF0B4DA70BDC046C36970B5C7 ++:1031D00004460D4618698E213DF08CDAE3694119E9 ++:1031E000490018693DF086DA70BDC0462DE9F0410E ++:1031F0000C46272180461646FFF7E8FF10F0010332 ++:1032000002D101271D4605E04FF6F07500EA0505DD ++:103210004FF6F07728214046FFF7D8FF3840A84204 ++:1032200001D1012009E0013C631C002B02DD1420C8 ++:10323000F3F392F2002CEDDC002006B13460BDE81F ++:10324000F081C0462DE9F0410646D0F8A850FEF7BF ++:10325000C5FFB0F5404F46D1F369E02118693DF054 ++:1032600049DAEC8D8046C4EB000440F2A5413046BB ++:10327000FCF7CCFB0123C0F30227BB40A4B29C4265 ++:1032800031DD95F8C134A5F82E80BB4208D901374D ++:10329000304640F2A5414FF4E0623B02FCF7E8FB08 ++:1032A0003046FEF775FF40B280B22886B6F8DA30B5 ++:1032B0006F8603F47043B3F5005F0CBF85F85404C8 ++:1032C00085F85504D6F8A8202B8E92F966255B0068 ++:1032D000013293FBF2F3304640F2A44140F2FF1278 ++:1032E0009BB2FCF7C5FBBDE8F081C0462DE9F04F6D ++:1032F000044685B00D46D0F8A860FFF7A3FFD4F8C8 ++:10330000B030D3F8203183F0010313F001030393AD ++:1033100003D1E36918693DF03DDA07212046FCF747 ++:10332000EBFAFF2101902046FCF7E6FA40F21F116C ++:1033300002902046FCF7E0FA40F23B4183462046EB ++:10334000FCF764FB40F23C4182462046FCF75EFB02 ++:1033500040F2D74181462046FCF758FB4FF49B6171 ++:1033600080462046FCF752FB0F224649074620467E ++:10337000FCF792FB0122072113462046FCF71AFBBB ++:103380001022FF2113462046FCF714FB04221346AB ++:1033900040F21F112046FCF70DFB0A20F3F3DCF18D ++:1033A000202220464FF49A611346FCF761FB0A2065 ++:1033B000F3F3D2F1012D21D140F276412046FCF702 ++:1033C00025FB40F27741C5052046FCF71FFBC005F1 ++:1033D000C00DED0DFF288ABFA0F5007302469AB21A ++:1033E000FF2D88BFA5F50073A6F86E058CBF98B2B7 ++:1033F0002846C0EB0203A6F86C550AE0204640F2CE ++:103400007541FCF703FBC005C00DFF2803D9A0F5EB ++:1034100000739DB200E00546019B2046DAB2072109 ++:10342000FCF782FA029B2046DAB2FF21FCF77CFA15 ++:10343000204640F21F115FFA8BF2FCF775FA204626 ++:1034400040F23B415246FCF7EDFA204640F23C4147 ++:103450004A46FCF7E7FA204640F2D7414246FCF7DD ++:10346000E1FA20464FF49B613A46FCF7DBFA039BF6 ++:103470001BB9E36918693DF079D928B205B0BDE8F8 ++:10348000F08FC04640D4010070B5D0F8A8300129B3 ++:10349000D3F8DC63D3F8D853D3F8E04304D1013137 ++:1034A000FFF724FF02B20AE040F27541FCF7AEFAE2 ++:1034B000C005C00DFF288CBFA0F500720246631F37 ++:1034C00001209840801905FB1200231F184140B2CB ++:1034D00070BDC04610B50129D0F8A83003D1FFF760 ++:1034E00005FF00B212E0B3F86C25B3F86E35FF2B80 ++:1034F00086BFA3F5007399B21946FF2A86BFA2F5CD ++:1035000000739BB21346C3EB010318B210BDC04653 ++:1035100070B5D0F8A830D3F8D443D3F8D053D3F84B ++:10352000CC63FFF7D7FF621E0123934000B25B1903 ++:1035300006FB1030204140B270BDC0462DE9F0417D ++:10354000B0F8DA20074602F47043B3F5005FD0F814 ++:10355000A85004D1B5F85463B5F8844513E0D3B24C ++:10356000942B03D9B5F88645022308E0632B03D9D1 ++:10357000B5F88845012302E0B5F88A45002305EB3C ++:103580004303B3F85663FF2E1ED001213846FFF7E0 ++:10359000BFFF40B2193804FB00F000B20028CCBFD6 ++:1035A00000F5FA73A0F5FA734FF47A7293FBF2F315 ++:1035B00098B28419A4B2384640F23441FF2223461F ++:1035C000FCF756FAA5F86643BDE8F08170B50546EC ++:1035D000D0F8A8600C4689B340F2DA6142F20802E2 ++:1035E000FCF736FA284640F2A6510522FCF71AFAF3 ++:1035F000284640F2A251C322FCF714FA284640F2B2 ++:10360000A5510722FCF70EFA284640F283514FF4E9 ++:103610004872FCF707FA284640F284510022FCF772 ++:1036200001FA284640F285514FF40072FCF7FAF98E ++:10363000284640F286510022FCF7F4F9284627215B ++:10364000FFF7C4FD1CB140F001039CB203E04FF64C ++:10365000FE7400EA040496F894332846F31893F8AD ++:103660009523052302FB03F22621042A98BF1A465C ++:10367000FFF79AFD04F110022846272192B2FFF7C6 ++:1036800093FD70BD70B5D0F8A850044695F842334C ++:103690005BB10021FFF79AFF204619210022FFF7B6 ++:1036A000A5FD10B9012385F8453370BD70B5D0F87C ++:1036B000A840054694F8423393B990F8E93013F0E6 ++:1036C000010F1CBF23F0010380F8E93090F8E930C6 ++:1036D00013F0020F2DD023F0020380F8E93028E028 ++:1036E00094F847330BB1012303E0D1F1010338BF54 ++:1036F000002384F84733E1B100230126C4F86C337A ++:1037000084F8453384F846632846FFF7BBFF94F8F6 ++:103710004333003B18BF012384F8443313B12846D8 ++:10372000FFF722FC2846FEF79FFB28463146FFF7AD ++:103730004DFF70BD70B5D0F8A83000260C4683F858 ++:10374000466331460546FFF741FF14B12846FFF7AF ++:103750000BFC03222846134640F67A01FCF788F951 ++:10376000284640F2DA6142F208023346FCF780F95B ++:1037700070BDC04670B50546D0F8A84016467AB16F ++:1037800094F8433394F842438C2144EA4304C369D8 ++:10379000146018693CF0AEDF44EA004434600FE086 ++:1037A000CB080DD101F0010384F84233C1F340038B ++:1037B00084F8433394F8423313B90121FFF7BAFF79 ++:1037C00070BDC04610B500210446FFF7B3FF204688 ++:1037D000FEF74AFB10BDC04610B50122044640F674 ++:1037E0000501FCF735F920460722052340F22F4159 ++:1037F000FCF73EF920463021F8234FF4FF62FCF736 ++:1038000037F90623204630210722FCF731F92046FC ++:1038100040F2144141F61062FCF704F9204640F2F0 ++:1038200015414FF4C862FCF7FDF8204640F2DF4135 ++:103830004FF47F424FF47743FCF71AF92046FFF725 ++:10384000E9FB204602492722FCF726F910BDC046B5 ++:1038500024D90100002914BF0223002310B5002A37 ++:1038600018BF43F001030446032240F24D41FCF728 ++:10387000FFF8204640F24C410322FCF7E9F810BD66 ++:1038800010B5044611B91049132219E012220F494C ++:10389000FCF702F9012100222046FFF7DBFF20465A ++:1038A0000B490622FCF7F8F8B4F8DA3003F4704359 ++:1038B000B3F5005F07BF20460649204606491E2291 ++:1038C000FCF7EAF810BDC04638D501005ED501000E ++:1038D00082D50100CADC0100D8D601002DE9F041F3 ++:1038E00004460D46164640F2DA6148F280021F4651 ++:1038F0009DF81880FCF7ACF82046FEF7B9F9B8B18E ++:1039000040F652112046FCF781F8FF22C3B240F680 ++:1039100048112046FCF7ACF840F653112046FCF75E ++:1039200075F840F64911C3B2FF222046FCF7A0F813 ++:10393000D4F8A83093F8463573B140F2EB412046F5 ++:10394000FCF764F8C0F3402340F2EB4120464FF40B ++:1039500080629B02FCF78CF86B1EFF22204640F22F ++:1039600042619BB24FF6FF75FCF782F8AE4201D080 ++:10397000731E9EB220464FF4C8612A463346FCF7B8 ++:1039800077F8204640F241612A463B46FCF770F842 ++:10399000B8F1000F05D0204608490422FCF77CF856 ++:1039A00009E0204640F23F610122FCF73BF8204647 ++:1039B0000121FFF765FFBDE8F081C046A4D70100F3 ++:1039C0002DE9F0410C4640F23B410546FCF71EF85C ++:1039D00040F23C4107462846FCF718F8064674B109 ++:1039E0000E2228460F49FCF757F828460121FFF719 ++:1039F00047FF28460C490722FCF74EF810E02846FE ++:103A00000A490422FCF748F8284640F23B413A466E ++:103A1000FCF708F8284640F23C413246FCF702F831 ++:103A2000BDE8F081C4D7010080D80100B0D5010005 ++:103A30002DE9F04F0546C5B001910092FDF79CFCC1 ++:103A4000EB694FF0805118690A463CF033DE0520DF ++:103A5000F2F382F6002328464FF489614FF4804246 ++:103A6000FCF706F8284640F255414FF4A842FBF710 ++:103A7000D9FF284640F25641FBF7C8FF00F00F007F ++:103A8000052809D14FF4A842284640F25541FBF7DA ++:103A9000C9FF4FF4807207E045F20142284640F228 ++:103AA0005541FBF7BFFFFE22803A521022EAE27234 ++:103AB000102AA8BF10225100002301F18006C2EB9A ++:103AC000060B1F46994698469A464393429340E018 ++:103AD00040F256412846FBF799FF40F25741C0F3A8 ++:103AE0000B142846FBF792FF5E4544EA003021DCC8 ++:103AF000BAF17F0F1EDC8104890CB1F5005FC8BFED ++:103B0000A1F5804101F50063B3F5805F23D802ABD6 ++:103B100023F8191044AB03EB880252F8083C0AF171 ++:103B2000010ACB1842F8083C08EB090383F040096E ++:103B300088F00108C0F3033303F00C0343EA0713D2 ++:103B400016F0010F9FB203D007F0FF03402B02D104 ++:103B5000013E002EBCDCEB69002218694FF0805159 ++:103B60003CF0A8DD2846FDF701FC429B9B114293E7 ++:103B7000439B9B11BAF1800F43931DD0002022E09C ++:103B800041EA801202AB33F9123001315B1B40294C ++:103B900003FB0344F4D1013002280FD1009AA3099A ++:103BA0001460019A1360A3F53A63084A183B9342E4 ++:103BB0008CBF0020012006E00020044642AB53F8F1 ++:103BC00020500021DCE745B0BDE8F08F48F4FF0F3E ++:103BD00070B504460D46FDF7CFFB20226B01204651 ++:103BE0004FF49661FBF744FF0023204640F2B141B9 ++:103BF0004FF40072FBF73CFFB4F8DA3003F4704383 ++:103C0000B3F5005F02D04FF0000E04E0D5F1010ED5 ++:103C100038BF4FF0000E002D0CBF2023002343EAD5 ++:103C20008E13204660224FF48261FBF721FF20466D ++:103C30004FF482618022EB01FBF71AFF2046FDF76B ++:103C400095FB70BD2DE9F047044688461746D0F82D ++:103C5000A890FCF795FB20460121FFF7B9FF00254E ++:103C60002E460CE0012100222046FDF78DFA384651 ++:103C7000F2F372F52046FEF78BFA40B285B2F3B24A ++:103C800001364345EED320460021FFF7A1FF89F816 ++:103C9000C052BDE8F087C04670B505460846FEF73D ++:103CA000A7F8EB69A02144B218693CF023DD9D3CE4 ++:103CB000A4B26FF0610324B29C42B8BF1C46C1B2EB ++:103CC00062B22846FCF778FD70BDC04673B5D0F8E7 ++:103CD000A840064694F84233002B00F0DC8094F8AC ++:103CE0004633002B00F0D780D0F8B030D3F8203125 ++:103CF00013F0010F00F0CF8000230093019394F89C ++:103D00004553002D40F0AA8029462A46FFF76EFA57 ++:103D1000002800F0A380304601A96A46FFF788FE1C ++:103D2000002800F09B80009BC4F86C3394F8463365 ++:103D3000012B40F0938094F891030199AC46AE4674 ++:103D40001FE045B204EB8502D2F87033994201D3EB ++:103D5000002203E0C2F870131946012204EB850328 ++:103D6000D3F870339C440EF101035FFA83FE431CC9 ++:103D7000D8B243B2072BC8BF002012B101910199FC ++:103D800019E094F990334FFA8EF29A42D9DBF5E7B5 ++:103D900043B204EB8303D3F87023C3F87013431CBE ++:103DA000D8B243B2072BC8BF00200EF101038C44E8 ++:103DB0005FFA83FE11464FFA8EF3072BE8DD01917F ++:103DC00094F8902353B2072B05DC002384F8923338 ++:103DD000531C84F8903394F99033082B3ED194F817 ++:103DE0009433E31893F8972393F8995394F8923304 ++:103DF000FC2B02D8013384F8923394F89233934227 ++:103E00002CD194F89133013384F891335BB2072BB2 ++:103E100002DD002384F8913394F890333046023B5E ++:103E200084F890336146FEF7DFFF18B93046FEF79D ++:103E30001BF810E094F89333FC2B02D8013384F87C ++:103E4000933394F89333AB4205D194F8943313B978 ++:103E5000013384F89433002384F8923394F84613A2 ++:103E60000023012984F8453303D13046FFF7AEFB28 ++:103E700003E030461946FFF75DFC3046D4F86C137A ++:103E8000FFF70AFF002384F8473394F89C3313B9F3 ++:103E9000013384F89C337CBD2DE9F04F0746D0F800 ++:103EA000A800E1B00B9041F21403FB5C0C46002B20 ++:103EB00000F09C82FB696A2118693CF01BDC400021 ++:103EC0001FFA80FBBBF1000F00F090823846FEF72E ++:103ED00085F9FB69024610B91869594684E21869E8 ++:103EE00059463CF007DC012800F080820BF1060304 ++:103EF0009BB20C930BF13A039BB20D930BF16E0343 ++:103F00009BB20E930BF1AA039BB20F93002C00F00F ++:103F10005A82384640F2F941FBF778FD10F0080F5D ++:103F200040F064824CAD38ACAB1C0193A31C0393EE ++:103F30003846002340F2764140F2FF120095029489 ++:103F4000FBF7E0FD2B1D0093AB1D0193231D029396 ++:103F5000A31D03933846002340F2774140F2FF123D ++:103F6000FBF7D0FD05F10803009305F10A03019367 ++:103F700004F10803029304F10A030393384640F264 ++:103F8000AA4148F2FF1248F27F03FBF7BBFD05F19F ++:103F90000C03009305F10E03019304F10C031622A8 ++:103FA000029304F10E0303933846134640F23B415B ++:103FB000FBF7A8FD05F11003009305F1120301932F ++:103FC00004F11003029304F11203462203933846CE ++:103FD000002340F23C41FBF795FDB7F8DA3005F1DC ++:103FE000140E03F47043B3F5005F05F11C030A934C ++:103FF00005F11E03099304F11C03089304F11E0349 ++:10400000079305F12003069304F1200305F116023E ++:1040100004F1140104F1160005F1180605F11A085F ++:1040200004F1180904F11A0A05F12205059304F1B7 ++:10403000220437D1019241F22B02134602910390E0 ++:1040400040F24C413846CDF800E0FBF75BFD3846C6 ++:1040500040F24D4144F22B0244F20A030096CDF89F ++:104060000480CDF80890CDF80CA0FBF74BFD089A22 ++:104070000A980999079B02920722009001910393E5 ++:104080003846134640F2F941FBF73CFD0698059986 ++:10409000072200900291384640F2FA4113460195FA ++:1040A000039436E0019241F22B02134602910390F1 ++:1040B00040F24C413846CDF800E0FBF723FD38468E ++:1040C00040F24D4144F22B0244F222030096CDF817 ++:1040D0000480CDF80890CDF80CA0FBF713FD0A9AE8 ++:1040E000099B0898079900920722019302901346B2 ++:1040F0000391384640F2F941FBF704FD069A059B0F ++:104100000092029301950394384640F2FA41072247 ++:10411000002324ACFBF7F6FCA31C019310AB012297 ++:1041200002930DF14203072103933846134600948E ++:10413000FBF754FC231D0093A31D019311AB102228 ++:1041400002930DF14603FF21039338461346FBF714 ++:1041500045FC04F10803009304F10A03019312AB38 ++:10416000042202930DF14A034CAE039338461346E2 ++:1041700040F21F11FBF732FC06F1240338AD009327 ++:1041800006F12603019305F1240340F6440202934D ++:1041900005F1260303933846134640F63811FBF722 ++:1041A000B1FC06F12803009306F12A03019305F1FF ++:1041B0002803029305F12A030393384640F6391188 ++:1041C00040F6440240F60403FBF79CFC04F10C03A8 ++:1041D000009304F10E03019313AB012202930DF13E ++:1041E0004E033A21039338461346FBF7F7FB04F1DD ++:1041F0001003009304F11203019314AB08220293FD ++:104200000DF152030393384613464FF48D71FBF7BB ++:10421000E5FB04F11403009304F11603019315ABBD ++:10422000082202930DF156030521039338461346E5 ++:10423000FBF7D4FB04F11803009304F11A03019374 ++:1042400016AB042202930DF15A033A210393384628 ++:104250001346FBF7C3FB04F11C03009304F11E0398 ++:10426000019317AB012202930DF15E0303933846CD ++:1042700013464FF48D71FBF7B1FB06F12C0300934D ++:1042800006F12E03019305F12C03029305F12E0391 ++:104290000393384640F2D74147F2CB0242F24B0338 ++:1042A000FBF730FC04F12003009318AB20220293AB ++:1042B0000DF16203822122340393384613460194A0 ++:1042C000FBF78CFB0B98037B827AC17A1B0342F4C9 ++:1042D000007242EA011243F0030343EA820306F14B ++:1042E0003002009205F13002323602923235384601 ++:1042F0004FF49B6147F6FF729BB201960395FBF763 ++:1043000001FCDDF83090DDF834800026FB694CAC10 ++:10431000325B186949463CF00BDAFB6938AD725BD9 ++:10432000186941463CF004DAFB69A419186909F1DF ++:10433000020162883CF0FCD9FB69AD1908F1020169 ++:1043400018696A8804363CF0F3D9342E09F104095F ++:1043500008F10408DAD1DDF83890DDF83C80002659 ++:10436000FB6924AC325B186949463CF0E1D9FB6932 ++:1043700010AD725B186941463CF0DAD9FB69A419AB ++:10438000186909F1020162883CF0D2D9FB69AD19C4 ++:1043900008F1020118696A8804363CF0C9D9242E54 ++:1043A00009F1040908F10408DAD1FB690BF10201F3 ++:1043B00018690D223CF0BCD9FB690BF104011869A6 ++:1043C00009223CF0B5D9FB690B991A6A18690B9B55 ++:1043D000C1F83824B3F83C240BF1E6013CF0A8D92D ++:1043E000FB695946186901223CF0A2D961B0BDE8C9 ++:1043F000F08FC0462DE9F04F8DB007460F220E46D4 ++:104400000DF12100B149EDF3B7F5D7F8A8800022EE ++:10441000AF4D14016359B34203D001320E2AF7D1D4 ++:1044200073E3384691210022FBF77EFA38463821A3 ++:104430000722FBF779FA0A2238468821FBF774FA3B ++:10444000D7F8A83093F882251AB138468821FBF7AF ++:104450006BFA64192A213846227AFBF765FA302173 ++:1044600003223846637AFBF7A5FA912103223846E6 ++:10447000A37AFBF79FFAE37A38210F223846FBF73D ++:1044800099FA912100223846FBF74EFA382107228B ++:104490003846FBF749FA237B30210C229B00384633 ++:1044A000FBF788FA5E210F223846637BFBF782FA1E ++:1044B000A37B5E211B01F0223846FBF77BFA6C21BF ++:1044C0003846E27BFBF730FA384638210822FBF702 ++:1044D0002BFA384691210322FBF726FA0CA98B19F7 ++:1044E00013F8102C38465E21FBF71EFA01223846DD ++:1044F0007E21FBF719FA98F8EE231AB138463821D5 ++:10450000FBF712FA0722134638462A21FBF752FA24 ++:1045100038462C210022FBF707FA38462A210C22C4 ++:10452000FBF702FA012238462C21FBF7FDF9D7F8F8 ++:10453000A82092F852352BB338465E2192F85325C5 ++:10454000FBF7F2F9D7F8A830384693F854252A211A ++:10455000FBF7EAF9D7F8A830384693F855252B2110 ++:10456000FBF7E2F9D7F8A830384693F856252C2106 ++:10457000FBF7DAF9D7F8A83038462D2193F85725FC ++:10458000FBF7D2F9B7F8DA3003F47043B3F5805F84 ++:1045900004D13846BF21EE22FBF7C6F902221346AA ++:1045A000384640F21F11FBF705FA0422F7211346A3 ++:1045B0003846FBF7FFF9F121032200233846FBF7C9 ++:1045C000F9F9F221F82290233846FBF7F3F9A223F8 ++:1045D000F321FF223846FBF7EDF9B7F8DA3003F4A0 ++:1045E0007043B3F5005F04D1D7F8A83093F81835BD ++:1045F00006E0B3F5805F06D1D7F8A83093F81935F7 ++:10460000012B00F07982042238469D210023FBF71C ++:10461000D1F90022079244213846FBF76DF940F2A8 ++:104620002B1101903846FBF767F9442102900722CD ++:104630003846FBF7B1F9384640F22B110E22FBF752 ++:10464000ABF9079BD7F8F8AF0BB9554601E04FEA35 ++:104650004A05204B9A4502D84FF0010906E01E4B4F ++:104660009A4594BF4FF002094FF00409B7F8DA30C9 ++:1046700003F47043B3F5005F03D000210591069168 ++:1046800006E06268032302FB03F205926A000692C9 ++:10469000124C102221465046FDF7BEF91022214649 ++:1046A0002846FDF7B9F91022049009FB04F15046A1 ++:1046B000FDF7B2F9B7F8DA30039003F47043B3F5BD ++:1046C000005F0DD04FF0000B10E0C04612D4010087 ++:1046D000A8EF010080BA8C010075190340420F0059 ++:1046E000059802211022FDF797F983464F210222F7 ++:1046F0003846FBF719F9CD4B4FEACA0509FB03F31E ++:10470000B5FBF3F301335B08013B5FFA83F85221F9 ++:10471000072238464FEA9803FBF74CF908F10106E7 ++:104720005321602238464FEA4813FBF743F909FB4F ++:1047300006F3BF4CB5FBF3F5BE4B2C19B4FBF3F4F9 ++:10474000013CE4B2512122463846FBF7EDF8039BC9 ++:1047500010221D0158462946FDF75EF9013406FB7B ++:1047600004F600FB06F000280BDB58462946102211 ++:10477000FDF752F900FB06F0C01301304010441E53 ++:104780000EE0584629461022FDF746F96FEA080365 ++:1047900003FB04F300FB03F0C01301306FEA600475 ++:1047A000C4F3072353210F223846FBF703F95421A2 ++:1047B000E2B23846FBF7B8F806999F4B0A22B1FBE4 ++:1047C000F3F30599384601FB02F2B2FBF3F803FB61 ++:1047D0001822590802F0010401EB04545208B4FBFA ++:1047E000F3F49B0803EB0253B3FBF1F3E418452108 ++:1047F0001F22C8F30713FBF7DDF84FEA0813462121 ++:1048000038464FF4F87203F0F003FBF7D3F8C4F323 ++:10481000074346210F223846FBF7CCF84721C4F363 ++:1048200007223846FBF780F84821E2B23846FBF70A ++:104830007BF8079A41F29416002A08BF4FF4FA5603 ++:10484000A6F5D8760CBF4FF482794FF4E1794FF496 ++:10485000F572033E96FBF2F606FB02F505F52A75A6 ++:104860004FF425636D02B5FBF3F540F27C6405FB64 ++:1048700004F4A4F55834A4F5C064B4FBF2F4640A5B ++:10488000C4F3820242EAC6023846422192B2A4B27E ++:10489000FBF74AF804F0030204F01F0444EA421252 ++:1048A00038464321FBF740F84FEA49244FF4877319 ++:1048B000B4FBF3F404FB05F4604B640A604AB3FBF9 ++:1048C000F4F39A184FF41243B2FBF3F25D4B02F08B ++:1048D0000F02B3FBF4F3A3F54C23A3F500631B0C09 ++:1048E00042EA03123846402192B2FBF71DF84FF01E ++:1048F0002552554BB2FBF4F2B3FBF4F3A2F546326A ++:104900004FF4B841A2F50072A3F56E33B2FBF1F299 ++:10491000A3F50073B3FBF1F302F00F0242EA0312B6 ++:104920003846412192B20BF17444FAF7FDFF04F5C9 ++:1049300090044FF4966394FBF3F4292304FB03F4EF ++:104940004FF45C7308FB03F840F22B5306FB03F6AD ++:1049500006F5E46109FB08F00C311022FDF75CF864 ++:1049600004F5D81400EB640090FBF4F0C0B23C28CE ++:1049700094BF0025012515B14308043B00E0031F47 ++:10498000DCB23C213F2223463846FBF713F8AB014B ++:104990003C2140223846FBF70DF8B7F8DA3004F135 ++:1049A000040603F47043B3F5005F05F1010404D17C ++:1049B000D7F8A83093F8273506E0B3F5805F19D112 ++:1049C000D7F8A83093F82835012B13D1049B40F277 ++:1049D00045105946102203FB00F0FDF71DF804FBBB ++:1049E00006F39E2100FB03F4C02238464023FAF769 ++:1049F000E1FF0BE00499962001FB00F010225946DC ++:104A0000FDF70AF804FB06F300FB03F4B4F5160FF8 ++:104A1000D4BF002501256B1C032203FB02F394FB8A ++:104A2000F3F0B0F5003F11D5002315E0404B4C00EA ++:104A30003F420F0040420F00A08601000000686066 ++:104A40000021F6FF000084A30000302AA0F5C03347 ++:104A5000DB130133C3F347033D213F223846FAF706 ++:104A6000A9FFAB013D2140223846FAF7A3FF284BAE ++:104A70009A4504D9202238465721134603E0384688 ++:104A8000572120220023FAF795FF224B9A4504D99B ++:104A9000102238465721134603E03846572110228A ++:104AA0000023FAF787FF049AB2F5341F05DD384674 ++:104AB0004A210222FAF770FF04E038464A21FD221B ++:104AC000FAF75CFF0C22442113463846FAF772FFCE ++:104AD0000120F1F341F63846FEF76CFA019B3846A7 ++:104AE0004421DAB2FAF720FF029B384640F22B113C ++:104AF000DAB2FAF719FF08E004229D21384613467E ++:104B0000FAF758FF0121079185E50DB0BDE8F08F58 ++:104B100080BA8C01007519032DE9F0478A4BD0F853 ++:104B2000F84F4FF48475B4FBF3F404FB05F41A2337 ++:104B30005721B4FBF3F40646FAF7DEFE172181464F ++:104B40003046FAF7D9FE18213046FAF7D5FE40F282 ++:104B50000511FB2207463046FAF710FF30460421C4 ++:104B60004022FAF719FF30464FF490711022FAF7FD ++:104B700013FF304657210222FAF70EFF304640F26B ++:104B800005110422FAF708FF30464FF483712A22F8 ++:104B9000FAF7CAFEA4B2304640F207116E22FAF7C5 ++:104BA000C3FEE2B230462946FAF7BEFEC4F3042241 ++:104BB000304640F20911FAF7B7FE304640F20511CF ++:104BC000FD22FAF7DBFE30464FF483710122FAF73B ++:104BD000E3FE3220F1F3C0F55C4C03E00A20F1F370 ++:104BE000BBF50A3C30464FF48571FAF785FE10F0AC ++:104BF000010F01D1092CF1D130464FF48571FAF73C ++:104C00007BFE10F0010F08D1FAB230461821FAF7F6 ++:104C1000C3FE4FF00B0847460CE0304640F20F1140 ++:104C2000FAF76AFE00F01F071D2F8CBF4FF00B082C ++:104C300007F1020819213046FAF75EFE4FF483713E ++:104C4000FE2205463046FAF799FE304640F205113D ++:104C5000FB22FAF793FE304640F205110422FAF7E0 ++:104C60009BFE304640F205110222FAF795FE3046CF ++:104C70004FF483710122FAF78FFE3220F1F36CF5C5 ++:104C8000324C03E00A20F1F367F50A3C30464FF45A ++:104C90008571FAF731FE10F0010F01D1092CF1D125 ++:104CA00030464FF48571FAF727FE10F0010F06D158 ++:104CB000EAB230461921FAF737FE092506E03046F8 ++:104CC0004FF48871FAF718FE00F01F053046FE22F7 ++:104CD0004FF483716C01FAF751FE44EA85243046A3 ++:104CE000FB2240F20511FAF749FE2C4330465721CA ++:104CF0005FFA89F2FAF718FE3046224640F6331181 ++:104D0000FAF790FE2246BC02304644EA471440F6C9 ++:104D10003411FAF787FE304645EA040240F63511B1 ++:104D2000FAF780FE304644EA070240F63611FAF7F9 ++:104D300079FE48EA4812D205304640F63711D20DC6 ++:104D4000FAF770FEBDE8F08740420F0089969800A0 ++:104D500070B55B210446FD22FAF710FE20460421BF ++:104D60004022FAF719FE20464FF490711022FAF70C ++:104D700013FE204678218022FAF70EFE204640F2EC ++:104D800029110222FAF708FE204657210122FAF7DC ++:104D900003FE20465B210222FAF7FEFD41F2883035 ++:104DA000F1F3DAF4154D03E00A20F1F3D5F40A3DEE ++:104DB0005C212046FAF7A0FD10F0200F01D1092D4B ++:104DC000F2D15C212046FAF797FD10F0200F03D0B6 ++:104DD00020465C21FAF790FD20465B21FD22FAF780 ++:104DE000CDFD20465721FE22FAF7C8FD204640F2AD ++:104DF0002911FD22FAF7C2FD70BDC04689969800C0 ++:104E000070B504460E4600256E4B2046E95AFAF767 ++:104E100073FDA8530235302DF6D1182220466A4979 ++:104E2000FAF73AFE3A21FB222046FAF7A7FD0122C3 ++:104E300020464FF48D71FAF7AFFD3621012220464E ++:104E4000FAF7AAFD10224FF48D712046FAF7A4FD5F ++:104E50001420F1F381F43A2101222046FAF79CFD57 ++:104E60001420F1F379F4B4F8DA3003F47043B3F5B5 ++:104E7000005F03D120463A21012208E020463A2172 ++:104E800001220023FAF796FD2046CA210422134688 ++:104E9000FAF790FD082220464FF48D71FAF77CFD59 ++:104EA00025210E222046FAF73FFD2521012220462A ++:104EB000FAF772FDB4F8DA3003F47043B3F5805FAB ++:104EC00004D1204628211E22082303E02046282161 ++:104ED0001E220C23FAF76EFD1420F1F33DF4052198 ++:104EE00008222046FAF720FD80224FF489712046DF ++:104EF000FAF752FD1420F1F32FF4FF21102220467F ++:104F0000FAF74AFD442240F21F112046FAF744FD09 ++:104F10001420F1F321F40B2107222046FAF73CFD7F ++:104F2000102240F213112046FAF736FD1420F1F357 ++:104F300013F4072101222046FAF7F6FC1420F1F3BE ++:104F40000BF4022303222046FC21FAF733FDFD2156 ++:104F50002046A622FAF7E8FC442240F21F11204620 ++:104F6000FAF71AFD1420F1F3F7F3FF21102220467F ++:104F7000FAF712FD1420F1F3EFF3B4F8DA3003F48A ++:104F80007043B3F5805F03D110492046082202E048 ++:104F90000F4920460622FAF77FFD20465921CC22F0 ++:104FA000FAF7C2FC20465C212E22FAF7BDFC20460F ++:104FB0007821D722FAF7B8FC204692211522FAF779 ++:104FC000B3FC70BD5ED4010056DD01005ED7010068 ++:104FD00086DD01002DE9F04F04468BB0894609B902 ++:104FE0008B4608E040F2D741FAF710FD01A983464D ++:104FF0002046FDF79DFD202213464FF49A6120467E ++:10500000FAF736FD6420F1F3A7F340F2764120462B ++:10501000FAF7FCFC40F2A64180462046FAF7F6FC7F ++:1050200009A9824608AA204607ABFBF7C1F9099FE8 ++:10503000089E079DB9F1000F09D0204601A9FDF790 ++:105040005FFD204640F2D7415A46FAF7EBFC4FEAA3 ++:10505000C850C00D4FEACA5380F48070DB0D00F5D4 ++:10506000FE70033083F48073C01A801039463246D4 ++:105070002B46FCF7F1FC40000BB0BDE8F08FC046BA ++:10508000F0B5D0F8A85085B095F858340646002BF6 ++:105090007BD00023019302930393FDF779F8C7B205 ++:1050A0000FB17F2F71D101AB02AA304603A9FBF7E4 ++:1050B0007FF940F23E613046FAF7A8FC40F2A64183 ++:1050C000C4053046FAF7A2FCC005C00DE40DFF2868 ++:1050D0008ABFA0F5807300F580729AB2FF2C84BF5E ++:1050E000A4F5807398B2C2F5FE7398BF04F5807082 ++:1050F00003331B18C3F38F00C7B995F85634013337 ++:10510000DBB2042B85F856343FD985F85674029AE1 ++:10511000019B0399FCF7A0FCD5F848244310043BFD ++:105120009342B8BF1346C5F844341AE07F2F2CD100 ++:1051300095F857340133DBB2042B85F8573424D962 ++:10514000002385F85734029A019B0399FCF784FCED ++:10515000D5F84424431004339342A8BF1346C5F83E ++:105160004834D6F8A8109BB2D1F844243046934274 ++:10517000A8BF1346D1F8482440F2A7419342B8BFD4 ++:1051800013469BB2FF22FAF773FC05B0F0BDC04690 ++:105190002DE9F04F474B87B003AC80460D4693E8AE ++:1051A000070084E8070040F245614046D8F8A8B0FF ++:1051B000FAF72CFC40F2466187054046FAF726FCD8 ++:1051C0003D49860506224046FAF766FC00210A465C ++:1051D0004046FDF745F84FF4FA73019340462946DF ++:1051E0002022A3F5FA730094FDF73AFFBF0DB60D28 ++:1051F0008246002849D0049DDDF81490039C09EBF9 ++:105200000503012B02D84FF0000A3EE02046FBF7D1 ++:1052100057F806464846FBF753F8A6F114031AB2AE ++:10522000002A06DB35FA02F13FD0013235FA02F2EC ++:1052300006E0534215FA03F137D0D24315FA02F2D1 ++:1052400033B2C3F11E0314FA03F3C3EB0204A0F15B ++:105250000B031BB2002B0A4602DB35FA03F102E016 ++:105260005B4215FA03F120D003B2C3F11F0309FA20 ++:1052700003F394FBF2F493FBF1F004FB1400FBF74F ++:105280002BF8A7058605BF0DB60D404639463246B8 ++:10529000FCF7E6FF404609490622FAF7FDFB5046B7 ++:1052A000ABF8B872ABF8BA6200E0002007B0BDE816 ++:1052B000F08FC04634D4010074D801007ED90100BB ++:1052C00070B504460D46C9B104221249FAF7E4FB51 ++:1052D000D4F8A83093F8E933A02B05D1204640F646 ++:1052E0004A1140F24F1203E0204640F64A11A7222D ++:1052F000FAF798FB084920460E2201E007490A22E6 ++:10530000FAF7CAFBE369291E18BF012118693BF0AF ++:105310004BDA70BDE0D70100BAD901000EDD010003 ++:1053200070B50C4606222749E4B20546D0F8A860BD ++:10533000FAF7B2FB0C2C01D8002406E005F58A53DD ++:1053400093F900301C1E18BF012496F81A35002B63 ++:1053500031D0284640F64211FAF758FB14B10F2815 ++:105360000BD100E0A8B9D5F8F83013F0060F22D120 ++:1053700096F82C30A3421ED05CB1EB690122D868AC ++:105380009968F0F33BF628460121FFF799FF0123C6 ++:105390000AE0EB690022D8689968F0F32FF62846F6 ++:1053A0000021FFF78DFF002386F82C3028460649A0 ++:1053B0000C22FAF771FB284604490422FAF76CFB29 ++:1053C00070BDC04692DD010046D70100F8DD010046 ++:1053D00070B50D46B0F8DA101646D0F8A840FAF7C6 ++:1053E0003BFD28B994F84C342B7094F84D3401E00F ++:1053F00000232B70337070BD2DE9F0474FF000088B ++:1054000086B0054602ABCDF81080CDF80C80CDF803 ++:10541000088003AA8A4604A9D0F8A890FAF7C8FF22 ++:1054200028460DF117010DF11602FFF7D1FF9DF887 ++:10543000173004990193039A029B01242846009493 ++:10544000FCF71EFB9DF81630074601932846029B89 ++:105450000499039ACDF80080FCF712FB99F8E83321 ++:1054600006460BB39DF81700B5F90221B5F90431D2 ++:10547000B5F9061101902846039202930491009415 ++:10548000FCF7FEFA9DF8163004460193284604996D ++:10549000039A029BCDF80080FCF7F2FAA742B8BF4E ++:1054A00027468642A8BF0646BAF1010F02D0BAF1DC ++:1054B000030F02D17B10C9F84434AAF10203DBB216 ++:1054C000012B02D87310C9F8483406B0BDE8F08744 ++:1054D00007B540F25643009340F255420133FAF7C4 ++:1054E000FBFB0EBD2DE9F04340F2DF4189B0D0F85F ++:1054F000A8400546FAF78AFAC3B27F2BA4F84C30CD ++:10550000C0F30720C4BFA3F58073A4F84C307F28F4 ++:10551000C8BFA0F58073A4F84E0001AFC8BFA4F8BF ++:105520004E301123039320262A330DF118094FF032 ++:105530000208284639460493CDF80490CDF8088037 ++:105540000596FFF7C5FF069B3F2B01D9803B0693CD ++:10555000069B2365079B3F2B01D9803B0793079B45 ++:1055600040F2344163652846FAF750FAC0B27F280A ++:10557000C4BFA0F5807398B284F8580040F224416B ++:105580002846FAF743FAC0F30720A4F85A0040F27D ++:1055900025412846FAF73AFA0D23C0B2A4F85C0078 ++:1055A000039328460F3339460493CDF80490CDF881 ++:1055B00008800596FFF78CFF069B2364079B6364B6 ++:1055C00009B0BDE8F083C0462DE9F041B2F1FF3FDC ++:1055D0008AB0064688461746D0F8A85002D1FCF794 ++:1055E000E3FB47B295F966355FFA88F4013394FB23 ++:1055F000F3F407230393193305930123E4B20293D1 ++:1056000001AD07AB0193304604F5A073294604931E ++:10561000FFF75EFF079BC034C3F307530793304681 ++:1056200006AB294601930494FFF752FF0021079827 ++:105630000DF126020DF12203F2F3BCF60021402009 ++:1056400008AB09AAF2F3B6F6BDF92230BDF9201075 ++:105650008B4209DABDF92400C91AF2F35DF7BDF8EF ++:105660002240ADF8240009E0BDF92600C1EB03019A ++:10567000F2F352F7BDF82040ADF82600BDF9260040 ++:10568000BDF92410F2F352F723B2032B80B201DDEF ++:10569000231F01E0C4F104039AB212B208FA02F126 ++:1056A00003B2052003FB0010911E01238B40013A39 ++:1056B000C018104107FB00F0C0F3CF000AB0BDE8EE ++:1056C000F081C04670B5182386B0D0F8A840039387 ++:1056D00000238022049340F276662033054605932A ++:1056E000314613460292FAF7C3F904F19C032846A7 ++:1056F00001A90193FFF7ECFE40F271612846FAF729 ++:1057000085F940F27361A4F89C022846FAF77EF905 ++:1057100040F27461A4F89E022846FAF777F940F245 ++:105720007561A4F8A2022846FAF770F940F279618F ++:10573000A4F8A0022846FAF769F93146A4F8A402B1 ++:105740002846FAF763F940F2DA61A4F8A60228467F ++:10575000FAF75CF940F22551A4F8A8022846FAF7B6 ++:1057600055F994F86735A4F8AA0284F8AC324FF4DE ++:105770008F612846FAF74AF94FF49A61A4F8AE020D ++:105780002846FAF743F940F22451A4F8B00228461B ++:10579000FAF73CF9B4F86835C0F3C030A4F8B43275 ++:1057A00094F80734A4F8B20284F8B63294F80834B6 ++:1057B00084F8B73206B070BD7FB500230293103372 ++:1057C00004930DF1160300930123019369465433AA ++:1057D0000393FFF77DFEBDF8160007B000BDC0467D ++:1057E0002DE9F84FD0F8A860074696F846355BB922 ++:1057F000FFF7E2FF40F3072340B21FFA80F81FFAD9 ++:1058000083F9C346CA4607E0B6F84AA5B6F84C8500 ++:10581000B6F84E95B6F850B5B7F8DA30384603F416 ++:105820007043B3F5005F0CBFB6F86660B6F8686009 ++:105830004FF0FF320121FCF72FFA36B20121324638 ++:1058400084B23846FCF728FA0021241A4FF0FF32C0 ++:105850003846FCF721FA0121324685B23846FCF77A ++:105860001BFAA4B2C4EB0A06B6B2C4EB08042D1AA4 ++:10587000FF2238463346A4B240F65211FAF7F8F840 ++:105880003846FF22234640F65311FAF7F1F838461E ++:10589000FF22334640F65611FAF7EAF8ADB2384621 ++:1058A000FF22234640F65711FAF7E2F8C5EB090349 ++:1058B0003846FF2240F648119BB2C5EB0B05FAF7BC ++:1058C000D7F8384640F64911FF22ABB2FAF7D0F8C4 ++:1058D000BDE8F88F2DE9F04F93B00DF126080C4686 ++:1058E000D0F8A8503B49064693464046222201AFD5 ++:1058F000ECF342F3384638492222ECF33DF3BCB1D5 ++:105900000022304640F60F11FAF78CF895F8E9338B ++:10591000324AA02B324B14BF0524032414BF104677 ++:10592000184614BF4FF0100A4FF0110AB94616E09E ++:10593000012230464FF41161FAF774F895F8E93313 ++:10594000284AA02B284B14BF0E240A2414BF10464B ++:10595000184614BF4FF0100A4FF0110AC14600223A ++:10596000114604E00B5A013224319B4506D0A24275 ++:105970001FFA82F8F6D14FF6FF7416E00FFA88F29C ++:10598000242302FB03070024254607E035F809100D ++:10599000304637F81420FAF745F8023501340AF199 ++:1059A00001039C42F2D11FFA88F43046FCF74EF90D ++:1059B00010B13046FFF714FF3046FCF767FD20B208 ++:1059C000B0F1FF3F0CBF4FF0FF30002013B0BDE837 ++:1059D000F08FC046BED8010004D5010088F0010058 ++:1059E0003AEF0100A4F201003CF101002DE9F0437F ++:1059F0008BB006460F4691460DF106001D49222246 ++:105A0000ECF3BAF2D6F8A83093F8E933A02B14BF20 ++:105A10004FF010084FF0110817B93D463C4619E009 ++:105A200000252C4609E00DF10603E15A3046F9F74E ++:105A3000EDFF013524F8090002344545F3D10BE0B0 ++:105A40000DF10603E15A34F809203046F9F7EAFF70 ++:105A5000013502344545F3D13046FCF7F7F810B173 ++:105A60003046FFF7BDFE17B93046FCF70FFD0BB00F ++:105A7000BDE8F0839EDD010030B587B005AB009333 ++:105A8000022301930023029350330C46039369468B ++:105A9000102315460493FFF71BFDBDF81430238037 ++:105AA000BDF816302B8007B030BDC0467FB50DF174 ++:105AB0001603009301230193013B02935733039391 ++:105AC000694610230493FFF703FDBDF81600000A92 ++:105AD00007B000BD07B540F25643009340F255426F ++:105AE0000133FAF7BFF80EBDF0B5B0F8DA30D0F8F0 ++:105AF000A85003F47043B3F5005F0CBF95F8403332 ++:105B000095F8413387B085F8423395F8423306461D ++:105B100085F84333B0F8DA3003F47043B3F5005F2F ++:105B200014D195F8492353B2002B02DD85F84823A0 ++:105B300009E0C3691B6D13F4805F01D0342300E0DA ++:105B4000302385F8483395F85C3313E095F84A2301 ++:105B500053B2002B02DD85F8482309E0C3691B6DB1 ++:105B600013F0805F01D0342300E0302385F8483300 ++:105B700095F85D335BB2002B4CDD0322022BA8BFEE ++:105B8000022303FB02F340F2DF413046DFB2F9F7B4 ++:105B90003DFFC1B27F29C0F30720C4BFA1F58073C8 ++:105BA00099B203B27F2BC8BFA0F580737AB2C8BF89 ++:105BB00098B292B2C2EB0003C2EB0102DBB202F078 ++:105BC000FF0242EA0322304640F2DF41F9F72AFFA2 ++:105BD0000DF116030093022301930F3302930F2359 ++:105BE00003933046082369460493FFF771FC9DF840 ++:105BF0001630FAB29B1A8DF816309DF817303046E1 ++:105C00009B1A69468DF81730FFF764FF30466C46E3 ++:105C1000FDF700FA4FF0FF3385F89A3395F84D33CE ++:105C2000002285F8472385F89C23BBB185F84223E1 ++:105C300085F84323304640F22341FF32B5F8503314 ++:105C4000F9F716FF30464FF4AA61B5F86023F9F76B ++:105C5000E9FE304604490422F9F71EFF3046FCF7FE ++:105C600013F907B0F0BDC0462ADB01002DE9F04F63 ++:105C7000C3690C464FF08051BBB00546D0F8A87000 ++:105C8000164618690A463AF015DD0520F0F364F56A ++:105C900028464FF489614FF480420023F9F7E8FE6B ++:105CA0000122284640F20A511346F9F7E1FE0DF1B0 ++:105CB000E703349301233593103336930F2337933F ++:105CC0002846082334A93893FFF702FC0CB131466B ++:105CD00012E0B5F8DA3003F47043B3F5005F40F03A ++:105CE0003E81EB6997F8BF641B6D13F4805F0CBFB6 ++:105CF00008210621FF2E00D10E469DF8E720032340 ++:105D000006FB13238DF8E6300DF1E60334932846A5 ++:105D1000102334A93793FFF7DDFE7300FE229BB2F8 ++:105D2000284640F20A51F9F7A3FE97F8C044FF2C29 ++:105D300000F0EA80002C00F0C980102C28BF10244D ++:105D4000C4F12403D9B272B24BB29A4201DDCEB291 ++:105D500002E0002E08BF012670B2A042019002DCD2 ++:105D60005FFA86F902E0631C5FFA83F904F1010B24 ++:105D7000C9EB0B035FFA83F80D2336931333389383 ++:105D80004FFA89F35B004FFA88F2049309AB03EBF7 ++:105D9000C203570003937B1CDBB2079363000133FC ++:105DA00005934FEA4B03029206934FF0000A0198C5 ++:105DB000049AA042CABF73B2CDF8DCB03793379BC8 ++:105DC00034A953445B003793039B284635923493A0 ++:105DD000FFF77EFB07990AE03AA800EB810353F82E ++:105DE000C42C42F0800243F8C42C8B1CD9B2059A13 ++:105DF0009142F1DD002111E03AAB03EB810203EBAC ++:105E0000870353F8C43C3AA842F8C43C00EB87032C ++:105E100053F8C03C42F8C03C8B1CD9B2B942EBDB12 ++:105E2000069A09AB349328464FEA4A0334A90AF18B ++:105E3000250A35923793FFF74DFEBAF14A0FB6D1D6 ++:105E4000019B4FFA88F2A342C4BF73B237934FFA53 ++:105E500089F335930DF1AE0303EB4203D8BFCDF8C0 ++:105E6000DCB034931023389328460E2334A936939C ++:105E7000FFF72EFB0CE03AAE06EB480333F83A2C62 ++:105E800042F4006223F83A2C08F101035FFA83F828 ++:105E9000A045F0D9002109E0029E3AA800EB430298 ++:105EA00000EB460333F83A3C22F83A3C0298CBB276 ++:105EB00001318342F0DB0DF1AE0334932846002319 ++:105EC00034A9CDF8D4B03793FFF704FE012213466E ++:105ED000284640F20E51F9F7CBFD4FF47E426302A3 ++:105EE0001340284640F20E51F9F7C2FD284640F211 ++:105EF0000F517F222346F9F7BBFD284640F20F5190 ++:105F00004FF47E52E3011BE0284640F20E5101227D ++:105F10000023F9F7ADFD284640F20E514FF47E42C2 ++:105F20000023F9F7A5FD284640F20F517F220023F8 ++:105F3000F9F79EFD284640F20F514FF47E520023A0 ++:105F4000F9F796FDEB694FF08051186900223AF09D ++:105F5000B1DB2846FDF75EF83BB0BDE8F08F214687 ++:105F6000CAE6C0462DE9F041D0F8A8600746D6F849 ++:105F70007C45002505E021463846FFF7ABFD01359D ++:105F80001434D6F878359D42F5D3BDE8F081C0468B ++:105F9000F0B5C369D0F8A85087B00746802198684B ++:105FA000F0F396F6044600286DD0B5F81C340026B0 ++:105FB00003F4807C03F4007E30464FF0000316F0BB ++:105FC000100206F00101035316D0BEF1000F03D0FA ++:105FD000D5F81C34C3F3802116F0080F02D095F8D1 ++:105FE0001A3408E0D5F8183416F0200F14BFC3F3A4 ++:105FF000072303F0FF030353BCF1000F00D062BB83 ++:1060000016F0040F09D016F0020F025B02D0D5F88B ++:106010000C340EE0D5F80C3418E016F0200F06F022 ++:1060200002030CD0025B13B1D5F8103401E0D5F8AF ++:10603000143409B11B0E0EE0C3F307430BE0025BFF ++:1060400013B1D5F8103401E0D5F8143411B1C3F30D ++:10605000072300E0DBB21343035301360230402E26 ++:10606000ABD10F230393002304933846103301A9C7 ++:10607000059302960194FFF72DFDFB692146986870 ++:106080008022F0F335F607B0F0BDC0462DE9F041AF ++:10609000002486B00594D0F8A8800646FBF784FE5D ++:1060A00007230293193304930746012325460193DE ++:1060B00016E00BB90C4603E011F0010F0FD14C08AC ++:1060C00030467AB2FFF780FA06AB43F8040D00932E ++:1060D000304604F5107369460393FFF7FBFC013566 ++:1060E000802DE9B298F96635E3D17BB101230193A4 ++:1060F000402405AB0093304604F5107369460393C2 ++:10610000FFF7E8FC631CDCB2802CF2D106B0BDE8DE ++:10611000F081C0462DE9F04FB0F8DA3089B003F4D1 ++:106120007043B3F5005F07468B46D0F8A85002D104 ++:10613000B5F8C42304E0B3F5805F08D1B5F8C623F1 ++:1061400013B2B3F1FF3F02D01FFA82FA01E04FF021 ++:10615000700A072304931933069301234FF00009B3 ++:10616000039307AB0293C846CDF80490019B18F047 ++:10617000010F0BEB0306F378009303D095F9663516 ++:10618000002B59D1B7F8DA3003F47043B3F5005F50 ++:1061900003D0019B13F80B9012E0B5F8402413B222 ++:1061A000B3F1FF3F18BF1FFA82F9B5F83E2408BFCC ++:1061B0004FF00F0913B2B3F1FF3F1CBF92B2009230 ++:1061C000B37872781B0443EA022343EA0A6343EA82 ++:1061D0000903079395F9663502AC0133B8FBF3F375 ++:1061E000C033384621460593FFF774FC07AB029392 ++:1061F00095F9663538460133B8FBF3F303F5A07320 ++:1062000021460593FFF764F93279009B120542EAB3 ++:106210000372079B384623F07F4323F470031A432D ++:10622000079295F9663521460133B8FBF3F303F580 ++:10623000A0730593FFF74EFC019B08F1010805339D ++:10624000B8F1800F019391D195F96635002B36D0C6 ++:106250005E4608F1800896F8423196F841211B0409 ++:1062600043EA022302AC43EA0A6343EA09033846DD ++:10627000214608F180050793CDF81480FFF72AFC2A ++:1062800007AB3846214602930595FFF721F996F8AA ++:106290004421009B120542EA0372079B384623F013 ++:1062A0007F4323F470031A43214608F10108079243 ++:1062B00005950536FFF70EFCB8F5A07FCBD109B0E8 ++:1062C000BDE8F08F10B5B0F8DA30D0F8A82003F4AC ++:1062D0007043B3F5005F03D1D2F87415FFF71AFFCE ++:1062E00010BDC0462DE9F043054687B0D0F8A89010 ++:1062F000002940D0072399F8C272029319330493FE ++:10630000012301934FF0000805AB00932AE007F149 ++:10631000C003284669460393FFF7DAF806F1C00385 ++:10632000284669460393FFF7D5FB07F5A073284677 ++:1063300069460393FFF7CCF806F5A0732846694633 ++:106340000393FFF7C7FB07F51073284669460393CD ++:10635000FFF7BEF806F51073284669466C460393AE ++:10636000FFF7B8FB99F8C2325FFA88F6B34208F13A ++:106370000108CCD20CE0B0F8DA3003F47043B3F586 ++:10638000005F02D10449FFF7C5FE2846FFF77EFEF5 ++:1063900007B0BDE8F083C046589502002DE9F041F2 ++:1063A000D0F8A84086B094F907144FF0FF3289B2B4 ++:1063B0000646FFF709F994F967350546022B01D027 ++:1063C000002007E094F90814304689B24FF0FF32FC ++:1063D000FFF7FAF807230293193304930123C0EB64 ++:1063E00005070193304605ABB4F868154FF0FF324E ++:1063F0000093FFF7E9F84FF000084FF00003C019D1 ++:10640000A4F86A3548BFA4F86A0521E094F8662527 ++:1064100012B111F0010F19D1B4F86835B4F96A5509 ++:106420008B4253B238BFED1B013391FBF3F3DBB268 ++:1064300003F5107330464FF0FF320393FFF7C4F8B3 ++:10644000401B059069463046FFF744FB08F1010800 ++:10645000B8F1800F5FFA88F1D8D194F966357BB135 ++:106460000123019305AB0093402404F510733046DB ++:1064700069460393FFF72EFB631CDCB2802CF4D13A ++:1064800006B0BDE8F081C04630B5182387B0D0F81B ++:10649000A840039308330593603302930023054615 ++:1064A000049301A904F19C030193FFF713FB284611 ++:1064B000B4F89C2240F27161F9F7B4FA2846B4F8B6 ++:1064C0009E2240F27361F9F7ADFA2846B4F8A22291 ++:1064D00040F27461F9F7A6FA2846B4F8A02240F217 ++:1064E0007561F9F79FFA2846B4F8A42240F2796161 ++:1064F000F9F798FA2846B4F8A62240F27661F9F73F ++:1065000091FA2846B4F8A82240F2DA61F9F78AFA3B ++:106510002846B4F8AA2240F22551F9F783FA284612 ++:10652000B4F8AE224FF48F61F9F77CFA2846B4F83C ++:10653000B0224FF49A61F9F775FAB4F8B2324FF419 ++:106540000042DB032846134040F22451F9F790FA49 ++:1065500094F8AC32284684F86735B4F8B432A4F81D ++:10656000683594F8B63284F8073494F8B73284F872 ++:106570000834FFF713FF07B030BDC0462DE9F04FD8 ++:106580008DB0039202930BAB0646D0F8A8708B46F1 ++:1065900000930DF12F010DF12D030DF12E02FCF7EB ++:1065A0005DF930460DF12A010AAAFFF765FA304677 ++:1065B000FFF702F9072306931933089309AB0493F5 ++:1065C0004FF000080123059381464FF450735D4658 ++:1065D000C246079338E097F8662522B10AEB0B0311 ++:1065E00013F0010F2DD153B2013304ACB5FBF3F31B ++:1065F00003F5A073304621460793FEF769FF099B18 ++:10660000BDF828201B0D92051B05920D1A43BDF8FD ++:106610002A3030469B059B0D42EA83282146CDF85F ++:106620002480FFF757FACDF8249097F96635304665 ++:106630000133B5FBF3F303F5E07321460793FFF74E ++:1066400049FA01350AF1010A039A9542C3D997F92B ++:106650006635C3B17F2A16D14FF4C07504AC3046FD ++:1066600021460795CDF82480FFF734FA05F1800321 ++:10667000304621460135CDF824900793FFF72AFADA ++:10668000B5F5E07FEAD1029A07EB4203BDF82A2074 ++:10669000A3F86C20BDF82820A3F87890A3F8722006 ++:1066A0009DF82F3087F87E309DF82E3087F87F30A8 ++:1066B0009DF82D3087F880309DF82C3087F8813098 ++:1066C0000DB0BDE8F08FC0462DE9F04F8DB00393BB ++:1066D000C369D0F8A86005460C4698684FF48061FD ++:1066E0009346F0F3F5F20746002800F08A80C5F8DB ++:1066F000EC4F28460121FDF76BFA96F82C3043B198 ++:10670000284641490622F9F7C7F928460021FEF735 ++:10671000D7FDA4B101203D4984EAE472A2EBE47202 ++:1067200000FB01F1B1FBF2F39EB202FB06F2431C47 ++:106730008A4298B2EFD1B6F5807F01D95AE002269D ++:10674000242304FB03F349F6404293FBF2F30024B5 ++:106750001B04642293FBF2FAA146A0462EE04846B1 ++:106760000AA9F9F739FD0B9B03FB0BF3002B04DBA4 ++:10677000DB130133C3F3490206E05B42DB13013351 ++:106780005B105B429A05920D0A9B03FB0BF3002BF7 ++:1067900004DBDB130133C3F3490306E05B42DB1385 ++:1067A00001335B105B429B059B0D43EA822347F854 ++:1067B0002830631CD1449CB208F10108B442CED108 ++:1067C000062228461249F9F767F915230793002492 ++:1067D0000B33284605A90993059706960894FFF7F9 ++:1067E00079F9039B2846009331464FF6FF72234602 ++:1067F000FDF774F8EB69394698684FF48062F0F35E ++:1068000077F20DB0BDE8F08FE2DA0100005A6202C3 ++:1068100000DE010030B587B005AB00930123019382 ++:10682000173302930833002204934FF400230546E4 ++:1068300003920593144628466946FFF74BF9039BDC ++:1068400001330393631CDCB2802CF4D107B030BD5C ++:10685000F0B5D0F8A83087B093F89A250746002AFB ++:106860002DD1324B324D1E68144605E0294638467C ++:10687000FFF730F901341435B442F7D12D4A002422 ++:106880005368384601931023029308230493136836 ++:10689000694600930394FFF71DF9FB691B6B082BF6 ++:1068A0000DD1254A38465368694601931223029355 ++:1068B0000E330493136803940093FFF70BF910232E ++:1068C00004930DF1160300934FF07203082601257F ++:1068D000ADF81630384600236946039302960195B9 ++:1068E000FFF7F8F84FF0820338466946ADF81630E6 ++:1068F0000395FFF7EFF84FF0060369463846ADF809 ++:1069000016300396FFF7E6F83846FFF7DBFC38460B ++:10691000FFF728FB3846FFF73BFB3846FFF7B6FB8F ++:1069200038466C46FFF776FF07B0F0BD1CE001006B ++:10693000F8E401003CEC010018EC010070B5B0F87F ++:10694000DA30054603F47043B3F5005FD0F8A820B1 ++:106950000CD192F9F133B3F1FF3F37D1B2F9F833EB ++:10696000B3F1FF3F32D1B2F92C352CE0B3F5805FA3 ++:1069700035D192F95B35B3F1FF3F27D192F9F3336B ++:10698000B3F1FF3F22D192F95C35B3F1FF3F1DD146 ++:10699000B2F90034B3F1FF3F18D1B2F93035B3F199 ++:1069A000FF3F13D1B2F90234B3F1FF3F0ED1B2F978 ++:1069B0003435B3F1FF3F09D1B2F90434B3F1FF3FED ++:1069C00004D1B2F93835B3F1FF3F08D0012482F881 ++:1069D0006645102228464FF49A61134607E00024CA ++:1069E00082F8664528464FF49A6110222346F9F74B ++:1069F0003FF84FF48F61032223462846F9F738F811 ++:106A00002846FFF725FF2846FBF7E4FF2846FCF75A ++:106A1000E3FE2846FFF768F870BDC04610B50023B6 ++:106A200088B00593103307930DF1060303930123F8 ++:106A30000446ADF80610049303A954330693FFF7F8 ++:106A400049F82046FBF702F910B12046FEF7C8FED0 ++:106A500008B010BD2DE9F041D0F8A870064600241A ++:106A600019E0B6F8DA3003F47043B3F5805F07D16C ++:106A7000A218137923B1890492783046890C07E073 ++:106A80006B4BE21853792BB18904D2783046890CCC ++:106A9000F8F74AFF0634664A4FF6FF73A15A994247 ++:106AA000DFD1304673210022F8F73EFF3046322115 ++:106AB0006A22F8F739FF192230463321F8F734FFFC ++:106AC00097F8EC231AB130463321F8F72DFFC22195 ++:106AD0006F223046F8F728FF902110223046F8F751 ++:106AE00023FF102100223046F8F71EFF9B210722CA ++:106AF0003046F8F719FF1D2102223046F8F714FF3F ++:106B00001E2106223046F8F70FFF304640F2EA41D8 ++:106B100044F28862F8F786FFB6F8DA3003F470437F ++:106B2000B3F5005F0DD197F8E933B6F8CE1FA02B6F ++:106B300014BF022204220BB2B3F1FF3F0DD0CAB240 ++:106B40000BE0B3F5805F07D1B6F8D02F13B2B3F1E5 ++:106B5000FF3F01D0D2B200E0022253B21FFA83F805 ++:106B600007224346304640F2EB41F8F781FFB6F882 ++:106B7000DA3003F47043B3F5005F05D0B3F5805FFE ++:106B800004D197F83B350BB9002400E001242346DB ++:106B9000254624010F22A4B2304640F2F241F8F714 ++:106BA00067FFF0222346304640F2F241F8F760FFDB ++:106BB0000F22304640F2F1412B46F8F759FFF02200 ++:106BC0002346304640F2F141F8F752FF4FEA0823DE ++:106BD000304640F2F2414FF4E06203F47F43F8F7AD ++:106BE00047FFB6F8DA30304603F47043B3F5805F00 ++:106BF0000CBF03F5377341F2DA23F45A40F2EB414C ++:106C0000630203F47E434FF40072F8F731FFB6F8E5 ++:106C1000DA3003F47043B3F5805F0BD041F22433D4 ++:106C2000F25A13B2B3F1FF3F04D0930203E0C0461F ++:106C30009CF40100A3024FF4806203F47C433046CD ++:106C400040F2EB41F8F714FF40F2EB413046D6F842 ++:106C5000A840F8F7DBFEC0F3802084F8470540F237 ++:106C6000EB413046D6F8A840F8F7D0FEC0F34020FC ++:106C700084F84805D6F8A820304692F8481592F8CE ++:106C800047355B1A18BF012382F84635FAF7F0FF43 ++:106C9000830203F47C43304640F646114FF4806291 ++:106CA000F8F7E6FE304643490622F8F7F5FE41F2D2 ++:106CB0000D23F35C2BB10F22304677211346F8F7F2 ++:106CC00079FE30460021FFF7A9FE97F89A352BB9D7 ++:106CD0003046FEF73DF83046FDF71EFFF3697A2196 ++:106CE000186939F007DD97F8EC23400084B22AB127 ++:106CF00024B1F369A11C186939F01ADD97F8ED2366 ++:106D00002AB124B1F3692146186939F011DD97F8E9 ++:106D1000BB34DBB104221346304640F21D11F8F7B4 ++:106D200049FE30469F213F2297F8BC34F8F742FED7 ++:106D300030469E213F2297F8BD34F8F73BFE30469F ++:106D400077210F2297F8BE34F8F734FEB6F8DA3020 ++:106D500003F47043B3F5805F29D197F9583533B305 ++:106D6000B42124223046F8F7DFFDB7212422304633 ++:106D7000F8F7DAFD0322B8213046F8F7D5FD97F988 ++:106D80005825022A07D13046B821F8F7CDFD304604 ++:106D9000B521012209E0032A09D13046B821013A80 ++:106DA000F8F7C2FD3046B5210022F8F7BDFDBDE879 ++:106DB000F081C04644D8010010B5FFF74BFE10BD6E ++:106DC00070B50026D0F8A850C0F8EC6F95F82C30BC ++:106DD00004463BB12A490622F8F75EFE204601210F ++:106DE000FEF76EFA204640F24461F8F70FFE10F00D ++:106DF000010309D020463146FCF742FD022220461D ++:106E000040F23F61134607E010F0020F06D0204623 ++:106E100040F253414FF40042F8F72AFE2046194948 ++:106E20000922F8F739FE20460021FCF7D1FE204662 ++:106E3000FAF71EFF30B12046FEF7BEFC01462046A1 ++:106E4000FFF7ECFD95F8473520469B0203F47C43A1 ++:106E500040F2EB414FF48062F8F70AFEB5F84E3588 ++:106E60006BB1204640F64811FF22F8F701FE20469C ++:106E700040F64911FF22B5F85035F8F7F9FD70BD1D ++:106E800002D801008AD9010070B50C4688B00546C9 ++:106E9000F9F72AF944B92846FFF792FF2846214618 ++:106EA000FCF796FE204622E0284621460122FAF70A ++:106EB0008DF8064608B1012019E028460121FCF7AB ++:106EC00087FE0C4B4024039315230593284610237B ++:106ED00003A9079304940696FEF7FCFD2846214675 ++:106EE0004FF6FF7233460096FCF7F8FC304608B0C8 ++:106EF00070BDC04694EE010070B5002386B00293C9 ++:106F00001033049305AB009302230446ADF814102C ++:106F100001930D464E3369461646ADF8162003938D ++:106F2000FEF7D8FD2046FAF7A3FE78B3204640F6D8 ++:106F3000461140F2FF322B46F8F79AFD204640F604 ++:106F4000471140F2FF323346F8F792FD20464FF4E6 ++:106F5000156140F2FF322B46F8F78AFD204640F6D5 ++:106F6000511140F2FF323346F8F782FD204640F6D9 ++:106F7000541140F2FF322B46F8F77AFD204640F6D6 ++:106F8000551140F2FF323346F8F772FD06B070BD7E ++:106F90002DE9F04F8DB004910392D0F8A860074618 ++:106FA00006EB4303B3F872B0B3F86C10B3F8789003 ++:106FB0005A460591FFF7A0FF38464946FFF72EFDD8 ++:106FC0000723089319330A934FF000080123049D07 ++:106FD0000793C2460BAB069337E096F866252AB1B5 ++:106FE00004990AEB010313F0010F2BD153B20133C3 ++:106FF00006ACB5FBF3F303F5A073384621460993BD ++:10700000FEF766FA0B9B05994FEA8B521B0D1B0589 ++:10701000920D1A438B059B0D42EA83283846214680 ++:10702000CDF82C80FEF756FD96F9663538460133CB ++:10703000B5FBF3F303F5E07321460993CDF82C90EB ++:10704000FEF748FD01350AF1010A039A9542C4D9B9 ++:1070500096F96635C3B17F2A16D14FF4C07506ACD8 ++:10706000384621460995CDF82C80FEF733FD05F111 ++:107070008003384621460135CDF82C900993FEF760 ++:1070800029FDB5F5E07FEAD196F8810096F87E10EB ++:1070900096F87F2096F8803000903846FBF7E0FCA9 ++:1070A0000DB0BDE8F08FC04670B500210446D0F8A1 ++:1070B000A8500B467F22FFF76BFF2046FFF7E4F94D ++:1070C0002046B5F8B812B5F8BA22FBF7C9F8204641 ++:1070D00040F2D16104220023F8F7CAFC70BDC0461B ++:1070E00070B50446D0F8A8300D4699B193F8BC327B ++:1070F00033B3FFF7D9FF20460422002340F2D161C9 ++:10710000F8F7B6FC8022204640F276611346F8F785 ++:10711000AFFC15E00422134640F2D161F8F7A8FC59 ++:107120008022204640F276612B46F8F7A1FC2046EB ++:107130002946FFF773FC204629462A46FFF7DCFE66 ++:1071400070BDC04630B500238BB0089307930693FB ++:107150000733054603930A4609B9049102E04FF448 ++:10716000307304932023059309AB01930123029309 ++:107170003AB9284608A907AA06ABF9F719F9002475 ++:1071800009E0B5F902310793B5F904310693B5F971 ++:1071900006310893F3E70899069B2046079AFAF709 ++:1071A0005BFC01A909902846FEF794FC049B01347E ++:1071B0000133802C0493EED10BB030BDF0B5284BD9 ++:1071C0008BB005AC05460F460FCB84E80F0041F2AB ++:1071D0001403EB5CD5F8A8601BB196F8E034002BE3 ++:1071E0003BD028461F490822F8F756FC0723029394 ++:1071F0001933049304230193009403F54F7301247E ++:107200000393284686F86A406946FEF763FC00232C ++:10721000099309AB019400934FF4517428466946D1 ++:107220000394FEF757FC013440F25E339C42F5D1E3 ++:1072300028460D491222F8F72FFC7B009BB2284606 ++:1072400040F2A94140F2FF12F8F712FC284640F242 ++:10725000A36110220023F8F70BFC0BB0F0BDC04671 ++:1072600080DB0100B8D50100C8D5010030B5D0F8E9 ++:10727000A8509BB004460022A31893F9103501A929 ++:107280005B4241F822300132142AF5D195F86A3078 ++:1072900063B90733179319331993159103F548739D ++:1072A000204615A916921893FEF714FCD4F8A810DE ++:1072B00094F82936D1F8442420469342A8BF1346B7 ++:1072C000D1F8482440F2A7419342B8BF13469BB27D ++:1072D000FF22F8F7CDFB95F8E833F3B1B5F8E623D4 ++:1072E00094F8293620469B1A1B024FF47F42134024 ++:1072F00040F2D141F8F7BCFB94F8292695F82535E2 ++:107300002046C3EB420395F8E62340F2D1419B1A95 ++:107310005BB2FF229BB2F8F7ABFB2046FAF7AAFB61 ++:107320001BB030BD70B5C6B001ACD0F8A850064651 ++:10733000002120464FF48072EAF382F6072343933C ++:1073400019334593419495F86A3043B91E334293FB ++:1073500030464FF4507341A94493FEF7BBFB4023E2 ++:1073600042933046DB1841A94493FEF7B3FB46B085 ++:1073700070BDC0462DE9F04106460C46FAF72EFFD7 ++:10738000214605463046FAF753FC29460446304666 ++:10739000FAF74EFC4022B4F5404F0CBF13460023D1 ++:1073A000054640F2DA613046D6F8A870F8F760FB7F ++:1073B0001022B4F5404F14BF13460023304640F26C ++:1073C000A361F8F755FB0122B4F5404F14BF002329 ++:1073D0000123304640F26E41F8F74AFBA54200F027 ++:1073E0009580B5F5404F02D13046FFF79BFFB4F5CD ++:1073F000404F3CD13046FFF739FFD6F8A8203B8EEE ++:1074000092F966255B00013293FBF2F3304640F2BD ++:10741000A44140F2FF129BB2F8F72AFB7B8E304664 ++:107420001B0240F2A5414FF4E06203F47F43F8F7FA ++:107430001FFB04223046002340F21F11F8F7BAFA6E ++:10744000F369E021186939F055D90021F8853046F3 ++:10745000FAF7A4FF4FF0FF3387F83430304640F29C ++:10746000A9414FF400420133F8F702FB03E0304634 ++:107470000121FAF793FF304640F2A4414FF46042F5 ++:107480002346F8F7F5FAB4F5404F0FD13046FAF736 ++:10749000EFFB40F2A44100280CBF4FF4005300233F ++:1074A0004FF400523046F8F7E3FA15E04EF20103CC ++:1074B0009C4211D13046FAF71BFB01463046FFF7DC ++:1074C0007DFE304640F2A941F8F7A0FA0223C0B28F ++:1074D00090FBF3F087F8C10297F96735012B0DDDBA ++:1074E00040F2A4413046F8F791FAC0F3803340F2FD ++:1074F000255130464FF40042DB0305E0304640F2B0 ++:1075000025514FF400420023F8F7B2FABDE8F081AC ++:1075100070B50023D0F8A82080F82B3692F8E0341C ++:1075200005468BB190F92A16D2F84834994203DB0C ++:10753000D2F81035994207DA4EF20101FFF71AFF2F ++:10754000012385F82B3612E041F21403EB5C73B192 ++:107550002846FAF743FE002104462846FFF70AFFB3 ++:107560002846FFF783FE28462146FFF703FF70BD3C ++:1075700030B5072389B0D0F8A84003931933059399 ++:1075800006AB0193012302930546013B049308E0F7 ++:10759000284601A9FEF79EFA049B01330493069B3B ++:1075A00001330693069B7F2BF2D94FF4307304937B ++:1075B000A3F5307308E0284601A9FEF78BFA049B77 ++:1075C00001330493069B01330693069B7F2BF2D96C ++:1075D000092228465B49F8F75FFA01212846FBF7A4 ++:1075E000A5FB242228465849F8F756FA2846FAF708 ++:1075F00061FDC0F34F00E62801DDFF2305E02846CA ++:10760000FAF758FD4008193083B2FF2240F2A54135 ++:107610002846F8F72DFA2846FFF784FEB4F8E6234B ++:10762000B4F8E433284603EB42039B019BB24FF4CA ++:107630009A6147F6C072F8F71BFA092228464349B7 ++:10764000F8F72AFAB5F8DA30282103F470431E223D ++:10765000B3F5005F14BF18231C232846F8F7AAF9D6 ++:1076600001223A2113462846F8F7A4F908221346C6 ++:1076700028464FF48D71F8F79DF925210C222846F4 ++:10768000F8F752F9B5F8DA3003F47043B3F5005F58 ++:1076900004D1022228463A21134603E028463A2123 ++:1076A00002220023F8F786F908221346284605210E ++:1076B000F8F780F9284606222549F8F7EDF947F250 ++:1076C0000802284640F2D7414FF40053F8F7D0F9AA ++:1076D0002846FAF7EFFC102305930DF11E030193E2 ++:1076E00001230824ADF81E0002932846053301A9A2 ++:1076F00004930394FEF7EEF928460F221549F8F794 ++:10770000CBF928463521FF220023F8F753F9284604 ++:10771000362103220023F8F74DF928462246234656 ++:107720004FF48D71F8F746F94FF48062284640F225 ++:10773000A4411346F8F79CF92846FBF78FFA09B0E5 ++:1077400030BDC04618DA01002ADA0100ECD501008C ++:1077500032DB01003EDB01007FB5090206AB23F8F6 ++:10776000021D009301230193013B029357330393BE ++:10777000694610230493FEF7ADF907B000BDC0467B ++:107780002DE9F041D0F8A8308AB083F8341083F89E ++:10779000C11293F9663506460F466BB111F001032D ++:1077A00004D04FF48F610C22082302E04FF48F6164 ++:1077B0000C22F8F75DF97F080723039301AC07F566 ++:1077C000A07320254FF001080493304609AB2146F1 ++:1077D00001930595CDF80880FDF77AFE07F1C00307 ++:1077E000049330460DEB0503214601930595FDF703 ++:1077F0006FFE089B304603F0FF02ADF81820C3F37C ++:107800000722C3F30743ADF81C30099B06A9C3F355 ++:107810000273ADF81A20ADF81E30FAF7F7FD09999A ++:107820003046C1F30751FFF797FF30464146FAF75C ++:10783000B5FD0AB0BDE8F0812DE9F04F91B0BDF87B ++:10784000783002AC0193BDF87C3007460093534B6F ++:107850009DF880601D460FCD0FC495E80F009DF880 ++:10786000748084E80F0038464D490422BDF87090BA ++:10787000BDF884A0BDF888B0F8F70EF9384640F29C ++:10788000A36102227300F8F7F3F8B8F1000F18D0E3 ++:1078900010AB4FF4002243F8042D0A9301230B93FD ++:1078A00017330C9308330E9300230D931C46384670 ++:1078B0000AA9FEF70FF90D9B01340133402C0D93FB ++:1078C000F5D1032409FB04F43846FAF7EDFE013440 ++:1078D000384640F2A1615246F8F7A4F8A4B23846FF ++:1078E00040F2A2615A46F8F79DF82246384640F227 ++:1078F0007E61F8F797F838462A490422F8F7CCF861 ++:107900000134142304FB03F4013CA2B238464FF4C3 ++:10791000C861F8F787F80022384640F27761F8F737 ++:1079200081F808230B930D330C930B3300240E9333 ++:10793000384602AB0AA90A930D94FEF7CBF83846F5 ++:1079400040F27B61019AF8F76DF8384640F27C61AD ++:10795000009AF8F767F82246384640F27D61F8F75A ++:1079600061F821463846FFF7F7FE38460E490422F3 ++:10797000F8F792F80D4C03E00A20EEF3EDF60A3C1E ++:10798000384640F27661F8F741F810F0010F01D067 ++:10799000092CF1D111B0BDE8F08FC04694D601009A ++:1079A000B4D701006ED601006CD8010049420F0027 ++:1079B0002DE9F043D0F8A8908BB0064688460525FF ++:1079C00003270F2DA8BF0F250024ABB2019330462B ++:1079D0000121224623460094029403940494FAF76A ++:1079E0005DFDDB2302934FF4AF6304934FF48243B6 ++:1079F0000593A3F581430122079330462146234690 ++:107A000000940194039206940894FFF715FFB8F1CF ++:107A1000000F1DD140F2BA613046F7F7F7FF40F290 ++:107A2000BB6104B23046F7F7F1FFA401A4B244F3FE ++:107A3000891404FB04F440F3090000FB0043B3F590 ++:107A4000005F01DAED1B03E0B3F5804F04DBED19B5 ++:107A500017B17B1EDFB2B4E7092D01DD092501E076 ++:107A600025EAE5752846C9F838500BB0BDE8F08323 ++:107A70002DE9F043D0F8A8608DB096F96635074639 ++:107A80008846CCB2D3B1634B01EA0303002B05DA7D ++:107A9000013B6FEAC3736FEAD3730133012B04D147 ++:107AA0004FF48F610C22073303E04FF48F610C22F7 ++:107AB0000023F7F7DDFF022398FBF3F8072386F88E ++:107AC000344086F8C14201AD039308F5A073202429 ++:107AD0004FF00109049338460BAB294601930594F6 ++:107AE000CDF80890FDF7F4FC08F1C0030493384684 ++:107AF0000AAB294601930594FDF7EAFC0A9B384638 ++:107B000003F0FF02ADF81820C3F30722C3F30743C5 ++:107B1000ADF81C300B9B06A9C3F30273ADF81E3001 ++:107B2000ADF81A20FAF772FC9DF82B10384601F0D8 ++:107B30007F01FAF71FFC0B993846C1F30751FFF795 ++:107B40000BFE38464946FAF729FC0B9A3846C2F331 ++:107B500089219205920DFFF7CFF908F5E0730493A0 ++:107B6000384609AB29460193FDF7B2FC3846BDF80B ++:107B70002410FEF753FF08F51073049338460DEBFD ++:107B8000040329460193FDF7A3FC089B3846DB005C ++:107B90009BB240F2A66141F6FF72F7F769FF96F9D2 ++:107BA00067354B4532DD40F225513846F7F72EFF59 ++:107BB0004FF48072C3B29845D4BF002401243846E4 ++:107BC0009845CCBF1346002340F22551F7F750FFEC ++:107BD0006302384640F225514FF4007203F47E43AD ++:107BE000F7F746FFA302384640F225514FF4806272 ++:107BF00003F47C43E402F7F73BFF384640F225519B ++:107C00004FF4006204F47843F7F732FF0DB0BDE89B ++:107C1000F083C0460100008070B504460D46002187 ++:107C2000FFF7A8FB20462946FFF722FF70BDC0469C ++:107C30002DE9F04F89B0054600920191FAF7CEFA8E ++:107C400040F23B4103902846F7F7E0FE04A902907A ++:107C50002846FAF711FA00244FF47A700134EEF353 ++:107C60007BF5022CF8D105F597531A6892F820306D ++:107C70001F1E18BF012792F821300BB17B1C9FB249 ++:107C800092F822300BB17B1C9FB292F823300BB1DB ++:107C90007B1C9FB24FF00009C8464FF0140ABCE0AD ++:107CA000D5F8B030D3F8203183F0010313F001048C ++:107CB00003D1EB69186938F06DDD2846F8F760FBF1 ++:107CC00005F597531B68284603EB4803998CFFF78B ++:107CD000A3FF28465146FFF73FFD1CB9EB69186921 ++:107CE00038F044DD4FF40042284640F2A4411346E8 ++:107CF000F7F7BEFE002441F288300134EEF32CF594 ++:107D0000032CF8D1284640F2A641F7F77FFEC005C4 ++:107D1000C00DFF2886BFA0F580731FFA83FB00F516 ++:107D2000807B00263446284640F23E61F7F76EFE1F ++:107D3000631CC005C00D9CB23618102CF3D1C6F3DD ++:107D40000F13FF2B8CBFA3F5807303F58073504690 ++:107D500000210DF11E029EB20DF11A03F0F32AF379 ++:107D600005F597531B680021434493F8200007AAA8 ++:107D700006ABF0F31FF3BDF91A30BDF918108B42B2 ++:107D800009DABDF91C00C91AF0F3C6F3BDF81A40B0 ++:107D9000ADF81C0009E0BDF91E00C1EB0301F0F3D2 ++:107DA000BBF3BDF81840ADF81E00BDF91C10BDF9BD ++:107DB0001E00F0F3BBF323B2032B81B201DD231FBE ++:107DC00001E0C4F1040398B200B2431E01229A40BC ++:107DD00009B2052301FB032353FA00F000F10C0361 ++:107DE000182B16D805F597531B68019A03EB8803E7 ++:107DF0001B69C31802F809304FEA9B03C3F17F03E4 ++:107E0000009A03EB960302F8093009F101031FFA07 ++:107E100083F908F101031FFA83F8B845FFF440AF76 ++:107E20000AF101035FFA83FABAF1640F02D84FF046 ++:107E30000008F2E7029B2846C3F38011FAF7AEFA76 ++:107E4000284604A9FAF7E2FA28460399FFF792FABE ++:107E5000484609B0BDE8F08F2DE9F04F1E46C369D2 ++:107E6000A9B0D0F8A88004460F4698684FF48371F3 ++:107E70001546EEF32DF70790002800F0EF81022E53 ++:107E80000FD016E00E4694F8DA3011F80629013DBD ++:107E90009A420BD17188B2882046FAF7E1F901269F ++:107EA000CCE1062305FB03F3063BF918002DE9D1CD ++:107EB000C3E1012E40F0C1812046FAF78FF900217D ++:107EC00008902046FFF756FA0025934B2046E95AC2 ++:107ED000F7F712FD1AABE8520235182DF5D140F232 ++:107EE00031612046F7F792FD15220B9040F2316187 ++:107EF0002046F7F7ADFD40F24C412046F7F786FDEE ++:107F000040F24D410C902046F7F780FD4FF496610A ++:107F10000D902046F7F77AFD40F2B1410E902046D1 ++:107F2000F7F774FD40F2F9410F902046F7F76EFD28 ++:107F300040F2FA4110902046F7F768FD40F63811FC ++:107F400011902046F7F762FD40F639111290204655 ++:107F5000F7F75CFD40F23B4114902046F7F756FDE1 ++:107F600040F23C4115902046F7F750FD40F2DA61AF ++:107F700016902046F7F74AFD40F2DB611890204644 ++:107F8000F7F744FD40F2B74119902046F7F73EFD60 ++:107F900040F23B4113902046F7F738FDC0F38010C4 ++:107FA0000A9008B9099007E0204626A9FAF764F874 ++:107FB00098F8C182CDF8248020463299FFF72CFE34 ++:107FC000062220465549F7F767FDB4F8DA3003F486 ++:107FD0007043B3F5005F04D1204698210322F7F7E0 ++:107FE000A3FC20464E491922F7F756FD20464D497D ++:107FF0001822F7F751FDB4F8DA304FF0030B03F411 ++:108000007043B3F5005F14BF04230023179322E1EC ++:108010001FFA88F300931FFA89F3002601931FFAD1 ++:108020008BF3324602932046179B31460396049603 ++:10803000FAF734FA20460121FAF744F9334620468C ++:1080400039493C22FEF740FB20464FF48971324605 ++:10805000F7F76AFC20AB00934FF4FA7A20464FF40E ++:10806000806120223346CDF804A0FAF7F9FF0546D7 ++:1080700020B92E48F7F722F82F4636E0334620463F ++:1080800029497822FEF720FB20464FF489713246B9 ++:10809000F7F74AFC23AB009320464FF4806120227F ++:1080A0003346CDF804A0FAF7DBFF18B92048F7F7FC ++:1080B00005F81AE0219A24982299B0EB420F0ED9C4 ++:1080C00093009B1898420AD2259AB2EB410F06D929 ++:1080D0008B005B189A422CBF0027012700E0002785 ++:1080E000B8F1010801D3002F92D0B9F1010902D3F0 ++:1080F000002F00F0AC80BBF1010B02D3002F00F089 ++:10810000AA80204640F2D16104220023F7F7B0FC98 ++:1081100087B93E4614E0C0468ED4010072D90100F2 ++:1081200014D7010090DB010080841E0008D60100F6 ++:1081300022D6010020464FF48061FDF729F806465B ++:108140002046FEF73DFE204640F231610B9AF7F7DC ++:1081500069FC204640F24C410C9AF7F763FC20463C ++:1081600040F24D410D9AF7F75DFC20464FF49661C1 ++:108170000E9AF7F757FC204640F2B1410F9AF7F7F5 ++:1081800051FC204640F2F941109AF7F74BFC20468B ++:1081900040F2FA41119AF7F745FC204640F63811B3 ++:1081A000129AF7F73FFC204640F63911149AF7F778 ++:1081B00039FC204640F23B41159AF7F733FC204644 ++:1081C00040F23C41169AF7F72DFC204640F2DA6166 ++:1081D000189AF7F727FC204640F2DB61199AF7F767 ++:1081E00021FC204640F2B741139AF7F71BFC2046CA ++:1081F00040F24C4104220023F7F73AFC0025194BCA ++:108200002046E95A1AABEA5A0235F7F78DFB182DCA ++:10821000F5D10A9B23B120460999FFF7FDFC03E045 ++:1082200020460A99FAF7BAF820460899FFF7A2F80B ++:1082300020460021FAF746F800E00026E369079996 ++:1082400098684FF48372EEF353F5304606E000274A ++:108250004FF00608DCE64FF00409F8E729B0BDE866 ++:10826000F08FC0468ED401002DE9F04FB3B00F93CC ++:108270009DF8F8409DF8F4300D940E939DF8004160 ++:108280009DF8FC300B940C93012405461646D0F85B ++:10829000A89088469DF8F0B0BDF804718DF8C740ED ++:1082A0008DF8C640FDF702FC40F2D74112902846F7 ++:1082B000F7F7ACFB40F2D74110902846F7F7A6FB42 ++:1082C0003449119006222846F7F7E6FB2846324942 ++:1082D0000F22F7F7E1FB284621461AAAFDF786FB95 ++:1082E000284621460022FDF7F5FABBF1000F02D027 ++:1082F0000023199318E028462146FBF769FCD5F8BE ++:10830000B030D3F8203183F0010313F00103199347 ++:108310000AD1EB69B821186942F2107238F008DA14 ++:10832000EB69186938F036DA28460121F9F7CAFFF7 ++:1083300028460121FBF7A4FA28460121FAF730F973 ++:1083400040F2EA412846F7F761FB40F2EB41179013 ++:108350002846F7F75BFB40F2EB4118902846F7F709 ++:1083600055FB00F0070340F2EB4128463822DB00C2 ++:10837000F7F77EFB28462DA999F8C1A2F9F77CFEF4 ++:1083800086B1337A53B12846717AFFF745FC96F8E7 ++:1083900009A007E038D801006ED701002846314611 ++:1083A000FAF734F840F29C412846F7F72FFB40F2E9 ++:1083B000316113902846F7F729FB40F2D6611590FA ++:1083C0002846F7F723FB40F2DA6114902846F7F7C6 ++:1083D0001DFB002116902846FAF72AFA28468849FC ++:1083E0000722F7F759FB2FAB23930123249306337E ++:1083F000259376B199F96625737A013293FBF2F3EE ++:1084000003F5107326932846202323A92793FDF70D ++:108410005FF82F9A2846D2002F9240F2716192B2F3 ++:10842000F7F700FB284677490C22F7F735FB0024C5 ++:10843000754B284633F81410F7F75EFA0DF1A203D6 ++:10844000E0540134122CF3D1072228464FF48B71EB ++:10845000F7F76AFAB5F8DA3003F47043B3F5005F62 ++:1084600005D1284640F22D110122F7F75DFA0722C7 ++:1084700028464FF49671F7F757FAB5F8DA3003F457 ++:108480007043B3F5005F14D128466A21C222F7F782 ++:108490004BFA284698210C22F7F746FA284640F274 ++:1084A0002F110322F7F740FA28469721F922F7F710 ++:1084B0003BFA0B2107222846F7F736FA1022284606 ++:1084C00040F21311F7F730FA1D2101222846F7F781 ++:1084D0002BFA012228464FF48A71F7F725FAB5F8EE ++:1084E000DA3003F47043B3F5005F04D128462E213F ++:1084F0001022F7F719FA082228464FF49571F7F77A ++:1085000013FA092102222846F7F70EFA042213462D ++:10851000284640F21F11F7F74DFAFF2110220023E1 ++:108520002846F7F747FA0721012200232846F7F7E4 ++:1085300041FA0521082200232846F7F73BFA4FF4B9 ++:1085400000421346284640F2DA61F7F791FA4146B5 ++:108550000F9A53462846FFF72BFA002480B20121D8 ++:1085600001902246284623460094029403940494E2 ++:10857000F9F794FF0E9BA74208BF4FF48247009380 ++:108580000D9B284601930C9B414602930B9B224670 ++:1085900003934FF4AF630493A3F59F6307935B4684 ++:1085A000059706940894FFF747F90DF1C60228468F ++:1085B0000DF1C701F9F79AFC9DF8C6203F2A53D860 ++:1085C0009DF9C730A3424FDB3F2B4DDC52B29A429C ++:1085D0004ADCB8F1000F27D123AC1823214625939C ++:1085E000284630AB26922393FCF772FF9DF9C730E3 ++:1085F00021462846309E2693FCF76AFF44460EE04B ++:108600007ED601008CD701005CDB010030AB284630 ++:1086100023A9269430962393FDF75CFA01349DF943 ++:10862000C62063B29A42F1DC182323AC259326338B ++:108630002693284630AB21462393FCF749FF3F237E ++:10864000284621462693FDF745FA01232846214670 ++:108650002693FCF73DFF0023284621462693FDF78D ++:1086600039FA2846FDF72EF8284640F2EA41179AD3 ++:10867000F7F7D8F9284640F2EB41189AF7F7D2F904 ++:108680002846D72102220023F7F794F9082213463F ++:108690002846D721F7F78EF9002328464FF4947126 ++:1086A0000822F7F787F928464FF48B710022F7F775 ++:1086B0003BF9284640F29C41139AF7F7B3F9284654 ++:1086C00040F23161159AF7F7ADF9284640F2D661CC ++:1086D000149AF7F7A7F9169C284644F0010292B2C3 ++:1086E00040F2DA61F7F79EF928460121FAF7A0F87F ++:1086F000109C082204EA0203284640F2D741F7F70B ++:10870000B7F9119C4FF4E04204EA0203284640F214 ++:10871000D741F7F7ADF92846FAF73EFD0024234B81 ++:10872000284633F814100DF1A203E25C0134F7F788 ++:10873000FBF8122CF3D14FF400620023284640F2DC ++:108740004C41F7F795F928460021FBF799F82846A0 ++:108750000021F9F7B7FD284640F23B4101220023F2 ++:10876000F7F786F900234FF40062284640F63811E7 ++:10877000F7F77EF928460021FBF72AFA2846002160 ++:108780001AAAFDF733F9284609490F22F7F784F9A9 ++:10879000199B1BB9EB69186937F0E8DF2846129975 ++:1087A000FEF7DAFF33B0BDE8F08FC0465CDB0100B6 ++:1087B000A0DC01002DE9F04FD0F8A83091B093F87B ++:1087C000F49318230C930FAB0A9320230E930123E9 ++:1087D00017460B9301FB01FB3E3305210022804627 ++:1087E000B9F1FF0F08BF4FF001090D9307910992EE ++:1087F00006230024039347F6FF733A4601250593A9 ++:108800004046234621460094019402940495FFF7C4 ++:108810002BFD40460AA9FCF75BFE0F9A42F30B338F ++:1088200003FB03F342F30B0202FB02327B7A5A454D ++:10883000069303D307990894CEB206E0B9F1000F6E ++:108840004DD1079908954B42DEB273B206999DB29D ++:108850006B189CB24FF0000A06990AEB01030899C5 ++:108860009BB221B15A4506D99B1B7B722DE0089B18 ++:108870000BB95A4529D322B27F2A26DC0AEB05031D ++:10888000002A1FFA83FA20DB06237C72039301235C ++:108890000021049347F6FF733A46059340460B4682 ++:1088A000009101910291FFF7DFFC40460AA9FCF715 ++:1088B0000FFE0F9A42F30B3303FB03F342F30B0259 ++:1088C00002FB023263199CB2C6E70799099A41F389 ++:1088D00046030132DBB2032A0793099288D111B013 ++:1088E000BDE8F08F2DE9F04F8DB0DDF858A01F46A0 ++:1088F0000123834616468AF808304FF000094FF0EE ++:10890000640808EB09030021C3F34F05DB238AF851 ++:10891000095001245246039358460B460091019199 ++:10892000029105910494FFF79FFC182308932733C5 ++:1089300009930BAB06935846202306A90A93079484 ++:10894000FCF7C6FD0B9B43F30B3202FB02F243F331 ++:108950000B0303FB03231A464FEAE273BB4202D820 ++:1089600003D1B24201D9A94600E0A8460B484FF016 ++:10897000FF31801941EB07018B4202D806D18242B8 ++:1089800004D99F4206D801D1964203D8C9EB080307 ++:10899000012BB6DC28460DB0BDE8F08F30F8FFFFA4 ++:1089A000F7B50546D0F8A87090F8DA000E46F7F74C ++:1089B0003FFA40F6B41398420446B5F8DA2001D1E4 ++:1089C0001E480AE0D3B2012B02D14FF4523004E02A ++:1089D0000302A3F5C420A0F5806000224FF47A7151 ++:1089E000F9F71AF8A0FB002328460096FFF77AFF54 ++:1089F000A0F128039BB21D2B1BD9272802D84FF4C6 ++:108A000034300BE040F6B4139C4202D14FF4703086 ++:108A100004E02302A3F5BE20A0F5007000224FF46D ++:108A20007A71F8F7F9FFA0FB002328460096FFF7BC ++:108A300059FF031F87F8C232FEBDC046008E0300F7 ++:108A40002DE9F04390F8DA30D0F8A8608BB086F8C2 ++:108A5000BC32D0F8B0300546D3F8203183F00103A2 ++:108A600013F001090AD1C369B821186942F21072E2 ++:108A700037F05EDEEB69186937F08CDE40F2A54115 ++:108A80002846F6F7C3FF04462846F9F7A7FB00215E ++:108A900080462846FEF76EFC4FF440412846FEF71C ++:108AA00069FC2846FEF73EFCD5F8A8202846D2F8F7 ++:108AB0004434D2F84824402BA8BF40239342B8BF87 ++:108AC000134640F2A741FF229BB2F6F7D1FF0023E5 ++:108AD000284640F2A5414FF4E062F6F7C9FF4FF493 ++:108AE0007A7232212846FBF7ADF80121284696F824 ++:108AF000C072FBF76DF82846F7F742FC4FF4E062CE ++:108B000004EA0203284640F2A541F6F7B1FF00212E ++:108B10002846FEF72FFC96F8C4420DF11E0E012CDC ++:108B200035D171462846FFF73BFF28462146FDF721 ++:108B3000D9FBD5F8A8202846D2F84434D2F84824E6 ++:108B40003E2BA8BF3E239342B8BF134640F2A74135 ++:108B5000FF229BB2F6F78CFF0023284640F2A54186 ++:108B60004FF4E062F6F784FF284632214FF47A7220 ++:108B7000FBF768F896F8C032DBB996F8C23228469F ++:108B8000043386F8C2322146FDF7ACFB11E0002128 ++:108B90000122DB238DF82620039304922846724697 ++:108BA0000B468DF827700091019102910591FFF716 ++:108BB0005BFB28464146FEF7DDFB284608490422B8 ++:108BC000F6F76AFFB9F1000F03D1EB69186937F0C6 ++:108BD000CDDD28460021FAF7FBFF0BB0BDE8F0839E ++:108BE00076D601002DE9F04F044695B0D0F8A86084 ++:108BF00040F2E7300F46EDF3AFF507212046F6F7D8 ++:108C00007BFEC0B20390FF212046F6F775FEC0B28E ++:108C1000049040F21F112046F6F76EFEC0B2059098 ++:108C200005212046F6F768FE25215FFA80FB2046E5 ++:108C3000F6F762FE4FF489715FFA80FA2046F6F784 ++:108C40005BFE00250190864B2046E95AF6F7DEFED2 ++:108C500007ABE85202351C2DF5D1D4F8B030D3F86B ++:108C6000203183F0010313F00103029303D1E36980 ++:108C7000186937F08FDD40F2A4412046F6F73CFE3C ++:108C8000002181462046FEF775FB7F21204696F89D ++:108C9000C182FEF7C1FF0122072113462046F6F7E5 ++:108CA00089FE1022FF2113462046F6F783FE042298 ++:108CB0001346204640F21F11F6F77CFE362220466E ++:108CC0006849F6F7E9FE2046F9F7F4F9C0F34F00DA ++:108CD000E62801DDFF2305E02046F9F7EBF940081F ++:108CE000193083B2FF22204640F2A541F6F7C0FEBC ++:108CF00025210C222046F6F717FE082213460521EF ++:108D00002046F6F757FE092257492046F6F7C4FEDB ++:108D10002046F9F7CFF9102312930123ADF84E0046 ++:108D200008260F9306250DF14E0320460EA9109636 ++:108D30000E931195FCF7CEFE012F0CD12A4620464A ++:108D40004A49F6F7A9FE2022204682211346F6F76B ++:108D500031FE042506E02A4620464549F6F79CFEEA ++:108D600007260A250122134620464FF49B61F6F799 ++:108D70007FFE45F4007343EA06139B0020464FF440 ++:108D80009B6140F6FC72F6F773FE02221346204602 ++:108D90004FF49B61F6F76CFE20464FF49B614FF455 ++:108DA000E0424FF40053F6F763FE202213462046BC ++:108DB0004FF49A61F6F75CFE012100222046F8F795 ++:108DC000E3F9204640F27641F6F720FE10F4004F1A ++:108DD00002D10A20EDF3C0F420460721039AF6F7EA ++:108DE000A3FD2046FF21049AF6F79EFD204640F29F ++:108DF0001F11059AF6F798FD204605215A46F6F709 ++:108E000093FD204625215246F6F78EFD019B204614 ++:108E10004FF48971DAB2F6F787FD0025104B204632 ++:108E2000E95A07ABEA5A0235F6F7FCFD1C2DF5D1DD ++:108E300020464FFA88F1FEF7EFFE204640F2A441AB ++:108E40004A46F6F771FD029B1BB9E369186937F0D2 ++:108E50008DDC40F2E730EDF37FF415B0BDE8F08F24 ++:108E600050D801000ADC010076DC010088DC01003A ++:108E700094DC01002DE9F04FBDB007460C46914649 ++:108E8000002116220DF15E000493E9F3D9F0A84900 ++:108E90000E220DF19E00E9F36FF0A6490E2224A8E0 ++:108EA000E9F36AF048F2670148F24522ADF8EA10AA ++:108EB000ADF8E820A04908220DF1C600E9F35CF006 ++:108EC0009E490E220DF18200E9F356F09C490822DA ++:108ED0000DF1BE00E9F350F09A490E221DA8E9F306 ++:108EE0004BF047F69733002108220DF1B600ADF89C ++:108EF000E630ADF8E430E9F3A3F0FB69302198687F ++:108F0000D7F8A880EDF3E4F60590002800F0AB82D6 ++:108F100040F2DB613846F6F779FD40F2DA610B90FA ++:108F20003846F6F773FD88490A9004223846F6F76A ++:108F3000B3FDB9F1070F0BD8DFE809F011040A0AF5 ++:108F40000A22352D1DAA069224AB0DF15E0214E013 ++:108F50000DF18202002306921A46079319E00021C0 ++:108F60000A460B4638460091F9F77AFD0DF1820169 ++:108F700006910DF15E020DF19E03072107933EE07D ++:108F80000DF1E6030DF1EA01069308F18202079163 ++:108F900001230E9334E039A906913AAB08F182021D ++:108FA000012107932BE03BAB00930DF1EF010DF195 ++:108FB000EE020DF1ED033846F9F750FC9DF8EF2075 ++:108FC0009DF8EE300DF1BE0143EA02234FF000029E ++:108FD000ADF86C30ADF86E209DF8EC309DF8ED20CA ++:108FE000069143EA0223ADF870304FF00003ADF86C ++:108FF00072300DF1C6030DF15E02079304210E914C ++:109000001023009330330193504B002102933846D4 ++:109010000B23F6F7B1FE05224D493846F6F73CFD25 ++:109020003846F9F7DBF84FF480521346089040F2C7 ++:10903000A4413846F6F71CFD00213846FEF79AF9A0 ++:1090400040F2DB413846F6F7E1FC4249062209903E ++:109050003846F6F721FDB7F8DA3003F47043B3F57C ++:10906000005F07BF38463C4938463C491222F6F7B4 ++:1090700013FD40F2D7413846F6F7C8FC0599119028 ++:109080003846FBF7BDFE384640F23B41F6F7BEFCE2 ++:10909000C0F380100C9020B138460DF1B601F8F7FE ++:1090A000EBFF64B90C9A22B93846B8F83010FEF7D5 ++:1090B000B3FD0DF1CE0438462146F8F7DDFF638895 ++:1090C00022881B0143EA0223A288214613439EB251 ++:1090D000B7F8DA30082203F470430DF1D600B3F587 ++:1090E000805F14BF00250125E8F346F70A222BA86C ++:1090F0000021E8F3A5F71A4B002233F8154010467B ++:1091000033E0184B53F82530C1180B881230B342A6 ++:109110002AD14B882BA8ADF8D6308A88ADF8D82054 ++:1091200031F8063F0A22ADF8DA30E8F325F71EE001 ++:1091300030DD01000ED801001CD801001ADB01004F ++:10914000D8DB010022DD0100BCD70100D55A0100A7 ++:109150009AD50100A4D50100B4D60100F4D90100CC ++:1091600028DB0100D8D901000132A242C9D138461A ++:109170000DF1D601F9F74AF900240422384637499F ++:10918000374DF6F789FC10260A2338462146354A22 ++:10919000009601940295F6F7EFFD202301933846DF ++:1091A0000A2321462F4A00960295F6F7E5FD40F284 ++:1091B0005341384640F2A472F6F734FCB8F8C813AD ++:1091C00040F6A663A14208BF1946B9F1050F01D1C7 ++:1091D0004B4299B2D7F8EC3F0CB22BB13846FDF7B1 ++:1091E000EFFD0520EDF3B8F24FF47A710123582218 ++:1091F000384604FB01F1FDF767FA40F2DA614FF6F9 ++:10920000FF723846F6F70EFCB7F8DA30384603F44A ++:109210007043B3F5005F0CBF98F8959598F8969554 ++:10922000F8F7B6FF0021C0B2FF228B4610900D91D7 ++:109230000F929AE04FF000030799ADF8E0303BF849 ++:109240000130C3F30324B9F1000F1AD0042C0BD062 ++:109250000F9A042A13D110990EE0C04606DD0100D2 ++:10926000D55A010010D90100109901EB0903D9B2B8 ++:1092700011F0800F18BF7F213846FEF781FAE2B265 ++:109280000F92069B3CA93BF8032001EB440333F803 ++:10929000441C21B102F0FF0343EA01239AB238468D ++:1092A00040F25241F6F7BEFBE31E1FFA83FABAF111 ++:1092B000010F16D86D4B1025452402933846002126 ++:1092C0000DF1E202012300950194F6F747FD684B8A ++:1092D00038460293002138AA012300950194F6F73D ++:1092E0004BFD079B384640F251413BF80320F6F70F ++:1092F00099FB3846F9F730FF00287CD05B4A6021A3 ++:1093000012AC10250B23019102920021384622460F ++:109310000095574EF6F722FD4023019300210B23C1 ++:109320003846224600950296F6F726FDBAF1010F5F ++:109330000AD845230193384600210DF1E2020123AA ++:1093400000950296F6F718FD4849602301930291B3 ++:1093500008F18202384600210B230095F6F7FEFC47 ++:109360000D9A0BF1020B01320D920D9B0E998B425F ++:109370007FF460AF602301933C4B08F18206102418 ++:1093800002933846002132460B23394D0094F6F7FC ++:10939000E5FC4FF001025023A8F8982038460193CD ++:1093A00000213246042300940295F6F7E5FC55238C ++:1093B00001933846002108F18C02022300940295A3 ++:1093C000F6F7DAFC3846F8F753FCA0B138A90DF1EE ++:1093D000DE023846FCF750FB3846FCF7EDF9BDF8E5 ++:1093E000E0100446BDF8DE203846FDF785FD38461E ++:1093F0002146FDF713FB049B13B93846FDF7E0FC4B ++:1094000038460599F9F716FB384640F2D741119ACC ++:10941000F6F708FBFB69059998683022EDF368F4CC ++:10942000384640F2DB41099AF6F7FCFA40F2534124 ++:1094300038460022F6F7F6FA0C9921B138460DF1BC ++:10944000B601F8F7E3FF38460899FDF793FF384671 ++:1094500040F2DA610A9AF6F7E5FA384640F2DB6143 ++:109460000B9AF6F7DFFA3DB0BDE8F08FD15401005A ++:10947000D55A01002DE9F0470546D0F8A8404FEA3B ++:109480000118F8F785FE40F2D74147B22846F6F7B3 ++:10949000BDFA94F925258146B2F1FF3F11D004238E ++:1094A00092FBF3F3984505DA284640F2D741402273 ++:1094B000002304E04022284640F2D7411346F6F745 ++:1094C000D7FAD5F8EC3F53B12846FDF779FC0520D3 ++:1094D000EDF342F11C4928467022002302E01A49AC ++:1094E00028467022FDF7F0F828463946FEF794FB2F ++:1094F000002601212846FBF76DFD0423C8EB00047C ++:109500007A1E94FBF3F3D2187F2AA8BF7F2222EAA7 ++:10951000E277284639460434FEF77EFB082C03D94F ++:109520000A2E01D00136E4E72846FDF749FC28461B ++:1095300040F2D7414A46F6F775FA2846F8F728FE72 ++:1095400040B2BDE8F087C04600093D002DE9F04378 ++:1095500091B08046D0F8A860F8F71AFE1C23B8F83E ++:10956000DA208DF83B3001238DF83A3002F4704355 ++:10957000B3F5805F5FFA80F907D1D3B2402B01D8F1 ++:109580001B2300E02D238DF83B30B8F8DA2002F4DD ++:109590007043B3F5005F33D1B6F82A2513B2B3F1A7 ++:1095A000FF3F04D04FF6FF73002A08BF1A46B6F8F3 ++:1095B000F6130BB2B3F1FF3F02D14FF4917104E007 ++:1095C0004FF6FF73002908BF1946B6F82C5596F8D8 ++:1095D000F0032BB2B3F1FF3F04D04FF6FF73002D21 ++:1095E00008BF1D46B6F8F84323B2B3F1FF3F04D0DD ++:1095F0004FF6FF73002C08BF1C4696F8F1739FE0EE ++:10960000D3B2402B33D8B6F82E2513B2B3F1FF3FB7 ++:1096100004D04FF6FF73002A08BF1A46B6F8FA13B3 ++:109620000BB2B3F1FF3F02D14FF4917104E04FF65A ++:10963000FF73002908BF1946B6F8305596F859054A ++:109640002BB2B3F1FF3F04D04FF6FF73002D08BFDC ++:109650001D46B6F8004423B2B3F1FF3F04D04FF6E5 ++:10966000FF73002C08BF1C4696F85B7568E08C2BD6 ++:1096700033D8B6F8322513B2B3F1FF3F04D04FF61A ++:10968000FF73002A08BF1A46B6F8FC130BB2B3F1F9 ++:10969000FF3F02D14FF4917104E04FF6FF730029B0 ++:1096A00008BF1946B6F8345596F8F2032BB2B3F159 ++:1096B000FF3F04D04FF6FF73002D08BF1D46B6F8DC ++:1096C000024423B2B3F1FF3F04D04FF6FF73002CE6 ++:1096D00008BF1C4696F8F37332E0B6F8362513B28D ++:1096E000B3F1FF3F04D04FF6FF73002A08BF1A46BC ++:1096F000B6F8FE130BB2B3F1FF3F02D14FF49171F4 ++:1097000004E04FF6FF73002908BF1946B6F8385534 ++:1097100096F85A052BB2B3F1FF3F04D04FF6FF7312 ++:10972000002D08BF1D46B6F8044423B2B3F1FF3F35 ++:1097300004D04FF6FF73002C08BF1C4696F85C75EA ++:1097400013B2B3F1FF3F04D040461946FFF792FE33 ++:109750000DE009B2B1F1FF3F07D040460DF13202F2 ++:10976000FFF728F89DF83B3007E0FF2802D086F885 ++:10977000070404E09DF83B300BB186F8073429B2AA ++:10978000B1F1FF3F05D04046FFF774FE86F80804AC ++:1097900011E021B2B1F1FF3F09D040460DF1320294 ++:1097A000FFF708F89DF83B3086F8083403E0FF2FF8 ++:1097B00018BF86F8087496F9EF33B3F1FF3F1CBF6A ++:1097C0004FF0FF3386F8083496F8080441B2B1F13F ++:1097D000FF3F76D096F8072453B29942D8BF86F857 ++:1097E000082496F80834D8BF86F8070400248DF8BA ++:1097F0003B30DB23012503934046234621460DF1F0 ++:10980000320204950094019402940594FEF72CFD15 ++:1098100018230993083308950B93254607AC0FAB23 ++:109820004046214607930A95FBF752FE05F1400397 ++:109830004046214601350A93FCF74CF9402DEDD105 ++:1098400096F9072496F908349B18022293FBF2F349 ++:10985000A6F86835B8F8DA2002F47043B3F5005F73 ++:1098600002D1B6F85E3583B9D3B2402B05D8B6F82D ++:10987000602512B1A6F8682509E08C2B02D8B6F84D ++:10988000623513B9B6F864350BB1A6F868354046B1 ++:1098900040F224514FF400420023F6F7E9F896F91C ++:1098A0006625B6F86835013293FBF2F39BB2404669 ++:1098B00040F22551FF22F6F7DBF8022386F86735E0 ++:1098C00029E0012386F86735404640F22551FF2202 ++:1098D0007E33F6F7CDF8404640F225514FF48072C2 ++:1098E0000023F6F7C5F8404640F225514FF40072C8 ++:1098F0000023F6F7BDF8404640F225514FF4806250 ++:109900000023F6F7B5F8404640F225514FF40062C7 ++:109910000023F6F7ADF84FF00003A6F86A3540468D ++:1099200040F2255196F96645F6F770F80134C0B259 ++:1099300004FB00F496F96635A6F8684513B1404675 ++:10994000FCF72CFD96F8EF330DF13202FF2B08BF28 ++:1099500096F8073400218DF83B30DB230393012375 ++:10996000049340460B460091019102910591FEF748 ++:109970007BFC40464946FEF74FF9404640F2716194 ++:10998000F6F744F8B6F96A3540F27161A0EBC3020C ++:1099900092B24046F6F746F84046FBF793FE11B008 ++:1099A000BDE8F08370B58E46BEF1FF3F0546144614 ++:1099B00019469DF9106002D006EB0E010DE022B9A8 ++:1099C00090F82916FFF756FD02E0B2F1FF3F04D0F0 ++:1099D00021462846FFF74EFD81192846FEF71CF95F ++:1099E00070BDC0462DE9F04F87B00446F8F7F6FB8E ++:1099F00004A981462046D4F8A850F8F73DFB20463C ++:109A0000F8F7BEFB40F2D74183462046F5F7FEFF4C ++:109A100003902046FCF74AF88246B9F1000F02D0C5 ++:109A2000FF23029304E02046F8F7B2FB40B2029015 ++:109A3000B4F8DA304FF02A0803F47043B3F5005F4E ++:109A40000CBF95F81E1595F81F1520464FB23946E4 ++:109A50000F223C23CDF80080FFF7A4FF95F8466560 ++:109A6000002E00F09080204640F2EB41F5F7CEFF4B ++:109A70001221C0F3402301222046F5F79BFF6A78AC ++:109A80000021521A18BF01220B462046FFF7F2F9B7 ++:109A90002046FBF791FE40F3072340B2A5F84A3574 ++:109AA000A5F84C0540F2EB412046F5F7AFFFC0F3B7 ++:109AB00080235B02204640F2EB414FF40072F5F741 ++:109AC000D7FF002107220B462046FFF7D3F9204697 ++:109AD000FBF772FE40F3072340B2A5F84E35A5F818 ++:109AE0005005FF222046B5F84A3540F65211F5F7E9 ++:109AF000BFFF2046FF22B5F84C3540F65311F5F76D ++:109B0000B7FF2046FF22B5F84A3540F65611F5F763 ++:109B1000AFFF2046FF22B5F84C3540F65711F5F758 ++:109B2000A7FF2046FF22B5F84E3540F64811F5F75D ++:109B30009FFFFF222046B5F8503540F64911F5F752 ++:109B400097FF95F84A3595F84C15204641EA0321D0 ++:109B5000FCF764FF95F8473520469B0240F2EB4145 ++:109B60004FF4806203F47C43F5F782FF95F84835A3 ++:109B700020465B0240F2EB414FF4007203F47E4357 ++:109B8000F5F776FF10E0204639460F223C23CDF84A ++:109B90000080FFF707FF6A7820463146003A18BF79 ++:109BA00001223346FFF766F92046F8F74FF810B167 ++:109BB0002046FBF715FE00217F220B462046FCF7CE ++:109BC000DDFC20465146FDF7C7FD20465946F8F713 ++:109BD000D1FB204604A9F8F719FC204640F2D741F2 ++:109BE000039AF5F71FFFB9F1000F04D0204649464C ++:109BF000FDF7C0FB03E020460299FEF70DF807B021 ++:109C0000BDE8F08F2DE9F04F89B00446D0F8A87078 ++:109C1000F8F7E4FA04902046F8F7BAFA4FF489719D ++:109C20005FFA80FA2046F5F767FE07210590204687 ++:109C3000F5F762FEFF2101902046F5F75DFE40F248 ++:109C40001F1102902046F5F757FE40F2AB410390FA ++:109C50002046F5F7DBFED4F8B030D3F8203183F09E ++:109C6000010313F0010B03D1E369186936F092DDAB ++:109C700000212046FDF77EFB2046F6F781FB40F2EF ++:109C80003B412046F5F7C2FE0DF1180949468046D2 ++:109C90002046F8F7F1F920460121F8F77FFB20462E ++:109CA0007F21FDF7B9FF0122134620460721F5F772 ++:109CB00081FE102213462046FF21F5F77BFE042289 ++:109CC000134640F21F112046F5F774FE2046FDF7BB ++:109CD0004FFC06224B492046F5F7DEFE2046FBF7F7 ++:109CE000E5FE002106462046FDF736FD002220460F ++:109CF0000121F7F749FA40F2AB412046F5F786FE1D ++:109D000040F23E612046F5F781FEC505ED0D2B467C ++:109D1000204640F2A64140F2FF12F5F7A9FE97F85F ++:109D2000E8330BB3204638490922F5F7B5FE002287 ++:109D300020460121F7F728FA40F2AB412046F5F71B ++:109D400065FE40F23E612046F5F760FEC30540F235 ++:109D50009A41204640F2FF12DB0DF5F789FE2046BE ++:109D60002A490922F5F798FE2B46204640F2A641E3 ++:109D700040F2FF12F5F77CFE00234FF4805220469C ++:109D800040F24C41F5F774FE20463146FDF7E4FC05 ++:109D90002046C8F38011F8F701FB20464946F8F742 ++:109DA00035FB20465146FDF737FF20460499FDF765 ++:109DB000E1FA20464FF48971059AF5F7B5FD019D4A ++:109DC000012205EA020320460721F5F7F3FD029D73 ++:109DD000102205EA02032046FF21F5F7EBFD039D63 ++:109DE0000422204640F21F1105EA0203F5F7E2FDC6 ++:109DF000BBF1000F03D1E369186936F0B7DC09B095 ++:109E0000BDE8F08FE0D80100ECD80100FED80100D9 ++:109E10002DE9F3410446F8F7E1F9E369D4F8A850D5 ++:109E20001B6A0026C4F8F03F94F8DA30804685F8C3 ++:109E3000BC32D4F8B03084F8F46FD3F8203183F01A ++:109E4000010313F001070AD1E369B821186942F24E ++:109E5000107236F06DDCE369186936F09BDC204641 ++:109E60000121F9F7B5FE0F2223492046F5F714FE2C ++:109E70002046F8F779FD20463146FCF7CFFD204615 ++:109E800031463246FDF738F82046F6F779FA41F2C6 ++:109E90001403E35C6BB12046FFF7B4FE2046314665 ++:109EA000FDF750F995F8E8331BB120460121FDF785 ++:109EB00049F92046FFF796FD00217F230A460093CB ++:109EC00020460123FDF7C8FF4FF0FF3385F8073424 ++:109ED00085F808342046FFF739FB20464146FDF758 ++:109EE00049FA20460021F9F773FE1FB9E3691869A2 ++:109EF00036F03CDCBDE8FC819CD90100082910B596 ++:109F000003D00A2904D0022904D1FFF781FF01E020 ++:109F1000FEF796FD10BDC04610B50446F6F730FAC0 ++:109F200020460021FDF726FA20460821FFF7E6FF2C ++:109F300010BDC04670B590F8F43F0446D0F8A85064 ++:109F400013B9F7F713FFE8B1D4F8F83013F0070F9F ++:109F500006D194F8F5301BB920460921FFF7CEFF52 ++:109F6000D4F8F82012F00F0F0CD194F9FC3F4BB944 ++:109F700012F0800F06D194F8F5301BB9204602216B ++:109F8000FFF7BCFFD4F8F83013F00E0F02D12046D3 ++:109F9000F9F758F9D4F8F83013F0060F3ED1D5F898 ++:109FA000340448B3E169D5F838240B6A9B1A83421C ++:109FB00034D308696A2136F09DDB400081B2B1B12B ++:109FC000E369186936F096DB88B940F2764120469D ++:109FD000F5F71CFDC005C00DA5F86C0540F27741F2 ++:109FE0002046F5F713FDC005C00DA5F86E05204607 ++:109FF0000021F9F751FF11E040F276412046F5F7D4 ++:10A0000005FDC005C00DA5F86C0540F2774120465E ++:10A01000F5F7FCFCC005C00DA5F86E052046F8F765 ++:10A02000DDF8B0F5404F0CD02046F8F7B1F8C0B2DB ++:10A0300020B100237F2885F8563402D0002385F80C ++:10A04000573470BD2DE9F047CCB20746D0F8A86070 ++:10A0500020468946F5F7ECFE494680463846F5F736 ++:10A06000C9FE3846B7F8DA10FBF75AF90422384629 ++:10A070005B49F5F711FD21463846FAF7BBF90A208E ++:10A08000ECF36AF34FF4004213464FF4896138460B ++:10A09000F5F7EEFC3846F8F793FB052100224FEA6E ++:10A0A0004800F7F7B9FC0022054641464FF420105E ++:10A0B000F7F7B2FC40F257610446AAB23846F5F70A ++:10A0C000B1FC38464FF4CB61A2B2F5F7ABFC4FF4CC ++:10A0D000007338464FF489614FF44072F5F7C8FCBD ++:10A0E00097F8DA300E2B01D11E2206E0B6F8622076 ++:10A0F00013B2B3F1FF3F08BF1522A6F8402538463A ++:10A10000002112B2FBF7E6FB20B1384600211422F1 ++:10A11000FBF7E0FB97F8DA3038220E2B0CBF182340 ++:10A120000023384640F2EB41F5F7A2FCB7F8DA30ED ++:10A13000384603F47043B3F5005F0CBFB6F86620F1 ++:10A14000B6F86820012113B2B3F1FF3F08BF022225 ++:10A15000A6F83E2512B2FBF7BDFB1822384621496E ++:10A16000F5F79AFC3846F6F71BF996F8BC2298B139 ++:10A170000E2AB7F8DA3003D9DBB20E2B03D805E08C ++:10A18000DBB20E2B02D83846012101E0384600210F ++:10A190004A46FCF7A5FF21E097F8DA309A4201D150 ++:10A1A000012A04D138460821FFF7A8FE02E038460C ++:10A1B000FCF77AFF00210A463846FBF757FD384680 ++:10A1C000F9F7BCF938460121F9F770FA41F21403A6 ++:10A1D000FB5C1BB138460321FBF70EF9BDE8F087A5 ++:10A1E0008CD60100A6D40100D0F8B03073B5D3F8F6 ++:10A1F0002031044683F0010313F00106D0F8A85083 ++:10A2000003D1C369186936F0C5DA41F21403E25C80 ++:10A2100042BBB4F8DA3003F47043B3F5005F08D101 ++:10A220004FF00403ADF800304FF00C03ADF80230EE ++:10A2300007E04FF0FF03ADF80030ADF802304FF00B ++:10A24000F00320466946ADF80430ADF80620F8F773 ++:10A25000DDF820469621FDF77FFA20460121FEF722 ++:10A26000C1FC56E02046FFF7CDFC2046FDF75AF82A ++:10A2700020460021FCF766FF204635490F22F5F7FE ++:10A280000BFC95F8E833DBB120460121FCF75AFFBF ++:10A2900095F92435204640F2D141FF229BB2F5F7D3 ++:10A2A000E7FB95F82535204640F2D1414FF47F4237 ++:10A2B0001B02F5F7DDFB204626490C22F5F7ECFBE7 ++:10A2C000052220462449F5F7E7FBD4F8A8202046CC ++:10A2D000D2F84434D2F848243C2BA8BF3C23934204 ++:10A2E000B8BF134640F2A741FF229BB2F5F7C0FB6F ++:10A2F000B4F8DA30204603F47043B3F5005F0CBFC6 ++:10A3000095F8543495F855344FF440412B86FDF7B9 ++:10A3100031F840F276412046F5F778FBC005C00DD4 ++:10A32000A5F86C0540F277412046F5F76FFBD5F8AC ++:10A330003434C005C00DA5F86E051BB120460121BF ++:10A34000F9F7AAFD1EB9E369186936F00FDA7CBD8A ++:10A3500072DA010090DA0100A8DA01002DE9F0417B ++:10A36000D0F8A860012386F86130013B86F8C0333D ++:10A37000B0F8DA30074603F47043B3F5005F02D15A ++:10A3800096F8C13304E0B3F5805F06D196F8C23386 ++:10A39000022B02D1012386F8C033B7F8DA303846F1 ++:10A3A00003F47043B3F5805F0CBF96F8EB3396F877 ++:10A3B000EA33002486F8E933738B0125A6F8BE3210 ++:10A3C00004222349347086F8C24286F8C34286F8D4 ++:10A3D000C44286F86755F5F75FFB38462946F8F71B ++:10A3E00027FA04221B493846F5F756FB3846FCF796 ++:10A3F000A5FA3846FCF7E0FC3846FFF7F5FE86F88C ++:10A400002C40B7F8DA103846F6F790FD3846FBF7DF ++:10A4100069F84FF4804213464FF489613846F5F7E6 ++:10A4200027FB6420ECF398F1234638464FF489610A ++:10A430004FF48042F5F71CFB38464FF44041FCF7DF ++:10A4400099FF41F28833F38686F89A55BDE8F0818A ++:10A450003EDD010046DD010010B58068F5F310F126 ++:10A4600010BDC04610B5437902790C4642EA032E6E ++:10A470000EF00303012B0AD0022B0ED013B14FF4C0 ++:10A4800000702EE00A780523B2FBF3F029E00B7888 ++:10A49000144A03F00703D05C23E00978E3782279BB ++:10A4A00011F0800F43EA022201F07F0343F00060C5 ++:10A4B00002D040F4806006E01EF0200F1CBF20F4A4 ++:10A4C000E06343F4407012F0800F18BF40F40000C6 ++:10A4D00012F0400F18BF40F48000C2F3011340EAAD ++:10A4E000035010BD54CC010070B585680446D4F803 ++:10A4F000F811A868F5F3B2F04FF0FF3384F8E231B9 ++:10A50000A361236800229A712B6B06460221186909 ++:10A51000F5F740FC204639F0B5DBD6F1010038BF35 ++:10A52000002070BD70B50D460968044671B1D1F8C0 ++:10A530007C1129B1036840F20C72D868ECF3D8F3AF ++:10A5400023682968D8686269ECF3D2F32368294646 ++:10A55000D8681022ECF3CCF370BDC04637B5054681 ++:10A5600001A9D0F800053AF0B5DD09E028462146FA ++:10A570003BF010D8636C1BB9284621463BF020D92C ++:10A5800001A83AF0AFDD04460028EFD13EBDC04639 ++:10A59000036870B510210546D868ECF399F308B943 ++:10A5A000064615E02B6806466969D868ECF390F317 ++:10A5B0000446306028B931462846FFF7B3FF2646E7 ++:10A5C00006E00023C0F87C31314628463AF062DCD0 ++:10A5D000304670BD2DE9F3470D469246002853D012 ++:10A5E000002951D00B88D0F80490D0F89843D0F8C7 ++:10A5F0009463002B4BD00027E780A7804B880A8804 ++:10A6000013F0010824D0402A14D1043120463B46DF ++:10A6100000973EF081DEB8423BDBB6F8023113F022 ++:10A62000400F34D0BAF1000F31D0D9F80C003DF012 ++:10A6300015DE0BE0A2F108039BB2372B29D804F1F9 ++:10A6400008000431E7F398F42D88A580384622E00D ++:10A65000202A19D8043104F14800E7F38DF4A4F856 ++:10A6600004802D880123E580C6F8CC30B6F802318D ++:10A6700013F0400F0BD0BAF1000F08D0D9F80C003E ++:10A680003DF0ECDD404606E06FF0010003E0002005 ++:10A6900001E04FF0FF30BDE8FC87C04610B50DF07B ++:10A6A0002DFA0446F0F714FA2046EBF363F610BDDA ++:10A6B000AAAA03001958000040960000904C000020 ++:10A6C00014720000101800000FAC000050F20000DF ++:10A6D00050F201000050F20200000050F2020100AE ++:10A6E000AAAA0300195800000000000050F204005C ++:10A6F00000147200000FAC000050F20000101800AF ++:10A700000050F200000FAC00004096000000000076 ++:10A710000000101800696C306D6163616464723D03 ++:10A7200030303A31313A32323A33333A34343A35DE ++:10A730003500626F617264747970653D3078666669 ++:10A74000666600626F6172647265763D30783130A2 ++:10A7500000626F617264666C6167733D38006161AD ++:10A76000303D330073726F6D7265763D3200000FBD ++:10A77000AC000050F2000000594D80009557800059 ++:10A7800049588000315680000D5A8000C158800021 ++:10A79000295A8000455A8000795780004D56800024 ++:10A7A000755A800025558000F15980000D588000B1 ++:10A7B00069548000C14E8000E951800055528000EC ++:10A7C000C9518000DD58800051518000D155800072 ++:10A7D000A555800015568000E14F80008955800006 ++:10A7E000FD4E80002550800061EC0000ED4D8000A2 ++:10A7F000854E8000A94F8000D94D8000094E800011 ++:10A80000514C8000654C80000000000000000000FA ++:10A8100000000000C14F800025528000F9518000E7 ++:10A82000FD2700002800000073645F6C6576656C8E ++:10A830005F74726967676572007370695F70755FD6 ++:10A84000656E6162006172705F6D61636164647204 ++:10A85000006172705F72656D6F74656970000000F1 ++:10A86000F83B86000000000007000000FF3B860068 ++:10A8700001000000070000000B3C86000200000001 ++:10A88000000000001B3C86000300000007000000E1 ++:10A89000263C86000400000000000000373C8600D3 ++:10A8A0000500000008003000413C86000600000062 ++:10A8B0000000000045A8010008000000060000009C ++:10A8C00051A801000900000007000000000000007E ++:10A8D00000000000000000000200000000005C78A2 ++:10A8E0002530325800253034780A00747863686166 ++:10A8F000696E007278636861696E0025733A206240 ++:10A900007373636667206973206E756C6C210A002F ++:10A91000776C635F696F766172733200727373690B ++:10A920005F6F66667365740064796E74785F7164D6 ++:10A93000626D5F6F766572726964650064796E74CA ++:10A94000785F726174655F616C6C00505A443A20A4 ++:10A9500025643E2564206F722025643E25642061B5 ++:10A960003D25640A006F747077006164640064655B ++:10A970006C006C6F775F727373695F74726967677D ++:10A980006572006C6F775F727373695F6475726173 ++:10A9900074696F6E0074635F656E61626C650074EC ++:10A9A000635F706572696F640074635F68695F7785 ++:10A9B0006D0074635F6C6F5F776D0074635F7374B9 ++:10A9C00061747573006173736F635F737461746531 ++:10A9D0000064796E74780074785F737461745F6377 ++:10A9E000686B0074785F737461745F63686B5F7029 ++:10A9F00072640074785F737461745F63686B5F7214 ++:10AA00006174696F0074785F737461745F63686BFD ++:10AA10005F6E756D0072785F726174650069735F57 ++:10AA20005750535F656E726F6C6C65650069735F3C ++:10AA30007770735F656E726F6C6C656500676574C7 ++:10AA4000736E72001CA901000100000006000000E6 ++:10AA500072A90100020000000600000083A90100A5 ++:10AA6000030000000600000095A90100040000009A ++:10AA7000060000009FA9010005000000060000007C ++:10AA8000A9A901000600000006000000B2A901000B ++:10AA90000700000006000000BBA90100080000003C ++:10AAA00006000000C5A90100090000000600000022 ++:10AAB000D1A901000A00000006000000D7A901008A ++:10AAC0000B00000006000000E3A901000C000000DC ++:10AAD00006000000F3A901000D00000006000000C0 ++:10AAE00005AA01000E0000000600000015AA0100E2 ++:10AAF0000F000000060000001DAA01001000000069 ++:10AB0000010000002DAA010010000000010000005B ++:10AB10003DAA010011000000060000000000000036 ++:10AB2000000000000000000005A58100FDA58100D7 ++:10AB30000000000000000000010005060000000009 ++:10AB40000DCD820089E68200F5CB8200EDCC82003B ++:10AB5000678986000000800001000000458B8600A8 ++:10AB600001000000080002004F8B86001D0000005D ++:10AB7000080002005C8B86000F000000030000004C ++:10AB80006A8B860010008000070000007A8B860028 ++:10AB900002000000080007008B8B86000300000005 ++:10ABA000080007009C8B8600040080000100000064 ++:10ABB000AE8B86000600000002000000B98B860004 ++:10ABC0000C00000002000000C88B860021008000FD ++:10ABD0000300000000000000000000000000000072 ++:10ABE000776C25643A20776C635F616D7064755F84 ++:10ABF00072656C656173653A2063616E6E6F742077 ++:10AC000072656C6561736520256420286F757420FA ++:10AC10006F662077696E646F77290A0025733A2082 ++:10AC2000776C20646F776E210A0025733A20776C69 ++:10AC3000207570210A00776C635F616D7064755FC9 ++:10AC40007265737461727400D6AD0100100000006B ++:10AC500006000000529B8600010000000100000079 ++:10AC60005D9B860002002000070000006F9B8600AD ++:10AC700003004000080007007C9B860004004000A1 ++:10AC8000080004008B9B86000500400008000400BB ++:10AC90009A9B86000600000008000400D9AD010060 ++:10ACA0000D00100007000000A79B86000E0020008A ++:10ACB00007000000B49B860007001000070000009A ++:10ACC000BF9B86000800000008001000E2AD0100F4 ++:10ACD0000900000006000000C99B86002400000057 ++:10ACE00006000000E6AD01000A00000006000000BA ++:10ACF000AB7286000F00000001000000D59B8600AB ++:10AD00000B00800001000000DA9B86000C000000B0 ++:10AD100005000000E59B86001D0000000300000008 ++:10AD2000FA9B86001E00000007000000139C8600AE ++:10AD30001F00000007000000259C86002100000085 ++:10AD4000050000003B9C860020000000030000007E ++:10AD5000499C860011008000010000004F9C860085 ++:10AD60001800400008000600539C860019000000EF ++:10AD700005000000619C86001A0000000100000030 ++:10AD80006C9C86001B0040000100000000000000D9 ++:10AD900000000000000000000050F202010100006D ++:10ADA0000364000027A4000041435E0061322F00CD ++:10ADB00073656E74206F7574205052554E45204552 ++:10ADC00056454E5420657863656564206D617861F1 ++:10ADD00073736F630A006170006D61786173736FE4 ++:10ADE000630062737300737369640000D55083005D ++:10ADF000215783000000000000000000776C2564EC ++:10AE00003A205048595458206572726F7228256450 ++:10AE1000290A00092F160E0E0500000091BA8600BF ++:10AE2000000080000100000030BB8600020000002E ++:10AE3000080044003ABB86000300000008004400FC ++:10AE400044BB860004000000080000004FBB8600E1 ++:10AE5000050000000800440059BB86000600000001 ++:10AE60000800000067BB86000700000008004C00D7 ++:10AE700074BB86000800000008004C0081BB8600FF ++:10AE80000900800002000000000000000000000037 ++:10AE900000000000C8E686000000000008000C006A ++:10AEA000D7E686000100000007000400E9E68600FE ++:10AEB0000200000008000800FBE686000300000016 ++:10AEC000070004000BE786000400000008001C00D7 ++:10AED0001BE786000500000008000C002CE7860038 ++:10AEE000060000000700040043E78600070000009A ++:10AEF0000700040024AF0100080000000700040060 ++:10AF000034AF0100090000000700040048AF010051 ++:10AF10000A0000000800900000000000000000008F ++:10AF200000000000706B745F66696C7465725F6925 ++:10AF3000636D7000706B745F66696C7465725F69D5 ++:10AF4000636D705F636E740077616B655F706163E2 ++:10AF50006B65740053657420425250542061742014 ++:10AF600025780A000A465749442030312D25780AB1 ++:10AF7000000A54524150202578282578293A20701B ++:10AF8000632025782C206C722025782C207370206B ++:10AF900025782C207073722025782C20787073729D ++:10AFA0002025780A00202072302025782C2072314C ++:10AFB0002025782C2072322025782C2072332025F1 ++:10AFC000782C2072342025782C2072352025782C7E ++:10AFD0002072362025780A00202072372025782C10 ++:10AFE0002072382025782C2072392025782C207268 ++:10AFF00031302025782C207231312025782C207298 ++:10B0000031322025780A000A20202073702B30204E ++:10B01000253038782025303878202530387820259C ++:10B020003038780A00202073702B313020253038DA ++:10B030007820253038782025303878202530387829 ++:10B040000A0073702B257820253038780A00646553 ++:10B0500061646D616E5F746F007265636C61696DD0 ++:10B060002073656374696F6E20313A205265747580 ++:10B07000726E656420256420627974657320746F34 ++:10B080002074686520686561700A007265636C6190 ++:10B09000696D2073656374696F6E20303A20526564 ++:10B0A0007475726E656420256420627974657320FE ++:10B0B000746F2074686520686561700A0072616D44 ++:10B0C0007374627964697300706125643D3078251A ++:10B0D000257800706425643D3078252578006E76EB ++:10B0E00072616D5F6F766572726964650000000061 ++:10B0F00086060200D0090000800602003E3E0000E5 ++:10B10000820602003E020000000702003C00000030 ++:10B110008406020012020000600104000300010026 ++:10B1200064010200C000000060010400030001008F ++:10B13000660102000A000000600104000400010032 ++:10B140006401020014000000600104000700010017 ++:10B150006401020083010000600104002500010079 ++:10B1600064010200F4010000600104009605010082 ++:10B17000660102002B040000600104009705010035 ++:10B18000640102000001000060010400D701010019 ++:10B19000640102003C00000060010400DC010100C9 ++:10B1A000660102003400000060010400E2010100B9 ++:10B1B000640102003000000060010400E7010100AA ++:10B1C000660102002C00000060010400ED01010096 ++:10B1D000640102002C00000060010400F201010083 ++:10B1E000660102002800000060010400F80101006F ++:10B1F000640102002800000060010400FD0101005C ++:10B200006601020028000000FFFF000000000000AF ++:10B21000600104000500010364010400000019003E ++:10B2200024010400040000002801040000000000C4 ++:10B230002C010400000000003001040000000000A8 ++:10B24000340104000A04700034010400EFBED4008D ++:10B2500034010400050000FF3401040001FF02FF77 ++:10B260003001040018000000340104000A04E0006A ++:10B2700034010400EFBE480034010400050000FF63 ++:10B280003401040001FF02FF340104000010180122 ++:10B2900034010400020300103401040018F1F2F339 ++:10B2A00034010400BBCC000030010400680600003B ++:10B2B000340104001404700034010400EFBE58018E ++:10B2C00034010400000000FF3401040001FF02FF0C ++:10B2D00034010400001018013401040002030309C2 ++:10B2E00034010400BF00001034010400000000001D ++:10B2F00030010400380000003401040000000000A8 ++:10B3000030010400880600003401040014048000A9 ++:10B3100034010400EFBE18023401040000000309E8 ++:10B3200034010400BF0000033401040000010203E3 ++:10B330003401040004050001340104000203040583 ++:10B340003401040000000000300104005800000037 ++:10B350003401040000000000300104003800000047 ++:10B36000340104000F2000073401040000009400A1 ++:10B3700034010400000000903401040074757677F5 ++:10B380003401040000000000340104000000050046 ++:10B3900034010400FFFFFFFF3001040068020000D9 ++:10B3A000340104006E84330034010400DCBA500020 ++:10B3B00034010400D40000AB34010400BADABADA74 ++:10B3C00034010400001018F134010400F2F30010FD ++:10B3D0003401040018F1F2F33401040010000000FD ++:10B3E00034010400000000003401040000000A00E1 ++:10B3F000340104000100000E340104004252434DA8 ++:10B40000340104005F54455334010400545F535326 ++:10B4100034010400494401043401040082848B9601 ++:10B42000340104000301010634010400020000009D ++:10B430003001040068000000340104000A042802FE ++:10B4400034010400DCBA8000340104000000FFFF76 ++:10B4500034010400FFFFFFFF34010400001018F165 ++:10B4600034010400F2F300103401040018F1F2F387 ++:10B4700034010400D0AF00003401040000000000DB ++:10B480003401040000000001340104000200000E39 ++:10B49000340104004252434D340104005F544553CB ++:10B4A00034010400545F535334010400494401043F ++:10B4B0003401040082848B963401040003010106E8 ++:10B4C000340104000201000030010400680400009F ++:10B4D000340104000A04280234010400DCBA8000AC ++:10B4E000340104000000FFFF34010400FFFFFFFFF0 ++:10B4F00034010400001018F134010400F2F30010CC ++:10B500003401040018F1F2F334010400D0AF00005C ++:10B5100034010400000000003401040000000001B8 ++:10B52000340104000200000E340104004252434D75 ++:10B53000340104005F54455334010400545F5353F5 ++:10B5400034010400494401043401040082848B96D0 ++:10B55000340104000301010634010400020100006B ++:10B56000000104000000000190040200000000003F ++:10B57000A0040200F1F30000B0040200EFFD00009F ++:10B58000A8040200FFFF0000A80402000000000061 ++:10B59000AA04020000000000A4040200CF1A000068 ++:10B5A000AC04020000000000BC0402000000000027 ++:10B5B000A6040200D7020000B6040200FFFD00004E ++:10B5C000AE040200FFFF00000604020001000000BC ++:10B5D00006040200000000000C0402001800000035 ++:10B5E000060402000000000048040200000C0000F5 ++:10B5F00002040200A0070000020502000000000093 ++:10B6000000050200004000000205020004000000E6 ++:10B6100000050200004000000205020008000000D2 ++:10B620000005020000400000020502000C000000BE ++:10B63000000502000040000002050200C0000000FA ++:10B6400080050200FFFF000082050200FFFF0000EE ++:10B6500084050200FFFF000086050200FFFF0000D6 ++:10B6600088050200FFFF00009C050200F0FF0000BB ++:10B67000400502000080000020050200060F0000C7 ++:10B68000400502000080000040050200008100002B ++:10B6900020050200101D000040050200008100008E ++:10B6A0004005020000820000200502001E28000064 ++:10B6B00040050200008200004005020000830000F7 ++:10B6C000200502002931000040050200008300002F ++:10B6D000400502000084000020050200323F000007 ++:10B6E00040050200008400004005020000850000C3 ++:10B6F00020050200404100004005020000850000D6 ++:10B7000012060200010000002E060200CDCC00004F ++:10B71000300602000C000000000602000480000059 ++:10B7200096060200080000009A060200E4000000ED ++:10B7300088060200000000009C06020002000000D3 ++:10B7400088060200001000009C06020002000000B3 ++:10B7500088060200002000009C0602000200000093 ++:10B7600088060200003000009C0602000200000073 ++:10B77000880602000B0F00009E0602000700000072 ++:10B78000100502000B00000050040200014E0000F2 ++:10B79000520402005B010000E4040200900000007B ++:10B7A00004040200B400000054050200FF3F000042 ++:10B7B00060010400040001036401040000000000B3 ++:10B7C00064010400B4000000640104004700470065 ++:10B7D00064010400000064006401040030094000BA ++:10B7E000600104000D000103640104000200020076 ++:10B7F00064010400010080006401040005000000F1 ++:10B80000640104000000800064010400640064001E ++:10B81000640104000E0047006401040000050000FC ++:10B8200060010400150001036401040000004208E7 ++:10B8300064010400E00B0700640104000A0000003A ++:10B84000600104001A0001036401040000C0660BDB ++:10B85000600104001D0001036401040010270000C2 ++:10B860006401040000007A03600104002000010369 ++:10B870006401040006001027600104002300010396 ++:10B88000640104000000F606640104000000AA0A36 ++:10B890006401040000003200640104000A0E0B0978 ++:10B8A000640104000E020000640104000000520A5A ++:10B8B0006401040000003F0164010400FFFF000C6C ++:10B8C0006401040032046E06640104000200F209FF ++:10B8D000600104002E0001036401040000000080E8 ++:10B8E0006001040032000103640104000000320B17 ++:10B8F0006001040034000103640104000000CC0571 ++:10B900006001040058000103640104004252434DE9 ++:10B91000640104005F54455364010400545F5353B1 ++:10B920006401040049440000600104006000010358 ++:10B9300064010400390000006401040050000000AC ++:10B9400064010400C00000006001040070000103F5 ++:10B9500064010400AA03AA0364010400AA03AA0361 ++:10B9600064010400AA03AA0364010400AA03AA0351 ++:10B9700064010400EC03D60364010400C003AA03BD ++:10B9800064010400F703E10364010400CB03B50381 ++:10B9900064010400AA03AA0364010400AA03AA0321 ++:10B9A00064010400AA03AA0364010400AA03AA0311 ++:10B9B00064010400EC03D60364010400C003AA037D ++:10B9C00064010400F703E10364010400CB03B50341 ++:10B9D000640104000204020464010400020402047D ++:10B9E000640104000E0402046401040002041A0449 ++:10B9F000640104000204020464010400020402045D ++:10BA00006401040002040204640104002604020428 ++:10BA1000640104000204020464010400020402043C ++:10BA2000640104000E0402046401040002041A0408 ++:10BA3000640104000204020464010400020402041C ++:10BA400064010400020402046401040026040204E8 ++:10BA50006401040000001F0064010400FF031F00D4 ++:10BA60006401040002000000640104000200000000 ++:10BA700060010400980001036401040000001F003D ++:10BA800064010400FF031F006401040001000000C2 ++:10BA9000640104000100000060010400A000010333 ++:10BAA0006401040000001F0064010400FF031F0084 ++:10BAB00064010400010000006401040001000000B2 ++:10BAC00060010400A80001036401040000001F00DD ++:10BAD00064010400FF031F00640104000100000072 ++:10BAE000640104000100000060010400B8000103CB ++:10BAF00064010400E700EC006401040000007B0026 ++:10BB0000640104007E0000006401040000000000E5 ++:10BB10006401040000004F51640104003F00000074 ++:10BB2000640104000000001060010400C000010373 ++:10BB300064010400372437246401040037243724C7 ++:10BB40006001040093010103640104000F00400040 ++:10BB500064010400E606000060010400970101038F ++:10BB6000640104001A08000060010400A001010340 ++:10BB700064010400FFFFFFFF64010400FFFFFFFFFB ++:10BB800064010400FFFFFFFF64010400FFFFFFFFEB ++:10BB900064010400FFFFFFFF64010400FFFFFFFFDB ++:10BBA00064010400FFFFFFFF64010400FFFFFFFFCB ++:10BBB00060010400BC0101036401040000000500F1 ++:10BBC00060010400C50101036401040000001003CA ++:10BBD00064010400E000FFFF640104000309BF00EA ++:10BBE000640104000000030964010400BF000010A8 ++:10BBF000640104000309BF006401040000030000A5 ++:10BC000060010400CD01010364010400FFFFFFFF98 ++:10BC100064010400FFFFFFFF64010400FFFFFFFF5A ++:10BC200064010400FFFFFFFF64010400FFFFFFFF4A ++:10BC300064010400FFFFFFFF64010400FFFFFFFF3A ++:10BC400064010400FFFFFFFF640104002000CB013A ++:10BC50006401040000005400640104000000AB080B ++:10BC60006401040000001004640104008400020068 ++:10BC7000640104000000140064010400CF0102000C ++:10BC8000640104004400000064010400AF080200E5 ++:10BC90006401040010046400640104000202000056 ++:10BCA000640104001000CA016401040002003C00A9 ++:10BCB000640104000000AA086401040002001004EA ++:10BCC000640104005400020864010400000008003C ++:10BCD00064010400CE01000064010400340000008F ++:10BCE00064010400AE080000640104001004440074 ++:10BCF00064010400020A0000640104000800C90194 ++:10BD00006401040002003000640104000000A9087E ++:10BD10006401040002001004640104003C000210ED ++:10BD2000640104000000040064010400CD0100006F ++:10BD3000640104002C00000064010400AD08000050 ++:10BD400064010400100434006401040002120000C5 ++:10BD5000640104000400C8016401040000002C0018 ++:10BD6000640104000000A80864010400000010043D ++:10BD700064010400300002196401040000000000A6 ++:10BD800064010400CC010200640104002C000000E6 ++:10BD900064010400AC0802006401040010043000D7 ++:10BDA00064010400021A000064010400C0000A04D7 ++:10BDB0006401040070000000640104003A010A04F8 ++:10BDC0006401040028022CC064010400F2020A0489 ++:10BDD0006401040000000001640104006000140418 ++:10BDE000640104003800000064010400020114042E ++:10BDF0006401040014012CC064010400DE01140479 ++:10BE00006401040000008000640104002200370483 ++:10BE1000640104001500000064010400DF00370421 ++:10BE20006401040065002CC0640104002E01370485 ++:10BE30006401040000002F006401040011006E84FE ++:10BE4000640104000B00000064010400D4006E844F ++:10BE50006401040033002CC064010400FC006E8403 ++:10BE600064010400000018006401040002008A9DBF ++:10BE700064010400FB00020864010400C54EFA00DE ++:10BE800064010400020A833464010400FE0002100D ++:10BE9000640104006227F900640104000212421ADE ++:10BEA00064010400FD00021964010400B113F800EC ++:10BEB00064010400021A811164010400FC00021CE8 ++:10BEC00064010400C10FFC00600104007B03010356 ++:10BED0006401040007001400640104001E00000057 ++:10BEE000600104008303010364010400000000F00A ++:10BEF00064010400C33010926401040050318022B8 ++:10BF000064010400C33000006001040088030103E1 ++:10BF10006401040000001004600104008C030103AC ++:10BF20006401040080000000600104008E0301032E ++:10BF30006401040005000000600104000B0401031B ++:10BF400064010400000007026001040014040103FE ++:10BF500064010400010000006001040016040103F4 ++:10BF6000640104000C00000060010400530501039B ++:10BF7000640104000000180060010400550501037D ++:10BF800064010400983A983A64010400A60E640023 ++:10BF9000640104000000F4016401040005000000D5 ++:10BFA00064010400A861A8616401040030751E00EA ++:10BFB000600104005D0501036401040050C300003A ++:10BFC000600104005F050103640104000000140522 ++:10BFD0006401040050C30000600104006305010314 ++:10BFE00064010400204E00006401040000000F0002 ++:10BFF00064010400F4010400600104006905010308 ++:10C00000640104000000310064010400000003002A ++:10C01000640104000100070064010400C8AF0000CF ++:10C020006401040088130000640104002C17FF0061 ++:10C0300060010400700501036401040000002C018C ++:10C04000640104000000A00F6001040073050103F7 ++:10C0500064010400000003006401040000002C01DE ++:10C0600064010400C00000006401040088130000A3 ++:10C07000640104006400000064010400DC05401F4A ++:10C08000600104007A05010364010400010001005D ++:10C090006401040002000000600104007D0501034A ++:10C0A0006401040002000000640104000000409CE0 ++:10C0B00064010400204E000064010400B80B00007D ++:10C0C0006001040082050103640104000000204EA9 ++:10C0D000640104000000050064010400DC053F0069 ++:10C0E0006401040071020000640104003075000066 ++:10C0F000600104008A05010364010400C409A00F63 ++:10C10000600104008D050103640104000A00D007EA ++:10C11000600104008F05010364010400204E204EDD ++:10C12000600104009505010364010400BE000000E5 ++:10C1300060010400B105010364010400E80300008C ++:10C1400060010400ED05010364010400000000002B ++:10C1500060010400F6050103640104008813000077 ++:10C160006001040003000200640104001F000000DD ++:10C17000600104000400020064010400FF030000E9 ++:10C180006001040005000200640104001F000000BB ++:10C1900060010400060002006401040007000000C2 ++:10C1A00060010400070002006401040004000000B4 ++:10C1B000600104000800020064010400FFFF0000A9 ++:10C1C0006001040009000200640104000000000096 ++:10C1D000600104000A000200640104000000000085 ++:10C1E000600104000B000200640104000000000074 ++:10C1F000600104000C000200640104000000000063 ++:10C20000600104000D000200640104000000000051 ++:10C21000600104000E000200640104000000000040 ++:10C22000600104000F00020064010400000000002F ++:10C230006001040010000200640104001F000000FF ++:10C24000600104001100020064010400000000000D ++:10C2500060010400120002006401040000000000FC ++:10C2600060010400130002006401040000000000EB ++:10C2700060010400150002006401040000000000D9 ++:10C2800060010400160002006401040000000000C8 ++:10C29000FFFF000000000000636275636B5F73774F ++:10C2A0006672657100000000E02E0101015000007F ++:10C2B00000000000C832020101490000899DD80039 ++:10C2C0004038030101420000AAAAAA00003C040170 ++:10C2D000013E000000008000483F050101390000D8 ++:10C2E000D05E4200A04106010139000049922400BD ++:10C2F000004B07010132000000000000584D08010A ++:10C3000001300000071F7C00204E090101300000B1 ++:10C3100000000000A8610A010126000066666600B0 ++:10C3200090650B0101240000C44EEC0030750C0137 ++:10C33000012000000000000018920D0201330000EF ++:10C34000F93E560000960E02013200000000000087 ++:10C35000409C0F02013000000000000080BB100272 ++:10C3600001280000000000000000000000000000A4 ++:10C370000000000099C30100000000000800080050 ++:10C3800098C301000100000008000B00000000003D ++:10C3900000000000000000006D6B6565705F616C5F ++:10C3A00069766500352E39302E3139352E32362EEC ++:10C3B0003300776C25643A20257320257320766539 ++:10C3C0007273696F6E2025732046574944203031BF ++:10C3D0002D25780A00417567203133203230313203 ++:10C3E0000031393A31303A3436000000DA43860001 ++:10C3F0000000000008000000E34386000100000088 ++:10C40000010000000000000000000000000000002B ++:10C41000746F655F6F6C00746F655F7374617473C4 ++:10C4200000746F655F73746174735F636C656172D0 ++:10C4300000AAAA030000000010C4010000000000D0 ++:10C440000700000017C401000100000008004C00B4 ++:10C4500021C40100020000000000000000000000F4 ++:10C460000000000000000000D58D86000C00800058 ++:10C4700001000000A98E86000B00000001000000F2 ++:10C48000B58E86000300000005000000C18E860006 ++:10C490000400000007000000D08E86000500800028 ++:10C4A000010000000000000000000000000000008B ++:10C4B0005B574C414E5D636F756E74203D20256463 ++:10C4C0000A00496E697420436F756E746572004787 ++:10C4D000726F7570206B657920657870616E736915 ++:10C4E0006F6E0061757468000000000000000000BD ++:10C4F00000000000627461006274616D700062741B ++:10C50000616D705F666C616773006274616D705F0E ++:10C510006368616E006274616D705F31316E5F736C ++:10C520007570706F7274006274616D705F66620026 ++:10C530006274616D705F73746174656C6F670041E4 ++:10C540004D502D253032782D253032782D25303242 ++:10C55000782D253032782D253032782D25303278DF ++:10C5600000545454545400000000000000000050D7 ++:10C570005050505000000000000000000023000058 ++:10C580000300000000084C4C4C4C4C4C141414009C ++:10C5900000010000646464646464646464646464EA ++:10C5A0006400000000000000000000000000000027 ++:10C5B000013C4242424242424242423C00000000B0 ++:10C5C0000000000000000000000000000000344AED ++:10C5D0004E4E4E4E4E4E4E4A3800000000000000B7 ++:10C5E00000000000000000000000004C4C4C4C4CCF ++:10C5F0004C4C4C4C4C4C4C4C00000040404040409B ++:10C600004040000000000001030000000001424221 ++:10C6100042324242141414000000000003000000E3 ++:10C6200000013E3E42343E4214141400000000005B ++:10C6300054545400540000000000000000000000AA ++:10C6400000000000000000000000000023000000C7 ++:10C650000300000000014444443844401414140012 ++:10C6600000000000484A4A4A4A4A4A4A4A4A4A4A54 ++:10C67000480000003434343434343434340000009E ++:10C68000004E4E4E4E4E4E4E4E4E4E4E4E4E0000B4 ++:10C6900000000000000000000000000000085454EA ++:10C6A00054005400000000000000000050505000F2 ++:10C6B00050000000000000000000233A3E38004215 ++:10C6C000000000000000000000000000000000006A ++:10C6D000000000000000000A0000000064000000EC ++:10C6E00000000000000000000000580000000000F2 ++:10C6F0000000000001364444444444444444443669 ++:10C700004A4000000000000000000000000000009F ++:10C7100000082E4444444444444444442E463A00D1 ++:10C720000000000000000000000000000000083CC5 ++:10C730003E3E3E3E3E3E3E3E3E3C3E3E0000000013 ++:10C7400000000000000000000000000834444444E1 ++:10C750004444444444443844400000000000000085 ++:10C760000000000000000000085C5C5C5C5C5C5C3D ++:10C770005C5C5C5C5C5C0000505050505050505011 ++:10C78000500000000001383E383E4200000000002A ++:10C790000000000000000000000000000000000099 ++:10C7A00000000A000100000000014E4E4E344C38DB ++:10C7B0001E1E1E0000000000030000000001424495 ++:10C7C0004230443014141400000000000300000044 ++:10C7D00000013E3E3E3C3E3E1414140000000000AA ++:10C7E000030000000001444444364C381414140083 ++:10C7F0000000000042424242424242424242424221 ++:10C80000420000002E343434343434343400000018 ++:10C81000004A4A4A4A4A4A4A4A4A4A4A4A4A000056 ++:10C82000002E343434343434343400000000545492 ++:10C830005400540000000000000000004848480078 ++:10C8400048000000000000000000233E3E3E4A0079 ++:10C850000000000000000000002828284000000020 ++:10C8600000000000000000004644444A00000000B0 ++:10C8700000000000000000000000000000000000B8 ++:10C88000000000000A54545400540000000000004E ++:10C890000000004848480048000000000000000078 ++:10C8A0000023545454540000000000000000000015 ++:10C8B00050505050000000000000000000002338DD ++:10C8C00044444A4A0000000000000000000000004C ++:10C8D00000000000000000000000000A000000004E ++:10C8E00034000000000000000000000000003400E0 ++:10C8F0000000000000000000005454545454000094 ++:10C9000000000000000000484848484800000000BF ++:10C910000000000000235454545454000000000050 ++:10C920000000000050505050500000000000000077 ++:10C930000000235C5C5C0050000000000000000070 ++:10C940000050485000440000000000000000002398 ++:10C950004C4C4C4C4C4C4C4C4C4C4C4C4C000000FB ++:10C9600000000000000000000000000009545454C2 ++:10C9700054540000000000000000004848484848A7 ++:10C980000000000000000000002300000000640020 ++:10C99000000000000000000000000000580000003F ++:10C9A00000000000000001000300000000004646F7 ++:10C9B00046484A4817171700000000003A3A3A3A2A ++:10C9C0004600000000000000000000000000000021 ++:10C9D000000000000000000008384444444A000001 ++:10C9E0000000000000000000000000000000000047 ++:10C9F00000000000002A00000000540000000000B9 ++:10CA000000000000000000004400000000000000E2 ++:10CA10000000013E484842460000000000000000BF ++:10CA20000000000000000000000000000000000AFC ++:10CA30000038383E42000000000000000000000006 ++:10CA40000000000000000000000000000A32323246 ++:10CA500038000000000000000000003838383800BE ++:10CA6000000000000000000000004C0000004C002E ++:10CA70000000000000000000500000005000000016 ++:10CA800000000000000001545454000000000000A9 ++:10CA900000000000005050500000000000000000A6 ++:10CAA00000000023030000000001444444344444D7 ++:10CAB00014141400000000007DC586000000000072 ++:10CAC0000800240084C58600010000000800000062 ++:10CAD00093C586000200000008000C00A4C5860073 ++:10CAE000030000000800E402AFC586000400000057 ++:10CAF00007000000C0C586000500000008002400F3 ++:10CB0000C9C586000600000001000000D1C58600EE ++:10CB10000700000007000000DBC5860008000000D9 ++:10CB20000100000049C58600090000000100000066 ++:10CB300000000000000000000000000025733A2003 ++:10CB400063616C6C65640A0070617463685F696F2F ++:10CB50007661727300616D7064755F7274730077D3 ++:10CB60006C635F61757468656E74696361746F721C ++:10CB70005F646F776E00000020798600000000403F ++:10CB8000030000003D7D86000100088008000000D1 ++:10CB9000E3C401000200004006000000D9AD01001E ++:10CBA000030010000700000055CB01000400000046 ++:10CBB0000100000000000000000000000000000074 ++:10CBC00001006C09020071090300760904007B0969 ++:10CBD000050080090600850907008A0908008F09F9 ++:10CBE000090094090A0099090B009E090C00A30989 ++:10CBF0000D00A8090E00B4096E840B000000D400DB ++:10CC000000000000000000010000000000002D00F6 ++:10CC1000A7901A0047090E00012007008B9303001C ++:10CC200038CA01002AE50000977200004C39000064 ++:10CC3000A61C0000530E0000290700009503000009 ++:10CC4000CA010000E5000000730000003900000088 ++:10CC50001D0000006030180C6C482412776C2564AD ++:10CC60003A205363616E20696E2070726F6772653F ++:10CC700073732C20736B697070696E6720747870A1 ++:10CC80006F77657220636F6E74726F6C0A00706FDD ++:10CC90007765722061646A210A002E6661622E0047 ++:10CCA00025732E6661622E25640063636B627732A2 ++:10CCB000303267706F0063636B62773230756C324D ++:10CCC00067706F006C65676F66646D6277323032D3 ++:10CCD00067706F006C65676F66646D627732307580 ++:10CCE0006C3267706F006D637362773230326770D9 ++:10CCF0006F006D637362773230756C3267706F00EE ++:10CD00006D6373627734303267706F006C65676F84 ++:10CD100066646D6277323035676C706F006C656782 ++:10CD20006F66646D62773230756C35676C706F005A ++:10CD30006C65676F66646D6277323035676D706FF2 ++:10CD4000006C65676F66646D62773230756C35674D ++:10CD50006D706F006C65676F66646D627732303539 ++:10CD60006768706F006C65676F66646D62773230FC ++:10CD7000756C356768706F006D637362773230353C ++:10CD8000676C706F006D637362773230756C3567F6 ++:10CD90006C706F006D63736277343035676C706FE1 ++:10CDA000006D63736277323035676D706F006D634D ++:10CDB0007362773230756C35676D706F006D6373B9 ++:10CDC0006277343035676D706F006D6373627732F0 ++:10CDD00030356768706F006D637362773230756CE1 ++:10CDE000356768706F006D637362773430356768DC ++:10CDF000706F006D63733332706F006C65676F66C0 ++:10CE0000646D3430647570706F00616E747377692F ++:10CE100074636800616135670074737369706F7360 ++:10CE200032670065787470616761696E326700709F ++:10CE300064657472616E6765326700747269736FDE ++:10CE4000326700616E74737763746C326700747359 ++:10CE50007369706F733567006578747061676169B5 ++:10CE60006E3567007064657472616E676535670062 ++:10CE7000747269736F356700616E74737763746C75 ++:10CE800035670070613267773061330070613267F7 ++:10CE900077316133006D61787032676130006D61A8 ++:10CEA00078703267613100706132677730613000CD ++:10CEB000706132677730613100706132677731615C ++:10CEC00030007061326777316131007061326777AD ++:10CED000326130007061326777326131006D6178A4 ++:10CEE0007035676C6130006D61787035676C6131E9 ++:10CEF00000706135676C7730613000706135676C48 ++:10CF00007730613100706135676C77316130007066 ++:10CF10006135676C7731613100706135676C7732EC ++:10CF2000613000706135676C77326131006D617816 ++:10CF30007035676130006D61787035676131007000 ++:10CF40006135677730613000706135677730613106 ++:10CF50000070613567773161300070613567773116 ++:10CF6000613100706135677732613000706135671B ++:10CF700077326131006D6178703567686130006DBE ++:10CF80006178703567686131007061356768773046 ++:10CF900061300070613567687730613100706135EC ++:10CFA000676877316130007061356768773161316A ++:10CFB000007061356768773261300070613567688D ++:10CFC00077326131006D61787035676133006D6172 ++:10CFD000787035676C613300706135677730613325 ++:10CFE00000706135676C7730613300706135677749 ++:10CFF00031613300706135676C7731613300706186 ++:10D0000035677732613300706135676C7732613331 ++:10D010000062773430706F00636464706F00737403 ++:10D020006263706F006277647570706F00747870FF ++:10D0300069643267613000747870696432676131A5 ++:10D0400000697474326761300069747432676131E9 ++:10D050000063636B3267706F006F66646D32677078 ++:10D060006F006D63733267706F30006D637332678A ++:10D07000706F31006D63733267706F32006D637370 ++:10D080003267706F33006D63733267706F34006D99 ++:10D0900063733267706F35006D63733267706F361C ++:10D0A000006D63733267706F370074787069643530 ++:10D0B000676C613000747870696435676C61310049 ++:10D0C0006F66646D35676C706F006D637335676C88 ++:10D0D000706F30006D637335676C706F31006D6316 ++:10D0E0007335676C706F32006D637335676C706F8A ++:10D0F00033006D637335676C706F34006D63733527 ++:10D10000676C706F35006D637335676C706F3600D8 ++:10D110006D637335676C706F370074787069643550 ++:10D1200067613000747870696435676131006974D3 ++:10D1300074356761300069747435676131006F66FA ++:10D14000646D3567706F006D63733567706F3000A5 ++:10D150006D63733567706F31006D63733567706F22 ++:10D1600032006D63733567706F33006D63733567BD ++:10D17000706F34006D63733567706F35006D637366 ++:10D180003567706F36006D63733567706F37007485 ++:10D1900078706964356768613000747870696435E7 ++:10D1A00067686131006F66646D356768706F006D28 ++:10D1B0006373356768706F30006D637335676870CF ++:10D1C0006F31006D6373356768706F32006D637324 ++:10D1D000356768706F33006D6373356768706F34DF ++:10D1E000006D6373356768706F35006D6373356705 ++:10D1F00068706F36006D6373356768706F370065F0 ++:10D200006C6E61326700656C6E6135670074656DC8 ++:10D21000706F66667365740070687963616C5F74C3 ++:10D22000656D7064656C7461000C12182430486080 ++:10D230006C003CC407003BC407004C84FFE0B08492 ++:10D24000F7F7F984F7FF4D84FF834CC4001FB784C0 ++:10D25000FF80B184FFDFB0C40808FA84F7FFF9C487 ++:10D260000800CC0102000000D40000000000000013 ++:10D2700000010000000000003CD30100350108302F ++:10D280000800030046D30100430100000100000034 ++:10D2900050D30100480108000300000060D30100E2 ++:10D2A00049010800030000006DD301004A01080095 ++:10D2B000030000007BD301004E01080003000000C2 ++:10D2C00086D301003D0140000700070092D3010012 ++:10D2D0007A01000407000000A0D301003F01000014 ++:10D2E00006000000ABD30100400100000200000076 ++:10D2F000B6D301007C01000002000000C3D301008E ++:10D300004201000007000000CFD301002800080000 ++:10D3100003000000E0D3010029000000010000002C ++:10D32000EDD301007F0100000200000000000000BA ++:10D330000000000000000000706879007478696ED9 ++:10D340007374707772007068795F6D7574656400CE ++:10D350007068795F676C6974636874687273680079 ++:10D360007068795F6E6F6973655F7570007068795A ++:10D370005F6E6F6973655F64776E007068795F7068 ++:10D38000657263616C007068795F7278697165734A ++:10D3900074007068796E6F6973655F73726F6D008A ++:10D3A0006E756D5F73747265616D0062616E645F4E ++:10D3B00072616E67650073756262616E643567766F ++:10D3C0006572006D696E5F7478706F77657200705A ++:10D3D00068795F6F636C736364656E61626C65002E ++:10D3E0007068795F7278616E7473656C00706879CB ++:10D3F0005F6372735F7761720000D90404000000FC ++:10D40000D90408000800D90404000400D904080065 ++:10D410000000FFEEDDCCBB998877665544332211BE ++:10D4200000000000000000000000000000000000FC ++:10D4300000000000000000000000000000000000EC ++:10D44000D70408000000D80401000000D80402003E ++:10D4500000003B04040004003C040400000036000B ++:10D460001A013A002500280005001201FF001F01E3 ++:10D470000B0013010700FC00FD00FF00C000CA0004 ++:10D48000C5001200570059005C0078009200980017 ++:10D4900016012C016A000B001B0013011D00140172 ++:10D4A0002E002A0112013B04010001003C0401008E ++:10D4B00001003C04010000003B04010000003B04AB ++:10D4C000020002003C04020002003C0402000000D2 ++:10D4D0003B04020000004C04000800084D0400203A ++:10D4E0000000B00400010001B644FFFFB7040F00C4 ++:10D4F0000F004C04000800084D0400200020B00478 ++:10D50000000100010F0900090109060907090809BE ++:10D510000209030909090A090B09040905090C098B ++:10D520000D090E0911094804000300010806FF0057 ++:10D5300017000406FF07EA033B84EDFF3C040200EA ++:10D5400002004C84D0EF4D84D7BF4D04040004008A ++:10D550004D0403000100F984F8FFFA84F8FF3B044E ++:10D56000020002003C04020000003B041000100016 ++:10D570003C04400000004C04001000104D0400402A ++:10D5800000404D04040000004C0404000400B104F9 ++:10D5900000040000B10400800000DA46FFFF03052C ++:10D5A00008000800DB04FF03A602DB040070002073 ++:10D5B0000A80D7FDDA867FFFA40400400040A4045F ++:10D5C00000400000DAC64000A40400800080A404EB ++:10D5D00000400040A40400200020B00480000000AF ++:10D5E0003B0440000000A90400800080A6040080E5 ++:10D5F0000080A604FF01FF009A04FF01FF002564DC ++:10D600002009202564200A004572726F7220676528 ++:10D610007474696E67206C6F77206971206573740C ++:10D620000A004572726F722067657474696E6720B4 ++:10D6300068696768206971206573740A0000D704FF ++:10D6400002000200D70480000000D704010001009E ++:10D65000D70440004000D70408000800D704007039 ++:10D660000020DA0640004000A404002000008746A5 ++:10D670006000424607004AC444004A44800031C664 ++:10D680001500D60603000000DAC68F004AC4440025 ++:10D690004A44800000FC070069A50500FF01000066 ++:10D6A000695D0A0000040800975E0A00010200009C ++:10D6B00097A605009A05FF0326009B05FF03890036 ++:10D6C0009C05FF038A009C0500FC00209D05003C92 ++:10D6D000002C9D05FF038C004C04080008004D043D ++:10D6E000080000004C04200020004D042000200011 ++:10D6F000F90402000200FA0402000000F904040028 ++:10D700000400FA0404000000F90401000100FA0416 ++:10D71000010000004C04001800184D040060006077 ++:10D720003809FF01FF013909FF019E003B04030096 ++:10D7300003003C0403000000DA46FFFFDBC60300E1 ++:10D74000D106040004003B04010001003C04010078 ++:10D7500001003C04010000003B0401000000D7442C ++:10D760000000D70401000100D70440000000760645 ++:10D7700080000000DA06010000006C0804000000D0 ++:10D780006C08400000006C08000400003B0401002D ++:10D7900001003C04010000003809000800083909B4 ++:10D7A000000800085384FF7F53C400804AC444002B ++:10D7B0004A448000A3C60100A386FEFFDAC64000EB ++:10D7C000DBC603003B04020002003C040200000030 ++:10D7D0003B04100010003C04400000004B44FFFFDD ++:10D7E0003B4917203C49C527D80401000000D80454 ++:10D7F00002000000D704080000004C84FFE73B84CF ++:10D800000C00424907003B4917203C49C5272184A9 ++:10D810002384348384806782568034828480678244 ++:10D82000568034827A46030073467017C946000654 ++:10D830008046FF0081463F01D70408000800D70456 ++:10D8400000700020EB04C00100006A04FFFF190013 ++:10D850000305A404D004D904DA04A604380939095C ++:10D86000D804D004D704A5040D04A2048B460000FC ++:10D870007646A1B8D106040000004B0640004000E7 ++:10D88000340600FF0000DAC680000AC028023B040C ++:10D8900004000000380940000000380904000000BE ++:10D8A000D70402000000D70401000000D7040800DC ++:10D8B0000000D80401000000D80402000000100994 ++:10D8C0001E091F09240925092609200921092709FC ++:10D8D00028092909220923093009310932091209C5 ++:10D8E000D70401000100D70440004000D704010024 ++:10D8F0000100D70440000000370600C00080D704B4 ++:10D9000001000000D90401000100D9040200000058 ++:10D9100000400140024003400440054006400740EB ++:10D92000075B07803A09800080002304FF0049005C ++:10D930003404FF00FCFF1604FF00A4FF160400FFE0 ++:10D94000009F240400FF002A230400FF002D25046B ++:10D95000FF000F000005FF000F00000500FF000F93 ++:10D960002004FF000A00340400070001FF0400FC4B ++:10D970000018F90401000100FA04010000004B0640 ++:10D98000010001004B0608000800D6060300010054 ++:10D99000DA0608000000DA06800000007606800043 ++:10D9A0000000DA06010000006C08040000006C08AA ++:10D9B000400000006C080004000042490F0042498A ++:10D9C000000042490F004A4484004A448000D34684 ++:10D9D0002222D3462022000022D401000700FF00AB ++:10D9E0001F013A001A010500820086002E01130172 ++:10D9F0007D0028009A05FF0326009B05FF03A50074 ++:10DA00009C05FF03A6009C0500FC00289D05003C2A ++:10DA1000001C9D05FF03A80003050100000003058D ++:10DA200004000000030510001000A40400400000E2 ++:10DA3000A40400800080D00420000000A404FF01A2 ++:10DA40000000A504FF00FF00A50400700050A5041D ++:10DA5000000700000D04FF0040000D040007000453 ++:10DA6000A204FF004000A20400070004A804FF0075 ++:10DA70000100D00401000000D304FF000000D30423 ++:10DA800000FF0000D00410000000D00404000000DB ++:10DA9000D00402000000D204FF000000D20400FF06 ++:10DAA0000000D00408000000100480000000A8441A ++:10DAB0000A00380940004000380904000400390910 ++:10DAC00040000000390904000400DA0600800080EC ++:10DAD000D30600800080D30600800000DA060080B4 ++:10DAE0000000424902003B4900003C4900007446E6 ++:10DAF000440475463F00704681068C464900CE4678 ++:10DB00000000CB460000CC460000CD4600009D46FC ++:10DB1000FF07A4460000A5460000977A977A977AF7 ++:10DB2000977A877A877A977B01004AC444004A44EF ++:10DB30008000D70408000000D704007000203809D6 ++:10DB400004000400390904000400A40400100010BB ++:10DB5000D70404000400D704000F000016012D01B3 ++:10DB60002C016A00980097002F010B0013011D0083 ++:10DB700014012E002A0109001F010700FF00050003 ++:10DB8000060000000600000006000000060000007D ++:10DB9000B704007F006CB1040020000039090002C6 ++:10DBA0000000380900020002B00408000800B004B8 ++:10DBB00000080008390900080000380900080008BA ++:10DBC0001004020000001004010000001004020014 ++:10DBD0000000100401000100977A877A877A977B0A ++:10DBE000100402000200100401000000DA06200008 ++:10DBF000200010040800000081040002000210044C ++:10DC000008000800DA0620000000030501000000FB ++:10DC1000030504000000A40400400000A4040080E8 ++:10DC20000000D00420000000A504FF00FF00A504B0 ++:10DC300000700050A504000700000D04FF00400024 ++:10DC40000D0400070006A204FF004000A204000724 ++:10DC50000006D90470002000D90400070003D9048D ++:10DC600000700010DA0400100000DA040020002028 ++:10DC7000A60400800080380904000400390904006B ++:10DC80000400A40400100010D70408000800D70402 ++:10DC900000700010D70408000800D704007000309E ++:10DCA000760680008000DA06010001006C0804009E ++:10DCB00004006C08400040006C08000400043B04B1 ++:10DCC000040004003C04040000004C0408000800A8 ++:10DCD0004D04080008004C04200020004D042000E2 ++:10DCE0000000F90402000200FA0402000200F90434 ++:10DCF00004000400FA0404000400F9040100010017 ++:10DD0000FA04010001005344A90A3D49C0004249F8 ++:10DD1000000042490F00424900003B4917003C49BE ++:10DD2000C507977A977A977A977A877A877A977BCF ++:10DD300021842384348384806782568034824AC459 ++:10DD400080004A847F000A46A0006A4419004AC441 ++:10DD500044004A4480004C04001000104D04004070 ++:10DD600000404C04000800084D04002000003B0463 ++:10DD7000020002003C04020000003B04010001001C ++:10DD80003C0401000000D70401000100D70440005A ++:10DD900040008007000400048007000200020F0911 ++:10DDA0000009010906090709080902090309090907 ++:10DDB0000A090B09040905090C090D090E091109C5 ++:10DDC000D7C6010031C600183B4400003C440000A7 ++:10DDD0004C440000E6440000F9440000B044000058 ++:10DDE00038490000B04400004E44000067C50300FD ++:10DDF0004AC444004A4480004AC444004A44800063 ++:10DE0000D60603000000DA06080008005F36291F66 ++:10DE10005F36291F5F36291F5F36291F000000006B ++:10DE200000000000000000000000000000000000F2 ++:10DE300000000000000000000000000004000000DE ++:10DE400000000000040000000800000001000000C5 ++:10DE500005000000090000000D0000004D0000005A ++:10DE60008D0000000D0000004D0000008D0000003E ++:10DE7000CD0000005200000092000000D20000001F ++:10DE8000D60000001601000016050000160900006B ++:10DE900056090000560D00005611000096110000B2 ++:10DEA000965100009691000096D100009611010055 ++:10DEB0000000000000000000000000000000000062 ++:10DEC000000000000000000004000000000000004E ++:10DED0000400000008000000010000000500000030 ++:10DEE000090000000D0000004D0000008D00000042 ++:10DEF0000D0000004D0000008D000000CD0000006E ++:10DF00005200000092000000D2000000D600000085 ++:10DF10001601000016050000160900005609000051 ++:10DF2000560D000056110000565100005691000099 ++:10DF300056D10000561101005651010056910100C2 ++:10DF400056D10100000000000000000000000000A9 ++:10DF500000000000000000000000000000000000C1 ++:10DF600000000000000000000000000000000000B1 ++:10DF700000000000000000000000000000000000A1 ++:10DF80000000000000000000000000000000000091 ++:10DF90000000000000000000000000000A0009006E ++:10DFA000060005000A000900060005000A00090035 ++:10DFB000060005000A000900060005000A00090025 ++:10DFC000060005000A000900060005000A00090015 ++:10DFD000060005000A000900060005000A00090005 ++:10DFE000060005000A000900060005000A000900F5 ++:10DFF000060005000A000900060005000A000900E5 ++:10E00000060005000A000900060005000A000900D4 ++:10E01000060005000A000900060005000E000000C9 ++:10E0200000020003000400060008000B00100110AD ++:10E030000210031004100510061007100717072020 ++:10E04000072D074000000000000000000000000055 ++:10E0500000000000000000000000000000000000C0 ++:10E0600000020003000400060008000B001001106D ++:10E0700002100310041005100610071007170720E0 ++:10E08000072D074000000000000000000000000015 ++:10E090000000000000000000000000000000000080 ++:10E0A0000000000000000000000000000000000070 ++:10E0B0000000000000000000000000000000000060 ++:10E0C0000000000000000000000000000000004010 ++:10E0D0000000000000000000000000000000000040 ++:10E0E0000000000000000000000000000000000030 ++:10E0F0000000000000000000000000000000000020 ++:10E10000000000000000000000000000000000000F ++:10E1100000000000000000000000000000000000FF ++:10E1200000000000000000000000000000000000EF ++:10E1300000000000000000000000000000000000DF ++:10E1400000000000000000000000000000000000CF ++:10E1500000000000000000000000000000000000BF ++:10E1600000000000000000000000000000000000AF ++:10E170000000000000000000F8410100F82100004C ++:10E18000FB210000FB410000DBFE01007B210000C1 ++:10E1900033210000EB400000A3FE01004B02000011 ++:10E1A0004D014D014D014D014D014D014D014D01FF ++:10E1B0004D014D014D014D014D014D014D014D01EF ++:10E1C0004D014D014D014D014D014D014D014D01DF ++:10E1D0004D014D014D014D014D014D014D014D01CF ++:10E1E0004D014D014D014D014D014D014D014D01BF ++:10E1F0004D014D014D014D014D014D014D014D01AF ++:10E200004D014D014D014D014D014D014D014D019E ++:10E210004D014D014D014D014D014D014D014D018E ++:10E22000090F1418FE070B0FFBFE0105080B0E115A ++:10E230001417000000000000000306090C0F120074 ++:10E240000000000000000000000306090C0F12157A ++:10E25000181B00000000000003EB0000010010008C ++:10E26000100020000100300010004000220050008B ++:10E27000220160002202700022038000220490002C ++:10E280002205A0002206B0002207C0002208D0000C ++:10E290002209F000220A1000220B2000220C30007C ++:10E2A000220D4000220E5000220F600000000000EE ++:10E2B000000000000000000000000000000000005E ++:10E2C000000000000000000000000000040000004A ++:10E2D0000000000004000000080000000100000031 ++:10E2E00005000000090000000D0000004D000000C6 ++:10E2F0008D0000000D0000004D0000008D000000AA ++:10E30000CD0000004F0000008F000000CF00000093 ++:10E31000D3000000130100001305000013090000E2 ++:10E3200053090000530D0000531100009311000029 ++:10E33000935100009391000093D1000093110100CC ++:10E3400000000000000000000000000000000000CD ++:10E3500000000000000000000400000000000000B9 ++:10E36000040000000800000001000000050000009B ++:10E37000090000000D0000004D0000008D000000AD ++:10E380000D0000004D0000008D000000CD000000D9 ++:10E390004F0000008F000000CF000000D3000000FD ++:10E3A00013010000130500001309000053090000C9 ++:10E3B000530D000053110000535100005391000011 ++:10E3C00053D100005311010053510100539101003A ++:10E3D00053D1010000000000000000000000000018 ++:10E3E000000000000000000000000000000000002D ++:10E3F000000000000000000000000000000000001D ++:10E40000000000000000000000000000000000000C ++:10E4100000000000000000000000000000000000FC ++:10E4200000000000000000000000000001040204E1 ++:10E4300003040404050406040704080409040A0488 ++:10E440008B058C058D058E058F059000910092003F ++:10E4500093019401950196019701980199019A0100 ++:10E460009B019C019D019E019F01A001A101A201B0 ++:10E47000A301A401A50100000101010101010101A5 ++:10E48000010101010101010101010101010101017C ++:10E490000101010101010203010302010101010166 ++:10E4A000010101010101010101010101010101015C ++:10E4B000010101010101010101010101010101014C ++:10E4C000010101010101010101010101010101013C ++:10E4D0000101010101010203010302010101010126 ++:10E4E000010101010101010101010101010101011C ++:10E4F0000101010101010101A0E101004000000052 ++:10E50000020000000000000010000000F8E0010020 ++:10E5100040000000010000000000000010000000AA ++:10E5200078E101000A0000000B000000000000007C ++:10E53000200000005CE20100140000000C0000005C ++:10E540000000000020000000C8E901009400000065 ++:10E550000D00000000000000200000002CE401007D ++:10E56000260000000E000000000000001000000067 ++:10E570009CDF0100400000000F00000000000000D0 ++:10E58000100000002CEC0100100000001000000042 ++:10E59000000000000800000020E201003C00000034 ++:10E5A000110000000000000008000000ACE20100C3 ++:10E5B00060000000120000000000000020000000C9 ++:10E5C00078E401008000000014000000000000005A ++:10E5D0000800000010E601009A000000170000008B ++:10E5E000000000001000000020E001006C000000AE ++:10E5F00000000000000000001000000044E70100DF ++:10E60000A000000018000000000000002000000032 ++:10E610001A0034004E0068009C00D000EA0004019B ++:10E62000340068009C00D0003801A001D401080229 ++:10E630004E009C00EA003801D4017002BE020C03B7 ++:10E640006800D0003801A00170024003A803100444 ++:10E6500018009C00D0000401EA0038018601D000B7 ++:10E660000401040138016C016C01A001380186012C ++:10E670008601D401220222027002040138016C01D9 ++:10E6800038016C01A001D401A001D40108020802E4 ++:10E690003C028601D4012202D40122027002BE0291 ++:10E6A0007002BE020C030C035A0336006C00A20079 ++:10E6B000D8004401B001E6011C026C00D8004401FE ++:10E6C000B00188026003CC033804A2004401E601D3 ++:10E6D0008802CC031005B2055406D800B0018802A8 ++:10E6E00060031005C0069807700818004401B001C7 ++:10E6F0001C02E60188022A03B0011C021C028802E7 ++:10E70000F402F402600388022A032A03CC036E0495 ++:10E710006E0410051C028802F4028802F4026003F1 ++:10E72000CC036003CC0338043804A4042A03CC03CC ++:10E730006E04CC036E041005B2051005B205540634 ++:10E740005406F6060000080000000800000008005B ++:10E750000000080000000800000008000000080099 ++:10E760000000080000000800000008000000080089 ++:10E770000000080000000800000008000000080079 ++:10E780000000080000000800000008000000080069 ++:10E790000000080000000800000008000000080059 ++:10E7A0000000080000000800000008000000080049 ++:10E7B0000000080000000800000008000000080039 ++:10E7C0000000080000000800000008000000080029 ++:10E7D0000000080000000800000008000000080019 ++:10E7E0000000080000000800000008000000080009 ++:10E7F00000000800000008000000080000000800F9 ++:10E8000000000800000008000000080000000800E8 ++:10E8100000000800000008000000080000000800D8 ++:10E8200000000800000008000000080000000800C8 ++:10E8300000000800000008000000080000000800B8 ++:10E8400000000800000008000000080000000800A8 ++:10E850000000080000000800000008000000080098 ++:10E860000000080000000800000008000000080088 ++:10E870000000080000000800000008000000080078 ++:10E880000000080000000800000008000000080068 ++:10E890000000080000000800000008000000080058 ++:10E8A0000000080000000800000008000000080048 ++:10E8B0000000080000000800000008000000080038 ++:10E8C0000000080000000800000008000000080028 ++:10E8D0000000080000000800000008000000080018 ++:10E8E0000000080000000800000008000000080008 ++:10E8F00000000800000008000000080000000800F8 ++:10E9000000000800000008000000080000000800E7 ++:10E9100000000800000008000000080000000800D7 ++:10E9200000000800000008000000080000000800C7 ++:10E9300000000800000008000000080000000800B7 ++:10E9400000000800000008000000080000000800A7 ++:10E950000000080000000800000008000000080097 ++:10E960000000080000000800000008000000080087 ++:10E970000000080000000800000008000000080077 ++:10E980000000080000000800000008000000080067 ++:10E990000000080000000800000008000000080057 ++:10E9A0000000080000000800000008000000080047 ++:10E9B0000000080000000800000008000000080037 ++:10E9C000000008000500000000000000000000003A ++:10E9D0000000001000000000000000200000000007 ++:10E9E00000000030000000000000004000000000B7 ++:10E9F0000000005000000000000000600000000067 ++:10EA00000000007000000000000000800000000016 ++:10EA10000000009008000000000000A008000000B6 ++:10EA2000000000B008000000000000C00800000066 ++:10EA3000000000D008000000000000E00800000016 ++:10EA4000000000F0080000000000000009000000C5 ++:10EA50000000001009000000000000201900000064 ++:10EA60000000003019000000000000401900000004 ++:10EA700000000050190000000000006019000000B4 ++:10EA80000000007019000000000000801900000064 ++:10EA90000000009019000000000000A01900000014 ++:10EAA000000000B019000000000000C019000000C4 ++:10EAB000000000D019000000000000E01900000074 ++:10EAC000000000F019000000000000001A00000023 ++:10EAD000000000101A000000000000201A000000D2 ++:10EAE000000000301A000000000000401A00000082 ++:10EAF0000000005002000000000000600200000062 ++:10EB00000000007002000000000000800200000011 ++:10EB10000000009002000000000000A002000000C1 ++:10EB2000000000B002000000000000C00A00000069 ++:10EB3000000000D00A000000000000E00A00000011 ++:10EB4000000000F00A000000000000000B000000C0 ++:10EB5000000000100B000000000000200B0000006F ++:10EB6000000000300B000000000000400B0000001F ++:10EB7000000000501B000000000000601B000000AF ++:10EB8000000000701B000000000000801B0000005F ++:10EB9000000000901B000000000000A01B0000000F ++:10EBA000000000B01B000000000000C01B000000BF ++:10EBB000000000D01B000000000000E01B0000006F ++:10EBC000000000F01B000000000000001C0000001E ++:10EBD000000000101C000000000000201C000000CD ++:10EBE000000000301C000000000000401C0000007D ++:10EBF000000000501C000000000000601C0000002D ++:10EC0000000000701C000000000000801C000000DC ++:10EC1000000000901C0000001CDE010060000000ED ++:10EC20001200000000000000200000005F36291FD5 ++:10EC30005F36291F5F36291F5F36291F0CDE010052 ++:10EC4000100000001000000000000000080000009C ++:10EC500090E8860000008000010000000000000035 ++:10EC600000000000000000007363616E00000000FF ++:10EC700044EB86000100204005000000A2A58600AC ++:10EC8000020020400500000090A5860003002040FF ++:10EC9000050000007EA5860004002040050000005D ++:10ECA000759986000500104005000000EBE886001D ++:10ECB00006002040020000004CEB86000C00000023 ++:10ECC000010000005EEB8600070020000800000045 ++:10ECD0000000000000000000000000006E6F637282 ++:10ECE00063005344494F0043444300000D16800025 ++:10ECF0008D13800025118000291480001D138000D1 ++:10ED0000A1168000E1EA0000011380002D138000AD ++:10ED1000000000001D16800005000000FFFFFFFF3F ++:10ED20001400000005000000FFFFFFFF05000000C9 ++:10ED300005000000050000000E0E0E0E0E02090D6B ++:10ED40000A080D01090D0A080D01090D0A080D0137 ++:10ED5000090D0A080D01090E0A090E060A0E0B0913 ++:10ED60000E02093A160E0E05093A160E0E050A0E87 ++:10ED70000B090E050A0E0B090E020A0E0B090E02F4 ++:10ED800014C0C015110514C0C015110514C0C0155C ++:10ED9000110514C0C015110514C0C0151105093A9C ++:10EDA000160E0E0514C0C015110514C0C0151105AE ++:10EDB000093A160E0E05093A160E0E05093A160EF8 ++:10EDC0000E0514C0C0151105093A160E0E05093AB4 ++:10EDD000160E0E05093A160E0E0509B21C0E0E058A ++:10EDE00012B119111108000000000000000000001D ++:10EDF0000000000019300200F52F0200E12F020090 ++:10EE000055AA80000000000021AA800085AA800089 ++:10EE100031AA80006DAA8000C993800095A9800066 ++:10EE2000BDA98000D5938000B593800075938000C4 ++:10EE3000D191800000000000B1A98000736470636C ++:10EE40006D6465760000000000000000F4ED010034 ++:10EE500000000000000000000000000000000000B2 ++:10EE60000000000000000000776C000000000000BF ++:10EE70000000000000000000F0250000000000007D ++:10EE80000000000000000000000000000000000082 ++:10EE900000000000F918010DE400F4DEF106FC0F9B ++:10EEA00027FAFF1DF01018090AF210E017140411D8 ++:10EEB00014F1FAF2DBF7FCE2FBE1EE130DFF1CE9C3 ++:10EEC0001A17180300DAE803E617E4E9F3FF121350 ++:10EED00005E104E225F706F2ECF1FC11E914F0E09B ++:10EEE000F6F2E8091010011DD9FA040F0F060CDE26 ++:10EEF0001C00FF0D07181AF60EE4160FF905EC18A2 ++:10EF00001B0A1EFF0026E2FFE50A14180705EA0F98 ++:10EF1000F2E4E6F608080808080808090A080807DD ++:10EF200007010202020202020202020202020202BD ++:10EF30000202020201010000000000000000C50101 ++:10EF40001DFFE0FFC0FFE0FF0000000000FF000029 ++:10EF500000006B0382FEE7FFCCFFE7FF0800020022 ++:10EF60000000D7010BFFEEFFDCFFEEFFA7033CFE26 ++:10EF7000ECFF1700ECFF720385FEAEFEF801AEFE5B ++:10EF8000070004000000980160FFCBFF96FFCBFF55 ++:10EF90009C0345FE2500C1FF2500B10316FEE4FEDB ++:10EFA000A501E4FE07000000010000006C0900005C ++:10EFB0000B0A00070A88888002000000710900001F ++:10EFC0000B0A00070A888880030000007609000009 ++:10EFD0000B0A00070A888880040000007B090000F3 ++:10EFE0000B0A00070A8888800500000080090000DD ++:10EFF0000B0A00070A8888800600000085090000C7 ++:10F000000B0A00070A888880070000008A090000B0 ++:10F010000B0A00070A888880080000008F0900009A ++:10F020000B0A00070A888880090000009409000084 ++:10F030000B0A00070A8888800A000000990900006E ++:10F040000B0A00070A8888800B0000009E09000058 ++:10F050000B0A00070A8888800C000000A309000042 ++:10F060000B0A00070A8888800D000000A80900002C ++:10F070000B0A00070A8888800E000000B40900000F ++:10F080000B0A00070A88888000000000A200000028 ++:10F0900000FF00FF00000000000000FF0000000073 ++:10F0A0007802A0FE80FF00FF80FF08000100000042 ++:10F0B000760179FFF0FFE0FFF0FF1F0374FECEFF43 ++:10F0C000E0FFCEFFEE022BFE2CFF32002CFF0800EB ++:10F0D00002000000770116FFDBFFB4FFDBFF1F0318 ++:10F0E00074FEE0FFECFFE0FFEC02F2FE80FF1E008A ++:10F0F00080FF080003000000770116FFDBFFB4FF6C ++:10F10000DBFF1F0374FEE0FFECFFE0FFEC02F2FE0A ++:10F110006CFF23006CFF0800040000003301AEFF09 ++:10F12000CBFF96FFCBFF0B0385FECBFF0A00CBFF87 ++:10F13000FD022BFE2CFFCA002CFF0800140001006A ++:10F14000BF0131FFF20049FEF200870361FE33FF89 ++:10F15000620133FF800378FEDAFEE900DAFE080080 ++:10F1600015000100BF0131FF18010EFE18018703D1 ++:10F1700061FE16FF7C0116FF800378FE8FFF93006F ++:10F180008FFF090016000100BF0131FF620055FF2B ++:10F190006200870361FE1FFF6B011FFF79037EFE84 ++:10F1A000F4FE5D00F4FE080017000100BC0131FF11 ++:10F1B000740042FF7400870361FE52FF020152FF98 ++:10F1C000800378FE7FFFF1FF7FFF08001800010039 ++:10F1D000B40131FFDFFF1D00DFFF880361FE87FF01 ++:10F1E00090FF87FF7F0378FECDFEF401CDFE08007F ++:10F1F00019000100AD0131FFB8FF3E00B8FF8203E6 ++:10F2000061FEAAFFB1FFAAFF7F0378FEC7FEFE01E1 ++:10F21000C7FE08001A000100930154FFD9FF0C003B ++:10F22000D9FF1B03C7FE4CFF38004CFF3303B8FE69 ++:10F2300080FF280080FF08001B000100890154FFA7 ++:10F24000CFFF1300CFFF1703C7FE00FF500000FFE2 ++:10F250002E03BDFE8BFF25008BFF08001E00010062 ++:10F26000BB0119FFC3FF1D00C3FF6B0361FE66FFF7 ++:10F27000480066FF7C0378FE56FF4F0056FF0800EB ++:10F280002C000100BF0131FFE00071FEE0008703A8 ++:10F2900061FE8BFFC4008BFF800378FEB2FEC000CE ++:10F2A000B2FE0800000001009F01520740008000EC ++:10F2B0004000180378064000800040000A032E0634 ++:10F2C0004000800040000800010001009201370763 ++:10F2D00003013B0003019F02020744003600440083 ++:10F2E000600247075D00A7005D0008000200010002 ++:10F2F0009F01520740008000400018037806C000BC ++:10F300008001C0000A032E06400080004000080073 ++:10F31000030001002E0131078100020181009202E9 ++:10F32000B806CD009A01CD00F202E006AA00540111 ++:10F33000AA0008001400010068015CFFF200C6FE8C ++:10F34000F200F002B8FE33FFCB0033FFFF02E0FE15 ++:10F3500003FF49FF03FF08001500010068015CFF7F ++:10F36000950052FF9500F002B8FE33FFA40033FF72 ++:10F37000FF02E0FE00FFEFFE00FF080016000100A4 ++:10F3800068015CFF62009CFF6200F002B8FE33FF80 ++:10F390007C0033FFFF02E0FE00FFA0FE00FF08003C ++:10F3A000170001005E015CFF8CFF52008CFFF00231 ++:10F3B000B8FE33FF280033FFFF02E0FE7FFF15FF9A ++:10F3C0007FFF08001800010045015CFFE0FFD8FF47 ++:10F3D000E0FFF402B8FE00FF29FE00FFFE02E0FE9F ++:10F3E000FAFEAA00FAFE0800190001002B015CFFDA ++:10F3F000CDFFC0FFCDFFE002B8FE00FF29FE00FFF9 ++:10F40000FD02E0FEFAFEAA00FAFE08001A00010062 ++:10F41000150197FFD9FF8BFFA8FF7D022EFFC0FFCC ++:10F4200040FF70FF660248FF80FF80FEE0FE08009C ++:10F430001B000100F50097FFCFFF6DFF92FF7202E6 ++:10F440002EFF5EFF1BFE95FE650248FFC2FF46FFD2 ++:10F4500075FF08001E0001002E0131FFC3FF86FF6B ++:10F46000C3FF9202B8FE33FF66FE33FFF202E0FEF6 ++:10F4700056FFACFE56FF08002800010068015CFF43 ++:10F48000F200C6FEF200F002B8FECD0035FFCD005E ++:10F49000FF02E0FEFF017201FF0108000501000804 ++:10F4A0000001FFFF0000000000000000000000005D ++:10F4B000000000000000000000000000000000004C ++:10F4C000000000000000000000000000000000003C ++:10F4D000000000000000000000000000000000002C ++:10F4E000000000000000000000000000000000001C ++:10F4F000000000000000000000000000000000000C ++:10F5000000000000000000000000000000000000FB ++:10F5100000000000000000000000000000000000EB ++:10F5200000000000000000000000000000000000DB ++:10F5300000000000000000000000000000000000CB ++:10F5400000000000000000000000000000000000BB ++:10F5500000000000000000000000000000000000AB ++:10F56000000000000000000000000000000000009B ++:10F57000000000000000000000000000000000008B ++:10F58000000000000000000000000000000000007B ++:10F59000000000000000000000000000000000006B ++:10F5A000000000000000000000000000000000005B ++:10F5B000000000000000000000000000000000004B ++:10F5C000000000000000000000000000000000003B ++:10F5D000000000000000000000000000000000002B ++:10F5E000000000000000000000000000000000001B ++:10F5F000000000000000000000000000000000000B ++:10F6000000000000000000000000000000000000FA ++:10F6100000000000000000000000000000000000EA ++:10F6200000000000000000000000000000000000DA ++:10F6300000000000000000000000000000000000CA ++:10F6400000000000000000000000000000000000BA ++:10F6500000000000000000000000000000000000AA ++:10F66000000000000000000000000000000000009A ++:10F67000000000000000000000000000000000008A ++:10F68000000000000000000000000000000000007A ++:10F69000000000000000000000000000000000006A ++:10F6A000000000000000000000000000000000005A ++:10F6B000000000000000000000000000000000004A ++:10F6C000000000000000000000000000000000003A ++:10F6D000000000000000000000000000000000002A ++:10F6E000000000000000000000000000000000001A ++:10F6F000000000000000000000000000000000000A ++:10F7000000000000000000000000000000000000F9 ++:10F7100000000000000000000000000000000000E9 ++:10F7200000000000000000000000000000000000D9 ++:10F7300000000000000000000000000000000000C9 ++:10F7400000000000000000000000000000000000B9 ++:10F7500000000000000000000000000000000000A9 ++:10F760000000000000000000000000000000000099 ++:10F770000000000000000000000000000000000089 ++:10F780000000000000000000000000000000000079 ++:10F790000000000000000000000000000000000069 ++:10F7A0000000000000000000000000000000000059 ++:10F7B0000000000000000000000000000000000049 ++:10F7C0000000000000000000000000000000000039 ++:10F7D0000000000000000000000000000000000029 ++:10F7E0000000000000000000000000000000000019 ++:10F7F0000000000000000000000000000000000009 ++:10F8000000000000000000000000000000000000F8 ++:10F8100000000000000000000000000000000000E8 ++:10F8200000000000000000000000000000000000D8 ++:10F8300000000000000000000000000000000000C8 ++:10F8400000000000000000000000000000000000B8 ++:10F8500000000000000000000000000000000000A8 ++:10F860000000000000000000000000000000000098 ++:10F870000000000000000000000000000000000088 ++:10F880000000000000000000000000000000000078 ++:10F890000000000000000000000000000000000068 ++:10F8A0000000000000000000000000000000000058 ++:10F8B0000000000000000000000000000000000048 ++:10F8C0000000000000000000000000000000000038 ++:10F8D0000000000000000000000000000000000028 ++:10F8E0000000000000000000000000000000000018 ++:10F8F00083682DE9F0415B690546152B0F460AD058 ++:10F90000182B08D01B2B06D0242B01D0272B04D179 ++:10F910002B8A7F2B05D80C2304E0172B01D0182B42 ++:10F9200001DD1423AB624FF004430022BB6100E011 ++:10F930000132BB69002B03DA1D4B9A42F8D134E047 ++:10F940001C4B9A4231D8AE6A3C69331DAB83AC6123 ++:10F95000A868298AE1F3DAF4022390FBF3F014F4A7 ++:10F96000807F68840AD0284639463246E1F3E6F4BF ++:10F97000C0F30F1083B2E8832B8403E0AB8B2B849E ++:10F980006B8CEB83AB6913F4007F0AD0AA6A28461C ++:10F9900039460132E1F3D2F4C0F30F1083B2688428 ++:10F9A00000E02B8CAB842B8AEB84BDE8F081C04651 ++:10F9B000809698007F96980070B50446E1F3D0F2E7 ++:10F9C000002144220546E2F33BF36369152B2B60CB ++:10F9D00001D0162B01D9104B6B60686808B9054639 ++:10F9E00017E0AC602046EBF385F3E8602046EBF3CC ++:10F9F00049F3064618B920460121EBF381F36B6801 ++:10FA000020469B68984705461EB920463146EBF3D1 ++:10FA100077F3284670BDC046ECEC01000523C0F822 ++:10FA200094310223C0F898311E33C0F89C31234B27 ++:10FA30004FF010021B68002B0CBF07230023C0F8F7 ++:10FA4000A0314FF00103C0F8AC3103F16303C0F8FB ++:10FA5000B0314FF00603C0F8C03140F23C73C0F83B ++:10FA6000C4314FF00803C0F8C83103F10D03C0F8EA ++:10FA7000A421C0F8B821C0F8BC21C0F8CC31C0F82E ++:10FA8000D02101D1032302E00D4B1B68013BC0F8DC ++:10FA9000D4311C230422C0F8DC310C23C0F8E0313F ++:10FAA0009B18C0F8E4310623C0F8EC310023C0F8FD ++:10FAB000D821C0F8E821C0F8F0317047EC260000EA ++:10FAC000D4250000D0F8101270B5044609B90D46CF ++:10FAD0000CE08068E3F368F0D4F810120546E822E1 ++:10FAE000A068E7F305F10023C4F81032284670BD82 ++:10FAF00070B50024054680F87541006903F0F0FAFE ++:10FB00002846EAF3D9F0E8682146EBF393F1D5F8FB ++:10FB1000900128B1E6F3D2F3D5F89001E6F318F49A ++:10FB2000D5F88C0128B1E6F3C9F3D5F88C01E6F3DA ++:10FB30000FF4E86805F070FBD5F8103223B11B789C ++:10FB400013B12846FFF7BEFFA86829464FF4077295 ++:10FB5000E7F3CEF070BDC0461FB5044606238068AB ++:10FB6000E8210393E7F3B4F0C4F8100210B94FF0A2 ++:10FB7000FF300CE00021E822E2F362F20023009360 ++:10FB8000A068D4F8101203AA1C33E3F3A5F004B064 ++:10FB900010BDC0462DE9F0478AB01F46129D9C4B10 ++:10FBA00008461D6011469046EAF308F0002800F070 ++:10FBB0002A8138464FF40771E7F38AF0044600289B ++:10FBC00000F0218100214FF407720646E2F338F27B ++:10FBD000A76065612046FFF721FF8E4B1B68C4F8C4 ++:10FBE0000C320BB99A4605E01B78B3F1000A18BF36 ++:10FBF0004FF0010A884B04F128001A680121002AFD ++:10FC000014BF31221122E3F339F100230093019351 ++:10FC10000293404639462A46139B05F03BFCE060C0 ++:10FC2000002800F0EA80EBF31DF12060E068EBF3C0 ++:10FC300037F1656960606B68784A83F00103784941 ++:10FC400003F00103002B0CBF88469046226884F81D ++:10FC5000763140F629039A42D4F80890D4F80CC0C3 ++:10FC60000AD120B905F5007E05F5047508E005F513 ++:10FC7000007E05F5087503E005F5007E05F50475C1 ++:10FC8000D4F8B831D4F8BC21D4F8C411D4F8C001E8 ++:10FC900001934FF0FF33049309330693002302923C ++:10FCA0000391059007934846414662467346009586 ++:10FCB000EFF74AF96062002800F09F80D4F80C1238 ++:10FCC000C1B10B78B3B1E4F393F756492246D4F8A7 ++:10FCD0000C02E2F355F7D4F80C0253492246E2F342 ++:10FCE00089F7BAF1000F05D02046FFF735FF00284D ++:10FCF00040F0838001210A46606AE4F381F72046E0 ++:10FD00000021E2683B4603F0F7F92061002874D037 ++:10FD100000210B462046454AE6F33CF30023C4F895 ++:10FD2000900184F879314248E7F3A0F718B3E2F381 ++:10FD3000CFF3012383403F48C4F88031E7F396F7BF ++:10FD400010B1E2F3C5F308B1D4F88001C4F884011E ++:10FD500039490020E2F310F6030CA4F888319BB275 ++:10FD6000A4F88A013BB100212046344A0B46E6F351 ++:10FD700011F3C4F88C0100203149E2F3FDF50128AC ++:10FD800009D184F816022F490138E2F3F5F501286C ++:10FD900004BF2D4B18602046E9F370F520B3002511 ++:10FDA000C4F8A05128462949E2F3E6F528B1012319 ++:10FDB00084F8F9312648EFF781F928462549E2F31E ++:10FDC000DBF588B123492846E2F3D6F54FF080737E ++:10FDD00000F00F000AA901F8010D4FF440720093E2 ++:10FDE00020460F23E2F7A2FF1B481C492246E6F3F8 ++:10FDF00081F61B48EAF7FCFA06E0A06821464FF4BA ++:10FE00000772E6F375F7002630460AB0BDE8F087C2 ++:10FE1000F4260000BC260000EC260000AE27860079 ++:10FE2000B6278600DD9B80005929000065A680006A ++:10FE3000052886000E28860017288600499B80002A ++:10FE40001F28860028A80100A8F401002A2886009F ++:10FE50003428860039A801004D288600E59A8000E4 ++:10FE6000D596800010B5044660B10368064918684D ++:10FE7000224604F069D82368214658684FF4BC72C2 ++:10FE8000E6F336F710BDC046853B86007FB50546D4 ++:10FE90004FF4BC714068E6F31BF708B9064619E059 ++:10FEA00000214FF4BC720646E2F3CAF00B4B3560FA ++:10FEB00000930B4B002401932868334609490A4AF2 ++:10FEC0000294039404F008D84FF49663C6F86031A6 ++:10FED00086F86441304604B070BDC046C5EB0000F2 ++:10FEE0000531000060A80100853B860041F2E44333 ++:10FEF000984201D00020AFE044F22033994200F054 ++:10FF0000AA800533994200F0A680223B994200F076 ++:10FF1000A2801E33994200F09E800333994200F084 ++:10FF20009A800C3B994200F096800133994200F090 ++:10FF300092800133994200F08E80093B994200F093 ++:10FF40008A800233994200F08680013B994200F09A ++:10FF50008280023399427ED0013399427BD00133B3 ++:10FF6000994278D00533994275D00133994272D0C5 ++:10FF7000013399426FD001F53C43D8339BB2022B39 ++:10FF800069D94BF6D543CB189BB2022B63D944F207 ++:10FF9000413399425FD0013B99425CD001F53C432B ++:10FFA000B0339BB2022B56D944F25333994252D00C ++:10FFB000043399424FD04AF69D1399424BD044F2F4 ++:10FFC0005433994247D0253B994244D0013B994252 ++:10FFD00041D0063399423ED0013399423BD00133A0 ++:10FFE000994238D04BF6C943CB189BB2022B32D979 ++:10FFF00044F2167399422ED0113399422BD0A3F5B7 ++:020000022000DC ++:100000007973994227D001F53C43A0339BB2012B71 ++:1000100021D901F53C43BA339BB2022B1BD94BF6D5 ++:10002000CF43CB189BB2012B15D94BF6AB43CB1862 ++:100030009BB2012B0FD901F53C43A8339BB2012B96 ++:1000400009D944F26333994205D00D33994214BF64 ++:100050000020012000E001207047C0462DE9F84F44 ++:1000600000264FF0010842F601334FF0FF344FF005 ++:10007000640B0746A0F8283680F8474680F8C44449 ++:100080000221224680F8288080F868B780F842660E ++:1000900080F84C8680F8436680F8498680F846668A ++:1000A00005F066DC38464146324605F061DC0C213D ++:1000B0002246384605F05CDC0B213846324605F016 ++:1000C00057DC0E212246384605F052DC0D21384619 ++:1000D000324605F04DDC0F212246384605F048DC5B ++:1000E00004210222384605F043DCD7F860364FF091 ++:1000F000030987F8488683F80690D7F860364FF0F2 ++:10010000020A83F8079040F62A13A7F82A36A7F8C0 ++:100110002C369BB2A7F82E3640F62A13A7F83036B5 ++:10012000A7F83236A7F83436A7F8363640F62B1340 ++:10013000A7F838363B68A7F87A6583F895604FF0E2 ++:100140000703A7F83A364FF00403A7F83C360F230D ++:1001500087F80C37D7F89034A7F83E96C7F8803266 ++:10016000A7F840A6A7F87C68A7F87EB887F8EA61E8 ++:1001700087F8EB6187F81E6287F8EE6187F8EC611B ++:1001800087F8FA8187F80B6787F8A0649E71D7F823 ++:1001900094340B22C7F8843283F80680D7F8983459 ++:1001A0003146C7F8883283F806A0D7F89C34354624 ++:1001B000C7F88C3283F806903B6887F8506783F85D ++:1001C0004D805C633B6807F5CC6483F842803B68F4 ++:1001D000043483F843603B6887F8CF6183F8396063 ++:1001E0003B68204683F8AA803B6887F8DF6187F880 ++:1001F000E081C7F8E46187F8E161DE66E1F320F7AA ++:100200006FF0220387F864362C3387F865364A4648 ++:1002100004EB0A001A49E1F3AFF63B6887F869A6D8 ++:1002200087F8568587F8578583F84C603A6887F8D1 ++:100230009267A7F89067A7F88CB892F8463013F049 ++:10024000030F0CD092F94C304BB1D7F8FC0424309A ++:10025000F4F3FEF7D7F8FC043230F4F3F9F74FF477 ++:100260004873A7F85C373B68012287F8252883F894 ++:10027000A2203A684FF0FF3382F8B530BDE8F88F1E ++:10028000C3A60100836B70B5002483F84C40C36B98 ++:10029000012583F84C500646816BE3F799F9F16B21 ++:1002A0003046E3F795F921463046F9F351F5B36B43 ++:1002B000304683F84D40F36B294683F84D40D6F81D ++:1002C00060364FF0FF34DD72D6F860369C81F9F36A ++:1002D0003FF5D6F860369B78AB4214D9B36B83F800 ++:1002E0004D40F26B4FF0FF3382F84D3096F8CB342F ++:1002F00096F8CC2443EA022343F0800386F8CB34FB ++:100300001B0A86F8CC3470BDD0F8AC1110B5044689 ++:1003100029B18068EFF3B4F10023C4F8AC31D4F80C ++:10032000C41129B1A068EFF3ABF10023C4F8C431C4 ++:10033000D4F8741529B1A068EFF3A2F10023C4F832 ++:100340007435D4F8F81629B1A068EFF399F10023B9 ++:10035000C4F8F836D4F8FC1629B1A068EFF390F190 ++:100360000023C4F8FC36D4F8E036196A31B1A0682D ++:10037000EFF386F1D4F8E02600231362D4F83C159D ++:1003800029B1A068EFF37CF10023C4F83C35D4F820 ++:10039000941729B1A068EFF373F10023C4F89437E0 ++:1003A000D4F8B01829B1A068EFF36AF10023C4F8BB ++:1003B000B03810BD70B505462D4980682A46002327 ++:1003C000EFF37AF1C5F8AC0100284ED0A8682949AE ++:1003D0002A460023EFF370F1C5F8C401002844D089 ++:1003E000A86825492A460023EFF366F1C5F874058D ++:1003F00000283AD0A86821492A460023EFF35CF18F ++:10040000C5F8F806002830D0A8681D492A46002300 ++:10041000EFF352F1C5F8FC0638B3A86819492A462B ++:100420000023D5F8E046EFF347F12062E8B1A86871 ++:1004300015492A460023EFF33FF1C5F83C05A0B16A ++:10044000A86812492A460023EFF336F1C5F894074D ++:1004500058B1A8680E492A460023EFF32DF1C5F8DC ++:10046000B008003818BF012000E0002070BDC04671 ++:100470003DAA81003D708100253E8100959181005B ++:10048000858F8100256E810089598100396B81003B ++:10049000496F810010B50446006805F0A7FFD4F845 ++:1004A000480120B105F078FA0023C4F84831D4F8A7 ++:1004B000583113B10023C4F85831D4F83C0120B1AD ++:1004C00005F008FA0023C4F83C31D4F8400120B10B ++:1004D00001F078F80023C4F84031D4F84C0120B181 ++:1004E00002F0EEF80023C4F84C31D4F8540120B1E6 ++:1004F00005F0A6FA0023C4F85431D4F8600120B105 ++:1005000007F0EAF80023C4F86031D4F8383113B1A9 ++:100510000023C4F83831D4F8640120B102F008F89F ++:100520000023C4F86431D4F8000520B107F010FAB4 ++:100530000023C4F80035204605F0BEFB10BDC046C0 ++:100540002DE9F041054608B9074695E001F068FC41 ++:100550000746284605F06ADB00B90137D5F8F016E2 ++:1005600049B16868D5F8F426E6F3C2F30023C5F86C ++:10057000F436C5F8F0362846D5F81815FCF38AF29B ++:100580002846D5F8D816FCF385F2D5F8201528466C ++:10059000FCF380F2D5F82C1521B168684FF496620F ++:1005A000E6F3A6F3D5F87C0220B105F03DFB00236D ++:1005B000C5F87C3200242B19D3F84C1211B128460F ++:1005C0001EF03ADF0434202CF5D10121284635F005 ++:1005D000C9D8284601F082FF2E6BB16911B12846B7 ++:1005E00034F054DB0024B461D5F85C0105F066FA00 ++:1005F0002846FFF789FE2846FFF74CFF2846D5F826 ++:100600002C18E2F7DDFFC5F82C48D5F8B84404E013 ++:1006100068681022E468E6F36BF32146002CF7D1FA ++:10062000C5F8B844286816492A4603F08DDCD5F889 ++:10063000340718B101F008F9C5F83447D5F8680156 ++:1006400018B107F0AFF8C5F86841D5F8181759B1D7 ++:100650006868D5F81C27E6F34BF3C5F8184703E0A4 ++:10066000284669680AF0B0DBD5F87822002AF7D16D ++:100670002846696800F02CFD3846BDE8F081C04688 ++:10068000BB5C8600036870B55E6905461449304658 ++:10069000E2F372F1C0B218B930461249E2F36CF1DC ++:1006A00040B2431E0E2B0ED8012803D1D5F8603678 ++:1006B000002204E0022806D1D5F8603601229A71A2 ++:1006C000D5F86036DA71084930462C6BE2F354F104 ++:1006D00084F804012846F2F3EFF4012070BDC0460F ++:1006E000C65C8600CB5C86000E5D8600036870B534 ++:1006F0001B490546D0F860465869E2F33DF1207089 ++:100700002B6818495869D5F86046E2F335F1E07076 ++:10071000D5F8602613780BB10F2B01D1012313708C ++:10072000D5F8603601211A785A70D5F8604620460F ++:10073000E1F3DEF6A070D5F86026D3780BB10F2B6D ++:1007400001D10123D370D5F860360121DA781A710E ++:10075000D5F86046E01CE1F3CBF6607170BDC04691 ++:10076000EBA80100F3A8010070B50446214600681B ++:1007700007F0FCF8C4F8000508B9293061E02068EA ++:1007800005F03CFE2068214601F082F8C4F83407E9 ++:1007900008B92A3055E02B4B2046C4F8583105F0F3 ++:1007A000B3F8C4F83C0108B931304AE0204600F003 ++:1007B00043FFC4F8400108B9323042E0204606F059 ++:1007C0009DFFC4F8600108B935303AE02068214641 ++:1007D000A2681D4B05F044FAC4F87C0208B9393010 ++:1007E0002FE0204601F0F4FEC4F8640108B93C3063 ++:1007F00027E0164B0125C4F838310023A4F830381F ++:1008000084F8883884F88A3884F88958204605F0B6 ++:10081000D5F8C4F8480108B9433012E023682146EE ++:1008200083F8A350236883F8A950236883F8A8505D ++:10083000206805F04BFA08B1452002E0236883F8F0 ++:10084000A05070BDEFBEADDE9D6D8100EFBEAD0D61 ++:10085000F0B5D0F840750021AC2287B00646384686 ++:10086000E1F3EEF34FF06403FB85032387F8603078 ++:1008700000220123D6F85C014FF42C5125F0D2DA86 ++:10088000FF2804D1336B18691968EFF7EDFA316866 ++:100890007886A6F8260691F84640336B00F440654A ++:1008A000FF201A8900211B68B5F5406F14BF14257D ++:1008B0002825019004F00304D6F860060091029404 ++:1008C00003958078049007F1380030F0D7DB336867 ++:1008D00093F8463013F0030F03D0FB8843F0200356 ++:1008E000FB8007B0F0BDC0462DE9F04F8DB01A9FD8 ++:1008F0009A46002307910B93064693461046179994 ++:10090000189A199B9DF85890009709F075FA0446BB ++:1009100010B11E230B9375E304F082FE1798514625 ++:100920000BAA00F003FD0546002800F06B83179A20 ++:100930004FF0FF334260D0F86026D0F8008082F894 ++:100940001C31836B86600363436BC8F804A0C362E9 ++:10095000179BC0F87871C8F80C30B44B88F8219018 ++:10096000C8F8B030032380F8693780F89D415146BC ++:10097000FFF774FB2846FBF323F2284605F0C0F985 ++:100980000446002840F0478328463146179A5346CC ++:1009900006F028FFC5F8680108B91F23CAE2A44B76 ++:1009A0000194009302940394A249A34A2B46286819 ++:1009B00003F092DAA14B0194009302940394A049AE ++:1009C000A04A2B46286803F087DA189A199B179ECD ++:1009D00002920393284607995A465346CDF8009051 ++:1009E0000196049701F06CFB04460B90002840F040 ++:1009F00012832B69186EEAF7E5FAA5F8BE082846B7 ++:100A0000F9F38EF008B9142394E2264631460AAA77 ++:100A10002846FAF311F531462846BDF8282001365C ++:100A2000FAF314F5062EF1D1012488F89A4005F561 ++:100A3000BE72286908F114011BF054DF8249D8F80E ++:100A40001400E1F399F781498146D8F81400E1F3E5 ++:100A500093F77F49A5F86208D8F81400E1F38CF702 ++:100A6000B5F86228A5F86408A5F87827A5F87A07EC ++:100A70007849D8F81400E1F37FF77749A5F85408CE ++:100A8000D8F81400E1F378F785F856087349D8F8D8 ++:100A90001400E1F371F785F858087149D8F814008B ++:100AA000E1F36AF785F85A086E49D8F81400E1F3C3 ++:100AB00063F785F857086C49D8F81400E1F35CF740 ++:100AC00085F859086949D8F81400E1F355F785F815 ++:100AD0005B086749D8F81400E1F34EF785F85C0825 ++:100AE0006449D8F81400E1F347F785F85E086249D5 ++:100AF000D8F81400E1F340F785F860085F49D8F8AA ++:100B00001400E1F339F785F85D085D49D8F8140061 ++:100B1000E1F332F785F85F085A49D8F81400E1F399 ++:100B20002BF785F861082846FFF7E0FDD5F8602629 ++:100B30002B6B85F8F04785F8F14718691178D27862 ++:100B4000EFF7E4FB2869EA6AD0F8A03005F5CB742A ++:100B50005360D0F8A43021469360D0F8A830D36019 ++:100B6000D0F8AC301361D0F8B0305361D0F8B43065 ++:100B700093611BF0E7DF08F14E0021463246E1F3B6 ++:100B8000FBF1B5F8822144F221339A4217D00E3B93 ++:100B90009A4214D007339A4211D010339A420ED0A1 ++:100BA000143B9A420BD007339A4208D010339A4232 ++:100BB00005D025339A4214BF0024012400E001240B ++:100BC00005EB84039B6B28462B63FFF75BFD08B99D ++:100BD0001823AFE1296B4FF00F0340F2FF36A1F865 ++:100BE000063101F1FC0201F58073A1F80861284685 ++:100BF00000F0C4FF2A6BD2F8FC30C2F8F830C2F81B ++:100C0000F030D2F80031C2F8F4301368022B07D16B ++:100C1000013B53752B6B284603215A7D04F0A8DE57 ++:100C200019F0010F30D000222FE0C0461AC35A0538 ++:100C300079DB810078D48500BB5C86002D4A0000FA ++:100C400044AA010010A90100D6688600E268860067 ++:100C5000F5688600076986001C6986002B69860096 ++:100C60003A698600496986005A6986006B69860080 ++:100C70007C6986008A69860098698600A669860074 ++:100C8000B6698600C6698600012288F846200A21D6 ++:100C9000284604F06DDE296B28461C31FCF3C6F6AD ++:100CA0007F23296B00932B68002293F8463001F1D3 ++:100CB0001C0003F0030301935031134630F01CDA9B ++:100CC000B4F1FF3F3FF45DAF2846F8F383F74FF4EC ++:100CD000D163C5F874382846FFF746FD04460B90EB ++:100CE000002840F0988128465146FFF763FB08B979 ++:100CF00020231FE1284604F0EBFEC5F85C0108B98B ++:100D0000212317E12846FFF7A3FD2146AD4AAE4B4C ++:100D100028460094019506F0FBFDAC4B6E461A1D6B ++:100D200007CA1B6886E80700072128462A4609F0FB ++:100D30009DDF04212846A64AA64B0094019506F0A3 ++:100D4000E7FD0028C5F88C0701DA2223F2E02846E7 ++:100D500017990AF00FD808B96423EBE0C5F8040826 ++:100D60004FF0FF3728469C499C4A9D4B009702F064 ++:100D70004BD9C5F82C08002800F04D81284601F019 ++:100D8000B7FB044608B12323D4E02B684FF00602DA ++:100D900093F8A130A8F86420012B04BF4023A8F8E1 ++:100DA0006430D8F88C304FF006064FF439721E804C ++:100DB0005A80D8F890304FF0C4024FF0010605F584 ++:100DC000007128461E805A8006310AF0A7DFD5F848 ++:100DD0003C0110F031D808B185F8CF61022385F8C5 ++:100DE000C0341C3385F8CB3410222B6B85F8CC240F ++:100DF0005B89022B02D81C2385F8CB342846214678 ++:100E000085F8CA7485F8C97485F8C874F9F344F490 ++:100E10002B68284683F8B4402146C5F8D471F4F312 ++:100E200053F485F8DC412846FFF72CFA19F0080F37 ++:100E300018BF85F8DC4119F0100F03D02846214671 ++:100E4000F4F342F419F0020F13D0AB6B83F84D406A ++:100E5000EB6B83F84D4095F8CB3495F8CC2443EAFE ++:100E6000022323F080039BB285F8CB341B0A85F85C ++:100E7000CC3419F0040F03D028462146F8F388F744 ++:100E800019F0800F0DD095F8CB3495F8CC2443EAB7 ++:100E9000022323F010039BB285F8CB341B0A85F89C ++:100EA000CC342B6893F842308BB119F0600F0ED020 ++:100EB00019F0200F0CBFFF21002119F0400F284628 ++:100EC00049B214BF00226FF0000200F069FB062255 ++:100ED0000DF122004349E1F34FF0B5F8822144F2CD ++:100EE00021339A4217D00E3B9A4214D007339A42CC ++:100EF00011D010339A420ED0143B9A420BD00733D4 ++:100F00009A4208D010339A4205D025339A4214BF32 ++:100F10000027012700E0012705EB8706B46B0DF1E0 ++:100F200022012846224633F073DEB16BA061886946 ++:100F300010B937230B936EE0443050312822E1F38F ++:100F40001BF0B36BB7F1FF3F9B699F62BFD0D8F82E ++:100F50005C30179E43F00403C8F85C30224BF56008 ++:100F6000B3602846EDF7DAFF1B9A0AB1002313603D ++:100F70002B681E495869E1F32BF530B100210A4670 ++:100F8000E1F3E6F31A4BC0B218602B6819495869AF ++:100F9000E1F31EF530B100210A46E1F3D9F3164B17 ++:100FA000C0B218602B6815495869E1F311F530B1EA ++:100FB00000210A46E1F3CCF3114BC0B21860284679 ++:100FC0002DE0C04639AE820001AE820028AB0100A0 ++:100FD000D5A18100ADA181002D578100415781002D ++:100FE00019578100D8A80100B54282001CA9010050 ++:100FF000E8F4010028A90100E8F801003CA901007B ++:10100000ECF801001B9B0BB9184608E00B9B1B9EDC ++:101010000020336003E02846FFF792FAF2E70DB0B4 ++:10102000BDE8F08F20230360436040F23C7383608F ++:10103000092330B503618361073303623033836270 ++:101040000F230822036340F29E330424012500216C ++:1010500042618263C3640322A3F56773C460C56100 ++:101060004462C46244630164456402654166436549 ++:101070008465C265036630BD70B505460C4631B364 ++:10108000496D11B1C022E5F333F6D4F88C1039B1B3 ++:1010900028464FF43972E5F32BF60023C4F88C3060 ++:1010A000D4F8901031B12846C422E5F321F600238C ++:1010B000C4F89030E16929B128466822E5F318F6B2 ++:1010C0000023E36128462146B822E5F311F670BDFE ++:1010D00070B50D460446002800F0E580D0F81815DC ++:1010E00039B128464FF48472E5F302F60023C4F8C0 ++:1010F0001835D4F8201539B128464FF48472E5F339 ++:10110000F7F50023C4F82035D4F8B41439B12846D3 ++:1011100040F2AC42E5F3ECF50023C4F8B434D4F863 ++:10112000401531B12846AC22E5F3E2F50023C4F8BE ++:101130004035D4F86C1229B128460BF021D9002390 ++:10114000C4F86C32D4F8FC1431B128464022E5F3DF ++:10115000CFF50023C4F8FC34D4F8841671B12368A9 ++:1011600063B1DB6953B19B690C22013303FB02F2CB ++:101170002846E5F3BDF50023C4F88436D4F8BC1442 ++:1011800019B12846B422E5F3B3F5D4F8901421B18F ++:1011900028464FF4AE62E5F3ABF5D4F8581631B1FA ++:1011A00028463822E5F3A4F50023C4F85836D4F8CD ++:1011B000601639B128464FF49072E5F399F5002393 ++:1011C000C4F86036D4F8F81731B128460622E5F3A2 ++:1011D0008FF50023C4F8F837D4F8D81639B128466B ++:1011E0004FF48472E5F384F50023C4F8D836D4F8BC ++:1011F000E01631B128462422E5F37AF50023C4F83D ++:10120000E036D4F8EC1631B128466822E5F370F5E3 ++:101210000023C4F8EC36D4F8441731B12846EC2248 ++:10122000E5F366F50023C4F84437A16B21B12846E5 ++:101230004FF40672E5F35CF5616B79B1896A31B1FF ++:1012400080222846E5F354F5626B0023936228461A ++:10125000616B2C22E5F34CF500236363216821B117 ++:101260002846FFF709FF002323602369ABB1D3F8B9 ++:10127000F81028461822E5F33BF523690026D96FBC ++:10128000C3F8F86019B128465822E5F331F528462D ++:101290002169FC22E5F32CF526612846214640F61B ++:1012A000CC02E5F325F570BD2DE9F0411646B822D4 ++:1012B00007460D460BF002D9044610B940F2E93357 ++:1012C0002BE03846294668220BF0F8D8E06110B9C7 ++:1012D00040F2044321E0FFF7A5FE38462946C0222C ++:1012E0000BF0ECD8606510B940F2EB3315E03846EE ++:1012F00029464FF439720BF0E1D8C4F88C0010B9CC ++:101300004FF47B7309E038462946C4220BF0D6D847 ++:10131000C4F8900038B940F2ED33214633603846C6 ++:10132000FFF7AAFE00242046BDE8F0812DE9F04138 ++:10133000174640F6CC0280460E460BF0BFD8054655 ++:1013400000283BD02623C0F82838314640463A468C ++:10135000FFF7AAFF2860002800F018818F4B056076 ++:101360001B683146C0F89C30FC2240460BF0A6D8E2 ++:101370000446286110B940F2ED3306E1856031463C ++:10138000404618220BF09AD8C4F8F800B0B1404695 ++:10139000314658222C690BF091D8E06770B12B6967 ++:1013A0004046DA6F31462C32C3F880204FF4847205 ++:1013B0000BF084D8C5F8180518B105E040F2EE33FB ++:1013C000E3E040F2EF33E0E0404631464FF4847210 ++:1013D0000BF074D8C5F8200510B94FF47C73D4E035 ++:1013E0004046314640F2AC420BF068D8C5F8B40430 ++:1013F00010B940F2F133C8E040463146AC220BF060 ++:101400005DD8C5F8400510B940F2F233BDE0314671 ++:101410004046EDF76DFF0146C5F86C0210B940F289 ++:10142000F333B2E028461DF099DB404631464022B6 ++:101430000BF044D8C5F8FC0410B94FF47D73A4E058 ++:101440002B680C22DB6940469B693146013303FB64 ++:1014500002F20BF033D8C5F8840610B940F2F53328 ++:1014600093E040463146B4220BF028D8C5F8BC04BE ++:1014700010B940F2F63388E0404631464FF4AE6290 ++:101480000BF01CD8C5F8900410B940F2F7337CE09B ++:101490002A464FF4AE71D5F89034CB1801F5AE71F1 ++:1014A000C2F894340432B1F5AE6FF4D140463146FF ++:1014B00038220BF003D8C5F8580610B94FF47E73E4 ++:1014C00063E0404631464FF490720AF0F7DFC5F80A ++:1014D000600638B14046314606220AF0EFDFC5F813 ++:1014E000F80710B940F2F9334FE0404631464FF467 ++:1014F00084720AF0E3DFC5F8D80610B940F2FA3377 ++:1015000043E04046314624220AF0D8DFC5F8E00621 ++:1015100010B940F2FD3338E04046314668220AF007 ++:10152000CDDFC5F8EC0610B940F2FE332DE04046A1 ++:101530003146EC220AF0C2DFC5F8440710B940F288 ++:10154000FF3322E0404631464FF406720AF0B6DF20 ++:10155000A86358B100F58673EB63404631462C22F0 ++:101560000AF0ACDF0446686318B105E040F20143BD ++:101570000BE040F2024308E04046314680220AF088 ++:101580009DDFA06238B940F203433B6028464146E4 ++:10159000FFF79EFD00252846BDE8F081BC2600002F ++:1015A000D0F84031B1F1FF3F18BF83F89C13B2F17E ++:1015B000FF3F83F89E1383F89F2318BF83F89D2372 ++:1015C0007047C04670B50446002831D00025631925 ++:1015D000D3F8501221B12368F4225868E5F388F358 ++:1015E0000435282DF3D1A16B69B194F8A3331BB155 ++:1015F00023689868EEF332F02368A16B9868EEF3E5 ++:101600003FF00023A363D4F8781221B12368E822C5 ++:101610005868E5F36DF3236806491868224602F01E ++:1016200093DC2368214658684FF46972E5F360F350 ++:1016300070BDC046678986002DE9F0434FF469719B ++:1016400085B006464068E5F343F3054608B9814690 ++:10165000CFE000214FF469728146E0F3F1F42E608F ++:101660007068E821E5F334F3C9F87802002800F047 ++:10167000B1800021E822E0F3E3F4002101236A189D ++:10168000C91808299372F9D1013B2B746B742B7321 ++:10169000EB721A460121AB185218082A83F89413EA ++:1016A000F8D14023EB74062385F827304FF0FF3341 ++:1016B00085F82830213385F8A233052385F82930B1 ++:1016C0004FF47A736B864FF0C803AB86002385F81E ++:1016D0002A30023385F82B302B682A75A9741B68D1 ++:1016E0002A4693F8A1308B4218BF032385F82C308B ++:1016F0004FF0FF3385F89E3385F89F334FF4006336 ++:10170000EB63012385F82D3004336B750223AB7531 ++:101710006B7DD375AB7DD377013205F108039A4217 ++:10172000F6D100244FF0010895F82910284685F8D5 ++:101730002E4085F82F800BF0A5D9284686F8C38463 ++:101740000CF0C0DF042130462C4A2D4B009401954B ++:1017500006F0DEF8A04268603CDB2A4B306800935C ++:10176000294B2A4901932A4B2A4A03932B46029478 ++:1017700002F0B2DB074668BBB06827492A463B4601 ++:10178000EDF39AF7A86328B3244C85F87C82231DD7 ++:1017900093E807006B4683E807002A462368304633 ++:1017A000062109F063DA4FF0FF3385F8A13333687F ++:1017B000284693F842100DF0E5DFC823C5F8E03263 ++:1017C00028460DF0C5D928464146EDF7DDFB85F8E2 ++:1017D000A3730EE0D5F8781219B17068E822E5F32A ++:1017E00087F2706829464FF46972E5F381F24FF091 ++:1017F0000009484605B0BDE8F083C04695CB82009D ++:101800001DCB820045CF82007186000050AB0100E5 ++:1018100079D98200678986008D85000040AB010080 ++:1018200070B5182686B00C46324668460549E0F386 ++:10183000A3F32046694632466D46E0F39DF306B0B9 ++:1018400070BDC04698AD010070B5D0F8AC530446E9 ++:10185000D0F8B063284600F079F8D4F8D013A8681F ++:10186000EDF3FCF6A868D4F8D013EDF309F70023E4 ++:101870002246C4F8D0333046044902F065DBF068F4 ++:1018800021464FF47E72E5F333F270BDAB998600CA ++:101890002DE9FF413C23C1F824370523C1F828373F ++:1018A00007460D46C0684FF47E71E5F311F2044619 ++:1018B00000283DD000214FF47E724FF00008E0F385 ++:1018C000BFF3C4F8AC53C4F8B07384F80180204669 ++:1018D000E6F7F0FFC4F8C003284600F04DF80646CE ++:1018E00038B1F86821464FF47E72E5F301F24046C4 ++:1018F0001FE0204604F56371FFF792FFA8680E49C8 ++:1019000022463346EDF3D8F6C4F8D00380B1204622 ++:1019100010F05CDF094B38460093094B09490193ED ++:10192000094A23460296039602F0D6DA204600E0E2 ++:10193000002004B0BDE8F0818D258300858900007A ++:10194000F9E9000048AC0100AB99860070B5D0F809 ++:10195000305704466DB107492246006802F0F4DAB8 ++:10196000606829464FF40A62E5F3C2F10023C4F827 ++:10197000303770BD529E86002DE9FF4106464FF478 ++:101980000A614068E5F3A4F1074618B9C6F83007C4 ++:101990000138E1E000214FF40A62E0F351F307F16E ++:1019A00020033B603368082200247A613C61DC211B ++:1019B0001A6630466A4A6B4B0094019605F0A8FF00 ++:1019C000A042B86105DA3046FFF7C0FF6FF00100B2 ++:1019D000C2E0A6462546644B00221EF0010FEA50E5 ++:1019E0001FD0624B19780D2902DD4FF4004C03E043 ++:1019F0004A1C012303FA02FC5C4BD8780D2802DD57 ++:101A00004FF4004403E0421C012313FA02F40123C3 ++:101A100013FA00F28B401A4342EA0C02524B224363 ++:101A2000EA501EF0020F24D04F4B55F803804F4B65 ++:101A300058780D2802DD4FF4004C03E0421C0123CE ++:101A400003FA02FC494B99780D2902DD4FF400445A ++:101A500003E04A1C012313FA02F4012313FA01F2F2 ++:101A600083401A4342EA0C0222433F4B42EA0802F7 ++:101A7000EA501EF0040F24D03B4B55F803803B4B3B ++:101A800018790D2802DD4FF4004C03E0421C0123BD ++:101A900003FA02FC354B59790D2902DD4FF400445D ++:101AA00003E04A1C012313FA02F4012313FA01F2A2 ++:101AB00083401A4342EA0C0222432B4B42EA0802BB ++:101AC000EA501EF0080F24D0274B55F80380274B0F ++:101AD00098790D2802DD4FF4004C03E0421C0123ED ++:101AE00003FA02FC214BD9790D2902DD4FF40044A1 ++:101AF00003E04A1C012313FA02F4012313FA01F252 ++:101B000083401A4342EA0C022243174B42EA08027E ++:101B1000EA500EF1010E0435BEF1100F7FF45BAFF9 ++:101B2000134B0025134C03932946134A3346306860 ++:101B300000950195029502F0CFD9231D93E8070087 ++:101B40006B4683E80700304623680321324609F0DC ++:101B50008DD8C6F83077284604B0BDE8F081C0467D ++:101B600001578300A15683008427000090E0850080 ++:101B70009D508300ECAD0100529E860010B50446D6 ++:101B80000846B0F80CE0194642F256039E4506D8C6 ++:101B9000013B9E452ED2053B9E4509D02AE042F2EC ++:101BA00060039E451BD04EF2F5439E451CD021E0BC ++:101BB000C389012B04D16FF03B0313604B3303E067 ++:101BC0006FF0450313605A330B602368D3F88030FD ++:101BD00013F4805F13D01368023B13600FE06FF0C3 ++:101BE0004A0313605A3309E06FF09503136003F55D ++:101BF000967303E06FF04A0313605F330B6010BD10 ++:101C000070B504460025E06820B1054B1B68984775 ++:101C10000023E36001350434062DF4D170BDC046C5 ++:101C2000E0A685000D4B82685362002380F8863061 ++:101C30004FF00303A0F88C304FF00203A0F88E3071 ++:101C40004FF00703A0F888304FF00403A0F88A3063 ++:101C500042F60133A0F89C307047C04664A8E7BE46 ++:101C6000426C1F2A01D9002004E04FF00073134199 ++:101C700003F001007047C046026EB0F84A1010B57C ++:101C8000946AB9B1FF2901D8012014E00B0B013B84 ++:101C9000012B0FD8C1F30323092B0BD853B1C1F388 ++:101CA0000313092B06D801F00F03092B8CBF00206A ++:101CB000012000E00020D26A41F2E4439A4210D1B0 ++:101CC000A4F58263073B012B01D83F2907E040F2CE ++:101CD0000C439C4204D015339C4202D1502900D8B9 ++:101CE000002010BD00B58E46C16E4FF04073944683 ++:101CF0007046C1F8603115E00379C2781B0443EAED ++:101D0000026382791343427943EA0223C1F86431C2 ++:101D1000437802781B0243EA024382780730134378 ++:101D2000C1F86431CEEB00036345E5D300BDC04686 ++:101D300010B590F85E3004463BB9044B04491A686C ++:101D4000FFF7D0FF012384F85E3010BD789E0200BB ++:101D50007C9E0200C16E4FF48030C1F860011D4AC4 ++:101D6000D1F8603110B5D1F86441C1F86001D1F803 ++:101D70006031C1F86421C1F86001D1F86031D1F857 ++:101D80006431934224D1144AC1F86001D1F8603122 ++:101D9000C1F86421C1F86001D1F86031D1F8643133 ++:101DA000934215D1C1F86001D1F860310023C1F828 ++:101DB0006441C1F88C31D1F82001084B984201D11F ++:101DC000012006E0064B984214BF0020012000E0ED ++:101DD000002010BDAA5555AA55AAAA550004000412 ++:101DE00000040084D0F8501810B5044641B1D0F872 ++:101DF0004C2840689200E4F37BF70023C4F8503885 ++:101E0000D4F8481859B16068E0F3CEF66068D4F8A9 ++:101E10004818E822E4F36CF70023C4F8483810BDF2 ++:101E200070B504690646206E08B1E9F78DF82046C2 ++:101E3000FFF7E6FEA56F686A18B103F0FFFF002305 ++:101E40006B62606F03F08CFF206F05F023FC616E06 ++:101E500029B12068A26EE4F34BF700236366206E7D ++:101E600018B103F0D9F9002323662046E8F728F9D2 ++:101E70003046FFF7B7FF002070BDC0462DE9F04F98 ++:101E8000036807698FB00890DE691446FB6B0CA8E5 ++:101E90000821704AE0F318F1FB68002B40F0CE8077 ++:101EA000F96E386E01F50071D7F800B0E2F3FCF47A ++:101EB000BB6801469868EDF395F3002800F0C680F2 ++:101EC000D7F860E00CB9A44602E0FB6E03F5007C95 ++:101ED000FB6E03F5087504B13468B168BB687268BD ++:101EE000F068D3F8283803915B490DF130094FF0C1 ++:101EF000FF38029205907246069307916346494661 ++:101F0000584600950194CDF81080EDF71DF8316822 ++:101F1000F8603A6EFB6E01914F4900240546079127 ++:101F200003F5107349465846009402940394CDF883 ++:101F3000108005940694EDF707F8316838613A6E21 ++:101F4000FB6E019144490990079103F520734946BE ++:101F50005846009402940394CDF81080059406949A ++:101F6000ECF7F2FF316878613A6EFB6E01913A4905 ++:101F70000A90079103F5307349465846009402943D ++:101F80000394CDF8108005940694ECF7DDFF3168DA ++:101F9000B8613A6EFB6E01912F490B90079103F5E2 ++:101FA000407349465846009402940394CDF810803B ++:101FB00005940694ECF7C8FF3168F8613A6EFB6E41 ++:101FC000019125498246079103F5507349465846C9 ++:101FD000009402940394CDF8108005940694ECF7D5 ++:101FE000B3FF099AA54214BF002501250A9BA2420E ++:101FF00008BF45F001050B99A34208BF45F0010554 ++:10200000A14208BF45F00105A24508BF45F0010502 ++:102010003862A04214BF284645F00100B0B90F4B0A ++:102020003C46D3F884600546E06818B10C49B047D7 ++:10203000C4F8A00001350434062DF5D1B96F089815 ++:1020400008310022E7F7FAFB012000E000200FB082 ++:10205000BDE8F08FFB41860014260000E0A6850055 ++:10206000C32686001FB5022303930D330446C0F830 ++:102070004C383C214068E4F32BF6C4F85008D0B14A ++:10208000D4F84C2800219200DFF3DAF76068E821E9 ++:10209000E4F31EF6C4F8480868B10021E822DFF333 ++:1020A000CFF7012300936068D4F8481803AAB3332C ++:1020B000E0F312F601E04FF0FF3004B010BDC0466F ++:1020C0002DE9F04F056997B0DDF884A014469B46D2 ++:1020D0009DF88020EB63EB6FA860AB672A71074621 ++:1020E000C5F800A028460E46FFF79CFD249B05F18D ++:1020F000640205F168010093019202912046514665 ++:10210000229A239B03F0C6F92866002800F0D581A7 ++:10211000D5F8648095494046E0F35AF420B1002197 ++:102120000A46E0F315F386B240469149E0F350F4D5 ++:1021300048B100210A46E0F30BF34FF6FF7380B27B ++:10214000984218BF044630462146FDF7CFFE08B935 ++:102150000C30B7E140F612010022A5F84060A5F866 ++:102160004240286EE9F34AF0E866286EE8F398F6F4 ++:10217000D5F86C906864C7F80C902846FFF770FD9E ++:1021800008B90D309EE1286EE8F7E2FE28460021EE ++:1021900019F0A2DD28464FF0FF31E7F78DFB284606 ++:1021A000FFF7D8FD08B90E308CE140467149E0F3E5 ++:1021B000E3F3FF2808BF0120A5F84A002846FFF7EF ++:1021C0005BFD08B90F307DE16B494046E0F3D4F385 ++:1021D0006A4985F848004046E0F3CEF36849E86470 ++:1021E0004046E0F3C9F3296E2865CA6A41F26B03E1 ++:1021F0009A420AD18B6A4E2B07D1B5F84A30402B50 ++:1022000003D9EB6C43F00203EB64EB6C13F0200F8B ++:1022100004D0012128460A461BF014D9B5F8402005 ++:102220000123A7F88021C5F89830B5F842303A6804 ++:10223000A7F882312B6E284613616B6C936095F87A ++:10224000483082F87C303A68B5F84A30B968A2F86C ++:102250007A30EB6CC2F880302B6DC2F88430D5F840 ++:10226000983053623A4605F01FFA286708B91930CA ++:1022700028E12B6ECDF810A005932B6FCDF81CB084 ++:10228000B5F8402006936B6CADF8302008932A6EA9 ++:10229000B5F84230CDF82C80ADF83230936B04A8FD ++:1022A0000D93D36B0E93136C0F9395F848301093E6 ++:1022B000936A1193B5F84A301293D36A1393EB6C77 ++:1022C00014932B6D159353680993D3680A9303F005 ++:1022D0004FFD686708B91030F4E0B5F8421044F2D9 ++:1022E0002133994217D00E3B994214D007339942BB ++:1022F00011D0103399420ED0143B99420BD00733C2 ++:10230000994208D01033994205D02533994214BF21 ++:102310000026012600E0012631462846E7F7B0FAFC ++:10232000AA6F002E0CBF02230123136056603A6B84 ++:10233000286E13605660FC6AE8F3A0F52060D9F8B7 ++:102340005C31696C0F4A6B65AB65062301FB0323A7 ++:10235000AC6FC5F8B830686F49462268434603F051 ++:102360009FFE606280B91130ACE0C046D1AD8600FE ++:102370004837860084AE8600E5AE86008637860044 ++:102380009E79860020ED0100AB6F696D586AEDF70C ++:102390008DFEAB6F03F1220203F11C01586A00921B ++:1023A00003F11E02203303F0C3FCAC6F606A03F03C ++:1023B000CFFC84F82800AB6F3C6B586A03F0C8FC74 ++:1023C0002075AC6F606A03F0C7FCA96FA061CB8B6E ++:1023D000032B01D0122075E03B6B4A6A38461A6124 ++:1023E0008A8B1A81CA8B5A810A8C9A814A8CDA812B ++:1023F00040F2FF324FF00F03CA828B820122314636 ++:10240000FFF73CFD08B913305CE0B6F1FF3F3FF445 ++:1024100064AFAB6F3A68586A92F89910EDF74AFECC ++:10242000002128461AF040D90821284619F0C2DFB9 ++:1024300028461BF071DC286E2449254A00230097AA ++:10244000E8F398F6284600211BF048DC2846E7F719 ++:10245000E1F908B9153035E005F1DC042146E0F377 ++:10246000ABF02046E0F368F248BB2046E0F374F29C ++:10247000044620BB284619F077DAAB681B68D3F80E ++:102480009C00F0B10378E3B112492A46E0F378F3F7 ++:10249000AB6811491B682A46D3F89C00E0F3AAF305 ++:1024A000A868FFF7DFFDE86858B1AB681B68D3F890 ++:1024B0009C10E2F39DF3204604E00B2002E016207E ++:1024C00000E0002017B0BDE8F08FC04669C183006E ++:1024D00085C1830025C0830049C0830010B5044630 ++:1024E0001DF04ED90122014620461DF0C1D910BD74 ++:1024F00037B505461DF044D90023C5F84C0280F8D5 ++:1025000048302A68044692F82F10284600914E322F ++:1025100021461BF0E3DE30B1284621461CF08CDF5B ++:102520004FF0FF3003E0284621461DF02BD83EBD7A ++:1025300037B50446002847D0D0F8201131B10368E0 ++:102540009868EDF39DF00023C4F8203122681368E9 ++:1025500093F82F303BB3D2F8000501A932F0BADD71 ++:1025600013E0536813F0400F0FD0D4F82C31D51876 ++:1025700007E00B684822C5F8103123685868E4F377 ++:10258000B7F3D5F810110029F3D101A832F0AADD74 ++:1025900002460028E5D106E00B684068C4F84031E7 ++:1025A0004822E4F3A5F3D4F8401120680029F3D1C0 ++:1025B00006492246006801F0C7DC236821465868B6 ++:1025C0004FF4A472E4F394F33EBDC04691BA860082 ++:1025D000F0B54FF4A47185B005464068E4F378F394 ++:1025E000064608B9074655E000214FF4A472074695 ++:1025F000DFF326F5294B35600093294B29490193D8 ++:10260000294B002403932868284A3346029401F09A ++:1026100063DC31462A6B1368022B03D1537D0BB95F ++:10262000163300E0302301340B744431042CF1D113 ++:10263000A8681F492A460023EDF33EF00446C6F879 ++:10264000200130B9686831464FF4A472E4F350F3C6 ++:102650001FE04FF49673C6F81C3145F27353A6F889 ++:1026600038314FF04603A6F83A31124B0024C6F831 ++:102670004041284600934FF48A710F4A0F4B019551 ++:1026800005F046F9A042C6F82C0103DA3046FFF700 ++:102690004FFF2746384605B0F0BDC046F90C840010 ++:1026A00055ED00001CAE01007D0A840091BA860041 ++:1026B0003D068400D9128400E5128400A51284002E ++:1026C00070B50568044622462868044901F03CDCE0 ++:1026D000686821465022E4F30BF370BD3CE48600A9 ++:1026E00070B50546002826D00368134918682A46A5 ++:1026F00001F02ADC6B6905E01C68596828462EF059 ++:102700000DD92346002BF7D12B6905E01C685968C9 ++:1027100028462EF003D92346002BF7D1A96A21B110 ++:102720002B6890225868E4F3E3F22B682946586836 ++:102730002C22E4F3DDF270BD91E6860030B52C2149 ++:10274000044685B04068E4F3C3F208B9054618E0D2 ++:1027500000212C220546DFF373F40823AB610A4BFA ++:102760002C6000930023019302930393074A2B46A6 ++:102770002068074901F0B0DB2268012382F8963017 ++:102780002B71284605B030BD050B850091E686000B ++:1027900094AE01002DE9F047154680460F461E46CF ++:1027A000E8F36CF3002181464046E8F339F5002256 ++:1027B000044611460F480B185B6873B90C3302FBD3 ++:1027C00003F31D501A18636A576096600A4A45EA77 ++:1027D000030313606362012404E001320C31052A13 ++:1027E000E8D1002440464946E8F31AF52046BDE802 ++:1027F000F087C0463C260000782600002DE9F0470F ++:1028000005468846E8F376F400212846E8F308F503 ++:10281000064628466C69AF69E8F7D2F90A2C81466A ++:1028200016D90F2C19D02846E8F70CFC142C0546B5 ++:1028300003D9B36823F00803B360B36843F001031E ++:10284000B36003D9B36843F00803B360012211E019 ++:10285000022C02D8174D30220CE02846E8F7FCFB8A ++:10286000D6F8A430054623F0FF0343F00203C6F870 ++:10287000A4300222B36813F0010F07D107F0180348 ++:10288000082B14BF4FF4E115B5FBF2F507F0030771 ++:1028900000240BE006F54073B8F1000F05D003EB00 ++:1028A000042049462A460023C0470134BC42F1DBDC ++:1028B000BDE8F08700C63E0537B5134B15461360DB ++:1028C00001E0114B13600432ADF17C039A42F8D35E ++:1028D000033020F003000D4BC0EB01041C600C4BD7 ++:1028E000002119600B4B05F5A05219600A4B083CFA ++:1028F00019600A4B41601D60094B1A60094B196051 ++:10290000094B046058603EBD4B415453C82600003B ++:1029100088260000A4260000CC260000F4F4010064 ++:10292000F8F4010090260000C0260000436910B5AD ++:10293000142B01DD02F09CFB10BDC0461FB5E82042 ++:102940000021E3F363F50C4C2060A0B10021E822E4 ++:10295000DFF376F304AA012342F8043D013B009320 ++:10296000064B2168186840F23C73E0F3B5F120682B ++:102970000F21E0F3FBF11FBDBC26000020F5010094 ++:10298000B1F5E06F73B505460C46164606D10369EE ++:102990000091002101911C680A460CE00D4B0022B9 ++:1029A0001868E8F32BF4014680B12B6900220094EB ++:1029B00001921C6828463346A04738B1064AA861F0 ++:1029C000136800202B626E61156001E04FF0FF304C ++:1029D0007CBDC0468C2600001CF501002DE9F047A7 ++:1029E00010200E46002117469946E3F30FF50446E2 ++:1029F00010B96FF01A001EE0104D2868E8F33EF29F ++:102A0000099B804623B9286831463A46E8F3F6F335 ++:102A10002868E8F3AFF201238340094AE360089B8A ++:102A2000C4F80490A36013682868236041461460CA ++:102A3000E8F3F6F30020BDE8F087C0468C260000DE ++:102A40009826000007B50021E8F3EAF3074B4FF49E ++:102A500000611860064B00F57060186000200246A7 ++:102A6000044B00900190FFF7B9FF0EBD9C260000BB ++:102A7000F0F401006D60800037B5234B234C02ADAC ++:102A800000211C2245F8043D2046DFF3D9F2012342 ++:102A900023601F4BA5F5A0551B6843F8044C00F0BC ++:102AA0000DF929462A461B48FFF706FFE3F36AF6AD ++:102AB00000F042F8002002F01FFA174B174C186084 ++:102AC00002F0BCFC2060FFF7BDFF206800F01EF99B ++:102AD000E7F700FF206800F0A5F800221048114930 ++:102AE000E4F308F0002210481049E4F303F0104921 ++:102AF00000221048E3F3FEF72068FFF717FFFFF707 ++:102B00001DFF20683EBDC046ADDEADDEFCF4010019 ++:102B1000E8ED0100BE24030020F501008C26000032 ++:102B2000D81F8600E1A60000DB1F860065658000D7 ++:102B30008D608000DE1F860070B5A4200021E3F3C5 ++:102B400065F4124D286080B10021A422DFF378F2F1 ++:102B50004FF4806000212C68E3F358F4A0602868EB ++:102B600084682CB9E3F3B8F32C604FF0FF300CE02D ++:102B70004FF48062C2608460446100212046DFF32C ++:102B80005FF22A68024B00201A6070BD34F5010024 ++:102B9000D426000070B51C4D06462B6833B91B4C7B ++:102BA00023680BB9FFF7C8FF23682B60164C184B3E ++:102BB0002068586130B3002505604560336CC0F86B ++:102BC0009C500E3B012B03D930461249FFF716FEED ++:102BD000114A936813B12368C3F89C20246807E066 ++:102BE000D4F89C0018B1A368595DE3F36FF7013581 ++:102BF00023699D42F4D3094809492246E3F37AF751 ++:102C0000014B186870BDC046D426000034F50100A1 ++:102C1000FCF40100492C020024F50100BD218600CE ++:102C2000A568800010B54022002305490446FFF73F ++:102C3000B1FD044B00229A602046FFF7ABFF10BDA8 ++:102C4000A969800024F5010070B51B4DAE68002E07 ++:102C500031D114092C60AB8104F561444FF4E133A8 ++:102C600094FBF3F4A8606960284603218022E3F313 ++:102C700023F728463146E2B2E3F31EF72846012146 ++:102C80002212E3F319F703210A462846E3F314F767 ++:102C900001210A462846E3F30FF7284604210822BB ++:102CA000E3F30AF7284602210122E3F305F74FF484 ++:102CB0007A70E3F351F570BD24F50100104A072145 ++:102CC000136843F010031360136843F008031360A4 ++:102CD000136823F400731360E832136843F08073C1 ++:102CE00043F480331360074B00221960043B1A60E1 ++:102CF00008331A681960044B20221A607047C046D6 ++:102D000014ED00E0241000E000E400E02DE9F041C3 ++:102D1000054600F0ADF82A48E7F762FB2846E7F7DA ++:102D200025FF284B284AC318B3FBF2F3274A28464D ++:102D30001360E8F77DF900F5787007304FF47A7387 ++:102D4000B0FBF3F0224B234A18602B6A2249002B78 ++:102D5000CCBF6FF07F4340F2FF3313601D4A1F4F1B ++:102D60001368B3FBF0F31360284620220023FFF71B ++:102D700011FD00201A49DFF3FFF504463860E8B181 ++:102D80002846E7F7F3FEB4FBF0F0861E002E15DDB3 ++:102D9000144C002134222046DFF352F1124B4FF441 ++:102DA0007A71A3606560204606FB01F10122E3F31E ++:102DB00021F218B128463968E1F32CF5BDE8F0811D ++:102DC00019A900003F420F0040420F00D02500002B ++:102DD000C8250000CC25000001678000E82600001F ++:102DE0004EB001003CF50100E56680002DE9F0479A ++:102DF00007461E4615460C46E8F37CF13846E8F3D4 ++:102E00003DF02946324681463846E8F3F7F1384628 ++:102E1000E8F3B0F040F62A01064600223846E8F30F ++:102E2000EDF105468CB1012414FA06F3826932EA09 ++:102E3000030802D12046E7F793FA701C14FA00F059 ++:102E4000E7F770FAC5F818800CE00124701C14FA3A ++:102E500000F0E7F785FA2046B440E7F763FAAB697C ++:102E60001C43AC6138464946E8F3DAF1BDE8F08727 ++:102E70002DE9F0470746E8F33DF1384640F60E01EC ++:102E80000022E8F3BBF10446002831D0D0F80080DE ++:102E900005683846E8F304F00428064604D827D12C ++:102EA000C5F30243032B23D100204849DFF364F527 ++:102EB000F0B94749C8F3031212E0013A072E226124 ++:102EC0000AD90C2E08D0236C13F4806F02D013F4AF ++:102ED000006F01D108B903E0012041F004516161A4 ++:102EE000002AEAD1D4F8E83123F01003C4F8E8311D ++:102EF000002240F62A013846E8F380F1354C206084 ++:102F00003846E7F3CDF7344B22681860136843F670 ++:102F1000A12443F080731360136843F0020313602D ++:102F20000023C2F8E03103E00A20E3F315F40A3C81 ++:102F3000DFF8A090D9F80030D3F8E03113F4003F67 ++:102F400001D1092CF0D100210B4638464FF4006224 ++:102F5000FFF74CFF00210B46384640F61202FFF700 ++:102F600045FF00210B46384640F62902FFF73EFF99 ++:102F700038460121E7F728FE00201849DFF3FCF46A ++:102F8000E0B13846E7F37AF740F62A01804600229E ++:102F90003846E8F333F146690446D0F8985038468D ++:102FA000E7F36CF70123834045F001053343636188 ++:102FB0003846C4F898504146E8F332F1D9F8002079 ++:102FC000136A43F003031362BDE8F087BDB001004C ++:102FD000FF7F010070F5010074F501004EB00100A3 ++:102FE00010B58469A068FCF783FDE068E7F790FFFF ++:102FF000002010BD10B584690021342204F11C00AA ++:10300000DFF31EF0034BA06863622462ECF7ACF8B8 ++:10301000002010BD05AA80002DE9F347DFF8AC8041 ++:103020009946D8F800300546072B0F46924643DCF8 ++:1030300001F062FF50210646E3F34AF604460028F9 ++:103040003AD000215022DEF3FBF7D8F8003065605B ++:103050002360A4F814902761E660204641F2E44121 ++:103060004A4633460097CDF804A0FCF793FDA060D4 ++:1030700010B300200A990B9A114B0095CDF804A0CB ++:10308000FFF7ACFC18B1A068FCF732FD14E0A068B3 ++:10309000E6F3DAF10B49A061D8F800202846DFF307 ++:1030A00023F009482946ECF709F8D8F80030204603 ++:1030B0000133C8F8003000E00020BDE8FC87C046BE ++:1030C00031AA8000FC7C0200DC7C020078F5010063 ++:1030D000014610B550228068E3F30AF610BDC046E1 ++:1030E000C36B10B51BB100225A62836B5A62C06871 ++:1030F000FFF7EEFF10BDC0462DE9F041184E1C460B ++:1031000033780746072B904626D820464C21E3F318 ++:10311000DFF5054600B300214C22DEF391F76C6029 ++:103120002F60C5F808803378204685F84430013395 ++:1031300033700223AB640821E3F3CAF50446286424 ++:1031400020B100210822DEF37BF706E029464C225D ++:10315000E3F3CEF5254600E000252846BDE8F081E2 ++:103160007CF501002DE9F04FD1F8FC3091B00F93C0 ++:10317000054603F56063079335E10FAF0E22002388 ++:1031800028463946DDF3A0F10F28044600F03681C9 ++:103190000022284639461346DDF396F110F00E065C ++:1031A00040F0268140F23B43B3EB145FC4F30B21A4 ++:1031B000C0F3041804D140F6FF73994200F0138164 ++:1031C000C0F344220992002A00F00D81C0F3C443E9 ++:1031D000C0F3843B13EB0B02089319D140F2673321 ++:1031E000994240F000810EAB01930DAB02930CAB02 ++:1031F00003930BAB04932846394613460092DDF344 ++:1032000001F1002800F0EF800E9BC5F85433EAE08E ++:10321000D5F8CCA005EB8A03C3F8D4423446C3F8F2 ++:103220001403C3F8D0100BE00122284631461346A0 ++:10323000DDF34AF100F00E00022840F0D98001349D ++:1032400044450FAEF0D1002213460DF138090DF1BF ++:1032500034080CAF0BAC284631460092CDF80490F0 ++:10326000CDF8088003970494DDF3CCF00246E8B96A ++:1032700040230093284631461346CDF80490CDF8FC ++:10328000088003970494DDF3BDF010B14FF00108FE ++:103290000EE00D9B002B40F0AB800B9B002B40F011 ++:1032A000A7800C9BB3F5805F40F0A2804FF0000830 ++:1032B0000E9A05EB8A03C3F810210C9A0124C3F877 ++:1032C000D0210EAB01930DAB02930CAB03930BAB70 ++:1032D0000022049328460FA923460092DDF392F0C2 ++:1032E00008B9012727E0012C40F086800C99B1F540 ++:1032F000805F40F081800E9B05EB8A02C2F890311E ++:10330000C2F8101278E00024002300930EAB019362 ++:103310000DAB02930CAB03930BAB049328460FA9A0 ++:103320003A462346661CDDF36DF008B13446EBE700 ++:10333000002E5DD00137099A9742E4D100241FE0A6 ++:10334000C02300930EAB01930DAB02930CAB039320 ++:103350000BAB049328460FA922460023DDF352F05D ++:10336000002845D00B9B002B42D10C9BB3F5805F0E ++:103370003ED124B90E9B05EB8A02C2F89432013487 ++:103380005C45DDD1002423E0802300930EAB019344 ++:103390000DAB02930CAB03930BAB049328460FA920 ++:1033A000012F0CBF2246621C0023DDF32BF0F8B185 ++:1033B0000B9BEBB90C9BB3F5805F19D1BBF1000FF0 ++:1033C00005D124B90E9B05EB8A02C2F89432013470 ++:1033D000089B9C42D8D1B8F1000F04D1D5F8CC306D ++:1033E0000133C5F8CC300F9B079A9342FFF4C5AE6A ++:1033F0000023C5F8CC3001E0013462E711B0BDE82C ++:10340000F08FC04682604160016070470EB4F3B532 ++:1034100081680646012901D8002044E008AB4068D5 ++:10342000079A0193DEF342F7B0F1FF3F074603D05E ++:10343000B368023B984203DD00231846B36032E0D4 ++:1034400070683D21DEF360F630B373683568C3EB16 ++:1034500000041EE028462246DEF372F5A8B92B5D73 ++:103460003D2B12D12846DEF37BF67268441CBA1855 ++:10347000291901322846521ADEF3B4F573681B1B72 ++:103480007360B3681B19B36006E015F8013B002BAD ++:10349000FBD171688D42DDD3B368781C1B1AB36011 ++:1034A00073681B187360BDE8FC4003B07047C046EA ++:1034B0002DE9F041C1EB0204012C0E461F46DDF858 ++:1034C000188010DD2146E3F303F4054610B96FF0D0 ++:1034D0001A000DE031462246DEF34EF500203D6035 ++:1034E000C8F8004004E000233B60C8F800301846EC ++:1034F000BDE8F0812DE9F04FA5B008914FF480515F ++:10350000099007920693E3F3E3F30A9018B96FF07A ++:10351000010401F029B921A80A994FF48052FFF75C ++:1035200071FF4FF480520A980021DEF389F50023E1 ++:103530004FF0FF328DF844300B930D930E9201F053 ++:10354000DEB80D9B089A002152F8239001230C91BC ++:103550000F930F9B19F8012073B1531EDBB2FD2BA3 ++:1035600001F1010898BF19F808B016468CBF4FF05A ++:10357000000B08F101080CE002F1FF33DBB2FE2B77 ++:1035800093462CBF1646802628BF4FF0000B01F152 ++:1035900001080BEB0803B3F5607F81F2AD80202EAC ++:1035A0002AD005D8152E0AD01B2E6DD001F078B880 ++:1035B000222E3AD036D3802E72D001F071B808EBAB ++:1035C00009035A7819F8083003EB0223072B13DD9F ++:1035D00009F10204444421AD874922462846FFF7F9 ++:1035E00015FF2046DEF3BCF509F1030200EB0803EA ++:1035F00082492846D2184FE008EB0904637819F88D ++:10360000082021AD02EB032228467D49FFF7FEFE8C ++:10361000E378A27828467B4902EB0322FFF7F6FE07 ++:1036200001F03EB819F8082003E00C9B0C2B03D1E5 ++:1036300000220C9201F036B89DF84430002B41F086 ++:10364000318019F80830042B41F02C8009F1020474 ++:1036500004EB08052846DFF37FF1002841F02280C3 ++:1036600014F8083013F0010F41F01C80284611A90E ++:10367000DEF3BAF70E9BB3F1FF3F41F0138008EB86 ++:1036800009039A79DB790DE108EB0903DC799A7972 ++:103690005D4921A842EA0422FFF7B8FE01F002B812 ++:1036A00019F80830822B00F2FD87DFE813F0920052 ++:1036B000B30038013B02D4021102CB01DA01470109 ++:1036C000EA02FB0210031703FB077F020302FB075A ++:1036D0003603570397007A037F0390039503F7009F ++:1036E000E903FB07770107047F01FB07FB07FB07E3 ++:1036F00010042204270472045305FB07FB0721066C ++:103700008D0088008300AE06D306DA06E106FB07CB ++:1037100026037101FB07FB070001F007E806FB0722 ++:10372000FB07FB07FB07FB07FB07FB07FB07870103 ++:1037300013072807490764077F079907B307CD07D1 ++:10374000D407FB078E01FB07FB07FB07FB07FB0703 ++:10375000FB07FB07FB07FB07FB07FB07FB07FB0759 ++:10376000FB07FB07FB07FB07FB07FB07FB07FB0749 ++:10377000FB07FB07FB07FB07FB07FB07FB07FB0739 ++:10378000FB07FB07FB07FB07FB07FB07FB07FB0729 ++:10379000FB07FB07FB07FB07FB07FB07FB07FB0719 ++:1037A000FB07FB07FB07FB07FB07FB07FB07FB0709 ++:1037B000FB07DE0709EB0804002500F00BBE09EB50 ++:1037C0000804002500F0F4BD09EB0804002500F012 ++:1037D000DEBD0E4908EB090321A8DDE008EB090175 ++:1037E000CA780B79120442EA03624B7821A81A4383 ++:1037F0008B7807497EE2C046E07D02003C800200F3 ++:103800009E7D02003381020002840200797F020063 ++:10381000157D020008EB0904A378627821AE02EB63 ++:103820000322AE493046FFF7F1FD2379E2783046B6 ++:10383000AB4902EB0322FFF7E9FDBBF1060F40F2B3 ++:103840003187A37962793046A64902EB0322FFF75C ++:10385000DDFDBBF1080F40F22587237AE27930467F ++:10386000A14902EB0322FFF7D1FDBBF10A0F40F2A1 ++:10387000198709F10A0409F1090514F8083015F847 ++:1038800008209A4902EB03223046FFF7BFFD14F8E7 ++:10389000083015F80820964930464CE008EB09033B ++:1038A0009A785B7803EB02220E9200F0FBBE0623AF ++:1038B000904ABBFBF3F309EB08074FF0000A1370C3 ++:1038C00027E019AD534610218B4A1DAE2846DEF382 ++:1038D000FBF353461021894A3046DEF3F5F3BB78FB ++:1038E0007A7821AC42EA032229462046FFF78EFD72 ++:1038F0007A79BB79120442EA0362FB7820461A43C4 ++:103900003B79314642EA0322FFF780FD0AF1010AC2 ++:103910000637784B1B789A45D3DB00F0C3BEBBF16A ++:10392000020F21A808EB090202D175495278B3E6CB ++:1039300093787349527802EB0322ADE608EB090451 ++:10394000A2786378BBF1040F03EB022505D9237934 ++:10395000E2781B0603EB02431D4321AE3046694962 ++:103960002A46FFF753FDBBF1060F40F29B86A27972 ++:103970006379BBF1080F03EB022505D9237AE279BD ++:103980001B0603EB02431D435F4930462A4683E68C ++:103990005E4908EB090321A85A787DE608EB090384 ++:1039A0009C785A78524921A800F05BBE0BF10103C4 ++:1039B0005FFA83FB00230F9300F074BE08EB09034A ++:1039C0009C785A78524921A864E64A4B4FEADB02B8 ++:1039D00009EB08074FF0000A1A702DE01DAD5346A1 ++:1039E0001021454A19AE2846DEF36EF353461021E6 ++:1039F000424A3046DEF368F3FA783B79120442EA31 ++:103A000003627B7821AC1A43BB78294642EA032241 ++:103A10002046FFF7FBFCFA793B7A120442EA036284 ++:103A20007B7920461A43BB79314642EA0322FFF7ED ++:103A3000EDFC0AF1010A08372E4B1B789A45CDDBC5 ++:103A400000F030BE21AD08EB090428463149627808 ++:103A5000FFF7DCFCBBF1020F40F224862E4928461A ++:103A600059E121AD08EB0904002228462B4963786F ++:103A7000FFF7CCFCBBF1020F40F20F860122284673 ++:103A80002649A378FFF7C2FCBBF1030F00F00586BF ++:103A9000022228462149E378FFF7B8FCBBF1040F66 ++:103AA00000F0FB8528461D4903222379FFF7AEFC71 ++:103AB00000F0F3BD21AC08EB090517496A782046F0 ++:103AC000FFF7A4FC1549AB782046012200F0DCBDCD ++:103AD000134908EB090321A85EE7C046548202009F ++:103AE000158302005E810200AA7D0200C17E0200F1 ++:103AF000C17D02007DF50100C8B00100D3B0010016 ++:103B0000F67E0200D7820200227E0200F47F0200CD ++:103B10006A830200217D02004C83020021800200A2 ++:103B2000E5830200ABF10203082B00F2BB85DFE85E ++:103B300013F00900B905B905B905B9052B001C003A ++:103B400015000E00A74908EB090321A824E708EB9C ++:103B5000090321A8A4495A7AFFF758FC08EB090386 ++:103B600021A8A0491A7AFFF751FC09F1070521ACF9 ++:103B70009E4915F808202046FFF748FC20469C493E ++:103B800015F80820FFF742FC9A4D09EB0804A378CA ++:103B90006278294602EB032221A8FFF737FC964BF7 ++:103BA000093502349D42F2D100F07CBDBBF1140F07 ++:103BB00019D0BBF1170F04D0BBF1130F1AD000F0CE ++:103BC00071BD21AC08EB09058C49AA7D2046FFF7A1 ++:103BD0001DFC8B496A7D2046FFF718FC2046894969 ++:103BE0002A7DFFF713FC08EB090321A88649DA7C3C ++:103BF000FFF70CFC854D09EB0804A3786278294691 ++:103C000002EB032221A8FFF701FC814B09350234A6 ++:103C10009D42F2D109EB08057E4E2C46237AE279CB ++:103C2000314602EB032221A8FFF7F0FB7A4B0B365B ++:103C300002349E42F2D1794CAB7B6A7B214602EB87 ++:103C4000032221A8FFF7E2FB754B0B3402359C429F ++:103C5000F2D100F027BD08EB0901C8784A788B78CB ++:103C60000090087901904879029088790390C8798A ++:103C70000490097A21A805916A49FFF7C7FB00F073 ++:103C800011BD09EB080400256378FF2B04D021A89F ++:103C900065492A46FFF7BAFB01350134042DF3D1FB ++:103CA00000F000BD08EB09035A780AB19B7823B9EC ++:103CB00021A85E49FFF7AAFB03E021A85C49FFF7B2 ++:103CC000A5FB08EB09035B49DA7821A8E4E408EBDB ++:103CD00009039C785A78584921A8DBE408EB0901CC ++:103CE000CA780B79120442EA03624B7821A81A437E ++:103CF0008B78524942EA0322CEE421AD08EB090455 ++:103D000028464F496278FFF781FBBBF1020F40F272 ++:103D1000C9844C492846A278BEE409F1010515F88A ++:103D2000082021AC484902F00F022046FFF76EFB45 ++:103D300015F808204549120909F102052046FFF748 ++:103D400065FB15F80820424902F007022046FFF7FC ++:103D50005DFB15F808203F4920461FE009F10105E9 ++:103D600015F8082021AC3C4902F00F022046FFF76D ++:103D70004DFB15F808203949120909F102052046C2 ++:103D8000FFF744FB15F80820354902F007022046EA ++:103D9000FFF73CFB15F8082032492046C2F3C10268 ++:103DA0007AE4314908EB090321A8F5E521AC08EBD9 ++:103DB00009052E496A782046FFF728FB2C49AA7886 ++:103DC0002046FFF723FB2B49EA78204664E42A4982 ++:103DD00008EB090321A8DFE5284908EB090321A81E ++:103DE000DAE5C0468C8202004D8202003F8102006B ++:103DF000837D0200C27F0200DD7F0200747D02002D ++:103E00008D7E0200E97E0200917D0200A281020007 ++:103E1000BD8102008E7F0200AF7F02009982020006 ++:103E2000BA820200F0820200377D0200C5830200E0 ++:103E3000DA830200F8830200FD7F0200A4830200FF ++:103E400056830200847F0200087D0200DD7F0200AD ++:103E5000537D0200E782020031830200157E0200DA ++:103E60009783020061830200B08302000880020091 ++:103E700044820200EA7F0200E6800200AA7E02007D ++:103E800009F1010404EB08052846DEF365F5002876 ++:103E900040F0088414F8083013F0010F40F0028459 ++:103EA000284611A9DEF3A0F30E9BB3F1FF3F40F0CB ++:103EB000F98308EB09035A799B79F3E408EB0903CA ++:103EC0009A785C788C49120621A8FFF7E3BB08EBCF ++:103ED000090421AD894962782846FFF797FA884995 ++:103EE000A2782846FFF792FA2379E2788549284696 ++:103EF00021E5854908EB090321A84DE508EB0906F2 ++:103F0000B378747821AD04EB0324A4B2E20A7F49AC ++:103F10002846FFF77BFA7E49C4F302222846FFF7C2 ++:103F200075FA7C49C4F3C4022846FFF76FFA7A4950 ++:103F3000C4F341022846FFF769FA2846774904F09E ++:103F40000102FFF763FABBF1040F40F2AB83337950 ++:103F5000F478734904EB0324A4B2E20A2846FFF77D ++:103F600055FA7049C4F302222846FFF74FFA6E490A ++:103F7000C4F3C4022846FFF749FA6C49C4F341026E ++:103F80002846FFF743FA6A49284604F00102FFF782 ++:103F900083BB08EB090621AF664972783846FFF704 ++:103FA00035FA4FF0000A6449B2783846FFF72EFA26 ++:103FB000CDF800A03279F378604903EB0223019336 ++:103FC000022253463846FFF721FACDF800A0B27915 ++:103FD00073795A4903EB02230193022201233846E5 ++:103FE000FFF714FACDF800A0327AF379384603EBE4 ++:103FF00002230222019351491346FFF707FABBF14E ++:104000001E0F40F24F834E49727A3846FFF7FEF991 ++:104010004C49B27A3846FFF7F9F94B49F27A3846FB ++:10402000FFF7F4F94949327B3846FFF7EFF9CDF84D ++:1040300000A0B27B737B414903EB0223019305226D ++:1040400053463846FFF7E2F9CDF800A0327CF37B07 ++:104050003A4903EB02230193052201233846FFF777 ++:10406000D5F9CDF800A0B27C737C344903EB022370 ++:104070000193052202233846FFF7C8F9CDF800A0C6 ++:10408000CDF804A0327DF37C314903EB0223029387 ++:1040900005226C2301253846FFF7B8F90095CDF8C5 ++:1040A00004A0B27D737D2A4903EB0223029305220B ++:1040B0006C2338460224FFF7A9F90094CDF804A038 ++:1040C000327EF37D224903EB0223029305226C2307 ++:1040D0003846FFF79BF9CDF800A0CDF804A0B27EDA ++:1040E000737E384603EB02230293194905226823A5 ++:1040F000FFF78CF90095DFE077810200268102004E ++:10410000F080020017810200CB8202008783020048 ++:10411000337E0200407E020011840200447D0200D2 ++:10412000E68102002E840200618402002B800200DE ++:1041300078830200837D0200FD800200208302005C ++:10414000CA810200CF7E020084810200E87D020065 ++:10415000AF7F020008EB090621AFAF4972783846FD ++:10416000FFF754F94FF0010AAC49B2783846FFF72F ++:104170004DF9CDF800A03279F378A94903EB022379 ++:104180000193022200233846FFF740F9CDF800A042 ++:10419000B2797379A24903EB0223019302225346B9 ++:1041A0003846FFF733F9CDF800A0327AF379384674 ++:1041B00003EB02230222019399491346FFF726F9E4 ++:1041C000BBF11E0F40F26E829649727A3846FFF7B5 ++:1041D0001DF99549B27A3846FFF718F99349F27AF2 ++:1041E0003846FFF713F99249327B3846FFF70EF94C ++:1041F000CDF800A0B27B737B894903EB02230193C6 ++:10420000052200233846FFF701F9CDF800A0327CE3 ++:10421000F37B834903EB022301930522534638467F ++:10422000FFF7F4F8CDF800A0B27C737C7C4903EB77 ++:10423000022301930522022300253846FFF7E6F802 ++:104240000095CDF804A0327DF37C7A4903EB02237C ++:10425000029305226C233846FFF7D8F8CDF800A06A ++:10426000CDF804A0B27D737D724903EB0223029363 ++:1042700005226C2338460224FFF7C8F80094CDF8D5 ++:1042800004A0327EF37D6B4903EB022302930522E7 ++:104290006C233846FFF7BAF80095CDF804A0B27E3B ++:1042A000737E384603EB022302936249052268239A ++:1042B000FFF7ACF8CDF800A0CDF804A0327FF37E74 ++:1042C000384603EB02230293052268235949FFF77E ++:1042D0009DF80094CDF804A0B27F737F384603EBBD ++:1042E00002230293534905226823FFF78FF8D9E18F ++:1042F00008EB0904A378627821AD02EB03224E4952 ++:104300002846FFF783F86279A379120402EB03626F ++:10431000E3782846D2182379484902EB0322FFF7B5 ++:1043200075F8BBF1120F40F2BD81627AA37A1204D4 ++:1043300002EB0362E3794249D218237A284602EB62 ++:104340000322FFF763F8627BA37B120402EB036294 ++:10435000E37A2846D218237B3A4902EB0322FFF77F ++:1043600055F8627CA37C120402EB0362E37BD21853 ++:10437000237CABE0A278637821A803EB02230093AF ++:1043800031492B460222FFF741F801350234B5EBE3 ++:104390005B0FEFDD86E1A278637821A803EB0223AF ++:1043A000009329492B460522FFF730F801350234E6 ++:1043B000B5EB5B0FEFDD75E10095A278637821A87E ++:1043C00003EB02230193214905226C23FFF71EF81A ++:1043D000013502344FEA9B06B542EDDD002411E0C1 ++:1043E00008EB5B034B44009403EB44039A785B783F ++:1043F00021A803EB02230193144905226823FFF748 ++:1044000005F80134B442EBDD4CE108EB09039C787C ++:104410005A780F4921A824E19C7E02000A810200FB ++:1044200020830200D8810200DC7E0200938102001A ++:10443000F77D0200AF7F0200EB8302003E830200A3 ++:1044400069810200067E0200D07D0200F681020032 ++:104450004B80020008EB09039C785A78934921A805 ++:10446000FFE008EB09039C785A78914921A8F8E00D ++:1044700008EB09039C785A788E4921A8F1E008EBF3 ++:104480000904E2782379120402EB0362637821AD18 ++:10449000D218A378884902EB03222846FEF7B6FF1C ++:1044A000E279237A120402EB036263792846D21878 ++:1044B000A379824902EB0322FEF7A8FFE27A237B6D ++:1044C000120402EB0362637AD218A37A7C4928466D ++:1044D000FFF731BA08EB0904A378627821AD2846CA ++:1044E000784902EB0322FEF791FFBBF1040F40F283 ++:1044F000D9802379E27874492846FFF71CBA08EB83 ++:104500000904E2782379120402EB0362637821AD97 ++:10451000D218A37828466D4902EB0322FEF776FFF6 ++:10452000BBF1060F40F2BE80E279237A120402EB5F ++:10453000036263796649D218A3792846FFF7FBB96D ++:10454000644E09EB08040225AB45C0F2AB80E2786B ++:104550002379120402EB036263783146D218A37800 ++:1045600021A802EB03220435FEF750FF043418366D ++:104570001A2DE9D196E0584E09EB08040225AB4507 ++:10458000C0F29080E2782379120402EB0362637830 ++:104590003146D218A37821A802EB03220435FEF796 ++:1045A00035FF043413360E2DE9D17BE04B4E09EB79 ++:1045B00008040225AB4575DBE2782379120402EB8F ++:1045C000036263783146D218A37821A802EB032254 ++:1045D0000435FEF71BFF043414360E2DEAD161E0DA ++:1045E0003F4E09EB08040225AB455BDBE2782379FB ++:1045F000120402EB036263783146D218A37821A833 ++:1046000002EB03220435FEF701FF043414360E2DAD ++:10461000EAD147E0334E09EB08040225AB4541DB04 ++:10462000E2782379120402EB036263783146D218F0 ++:10463000A37821A802EB03220435FEF7E7FE043439 ++:1046400014360E2DEAD12DE008EB09039C785A7838 ++:10465000254921A805E008EB09039C785A782349ED ++:1046600021A802EB0422FFF717B808EB0901CB7869 ++:104670000A791B0403EB02634A788C789B181C4967 ++:1046800021A8012203EB0423FEF7C0FE0AE019492A ++:1046900008EB090321A8FFF77FB901220B9201E083 ++:1046A000FF2E29D00BEB0801FEF753BFB9830200A0 ++:1046B0002B7D0200BD81020069810200067E02009E ++:1046C000128002003B8402004E84020060820200DD ++:1046D0007682020056800200047F0200517E0200B2 ++:1046E0003D7F020008820200B47E0200607D02006D ++:1046F000BA8202004C8102000D9B01330D930D9A8A ++:10470000079B9A427EF41DAF0E9AB2F1FF3F03D091 ++:1047100021A81749FEF77AFE9DF8443023B121A85D ++:10472000144911AAFEF772FE00201349DEF350F17E ++:1047300038B90B9B2BB91A4621A81049FF33FEF755 ++:1047400065FE229A002302F8013B2E9B0A990093F2 ++:104750000998069B2292FEF7ABFE0A9904464FF495 ++:1047600080520998E2F3C4F2204625B0BDE8F08FEC ++:1047700022840200CF8302000E5D860021800200A9 ++:104780002DE9F04F9A468FB000230D936D4B0646EE ++:104790001C7889460592002C40F0C180142208A89C ++:1047A0002146DDF34DF47369232B05DC01224FF024 ++:1047B000040B0694079214E01C222346304621463F ++:1047C0000094E6F363F30028ACBF03230123ACBFDE ++:1047D0000022012207930692ACBF4FF00C0B4FF062 ++:1047E000020B3046E6F306F30128054602D0022804 ++:1047F00006D013E030464946DDF356F340000CE0A6 ++:104800003046FBF7D9F8044640B1DDF3FBF210F473 ++:10481000807F03D02046DDF3EBF20D900D99002947 ++:1048200000F084804846E2F353F2044610B96FF07A ++:104830001A0083E0012D0746DDF8348003D0022DF5 ++:104840000ED000251CE0002102900091CDF80480DC ++:1048500003913046059A4B46DDF320F305460DE003 ++:104860000EAB4FEA580243F8042D30460121224690 ++:10487000DDF37CF20D9B05465B000D93002D45D1C9 ++:1048800023884FF6FD72013B9BB2934205D94846FF ++:1048900021464246E2F32CF24AE0069B1BB104EBB0 ++:1048A0004B03089315E0638804EB0B01227901EBBD ++:1048B000132303EB0223A3F580530993E3880891A4 ++:1048C000CB18A3F580530A932389C918A1F5805109 ++:1048D0000B91DDB9189A4846009208A9079A5346E9 ++:1048E000FEF708FE90B91849DEF346F038B1189B80 ++:1048F0003046DAF800101A6800F024FB06E0189B36 ++:104900003046DAF800101A6800F004FB27B1484678 ++:1049100039464246E2F3ECF10A4B01221A700023B9 ++:10492000189A1846CAF80030136007E00D4688460A ++:10493000064B0027089301230793CAE70FB0BDE891 ++:10494000F08FC04640270000DEB00100B97D0200B4 ++:1049500013B5049C9E4605994CB141B100232360D8 ++:104960000B60009123467146FFF70AFF00E000202C ++:104970001CBDC046094A13888B4201D1002206E0C3 ++:1049800093888B4202D04FF0FF3005E00122034BA9 ++:1049900003EB820393F902007047C046BC84020017 ++:1049A00070B50446E6F36AF2002105462046E6F3B8 ++:1049B00037F4236A012B04D1D0F8003623F40073B6 ++:1049C00004E005DDD0F8003643F40073C0F800368B ++:1049D00020462946E6F324F470BDC046036A70B54C ++:1049E000092B054601DC00242CE0E6F347F2002108 ++:1049F00006462846E6F314F4D0F80836044613F4C5 ++:104A0000807001D1044619E04FF00043C4F86C36C1 ++:104A10004FF47A70E1F3A0F6D4F86C360022DB0490 ++:104A2000DB0C5B03C4F86C2603F54243064A03F52E ++:104A3000A873B3FBF2F3642203FB02F42846314669 ++:104A4000E6F3EEF3204670BDA08601002DE9F041AB ++:104A5000074614461E46002B7ED0E6F717F905469A ++:104A600002E0B34205D00C35002D75D02B88002B09 ++:104A7000F7D12B88002B6FD0D4F80036AA78C3F377 ++:104A80008403934268D0D4F81836642023F0C073AE ++:104A9000C4F81836D4F81C3643F6A12623F0C073A8 ++:104AA000C4F81C36E1F358F603E00A20E1F354F6AB ++:104AB0000A3ED4F8E03113F4003F01D0092EF4D1BE ++:104AC0000023C4F86036EA782B79D4F864161B0604 ++:104AD000120502F4700203F07063134321F07F614A ++:104AE0000B43C4F864360223C4F86036D4F8643645 ++:104AF0006A7923F0FE5323F4781343EA025343F414 ++:104B00008023C4F864360323C4F86036D4F86426DE ++:104B1000AB6802F07F4223F07F431343C4F864364E ++:104B20003B6A012B05DDD4F8003643F48063C4F8FA ++:104B30000036AA782988D4F8000692004FF68373CD ++:104B40007F3102F07C0200EA0303C9111A430139E4 ++:104B500042EA0142C4F80026BDE8F0812DE9F041A7 ++:104B6000044616460D46E6F389F1002180462046AC ++:104B7000E6F356F32946024633462046FFF766FF22 ++:104B800020464146E6F34CF3BDE8F0812DE9F043C1 ++:104B9000002485B0074603940294E6F36FF12146A2 ++:104BA00081463846E6F33CF37B6A4E4A0546C3F33A ++:104BB000042605E0137AC5F82036D368C5F82836F0 ++:104BC000494B083A9A42F5D14FF0000820E00821FD ++:104BD0006846464A4346DDF377F200206946DDF336 ++:104BE000F7F698B100210A46DDF3B2F53B6A0C2BCB ++:104BF00008DDB0F5803F05D200F0FF02C0F30723C7 ++:104C000042EA0340C5F82086C5F8280608F10108E5 ++:104C1000B045DCD1364C28E0E36A13B138469847FA ++:104C200010B300211EE001238B40226A134218D0EA ++:104C3000C5F8201694F924302BB1012B05D0B3F11F ++:104C4000FF3F07D00DE0A36A09E0D5F82436A26A39 ++:104C5000134304E0D5F82436A26A23EA0203C5F818 ++:104C600024360131B142DED1103C224B9C42D3D1DB ++:104C7000002614E0082168461F4A3346DDF324F27B ++:104C8000002069466C46DDF3A3F638B10021C5F873 ++:104C900020660A46DDF35CF5C5F824060136464574 ++:104CA000E8D103A902AA3846E1F342F0029B039936 ++:104CB00041EA0302D5F81C3642EA0303C5F81C3664 ++:104CC0000AB1C5F81C2609B1C5F818164FF4FA60E8 ++:104CD0000292E1F341F538464946E6F3A1F205B008 ++:104CE000BDE8F083B484020094840200513686004B ++:104CF0007484020044840200563686002DE9F04395 ++:104D000085B00546E6F3BAF0002181462846E6F371 ++:104D100087F22B6A8046042B6B6A01DDDF0E01E00F ++:104D2000C3F34367002614E0102168460D4A33465A ++:104D3000DDF3CAF1002069466C46DDF349F638B16F ++:104D400000210A46DDF304F5C8F85066C8F8540699 ++:104D50000136BE42E8D128464946E6F361F205B085 ++:104D6000BDE8F0835B3686002DE9F043036A85B029 ++:104D7000042B436A0546CCBFC3F38458C3F343589E ++:104D8000E6F37CF0002181462846E6F349F200264E ++:104D9000074615E0102168460E4A3346DDF394F1CC ++:104DA000002069466C46DDF313F638B100210A464F ++:104DB000DDF3CEF4C7F85866C7F85C06731CDEB2A4 ++:104DC0004645E7D128464946E6F32AF205B0BDE854 ++:104DD000F083C04663368600F7B5053A06461F469F ++:104DE000062A2BD8DFE802F00A0C12040E2A06006D ++:104DF00005250CE01125032402230AE0012502E029 ++:104E0000052500E011250F24042302E000251F24BE ++:104E10000323009300214FF4CB624FF0FF33304661 ++:104E2000E6F334F004EA0703AB4030460093002178 ++:104E300040F25C6214FA05F3E6F328F0FEBDC046CA ++:104E40002DE9F04105460E4600201749DDF394F5A3 ++:104E5000164984B20020DDF38FF540F2DC51002CBE ++:104E600018BF2146C7B22846FFF784FDC0B210F034 ++:104E7000800F0CD1C4B23146284607222346FFF7E3 ++:104E8000ABFF2846314608222346FFF7A5FF2FB186 ++:104E9000284631463A460123E5F732FF2846314697 ++:104EA000FFF762FFBDE8F0816F36860098C201000F ++:104EB00070B505460C46FFF721FF00222146284623 ++:104EC000E1F38AF02846E5F3D9F70A4904460020C1 ++:104ED000DDF352F54FF4002210F001034FF0000112 ++:104EE000284618BF1346E0F3ABF728462146E6F301 ++:104EF00097F170BD7836860070B500210546102008 ++:104F0000E1F384F2002110220446DDF399F02046FB ++:104F1000656070BD70B50C461546E6F3EBF01021E8 ++:104F2000E1F3D6F610B96FF01A0008E0044A102336 ++:104F300043601368C460036085601060002070BD2A ++:104F40006C27000070B515460C46E6F3D3F010212F ++:104F5000E1F3BEF6024610B96FF01A0010E010231C ++:104F600043600849002303600B68C46085601BB977 ++:104F70000860184604E0034618680028FBD11A6050 ++:104F800070BDC0466C27000070B50C461546E6F3B0 ++:104F9000B1F01021E1F39CF610B96FF01A0008E0AF ++:104FA000044A102343601368C46003608560106086 ++:104FB000002070BD6C270000064B10B51B683BB984 ++:104FC000054B196821B1054B1A680AB1FFF7DCFFE0 ++:104FD000002010BD6C270000ECED0100F0ED010099 ++:104FE000012070470020704710B50020DDF3C4F4A5 ++:104FF00010BDC04610B50B490446FFF7F5FF80B25F ++:1050000078B9E06F0749DDF3B7F480B248B9E06FD3 ++:105010000549DDF3B1F44FF6FF7380B2002808BFF5 ++:10502000184610BD483786004E37860041F2E443EB ++:1050300070B5C36204460D4629B108460949DDF33F ++:105040009BF4A06240B900200749DDF395F4A0620B ++:1050500010B94FF6FF73A36228460449DDF38CF4C0 ++:10506000206370BD543786005B3786008637860024 ++:10507000836973B513F0005F04466FD08268B2F5A0 ++:10508000026F01D101220AE040F604039A4201D0E6 ++:10509000002204E0C3680C2B94BF002201224FF0D1 ++:1050A0000003D5B2ADF8063055B920464FF4006183 ++:1050B0002A46D4F8C860E6F3A1F000284ED005E0F7 ++:1050C000D4F8843013F5405048D000266369222B71 ++:1050D00003DC0023C0F8683100E00023C0F864312D ++:1050E000C0F860316369222B03DC1F4BC0F84431E8 ++:1050F00005E00123C0F84831FE33C0F84C31636944 ++:10510000222B07DC0023C0F88031C0F87C31C0F8C6 ++:10511000783104E00023C0F87431C0F870311DB953 ++:1051200020463146E6F37CF020460DF10601FFF7FC ++:1051300059FF0546A8B9BDF8063093B163690B491C ++:10514000222B2046D8BF4FF48021CCBF40224FF401 ++:1051500080222B46E5F3B4F6284603E04FF0FF30FB ++:1051600000E000207CBDC0460000FBBF400055555C ++:105170002DE9F047002104461F46DDF82080DDF8C8 ++:105180002490E6F34DF005462046E5F389F660618C ++:105190000A28C4BFEB6A63646B68A3616369222B4E ++:1051A000C4BFD5F8AC30E361A36913F0805F05D0CC ++:1051B000D5F80436636203F0FF0323624FF4E06323 ++:1051C000A3604FF0FF33E3602546123300262361CE ++:1051D00016E031462046E6F323F02046E5F342F69A ++:1051E0002046E5F35DF61FB1D5F810319F4203D09C ++:1051F000D5F88830994501D1C8F8006001360435EA ++:10520000D4F8CC309E42E4D32046D8F80010E6F320 ++:1052100007F00120BDE8F08730B585B0019000258A ++:1052200004A840F8045D01A90422DCF3A5F6019C62 ++:10523000D4B122462946D2F8883013B10023C2F8EF ++:105240008830013104321029F5D10398DCF332F6AD ++:105250000398E5F763FE054B9C4205D0606D21463F ++:105260004FF45672E1F344F505B030BD88F5010006 ++:105270002DE9FF470C9E1446DDF834808A464FF432 ++:105280005672002105461F46DDF83890012E08BFF2 ++:105290000026DCF3D5F611232B61C5F88470C5F820 ++:1052A00058806C656E60002E40F0B980284631460B ++:1052B00052464346FFF794FE002800F0B0804FF0BE ++:1052C000C05422682846130F2B6013041B0CAB63D9 ++:1052D000C2F30343C2F303522A640E3A012A8CBF7D ++:1052E00000220122EB6385F8482021465246FDF753 ++:1052F00039FFD5F8CC30002B00F0918004AB43F897 ++:10530000046D009328462146324633460197FFF745 ++:105310002FFF002800F083802846FFF74DFE0F9AEC ++:105320006B6D2846019231463A46CDF80090FFF762 ++:105330000FFB002873D1B9F1000F01D14E4601E0F7 ++:10534000D9F8006028463146FFF770FE364B1C78CE ++:10535000002C30D16B69132B0BDD4FF40061284614 ++:105360002246E5F34BF78465C46503992846E5F3C7 ++:1053700057F72846696DFFF713FB2846696DFFF75D ++:1053800097FD30462949DDF3F7F2024620B9284659 ++:10539000696DFFF723FB02462846696DFFF7DEFBC8 ++:1053A0002846696DFFF7F2FB2846696DFFF748FD57 ++:1053B0001D4B01221A706B690F2B0FDD1C49304603 ++:1053C000DDF3DAF21B4B0021002808BF18460090DD ++:1053D000882228464FF0FF33E5F358F5304616494A ++:1053E000DDF3F6F238B114493046DDF3C5F201467B ++:1053F0002846E5F749FF6B69142B11DD002421468F ++:105400000822234628460094E5F340F5214640F063 ++:105410000403082228460093E5F338F500E0002550 ++:10542000284604B0BDE8F087E0F80100E2388600C5 ++:10543000EB3886005A000A00F13886001FB5104C80 ++:1054400086462178C9B90F4A0F4B002808BF02468B ++:1054500008BF034600910191029303920B4844F266 ++:10546000107172464FF0C053FFF702FF00B905E01C ++:10547000074A2023136001232370044804B010BDA1 ++:1054800084F5010008F6010004F6010088F501002A ++:10549000742700002DE9FF4781460D4608464FF46A ++:1054A000567192461E460D9FDDF83880E1F310F4E8 ++:1054B000044610B30C9B494601932A465346009676 ++:1054C0000297CDF80C80FFF7D3FE064638B9284680 ++:1054D00021464FF45672E1F30BF430460EE00FB95B ++:1054E0003B4600E03B68E367B8F1000F01D143465B ++:1054F00001E0D8F80030C4F88030204604B0BDE8A0 ++:10550000F087C04670B5044628B30368124918688E ++:105510002246FEF319F52546002610E0296A29B136 ++:1055200023689868EAF3ACF000232B62E96921B1A3 ++:1055300023682A8B5868E1F3DBF30136183561687C ++:105540008E42EBDB182201FB02F2236821465868E9 ++:105550001032E1F3CDF370BD98C301002DE9F043A3 ++:10556000036885B081467021D868E1F3B1F3044641 ++:1055700008B9064648E0002170220646DCF360F5D3 ++:105580000423636027464FF0B40325464FF000081C ++:10559000C4F80090A38112E0182208FB02F2103236 ++:1055A0002C61D9F808001A49A2180023EAF384F004 ++:1055B0002862183508B905461CE008F1010863683F ++:1055C0009845E9DB134BD9F80000009300230193C1 ++:1055D000029303931049114A2346FEF37DF413E02E ++:1055E000396A29B123689868EAF34AF000233B62DC ++:1055F0000135183763689D42F2DB236821465868FD ++:105600007022E1F375F30026304605B0BDE8F08363 ++:1056100099B500001DB4000074C3010099C30100D6 ++:10562000034B012210B51A70E5F752FA10BDC046BF ++:1056300038F5010070B50446D0F884000D4608B175 ++:10564000FDF74EF8D4F8800008B1FFF75BFFE06F7C ++:1056500008B1FAF707FCA06F08B100F001F9A068E3 ++:1056600008B1FAF76DFF284621468C22E1F340F39A ++:1056700070BDC0460B682DE9F041DC694368054602 ++:105680000E46D868A021E1F323F3C5F8880000286E ++:105690003ED00021A022DCF3D3F4D5F88820A36DFE ++:1056A000082182F87B30D5F88820636D82F87A3043 ++:1056B000D5F88820E36D82F87C30236ED5F88820F9 ++:1056C00082F87D306B68D868E1F302F3C6F84408CD ++:1056D000F0B1002108220127DCF3B2F486F841780A ++:1056E000D5F888402846C4F89C500B4922460B4BFD ++:1056F000E9F3E2F7C4F8980050B1D6F87C024A21E9 ++:105700003A4621F041D80023184686F8403801E097 ++:105710004FF0FF30BDE8F08191FF80008A418600A4 ++:105720002DE9F04F064689B00D4600208C219146A8 ++:105730009846139FE1F3CCF20446002874D0002170 ++:105740008C22DCF37DF427603046FFF7D5FB07ABF6 ++:105750000190059383464FF0000A204641F2E44150 ++:1057600042463B460295CDF800A0CDF80C9004943B ++:10577000FBF7BAF80546002858D0A06000F0B0D971 ++:105780002B696060E3602D4B1021A3642C4A3B46DB ++:10579000266164643046DCF397F42B6939461B6E4E ++:1057A00028489A6B284BE9F789FC504612993A46EB ++:1057B000264B0096CDF80490FDF710F9002835D15E ++:1057C00020462946FFF756FF064600282ED163687B ++:1057D000012283F878203621D5F87C0220F0D4DF2E ++:1057E0001B4B2846E36300F04DF8A067F0B1284654 ++:1057F000FAF74CFBE067C8B12846FFF7AFFEC4F8E4 ++:10580000800098B12846FCF799FFC4F8840068B17D ++:10581000104B019600930296039628680E490F4A92 ++:105820002346FEF359F308B9204604E020465946C2 ++:10583000FFF700FF002009B0BDE8F08F55F78000AA ++:10584000FB418600C4840200A4C3010029FB800040 ++:10585000EFBEAD0D99F88000ECC30100C542860093 ++:1058600010B5044658B10368054918682246FEF38E ++:105870006BF32368214658685422E1F339F210BDD6 ++:105880002B7A860030B55421044685B04068E1F398 ++:105890001FF208B9054611E0002154220546DCF349 ++:1058A000CFF3084B2C6000930023019302930393E2 ++:1058B00020680549054A2B46FEF30EF3284605B03D ++:1058C00030BDC046F1BD000038C401002B7A86000F ++:1058D0000020704710B5044698B10BF0B3D80949C1 ++:1058E00060682246FEF330F3E16E21B163683C222A ++:1058F000D868E1F3FDF163682146D8687022E1F3CE ++:10590000F7F110BDD58D86007FB505467021406842 ++:10591000E1F3DEF1064608B9044631E000217022C9 ++:105920000446DCF38DF32B683560736068683C21B6 ++:10593000E1F3CEF1E066F8B100213C22DCF380F324 ++:10594000114B12490093002301930293104B114A0B ++:10595000039370683346FEF3BFF268B94FF001035A ++:105960007382B38230462946FFF7B2FF002803DB7B ++:1059700030460BF063D903E03046FFF7ABFF00245D ++:10598000204604B070BDC046390B830068C40100D6 ++:10599000290C8300D58D860010B5044658B10368E4 ++:1059A000054918682246FEF3CFF22368214658685D ++:1059B0000822E1F39DF110BDE3C40100F0B5082118 ++:1059C00085B005464068E1F383F1064608B9044610 ++:1059D00024E00021082200270446DCF331F30421EF ++:1059E0002846104A104B0097019601F091FFB842EB ++:1059F00070600FDB0D4B286800930D4B0D49019330 ++:105A00000D4B0E4A039333460297FEF365F208B935 ++:105A1000356003E03046FFF7BFFF0024204605B0A5 ++:105A2000F0BDC04605C7000021C9000099C60000AE ++:105A300095C60000E8C4010091C60000E3C401005F ++:105A40002DE9F041066805461B4930682A46FEF3F9 ++:105A50007BF22C460027D4F8081121B17068B4F805 ++:105A60001021E1F345F1D4F80C1121B17068B4F8BC ++:105A70001221E1F33DF101374034042FEBD1D5F889 ++:105A80000C1221B17068B5F81022E1F331F1D5F8AC ++:105A90001C1211B1B068E9F3F3F5D5F8201219B171 ++:105AA00070683A46E1F324F1706829464FF4237296 ++:105AB000E1F31EF1BDE8F081F4C4010010B5014628 ++:105AC00020B10368B022D868E1F312F110BDC046DE ++:105AD0002DE9F34107680546B021F868E1F3F8F0D5 ++:105AE000064608B980468BE00021B02201AC804612 ++:105AF000DCF3A6F20422002137607560C5F85C6112 ++:105B00002046DCF39DF22A6892F87C30012B07D9FD ++:105B10003D495069DCF35CF7014690B120460AE04C ++:105B200050693A49DCF328F70928034609D838496F ++:105B3000204601EB83010322DCF33AF300238DF8C6 ++:105B4000073001AC0322214606F10800DCF330F3F4 ++:105B50000023F3722B682F495869DCF30DF739697C ++:105B6000F060CA6A41F26B039A420CD18B6A8B2BAC ++:105B700009D1022807D1204627490422DCF3F8F294 ++:105B800008B90323F360396941F26B03CA6A9A4288 ++:105B90000DD18B6A932B0AD101A820490422DCF392 ++:105BA000E7F220B9F368042B01D10233F36001AFAF ++:105BB000284639461FF04CDE044650B9184938468D ++:105BC0000322DCF3F5F2284639468DF807401FF032 ++:105BD0003FDE05F5AA60394603220A30DCF3E8F21D ++:105BE000002405F5AA600F4985F85D450E300322B3 ++:105BF000DCF3DEF285F861453046394620F0B2DA52 ++:105C00004046BDE8FC81C046B3C48600B9C48600E6 ++:105C1000CE028600BCC48600C3C4860071C2860062 ++:105C2000C6C48600CAC4860010B50446E8F7A4FDC1 ++:105C3000A16961B1237D23B1E068E9F30FF5002389 ++:105C40002375E068A169E9F31BF50023A3612369CB ++:105C50002146D8682C22E1F34BF0002010BDC0464D ++:105C60002DE9F04107468846C0682C2114461E469F ++:105C7000E1F32EF008B9054619E0054600212C2273 ++:105C8000DCF3DEF1EC602046EE61C5F808802F61A0 ++:105C900008492A460023E9F30FF50446A86130B904 ++:105CA0002B692946D8682C22E1F322F025462846A4 ++:105CB000BDE8F0813D66840010B50349002200680C ++:105CC000FEF342F1002010BD49C586001FB5094A08 ++:105CD0000B46009200220192029203920649074A63 ++:105CE000FEF3FAF0002814BF4FF0FF30002005B09B ++:105CF00000BDC04609688400B8CA010049C58600D5 ++:105D00001FB5084A034600920022019202920392B4 ++:105D10000549064A0068FEF3DFF0003818BF01208D ++:105D200005B000BD35F3000078CB010048CB010081 ++:105D300010B5B0F8BC400C80B0F8C0101180B0F8BD ++:105D4000C6201A8090F8C820029B01201A8010BD3E ++:105D500090F8D4007047C046D0F8CC007047C046D9 ++:105D600010B5014618B180689822E0F3C1F710BD64 ++:105D700070B5982104460068E0F3AAF708B9054613 ++:105D800033E0002198220546DCF35AF12368AB602A ++:105D90006368EB60A3682B61E3686B6023696B61E8 ++:105DA000238CAB84638CEB84636AAB62A36AEB6283 ++:105DB000E36A2B63236B6B63636B6B64A36BAB64F2 ++:105DC000E36BEB64236C2B65636C6B656369AB659C ++:105DD000A369EB650F232B662D336B663C33AB66F3 ++:105DE0000323EB66002385F89430284670BDC04637 ++:105DF00070B501210446E9F7A9FE2046E9F72EFF18 ++:105E0000C0F30F33A4F8C630B4F8C620030F84F8EB ++:105E1000C83042F2640300F00F009A4284F8C900CF ++:105E200005D002339A4202D04FF0FF3500E0002542 ++:105E300020460021EAF7F6FB284670BD70B50446FF ++:105E400000282DD0D0F8E4305D1EC0F8E4503DBBF2 ++:105E500041F2B826815921B1C3691869F4F7FCFAF7 ++:105E6000A55141F2CD13E5542046EAF7BBFAE169AA ++:105E70000A68A24203D1D4F8B4300B6005E0D2F82E ++:105E8000B430A34208BFC2F8B450E36E0BB1204651 ++:105E90009847E3692146986841F25832E0F328F7C1 ++:105EA00070BDC04670B5D0F8B8400E46E9B108469E ++:105EB000DCF356F10546C0B10FE0204631462A46D4 ++:105EC000DCF33EF028B9635D3D2B02D1631C581909 ++:105ED0000CE014F8013B002BFBD114B12378002B0C ++:105EE000EBD13046E1F3C2F600E0002070BDC046C1 ++:105EF0002DE9F34141F22835435B064688462BB332 ++:105F00000846DCF32DF104461448DCF329F124188B ++:105F10001034F369A7B298683946E0F3D9F604461D ++:105F200008B9054617E0735B0D4A009339464346AE ++:105F3000DCF3CAF021463046EBF714FDF369054661 ++:105F4000214698683A46E0F3D3F625B930464146F3 ++:105F5000EBF708FD05462846BDE8FC819ACC010018 ++:105F6000A0CC01002DE9F04F41F2283B85B003930E ++:105F700030F80B30064689469246D0F8B880002BA0 ++:105F800038D00846DCF3ECF004462448DCF3E8F0B3 ++:105F90002418F3691034A7B298683946E0F398F6EC ++:105FA000054608B9044634E036F80B30394600930C ++:105FB0001B4A4B46DCF388F030462946EBF7E0FC01 ++:105FC000834668B140462946DCF7FEFB40B15045A8 ++:105FD00006DD404629465246DCF3DCF4044600E088 ++:105FE000039CF369294698683A46E0F381F6BBF1D1 ++:105FF000000F0ED140464946DCF7E6FB40B1504564 ++:1060000006DD404649465246DCF3C4F4044600E04F ++:10601000039C204605B0BDE8F08FC0469ACC010035 ++:10602000A0CC010070B590F8C43001229A401A4902 ++:10603000013A0446D5B2EBF7D7FC41F20202C0B2F6 ++:10604000A0540138C0B2FD2801D97323A354A25C27 ++:1060500041F20303E25420461049EBF7C5FC41F23C ++:106060000402C0B2A05408B10F2801D10523A354E3 ++:1060700041F20203E25C0233E35CD21A41F205030F ++:10608000E25400220133E2540233E25445EA05129D ++:10609000013BE25470BDC046178502002285020014 ++:1060A0002DE9F84F88460021846807469246C0686B ++:1060B0000A469B46E4F3CEF610F0080F814615D051 ++:1060C0003E689EB13046514600F084FA002800F048 ++:1060D0007481F369D6F8CC1018692AF0E1DAD6F8A1 ++:1060E000E43030460133C6F8E4306DE1204641F239 ++:1060F0005831E0F3EDF50546002800F05C81002101 ++:1061000041F258320646DBF39BF7012105F5915227 ++:1061100041F2C41385F8E110EA50FA6CA3F5AC73B0 ++:10612000013B9A42C5F8B080EF6105D17B6C932B9F ++:1061300002D1A5F8221603E04FF01802A5F8222696 ++:106140006423002185F8E03041F208230422E95459 ++:106150000133EA540133E9540133BAF1020FC5F8AF ++:10616000B8B0EA5406D119F0010F1CBF4FF4005328 ++:10617000C5F8CC30EB69D5F8CC1018692AF090DA64 ++:10618000D5F8B030B3F8E0339CB2EB69D868E4F7E7 ++:1061900019FF41F22833E852C4F30323C5F8BC3099 ++:1061A00004F00F03C5F8C030EB699A6A874BD31827 ++:1061B000012B06D94AF6E6039A4202D0043B9A42E2 ++:1061C00007D1EB69DB6A023B012B02D80923C5F832 ++:1061D000C030D5F8BC30092B07D10423C5F8BC303A ++:1061E000D5F8C0301033C5F8C030012385F8C4306D ++:1061F000230BC5F8D030D5F8BC30022B0CD9042BBA ++:106200000AD0052B08D0062B06D0082B04D00A2B69 ++:1062100002D0072B40F0D1803C23C5F8E43F002397 ++:10622000C5F8E83F4FF40063A5F8DE3042F60132CE ++:1062300041F62433BAF1020F08BF1346A5F8DA304D ++:1062400095F8DA30284685F800376149EBF798FB76 ++:1062500090B15F492846EC69EBF7C6FB5C492067C3 ++:106260002846EC69EBF7C0FBEA69BAF1020F6067F8 ++:106270000CBF136F536FD3660A2241F2D613EA5450 ++:1062800003210133E9540123002485F8E83041F269 ++:10629000F013EC54A3F5F273013A013BEA54EB69B5 ++:1062A00085F8E94585F8EE4585F8F34585F8F84524 ++:1062B00085F8FD45284683F89310FFF7B3FE41F2B9 ++:1062C0000903EC544FF6CE7241F2B423EA5285F83A ++:1062D000F440621901347F23652C82F82C3682F851 ++:1062E000913682F8B232F4D14FF0FF33A5F8FA3686 ++:1062F000002385F8AC302846514601F037F90028D4 ++:106300005BD02846E9F716FC2846FFF771FD0446E6 ++:10631000002852D12F4906222846EBF759FB41F2BB ++:10632000D623E8542C4901222846EBF751FB41F2D1 ++:10633000E423E854294922462846EBF749FB41F279 ++:106340002A33E854264928460722EBF741FB41F25D ++:106350002B33E854224628462249EBF733FB6319D6 ++:1063600003F5985301342833182C1871F2D1002406 ++:10637000224628461C49EBF725FB6319013403F537 ++:106380009A530E2C1871F3D1D5F8E430EA69013331 ++:10639000C5F8E4301368D068C5F8B4303D60FEF746 ++:1063A00067FE05F1B803C5F8B830284605F1BC0111 ++:1063B0001C22DBF3E1F5284606E0B868314641F2DD ++:1063C0005832E0F395F40020BDE8F88F1D57FFFF29 ++:1063D00054850200F8840200488502000A85020004 ++:1063E00033850200418502000385020010B5024991 ++:1063F0000268FDF3A9F510BD38D301001FB5094BA4 ++:10640000094900930023019302930393074A036809 ++:10641000FDF362F5002814BF4FF0FF30002005B0F7 ++:1064200000BDC046F519010078D2010038D3010043 ++:106430002DE9F041002580460F4616462C4607E020 ++:1064400004EB0800E1190522DBF396F5013505346C ++:10645000B542F5D1BDE8F081022970B505460C467C ++:106460000AD0032911D0012916D106220B49E9F7D8 ++:1064700013FBEA69002305E006220949E9F70CFB52 ++:10648000EA69012382F8813006E006490622E9F72D ++:1064900003FBEB6983F8814070BDC046C0DB01009F ++:1064A000CCDB0100E0DB010070B5D0F8A840002390 ++:1064B00094F8C113C4F874350F4A104B022914BF65 ++:1064C00015461D46C3694FF420719868E0F300F447 ++:1064D000C4F8740578B180222946FFF7A9FF94F823 ++:1064E0003A35022B06D1D4F874050549A03015229F ++:1064F000FFF79EFF012070BD589502007C900200BE ++:106500001C9802002DE9F047D0F8A8308146D3F856 ++:106510007C55D3F878A54FF0000817E0142403FB4E ++:1065200004F42B191A695B682F5903FB02F3DE0888 ++:10653000D9F81C3031469868E0F3CAF308F1010835 ++:10654000285140B139463246DBF316F55FFA88F33D ++:106550005345E3D30120BDE8F087C0462DE9F04163 ++:10656000194BD0F8A8501A68C369002614210746B1 ++:10657000C5F87C65C5F87825986802FB01F1E0F361 ++:10658000A7F30446C5F87C05E0B1B0460FE0FB690F ++:1065900006EB04001B6D08F1010813F4805F14BFC3 ++:1065A0000A490B4914227118DBF3E6F41436D5F8C6 ++:1065B00078359845EBD338460121FFF7A3FF003823 ++:1065C00018BF0120BDE8F081C4E90100988E0200E7 ++:1065D000589D02002DE9F041884686B07A4905466B ++:1065E000D0F8A860EBF700FA784930722846EBF74C ++:1065F000FBF9774970722846EBF7F6F97549A5F86B ++:10660000FC002846EBF7F0F97349A5F8FE00284690 ++:10661000EBF7EAF97149A5F800012846EBF7B0F964 ++:1066200038B128466D49EBF7DFF910B1012386F840 ++:10663000E83396F8E8330BB368492846EBF7D4F90A ++:106640006749A5F802012846EBF7CEF96549A5F898 ++:1066500004012846EBF7C8F96349A5F80601284666 ++:10666000EBF7C2F9614986F824052846EBF7BCF937 ++:10667000002241F20B0386F82505EA545C492846BE ++:10668000EBF7B2F95B49C6F8340414222846EBF75D ++:106690009FF95949A6F83C045A222846EBF798F985 ++:1066A000564986F8540408222846EBF791F95449D4 ++:1066B00086F84C0403222846EBF78AF9514986F8FC ++:1066C0004D0408222846EBF783F94F4986F84E041B ++:1066D00003222846EBF77CF94C4986F84F04082240 ++:1066E0002846EBF775F94A4986F8500403222846F4 ++:1066F000EBF76EF9474986F8510408222846EBF774 ++:1067000067F9032286F8520443492846EBF760F9FB ++:10671000424986F853042846EBF766F9404986F863 ++:10672000580402222846EBF753F93E4986F8C10483 ++:106730002846EBF725F928B128463A49EBF754F9F2 ++:10674000F07400E0F07428463749EBF719F928B1E6 ++:1067500028463549EBF748F9307501E008233375D1 ++:1067600028463249EBF70CF928B128462F49EBF7B8 ++:106770003BF9707501E00223737528462C49EBF74D ++:10678000FFF828B128462A49EBF72EF9B07501E049 ++:106790000423B37528462749EBF7F2F828B12846B9 ++:1067A0002449EBF721F9F07501E00823F375284639 ++:1067B0002149EBF7E5F8002840D028461E49EBF7C1 ++:1067C00013F930763CE0C046FA8C0200988C020047 ++:1067D000DF890200E5890200EB890200BF8A02001E ++:1067E0009289020092880200858602009A86020041 ++:1067F0006E8E0200388902006C8D0200E38D02006B ++:10680000338E0200B18D020073850200C28D02003A ++:1068100084850200A08D0200878E02006688020037 ++:10682000B8860200E7870200D4870200EF870200E3 ++:10683000DB8D0200D38D0200F28C0200022333763E ++:10684000B6492846EBF7D0F8B549B0722846EBF7C1 ++:10685000CBF8B449F0722846EBF7C6F8B17AF27A71 ++:10686000C3B230737173B273F37331747274B374EF ++:10687000AD492846EBF7B8F8B5F8FC2041F20A33E9 ++:10688000EA520633EA52B5F8FE20043BEA520633D8 ++:10689000EA52B5F80021043BC7B2EA52063385F844 ++:1068A0001A71EA522846A149EBF79EF8002480B2FB ++:1068B0002A1900F00F030134A7EB43030009042C4D ++:1068C00082F81E31F4D128469949EBF78DF82A1940 ++:1068D00000F00F030134A7EB430300090C2C82F8EE ++:1068E0001E31F4D193492846EBF77EF892490446CD ++:1068F0002846EBF779F880B240EA04417160142031 ++:106900002A1801F00F030130A7EB430309091C28E3 ++:1069100082F81631F4D189492846EBF765F88849A1 ++:1069200070832846EBF760F8864930772846EBF706 ++:106930005BF8854970772846EBF756F88349B077BE ++:106940002846EBF751F88249F0772846EBF74CF8E8 ++:10695000804986F822002846EBF746F87E4986F8FB ++:1069600021002846EBF740F87C4986F8E0042846E9 ++:10697000EBF73AF80127C6F8E40401AC7849204661 ++:106980003A46DBF3B1F3D5F8B8002146DCF320F04A ++:1069900030B100210A46DBF3DBF6F31983F8E70494 ++:1069A00001370F2FE9D16F492846EBF71DF86E49E3 ++:1069B00086F8F6042846EBF717F86C4986F8F704D2 ++:1069C0002846EBF711F86A4986F8F8042846EBF7F1 ++:1069D0000BF8684986F8F9042846EBF705F866498C ++:1069E00086F8FA042846EAF7FFFF644986F8FB04B4 ++:1069F0002846EAF7F9FF624986F8FC042846EAF7D8 ++:106A0000F3FF604986F8FD042846EAF7EDFF5E498A ++:106A100086F8FE042846EAF7E7FF5C4986F8FF049B ++:106A20002846EAF7E1FF5A4986F800052846EAF7C2 ++:106A3000DBFF584986F801052846EAF7D5FF564995 ++:106A400086F802052846EAF7CFFF544986F8030581 ++:106A50002846EAF7C9FF524986F804052846EAF7AE ++:106A6000C3FF504986F805052846EAF7BDFF4E49A1 ++:106A700086F806052846EAF7B7FF4C4986F8070569 ++:106A80002846EAF7B1FF4A4986F808052846EAF79A ++:106A9000ABFF484986F809052846EAF7A5FF4649AD ++:106AA00086F80A052846EAF79FFF444986F80B0551 ++:106AB0002846EAF799FF424986F80C052846EAF786 ++:106AC00093FF404986F80D052846EAF78DFF3E49B9 ++:106AD000A6F814052846EAF787FF4FF00042A6F80B ++:106AE00016053A492846EAF773FF3949C6F81005F2 ++:106AF0002846EAF779FF374986F824002846EAF75E ++:106B000073FF354986F823002846EAF76DFF3349BD ++:106B100086F820002846EAF767FF61E0AF850200AB ++:106B2000B58A020088890200A78902004489020010 ++:106B3000F98B02006A85020061850200368A020034 ++:106B4000A5850200978B0200A28B020095850200AA ++:106B50007E880200A8880200628A0200A88A0200D9 ++:106B600008880200F1890200298B02003A8B02009A ++:106B70005B8D0200B38C0200C48C0200F18D020018 ++:106B8000128E0200248A0200438A0200708A0200E8 ++:106B9000D58C0200AD8B02000B8D02001D8D020012 ++:106BA0002F8D0200418E0200538E0200F9850200F3 ++:106BB00023860200218702004087020054880200D9 ++:106BC00063870200A986020001890200068702008D ++:106BD000778D0200838D0200238E0200DA8B020083 ++:106BE000B94985F826062846EAF7FEFEB74986F831 ++:106BF000C1032846EAF7F8FEB54986F8C2032846DD ++:106C0000EAF7F2FE86F8C30395F8261611B1284676 ++:106C1000FFF722FC4FF0FF32AE492846EAF7D8FED4 ++:106C200080B210F4004F18BF4FF0FF324FF0FF3327 ++:106C3000A6F86200A6F8663018BFA6F86220A6F88B ++:106C400068302846A449EAF79BFE58B12846A24975 ++:106C5000EAF7CAFE80B210F4004F04BFA6F866003F ++:106C6000A6F8680028469D49EAF78AFE48B12846FA ++:106C70009A49EAF7B9FE80B210F4004F08BFA6F8AF ++:106C8000660028469649EAF77BFE48B128469449B3 ++:106C9000EAF7AAFE80B210F4004F08BFA6F8680019 ++:106CA00090494FF0FF322846EAF792FE4FF0FF324C ++:106CB000A6F8C4038C492846EAF78AFE8B49A6F851 ++:106CC000C6032846EAF790FE8949A6F8C8034FF4A0 ++:106CD000CF722846EAF77CFE8649C6F8CC0347F611 ++:106CE0009A622846EAF774FE8349C6F8D0030A225E ++:106CF0002846EAF76DFE8149C6F8D40308222846E3 ++:106D0000EAF766FE7E49C6F8D80341F26E022846CD ++:106D1000EAF75EFE0A22C6F8DC037A492846EAF75B ++:106D200057FE7949C6F8E0032846EAF75DFE774941 ++:106D3000A6F8E4032846EAF757FE96F8E83380B24F ++:106D4000A6F8E6032BB103B2002BC4BF0022A6F8BD ++:106D5000E62350226E492846EAF73AFE6D4986F846 ++:106D6000EA032846EAF740FE6B4986F8EC0328461A ++:106D7000EAF73AFE694986F8ED032846EAF734FE59 ++:106D8000674986F8EE034FF0FF322846EAF720FE07 ++:106D9000644986F8F0034FF0FF322846EAF718FE00 ++:106DA0004FF0FF3486F8F1035F49224686F8EF433F ++:106DB0002846EAF70DFE5D4986F8F203224628468A ++:106DC000EAF706FE5A4986F8590522462846EAF7A8 ++:106DD000FFFD584986F85A0522462846EAF7F8FD8D ++:106DE000554986F8F30322462846EAF7F1FD534950 ++:106DF00086F85B0522462846EAF7EAFD504986F800 ++:106E00005C0522462846EAF7E3FD4E4986F8F4037E ++:106E100022462846EAF7DCFD4B4985F8DA0522468A ++:106E20002846EAF7D5FD4949A6F8F6032246284642 ++:106E3000EAF7CEFD4649A6F8F80322462846EAF7C7 ++:106E4000C7FD4449A6F8FA0322462846EAF7C0FDE2 ++:106E50004149A6F8FC0322462846EAF7B9FD3F4916 ++:106E6000A6F8FE0322462846EAF7B2FD3C49A6F8FA ++:106E7000000422462846EAF7ABFD3A49A6F8020488 ++:106E800022462846EAF7A4FD0022A6F80404364963 ++:106E90002846EAF79DFD0022A6F85E0533492846FC ++:106EA000EAF796FD0022A6F8600531492846EAF780 ++:106EB0008FFD0022A6F862052E492846EAF788FDD4 ++:106EC0002D49A6F8640559E0178602000B860200DA ++:106ED000588C02005A890200DF8B0200498D0200A3 ++:106EE0007587020087870200E88A0200E2860200B6 ++:106EF000EF8B020068860200818902008E87020003 ++:106F0000028D0200178C02004B8C02004C8902009B ++:106F1000888802004B8B0200D88502006F8B02002C ++:106F20005D860200C7880200E78C0200748C0200B4 ++:106F30003387020072880200EB860200898B020010 ++:106F4000A5870200948A0200D4890200718602009B ++:106F50001E8C020076890200F9860200B9880200C0 ++:106F60009B890200288802002B8C0200EF8A020015 ++:106F7000DA8A0200888C0200548B02002846EAF765 ++:106F800033FDB8F1020F86F8060414D12846A4494F ++:106F9000EAF7F6FC002800F0A382344600273A46C0 ++:106FA00028469F49EAF70EFD0137C4F80C04043463 ++:106FB000052FF4D116E0B8F1010F13D128469949F5 ++:106FC000EAF7DEFC002800F08B82344600273A46C0 ++:106FD00028469449EAF7F6FC0137C4F82004043443 ++:106FE000052FF4D190494FF0FF322846EAF7F0FC24 ++:106FF0008E49A6F83E044FF0FF322846EAF7E8FC37 ++:107000008B49A6F840044FF0FF322846EAF7E0FC2F ++:107010008849A5F8CE0F2846EAF7B2FC30B12846D9 ++:107020008449EAF7E1FC41F2DA23E8528249284632 ++:107030004FF0FF32EAF7CCFC41F22433E8527F49AB ++:107040002846EAF79DFC30B128467C49EAF7CCFC9B ++:1070500041F2DE23E852284679490022EAF7B8FCDB ++:10706000C0B286F84D0358B176492846EAF7BCFC11 ++:107070007549C6F850032846EAF7B6FCC6F860031F ++:1070800028467249EAF77CFC28B3D5F8B8006F4966 ++:10709000DBF79AFB06281ED1344600273A466B4997 ++:1070A000D5F8B800DBF376F484F895037A1C6749C9 ++:1070B000D5F8B800DBF36EF484F89703BA1CD5F862 ++:1070C000B8006249DBF366F4033784F899030134AE ++:1070D000062FE3D111E0012386F89533313386F88A ++:1070E00096330E3386F8973386F89833042386F860 ++:1070F00099334FF0FF3386F89A3355492846FF22DB ++:10710000EAF766FC4FF0FF03A6F85403A6F85633DF ++:10711000A6F85833A6F85A3328464E49EAF730FC09 ++:1071200028B3D5F8B8004B49DBF74EFB34460328AB ++:10713000B4BF80464FF00308002707E03A462846D0 ++:107140004449EAF73FFC0137A4F8540302344745A9 ++:10715000F4DB06EB470303F55473063304E0B6F89B ++:107160005623013723F8022C0233022FF7DD0122C8 ++:1071700039492846EAF72CFC384986F84003284666 ++:10718000EAF732FC012286F84B0335492846EAF734 ++:107190001FFC344986F841032846EAF725FC3249AA ++:1071A00086F84C034FF0FF322846EAF711FC2F49CE ++:1071B00086F849034FF0FF322846EAF709FC2C49CC ++:1071C00086F84A034FF0FF322846EAF701FC2949C6 ++:1071D00086F85C034FF0FF322846EAF7F9FB2649B0 ++:1071E00086F85D032846EAF7CBFB002846D0012449 ++:1071F0002149002286F8BB442846EAF7E3FB1E49F2 ++:1072000086F8BC0422462846EAF7DCFB1A4986F8D1 ++:10721000BD0402222846EAF7D5FB86F8BE042FE01B ++:1072200098870200FF8A02007D860200818C02009E ++:10723000C1890200D3880200028E0200BF8B0200C7 ++:10724000138702005B8B02001D8902005287020037 ++:10725000DF880200778E02009F8C020036880200D1 ++:10726000C3860200028C020041860200B08902003F ++:10727000788B0200028A0200658E020086F8BB0449 ++:10728000FF2299492846EAF7A3FBFF2286F8BF04AC ++:1072900096492846EAF79CFB954986F8C00428469B ++:1072A000EAF7A2FB0022A6F8C20492492846EAF7B0 ++:1072B0008FFB002286F818058F492846EAF788FBDD ++:1072C000C0B286F81A05EB69DB685B6C03F0070354 ++:1072D000052B03D910B1002386F81A3587490022FF ++:1072E0002846EAF775FB864986F81C0500222846E1 ++:1072F000EAF76EFB834986F81D054FF0FF322846FA ++:10730000EAF766FB804986F81E0500222846EAF760 ++:107310005FFB7E4986F895054FF0FF322846EAF775 ++:1073200057FB7B49A6F8200501222846EAF750FBC7 ++:10733000784986F827054FF0FF322846EAF748FBE0 ++:107340007549A6F82A054FF0FF322846EAF740FBB8 ++:107350007249A6F82C0500222846EAF739FB704945 ++:1073600086F83A0500222846EAF732FB6D4986F88E ++:107370003B054FF0FF322846EAF72AFB6A4986F8B8 ++:107380003C052846EAF7FCFA30B128466649EAF798 ++:107390002BFB86F8420503E04FF0FF3386F84235B9 ++:1073A00028466249EAF7ECFA30B128465F49EAF725 ++:1073B0001BFBA6F8440503E04FF0FF33A6F8443565 ++:1073C0005B4928464FF0FF32EAF702FB5949A6F81D ++:1073D00090052846EAF7D4FA30B301245549002233 ++:1073E00086F852452846EAF7EDFA524986F85305E1 ++:1073F00022462846EAF7E6FA4E4986F85405022264 ++:107400002846EAF7DFFA4B4986F855050322284655 ++:10741000EAF7D8FA474986F8560504222846EAF7DB ++:10742000D1FA86F8570501E086F8520542494FF037 ++:10743000FF322846EAF7CCFA404986F858054FF063 ++:10744000FF322846EAF7C4FA3D4986F859054FF05D ++:10745000FF322846EAF7BCFA3A4986F85A05002274 ++:107460002846EAF7B5FA384986F87005002228461A ++:10747000EAF7AEFA032286F8800534492846EAF78F ++:10748000A7FA334986F881052846EAF7ADFA31496B ++:1074900086F882052846EAF7A7FA2F49A6F8840558 ++:1074A0002846EAF7A1FA2D49A6F886052846EAF704 ++:1074B0009BFA2B49A6F888052846EAF795FA294948 ++:1074C000A6F88A052846EAF78FFA2749C6F88C05F8 ++:1074D00000222846EAF77CFA86F89405012000E0AD ++:1074E000002006B0BDE8F081FA8C0200418D020058 ++:1074F0008A860200E58502000C8B0200138A0200D6 ++:10750000638C0200558A0200CB850200AF8702001F ++:10751000B9850200D7860200BC8702009F86020060 ++:10752000C88702001F8B02009B880200358602007C ++:10753000DC8702005286020069890200748C020016 ++:10754000338702001089020019880200F7870200C1 ++:107550004B880200C98B0200398C0200828A02002B ++:10756000C88A0200EF880200918D0200C36970B5DD ++:1075700004460E4698684FF4B961DFF3A9F3C4F8E6 ++:10758000A80000285BD000214FF4B962DAF358F567 ++:10759000E369D4F8A8501B6D13F4803F05D1012294 ++:1075A00041F2140384F81A26E254E369D868E3F739 ++:1075B00049FD0023C4F8F80FEB63224B20462362F9 ++:1075C000214B31466362214BA362214BE362214B85 ++:1075D000A367214BE367214BC4F89030204BC4F8DC ++:1075E0008430204B2363204B6363204BE363204BA9 ++:1075F0006364204B6365204BA365204BC4F88C303B ++:107600001F4BC4F888301F4BE3661F4BC4F89C30F7 ++:107610001E4BC4F8A0301E4BC4F8A430FEF7DAFFAE ++:1076200068B12046ECF7CEF82046FEF73DFF30B1BA ++:107630002046FEF793FF003818BF012000E000202D ++:1076400070BDC0465DA30100A51D010045A001005D ++:107650001175010075730100DD210100317C01000D ++:10766000197C0100896E0100795A0100F96E010050 ++:10767000B95701005D280100612A0100359F010012 ++:10768000851E010071260100D55A0100D154010068 ++:10769000FD9E010010B5014620B103680C22186858 ++:1076A000DFF326F310BDC0462DE9F04105460F4635 ++:1076B00000680C211646DFF30BF308B9044607E017 ++:1076C000044600210C22DAF3BBF425606660A76053 ++:1076D0002046BDE8F081C04610B5044650B10649C9 ++:1076E00022464068FCF330F463682146D86888225B ++:1076F000DFF3FEF210BDC04603E88600F0B5882136 ++:1077000085B005464068DFF3E3F2074608B9044652 ++:107710003BE0002188220446DAF392F42B683D60B6 ++:107720007B60002604212846194A1A4B00960197CF ++:1077300000F0EEF8B042B86021DB174B01960093E1 ++:107740000296039678681549154A3B46FCF3C4F344 ++:10775000A8B91E237B610423FB7302233B74083307 ++:1077600001227B744FF6AF7384F82000FA773A73E6 ++:10777000BA61A0746073A073BB83BA7705E06868D0 ++:1077800039468822DFF3B4F20024204605B0F0BD6C ++:1077900051238500252385008114850050EC0100CC ++:1077A00003E8860070B50468CCB1D4F8F811A56878 ++:1077B00029B1A868E7F364F70023C4F8F831084951 ++:1077C00028682246FCF3C0F3216819B168681C22BE ++:1077D000DFF38EF2686821466269DFF389F270BDDB ++:1077E00068EC01002DE9FF4740F2C45681468A4605 ++:1077F0001046314617469846DFF36AF204460028E1 ++:1078000079D000213246DAF31BF438461C21DFF32D ++:107810005FF20546206030B9384621463246DFF334 ++:1078200067F2284667E000211C22DAF309F4226897 ++:107830004FF0FF33A36100254FF014036661C4F8D5 ++:107840000890E760C4F804809571A4F808324FF0FE ++:107850002803A4F806324FF02D03A4F804324FF0A9 ++:10786000FA03A4F80A320223146084F80C324FF0B1 ++:107870006403A4F83E3284F80D5250461F49224654 ++:107880002B46E7F319F7C4F8F80108B30523C4F849 ++:107890001C323733C4F8283204F51072184BC4F880 ++:1078A0001822C4F8142204F53D72C4F82422C4F846 ++:1078B00020220093134BD9F8000003931249134A76 ++:1078C000234601950295FCF307F308B9206812E0FE ++:1078D000D4F8F81111B15046E7F3D2F6216819B186 ++:1078E00038461C22DFF304F23846214640F2C452E7 ++:1078F000DFF3FEF1002004B0BDE8F087C13C850055 ++:10790000F5378500E9A4010070EC010068EC010086 ++:1079100070B5D0F800451E46A3698E460F2B15465C ++:1079200002D94FF0FF3011E01801E1690133A36182 ++:10793000049B42189360059B5660D3606269455072 ++:10794000D31C734423F003036361104670BDC0462B ++:1079500010B5014640B190F820200368D200D868E5 ++:1079600002F59272DFF3C4F110BDC046C36908226C ++:107970001B692DE9F041073393FBF2F3DFB2FB0003 ++:1079800003F5927605463146C068DFF3A1F108B9E8 ++:10799000044614E0044632460021DAF351F304F1C0 ++:1079A0002403E361FAB204F59273E36003EB82030C ++:1079B00023614FF40373256084F8207063612046CF ++:1079C000BDE8F0817047C0462DE9F04F3B4F89B0CC ++:1079D00038683B49DAF3D0F70128DFF81881DFF87F ++:1079E000189157D0DFF800C1364EDCF800100022A5 ++:1079F0000091354913680968344D354C029131685E ++:107A00003448019304912B6821680393069103681D ++:107A1000314905930B68DFF8D4E007932A4B0260E5 ++:107A20002E481A600A602E4B08F10401D7F800A016 ++:107A3000DEF800B03A60CEF80020CCF800203260CA ++:107A40002260091A013A2B60DAF3EAF7254B9842D3 ++:107A5000FCD11A4B0099C3F800A0234B1960234BAB ++:107A60000021C3F800B00A68214B1A60019A164B36 ++:107A70000A600299039A1960144B04991A60114B19 ++:107A8000059A1960134B06991A60114B079A1960F1 ++:107A9000114B1A6098F81B3089F8003098F81C30A8 ++:107AA00089F8013098F81D3089F8023098F81E30B6 ++:107AB00089F8033009B0BDE8F08FC046ECED010055 ++:107AC000DCEC0100CCA30000D0A30000BCA30000AC ++:107AD000D8A30000D4A30000DCA300000000000035 ++:107AE000DDBAADBBE320BBDEF0ED0100E8ED010047 ++:107AF000C0A30000BE24030018F501002DE9F04FDB ++:107B000091B0FFF761FF684B1B68043B012B03D862 ++:107B1000664B1868FFF756FFFAF7AEFF00210746DD ++:107B2000E3F3C4F338460021E3F37AF328B1036AA0 ++:107B3000002BBCBF4FF0004303620EA90822B86BB4 ++:107B4000DAF30CF5FA6B0B9038460C92E3F77AFAFD ++:107B5000574E00F5424000F5A870B0FBF6F00D90CE ++:107B60003846E3F76FFA04463846E3F76BFA00F558 ++:107B700042483846E3F770FA00F5424A3846E3F7E0 ++:107B80006BFA04F5424408F5A87804F5A874B8FB2C ++:107B9000F6F808FB164804463846E3F75DFA00F5A8 ++:107BA00042453846E2F7E2FF00F542493846E2F73F ++:107BB000DDFF04F5424405F5A87504F5A874B5FB8E ++:107BC000F6F505FB164504463846E2F7CFFF394A7D ++:107BD00000F54240019204F542440B9A00F5A8706A ++:107BE000B0FBF6F00AF5A87A09F5A87904F5A874AF ++:107BF000BAFBF6FAB9FBF6F9029200FB16460C9AAC ++:107C0000DFF8D4B003920D9A2B4B04922B492C4AE7 ++:107C1000B8FBFBF8B5FBFBF5B6FBFBF62948009378 ++:107C2000CDF81480CDF818A00795CDF820900996CE ++:107C3000E7F744FA244840F60D0144F2F432FAF72B ++:107C40009FFE48B1204840F6290144F2F432FAF789 ++:107C500097FE08B1002403E01C4A1D4B1A4C1A6021 ++:107C60003846FDF7C7F944F218334FF6FF729042D9 ++:107C700014BF02461A4640F612011648FAF780FE73 ++:107C8000144B00280CBF194600214CB141B1104BD8 ++:107C900020461B685B689847236920465B689847C5 ++:107CA000384611B0BDE8F08FDCA30000D8A3000077 ++:107CB00040420F00A4C30100ABFF8600E2EC0100CC ++:107CC000E7EC0100BC9D02003CEE010018EE010053 ++:107CD000F826000068EE0100A086010025733A2016 ++:107CE00042726F6164636F6D20534450434D442072 ++:107CF000434443206472697665720A00736470635A ++:107D00006D6463646325640072737369736D6632B6 ++:107D1000673D2564007874616C667265713D256409 ++:107D200000616132673D30782578006277343070C9 ++:107D30006F3D30782578006C6564626825643D305D ++:107D40007825780074737369706F7332673D30788B ++:107D50002578007273736973617632673D2564001C ++:107D60006C65676F66646D3430647570706F3D303C ++:107D70007825780070613168696D61787077723D3F ++:107D80002564006D617870326761303D3078257808 ++:107D9000007061316974737369743D2564006D61AD ++:107DA0006E6669643D307825780073756276656E1D ++:107DB0006469643D30782578002004D0023643FFA2 ++:107DC000FF626F617264747970653D307825780068 ++:107DD0006D6373256467706F25643D307825780086 ++:107DE0006D616E663D2573006D61787035676C61FD ++:107DF000303D30782578006D61787035676C613181 ++:107E00003D30782578006F66646D35676C706F3D26 ++:107E1000307825780072737369736D6335673D251B ++:107E20006400626F617264666C616773323D3078C2 ++:107E3000257800747269736F32673D307825780059 ++:107E40007064657472616E676532673D307825785D ++:107E5000006D63736277323035676C706F3D3078D8 ++:107E600025780000006D637362773230756C35677A ++:107E70006C706F3D30782578006D637362773430B5 ++:107E800035676C706F3D3078257800000070613187 ++:107E90006C6F6D61787077723D2564006D617870EC ++:107EA000326761313D30782578007278706F3567C0 ++:107EB0003D2564006D63733332706F3D30782578F3 ++:107EC0000073756264657669643D30782578006971 ++:107ED0007474356761303D30782578006974743585 ++:107EE0006761313D30782578007061316D6178705F ++:107EF00077723D256400626F6172647265763D3011 ++:107F0000782578006D6373627732303267706F3D29 ++:107F1000307825780000006D637362773230756CBD ++:107F20003267706F3D30782578006D637362773407 ++:107F3000303267706F3D307825780000006D6373D4 ++:107F40006277323035676D706F3D3078257800008C ++:107F5000006D637362773230756C35676D706F3D9D ++:107F600030782578006D63736277343035676D70D3 ++:107F70006F3D3078257800000073726F6D72657602 ++:107F80003D2564007770736C65643D256400706105 ++:107F9000316C6F62303D2564007061316C6F62310D ++:107FA0003D2564007061316C6F62323D2564007064 ++:107FB0006125646725637725646125643D307825F4 ++:107FC000780070613062303D25640070613062314C ++:107FD0003D25640070613062323D25640072737328 ++:107FE00069736D6332673D25640074726935676833 ++:107FF0003D25640075736266733D25640063636BA1 ++:10800000706F3D307825780074726935676C3D2556 ++:1080100064006F66646D356768706F3D30782578F1 ++:1080200000616725643D307825780065787470615B ++:108030006761696E35673D307825780070726F64CE ++:108040007563746E616D653D257300636464706F64 ++:108050003D30782578006C65676F66646D627732B5 ++:108060003035676C706F3D307825780000006C65A6 ++:10807000676F66646D62773230756C35676C706FF0 ++:108080003D30782578006C65676F66646D62773285 ++:108090003035676D706F3D307825780000006C6575 ++:1080A000676F66646D62773230756C35676D706FBF ++:1080B0003D30782578006C65676F66646D62773255 ++:1080C00030356768706F3D307825780000006C654A ++:1080D000676F66646D62773230756C356768706F94 ++:1080E0003D30782578007278706F32673D256400E6 ++:1080F0007278636861696E3D3078257800697474C0 ++:10810000326761303D307825780069747432676178 ++:10811000313D3078257800616E74737769746368D7 ++:108120003D30782578007478636861696E3D3078F9 ++:1081300025780070726F6469643D3078257800702E ++:1081400061306974737369743D25640063636B64A3 ++:10815000696766696C74747970653D25640063684D ++:1081600069707265763D2564006F66646D35677071 ++:108170006F3D30782578006C656464633D30782508 ++:10818000303478006D61787035676861303D3078E3 ++:108190002578006D61787035676861313D307825EC ++:1081A000780070613162303D256400706131623168 ++:1081B0003D25640070613162323D25640062776460 ++:1081C0007570706F3D30782578006D617870356717 ++:1081D00061303D30782578006D61787035676131A8 ++:1081E0003D3078257800616E74737763746C356701 ++:1081F0003D30782578006D63732564672563706F63 ++:1082000025643D30782578006D63736277323035B0 ++:108210006768706F3D307825780000006D63736289 ++:10822000773230756C356768706F3D30782578002F ++:108230006D637362773430356768706F3D307825D1 ++:108240007800000074726935673D2564006F706FB7 ++:108250003D25640076656E6469643D30782578005C ++:108260006C65676F66646D627732303267706F3D40 ++:108270003078257800006C65676F66646D627732D0 ++:1082800030756C3267706F3D307825787061306D75 ++:1082900061787077723D2564007061316869623081 ++:1082A0003D256400706131686962313D256400706C ++:1082B0006131686962323D256400637573746F6D66 ++:1082C00076617225643D3078257800726567726545 ++:1082D000763D3078257800626F617264666C616704 ++:1082E000733D307825780062786132673D256400FF ++:1082F0006F656D3D25303278253032782530327803 ++:108300002530327825303278253032782530327871 ++:10831000253032780064657669643D3078257800D0 ++:1083200070612564677725646125643D3078257820 ++:108330000072737369736D6635673D2564006F66FF ++:10834000646D3267706F3D30782578006161356704 ++:108350003D30782578007770736770696F3D2564CC ++:108360000062786135673D25640075736265706EE3 ++:10837000756D3D307825780074737369706F73354F ++:10838000673D3078257800616E74737763746C3262 ++:10839000673D30782578007273736973617635674D ++:1083A0003D2564006F66646D706F3D307825780000 ++:1083B00074726932673D25640073746263706F3D47 ++:1083C000307825780063636F64653D307830006DE8 ++:1083D0006163616464723D25730063636F64653D2E ++:1083E000256325630063633D25640063636B326727 ++:1083F000706F3D30782578006363746C3D3078256C ++:10840000780072656777696E646F77737A3D25646B ++:108410000065787470616761696E32673D307825F8 ++:108420007800626F6172646E756D3D2564007472D0 ++:1084300069736F35673D307825780063636B6277C9 ++:1084400032303267706F3D3078257800000063630A ++:108450006B62773230756C3267706F3D307825789B ++:10846000007064657472616E676535673D307825AC ++:108470007800000080000000FF0000000C000000F9 ++:108480000000000000040000FF0000000C000000DD ++:108490000000000000000800FF0000000E000000C7 ++:1084A00000000000020000000100040003000000C2 ++:1084B000010002000A00000002006000DC0500006C ++:1084C00008071700776C25643A2042726F61646375 ++:1084D0006F6D2042434D2564203830322E313120DB ++:1084E000576972656C65737320436F6E74726F6C3D ++:1084F0006C65722025730A00747870777262636B02 ++:108500006F660032675F6367610072737369636FE0 ++:1085100072726E6F726D0074656D707468726573DF ++:10852000680074656D70735F6879737465726573E4 ++:1085300069730072737369636F7272617474656ECC ++:108540000035675F63676100747373696C696D758B ++:10855000636F6400696E746572666572656E6365EB ++:10856000006D63733267706F30006D6373326770D4 ++:108570006F3100747373696F66667365746D696ECD ++:1085800035676C00747373696F66667365746D69C3 ++:108590006E35676D0074656D7073656E73655F73BE ++:1085A0006C6F7065006D656173706F7765720072D6 ++:1085B000737369736D66326700706C6C646F75629B ++:1085C0006C65725F6D6F646532670069716C6F73A3 ++:1085D00074316F6666326700726672656730333376 ++:1085E0005F63636B00706C6C646F75626C65725F67 ++:1085F000656E61626C653267006F70656E6C706786 ++:1086000061696E69647861313430006578747061D5 ++:108610006761696E35670065787470616761696E5E ++:108620003267006F70656E6C706761696E6964783F ++:108630006131343900747869716C6F7061673267C9 ++:10864000006E6F6973655F63616C5F7265665F3250 ++:1086500067006C6F67656E5F6D6F64650070616366 ++:10866000616C69647832670074656D705F61646421 ++:1086700000706163616C61746832673100646163CA ++:108680006763326700706D696E00706163616C7062 ++:10869000756C7365776964746800706D61780074D7 ++:1086A000786761696E74626C006F70656E6C70746F ++:1086B000656D70636F727200747373696D61786E4B ++:1086C0007074006E6F6973655F63616C5F656E6186 ++:1086D000626C655F356700706163616C70777232E0 ++:1086E0006700747869716C6F746600706163616CA7 ++:1086F00069647835676C6F3100706163616C6174B7 ++:108700006835676869006F70656E6C707077726C41 ++:10871000696D006E6F6973655F63616C5F6462674A ++:10872000006F70656E6C706761696E696478613145 ++:10873000353300706163616C69647835676869001E ++:108740006F70656E6C706761696E696478613135F0 ++:1087500037006E6F6973655F63616C5F757064612C ++:108760007465006F70656E6C706761696E696478BE ++:1087700061313635006F66646D64696766696C7473 ++:10878000747970653567007061676332670076627F ++:1087900061745F6D756C740073776374726C6D6176 ++:1087A000705F326700706163616C616C696D006954 ++:1087B000716C6F63616C70777232670070616361B6 ++:1087C0006C7077723267310074786761696E7462B9 ++:1087D0006C35670076626174736D63006164637207 ++:1087E0006673657132670076626174736D660076D8 ++:1087F0006261747361760072786761696E62616349 ++:108800006B6F666676616C006F70656E6C70676129 ++:10881000696E6964786225640072786761696E7454 ++:10882000626C776C62676100706163616C6174682F ++:108830003567686931006E6F6973655F63616C5F8E ++:10884000706F5F626961735F32670072667265673D ++:10885000303838006F70656E6C706761696E69647E ++:1088600078613136310064796E7077726C696D654C ++:108870006E00706163616C6964783567310074659E ++:108880006D70636F727278006461637261746532D7 ++:10889000670070613062325F6C6F00747869716C70 ++:1088A0006F7061707532670074656D7073656E739B ++:1088B000655F6F7074696F6E00706163616C617485 ++:1088C0006835676C6F3100706163616C6964783220 ++:1088D0006731007478616C70666279703267006E1F ++:1088E0006F6973655F63616C5F706F5F326700759E ++:1088F0006E6D6F645F727373695F6F6666736574C4 ++:10890000006F70656E6C70766F6C74636F7272005E ++:1089100072786761696E74626C313030006E6F69B5 ++:1089200073655F63616C5F6E665F737562737472AB ++:108930006163745F76616C007473736974786465E5 ++:108940006C61790063636B3267706F0063636B50B7 ++:108950007772496478436F72720063636B6469670E ++:1089600066696C7474797065006C6F696461636DBD ++:108970006F6465356700706163616C617468356749 ++:108980000074656D705F7100727373697361763224 ++:10899000670070613062315F6C6F00706163616CA1 ++:1089A000617468356731006D6178703267613000DD ++:1089B0006E6F6973655F63616C5F7265665F356773 ++:1089C000006F66646D616E616C6F6766696C74627E ++:1089D00077326700706163616C6174683267007040 ++:1089E000613062300070613062310070613062323B ++:1089F000006F70656E6C706761696E696478613371 ++:108A000036006E6F6973655F63616C5F61646A5F96 ++:108A100035670069716C6F63616C69647832676F88 ++:108A2000666673006F70656E6C706761696E69640D ++:108A300078613130300072617774656D7073656E86 ++:108A40007365006F70656E6C706761696E696478DC ++:108A5000613130340069716C6F63616C69647832C4 ++:108A600067006F70656E6C707077726374726C0003 ++:108A70006F70656E6C706761696E696478613130C2 ++:108A8000380072786761696E74656D70636F7272B9 ++:108A900035676D0074785F746F6E655F706F7765B2 ++:108AA000725F696E646578006F70656E6C70726578 ++:108AB000667077720072737369736D6332670070EA ++:108AC000613062305F6C6F0072786761696E7465E7 ++:108AD0006D70636F727235676C00706163616C6991 ++:108AE000647835673174680070616763356700705A ++:108AF0006163616C69647835676C6F3174680073A9 ++:108B0000776374726C6D61705F3567007370757236 ++:108B100061766F69645F656E61626C653267006C77 ++:108B20006F63636D6F646531006F70656E6C706745 ++:108B300061696E696478613430006F70656E6C7065 ++:108B40006761696E69647861343400726672656762 ++:108B500030333300706172667073006E6F697365D5 ++:108B60005F63616C5F686967685F6761696E007207 ++:108B700066726567303338006E6F6973655F636175 ++:108B80006C5F61646A5F326700706163616C696425 ++:108B9000783567686931006D656173706F776572EC ++:108BA00031006D656173706F77657232006F70654B ++:108BB0006E6C706761696E6964786131313600622C ++:108BC0007068797363616C650072786761696E744F ++:108BD000656D70636F727232670061613267006F3A ++:108BE00066646D64696766696C7474797065007435 ++:108BF000656D705F6D756C74006F66646D32677063 ++:108C00006F006E6F6973655F63616C5F706F5F6249 ++:108C10006961735F356700766261745F71007061CE ++:108C200063616C61746835676C6F00706163616C5F ++:108C300069647832673174680072786761696E744C ++:108C4000656D70636F72723567680063636B507730 ++:108C5000724F6666736574007478707772696E64BB ++:108C600065780069716C6F63616C69647835676FF2 ++:108C700066667300706163616C69647835676C6FF8 ++:108C800000676D6763326700706163616C69647867 ++:108C900035676869317468007278706F3267006E8A ++:108CA0006F6973655F63616C5F656E61626C655F60 ++:108CB0003267006F70656E6C706761696E696478A9 ++:108CC000613532006F70656E6C706761696E6964E2 ++:108CD00078613536006F70656E6C706761696E69BA ++:108CE00064786131313200706163616C6964783538 ++:108CF000670074656D7073617600747269736F32AA ++:108D00006700766261745F616464006F70656E6CA9 ++:108D1000706761696E69647861313230006F7065C7 ++:108D20006E6C706761696E69647861313234006FAE ++:108D300070656E6C706761696E6964786131323834 ++:108D40000074726964783267006F66646D64696785 ++:108D500066696C74747970653267006F70656E6CEB ++:108D6000706761696E69647861343800696E69742E ++:108D70007869647832670068775F697163616C5FF6 ++:108D8000656E00697163616C5F7377705F646973AE ++:108D9000006D75785F6761696E5F7461626C650014 ++:108DA000747373696F66667365746D61783567682F ++:108DB00000747373696F66667365746D6178356787 ++:108DC0006C00747373696F66667365746D61783572 ++:108DD000676D0074656D70736D630074656D70739D ++:108DE0006D6600747373696F66667365746D617820 ++:108DF000006F70656E6C706761696E69647861366A ++:108E000030007478616C706662797032675F63639A ++:108E10006B006F70656E6C706761696E6964786114 ++:108E2000363400667265716F66667365745F636F72 ++:108E3000727200747373696F66667365746D696EC0 ++:108E4000006F70656E6C706761696E69647861311E ++:108E50003332006F70656E6C706761696E6964783B ++:108E600061313336007874616C6D6F6465007473C2 ++:108E7000736974696D65006E6F6973655F63616CBA ++:108E80005F706F5F356700747373696F66667365D3 ++:108E9000746D696E356768008C9302006000000095 ++:108EA000120000000000000020000000FC92020000 ++:108EB000260000000E00000000000000100000006E ++:108EC00088980200980000000D00000000000000DB ++:108ED0002000000048930200440000001100000040 ++:108EE0000000000008000000489D02001000000083 ++:108EF000100000000000000008000000000000005A ++:108F00004000000080000000C000000001000000E0 ++:108F10000500000002000000060000000A0000003A ++:108F20004A0000008A000000CA0000000A01000098 ++:108F30004A0100008A0100008A0500008A09000039 ++:108F40008A0D00008A1100008A5100008A910000F9 ++:108F50008AD100008A1101008A5101008A91010022 ++:108F6000890000008AD101008A110200000000007F ++:108F700000000000000000000000000000000000F1 ++:108F800000000000000000000000000000000000E1 ++:108F900000000000000000000000000000000000D1 ++:108FA00000000000000000000000000000000000C1 ++:108FB00000000000000000000000000000000000B1 ++:108FC00000000000000000000000000000000000A1 ++:108FD0000000000000000000000000000000000091 ++:108FE0000000000000000000000000000000000081 ++:108FF0000000000000000000000000000000000071 ++:109000000000000000000000000000000000000060 ++:109010000000000000000000000000000000000050 ++:109020000000000000000000000000000000000040 ++:109030000000000000000000000000000000000030 ++:109040000000000000000000000000000000000020 ++:109050000000000000000000000000000000000010 ++:109060000000000000000000000000000000000000 ++:1090700000000000000000000000000003001300DA ++:10908000410300130040030012004103001200409E ++:1090900003001100410300110040030010004103D0 ++:1090A00000100040030010003E030010003C0300CD ++:1090B00010003A03000F003D03000F003B03000EB9 ++:1090C000003D03000E003C03000E003A03000D00BB ++:1090D0003C03000D003B03000C003E03000C003C71 ++:1090E00003000C003A03000B003E03000B003C039E ++:1090F000000B003B03000B003903000A003D030096 ++:109100000A003B03000A0039030009003E0300097E ++:10911000003C030009003A0300090039030008007D ++:109120003E030008003C030008003A030008003931 ++:109130000300080037030007003D030007003C035D ++:109140000007003A03000700380300070037030058 ++:1091500006003E030006003C030006003A0300063A ++:10916000003903000600370300060036030006003E ++:1091700034030005003D030005003B0300050039F2 ++:109180000300050038030005003603000500350321 ++:1091900000050033030004003E030004003C03000C ++:1091A00004003A03000400390300040037030004FC ++:1091B00000360300040034030004003303000400FD ++:1091C000310300040030030004002E030003003CC0 ++:1091D000030003003A0300030039030003003703D0 ++:1091E00000030036030003003403000300330300D0 ++:1091F0000300310300030030030003002E030003CB ++:10920000002D030003002C030003002B03000300C8 ++:1092100029030002003D030002003B030002003965 ++:109220000300020038030002003603000200350389 ++:10923000000200330300020032030002003003008A ++:1092400002002F030002002E030002002C03000284 ++:10925000002B030002002A03000200290300020081 ++:109260002703000200260300020025030002002459 ++:109270000300020023030002002203000200210376 ++:1092800000020020030001003F030001003D030035 ++:1092900001003B0300010039030001003803000115 ++:1092A0000036030001003503000100330300010014 ++:1092B000320300010030030001002F030001002EE3 ++:1092C000030001002C030001002B030001002A030E ++:1092D000000100290300010027030001002603000C ++:1092E0000100250300010024030001002303000105 ++:1092F00000220300010021030001002000040004FB ++:10930000000400040004000400040004000400043D ++:109310000004010480048204830484040004000423 ++:10932000000400040004000400040004000401041C ++:1093300080048204830484048504860405050605EC ++:109340000705080509050A05090C12181818090C63 ++:109350001218181800000C076F7A060C0F7B7E019C ++:1093600005080B0E110000000000000000000306BD ++:10937000090C0F12000000000000000000000306AE ++:10938000090C0000000000000000000000000000C8 ++:10939000040000004000000080000000C000000049 ++:1093A00001000000050000004500000085000000ED ++:1093B000C500000005010000450100008501000016 ++:1093C0008505000085090000850D00008909000061 ++:1093D000890D000089110000895100008991000069 ++:1093E00089D1000089110100854D0000858D0000A4 ++:1093F00085CD000089510100899101000000000025 ++:10940000000000000000000000000000000000005C ++:10941000000000000000000000000000000000004C ++:10942000000000000000000000000000000000003C ++:10943000000000000000000000000000000000002C ++:10944000000000000000000000000000000000001C ++:10945000000000000000000000000000000000000C ++:1094600000000000000000000000000000000000FC ++:1094700000000000000000000000000000000000EC ++:1094800000000000000000000000000000000000DC ++:1094900000000000000000000000000000000000CC ++:1094A00000000000000000000000000000000000BC ++:1094B00000000000000000000000000000000000AC ++:1094C000000000000000000000000000000000009C ++:1094D000000000000000000000000000000000008C ++:1094E000000000000000000000000000000000007C ++:1094F000000000000000000000000000000000006C ++:10950000000000000000000000000000800080005B ++:10951000800080008000800080008000800081004A ++:109520008200830084008500040105018000800022 ++:109530008000800080008000800081008200830025 ++:109540008400850004010501060107011901870156 ++:10955000880189018A018B0107001F004807001F4D ++:10956000004607001F004407001E004307001D00BF ++:109570004407001C004407001B004507001A004672 ++:1095800007001900460700180047070017004807A2 ++:10959000001700460700160047070015004807009F ++:1095A0001500460700150044070015004207001586 ++:1095B0000040070015003F0700140040070013009B ++:1095C000410700130040070012004107001200404D ++:1095D000070011004107001100400700100041077B ++:1095E00000100040070010003E070010003C07007C ++:1095F00010003A07000F003D07000F003B07000E68 ++:10960000003D07000E003C07000E003A07000D0069 ++:109610003C07000D003B07000C003E07000C003C1F ++:1096200007000C003A07000B003E07000B003C0748 ++:10963000000B003B07000B003907000A003D070044 ++:109640000A003B07000A0039070009003E0700092D ++:10965000003C070009003A0700090039070008002C ++:109660003E070008003C070008003A0700080039E0 ++:109670000700080037070007003D070007003C0708 ++:109680000007003A07000700380700070037070007 ++:1096900006003E070006003C070006003A070006E9 ++:1096A00000390700060037070006003607000600ED ++:1096B00034070005003D070005003B0700050039A1 ++:1096C00007000500380700050036070005003507CC ++:1096D00000050033070004003E070004003C0700BB ++:1096E00004003A07000400390700040037070004AB ++:1096F00000360700040034070004003307000400AC ++:10970000310700040030070004002E070003003C6E ++:10971000070003003A07000300390700030037077A ++:10972000000300360700030034070003003307007E ++:109730000300310700030030070003002E07000379 ++:10974000002D070003002C070003002B0700030077 ++:1097500029070002003D070002003B070002003914 ++:109760000700020038070002003607000200350734 ++:109770000002003307000200320700020030070039 ++:1097800002002F070002002E070002002C07000233 ++:10979000002B070002002A07000200290700020030 ++:1097A0002707000200260700020025070002002408 ++:1097B0000700020023070002002207000200210721 ++:1097C00000020020070001003F070001003D0700E4 ++:1097D00001003B0700010039090C12181818090C88 ++:1097E0001218181800000C076F7A060C0F7B7E0108 ++:1097F00005080B0E11000000000000000000030629 ++:10980000090C0F1200000000000000000000030619 ++:10981000090C00000000000000000000070010001C ++:109820003907001000380700100036070010003418 ++:109830000700100033070010003107001000300748 ++:109840000010002F070010002D070010002C07004B ++:1098500010002B070010002A070010002807001036 ++:109860000027070010002607001000250700100041 ++:109870002407001000230700100022070010002119 ++:109880000700100020000000000000004000000061 ++:109890000000000040000000000000004000000048 ++:1098A0000000000040000000000000004000000038 ++:1098B0000000000040000000000000004000000028 ++:1098C0000000000040000000000000004000000018 ++:1098D0000000000040000000000000004000000008 ++:1098E00000000010400000000000000048000000E0 ++:1098F0000000002048000000000000304800000088 ++:109900000000004048000000000000504800000037 ++:1099100000000060480000000000005050000000FF ++:1099200000000060500000000000007050000000C7 ++:109930000000008050000000000000905000000077 ++:10994000000000A050000000000000B05000000027 ++:10995000000000C050000000000000D050000000D7 ++:10996000000000E050000000000000F05000000087 ++:10997000000000E058000000000000005900000056 ++:1099800000000010590000000000002059000000F5 ++:1099900000000030590000000000004059000000A5 ++:1099A0000000005059000000000000605900000055 ++:1099B0000000000040000000000000004000000027 ++:1099C0000000000040000000000000004000000017 ++:1099D0000000000040000000000000004000000007 ++:1099E00000000000400000000000000040000000F7 ++:1099F00000000000400000000000001040000000D7 ++:109A000000000000480000000000002048000000A6 ++:109A10000000003048000000000000404800000046 ++:109A200000000050480000000000006048000000F6 ++:109A300000000050500000000000006050000000D6 ++:109A40000000007050000000000000805000000086 ++:109A50000000009050000000000000A05000000036 ++:109A6000000000B050000000000000C050000000E6 ++:109A7000000000D050000000000000E05000000096 ++:109A8000000000F0500000000000007051000000D5 ++:109A90000000008051000000000000905100000014 ++:109AA00000000020590000000000003059000000B4 ++:109AB0000000004059000000000000505900000064 ++:109AC0000000006059000000000000A059000000E4 ++:109AD000000000B05900000000000000000000007D ++:109AE000000000000000000000000000080000006E ++:109AF0000000000008000000000000000800000056 ++:109B00000000000008000000000000000800000045 ++:109B10000000000008000000000000000800000035 ++:109B20000000000008000000000000000800000025 ++:109B300000000010080000000000002008000000E5 ++:109B40000000003008000000000000400800000095 ++:109B5000000000500800000000000040100000005D ++:109B60000000005010000000000000601000000025 ++:109B700000000070100000000000008010000000D5 ++:109B800000000070180000000000008018000000B5 ++:109B90000000009018000000000000A01800000065 ++:109BA000000000B018000000000000C01800000015 ++:109BB000000000D018000000000000E018000000C5 ++:109BC000000000F018000000000000001900000074 ++:109BD0000000001019000000000000201900000023 ++:109BE00000000030190000000000004019000000D3 ++:109BF0000000005019000000000000601900000083 ++:109C00000000007019000000000000801900000032 ++:109C10000000000008000000000000000800000034 ++:109C20000000000008000000000000000800000024 ++:109C30000000000008000000000000000800000014 ++:109C400000000000080000000000001008000000F4 ++:109C500000000020080000000000003008000000A4 ++:109C60000000004008000000000000500800000054 ++:109C70000000004010000000000000501000000034 ++:109C800000000060100000000000007010000000E4 ++:109C9000000000901100000000000070180000009B ++:109CA0000000008018000000000000901800000074 ++:109CB000000000A018000000000000B01800000024 ++:109CC000000000C018000000000000D018000000D4 ++:109CD000000000E018000000000000F01800000084 ++:109CE0000000000019000000000000101900000032 ++:109CF00000000020190000000000003019000000E2 ++:109D00000000004019000000000000501900000091 ++:109D10000000006019000000000000701900000041 ++:109D20000000008019000000000000A019000000E1 ++:109D3000000000B01900000000000000000000005A ++:109D400000000000000000005F36291F5F36291F59 ++:109D50005F36291F5F36291FFC8E0200600000005D ++:109D60001200000000000000200000000C9502001E ++:109D7000260000000E00000000000000100000009F ++:109D8000E89A0200980000000D00000000000000AA ++:109D900020000000D89702004400000011000000DD ++:109DA0000000000008000000489D020010000000B4 ++:109DB0001000000000000000080000000A52544596 ++:109DC000202825732D2573257325732920257320BD ++:109DD0006F6E2042434D257320722564204020255C ++:109DE000642E25642F25642E25642F25642E25647A ++:109DF0004D487A0A000000002DE9FF4106460D4655 ++:109E00000846FC2117469846DCF362F7044608B979 ++:109E10001E302DE00021FC22D8F312F10A9B04F140 ++:109E2000640204F1680100930192029130462946D0 ++:109E30003A464346FBF72EFB206608B90B2017E095 ++:109E400040F612010022E1F3D9F100210A46E06652 ++:109E50002560206EE0F3F6F72046F7F769FF206EE5 ++:109E6000FBF7DAF928462146FC22DCF341F7002013 ++:109E700004B0BDE8F081C0464286000001BC60032A ++:109E800000104E03BFDE02F00BF1035B5E02F00038 ++:109E90000401BC601300104300015E02F0000000EA ++:109EA000025E02F0117700025E02F0118C020200E5 ++:109EB000BF00008302045EFF00000C006B44655786 ++:109EC000800C01846002F7F7BF01BC6003000AAE9A ++:109ED00000025E02F00F000202DEFF000011006BC4 ++:109EE00044655620110182E002F7F7BF03BFDE028E ++:109EF000F005C100682B6F0000160280DEFF000035 ++:109F000083006B44655B60830184E006F577AB00FA ++:109F1000025E02F01126020480C700001802818050 ++:109F2000C700001A01806002F7F7BF01BC600300A0 ++:109F30000AE200902C0300D7A200E02BFEF457A306 ++:109F4000006D446AF4601E00B02BF7000AF8018728 ++:109F50006002F7F7BF00682BDF00002500E94465C9 ++:109F60005EF7A300E8C4695F77A20068DE8B00009B ++:109F700025006DDE8D5F002501876006F7F7BF02C3 ++:109F800007DEFF00002A00E844655B37A2006D5E33 ++:109F9000895B002A0187E002F7F7BF01BC6003007C ++:109FA0000AD900682B0700003500E844655837A13E ++:109FB000006DDE8557403100682B4300003500E816 ++:109FC00044655A17A1006DDE8557403303BFDE029A ++:109FD000F0003501BC6003000AC201BC6003000A46 ++:109FE000C101BC6003000AD001BC6003000AC802C2 ++:109FF00002DEB30000380200420300003800025EB7 ++:10A0000002F00B1902845EB30000830068AB0F00FE ++:10A0100000830283DEB700003C020180C7000056C7 ++:10A0200000B02ACB0017A202802BF300004300B03F ++:10A030002B230017A1006DDE855CE07700685E874A ++:10A0400000004300682C0700004300B02C070017F5 ++:10A05000A200682B0B00004800E844655857A10097 ++:10A060006DDE86F4407700E05E8555F7A1006DDE79 ++:10A0700086F440770202DEBB00005600682ABB006F ++:10A08000005600E8446556D7A100E02ABB0157A25C ++:10A09000006EDE86F440500182E002F5D7AE01BCCE ++:10A0A0006003000AAE03BFDE02F0005600E82ABAE1 ++:10A0B000F437A100902ABB0037A2006E2ABEF440FC ++:10A0C0005400B02ABF0017A20069DE86F440560390 ++:10A0D000BFDE02F000770283DEB700006F028881E6 ++:10A0E000AB00006D02035EB7000083020480C7006E ++:10A0F000005B02005EFF00006D028080BF00006D0B ++:10A1000000682B4300006102802BF300006100B067 ++:10A110002B4B0017BB006E2B22F7608303BFDE02C0 ++:10A12000F0006D0204DEB700006400682B170860C1 ++:10A130008303BFDE02F0006D028400C700006602E8 ++:10A140008600C700006800682B0B00006D02812CA0 ++:10A150004700006D00E844655737A1006DDE855863 ++:10A16000006D006CC46557608300B04467000ABB93 ++:10A1700002845EB700008300025E02F0114303BF59 ++:10A18000DE02F0008301BC63FF1FF7A10068458673 ++:10A19000F4206D0203C57300007702845EB70000EF ++:10A1A00077020100C7000083006B4465578083007D ++:10A1B00020E3FE1460830282DEBB000083028881FC ++:10A1C000AB0000830282DEB3000083028080BF0008 ++:10A1D00000830284DEAF00008302825EBB00008346 ++:10A1E00003A0DE02F0007F0200420300007F0002B5 ++:10A1F0005E02F00B1901836002F5B7AD0184E00641 ++:10A20000F577AB01BC6003000AC300B04467000AE5 ++:10A21000C4018060020D906C03595E02F00085035A ++:10A22000D85E02F0008603D8DE02F0008701BC6130 ++:10A230008300112900B0007B00112B01BC630300D7 ++:10A24000112303125E02F00A9303975E02F00B2AB9 ++:10A25000020181B300009A0285C52300009A02879B ++:10A2600081B300009303A3DE02F0009A03A0DE0294 ++:10A27000F0009A00025E02F00B190187E0040D80E5 ++:10A280006C00E044640DB7BD006B4466F7A0940118 ++:10A29000BC600301978001BC600300378101BC6092 ++:10A2A0006B00508A01BC600306379203BFDE02F0E8 ++:10A2B00002D503D05E02F0030F03D0DE02F0051ECC ++:10A2C00003D5DE02F00A4D03915E02F00595039678 ++:10A2D000DE02F00A480288C1730000BB03C45E02BC ++:10A2E000F0070803C75E02F0073703DCDE02F01157 ++:10A2F000CC03AA5E02F0077A0386DE02F00A8B0224 ++:10A3000087C037000A8B03835E02F008BC0391DE2E ++:10A3100002F0061703C2DE02F00AEF00025E02F04E ++:10A320000EFF00025E02F0117703D4DE02F006A1F8 ++:10A3300003A3DE02F0000200025E02F00E2E03A272 ++:10A340005E02F000B803565E02F000B501866006BA ++:10A35000091048031F5E02F000B5006A5E2300008A ++:10A36000B400B0002700178800E85E230037880398 ++:10A37000A65E02F0012200025E02F00EC700286015 ++:10A380000E08E14303C4DE02F00B610020C20300AB ++:10A39000215403BFDE02F001A003815E02F000BD84 ++:10A3A0000300DE02F000A00188E0020B905C03BF16 ++:10A3B000DE02F0030C028740630000BF0282C10787 ++:10A3C0000000C001866006F4301802864063000079 ++:10A3D000C200B05E870017A10002DE02F00000029A ++:10A3E0008740630000C500B05E8B0010190186E055 ++:10A3F00006F430180281DEAF0000CA0286C0630096 ++:10A4000000C900B05E870017A10002DE02F0000064 ++:10A4100001BC60030280060280DE070000D601DA7C ++:10A420006002F0178002085E070000E601BC6003CE ++:10A430001E17A100E05E02F4306501BC60031C172A ++:10A44000A100E05E02F4306401BC60030028180340 ++:10A45000BFDE02F000EC01105E030017A100885E71 ++:10A46000870037A200E05E86F457A100E0015AF4AD ++:10A470003063028600C30000DF00B0560B0010629C ++:10A4800000B0540300106201BC600300281803BF31 ++:10A49000DE02F000EE00B0418F0010620109DE0321 ++:10A4A0000017A100885E870057A100E05E85059730 ++:10A4B000A100E05E8703C00601BC600300481803EA ++:10A4C000BFDE02F000EE01BC60070217A100E05EF3 ++:10A4D00002F4306501BC60070017A100E05E02F4E1 ++:10A4E000306401BC600318000601BC60030008185A ++:10A4F00000B05A0300106200B05803001063010559 ++:10A5000001430017A10088001AF420060002DE02B1 ++:10A51000F0000001BC600306379201BC63FF1FF02E ++:10A52000C301BC60031890E301BC63FF1FF0C501C9 ++:10A53000BC63FF1FF0C601BC63FF1FF0C700B02C57 ++:10A540005B0010E500B02C5F0010E600B02C63004B ++:10A5500010E70280AC4700010401BC60030010104A ++:10A5600000B0404300180000B040470010E501BCB7 ++:10A57000600300301000B0404300180000B04047B6 ++:10A580000010E601BC600300501000B0404300180A ++:10A590000000B040470010E701BC63FF1FF0C4009B ++:10A5A00002DE02F0000000E840330097A100B04056 ++:10A5B0000B0017A3006D5E86F4610B00905E8F00A8 ++:10A5C00037A303BFDE02F0010C00905E870037A3C3 ++:10A5D00001BC601F1417A100E05E8EF437A301F0E8 ++:10A5E00041970017A1006DDE86F461200287C197B4 ++:10A5F00000011401385A030017A1013C5A03001747 ++:10A60000A203BFDE02F00116013C5A030017A101AC ++:10A61000385A070017A200685E86F4811B00D85ED6 ++:10A620008B0037A200E14196F4506500E1C197002C ++:10A63000306503BFDE02F0010E00D85E8B0037A24A ++:10A6400000E14196F457A100E1DE870037A101F057 ++:10A650005E870017A1006EDE86F4612101BC63FFF6 ++:10A660001FF7A40002DE02F000000020E38E0900C4 ++:10A6700002031EDE02F00127039F5E02F0012700A5 ++:10A68000025E02F0014A03BFDE02F000020208414E ++:10A690001F00012501816005620B1000025E02F0BF ++:10A6A0000B1900B000AB00108600B0016300108AE7 ++:10A6B00000025E02F00D0001BC600304179200B0BE ++:10A6C000003B00111D0190600609104803A1DE0245 ++:10A6D000F0013D0181E00609104801BC60030090D3 ++:10A6E0004201BC600300112D039EDE02F001400117 ++:10A6F000846002F2979400B0451700178F00B05E97 ++:10A70000170017900200441F00013B0185600209F9 ++:10A7100010480181600700104701F0DE0F0037A1EB ++:10A7200000A044B6F43145039EDE02F0014001BCB6 ++:10A73000613712B08003BFDE02F0000200A044B413 ++:10A740002A314501BC612712708003BFDE02F00090 ++:10A75000020020E082090002010CDE530017A10173 ++:10A76000885E8700104701BC600300504201084129 ++:10A770001F0017A1018CDE86F2979403BFDE02F062 ++:10A78000000201BC600300904200E85E23003788AD ++:10A790000069DE2300014E00E800270037880186AB ++:10A7A000600209104801856006F5B7AD0088009B7E ++:10A7B00000D1260090009B01512801BC63030011C9 ++:10A7C000240002DE02F000000020E07E090002000A ++:10A7D000025E02F00ED10283C21F0000020202805C ++:10A7E000F300015E00B044670017A1017C5E862380 ++:10A7F00057A302835EFF00015D00E000FAF46830B9 ++:10A8000001836006F7F7BF006BDE8D06016202066A ++:10A81000D00300016600E950862337A100E8D08A02 ++:10A820002357A20069DE8B00016600025E02F00B76 ++:10A83000190191601684F42700E020C300883003DA ++:10A84000BFDE02F002F2020400BF00016D03945E5D ++:10A8500002F000020020C28F02000200A0428F011D ++:10A86000F78000685E002DC00200025E02F00B1946 ++:10A8700003BFDE02F000020201C28F0000020114D9 ++:10A8800000630017A100685E8700600200025E029C ++:10A89000F00B190194600F00001800025E02F00135 ++:10A8A0007403BFDE02F00002011400630017A10070 ++:10A8B000B05E870010A501BC601311106000685ED7 ++:10A8C0008700017B00E0418306D06000E85E8700DE ++:10A8D00037A103BFDE02F00177028050C30001857B ++:10A8E000018760040310A000B000630010B400B042 ++:10A8F00042D3001800008841830030B601BC6003D9 ++:10A900000B10B500B0006300B0B40317DE02F00115 ++:10A91000820397DE02F00183018060068614300016 ++:10A9200002DE02F000000020E01280419F018760FB ++:10A93000040310A000B000630010B401BC60030E5B ++:10A9400010B500B0006300F0B401BC60570490B6CD ++:10A9500000B000630010B401BC600302D0B5020770 ++:10A96000500B00019C01BC600303D0B5018E600256 ++:10A97000F297940204500B0001950204D00B0001E1 ++:10A980009501866006F2979400E042D700D0B500AA ++:10A99000A0500B1117A10068DE8711019B0186E012 ++:10A9A00006F2979400E042D70050B50207D00B00A2 ++:10A9B000019B00E042D70090B500B042D70011E102 ++:10A9C00000B0006300B0B40317DE02F0019D0397EE ++:10A9D000DE02F0019E0002DE02F00000006820DFCF ++:10A9E0000001A3006CC46506E00201BC600300081E ++:10A9F00037006820D70001A6006CC46506C00201BC ++:10AA0000BC60030008350020E0BE09000203905E30 ++:10AA100002F0000203A25E02F001E1020200BF00A8 ++:10AA200001AB0203C5730001D400682F6B0001AFB6 ++:10AA300000E844657B57A1006D5E857B21D401BC95 ++:10AA40006003000BDA00682D9B0001D40282C1076D ++:10AA50000001D4028042030001D40285C523000115 ++:10AA6000D4028640370001D40181E006F577AB00BF ++:10AA7000B02D9F0017A101BC602F1077A201BC6010 ++:10AA8000030017A300025E02F0130F00B02DA30015 ++:10AA900017A101BC602F1777A201BC60030017A3A8 ++:10AAA00000025E02F0131D01BC60131A17A1000220 ++:10AAB0005E02F000BF00B040670417A200025E0211 ++:10AAC000F000C500E0446700D7A1006CC466F42123 ++:10AAD000C201BC60130ED7A100025E02F000BF00ED ++:10AAE000A040673FF7A201BC601314D7A101BC626C ++:10AAF000030017A300B05E8AF477A200025E02F0A2 ++:10AB000000C500B02D9F0017A101BC602F0D37A21A ++:10AB100001BC60030017A300025E02F0130F00B037 ++:10AB20002DA30017A101BC602F13B7A201BC6003C5 ++:10AB30000017A300025E02F0131D0181E002F57709 ++:10AB4000AB01BC6003000B6600025E02F00DDE028A ++:10AB50000200BF0001E00284DEAF0001DB02035E01 ++:10AB6000B70001E000025E02F010F202035EB700DF ++:10AB700001E003BFDE02F0000202035EB70001DE67 ++:10AB8000020480C70001E002805EFF0001E00002D5 ++:10AB90005E02F010B303BFDE02F0000200025E02AC ++:10ABA000F00ED10200421F0001F9006842F30001DB ++:10ABB000E4006D42F30041F9011400630017A100A5 ++:10ABC000B05E870017A203A25E02F001ED0183E0F0 ++:10ABD000020D906C03145E02F001FB006EC45680FF ++:10ABE00061FB028145230001FB006E5E870061F975 ++:10ABF00001BC60030077A200886006F457A30088B8 ++:10AC00005E8B01001800E85E8B0037A20020C28E28 ++:10AC1000F461F3006ADE86F441ED03BFDE02F00169 ++:10AC2000F9020400BF0002250090006301016500E5 ++:10AC30008085970217A100E064820DA16600025E84 ++:10AC400002F00E8703BFDE02F002250182600209D6 ++:10AC5000104803BFDE02F0000201BC6003001115C2 ++:10AC600000B0017F0017A6031F5E02F0020A020374 ++:10AC700000C30002000020C28F02020403255E020E ++:10AC8000F0020A0020C28F02020400688153FFE034 ++:10AC90000203BFDE02F002060194601300001803F5 ++:10ACA000BFDE02F00225039EDE02F002090068DE2C ++:10ACB000980BC2090201411F000C4C01856002097A ++:10ACC000104800685E980BC20E00695E9F00622A01 ++:10ACD0000298428F00020E03BFDE02F0022A020138 ++:10ACE000411F000C4C020400BF0002150218428FE5 ++:10ACF000000C4C00025E02F00E6900025E02F00ED3 ++:10AD0000870194058700001803BFDE02F0022502C8 ++:10AD10000013BB00021E0200156B00022100B013DD ++:10AD2000470017A10068DE84A7A21E00B0134B00E5 ++:10AD300017A10068DE84A7C21E00B0134F0017A140 ++:10AD40000068DE84A7E21E029E1397000221020122 ++:10AD5000C28F0002230194600F00001803BFDE02BF ++:10AD6000F002250201C28F000223018060060D90CF ++:10AD70006C0200C28F000C4C0194600700001800A8 ++:10AD8000025E02F00174020400BF00025A02850054 ++:10AD90006300025A0183E0060D906C03BFDE02F0EF ++:10ADA000025A01BC60031810600129500B00179271 ++:10ADB00000B0017B001065006800EB0002330088E2 ++:10ADC0005A130117A100E84466F437A1006EDE842F ++:10ADD00007423300E0029B0020A603BFDE02F0061C ++:10ADE0009A019060120910480194601F0000180138 ++:10ADF000085A0F00178101885E0681540A01345AEF ++:10AE00000F00178000025E02F000CC00B0017B0052 ++:10AE1000106500B056230017A100E05E86A097A140 ++:10AE200000E85E8400F40300E85E8400F41600B0DD ++:10AE30005A0300141300B05A0700141400B05A0B40 ++:10AE40000014150068DE0700424B00E80097005729 ++:10AE5000A101BC5E86F0141B017C5E8700F41C001F ++:10AE6000B0206300178100025E02F00D0400B00103 ++:10AE70007B00106501085A0F00178100B05E870043 ++:10AE8000141E03BFDE02F0024E00B0561700141B62 ++:10AE900000B0561B00141C00B0541300141E00B068 ++:10AEA0005013001086006D00A700825401900163CA ++:10AEB00000108A00B0418F00106200025E02F011A3 ++:10AEC0009900B0422B00140601BC60031817A100C2 ++:10AED0006DC18C20025701BC60030297A100E05EA7 ++:10AEE000840377A100E05E86B0111D03BFDE02F08F ++:10AEF00002CF020300C700026A020CD00300026AFC ++:10AF0000011400630017A10285006300026A00803B ++:10AF1000DE8701F7A201BC601B0257A200E05E8A37 ++:10AF20000DB06500B041970014320080DE8700B795 ++:10AF3000A201BC60171FD7A200E05E8A0DB06400BA ++:10AF4000B041930014330068D81300027402005A11 ++:10AF50001B00026C0180600684F42703BFDE02F050 ++:10AF600005C10201D00300026C00B0509B00142FF9 ++:10AF70000281D0C70002EF010BD0030017A1013CF2 ++:10AF8000502B0017A2018C5E86F457A101480143A3 ++:10AF90000017A200685E86F442740191601284F486 ++:10AFA0002703BFDE02F002F200025E02F00186001B ++:10AFB000B0501300108600B0501700108A00682FA0 ++:10AFC000C300027F0291D01700027D0291D01B00C6 ++:10AFD000027D0291D01F00027D0291D02300027DEC ++:10AFE00003BFDE02F0027F0191600284F42703BFF9 ++:10AFF000DE02F002F203A25E02F002AE020CD00307 ++:10B0000000029B020300C700029A00B050CB001060 ++:10B010006500025E02F01232020350C7000288018E ++:10B02000BC60230097A100A85002F4340003BFDEE7 ++:10B0300002F0029F020481AB00028A006D4246C00A ++:10B04000800200B05A1300178000025E02F000D6A2 ++:10B0500000B0540F00141E00B05A070017A100B032 ++:10B060005A1300178001875A16F0178000B0418FDD ++:10B0700000106500025E02F011A200E05E86A0747E ++:10B080000302875E030002990109DE030017A30093 ++:10B09000E05E8B0077A200E05E8AF477A200885E13 ++:10B0A0008B0037A100E05E86F4508903BFDE02F01A ++:10B0B000029F006D424A848002010650070017A1DA ++:10B0C000028CD00300029E00685E8700029F01820E ++:10B0D000DE86863431018260028634310020D0035E ++:10B0E0000402A500B0504F0011F200B050530011FF ++:10B0F000F300B050570011F401BC60030091F0025E ++:10B100000101B30002A70187E006F577AB03945E67 ++:10B1100002F002AE020650030002AA0287DEAF0070 ++:10B1200002AE028150030004FF0202D0C70002AD4C ++:10B130000208502B0002AE0285D0030005160190D4 ++:10B14000601286343103A25E02F002BB00B0500FE1 ++:10B150000011160202D0C70002B300B0505B00110C ++:10B16000160282D0030002BB028147C30002B40270 ++:10B1700080504F0002B9002047C73F82BB0020C764 ++:10B18000DB00C2F103BFDE02F002BB03A55E02F0EA ++:10B1900002BB0280C7DF0002F1028850C70002D55F ++:10B1A0000129500B001792020300C70002C8020CCD ++:10B1B000D0030002C8028350C70002C800B050CBC1 ++:10B1C00000106501385A1300178001825A17005782 ++:10B1D00081010E5A130017A1018E5E86F03781029D ++:10B1E00002D0C70002D500B0501B00108A03BFDE9A ++:10B1F00002F002D50282D0C70002CF0138502700EA ++:10B20000178001085013001781010250130017A185 ++:10B2100001825E86F0378100B0507F00108903BF45 ++:10B22000DE02F002D50138506F0017800108502B64 ++:10B230000017810106D0070017A101825E86F03752 ++:10B240008100B0501B00108A00B0508300108900AC ++:10B25000025E02F000CC00025E02F00CF701024236 ++:10B260001B00178101825E0503178100025E02F058 ++:10B270000D0400E05E840117A101D9DE8700108370 ++:10B28000020001B30002DE01E001B700108301BC3F ++:10B29000613703B79100685E4B0282F5020400BF7C ++:10B2A0000002E3028750030002E303945E02F0020F ++:10B2B000E403225E02F002E601BC61030030800379 ++:10B2C000BFDE02F0000201BC613303B791032BDE45 ++:10B2D00002F002EC009000630097A100E06482F4A9 ++:10B2E0003065006E5A130022EC0188E006F23791B7 ++:10B2F0000068DE4B0482EE01BC61BB03B79103BF63 ++:10B30000DE02F002F50191600E84F42703BFDE0235 ++:10B31000F002F20191600684F42701BC6003001082 ++:10B32000B40181E00686343103BFDE02F005C103BB ++:10B33000C4DE02F00B61020650030002FD0207DECC ++:10B34000AF0002FD01BC610300379102075003000A ++:10B3500002FB01BC620300F79100E0010B002042F8 ++:10B3600003BFDE02F002FE01BC600300204200B019 ++:10B370005E47001080020001B300030401826006F2 ++:10B38000103081020181B300030401BC600305B7E2 ++:10B390009303BFDE02F006CC020400BF00030B00E3 ++:10B3A000B0058B001064006E45170000020068DED7 ++:10B3B0004B02830A00A044B42A314503BFDE02F0E9 ++:10B3C000000200025E02F00D110068C517000002C5 ++:10B3D00003D05E02F0030F00025E02F00D1103BF06 ++:10B3E000DE02F0000201836002F7F7BF01BC6003D8 ++:10B3F00000900400A8412330104801BC620F0011E6 ++:10B40000E001816002F5D7AE020200BF0003230015 ++:10B4100068DE4B02031700025E02F013090068DECB ++:10B420004B06232302045EB30003230200456F0092 ++:10B43000032300E844655737A100E82AB6F437A192 ++:10B4400000695E870823230183E0022B915C0207D9 ++:10B4500001AB0003200180E00209D04E01BC600373 ++:10B4600018517800B045E3001800018060022F31C8 ++:10B47000790187E002F577AB0068810B0023260095 ++:10B48000B044670000430182E00609104801816072 ++:10B49000020D906C018260062891440188E0020B45 ++:10B4A000905C00025E02F00EFF0185E002F7F7BF3C ++:10B4B0000288421B00032E0185E006F7F7BF035BFD ++:10B4C0005E02F0033001BC601300104301BC600356 ++:10B4D00000108501BC60030010B800885077009010 ++:10B4E000B90208502B000337013850730017A1012F ++:10B4F0007C506EF437A100885E870090B902004747 ++:10B50000A300033B01BC60030011EA009042E70086 ++:10B5100091EB00B047A300D1E8020047B300033D20 ++:10B5200001B0E08E3D91EC01D2E00210908403A9BD ++:10B530005E02F0042901BC600300108400E001C336 ++:10B54000002070028181B30003730320DE02F00348 ++:10B550008F01816006F5B7AD0068DE4B04A356028B ++:10B5600003DEBB00034800E02C9300106503BFDE40 ++:10B5700002F0034901BC602301D06500A05E7FFE9C ++:10B5800010EC00B05A030010ED00B05A070010EEA6 ++:10B5900000B05A0B0010EF00B05A0F0010F001BCC1 ++:10B5A00063FF1EF08401BC600300308501BC6003B2 ++:10B5B0000010B401BC600301D0A601BC60030450BC ++:10B5C000B501BC602304D0B400E002AF0020AB039F ++:10B5D000BFDE02F003D70068DE4B05235C01BC60D0 ++:10B5E000030010B401BC60071350A601BC60030245 ++:10B5F000D0B501BC602304D0B403BFDE02F0036603 ++:10B600000068DE4B0243730285C38F00035F00E0D6 ++:10B610005E2700378901DA5E270010EE01BC63FF68 ++:10B620001FF0CE01BC60030010B401BC600300D069 ++:10B63000A601BC600303D0B501BC602304D0B400F4 ++:10B64000E001D300207401BC61FF1FF08401BC60E5 ++:10B6500003001085018460070011E00282DEB30060 ++:10B6600004E602045EB30004E60183E00609104824 ++:10B6700000B0412300180001BC600306B78E0181B1 ++:10B68000E006F5D7AE00B054130017A100E05E84C9 ++:10B690000117A100885E8700708303BFDE02F004FB ++:10B6A000E601BC60031FF0840103DE530017A20211 ++:10B6B000005EFF00037701BC60030037A200682B27 ++:10B6C0006F00037901BC60030037A201865E8A1C0B ++:10B6D00070E3006AC39300038300E8439000D0E462 ++:10B6E0000202421B0003810090001B0037A10020D2 ++:10B6F000421B00438000B020B30017A100E043923A ++:10B70000F430E40069C39300038301BC60030010BC ++:10B71000E400682B6F00038500E043915C30E40196 ++:10B72000BC60030010B401BC60030010A601BC6043 ++:10B73000030210B501BC602304D0B400685E4B0660 ++:10B74000A38D00E001CB00207201BC60030008382B ++:10B7500003BFDE02F003D700E001CF00207303BF78 ++:10B76000DE02F003D703205E02F003DE0181E00277 ++:10B7700009104800E001D7002075031EDE02F00327 ++:10B78000BE01BC60030017A2006A5E23000397019C ++:10B7900002428F0017A201855E8A0910480180E0ED ++:10B7A000061030810284DE5300039E00B000770053 ++:10B7B00017A100E05E840437A100885E870057A1CE ++:10B7C00000E05E870D57A103BFDE02F0039F01BCBE ++:10B7D00060030D57A1006800270003BE00E05E84EF ++:10B7E00001F7A101BC60230150650088419700303A ++:10B7F000B601BC60030010B400905E870050A60143 ++:10B80000BC60030110B501BC602300B0B40317DEB7 ++:10B8100002F003A70397DE02F003A80020DE8700F2 ++:10B8200043B10020DE870023AE01B85E22D016802F ++:10B8300001805E8AD0368103BFDE02F003B701BC0F ++:10B840005E22D0168001845E8AD0368103BFDE027C ++:10B85000F003B70020DE870023B501B85E22D036A2 ++:10B860008101805E8AD0568203BFDE02F003B701F9 ++:10B87000BC5E22D0368101845E8AD0568201886007 ++:10B8800002F430A800B05A030010B000B05A07000C ++:10B8900010B1028042A30003BA00E042A30090A8C6 ++:10B8A00000B05A0B0010B000B05A0F0010B1018761 ++:10B8B000600610908400E05E2700378901DA5E2779 ++:10B8C0000010EE01BC60030010B401BC6003035023 ++:10B8D000A600B000330010B50284DE530003C80098 ++:10B8E000E0606803B0A600E042980430A600B00013 ++:10B8F000370010B501BC602304D0B401846006F2A7 ++:10B90000979401866002091048039EDE02F003D27C ++:10B910000280441F0003D500B05E3F00114501BC0A ++:10B92000600300178F00B05E4300178500B05E0F04 ++:10B9300000179003BFDE02F003D500B05E0F0017C2 ++:10B94000850280441F0003D500A044B6F0B1450134 ++:10B95000BC600301104201836006F2979401846089 ++:10B96000070011E003A05E02F004E402065EAF00EF ++:10B9700004E60186E006F577AB01BC6003001080A9 ++:10B9800000025E02F00B1F03BFDE02F0061703A1E8 ++:10B990005E02F00450011400630017A10068DE8706 ++:10B9A00000E3E30181600609104803BFDE02F004F2 ++:10B9B0005001816006F5D7AE0020600E8624080194 ++:10B9C0008760040310A000B000630010B401BC60E5 ++:10B9D000030B10B500B0006300F0B4020300C70011 ++:10B9E00003F6020CD0030003F6028050C70003EEFA ++:10B9F00000B054130017A100E05E8680741A00B0F6 ++:10BA0000506B0010E400B042130210840209502B66 ++:10BA10000003F600B0421300308401D2E03AA030B7 ++:10BA2000E0028050C70003FC01D2E052A030E003E6 ++:10BA3000BFDE02F003FC0202D0C70003FC00B050DE ++:10BA40005F0010E000B050630010E100B0506700EC ++:10BA500010E200B0506B0010E400B0421302F0841A ++:10BA6000020050C700040300B000630010B401BC22 ++:10BA700060030210B500B0006304D0B40184600715 ++:10BA80000011E001BC600300178E03BFDE02F0046A ++:10BA9000E800E001C700207100B000630010B401AD ++:10BAA000BC600302D0B500B0006304D0B403BFDEB5 ++:10BAB00002F0048001856006F7F7BF010350030020 ++:10BAC00017A100B85E870037A101875E861010803D ++:10BAD000020CD00300044F020300C700041F00B093 ++:10BAE00050CB00106501BC600300168500E05A339E ++:10BAF00000368C020350C700041400E05A270036B9 ++:10BB00008903BFDE02F0045001BC60030017B200DD ++:10BB1000B05A0B000B2501385A130017A101BC5A6B ++:10BB200006F430E0013C5A130017A1017C5A06F4D8 ++:10BB300030E10181E0061090840185E0070010E308 ++:10BB40000185E0070010C30282D0C700042403BFB0 ++:10BB5000DE02F004270202D0C700042900B02A4BFD ++:10BB60000017A101B8506EF430E000B05073001718 ++:10BB7000A101B82A4EF430E10282421300042700EA ++:10BB8000B0507B0010E400B042130210840185E045 ++:10BB9000061C30E100B0421300708401876004038A ++:10BBA00010A0020300C700043E00B050CB00106597 ++:10BBB000006D5ECAD1C42F0185E0021870C300E099 ++:10BBC0005ECB00368E01BC601B09D06500E041965B ++:10BBD000F6506500B050970016800068DECB000478 ++:10BBE0003601BC60230150B800682C9700243C0348 ++:10BBF000BFDE02F0044800B05ECB0010B500B0001C ++:10BC0000630870B4028342D300043801BC600301AE ++:10BC100070B80068AC9700244801BC60030170B89C ++:10BC200002BC506700044703BFDE02F00446010C6B ++:10BC3000D0030017A103A95E02F0044301BC6023F6 ++:10BC40000150B800685E8700644603BFDE02F0045E ++:10BC50004801BC60030170B800685E870044480179 ++:10BC6000BC60030170B80181E0021710B801BC602C ++:10BC70000300F0A501BC60030E10B500B000630026 ++:10BC800010B400B0006300F0B400B042D30018005C ++:10BC9000018860080310B4018160060D906C03BF39 ++:10BCA000DE02F004800202D0C700045600B0506FDC ++:10BCB0000010E000B050730010E100B050770010A9 ++:10BCC000E20282421300045500B0507B0010E400F1 ++:10BCD000B0421302F08400E05E9F0037A703A15E2C ++:10BCE00002F0045F01BC60030017A7018760040332 ++:10BCF00010A000B000630010B401BC60030E10B5CA ++:10BD000000B0006300F0B4018860080310B403BF02 ++:10BD1000DE02F0047500B0017B00106500B05A032C ++:10BD20000010E501BC63FF1FF0C500B05A0700100A ++:10BD3000E601BC63FF1FF0C600B05A0B0010E7011C ++:10BD4000BC63FF1FF0C70068A06700046800E05EE6 ++:10BD5000270037890068206700046C0185E0070030 ++:10BD600010E30185E0070010C300B0421301108406 ++:10BD700001DA5E270010EE0187600610908400B0A3 ++:10BD800042131C108401BC60030010B400E0606822 ++:10BD900003B0A600B000970010B501BC602304D02A ++:10BDA000B4018460070011E003BFDE02F004D40197 ++:10BDB000085E4B0017A100685E87002480020250D5 ++:10BDC0000300047F029E509F00047C0201D0030008 ++:10BDD000047C00E05E2700378901585E2700142D9F ++:10BDE00001DA50B70010EE0187600610908403BF9F ++:10BDF000DE02F0048001BC600300142D0104C107C1 ++:10BE00000017A103225E02F004830103DE53001732 ++:10BE1000A100B05E870017A202005EFF0004860149 ++:10BE2000BC60030037A200682B6F00048801BC606F ++:10BE3000030037A202885E4B00048B00685E4B064D ++:10BE4000848B01BC60030017A20183DE86F2979405 ++:10BE50000183DE8684F4270281C2130004920186E6 ++:10BE60005E8B0010E3018660070010C30181E006CD ++:10BE700010908403BFDE02F0049401865E8A1C7079 ++:10BE8000E3018660061870C302B847A70004D00219 ++:10BE9000A047B70004D203A95E02F0049C01085E2B ++:10BEA0004B0017A100685E870024D1021E509F003E ++:10BEB000049C0185E0061C70E30185E0061870C350 ++:10BEC000011400630017A10068DE870084A500B09C ++:10BED00001530017A20068DE8BFFE4A1006842470F ++:10BEE0000024A20068DE8A84C4A5018560020910CE ++:10BEF000480186E0021C70E30186E0061870C30169 ++:10BF00001050070017A600685E9B0004D101BC60BA ++:10BF1000030011E4013A500700178000885E030017 ++:10BF2000778000E000AEF010640068DE9B0044B64D ++:10BF30000207D0030004B001BC602B12B7A200E0DE ++:10BF40005E000B37A300025E02F00D5201BC6023BD ++:10BF500007978100E0418301706300E0418F00B0EA ++:10BF60006500025E02F00D2701BC602307506401EA ++:10BF7000BC60470017A200025E02F00D7A00685E06 ++:10BF80009B0044D201A46046F471E00068DE9B008F ++:10BF9000C4C401BC611300B7A1020600F30004BDD4 ++:10BFA00001BC601300B7A10192C21AF437A20329A1 ++:10BFB0005E02F004C201BC60030011EE009042E793 ++:10BFC0000091EF0192E00EF437A200B05E8B0011F9 ++:10BFD000EC03BFDE02F004D200685E9B0064C9007F ++:10BFE000685E9B00A4C900B0502F0011E200B05061 ++:10BFF000330011E203BFDE02F004D2018760023D8C ++:10C0000011E80068DE9B00A4CC018760063D11E8C2 ++:10C0100001BC60030011EA009042E70091EB01923D ++:10C02000C21B00B7A201B85E8A3D11E803BFDE0261 ++:10C03000F004D2018460070011E001BC600300112C ++:10C040002D00B0448300142C03A3DE02F004E701AA ++:10C05000BC600300178E00685E4B05A4D802005038 ++:10C06000030004E10183E00609104800B041230009 ++:10C07000180001BC600304B78E03A95E02F004E659 ++:10C0800000685E4B0424E601BC600306378E00683E ++:10C090005E4B05A4E601BC600306B78E03BFDE025B ++:10C0A000F004E601816006F577AB00B05E0F001783 ++:10C0B0008500025E02F00D1101BC600300178C01C7 ++:10C0C000BC600300178D0323DE02F004E80187E063 ++:10C0D000061070830185E002F5B7AD03295E02F01A ++:10C0E00004FC020300C70004F700B050CB00106549 ++:10C0F0000282D0C70004EF00E05A2300368803BF55 ++:10C10000DE02F004F000E05A2700368900682C9720 ++:10C110000024F700E05ECB0037B2010A5ECB0017C7 ++:10C12000A100E050CAF4306500D06006F657A200C6 ++:10C13000205A1AF444F703BFDE02F004F100025E55 ++:10C1400002F00EFF03D5DE02F00A4D03D6DE02F048 ++:10C150000A650350DE02F004F703BFDE02F0051E9D ++:10C1600002055EAF0004FE0187E00626713303BFBF ++:10C17000DE02F000020190600A8634310282D0C7EC ++:10C18000000508013C50270017800109502B0017BB ++:10C1900081010750070017A101825E86F0378100F8 ++:10C1A000B0501F00108A00B0500F00111603BFDE00 ++:10C1B00002F0050E0138505F001780010A502B0075 ++:10C1C00017810107D0070017A101825E86F0378131 ++:10C1D00000B0502300108A00B0505B00111602031B ++:10C1E00000C7000513020CD00300051302085E0708 ++:10C1F000000513013854070017800190422AA1302E ++:10C200008A028050C700051C01BC600305B7920379 ++:10C21000BFDE02F002B301906006863431020300F3 ++:10C22000C7000500020CD00300050000B0001F008D ++:10C2300017A100E05E8680741A03BFDE02F00500DD ++:10C2400001BC600306379203BFDE02F002B30205B1 ++:10C250005EFF00052D01856002F7F7BF032BDE02AC ++:10C26000F0052D020000F300052400E80023005132 ++:10C270004201BC600A28514203945E02F005290085 ++:10C28000B0058B0010640068580300052900B04415 ++:10C290006700111200B058030011150068451F0017 ++:10C2A000052D03A25E02F0052D0185E006F577ABB2 ++:10C2B00000025E02F00E410201C2E30005570203D4 ++:10C2C00000C700053200682C97002542006E4246E8 ++:10C2D000F6454203BFDE02F00534006E42470025FA ++:10C2E00042020300C700053F0355DE02F00534019A ++:10C2F000806002861430013850830017A100B050CE ++:10C30000CB001065006DDA32F42A4D00A8412314E9 ++:10C3100010480114006300106500E041970ED065DD ++:10C3200000E05A0300368001BC621F0011E003BF29 ++:10C33000DE02F000020181E0068634310191600ED8 ++:10C3400084F42703BFDE02F00557013C5067001755 ++:10C35000A101AC5E861750BA01BC60030190B8021F ++:10C360000300C70005510068AC9700254C0181E02F ++:10C37000021710B803D5DE02F00A4D03D6DE02F034 ++:10C380000A650350DE02F0054803BFDE02F00557E0 ++:10C3900000E82C97002B2500B05ECB0010B500B054 ++:10C3A00000630870B4028342D300054F03BFDE026E ++:10C3B000F005520186E0040310A000025E02F001C5 ++:10C3C0007D03D5DE02F00A4D03D6DE02F00A6503D6 ++:10C3D00050DE02F0055303BFDE02F0032E01BC6005 ++:10C3E0000300F0A50182E00209104801BC621F00B1 ++:10C3F00011E001BC60030011EC01BC600F0011E80A ++:10C400000285500B00055E0182600209104802811E ++:10C4100081B300056503A0DE02F0056303D5DE02EB ++:10C42000F00A4D03D6DE02F00A6503205E02F00535 ++:10C43000650188600209104803BFDE02F0000201B6 ++:10C44000BC60030037A1020001B3000573020401C0 ++:10C45000B300057200E901BB00206E00E881BF0057 ++:10C46000006F006881BB000572006881BF00057223 ++:10C47000028181B300056F01BC600300006C03BF43 ++:10C48000DE02F005C101BC600300006C00025E0228 ++:10C49000F00ADC03BFDE02F0000201BC60030017FB ++:10C4A000A100025E02F00C36020101B30005760322 ++:10C4B000BFDE02F0000203A3DE02F0000202005021 ++:10C4C000C700057F01BC600300108001826006097F ++:10C4D0001048018060028634310104C1070017A1B1 ++:10C4E0000183DE86F2979400E001CB00207203BF47 ++:10C4F000DE02F001A0020101B30005810187E00620 ++:10C50000F577AB00B0010B0017A1006DDE840805C4 ++:10C51000C100E844640877A1006E5E840825C1016B ++:10C5200087E006F577AB020200BF00059402888120 ++:10C53000AB000594028400C70005940129500B004C ++:10C5400017A10068DE870205940282DEBB00059415 ++:10C550000203C5730005930283DEB30005930282D4 ++:10C56000DEBB00059000682B07000594006DDE2FF0 ++:10C5700001E5940182E006F7F7BF00E04465564A02 ++:10C58000B103BFDE02F0000203BFDE02F005C1020C ++:10C59000825EAF0005A401826006F577AB00B0446F ++:10C5A0006700082300B0014B0017A20208421B00DD ++:10C5B000059B00B0016B0017A200685E8B0005A10F ++:10C5C0000090452B0097A10080DE86F457A1006EF5 ++:10C5D00020D60DA5A100B041B700083500E020D657 ++:10C5E0002328360185E002F5B7AD02055EAF0005F0 ++:10C5F000A401BC610300113300E844650477A50081 ++:10C60000B04467000BDA006D5E9701009E020200E5 ++:10C61000BF0005B30068DE4B06A5AA0184E002F75F ++:10C62000F7BF0068DE4B0405AD0282DEB30005AD46 ++:10C6300001BC6003000B1202045EB30005B0006889 ++:10C64000DE4B0625B000025E02F0111A00025E0207 ++:10C65000F00F0003A3DE02F005B30183E002F597BB ++:10C66000AC01BC60131497A100025E02F000BF0190 ++:10C67000BC63830017A100A04066F437A20068DE07 ++:10C680008AF425BF01BC60130E77A100025E02F0A0 ++:10C6900000BF00A040673FF7A200985E8B0037A262 ++:10C6A00000685E8B0005BE0068DE8B0FE5BF01BC35 ++:10C6B000602300104301826002F577AB03D15E0274 ++:10C6C000F00002020050C30006100325DE02F00550 ++:10C6D000C50183600684F42703BFDE02F005F7027C ++:10C6E0000CD0030005F5020300C70005E4011400A7 ++:10C6F000630017A1006DDE870085F501BC600300B3 ++:10C70000178000B050CB00106500B050CF0010640F ++:10C71000018160060D906C0182600686343100B0A4 ++:10C720005A230017A101BC600300168801BC5A2AD5 ++:10C73000F437A101BC600300168A00B05E870014C4 ++:10C740008F00B05A270017A101BC600300168901B1 ++:10C75000BC5A2EF437A101BC600300168B00B05EFA ++:10C760008700149000B05A1B00148D00B05A1F00AF ++:10C77000148E01BC60030016040068DE030005E1AE ++:10C78000020350C70005E00100509F0017800180A0 ++:10C790005E0291B48D01BC5E0292149001BC6003F4 ++:10C7A00000378000025E02F0127E00B05E030014CB ++:10C7B0008C03BFDE02F005F00068C2470005E90106 ++:10C7C00081E0068634310191600E84F42701BC605B ++:10C7D0000300143003BFDE02F0000200B0509F00DF ++:10C7E00017A100025E02F0017C00B05E87001427F2 ++:10C7F0000186E0040310A000B04283001800010C81 ++:10C80000D0030017A10068DE870065E4010250C76D ++:10C810000017A101805E8684F427018AE00E84F46B ++:10C820002700B050BF00142603BFDE02F005F70159 ++:10C8300086E0040310A00200509F0005F70286C1A5 ++:10C840000700060B03295E02F005FC00B05233001E ++:10C85000142D00B052370017A1019E5E8684F42784 ++:10C8600000B0509F0017A10180DE86F437A100B010 ++:10C8700050BB00108F00B050B700108E00B0509B1E ++:10C8800000108D01806006F4308C020250C7000653 ++:10C890000A00B0524300108F00B0523F00108E00CB ++:10C8A000B0523B00108D011A52370017A10198DEDB ++:10C8B000870437A101B85E8691B08C018260028640 ++:10C8C0003431018160020D906C0325DE02F0060E0A ++:10C8D000019C600284F42703BFDE02F00612028589 ++:10C8E000500B00061000A850C70D143101BC6003A6 ++:10C8F00000143001816002F5D7AE0183600284F438 ++:10C90000270185E00209104801BC600300142E03D2 ++:10C91000A25E02F001A003BFDE02F000020323DEEC ++:10C9200002F0067B03A35E02F0067B03A2DE02F0A8 ++:10C93000067B01816006F577AB03AA5E02F0067BF9 ++:10C940000183E0020910480351DE02F0063A0204B6 ++:10C950005EB300062701846002F597AC0183E00214 ++:10C9600009104800B02B5F0017A1006D2B0EF420BA ++:10C970000200E0027B00209E01BC6003000AC300AD ++:10C98000025E02F0111D03BFDE02F000020203DEB0 ++:10C99000B30006370183E002F597AC00E02A9B0064 ++:10C9A0002AA602015EBB00063700B02A9F0017A12D ++:10C9B000006D2A9AF4263201BC6003000AA600E04A ++:10C9C000027F00209F03A95E02F006350191601AE4 ++:10C9D00084F42703BFDE02F002F201BC63FF1FF7FD ++:10C9E000A100025E02F00C3603295E02F006370158 ++:10C9F00091601A84F42703BFDE02F0063700E002DC ++:10CA00006B00209A0180E006F577AB03BFDE02F0F1 ++:10CA1000063F0301DE02F0063D00685E4F06263D3C ++:10CA200001BC60030017A803A45E02F0063F03C127 ++:10CA3000DE02F0067E01846002091048020400BF95 ++:10CA400000064401BC6003001115011400630017C7 ++:10CA5000A100E06602F4306500025E02F00D1601EE ++:10CA600082600209104803A95E02F0065F00685E5A ++:10CA70003B04A64F01F0DE1700378500A05E16F0DC ++:10CA8000978500685E3B06264F0201500300064E64 ++:10CA9000028780BF00064E0185E00609104802802B ++:10CAA000D00300065F00B05E1B0017A300B0008B30 ++:10CAB0000017A4020400BF000655006E41973066BF ++:10CAC0005501185A030017A3011A5A030017A400AE ++:10CAD00068C18318065800E002930020A403BFDE5B ++:10CAE00002F0065A006D5E2EF4865A0182E0068638 ++:10CAF000343100E05E3300378C0068DE32F4665D6E ++:10CB000000B05E0F001785006DDE2EF4666B03BF6C ++:10CB1000DE02F0067600B05E1F0017A300B0008FA3 ++:10CB20000017A4020400BF000665006E419730663E ++:10CB300065011C5A030017A3011E5A030017A40025 ++:10CB40006D5E2EF486670182E00686343100E05E79 ++:10CB50003700378D0068DE36F4666A00B05E0F007D ++:10CB60001785006D5E2EF466760185E00209104897 ++:10CB700003D1DE02F0066D00025E02F00D110068C6 ++:10CB8000418318069A020300C7000674020CD00302 ++:10CB9000000674028350C70006740068DE4B05A6C9 ++:10CBA0007403BFDE02F011FC0181E006863431031C ++:10CBB000BFDE02F005C100025E02F00D11018160CE ++:10CBC0000209104803295E02F0067B028300C700B9 ++:10CBD00011FC03BFDE02F005C103D1DE02F0067CCA ++:10CBE00003A5DE02F005C103BFDE02F000020280F1 ++:10CBF00001B30000020206500300068500B00103E5 ++:10CC00000017A1006D810AF4268500E844640877C6 ++:10CC1000A1006E5E840826850187E006F577AB01EA ++:10CC2000085E4B0017A100685E8700268800B05E92 ++:10CC30000F00178500025E02F00D1100685E3B06D2 ++:10CC4000268E01BC600300178C0200D003000693FF ++:10CC500001BC600300178D03BFDE02F0069301BC28 ++:10CC6000600300178C020300C70001A0020CD00370 ++:10CC70000001A0019C600284F42703BFDE02F001E2 ++:10CC8000A0006841831806990180600684F4270398 ++:10CC9000295E02F005C101826006863431028300FC ++:10CCA000C70011FC03BFDE02F005C100E0029700DF ++:10CCB00020A50181600209104801BC600300081929 ++:10CCC00000E0017B00A05E01BC601310D7A1006DE5 ++:10CCD000017AF4200201BC601309405E03BFDE024A ++:10CCE000F0000200025E02F00B190338DE02F000D1 ++:10CCF00002039EDE02F0000200E8444C00F7A100AF ++:10CD0000E85E840117A1006ADE840106AA00E85EDD ++:10CD10008401118701BC600300118801A5E0223065 ++:10CD2000118001BC600300111301BC6003001114E9 ++:10CD300000B044670017A100B0446B0017A200B018 ++:10CD40005E8700110400B05E8B00110503B8DE029F ++:10CD5000F006AC03BFDE02F0000201BC600304B7C2 ++:10CD60009201BC60030417A101BC63FF1FF0CB015B ++:10CD7000BC63FF1FF0CC01BC63FF1FF0CD01BC639F ++:10CD8000FF1FF0CE01BC63FF1FF0CF01BC63FF1F8C ++:10CD9000F0D000B052170010E801BC63FF1FF0C8CC ++:10CDA00000B0521B0010E901BC63FF1FF0C900B0C6 ++:10CDB000521F0010EA01BC63FF1FF0CA01BC6003F0 ++:10CDC0000010E4028600C30006CD00B0540F001727 ++:10CDD000A20069DE8A9086C500E85212F450E40091 ++:10CDE00068A0630006CD01BC60030010E400B054ED ++:10CDF000270010E000B0542F0010E103BFDE02F066 ++:10CE000006D603A4DE02F008BC03A9DE02F008BCCB ++:10CE100001BC600301D7A1020600C30006CF028057 ++:10CE2000DE5F0006D400B054070010E00068206305 ++:10CE30000006D201D2DE86A030E000B0540B001014 ++:10CE4000E103BFDE02F006D601BC5E869010E00171 ++:10CE5000BC601F0010E101BC60030010E200B05292 ++:10CE6000230010E501BC63FF1FF0C500B05227008E ++:10CE700010E601BC63FF1FF0C600B0522B0010E7A4 ++:10CE800001BC63FF1FF0C700B00047001086010817 ++:10CE90002063001781013852030017800102C02768 ++:10CEA0000017A600025E02F011950068206300469C ++:10CEB000E400B05407001780028181B30006E60049 ++:10CEC000025E02F00CF7006820630026EE0068A006 ++:10CED000630006E9021A54070006EE006800A70185 ++:10CEE00006EC0103C0270017A103BFDE02F006ED28 ++:10CEF0000106C03B0017A101825E8610D08603A9FF ++:10CF0000DE02F0091700685E4F04270001BC63FFD2 ++:10CF10001FF0C300685E4F05A6F601BC60031A90BF ++:10CF2000E301BC600306B79200685E4F052700036B ++:10CF3000BFDE02F006FA01BC600306379202984495 ++:10CF4000070009E6028046070009E601BC600318F5 ++:10CF500090E300B0206300178100025E02F00D0430 ++:10CF600000E85E8400D7A1006A5E8690870000E832 ++:10CF70005212F430E403BFDE02F0070301BC600389 ++:10CF80000010E40338DE02F007030187E0061C907E ++:10CF9000E40190600A09104801BC61030437910064 ++:10CFA000685E4F05A9E603835E02F008BC03BFDE9E ++:10CFB00002F0000201866002F7F7BF0182E002F58D ++:10CFC000B7AD0185E002F5B7AD0204416300071378 ++:10CFD000018460020B105802055EAF00070F018745 ++:10CFE000E006267133020400BF0007120185E0024B ++:10CFF000F577AB00025E02F00E4103BFDE02F000E7 ++:10D00000020283C03700071B006CC4656C271C013B ++:10D01000BC601B1A77A100025E02F000BF0180E035 ++:10D02000060337A200025E02F000C50180E002F4B0 ++:10D0300057A200025E02F000C500E044656C4B613F ++:10D040000285C52300072B018460060B10580200DF ++:10D05000DEFF0007220180E002F7F7BF00682B6FB8 ++:10D0600000072200E044655B4ADB0207AC0F0007C3 ++:10D070002B0280456F00072B01BC63FF1FF7A10047 ++:10D0800068DE862C272B01BC60130217A100025E0C ++:10D0900002F000BF01882C0E0337A200025E02F0EE ++:10D0A00000C501BC6003000B0302055EAF00072D45 ++:10D0B00001BC6103001133020580BF00073301BCCE ++:10D0C00060131157A100025E02F000BF0196600ECE ++:10D0D00003301900B040670017A200025E02F000A2 ++:10D0E000C50283C03700000200E0021F0020870154 ++:10D0F00082600628914403BFDE02F00002028140F4 ++:10D10000130000020200420300073A01846002F5A6 ++:10D1100097AC01BC600300108003A3DE02F0073D62 ++:10D120000190600209104800B0446700179E00B0EB ++:10D13000446B00179D00B0446F00179C00B044730F ++:10D1400000179B0068DE7A23273D00E002230020C1 ++:10D15000880115403B00179700B001430017A1015B ++:10D16000C9DE8405280501BC60031077950191E0B4 ++:10D17000020D906C0286403700074B00E002BB00B6 ++:10D1800020AE03BFDE02F00A8E01BC6003001480F3 ++:10D1900001BC600300148101B8600A04902401BC42 ++:10D1A000600304082B01BC600300482A01BC600333 ++:10D1B00000D02A01B3600700100401BC600300081E ++:10D1C0000E01BC600300080F01BC600300081001E1 ++:10D1D000BC60030008110183E002F5D7AE0287C0EE ++:10D1E00037000A8A00025E02F0117700025E02F048 ++:10D1F0000EFF03435E02F00757006D403300CAFA8A ++:10D2000000685E5F00476F00685E5F00276C006823 ++:10D2100000A700C761006800A7010761006880A738 ++:10D2200000A76200E0446690283701BC62C3001783 ++:10D23000A102805203000765019652030017A10066 ++:10D2400080DE8690379A0203520300076A00E05E90 ++:10D250006A90379A0207D20300076A00E85E6B0003 ++:10D26000379A029E5E6B000AFA03BFDE02F0077473 ++:10D270000152D2030017A10185D206F4379A03BFE9 ++:10D28000DE02F00774013C52030017A101BC5206F4 ++:10D29000F4379A006E5E680BAAFA00682FC3000785 ++:10D2A00074028E5207000AFA0204C03B00077E0196 ++:10D2B00081E0060D906C02874037000A8E00025E06 ++:10D2C00002F0117700025E02F00EFF0287C0AF008D ++:10D2D00007760287C0AF000A8A015840AF00179A4C ++:10D2E00001BC603F1E17A1006DDE6AF42A8A035B51 ++:10D2F0005E02F0078001BC601300104300B04123C0 ++:10D3000028104801806002F297940184E00209101D ++:10D3100048015840AF00102A006840AB002A8A013B ++:10D32000BB5E5600900402035E5700078F02004761 ++:10D33000A300078C01BC621E3C11E001BC6003002D ++:10D3400011EA00B05E6B0011EB0198601E3D11E820 ++:10D35000020047B300078F00B05E6B0011EF01B011 ++:10D36000E0CE3D91EC03835E02F0079300025E0283 ++:10D37000F0117700025E02F00EFF006D403304C72B ++:10D380008F03AADE02F0079C018360020D906C02FD ++:10D390000200F300079A0280521700079C00E04148 ++:10D3A0008700B06500025E02F00C460280C0770084 ++:10D3B000079B03305E02F0079C018360060D906CB2 ++:10D3C00001BC60030008020188E00F000803006D43 ++:10D3D00040330208B60129520F0017930109520F7A ++:10D3E0000017AA01966002F2979400E0418701F0CD ++:10D3F0006501BC600F0017A10028DE869067A801B8 ++:10D40000866006F2979400E0419700706500E02086 ++:10D41000AF00C82B01065E530017A200A05E4F04A8 ++:10D4200077A10068DE870447B60186E006F297948C ++:10D4300000B85E8B0037A200B05A030017A0020AA2 ++:10D44000DA030007B001876006F297940284C03BBC ++:10D450000007B60203DA030007B603AB5E02F0076B ++:10D46000B4020441070007B60180600500680301AB ++:10D47000065E530017A20182DE8A00900403AADE32 ++:10D4800002F007E703AB5E02F007D10287D2130078 ++:10D4900007E700B0521300118601A5E00A301180A1 ++:10D4A000018460020D906C01BC63FF1FF79900E0DE ++:10D4B00041870170650068DEAB0027C300A05E4FA6 ++:10D4C000FF77A10068DE870727CF03BFDE02F007E2 ++:10D4D000C50284520F0007CF0204D20F0007C80311 ++:10D4E000B15E02F007CE00E0418701106503BFDEA8 ++:10D4F00002F007C903B35E02F007CE020080F3001A ++:10D5000007CF020052170007CF00025E02F00C4660 ++:10D510000200C0770007CF012940770017990184E6 ++:10D5200060060D906C020052170007E703315E029F ++:10D53000F007E7018660023011800180E001620B94 ++:10D5400010020052170007D50202AB4F0007E2009D ++:10D5500068DE5F0007E200B02BB70017A100682A61 ++:10D56000BB0007E200B02BB30017A2006DAABAF40B ++:10D5700047E20068DEAB0047DE006D2BBAF427DD22 ++:10D5800000B02C6B000B190184E006F7F7BF0068B0 ++:10D59000DE4F0287E200025E02F013090206DEFFA0 ++:10D5A0000007E200E02BE7002AF90068DE5F0007D1 ++:10D5B000E50068DEAB0047E50180E005620B100086 ++:10D5C000682B6F0007E70180E006F7F7BF020752FC ++:10D5D0000F000867028047A3000864028047B30079 ++:10D5E000086400E020AF00882B00E820AB00882A08 ++:10D5F00001BC60030011E401BC63FF1FF7A501BC7F ++:10D60000600303D1E102065E530007F101BC600331 ++:10D610000491E10206DE530007F500E04787005160 ++:10D62000E10207D20F0007F500E047870091E10013 ++:10D630006D403302C8B600685E4F0587F80068DEAB ++:10D64000AB00486703AB5E02F007FB020052170015 ++:10D650000867020580F300080600E04187011065B5 ++:10D66000020200F30007FF0204D20F0007FF00E0F0 ++:10D67000418700B06500025E02F00C460200C077F0 ++:10D68000000803012940770017A500E05E97009786 ++:10D69000A50068DE97FFE8060280521700086702BF ++:10D6A0000700BF00086701BC601F1417A200904765 ++:10D6B0008700306500E04196F4506500E04787013F ++:10D6C000082103835E02F0080E00025E02F011776B ++:10D6D00000025E02F00EFF006D403104280A006D6A ++:10D6E00040310428B601BC600B1D57A10068DE97CD ++:10D6F000FFE81E010F5A070017A5031EDE02F008FF ++:10D700001E0200521700081E032C5E02F00867007C ++:10D71000685E67FFE81E00E05E6700979900E05EC4 ++:10D7200066F43064012A58030017990100DE97005F ++:10D7300017A500E05E66F4B79900E05E67003799D0 ++:10D74000011558030017A603BFDE02F0082E00E003 ++:10D750005E96F43064012A5803001799020580F39D ++:10D7600000082D0182E002F33799020052170008E9 ++:10D770002D0116D8030017A6010F5A070017A401A0 ++:10D780000CD8030017A10068DE92F4282900E05E9F ++:10D790006702179903BFDE02F00832010DD80300BB ++:10D7A00017A10068DE92F4286700E05E670417990D ++:10D7B00003BFDE02F00832011058030017A600680C ++:10D7C000DE9B00C8320181DA030017A100B85E8633 ++:10D7D000C017A10281DE8700086700885E670077B6 ++:10D7E0008000E000AEF0106401AADE65004802008F ++:10D7F00068DE9B00484C0207818700083F006DDE11 ++:10D80000030C083F0285520F00083F0298523B006C ++:10D81000083F0181E00500680300E05E000B37A3CC ++:10D8200000E05E8F0097A300E041870077A200022E ++:10D830005E02F00D5200E820AB01082A01BC602313 ++:10D8400007978100885E970077A100E85E86F4B0B4 ++:10D850006301BC60070E17A100E0418EF430630045 ++:10D86000B056170017A100B0561B0017A20068DEC3 ++:10D8700086D048670068DE8AD0686700025E02F0E2 ++:10D880000D2701BC602307506401BC624F0017A242 ++:10D8900000025E02F00D7A00685E9B00486401BCE5 ++:10D8A000621EF471E00068DE9B00C85701BC611382 ++:10D8B00000B7A1020600F300085301BC601300B7D3 ++:10D8C000A101BC60030011EE00B05E6B0011EF011E ++:10D8D00092E00EF431EC03BFDE02F0086400685EF3 ++:10D8E0009B0068590068DE9B00A864019860063DB3 ++:10D8F00011E800E020AF00882B00E820AB00882A68 ++:10D9000001BC60030011EA0068DE5F00485F00B000 ++:10D910005E6B0011EB0192DE5E3D11E80187600253 ++:10D920003D11E80068DE9B00A863018760063D1199 ++:10D93000E8019860163D11E80181E0050048020108 ++:10D94000AADE6500480203BFDE02F0086C01BC627B ++:10D950000F0011E001BC60030011E40181E001004F ++:10D96000680301BC600F0011E801BC60030011EC0A ++:10D970000200200F00087300E020AAF3482A00B03C ++:10D9800020AF00102500E820AA04A82A006AA0AB56 ++:10D9900001C87301B860060490240182E006F29782 ++:10D9A000940188600A00900401BC60031877950315 ++:10D9B000A0DE02F0088000685E4F06A8850138529C ++:10D9C0000300178000B05E5F0017810203DEB7001E ++:10D9D000087F00685E0700087E01BC600301778055 ++:10D9E00001BC600300378103BFDE02F0087F01BC89 ++:10D9F000600301578000025E02F000CC0068DEABDD ++:10DA000000488500A05E4F0477A100685E87004A49 ++:10DA10003600685E87044A3603BFDE02F00BCC0393 ++:10DA200086DE02F00A8B0287C037000A8A00025E97 ++:10DA300002F0117700025E02F00EFF03035E02F0B7 ++:10DA4000088503A9DE02F0089100025E02F011775A ++:10DA500000025E02F00EFF0207403700088B0386CB ++:10DA6000DE02F00A8B0287C037000A8A00025E02DB ++:10DA7000F00C43006E40300208BC0301DE02F008E7 ++:10DA8000BC0068DEAB0008A3032B5E02F008970021 ++:10DA9000E0022B00208A03BFDE02F0089B028052C6 ++:10DAA0001700089A00E0024300209003BFDE02F056 ++:10DAB000089B00E0025700209500685E4F040B6C45 ++:10DAC00000685E4F028B6C00685E4F0209ED0068D3 ++:10DAD0005E4F048A2F00685E4F050BBD00685E4FE5 ++:10DAE000060BBD00685E4F068BC603BFDE02F00B5F ++:10DAF000CC0068DEAB0028B4032B5E02F008A70060 ++:10DB0000E0022F00208B03BFDE02F008AB02805240 ++:10DB1000170008AA00E0024700209103BFDE02F0D0 ++:10DB200008AB00E0025B00209600685E4F06A9C1CA ++:10DB300000685E4F042BE400685E4F04ABE40068AD ++:10DB40005E4F05AA3C00685E4F0629C100685E4F23 ++:10DB5000052BBB00A05E4FFF77A100685E87072BF7 ++:10DB6000D703BFDE02F009E600E0021300208403C1 ++:10DB7000BFDE02F009EA00E0020F00208301BC6072 ++:10DB8000030011EC01BC600F0011E80284C03B00EF ++:10DB900008670184E00609104803BFDE02F0086749 ++:10DBA0000200C09300000203A35E02F008C003C39A ++:10DBB0005E02F008BF03BFDE02F00AF600025E025A ++:10DBC000F0117700025E02F00EFF0207C0AF0008FE ++:10DBD000C4020740370008C00107C0AF0017A1000A ++:10DBE000B85E870037A101825E860D906C00B0445C ++:10DBF0007F000804018360020910480287C03700D3 ++:10DC00000A8A0386DE02F00A8B00025E02F01177B8 ++:10DC100000025E02F00EFF03435E02F008C90287B5 ++:10DC2000C037000A8A020081B30008E7018060065D ++:10DC3000F297940301DE02F008E70138520300175F ++:10DC40008000B05E5F0017A400025E02F012F001D7 ++:10DC5000BC602F0657A400E05E86F4906500E05A91 ++:10DC60000300368003B05E02F008DB00E00207002C ++:10DC7000208103BFDE02F008DC00E0020300208008 ++:10DC8000028481B30008E10184E0040D806C01BCD2 ++:10DC9000600300006E01BC600300006F03BFDE0282 ++:10DCA000F008E600E8523AF7B7A100E85E870217ED ++:10DCB000A100905E870097A100E101BAF4206E00F8 ++:10DCC000E081BF00006F00B0523B0017BD0301DED2 ++:10DCD00002F008FD028081B30008EA03305E02F022 ++:10DCE00008FD01BC601B1F506500E04194DF3065FA ++:10DCF000012D406B0017A200885E8B0137A201380E ++:10DD0000402B001680028840270008F1018460063D ++:10DD1000D0168000B05A02F456800205C0270008D1 ++:10DD2000F40187E006D0168001BC601B0DD7A1006E ++:10DD3000025E02F000BF00B0406700168101BC60C7 ++:10DD40001B0DF7A100025E02F000BF00B0406700AB ++:10DD5000168200E01BE70066F900691BE70188FDF9 ++:10DD600001BC60030006F9020081B30008FF020550 ++:10DD700001B3000AFA0280200F000901006E403052 ++:10DD80000209BC0381DE02F0090B00E0021700204B ++:10DD90008503A9DE02F009070184E00609104801A5 ++:10DDA00080E0020910480184E002F7F7BF0386DE35 ++:10DDB00002F00A8B0180600500480201806006F2D3 ++:10DDC000979403BFDE02F0098A01836002F7F7BF70 ++:10DDD0000386DE02F00A8B032B5E02F0093103A9F1 ++:10DDE000DE02F009140068DEAB00493100B0523B9E ++:10DDF00000179F00B0523B0017BE01BC6003002813 ++:10DE00000E03BFDE02F0093102875E5300093E03B4 ++:10DE1000A0DE02F0092003BFDE02F006B20182E0BC ++:10DE2000060D906C0190600A09104800B0523B004A ++:10DE3000179F00B0523B0017BE019E5E8300B0EBFF ++:10DE40000106520F0017A100B85E870037A10182BA ++:10DE5000DE86F577AB01BC610300308000E8523A02 ++:10DE6000F3F7A2006BD23AF3E92300E85E7E91D784 ++:10DE7000A200905E8B0097A101BC602301D06400DA ++:10DE80006B523AF3E92E01185E870017A2010A5E71 ++:10DE9000870017A300886006F457A200E04192F4BF ++:10DEA000706400B05802F45600006BDEFA91C9317C ++:10DEB00000B0523B0017BE03BFDE02F00931000282 ++:10DEC0005E02F011E700B0203B00280E00B0523B8C ++:10DED00000179F0320DE02F0093E02075E5300098F ++:10DEE000350180E00209104803BFDE02F0093E0060 ++:10DEF00068DE5F00093B021A54070009390103C0BC ++:10DF0000270017A101825E8610D0860102C027007B ++:10DF100017A100E0422AF4308A0180E0050048029F ++:10DF200003A9DE02F0093E00B05E47001080010840 ++:10DF30005E4F0017A100685E8700295E03AB5E029A ++:10DF4000F009620200521700094F0068DEAB004979 ++:10DF50004400E0025300209402865E5300098A02C6 ++:10DF600084520F000AFA0284D20F00094903AC5E02 ++:10DF700002F0094D03BFDE02F00956032C5E02F0E9 ++:10DF8000095600685E4F04094D0106D20F0017A123 ++:10DF900001845E86F2979400685E4F02098A03BF8F ++:10DFA000DE02F0097A031EDE02F0095303315E023D ++:10DFB000F009530068DEAB00495301846002F29718 ++:10DFC000940068DEAB00495800E0023F00208F0358 ++:10DFD000BFDE02F0095B00685EAB00495B02805265 ++:10DFE0002F00098A0202410700095B00685E4F04A6 ++:10DFF000098A00685E4F02898A0284410700098A03 ++:10E0000001806006F2979403BFDE02F0098A032BB9 ++:10E010005E02F0098A00685E4F05A97A00685E4FCB ++:10E0200005297A03BFDE02F0098A0068DEAB0049E9 ++:10E030006A01BC6003000ABD01826002F5D7AE022E ++:10E04000805EFF00096800682B6F00096A00E044E9 ++:10E05000655B4ADB00682B8BFFC96A00E02B8B00F5 ++:10E060002AE202065E5300096D00E0026300209878 ++:10E0700003BFDE02F0098A0323DE02F009750129DD ++:10E08000500B0017A30068DE8F0529750187E00299 ++:10E090001070830184600209104800B05E87001789 ++:10E0A000A1006EE00300297403D1DE02F0097500BF ++:10E0B00068DEAB00497700E0022700208900685E37 ++:10E0C0004F00098A00685E4F01098A00685E4F05AB ++:10E0D000898A028047C70009BA0329DE02F0098055 ++:10E0E0000102DEAF0017A10106520F0017A200388F ++:10E0F0005E86F4498A0182DE8AF577AB00B052234E ++:10E100000011F200B052270011F300B0522B0011A1 ++:10E11000F40106520F0017A100E05E870031F50000 ++:10E12000B0005B0011F000B047C30018000134C715 ++:10E13000C70017A1006EDE8402A98A01BC60030833 ++:10E1400010420283C10700098C02805E53000AFA64 ++:10E1500000B040330017A10108A00F0017A200680B ++:10E160005E8B00699400E840310577A10281200FA1 ++:10E1700000099400B020AF0017A10280A00F000991 ++:10E180009400B05E630017A1006E5E840209BC00BB ++:10E19000B05E870007FA018160010048020202C0F8 ++:10E1A0001300099A00E05E840347FA0181600500CC ++:10E1B00048020201200F0009B501035E530017A1B8 ++:10E1C0000187DE850048020386DE02F00A8B00022A ++:10E1D0005E02F0117700025E02F00EFF03855E0220 ++:10E1E000F0099D018E60023D11E80107C783001709 ++:10E1F000A101825E850048020201A00F0009A7016B ++:10E2000003C7970017A101825E8500680300B02054 ++:10E210004B0017A1018E5E850068030207C0AF00A6 ++:10E220000C2701BC60030011EC01BC600F0011E879 ++:10E230000184600500680300B040270007FC00B0BF ++:10E24000402B0007FD00B0406B0007FE00B0406FA0 ++:10E250000007FF0184600500680300025E02F00C05 ++:10E260004301BC63FF1FD7A800025E02F00D160039 ++:10E27000025E02F00C2701A8600A0090040201204F ++:10E280000F0011D200A8401300500403BFDE02F0BB ++:10E29000061700E002870020A103BFDE02F009BDDF ++:10E2A00000E0020B00208203A9DE02F00AFA0184DA ++:10E2B00060060910480184E00609104803BFDE0229 ++:10E2C000F00AFA032B5E02F009DE0068DE4F06A9B1 ++:10E2D000C500E0023B00208E03BFDE02F009C6004D ++:10E2E000E0023700208D0323DE02F009E60068DE3D ++:10E2F0004EF1C9E60187E0021070830184600209D3 ++:10E30000104800B05E870017A1006EE0030029CC22 ++:10E3100003D1DE02F009CD00685E4F0629DC01BCA6 ++:10E320006003000AA603295E02F009D20203DEB3ED ++:10E330000009D30191601A84F4270183E002F59764 ++:10E34000AC020200BF0009DB0203456F0009D601E1 ++:10E3500085E0062B715B02045EB30009DB0187E0F8 ++:10E36000021070830183E00209104800025E02F08F ++:10E37000111E03BFDE02F009E60205500B0009E69C ++:10E380000182600609104803BFDE02F009E6028739 ++:10E3900000C30009E30068DE4F06A9E30068D2135A ++:10E3A0000009E301BC600300118301BC600300119C ++:10E3B000820068DE4F0629E600E0024F002093034A ++:10E3C000BFDE02F009E603AB5E02F009E802044199 ++:10E3D000070009EB028341070008BC03BFDE02F01F ++:10E3E00009EB028441070008BC01806006F29794A3 ++:10E3F00003BFDE02F008BC039F5E02F009F0039E3B ++:10E40000DE02F00BCC02035E53000BCC020481430E ++:10E410000009F4010001630017A10102C0270017E1 ++:10E42000A20038DE86F449EA03AB5E02F009F60288 ++:10E430000052170009EA0280522F0009F803335EE8 ++:10E4400002F00BCC023C523F000A09013C523F0053 ++:10E4500017A10068DE84048A2901BC6003161064D9 ++:10E4600001BC601F16106500685E87002A0500B0B9 ++:10E470005A030017A20068DE8AC00A2900E041970B ++:10E4800000306500E0419300306400E85E8700578B ++:10E49000A1006A5E870029FE00685E87000A0A0103 ++:10E4A000385A030017A1013858030017A20068DE8C ++:10E4B00086F44A2903BFDE02F00A0A0285C107007A ++:10E4C0000BCC01BC601F15F06501BC600305B7A44F ++:10E4D00000025E02F00106028000C3000A2901BCAE ++:10E4E000601310D7A600E0017F00B7A5006D5E960F ++:10E4F000F4CA1201BC60130957A500685E940BCAE8 ++:10E500002D00B0017B00106500B052270017A2005B ++:10E51000B0522B0017A3006841940BEA1D0068DE7F ++:10E520008ED04A1900685E8AD02A2900E0419700FF ++:10E53000B065006D4196F4CA1601BC6013095065C0 ++:10E5400003BFDE02F00A1600E0028B0020A200B03A ++:10E55000017F00106500B0522300168000B05227E2 ++:10E5600000168100B0522B00168201BC5202F2F755 ++:10E57000A101A95E02F4368300904467011684026B ++:10E580000281AB000A270068DE9305AA2801846097 ++:10E5900006D0968400B05E9700005F020781AB0052 ++:10E5A0000A2B01806006F2979403AB5E02F006CA64 ++:10E5B00003BFDE02F008BC00E0028F0020A303BF0F ++:10E5C000DE02F009EA039EDE02F00BCC03AB5E0232 ++:10E5D000F00A32020052170009EA03335E02F00B20 ++:10E5E000CC01846006F2979403AB5E02F006CA0386 ++:10E5F000BFDE02F008BC03835E02F00A3900025E4F ++:10E6000002F01177006D4033038A36006D4033030A ++:10E6100089EA032B5E02F00BD003BFDE02F006CACC ++:10E62000032B5E02F00A3F00E0023300208C03BFA0 ++:10E63000DE02F006CC00E0024B0020920103C0276E ++:10E6400000178101825E0503178100025E02F00D52 ++:10E6500004008800230037A200E05E8800F7A200D3 ++:10E66000E05E86F451890186E00630118003BFDE4A ++:10E6700002F009E603A2DE02F0009F03A3DE02F02F ++:10E680000A6500E001FF00207F01BC60030017A3C2 ++:10E6900003BFDE02F00A67018760040310A001BC1B ++:10E6A00060030051E400B0479300180001BC600310 ++:10E6B00002900401BC620F0011E001BC600F013147 ++:10E6C000E800B047A300180001BC600F0011E8018A ++:10E6D000BC60030131EC00B047B300180001BC601E ++:10E6E000030011EC018460060910480020601E0937 ++:10E6F0000A5C00E001FB00207E03BFDE02F00A6D31 ++:10E7000001BC60030ED7A1011400630017A200E052 ++:10E710005E86F4506500E05A03003680020300C7AD ++:10E72000000A6203A95E02F00A670291509F000A84 ++:10E73000660191601A84F42703BFDE02F00A6600C6 ++:10E74000E001FF00207F01BC60030037A30323DE4C ++:10E7500002F00A6D0183E00209104801846002F5AD ++:10E7600097AC01BC600300178E0187E00210708334 ++:10E770000182600209104803D0DE02F00A6E03D065 ++:10E780005E02F00A6F0182E00209104803D5DE0242 ++:10E79000F00A7101BC60030010B401BC600300F713 ++:10E7A000A1006800A7000A750185421AF437A1008C ++:10E7B000025E02F000BF00B040670017A501BC6315 ++:10E7C000FF1FF7A200025E02F000C500886007018B ++:10E7D00057A400B85E86F497A100025E02F000C55F ++:10E7E0000283C21F000A7C00E044670117A10204F3 ++:10E7F0004523000A81006B4466F42A7E00025E0213 ++:10E80000F0115E00685E8F000002006801B3000A2C ++:10E810008501BC60030004EE03BFDE02F00A88003D ++:10E8200020E01E090A8800B05E9700142E03BFDEA8 ++:10E8300002F002F200A8412300F04803BFDE02F01C ++:10E8400000020183600209104801BC600700104209 ++:10E85000006E4030020A8E00E0027700209D000228 ++:10E860005E02F012A403A35E02F008BC03C6DE023F ++:10E87000F00A910184E00609104803BFDE02F00AA5 ++:10E88000FA006820E3000A9900E844650717A1012F ++:10E89000BC609F0217A2006D5E86F44A9901BC60BD ++:10E8A0000300083800025E02F00B190020E10209A3 ++:10E8B000008C0020628A090A9D00025E02F0117736 ++:10E8C00003BFDE02F0008C0284452300008C03911C ++:10E8D0005E02F0008C0396DE02F0008C03965E026E ++:10E8E000F0008C00025E02F00B1901BC60030060B6 ++:10E8F0002000680173000AB300025E02F000F1001C ++:10E90000B0446700083800B001730010E401BC6037 ++:10E910000300000601BC600300005C01BC60030151 ++:10E92000D78201D2DE087570E000B00EB30010E1AE ++:10E9300000B0004700108600B00ECF00108A01BC66 ++:10E94000600300378100025E02F00CF70190600A5C ++:10E9500009104801BC610300308003BFDE02F000F3 ++:10E960000201BC60030030420187E00224712300F1 ++:10E97000025E02F0108401BC600306778000680D1F ++:10E98000EF000ABA00B00DEF00178100025E02F03E ++:10E990000DAE03975E02F00B2A03125E02F00ABA74 ++:10E9A00001BC600300402001BC618300112500B060 ++:10E9B000007B00112701BC600702578000025E0245 ++:10E9C000F00DA900B05E07000B3001BC60070277B4 ++:10E9D0008000025E02F00DA900B05E07000B31015D ++:10E9E000BC60130997A100025E02F000BF00B040B6 ++:10E9F00067000B6301BC601309405E01BC60130932 ++:10EA0000405F0180E006F5D7AE0107C1070017A1FE ++:10EA100001805E86F577AB01BC600F0011E801BC98 ++:10EA2000620F0011E000025E02F00ADC01BC61CF5F ++:10EA30000C105C01BC600300105D01BC61CF01F0F3 ++:10EA40005E01BC603B0AF05F00025E02F01048010C ++:10EA5000BC6003000835020300C700000201BC606F ++:10EA60000300060201BC600300060701BC6003004E ++:10EA7000060C01BC600300061103BFDE02F00002B9 ++:10EA800001BC60030010480185E002F5B7AD01BC90 ++:10EA900063FF1FF05401BC63FF1FF05501BC63BF4F ++:10EAA0001FF05601BC63FF0FF05700025E02F01228 ++:10EAB000A40187E00624712301BC60030010540107 ++:10EAC000BC600300105501BC600300105601BC601F ++:10EAD0000300105701BC600F0020170106C107009A ++:10EAE00017A101825E8402E017010741070017A108 ++:10EAF00000B85E870037A10180DE870000160002A3 ++:10EB0000DE02F000000285C03700000200025E0253 ++:10EB1000F0117700025E02F00EFF02864037000A15 ++:10EB2000EF00E0021B0020860386DE02F00A8B0263 ++:10EB300087C037000A8B0158600300102A01BC60AF ++:10EB40000300900400B040130017A103BFDE02F0E1 ++:10EB5000000201B8600A04902403AA5E02F00AFDD4 ++:10EB60000158600300102A01BC600302900400B049 ++:10EB700040130018000183600209104801BC6003C3 ++:10EB80000051E400B0479300180001BC620F00116F ++:10EB9000E00180600100680300025E02F00EFF03E6 ++:10EBA000855E02F00B0401BC620F0011E001BC6045 ++:10EBB0000F0131E800B047A300180001BC600F004E ++:10EBC00011E801BC60030157A100E85E870037A18E ++:10EBD0000068DE87000B0B01BC600302900400B0EC ++:10EBE000401300180001BC60030131EC00B047B3D2 ++:10EBF00000180001BC60030011EC0324DE02F006E3 ++:10EC00001701866006F577AB00025E02F00B190172 ++:10EC100080600610308100B05E870017A10180601F ++:10EC20000210308103BFDE02F0061701BC61030051 ++:10EC3000108000B04203001800006EE003002B1C9F ++:10EC400003505E02F00B1F00015E02F0000003BFE4 ++:10EC5000DE02F0030F01846002F597AC00A84123A7 ++:10EC600004F048018260020910480206DEAF000B82 ++:10EC70002503D5DE02F00B250350DE02F00B230145 ++:10EC8000BC60030010B40284C783000B2801BC6081 ++:10EC90000B0011E0018E6002F577AB0002DE02F09E ++:10ECA000000003A2DE02F0008C02BC4287000B31A0 ++:10ECB00001BC60030037A401BC60031FF7A301146B ++:10ECC00000630017A200886006F457A203BFDE02AB ++:10ECD000F00B36008860070117A401BC63FF001722 ++:10ECE000A3011400630017A200E05E8B0117A200CD ++:10ECF000886006F457A201BC601311106501BC6066 ++:10ED00001B02506401BC60030017A50020C286F4FA ++:10ED10008B4000E0419706D06500E0419301F0642C ++:10ED200000E05E970037A500885E930037A40020BE ++:10ED30005E92F46B5F03BFDE02F00B390068DE9277 ++:10ED4000F44B4500680083006B4503A0DE02F00B26 ++:10ED5000450020C123160B3A00025E02F00B190099 ++:10ED60006DDE93200B5B020300C7000B4F006DDECE ++:10ED700097008B4F01BC600300160801BC600300C4 ++:10ED8000160901BC600300160A01BC600300160BE3 ++:10ED900001BC600300160C01BC600300160D01BC31 ++:10EDA000600300160E02005AC3000B5A023C5A9F21 ++:10EDB000000B5A00680083006B5A0385DE02F000E6 ++:10EDC0008C03855E02F0008C03A2DE02F0008C034F ++:10EDD000A3DE02F0008C0397DE02F0008C00B0414D ++:10EDE000970010600191600A84F42703BFDE02F0EF ++:10EDF00002F201806002D616B000B05E930010A14E ++:10EE000001836002F7F7BF01BC600300304303BF1A ++:10EE1000DE02F00B3A0068808300608C03BFDE02E4 ++:10EE2000F00ABB0283C21F00000200B05E87001719 ++:10EE3000A103D0DE02F0051E01BC600304104203F2 ++:10EE40009EDE02F0000200B05E3F00114501BC6092 ++:10EE50000300178F00B05E4300178500B05E0F00FF ++:10EE6000179000025E02F00B1903BFDE02F00002F1 ++:10EE7000006D40330589EB03AC5E02F00B71006856 ++:10EE80005E4F028BA600E0026700209903BFDE02FE ++:10EE9000F00BA600685E4F028BA600E0025F002028 ++:10EEA0009701856002F5B7AD01826002F5D7AE012A ++:10EEB000BC6003000ABD039F5E02F00BB9039EDE37 ++:10EEC00002F00B860321DE02F00B8600E0026F00E9 ++:10EED000209B00025E02F00B1901866002091048B7 ++:10EEE000018060020910480181E00209104801BC5C ++:10EEF00060030210420280441F000B8500B05E3F99 ++:10EF000000114501BC600300178F00B05E4300177D ++:10EF10008500B05E0F00179003BFDE02F00B860085 ++:10EF2000A044B6F07145039F5E02F00BB902820067 ++:10EF3000C3000BA603335E02F00BA600B000730003 ++:10EF400017A100E05E86B017A100E15E7AF4379E5B ++:10EF500000E1DE7700179D00E1DE7300179C00E002 ++:10EF6000DE6F00179B039EDE02F00B97006E5E6E55 ++:10EF7000924BB9006D5E6E924B97006E5E72922B53 ++:10EF8000B9006D5E72922B97006E5E76920BB9009F ++:10EF90006D5E76920B97006DDE7A91EBB900B0440E ++:10EFA0006700083400B0446B00083300B0446F00C1 ++:10EFB000083200B044730008310068A0D2232B97B8 ++:10EFC00000E920D2F3D79E00E9A0CEF3B79D00E977 ++:10EFD000A0CAF3979C00E8A0C6F3779B00E15E7A95 ++:10EFE00091F7A100B05E8700111900E1DE76921161 ++:10EFF0001A00E1DE7292311B00E0DE6E92511C00BD ++:10F0000068DE86232BA0031EDE02F00BB9039F5E91 ++:10F0100002F00BB900685E4F028BB903335E02F059 ++:10F020000BB901BC601F16B06501BC600300B7A43A ++:10F0300000025E02F001060068DE9300ABB9020731 ++:10F04000C197000BB2013C5A07001788013C5A0BCC ++:10F050000017A103BFDE02F00BB401385A070017F6 ++:10F060008801385A0B0017A101845E86F29794013B ++:10F0700087DE86249124020680F3000BB9018460A8 ++:10F0800002F297940187E00224912403AB5E02F020 ++:10F0900006CA03BFDE02F008BC032B5E02F009EAD9 ++:10F0A00003BFDE02F006CA03AB5E02F00BC0032C06 ++:10F0B0005E02F009EA03BFDE02F00BD000B052237B ++:10F0C0000011F200B052270011F300B0522B0011D2 ++:10F0D000F401BC60030091F500B0005B0011F00387 ++:10F0E000BFDE02F006CA0138523F0017A102065ED9 ++:10F0F00053000BC90138524B0017A10068DE87008E ++:10F100008BCC03AB5E02F006CA03BFDE02F008BC84 ++:10F110000068DE4F020BCF020781AB000BCF0180EE ++:10F120006006F2979403AB5E02F006CA020000F399 ++:10F13000000BD50206DE53000BD501185E830017C5 ++:10F14000A10068DE8700ABD501BC600B0251420212 ++:10F150000052170009EA03BFDE02F008BC01BC60E0 ++:10F160000300118301BC6003001182032C5E02F0D6 ++:10F170000BDC0199E00620110003BFDE02F00BE07A ++:10F180000119402F0017A100685E870009E6019968 ++:10F19000DE8620110003315E02F009E600A05E3B2E ++:10F1A0000097A200205E4EF449E601846002091037 ++:10F1B0004803BFDE02F009E6032B5E02F009E60019 ++:10F1C00068DE4F042BE900B0523300179F00B052A5 ++:10F1D0002F0010EB0281522F0006B200E002AB00BC ++:10F1E00020AA0281522F0009C603295E02F00BEF0C ++:10F1F0000203DEB3000BEF0191601A84F427018350 ++:10F20000E002F597AC0208522F0006CA03BFDE02E7 ++:10F21000F008BC01BC600300106701BC6003001073 ++:10F22000460180E0060930490282C11F000BF90146 ++:10F23000BC602F1FF06501BC600300168000E84130 ++:10F24000970030650069C197000BF601BC600B00A8 ++:10F25000179401BC60030017AB01BC60030017AC3E ++:10F2600001BC60030017AD01BC60030017AE01BC18 ++:10F2700060030017BF01BC600300202001BC6003D5 ++:10F280000017A100025E02F000BF013840670000D5 ++:10F2900028011C406700002901BC6003005049019F ++:10F2A000BC60030017A701BC60030017A801BC6085 ++:10F2B000030017A901BC60030017AC01BC60030088 ++:10F2C00017AD0182E0060F10780206C1E3000C0BB7 ++:10F2D000006880A7000C0E03BFDE02F00C0F006870 ++:10F2E00080A7008C0F01BC600B1EA00001BC600356 ++:10F2F00000200101BC631301200201BC62330AC07B ++:10F300000301BC600300000401BC60530D800501D3 ++:10F31000BC601F14106101BC601317D06001BC6099 ++:10F320000300082900B05E0F00178500A044B6F066 ++:10F330007145028741D7000C1A01BC6003000BF035 ++:10F3400001BC600300107D01BC600300107C01BCA7 ++:10F35000606300107B01BC600300107A01AC607F29 ++:10F3600000107501BC63470897A10068C1DAF42C4E ++:10F3700026011A41DF0017A10068DE87016C260113 ++:10F38000BC637B15ABF003BFDE02F00AA201885E0E ++:10F390005CFF87FC01BC601F1F500701BC600301BC ++:10F3A0009008018860060090040386DE02F00A8B54 ++:10F3B0000305DE02F00C2B0386DE02F00A8B0385C8 ++:10F3C000DE02F00C2D00B05E870017A1006EE00396 ++:10F3D000002C310386DE02F00A8B006EC0146F2C05 ++:10F3E0003401BC60070010420207C0AF00077A007A ++:10F3F00002DE02F0000003215E02F00C3A00E02081 ++:10F4000066F4281900B0206700178B03BFDE02F0F6 ++:10F410000C42028150C7000C3F011C509F00178B0B ++:10F4200000E05E2EF4378B019C5E2E84F42703BF30 ++:10F43000DE02F00C42011E509F00178B00E05E2E92 ++:10F44000F4378B019E5E2E84F4270002DE02F0006A ++:10F45000000107402700082800E020A3002828001A ++:10F4600002DE02F0000000B05A0300101F00B05A84 ++:10F470000700102000B05A0B001021018060070027 ++:10F48000101D02804077000C4A0002DE02F00000EE ++:10F490000187E002F577AB03915E02F000020020E5 ++:10F4A000E3FE09000202815E53000C580283411FF3 ++:10F4B000000C520281DE53000C5E01BC600300119F ++:10F4C0005101BC600300115201BC620300115301E1 ++:10F4D000BC600300515001896006F2979403BFDEBF ++:10F4E00002F000020280C54300000201F0C547009F ++:10F4F00011560107C5470017A101F0C54AF431555F ++:10F500000189600AF2979401BC60030810470392D6 ++:10F51000DE02F000020204C107000002039EDE02C8 ++:10F52000F00C6503B8DE02F0000200B0017F0017A6 ++:10F53000A10068DE840BC00203BFDE02F00C67028C ++:10F5400003DE530000020068DE23000C6802845EC4 ++:10F55000530000020287C4930000020282DEBB0057 ++:10F560000C6B00682B07000C6E00682B8FFFE0020D ++:10F5700000B02AF70017A1006DDE8556000200B02A ++:10F58000012B0017A30282DEBB000C7100682B0761 ++:10F59000000C7200E05E8D5C77A300B0440B001796 ++:10F5A000A100B0440F0017A200E95E862337A10036 ++:10F5B000E8DE8A2357A200E95E86F4681400E8DEDC ++:10F5C0008B00081500B0441F001800008844230178 ++:10F5D00057A30090442300D7A4006E5E8AF48ACE1D ++:10F5E0000068816F000C7F00685E23002C9100682A ++:10F5F0000027002C9100E85E230037A10069DE8718 ++:10F60000000C8200E05E840137A1013C016F00170D ++:10F61000A50068DE97000C890138016F0017A5006E ++:10F62000685E97000C8D00E85E970037A100685E69 ++:10F6300087000C9103BFDE02F00C8D00E85E97009E ++:10F6400037A50080DE940137A500E05E860DB7A1E6 ++:10F6500000685E87000C9100E12052F4681400E01D ++:10F66000A056F4881500E85E870037A1006A5E871F ++:10F67000000C8D01BC610300112300692057000CB0 ++:10F68000950180E006F2979403BFDE02F00C97012B ++:10F6900080E002F2979403BFDE02F00002006841AE ++:10F6A00027000CA102844523000C9800B044670099 ++:10F6B00017A100E84466F437A2006D5E8B004C9AF7 ++:10F6C0000392DE02F00ACE00025E02F01088000211 ++:10F6D0005E02F00DB900025E02F00DB400025E029F ++:10F6E000F00DC401BC600F0011E8031EDE02F00C37 ++:10F6F000A801BC600300105C01BC600300105D0148 ++:10F70000BC605304105E01BC600300105F03BFDEE9 ++:10F7100002F00CAC01BC600B00105C01BC6003008B ++:10F72000105D01BC604304105E01BC600300105F0B ++:10F7300001BC6003008020028500BF000CE800B01F ++:10F74000205300115100B02057001152006E20527A ++:10F750002A8CB40068A057000CB400E02052232883 ++:10F760001603BFDE02F00CB600B0446700081601B5 ++:10F77000BC600300315001BC60030C90400000DE0F ++:10F7800002F000000068C103000CBB02804543008A ++:10F790000CB6006B446502CCB601BC60030011508E ++:10F7A00002844543000CBC00B044670017A1006808 ++:10F7B0005E86232CBE01BC600300402001866006EB ++:10F7C00020110000E920522A37A100E8A0562A574C ++:10F7D000A200E14466F4311900E1C46AF4511A0050 ++:10F7E000E1C46F00111B00E0C47300111C00B044A1 ++:10F7F0001F001800008844230157A30090442300F1 ++:10F80000D7A400B0440B0017A100B0440F0017A20A ++:10F8100000E95E862337A100E8DE8A2357A200694B ++:10F82000DE8B000CD600E1440AF4710200E0C40E45 ++:10F83000F4910300E02AF7002ABD00E85E230037B8 ++:10F84000880069DE23000CCA00E80027003788031F ++:10F85000BFDE02F00CCA018660022011000200DE49 ++:10F8600053000CEA0180E002F2979400025E02F07D ++:10F870000DB701BC600300104003BFDE02F00CDDD9 ++:10F88000020080C3000CE100E044640957A100E8D5 ++:10F890005E862137A1006CC466F42CDF03BFDE0254 ++:10F8A000F00CEA00E8012A21281401BC60030008DA ++:10F8B0001500B0205300115101BC6003001152012A ++:10F8C000BC600300315002804543000CE603BFDEFC ++:10F8D00002F00CC001BC600300104000B0012B001E ++:10F8E00011090068AAE7000CEC0000DE02F000003D ++:10F8F00003565E02F00CEE00025E02F0014A00B018 ++:10F90000012F00110901BC61CF0C105C01BC600328 ++:10F9100000105D01BC61CF01F05E01BC603B0AF0EC ++:10F920005F00025E02F00DC000025E02F00DC90031 ++:10F93000025E02F00DBD03BFDE02F00ACE01885E5A ++:10F940000610D08601025E070017A101825E8610B4 ++:10F95000D08601BC600306778000B00DEF001781F0 ++:10F960000288421B000CFE00B00DEB0017810068FE ++:10F970005E07000D0000025E02F00DAE020B421B9E ++:10F98000000D0203BFDE02F00D03018B20A210D098 ++:10F99000860002DE02F0000000B054130017A1023E ++:10F9A00000DE07000D0B00B0418B00106501BC604C ++:10F9B0000301D7A100025E02F011A200E05E840004 ++:10F9C000F7A103BFDE02F00D10020480F3000D105A ++:10F9D00002025E07000D1002805E07000D1000900D ++:10F9E000001B0037A200E85412F457A10002DE0207 ++:10F9F000F00000020400BF000D1400025E02F00ED1 ++:10FA0000B803BFDE02F00D1500A044B6F0B145000A ++:10FA100002DE02F00000020000BF000D260068AC0C ++:10FA20000F000D2600E05EA30037A8006D5EA00564 ++:10FA3000CD2600B02CB70017A100025E02F000BF77 ++:10FA400000B040670017A20068DEA3FFED2300B0FE ++:10FA50005E8965D7A2006D00A7008D22006DA0A36E ++:10FA6000004D2403BFDE02F00D230068A0A3000DAB ++:10FA70002400B85E8965D7A200025E02F000C501CD ++:10FA8000BC60030017A80002DE02F0000000D85A94 ++:10FA9000030117A201B85A06F457A200B05603009A ++:10FAA000083C00B0560700083D00B0560B00083E69 ++:10FAB00000B0560F00083F00B0561300084000E0A9 ++:10FAC0005612F4484100B05A0300083A01385E8BE0 ++:10FAD00000083B00B021070017A401BC6003001719 ++:10FAE000A200B0419300106500B85E92D017A40048 ++:10FAF000E05E06F4506300F05E930017A300F05E32 ++:10FB0000930077A400E05E8B0037A200B85E92F409 ++:10FB100077A400E04192F4506500E05602F495802D ++:10FB200000B056030017A4006EDE8B00AD3400B8A1 ++:10FB30005E92C0D7A200D85E8B0037A200E020F210 ++:10FB4000F4483C00B020F30017A400B85E92C0F760 ++:10FB5000A200D85E8B0037A200E020F6F4483D00FA ++:10FB6000D820F70037A200E020FAF4483E00D82061 ++:10FB7000FB0037A200E020FEF4483F00D820FF0041 ++:10FB800037A200E02102F4484000D821030037A248 ++:10FB900000E02106F4484100B021070017A200B898 ++:10FBA0005E8AC017A200905E8B0037A201BC5E89FE ++:10FBB00007683B0002DE02F00000018060063C9115 ++:10FBC000E4018760063CD1E601A860023CD1E60171 ++:10FBD0008B60023CD1E600B05E8F00106300B0562F ++:10FBE000030011E700B056070011E700B0560B0004 ++:10FBF00011E700B0560F0011E701A960423C91E403 ++:10FC000001A860023CD1E6018B60063CD1E600B061 ++:10FC10005E8B00106301BC60030057A10204560311 ++:10FC2000000D6201BC60030117A100E0418EF430B9 ++:10FC30006300B056030011E700B056070011E7005B ++:10FC4000B0560B0011E700B05E8B00106301BC6082 ++:10FC50000300B7A10204D603000D6C01BC600301D0 ++:10FC600017A102065E53000D6C01BC60030197A151 ++:10FC700000E0418EF4306300B056030011E700B09D ++:10FC800056070011E700B0560B0011E701BC6003F6 ++:10FC90000017A10206DE53000D7700B05E8B001046 ++:10FCA0006302065E53000D7600A0563F01F7A103E4 ++:10FCB000BFDE02F00D7700A0563301F7A100B05E61 ++:10FCC000870011E701BC60030011E70002DE02F0CB ++:10FCD000000000685E9B00CD9401BC60070211E348 ++:10FCE0000068DE9B004D8700E847870111E101BCF9 ++:10FCF00060030011E201BC60030011E201BC60037B ++:10FD00000011E201BC60030011E201BC60030011BC ++:10FD1000E201BC60030011E201BC60030011E201DA ++:10FD2000BC60030011E200B06142F451E000B05841 ++:10FD3000030011E200B058070011E200B0580B00B8 ++:10FD400011E200B0580F0011E200B058130011E2A8 ++:10FD500000B058170011E200B0581B0011E200B0CB ++:10FD6000581F0011E200B05E9B0017A40068DE9BE4 ++:10FD700000AD9201BC60030077A40192DE930217EC ++:10FD8000A30002DE02F0000001BC60070011E300E6 ++:10FD9000B058030011E200B058070011E200B0585B ++:10FDA0000B0011E200B0580F0011E200B058130030 ++:10FDB00011E200B058170011E200B0581B0011E228 ++:10FDC00000B0581F0011E200E00146F0106401BCD1 ++:10FDD00060070031E300B058030011E200B058079B ++:10FDE0000011E200B0580B0011E200B0580F0011F2 ++:10FDF000E200B058130011E200B058170011E20001 ++:10FE0000B0581B0011E200B0581F0011E20192E04F ++:10FE10001B0017A30002DE02F00000028740C300AF ++:10FE20000DA901866006F01030028640C3000DABBC ++:10FE300000B040C70017810002DE02F00000028718 ++:10FE400040C3000DAE00B05E070010310186E00631 ++:10FE5000F010300002DE02F00000006800A701127E ++:10FE6000E003BFDE02F00DC800025E02F00DB70035 ++:10FE7000025E02F00DC90002DE02F0000000680020 ++:10FE8000A70112A90002DE02F0000001816006094C ++:10FE90003049006800A7008DBC00025E02F00DD959 ++:10FEA0000002DE02F0000000025E02F00DD90181C6 ++:10FEB00060020930490002DE02F000000188E00E15 ++:10FEC00009304900B0412700180000B0002B001095 ++:10FED000020002DE02F0000001BC6003001002011B ++:10FEE00082E0020F107801BC600300104900B041AD ++:10FEF000270018000002DE02F00000006800A701E1 ++:10FF00000DCA0280DE53000DD001BC60130777A13B ++:10FF100000025E02F000BF019060020337A20002FF ++:10FF20005E02F000C50002DE02F0000001BC6013BA ++:10FF30000797A100025E02F000BF0190601E033728 ++:10FF4000A200025E02F000C501BC60130777A100A9 ++:10FF5000025E02F000BF0190601E0337A200025E45 ++:10FF600002F000C50002DE02F000000100DE5300D6 ++:10FF700017A60181DE9A09304900B0412700180018 ++:10FF80000002DE02F000000002DE02F0000000B01D ++:10FF900044670017A2017D5E8A2357A300B01C7737 ++:10FFA0000017A100B85E84E3D7A2025A5E8B000D51 ++:10FFB000E60180E006F4271E01825E86F297940037 ++:10FFC000B05E8F00071B02001C7B000E2D00E85E58 ++:10FFD0008CE377A2006D5E88E38E2D00E04467021B ++:10FFE00087210285C523000E2A0020E3FE090E2A80 ++:10FFF00001BC60130997A100025E02F000BF006817 ++:020000023000CC ++:10000000C067000E2A01BC60131617A100025E0231 ++:10001000F000BF0068C067000E2A01BC601309D75A ++:10002000A100025E02F000BF0068C067000E2A0156 ++:10003000BC63FF1FF7A10068DE862C2E2A02009CFD ++:100040007B000E1E0180E000E3C71E01BC60230F91 ++:1000500057A100025E02F000BF00B040670077A425 ++:1000600000B05E930017A200025E02F000C501BC62 ++:10007000601B1B57A100025E02F000BF0181E00679 ++:100080000337A20186E006F457A200025E02F000E8 ++:10009000C501BC601714D7A101BC600300B7A20062 ++:1000A000025E02F000C501BC60171457A101BC60DC ++:1000B000031877A200025E02F000C501BC601714AD ++:1000C000B7A101BC600300F7A200025E02F000C508 ++:1000D00001BC60171077A101BC600F0417A20002D9 ++:1000E0005E02F000C501BC60171097A101BC60035F ++:1000F0000017A200025E02F000C501BC601710B735 ++:10010000A101BC600B0017A200025E02F000C50155 ++:10011000BC601710D7A101BC60030017A200025EEB ++:1001200002F000C501BC60171017A101BC600B00F4 ++:1001300037A200025E02F000C501BC60230F57A188 ++:1001400000A85E930077A200025E02F000C501BC29 ++:1001500060171017A100025E02F000BF02004067A6 ++:10016000000E23006CC464E42DEA03BFDE02F00E2F ++:100170002A01BC60171277A100025E02F000BF00E6 ++:1001800068C0671FEE2A01806000E3C71E01BC60E3 ++:100190000300904301806000E3C71E01826002F209 ++:1001A00097940180E004E3C71E01BC600300071AB6 ++:1001B00003BFDE02F00E2D0002DE02F0000002019D ++:1001C000C11F000E4002855EAF000E330185600640 ++:1001D000F577AB00B0446700082500B0446B000819 ++:1001E0002600E9446504B7A100E8C46904D7A20069 ++:1001F000D05E870077A101E1DE8AF437A200E95ED4 ++:10020000862697A100E8DE8A26B7A200695E8B00E9 ++:100210000E4001BC610300113300E144DAF43136D1 ++:1002200000E144DEF4513701856002F577AB01BC93 ++:10023000600301104701BC60030050430002DE026E ++:10024000F0000000B0451F00178100B005B700178F ++:10025000A601BC600704106401BC601311106501A5 ++:10026000BC60030017A10205DEAF000E5900B058B4 ++:100270000F00178000685E842C2E6102005E9B00D8 ++:100280000E590280DA03000E4F0118581F00178222 ++:1002900000E05E0B00378201985E0AC0F60703BFDC ++:1002A000DE02F00E52011A581F00178200E05E0BAA ++:1002B000003782019A5E0AC0F60701F0DE030037BC ++:1002C0008000A05E02C0578000B05E0300160300ED ++:1002D000A044B6F0178200B05E0B00160500E05E89 ++:1002E0000AC0960603BFDE02F00E6100B05813008C ++:1002F000178200E85E06F057A5006ADE97000E5FE1 ++:1003000000E85816F4B6050069D817000E5F01BC66 ++:10031000600300160500B058170017A500E058123A ++:10032000F4B60600E0419302106400E0419706D065 ++:100330006500E05E870037A100905E9B0037A60055 ++:1003400068DE87008E4601BC600300114701BC6077 ++:100350000300016D0002DE02F0000001BC6003003A ++:10036000016C01BC600300016D01BC60070A1064F0 ++:1003700001BC60030077A100B0428F00178000A08D ++:100380005E0301F78000B05E0300016E01BC63FFF5 ++:100390001FF7A20068DE03000E7301BC60030017A4 ++:1003A000A200886006F43781002005BAF02E78009C ++:1003B00068DE8AC0CE7800E005B300216C00B0058D ++:1003C000B6F0216D00685E03000E7C00205E06F032 ++:1003D0000E82006EDE8AC0CE8203BFDE02F00E7D8A ++:1003E000006DDE8AC0CE8200B05E870017A300B029 ++:1003F000419300016600B0581B0017A201BC6003C6 ++:1004000000016C01BC600300016D00E84193021023 ++:100410006400E85E870037A10069DE87000E730084 ++:10042000B05E8F0001650002DE02F0000000B00542 ++:100430009B001064006E581B002E8B00E0581B00C0 ++:10044000314503BFDE02F00E8C00B0581B00114591 ++:1004500000B0059B00016200B0059700016100B08B ++:10046000580F00178500B0580700178300B0580BCD ++:100470000017840118581F00178C011A581F001705 ++:100480008D0002DE02F0000000B00597001780002A ++:10049000685E002C2EB701BC600300111201BC6025 ++:1004A0000300111500B0059B0010640200452300F5 ++:1004B0000EA100B0451F00178100E80592F03780BB ++:1004C000006ADE03000E9F00B05E0300114503BF0B ++:1004D000DE02F00EA201BC600300314503BFDE0264 ++:1004E000F00EA200B0059300114500B00583000195 ++:1004F0006900B0058B00016A00B0058F00016B0038 ++:10050000B0058700016800B005AB00106502845A91 ++:100510001F000EAB00B05E1700168301985E32D04C ++:10052000F687019A5E36D0F68701846002D0F6879E ++:1005300000B0059300016000B0059B00016200B0AF ++:10054000059F00016300B0059700016100B0058BB5 ++:1005500000106400B0580F00178500B0580700174E ++:100560008300B0580B0017840198581EF1978C0136 ++:100570009A581EF1B78D03BFDE02F00EB70002DEFF ++:1005800002F0000000B0058B001064006E41932A59 ++:100590000EC500A044B6F0B7A100B05E87001605F6 ++:1005A00000E05812F4360600B0581B001145020056 ++:1005B00000F3000EC2006D4193280EC20200DEAFB0 ++:1005C000000EC201BC600B02514200B05E87000108 ++:1005D0006F02015EAF000EC500B05E17001603018A ++:1005E000816002F577AB0002DE02F00000020145F7 ++:1005F00023000ED00287C493000ED001826002F562 ++:10060000D7AE02012C43000ECD00E02C4B002B1284 ++:1006100001816001620B1002055EB7000ED000E0A0 ++:100620002AF7002ABD01856002F5B7AD0002DE029F ++:10063000F00000020200BF000EDE00025E02F00FBA ++:10064000000202DEB3000ED60020428F000C4C03E5 ++:10065000BFDE02F00002028881AB000EDE02845E83 ++:10066000FF000ED402845EB3000ED40282DEFF00CF ++:100670000ED402822B4F000EDC00682ABB000EDE77 ++:100680000284DEAF000ED402835EB7000ED400B049 ++:100690005E870017A10002DE02F000000182E00286 ++:1006A000F597AC0203DEFF000EE802844523000E3E ++:1006B000E802012B4F000EE80180E006F29794005B ++:1006C000025E02F00DD90180E002F2979400025E12 ++:1006D00002F00DD90180E002F29794028400C70075 ++:1006E0000DB203BFDE02F00DB4020400C7000EF22B ++:1006F0000284C56F000EFE02844523000EEF020047 ++:100700004203000EFE00685E4B04AEFE00685E4BC6 ++:1007100006AEFE00685E4B062EFE0182E006F597EF ++:10072000AC02844523000EF50323DE02F00EF60131 ++:1007300083E006F597AC0180E006F297940284000E ++:10074000C7000DB200B02AF70017A2006DDE89566F ++:100750000DB202872B4F000DB402005EFF000DB2F8 ++:100760000287AB4F000DB403BFDE02F00DB20002F2 ++:10077000DE02F00000020200BF0012FD00682B0B39 ++:10078000000F0500E844655857A101BC63F71D1729 ++:10079000A2006D5E86F44F0500E84466F44AC2008C ++:1007A0006CC465576F0700E84467002ABB028045A8 ++:1007B0006F000F430203DEB700103D0183E002F536 ++:1007C000B7AD0202DEB3000F0D018360062B915C12 ++:1007D00000025E02F00EE002835EBB000F1000E834 ++:1007E00045895BF7A1006E5E8555AF280204DEB730 ++:1007F000000F2400E02BB7002AED01BC6003000AC3 ++:10080000EF00682C67000F1500E82C67002B19001B ++:10081000B02BB70017A201856002F5B7AD0204DE68 ++:10082000FF000F1A006D5E895DCF1A0184E002F7A8 ++:10083000F7BF0206DEFF000F2400E02BE7020AF9F3 ++:1008400000B04467000B0401182BE70017A1011A40 ++:100850002BE70017A2006E5E87000F22006DDE8975 ++:100860005F4F2203BFDE02F00F2401BC6003000AC9 ++:10087000F90186E002F7F7BF02025EFF00103D00BB ++:1008800068AB0B00103D00B02AE7000AC20002DE90 ++:1008900002F000000182E002F7F7BF02025EFF00F3 ++:1008A0000F35020600C7000F2E02802BF3000F2E1B ++:1008B00000B02B4B0017BB006E2B22F7703D0202DD ++:1008C0005EFF000F3500E845895BF7A1006DDE850E ++:1008D000614F3300E844656177A1006D5E85618FEB ++:1008E0003500B04467000AC20002DE02F0000002D8 ++:1008F00004DEB7000F3D00E8446556CABE00682C10 ++:1009000067000F3900E82C67002B1900E02BBF00AF ++:100910002AEF00B02BC30017A1006D2BBEF42F3DB2 ++:1009200001BC6003000AED0068AB1700AF4000B0E7 ++:100930004467000AF700B0446B000AFB0068AB177D ++:10094000012F4200B04467000B130002DE02F000EA ++:10095000000203DEB7000F4A0282DEB300103D0240 ++:1009600003C57300102F00E844655737A1006D5E82 ++:100970008556B03D01836006F5D7AE03BFDE02F0B9 ++:10098000103D01BC6003000ADF006D45871F4F4D1D ++:1009900000B04587000ADF00E044655BF7BB00E874 ++:1009A0005EEE2C2AB901836002F5D7AE0183E00622 ++:1009B000F5B7AD0184E002F5B7AD01826002F7F74B ++:1009C000BF01846002F5B7AD0101456F0017A101B9 ++:1009D000875E86F577AB01BC6003000B0D00025EFD ++:1009E00002F012FE00E844655737A1006D5E855E97 ++:1009F000CF58006D5E8556AF5C00E02B83002AE087 ++:100A000000B02AB30017B3028600C7000F690206C0 ++:100A100080C7000F6002075EAF000F63020680C749 ++:100A2000000F650184600561AB0D03BFDE02F00FAE ++:100A30006501826006F7F7BF00B02AE7000AC1022D ++:100A400000C56F000F6901846006F5B7AD02048030 ++:100A5000C3000F690184E00561AB0D01BC600300B8 ++:100A6000117800B045E300180000B045E7000ACC5B ++:100A700001BC600300317800B045E300180000B00D ++:100A800045E7000ACD01BC600300517800B045E3A2 ++:100A900000180000B045E7000ACE0184600006009F ++:100AA000300207AB3B000F75018460040600300084 ++:100AB000B02B330017BB012A5EEF000AC501BC60F2 ++:100AC000131C57BB021E2B33000F7C011E2B33005F ++:100AD00017A60080DE9AF777BB00B041B70017B3C6 ++:100AE000006E2B1701EF800088600558B7BB00200F ++:100AF000DEED5D4F8303BFDE02F00F8600E82B17AB ++:100B00000217BB00886006F777BB00205EED5D6FC3 ++:100B10008601846006F5B7AD020480C3000F86012C ++:100B200084E00561AB0D006E2B1701EF8D006D2B7E ++:100B300017004F8A006E2B17006F8A0068AC6700A1 ++:100B40000F910088600558B7BB0020DEED5B8F90E9 ++:100B500003BFDE02F00F9100E82B170217BB0088DD ++:100B60006006F777BB00205EED5BAF910184600506 ++:100B700061AB0D0068AB1702EF97010DAB370017A3 ++:100B8000A1010EAB370017A200685E87000F970027 ++:100B9000E05E86F457A100E05E87080AC50068ABF6 ++:100BA0001700AFA102075EFF000FA1012C2B3B0035 ++:100BB00017A3006DDE8D612FA100685E8F000FA16D ++:100BC0000280AB37000F9F0183600561AB0D03BF4F ++:100BD000DE02F00FA100B02BFB000AF800B0446B5E ++:100BE000000AFF0068AB17012FAE0281ABF3000FC4 ++:100BF000AE01BC6003000AE200682C4F000FAE009B ++:100C0000E844656277A1006D5E85628FAB00B02C11 ++:100C1000530017A200E05E8962B7A2006DDE86F481 ++:100C20004FAD0200AC43000FAE0185600561AB0D16 ++:100C300003BFDE02F00FAE0180E001620B1000681E ++:100C4000AB17010FB100B02AE7000AD90187E0060F ++:100C5000F7F7BF0207DEFF000FB30181E00561ABCC ++:100C60000D00682B17002FB700682B1701EFB70096 ++:100C7000682B17030FB70068AB17008FC0018260A5 ++:100C800006F7F7BF00B02AE7000AC10068AB1703F8 ++:100C90000FBD00B00013000AC500B02B9F000AC8AA ++:100CA00003BFDE02F00FBF0068AB17008FC0011A50 ++:100CB0002B37000AC800B02AE7000AD00202DEBBC8 ++:100CC000000FC60284DEFF000FC30206DEFF000F26 ++:100CD000C600B02BB70017A1006DDE855DCFC60141 ++:100CE00082E00561AB0D00E05ECD55B7B3018260D7 ++:100CF00002F5D7AE00B02C4B0017A100B02AF700C8 ++:100D000017A2006D5E89560FCD02855EB7000FD623 ++:100D100003BFDE02F00FCF006D5E8560EFD8028169 ++:100D20002C43000FD600B0440B0017A300B0440FB3 ++:100D30000017A200E95E8E2337A300E8DE8A23575E ++:100D4000A200695E8B000FD80068DE8B000FD80010 ++:100D50006E5E8EF66FD801826006F5D7AE00025E39 ++:100D600002F01143020600C7000FE601BC60131C2D ++:100D700057BB012C2B3B0017A20080DE8AF777BB04 ++:100D800000B041B70017A200682B17004FEE0068B3 ++:100D90002B17024FEE00682B17026FEE00682B171F ++:100DA000006FEE00682B17084FEE00682B17086FD6 ++:100DB000EE00682B17088FEE03BFDE02F00FFB0377 ++:100DC000BFDE02F00FEE02045EB7000FFB020680EA ++:100DD000C7000FE902075EAF000FFB00682ADB00C7 ++:100DE0000FF400E8446556D7A201BC60371597A3FD ++:100DF000006D5E8AF46FFB006E5E895D8FFB01847F ++:100E0000E006F5B7AD00685E8B000FF400B05E8BB6 ++:100E1000000AAE0182E006F5D7AE006E5E89610F72 ++:100E2000F40182600561AB0D00E844655737A1000D ++:100E3000B044670017A300E85E8EF42AB60068ABE2 ++:100E400017088FFA00B02BCB0017A200E82ADAF4BB ++:100E50004AB601846002F7F7BF0282DEB300103D9C ++:100E60000203C57300102F00B02ACB0017A200B0F8 ++:100E70002AD30017A3020600C70010090068AB17A9 ++:100E800000900902802BF300100900B02B230017FB ++:100E9000A1006D5E855970050180E00561AB0D0014 ++:100EA000685E8700100900682C0700100900B02C4C ++:100EB000070017A200B02C0B0017A300685E8F007C ++:100EC000100F00682B0B00100F00E844655857A165 ++:100ED00000E05E8EF457A2006D5E86F4500F018133 ++:100EE000600561AB0D0281AB4F00101402005EFF84 ++:100EF0000010140204452300101403A0DE02F010B9 ++:100F0000140183E00561AB0D028080BF00103D023B ++:100F1000825EBB00103D02822BF30010290281ACDF ++:100F2000370010290280AC3700102902812C3700CD ++:100F3000102902822C37001029028881AB00102969 ++:100F40000282AC3700102202802B37001029028366 ++:100F50002C3700102202852C3700102202842C37F7 ++:100F60000010290284AC370010290283AC3700102E ++:100F70002902835EB70010280204DEAF00102802A9 ++:100F800081DEBB0010280184E002F577AB00025E31 ++:100F900002F0112A03BFDE02F0103D0183E0022BB4 ++:100FA000915C020701AB00102C0180E00209D04ED9 ++:100FB00001BC600318517800B045E30018000180BF ++:100FC00060022F317900E844655737A1006D5E85D6 ++:100FD00055B03D028101AB001035020081AB00101D ++:100FE0003702842C370010370280AC3700103701ED ++:100FF0008360022B915C03BFDE02F0103D01836031 ++:10100000022B915C00025E02F00EEB02835EB700E1 ++:10101000103D0184E006F577AB00E02B47002AD1B4 ++:1010200003BFDE02F011120002DE02F000000184B4 ++:10103000E002F5B7AD01836002F5D7AE0182E002B0 ++:10104000F5D7AE0182E002F7F7BF0184E002F7F7BF ++:10105000BF01BC6003000ADB01BC6003000AD001D1 ++:10106000BC6003000AC801876001606B030002DEF8 ++:1010700002F00000020200BF0010740283DEFF00D5 ++:1010800010830183E006F7F7BF01BC600302115D26 ++:1010900000B02AB700115E018560060B705B018508 ++:1010A00060060BF05F0280456B001055018B6002FB ++:1010B0002B915C01BC600318517800B045E3001827 ++:1010C00000018060022F31790188600E2B515A0097 ++:1010D000682ADB00105801846006F7F7BF01BC6086 ++:1010E00003000AB600025E02F0103E00E8446960A8 ++:1010F000D7A1006EDE8700306200B02BF7000AF83F ++:1011000001BC6003000AF700682B0B00106200B0FE ++:101110004467000AC100E84465564AC200B02AD3B9 ++:101120000017A100E82B0AF42AC2028080BF001039 ++:10113000680281DEBB00106F0200456F001068027C ++:1011400083C57300106801BC63FF1FF7A10068C569 ++:1011500086F4306F018B600E2B915C01BC6003182C ++:10116000517800B045E3001800018B2B4E2F3179E8 ++:101170000183E002F5B7AD0184E002F577AB03BF70 ++:10118000DE02F0111D018360022B915C00025E0201 ++:10119000F00EEB0183E006F5B7AD0184E006F577CC ++:1011A000AB03BFDE02F0111D018D60020BF05F0189 ++:1011B00088600E2B515A028181AB00107C018B603C ++:1011C000062B915C01BC600318517800B045E30028 ++:1011D0001800018060022F317903BFDE02F0108019 ++:1011E000018B60022B915C01BC600318517800B048 ++:1011F00045E3001800018060022F31790183E0028D ++:10120000F5B7AD0184E002F577AB00025E02F010A5 ++:101210003E0002DE02F0000000B0446B000B06024C ++:1012200002DEB3001088018360062B915C00025E31 ++:1012300002F00EE0020200BF0010960183E002F708 ++:10124000F7BF0203C573001091020080BF00109128 ++:10125000018B600E2B915C01BC600318517800B0CB ++:1012600045E3001800018B2B4E2F317903BFDE02BE ++:10127000F01095018B60022B915C01BC600318514A ++:101280007800B045E3001800018060022F31790139 ++:1012900082E002F597AC0002DE02F0000001BC60C3 ++:1012A0000300701001BC63FF1FF0C501BC63FF1F8A ++:1012B000F0CB00B040470010E500B040470010EB15 ++:1012C00001BC600300901001BC63FF1FF0C601BCAD ++:1012D00063FF1FF0CC00B040470010E600B040476D ++:1012E0000010EC01BC600300B01001BC63FF1FF0F4 ++:1012F000C701BC63FF1FF0CD00B040470010E700FE ++:10130000B040470010ED01BC600300101000B04079 ++:101310004300180001BC63FF1FF0C800B040470045 ++:1013200010E801BC600300301000B040430018001A ++:1013300001BC63FF1FF0C900B040470010E901BCC9 ++:10134000600300501000B0404300180001BC63FF70 ++:101350001FF0CA00B040470010EA0002DE02F000B1 ++:101360000001BC60030037A20020E3FE0910F10079 ++:1013700020E0420D90F1028042030010F10284450A ++:10138000230010F103915E02F010F10068AB6F00D2 ++:1013900010F10282DEFF0010F102805EFF001126D4 ++:1013A000020180C700111D0282DEB30010F10204A9 ++:1013B00080C70010DE00685E8B0010CA00B02BA34F ++:1013C0000017A1006EAB8AF430CA0203C573001087 ++:1013D000DE00682ABB0010C900682ADB0010CA00C2 ++:1013E000E8446556D7A100E82ABAF437A1006ADEBE ++:1013F0008555F0DE006ADE855B50DE00682B070055 ++:1014000010DE0203DE530010CD00B02BA7000AAFA0 ++:1014100003BFDE02F0111D01BC600302579201BC44 ++:1014200063FF1FF0C301BC60030910E301865E8AFD ++:101430001C70E3018460061C70E300682B0F001031 ++:10144000D40185E0061C70E301BC600303978200B1 ++:10145000025E02F010FB01BC63FF1FF0C400B05439 ++:10146000130010E400E043915C30E400025E02F0FF ++:10147000109701BC60030010EE01BC63FF1FF0CEAB ++:1014800000E02B0F002AC303BFDE02F010EB028343 ++:101490005EB70010F100025E02F000F100B05ECF16 ++:1014A0000010E400682ABB0010E800B02AFB00101E ++:1014B000E40280456F0010E800E8446556D7A100BB ++:1014C000E82ABAF437A100695E870010E800E05E00 ++:1014D0008557D0E401BC600301D78200025E02F0B0 ++:1014E00010FB03BFDE02F010EB00B00047001086D7 ++:1014F00000025E02F0119500025E02F00CF701900E ++:10150000600A09104801846006F597AC01BC61339C ++:101510000070800002DE02F0000002805EFF00101A ++:10152000F60281DEBB0010F6020180C700111D0229 ++:101530000480C700111D01806002F7F7BF0280C25E ++:101540008F00111E0201DEBB00111E01BC600300F2 ++:1015500017A203BFDE02F010B401BC63FF1FF0C08E ++:1015600001BC63FF1FF0C10285DEFF00110B0068A4 ++:101570005E4B06310400B02B570017A1006DAB0E77 ++:10158000F4310B01BC600301378000B02B5B001706 ++:10159000A1006D2B0EF4310602812BF30011060120 ++:1015A000BC600301778001BC600300378100025EEC ++:1015B00002F000CC01D2DE0AA030E000B0540B00F3 ++:1015C00010E103BFDE02F011110280ABF300110441 ++:1015D00001BC600301578001BC6003001781000259 ++:1015E0005E02F000CC00B054070010E000885E0BF3 ++:1015F0000070E10002DE02F0000000682B13001111 ++:101600001D0204DEAF00111D00E844655897A400D8 ++:101610006E5E9155F11D00885E930037A4006D5EEB ++:101620009155F11D00025E02F0115303BFDE02F07E ++:10163000112A00E844655897A400885E930037A4F7 ++:1016400000025E02F0115303BFDE02F0112A028491 ++:10165000DEAF0011210181E002F5D7AE03BFDE024B ++:10166000F0112A00682B8700112600E044655C2AEF ++:10167000DB00682B8B00112500E044655B4ADB0032 ++:1016800002DE02F0000001806006F7F7BF00682B61 ++:101690001300112A00E844655897A400025E02F086 ++:1016A000115301846002F597AC01BC6003000AC4C9 ++:1016B00001BC6003000ADB01BC6003000AC3010433 ++:1016C000DEAF0017A101835E86F5B7AD0284DEAF01 ++:1016D000001133018060060D906C0002DE02F00004 ++:1016E00000028600C700113502025EFF00113B00B8 ++:1016F000B02AAF0017A3020400C300113800B02ABB ++:10170000CF0017A30202DEBB00113A00B02AAB00E3 ++:1017100017A300E04466F46ABB00B04467000B0BFB ++:101720000183E0022B915C020701AB00113F0180B5 ++:10173000E00209D04E01BC600318517800B045E3C7 ++:10174000001800018060022F31790002DE02F000F3 ++:10175000000202DEB3001146018360062B915C009B ++:10176000025E02F00EE00203C57300114B0284DE3C ++:10177000AF00114B0281DEBB00114B02805EFF0007 ++:10178000114B02035EB7001152018B600E2B915C6E ++:1017900001BC600318517800B045E3001800018BCC ++:1017A0002B4E2F317901836006F5B7AD0184E0023D ++:1017B000F577AB01BC6003000AC30002DE02F00053 ++:1017C0000000682B7B00115500B02B7B0017A40094 ++:1017D0006D5E9156515700B02ACB0017A400882B9C ++:1017E000270037A500E82B2AF4AACA00885E9300D8 ++:1017F00037A400E02B2AF48ACA00902B2B00AAC938 ++:1018000000B02B27000AAF0002DE02F000000286C3 ++:10181000410700115E01BC60130917A100025E02BE ++:10182000F000BF018760060337A200025E02F000ED ++:10183000C500B05E870017A100B05E870017A10049 ++:10184000B05E870017A101876002F457A200025E14 ++:1018500002F000C501BC60130957A100025E02F04E ++:1018600000BF018060060337A200025E02F000C5DF ++:1018700000E002B30020AC01806002F457A2000235 ++:101880005E02F000C501BC60270857A100025E029D ++:10189000F000BF0068C06701F17601BC600300176B ++:1018A000A200025E02F000C501BC600301F7A200C5 ++:1018B000025E02F000C50002DE02F0000003905E4E ++:1018C00002F0118A03875E02F0118A0390DE02F0B3 ++:1018D000118A020445230011810283C21F00118A6C ++:1018E0000068A0B700117E00B0446700082D00E832 ++:1018F000446505B7A1006E5E877D118503BFDE02DA ++:10190000F0118B0286C03700118A00E0446700D7CF ++:10191000A10206403700118A006CC466F4318300CE ++:10192000025E02F00B1900025E02F0115E01BC6063 ++:101930000300082D00025E02F00ADC03BFDE02F0A5 ++:10194000000201BC600300082D0002DE02F000006E ++:101950000280420300119402854523001193028501 ++:10196000DEB70011910185E006F5B7AD00E0446BEC ++:10197000002B21006CC46964319400025E02F011F6 ++:101980005E0185E002F5B7AD0002DE02F000000165 ++:101990000C81430017A101BC600300508A00685EFF ++:1019A0000700119900685E8700119900685E0700C2 ++:1019B00011A10190422AA1308A00685E070031A17E ++:1019C0000190422AA0108A0109DE030017A2018FAC ++:1019D0005E8A11508A00685E8B0011A10191E00EB1 ++:1019E00011508A0002DE02F000000109DE03001738 ++:1019F000A400E05A06F497A500905E96F497A5021D ++:101A000003DE030011A90282DE030011A901BC61FB ++:101A1000EF0857A60080DE96F4D7A50116DE8700F2 ++:101A200017A300885E870077A100E15E8702D7A137 ++:101A300000E0DE8F0017A301BC60030017A2020EB6 ++:101A40005E030011B001BC60030037A200905E96F7 ++:101A5000F457A50080DE96F437A100E141B7FFF707 ++:101A6000A600E1DE8701F7A10080DE96F477A300EF ++:101A7000E1DE860DB7A100E0DE8F0017A3017A5EDC ++:101A800086F477A100885E86F457A100B05E8700D7 ++:101A900017A20287DE030011BD00885E870057A1F0 ++:101AA00003BFDE02F011CA02875E030011C401BC4D ++:101AB000639B0CD7A50080DE86F4B7A100E141B797 ++:101AC000FFF7A500E0DE870017A100885E870057BA ++:101AD000A103BFDE02F011CA00885E870057A10192 ++:101AE000BC639B0CF7A50080DE86F4B7A101BC6245 ++:101AF000030017A500E141B6F4B7A500E0DE8700BA ++:101B000017A100E05E8400D7A10002DE02F0000011 ++:101B10000200200F0000020282DE530011D2018871 ++:101B2000600204902400E020AEF3082B00E820AA15 ++:101B3000F3082A03BFDE02F0098A01B86016049098 ++:101B40002401BC600301D02503055E02F011E4020C ++:101B500087C037000A8A0386DE02F00A8B00025E25 ++:101B600002F00EFF00025E02F01177035CDE02F06D ++:101B700011D400D8409B0117A100E05E870237987E ++:101B800000A85E630077980102DE530017A101826E ++:101B9000E002F297940188DE85006803006EA0AA37 ++:101BA000F311E400E85E6301D02501B860060490FB ++:101BB0002403BFDE02F0000201816005006803011A ++:101BC000B8600A04902403BFDE02F0000202285E1F ++:101BD000870011FA00B041930017A400E041930080 ++:101BE0007064010A5E870017A200E84192F4506316 ++:101BF00001185E870017A100E86042F437A2008850 ++:101C00005602F436000068418EF491F600E8418FE8 ++:101C100000306300E8419300306400685E8B02117D ++:101C2000EE00905602F457A300B05806F476010374 ++:101C3000BFDE02F011EE00684192F491FA00E84133 ++:101C40009300306401BC600300160003BFDE02F0A5 ++:101C500011F600B05E870017A10002DE02F000005E ++:101C60000180600286143000B050CB00106501384E ++:101C700050830017A10068DE3B06320200E05A33B1 ++:101C800000368C006EDA32F4200200B05A0B0017D6 ++:101C9000A200E001F700207D00E001D2F4407401D1 ++:101CA000BC63FF1FF7A300B050CF001064006EDAD2 ++:101CB00032F4320900B05A370017A300B0581300AD ++:101CC000178201BC600300160401BC601B09D7B673 ++:101CD0000102D0C70017A100E04196F4306500E092 ++:101CE00050CB00D06401BC60030017B401BC60039A ++:101CF00000178001BC600300378101876004031076 ++:101D0000A0009052330097A400E0418701B7B500CE ++:101D1000685ED2F0523000E05EDAF690630020D8C0 ++:101D200002F03224020250C700122A00905603002B ++:101D300097A100E85E86F497A1019E6002F437A1A6 ++:101D4000006DDE8708122A010A5E870017A201DAF9 ++:101D50006002F437A100E05ED6F4506300886006AC ++:101D6000F437A100205602F4322A00B05802F036AF ++:101D70000000E05A2B00368A006ADED2F472260098 ++:101D800068DED2F0122B00E05E0300378000685E50 ++:101D90000300322B0186E0040310A003BFDE02F033 ++:101DA000122B006ADED2F4722600E05ED30037B454 ++:101DB00000D05E0700378102985ED300121500E064 ++:101DC000419300306403BFDE02F0121500685E0329 ++:101DD00000000203BFDE02F005CA0282D0C7001273 ++:101DE0003A00B02A4F0017A101B82A4AF4368401FC ++:101DF000025013001685013C50830017A100B0501B ++:101E0000A70017A4006D5A32F432430182E006861F ++:101E100034310288502B00123F00B05A330017A112 ++:101E2000019E5E8684F427018360068634310002B9 ++:101E3000DE02F0000000B050730017A101B8506E30 ++:101E4000F436840106D00700168500B050AB0017A9 ++:101E5000A400D06006C0978000E0419700D7B5018C ++:101E60000A58130017A100E05ED6F437B500B05849 ++:101E70000F001063011656030017810068D8130085 ++:101E80001258011400630017A10068DE8700124E8B ++:101E90000088013B01168003BFDE02F01253006888 ++:101EA000DE8700725100A0013BE0168003BFDE0216 ++:101EB000F0125300E05E8709706200885403011637 ++:101EC0008000E85A0330168001BC600300168101CF ++:101ED000BC600300168201BC600300168303BFDEF2 ++:101EE00002F0125D00E0418EC09063006EC18EC0B2 ++:101EF000325D00E8418EC0306300E858030037A12E ++:101F000000E0418EF43063013850A30017A500684B ++:101F1000581303F2780068418EC05278006DDA0AD7 ++:101F2000F4B278011656030017A10068DE86F0327D ++:101F300078015856030017A100E05E870DD7A20074 ++:101F4000B05ED70010620020DE02A0126F00E05EDB ++:101F500086D037A300E05E8ED077A3006D5A02F4DE ++:101F60005278006E5E8EF4927800E86002F4368358 ++:101F700000B05E8F00168100A05A0F00768300E04B ++:101F80005A0B00368200E85A02F4568000D05E03F5 ++:101F900000378000E0581300360400E0418F003025 ++:101FA000630298581300127500E05ED70037B50041 ++:101FB0006EC18EC0325E00B0580300106303BFDEF6 ++:101FC00002F0125E00B058130017A10068DA370063 ++:101FD000127B00B05E8700168D006DDE86D1B27D6B ++:101FE00000B05E8700168D0002DE02F0000001BC2A ++:101FF00060030017A1018760040310A001BC600307 ++:102000000990B500B0006300F0B401BC60570490C3 ++:10201000B601BC60030090B500B0006300B0B4002E ++:10202000B042D30018000317DE02F012860397DED9 ++:1020300002F0128700B02A4B00142F018EE00C032F ++:1020400010A0006DDE02D1B28D00E85A36F0168D78 ++:1020500003BFDE02F0128F01BC600300168C01BCCE ++:10206000600300168D006E5A3AF0129201BC6003B4 ++:1020700000168E03BFDE02F0129300E85A3AF01603 ++:102080008E00B058070017A100E0580EF0160300AC ++:102090006ED80EF4329900E85E86C017A100E858A9 ++:1020A0000EF4360300E8580F00360301185E0300F3 ++:1020B00017A1006DDE030212A100E86042F437A20E ++:1020C00000905A1AF4368600885A1EF457A20090DF ++:1020D0005A1EF4368700B05A1AF4568603BFDE0241 ++:1020E000F012A300905A1EF4368601BC600300165D ++:1020F000870002DE02F000000158600300102A0190 ++:10210000B8600A04902401BC60030290040189E0D5 ++:10211000020D906C0002DE02F000000200DE5300AF ++:1021200012CE01BC601309B7A100025E02F000BF2D ++:1021300001A560020337A20199E002F457A2000250 ++:102140005E02F000C501BC60130997A100025E02A7 ++:10215000F000BF01A4607E0337A20199E03EF4576E ++:10216000A200025E02F000C501BC601316F7A100D8 ++:10217000025E02F000BF01B460020337A200025EFB ++:1021800002F000C501BC60131637A100025E02F028 ++:1021900000BF0186E0020337A201856002F457A266 ++:1021A00000025E02F000C501BC60131617A1000218 ++:1021B0005E02F000BF0181E0060337A20185E00660 ++:1021C000F457A201836006F457A200025E02F000F9 ++:1021D000C501BC60131F57A100025E02F000BF01E1 ++:1021E00081E0020337A2028600C70012C80181E025 ++:1021F000060337A200025E02F000C501BC60131F97 ++:1022000037A100025E02F000BF0181E0060337A2A1 ++:1022100000025E02F000C50002DE02F0000001BC18 ++:1022200060130997A100025E02F000BF01A46002E2 ++:102230000337A20199E002F457A201886002F45723 ++:10224000A200025E02F000C501BC60131617A100D7 ++:10225000025E02F000BF0181E0020337A20185E0C7 ++:1022600002F457A201836002F457A200025E02F05A ++:1022700000C5020600C70012DF01BC60131F37A1B2 ++:1022800000025E02F000BF0181E0020337A20002FB ++:102290005E02F000C50002DE02F000000200DE5324 ++:1022A0000012CE01BC601309B7A100025E02F0006B ++:1022B000BF018760020337A20181E002F457A20147 ++:1022C000886006F457A200025E02F000C501BC60FF ++:1022D000130997A100025E02F000BF020400C700CC ++:1022E00012EC0188600E0337A203BFDE02F012EE8B ++:1022F000018660060337A20181E006F457A20002BE ++:102300005E02F000C503BFDE02F012C30068DE9378 ++:102310000012F400E05E030057A201095E8B001773 ++:10232000A103BFDE02F012FC0068DE930032F80168 ++:10233000105E030017A200E05E8B0097A103BFDED2 ++:1023400002F012FC01305E030017A200E05E8B0178 ++:1023500097A1006D5E870592FC01BC60030597A103 ++:102360000002DE02F000000200456F001308028741 ++:102370002C0F00130801BC60130217A100025E02BB ++:10238000F000BF0200C0670013080287AC0F001303 ++:102390000501084067000B030187E005606B03013E ++:1023A0008860060337A200025E02F000C501876064 ++:1023B00005606B030002DE02F0000000682BEB00FA ++:1023C000130E00B02C130017A100E05E8560B7A1CA ++:1023D000006BDE8623330E0186E006F7F7BF0002AE ++:1023E000DE02F0000000B05E8F00106400B05E8777 ++:1023F0000017A300B05E8B00106500B05A030017F1 ++:10240000A10068419300131700025E02F000BF00B4 ++:10241000B0406700160100E0419300506400B05ADC ++:10242000070017A200025E02F000C500E04197001D ++:10243000506500E85E8F0037A30068DE8F0013123E ++:102440000002DE02F0000000B05E8F00106400B0F9 ++:102450005E870017A300B05E8B00106500B05A03C2 ++:102460000017800068419300132500025E02F00D02 ++:10247000A900B05E0700160100E04193005064001F ++:10248000B05A0700178100025E02F00DAE00E04175 ++:102490009700506500E85E8F0037A30068DE8F006C ++:1024A00013200002DE02F00000020200BF0001ABB8 ++:1024B0000203C5730001D400000000000000676241 ++:1024C0004B17055AC31A14E12850005B234B2524EF ++:1024D0000A00B55A5C55D8F4A179397DBF0701BD12 ++:1024E000320801002A756E6B6E6F776E2A2F736447 ++:1024F000696F2D672D706F6F6C2D69647375702D0A ++:102500006964617574682D617073746120566572B9 ++:1025100073696F6E3A20352E39302E3139352E32AF ++:1025200036204352433A20653862343964393820C2 ++:10253000446174653A204D6F6E20323031322D3057 ++:10254000382D31332031393A31323A323020435349 ++:03255000546D00C7 ++:00000001FF +diff --git a/firmware/ap6210/fw_bcm40181a2_p2p.bin.ihex b/firmware/ap6210/fw_bcm40181a2_p2p.bin.ihex +new file mode 100644 +index 0000000..a8e3092 +--- /dev/null ++++ b/firmware/ap6210/fw_bcm40181a2_p2p.bin.ihex +@@ -0,0 +1,13727 @@ ++:100000000000000091EC000055EB000055EB0000F3 ++:1000100055EB000055EB000055EB000055EB0000E0 ++:1000200055EB000055EB000055EB000055EB0000D0 ++:1000300055EB000055EB000055EB000055EB0000C0 ++:1000400055EB000055EB000055EB000055EB0000B0 ++:1000500055EB000055EB000055EB000055EB0000A0 ++:1000600055EB000055EB000055EB000055EB000090 ++:1000700055EB000055EB000055EB000055EB000080 ++:100080000048004791EC0000000000000000000064 ++:100090000000000000000000000000000000000060 ++:1000A0000000000000000000000000000000000050 ++:1000B0000000000000000000000000000000000040 ++:1000C0000000000000000000000000000000000030 ++:1000D0000000000000000000000000000000000020 ++:1000E0000000000000000000000000000000000010 ++:1000F0000000000000000000000000000000000000 ++:10010000D11E8000B5228000BD248000491F8000E0 ++:10011000F9218000A9160100F1208000D120800083 ++:10012000594880006948800015648000E1628000C1 ++:10013000296280003D6580008D628000C56280007C ++:10014000596380005D6580007D6380009D63800051 ++:100150000D668000A961800061618000756080008B ++:1001600095608000DD6380009D65800029668000C9 ++:10017000FD618000B96580001D618000F16580002F ++:100180009D6680006D658000916C8000CD6B800065 ++:10019000316C80008D6B8000556C8000AD6A8000F2 ++:1001A000C16A8000D56A8000496B80001D6A8000AA ++:1001B000FD6A8000AD688000C1698000D168800060 ++:1001C000356B8000B16980004DF10000D166800080 ++:1001D000E16780008D678000CD6780009D688000AA ++:1001E000ED678000BD678000A1678000ED6680003C ++:1001F00009678000616780004D4880001D488000CD ++:1002000085988000DD96800051948000B19B80002D ++:100210003994800005988000199880002D988000FE ++:10022000C59B8000D19A8000899D8000D193800079 ++:10023000D9918000ED9A80002129000099170100D2 ++:1002400079290000C1170100519B8000BD290000E1 ++:1002500049A9800099988000F529000031A8800004 ++:1002600005A7800021A28000BD938000DD9380005F ++:10027000199E80007D93800045988000E59B80005A ++:100280006DA68000C19C8000C59F8000A19D80005C ++:10029000F5988000851701005517010029AA8000F4 ++:1002A000B9A9800075AA8000E1A9800039AA800060 ++:1002B0008DAA80005DAA80000DAA8000C5A98000DB ++:1002C0009DA98000A90C8000850D8000C1068000DA ++:1002D00029088000694680004D468000D94480008E ++:1002E0004146800021448000F54380001544800091 ++:1002F000E1438000E1428000854680007544800033 ++:100300002D448000A9428000F9428000CD43800046 ++:10031000B9458000F544800039458000090080001F ++:100320003D00800049018000D10480000D04800060 ++:10033000910380004D038000E503800035038000B9 ++:100340006503800029028000CD02800051028000F8 ++:1003500085028000F5028000950680003906800045 ++:100360008105800005068000FD048000690F800083 ++:100370002516800015168000451380001513800097 ++:100380002513800009138000351380000D1E8000A6 ++:10039000F91D8000291D80001D1C8000391C800073 ++:1003A0003116800059138000192C0200951380002B ++:1003B000B91C8000C5270000452D0200751D800076 ++:1003C000A90F01003D1D80000D1B8000E910800079 ++:1003D000790F8000A9168000311480002D11800053 ++:1003E000A51E8000B11E8000BD1E8000692B80000C ++:1003F000AD28800011298000892B8000FD2B800012 ++:10040000E128800065288000B52C8000912C8000B8 ++:100410001D2B8000752D8000252C80004D30800024 ++:10042000DD2D800059278000313180002118010026 ++:100430008D268000C5268000E5248000FD268000F2 ++:1004400021258000B12A80006525800025288000B4 ++:100450006129800041298000D92980009D298000E0 ++:1004600081298000893080004D2E8000B12B8000D2 ++:10047000312C8000E12C8000613280002D32800020 ++:10048000C93380004D368000693A8000B535800060 ++:10049000F9348000A93480003D3380009D33800012 ++:1004A000013480003536800031388000353A8000D4 ++:1004B000213A8000AD3280000D338000DD328000B3 ++:1004C000953A8000D937800099368000193780002E ++:1004D000593880004938800019398000313D80004A ++:1004E000D53A8000C93C8000E13B8000513D80004E ++:1004F000D93D8000AD3E8000593F80009941800089 ++:1005000041478000CD5B8000895380002D4D8000E5 ++:10051000A94C8000E14D8000E94F8000B14F800080 ++:10052000C94E80008D4E8000F15180005D528000E8 ++:10053000D15180002D52800001528000C94F8000AF ++:10054000594C80006D4C8000455B8000395680001E ++:10055000155A8000C9588000315A800081578000A8 ++:10056000F95980001D568000AD55800091558000DE ++:100570004D5A80002D558000714B800071548000D1 ++:1005800009548000F54D80001D4C8000F94B80001F ++:10059000094C8000114E800015588000C9110100DF ++:1005A0002D508000E5588000555680007D5A80000F ++:1005B000054F8000354E8000D9558000515880008D ++:1005C0009D57800059518000614D8000B1488000E6 ++:1005D0005D5B800081528000494C80003515010030 ++:1005E000F15B8000E55C8000E15F8000A55E80003B ++:1005F0007D5E80008D5C8000015C8000A15F8000DA ++:10060000895D800005608000395D8000D15E8000DA ++:10061000495E8000ED6C8000656D8000DD6D8000BE ++:100620000D6D8000296D8000896D8000F96C80005F ++:10063000D96C80003D6E8000616F8000756E800017 ++:10064000056E8000A974800055758000D574800007 ++:1006500005748000D17C8000457D8000757C800021 ++:10066000117E8000897E8000E97E8000917D80007F ++:100670003D7E8000517F8000A581800065848000E0 ++:10068000418480008D8380006583800035858000F3 ++:10069000E58480009D848000218580007584800031 ++:1006A000BD8380005D858000BD858000158F800042 ++:1006B000918D8000D58980001986800019AB80005B ++:1006C0005DAC8000A1AA8000B5AB80005DAB80006E ++:1006D000FDB080007DB1800065B080006DAE80000F ++:1006E00085AE8000EDAD800041AF80001DAE800082 ++:1006F00031B180003DB18000B9AE8000F5B180001D ++:1007000079B08000FDAD800009B180008DB080001F ++:1007100049B1800069B180004DAE80003DAE8000DF ++:1007200095AE800029B38000C9AE8000CDAF8000B7 ++:10073000E5AF800025B080008DAF8000B5B28000AD ++:10074000FDB2800019B38000EDB080005DAE800086 ++:100750002DAE800029B28000A9B08000A1B1800038 ++:1007600005B2800039B28000A9AE80007DAF800064 ++:10077000ADB38000A9BD80009DC1800025C7800069 ++:10078000DDC8800065CA8000E1CB8000DDCE80003E ++:1007900019CE800099CE800015CF8000E52C000096 ++:1007A0000DD88000DDD7800091D78000B110010006 ++:1007B000CD2B000069D880007DCF800045D9800016 ++:1007C000FD10010099D1800025110100F9E08000A1 ++:1007D00071F58000152D0000D1DE80008D21010013 ++:1007E00009EA8000A1E4800045200100E1EC8000DE ++:1007F00011E3800039EA800039E3800099E380004A ++:1008000029DF800005220100A120010075220100DE ++:10081000352301007D230100BDEB8000952D0000F4 ++:10082000152E00001922010091220100CD210100A6 ++:10083000E1E18000A9E980007D210100F9200100AB ++:10084000EDF58000D90081009DF68000C5F780009D ++:1008500085FF800045018100D50281004D038100A4 ++:10086000E50081007DF6800081F78000D5F58000ED ++:1008700051F9800031FB8000F1F68000F9F580002D ++:1008800041FF8000D9F98000DDFC8000A9F78000DD ++:10089000C12E000059FB80008DF78000A5F9800073 ++:1008A0008DF9800029F68000A1F880005DF78000B6 ++:1008B00065F6800095FD8000912F0000F502810013 ++:1008C0002D0281008901810005018100A93000000D ++:1008D00099FF800019F7800089F68000C1F680003A ++:1008E0008D10010085F5800005F78000DDF68000A1 ++:1008F000B1F68000AD6A8100BD6A8100DD2F810004 ++:10090000E1578100F56D8200A98D820009258200E2 ++:10091000196E820001AA81005D608200A537820005 ++:10092000ED69810079598200E55882001D598200E5 ++:10093000FD6D8100493A810041BC8200E95A820084 ++:10094000CD608100D59681001D6181002961810003 ++:1009500089BF81001DAB810069320000893200002F ++:10096000D132000005A6810021AD82002958810006 ++:10097000BD3E8100A540810035958100599B8100D5 ++:100980003D3682001D4582000928810099A0810022 ++:10099000D1288100E93B81008D288100416E8200D1 ++:1009A000859B8100295D81006D398200FD398200BF ++:1009B000253A820095698100C97A810091578100AA ++:1009C0005D57810075308200852F82003557810088 ++:1009D000D12F82002157810049578100F5288100DD ++:1009E00095A882002DA2820089D38100D56B810059 ++:1009F0005959810075598100F55A820005AD810071 ++:100A0000F1D2810039378100ED718100C5968100F6 ++:100A10008957820091618200CD618200A9588100CE ++:100A20001D2782004543820001448200156A81002F ++:100A3000614A8100ED4E810071228200055A8100D9 ++:100A40004D8A81007549810071248200B14981007D ++:100A5000B144810075AC8200292B8200595281007B ++:100A6000E12A8200B529820071A7810035A78100A3 ++:100A700001D48100F5BE810055B48100D16A8200A5 ++:100A8000D19C81009D9C8100959B8100B59D81003A ++:100A9000459D8100C59D81006170820009358100FE ++:100AA000A1AB82008DAB820075AB8200F193810017 ++:100AB0009968810015D7810071C182007D2B81006A ++:100AC000E92F81000DB6810025BD82008D4F810088 ++:100AD0000D5081008543820031D78100B1BD820075 ++:100AE00095C182005DB38200B90D01008DD18100F6 ++:100AF000A9368100E9BC820029378100E9368100EE ++:100B0000A1D68100A53B81006DAB810041B0810081 ++:100B100045AE8100DDB1810041BD820095BE8200FD ++:100B2000CD2E82009D6B8100CD458200453981002C ++:100B3000353B8100BD3A8100F1D58100419F8100A4 ++:100B4000119F810071A48200ADD58100C130810068 ++:100B5000A13982004D618100995B8100A5728100FD ++:100B600089DA810061BF81006157820081218200A2 ++:100B7000A9218200D1AD820009BC8200B5A181000B ++:100B80009DCA8100B92F8200D9BB8200113082003A ++:100B90007DAD8200CDA4810099A48100CDAB8200FF ++:100BA00015AB8200C1AA8200B998810081A581009D ++:100BB000D9D08100A9CF8100E93B8200EDCF81002F ++:100BC00065D1810079D1810051D0810065D081004B ++:100BD000E521820011228200D1340000B9480000D2 ++:100BE000FD9C81009145820055AE820041B4810098 ++:100BF00095BD8100F18A8200098B820079D981003C ++:100C00007D618200CDA4820041918100A13F8200DC ++:100C10003594820049948200898982005DC18200F6 ++:100C2000F1C18200D13B8200D5958200E560810050 ++:100C300009208200E5170100BD3B820075A18200FA ++:100C400025A58200253B8200E93A8200753A8200A0 ++:100C5000F1308200B130820071D781004599820065 ++:100C600091D7810089948200DDC18200A96A820047 ++:100C7000256B8200C944810029458100596B8100A0 ++:100C800059498100EDAA810069618200AD2482008A ++:100C900005368100D535810079D08100A5D081004D ++:100CA000715C8100E1AD8100EDD0810049C9810016 ++:100CB0004DD88100893D82004920820065968200DE ++:100CC000F925820089CF8100856A82001593820010 ++:100CD0002D5D8200E9CA81006D4082006130820092 ++:100CE00015488200313C810061D68100114E81009F ++:100CF0000129810041A1810015A681000999820086 ++:100D0000E5C98100B1D7810035C08200294A810040 ++:100D100041AD8100EDBE82002DBE820005BE820085 ++:100D200079BE820055328100A5958100B1598100BC ++:100D3000E54781009152810015638100956481002F ++:100D40008D668100592C8100392C8100212E810073 ++:100D500065358200D5578200352B8200996082006C ++:100D6000016182001D4082001D2082001DD881008B ++:100D7000A9AC8200F1AB8200F52B820041AE82006B ++:100D800011120100356A810009AE8200696D82008E ++:100D9000098C8100D58B8100116F810081908100C9 ++:100DA000296C8200DDA18100E92B8100552F820092 ++:100DB000398C8100A55A8200355C820045BB8200D7 ++:100DC00091BE81002D6E8100115C8200258A810018 ++:100DD0004D93810089388200D5378200555A8100B1 ++:100DE000013882008D038100E9208200E13E82000B ++:100DF000914581002D6D81000D58820021478200B0 ++:100E0000FDCE810011CA81005936820051CB81008C ++:100E100025CB8100912E81002D2F8100B93A8200CF ++:100E2000A10D0100DDA9810031D48100D1B3820080 ++:100E3000ADA98100D53882008DD88100555E820031 ++:100E4000719A81001541820035DA810019258200EE ++:100E50006926820035358100D90D01003D71810080 ++:100E6000012D810009A282000D238200FD71810005 ++:100E7000D960820051728100416182004528810061 ++:100E8000C12382008D6C81006D2382009547810013 ++:100E9000B9D98100B534810075C98100F134810070 ++:100EA0002DBF810059AF8200D93C8100494F81009C ++:100EB000E5AB8100F51501007931810005958200CF ++:100EC0006D638200DD938200A56682000DC88100FB ++:100ED000095E81007D758100156281009159810054 ++:100EE000D575810011498100C1488100B9BF8100D9 ++:100EF000A5458200F5598200F1A9820041A6820031 ++:100F000039588200BD428200BDA782004D22820076 ++:100F100071A78200A5A78200E15C8100ED418200FB ++:100F2000D1A78200D1688100B5CC810015AF8200C5 ++:100F300095418100E1C8810089AA8100E99681007C ++:100F40007D2F810081470000494282005944820080 ++:100F5000F90D010031318200614982004D49820062 ++:100F60000DA58100095E8200253E8200CDCD810065 ++:100F700029B382002151810045B18200A91D820060 ++:100F800079BC8200D1568100599D8100999D8100D4 ++:100F9000191C8200513F82001D308100C9BD8100B3 ++:100FA00015388100794A8100DD9B8100199E8100FE ++:100FB00069618100896E8100B5708100D132820043 ++:100FC000F1578100A93382009D5A81003D3582008E ++:100FD00089338200D96E810045708100FD618100F6 ++:100FE000594B81000D9C8100558B8200F18E82004F ++:100FF000E59A8100BD35820049368100291F8200B3 ++:10100000655C820009150100516F8100299B8100F8 ++:10101000A56D8100B5A28200E1AF8200A9568200D1 ++:10102000894481003D578200E16F8200016F820098 ++:10103000DD728200E53E810095518100FDD4810082 ++:10104000F5BC810081B48100F199810019318100E2 ++:10105000358A8200DDDA8100413D81002D3E81002C ++:10106000E9898200C1D48100FD8D820099B681009A ++:10107000BDA781003D9F82005D0381006D928200CB ++:10108000218B8200599A8100ED278100ED94820026 ++:10109000FD8A81009D8A8100416B8100E16F8100A2 ++:1010A0005D468200A19482009D898200C9928200DF ++:1010B00079998100B1908200219182001D348100D4 ++:1010C00099B28200DD6A82008DC9810059278200B1 ++:1010D00021120100D9908100A56B82006D3C820035 ++:1010E000E56D820005C28200C96A8100ED4582007B ++:1010F000816B8100353F8200FD90820071BC8100D0 ++:10110000F16B81003D4E8200514A82003DA2810078 ++:10111000190E010079738200B97E8200698882000D ++:10112000695A8200DD2E810015138200117381003F ++:10113000698082009D9181005D8B8100816C8200BD ++:101140008D8F81004D8F810009888100BD6D8200E7 ++:10115000018E81001D5E820091718100C127810096 ++:10116000797582002DBE81002D5B8200E9A5820089 ++:10117000B5728200255B0000217D82004D808200D7 ++:101180008D7F820001A08100ED7F82002D418100D2 ++:10119000F98481006185820045728200F9548100E2 ++:1011A000692B820069518100C5558100315681004B ++:1011B000A1A6810071508100392A8200615381000B ++:1011C000C573810035620000F1978100A99B810001 ++:1011D000FD3B820025A08200DD398100715D810028 ++:1011E000BD1401004995810009CC810021A3820032 ++:1011F00045AA8100AD818200916782002962820048 ++:101200007D708200E12F8200E97D000081DB81009A ++:10121000952482006989820089C38200C5C4820046 ++:1012200039180100B1EB820009CB82000DCC82009D ++:1012300059EB820061E9820015F18200E9CD82005C ++:1012400045DF820009F182008DF782008DCA82009D ++:1012500089F38200D5CA8200A1098300C9F7820000 ++:10126000FDEF820099F8820025F9820039FA8200A8 ++:1012700089ED8200ADE08200ADE5820065DA820092 ++:101280007DC582002DE6820065EE820031E4820099 ++:10129000E5F182009DC8820055F3820075150100BA ++:1012A00061C78200CDE182006DE18200A5E282008B ++:1012B00059DF820029F4820009C7820055EF8200BD ++:1012C000E9EC8200E9DB8200BDDD8200E1C582003D ++:1012D0004DE5820005E08200A5F982000DC582007F ++:1012E00089F48200ADA1000085A2000091E6820091 ++:1012F000BDCC8200FDE982008DD182002DF18200FB ++:101300002DF7820095FB820069CE8200A1F0820059 ++:10131000D5F08200F5CC820035A3000081D982008F ++:1013200045C58200FDCB820025CB8200BDEB82004B ++:101330001DDB820015CD820019E78200CDE6820018 ++:101340004DCF82009DCB8200450C8300E50D8300CC ++:10135000590E8300410E8300010B83004D0A830068 ++:10136000D10D8300310C8300590C8300710A830076 ++:10137000650E8300F10D8300410B8300A11E8300E5 ++:10138000B11E8300012B8300F54E8300112B8300D7 ++:10139000B127830099238300014A8300ED4983002C ++:1013A000FD478300CD4C8300BD4C8300714C83000E ++:1013B000D52783004D25830095258300E14C8300CC ++:1013C000414C83000912010065118300E144830050 ++:1013D00021288300BD2883007929830065288300A4 ++:1013E000652B830041458300D5298300491D830077 ++:1013F000A12A83005D30830051488300E5488300C3 ++:1014000029488300F5238300114A8300793483003F ++:1014100091188300A5338300ED3483001D118300F0 ++:101420009D4E8300954D8300B51A8300614783006C ++:101430001D4D8300ED1083000D458300C11E830008 ++:1014400001208300E9218300F1258300F91D830039 ++:10145000F513010059B3000049108300C10F830048 ++:1014600021248300A5248300B94A8300B52F83007B ++:10147000C1458300FD1C8300711D8300F5188300A6 ++:1014800059198300F1198300190F0100492A8300BB ++:1014900011B40000B957830029578300654F8300BA ++:1014A00001608300E559830039518300F54F8300C3 ++:1014B000555483001D5E83002152830065598300CB ++:1014C00079508300714F8300095983003D63830085 ++:1014D000C5578300815C8300B15B8300DD538300CB ++:1014E000115383009D4F830029508300254F8300B3 ++:1014F000D5588300CD62830039608300F95C830096 ++:101500004D6183005D5F83002D548300DD508300B7 ++:1015100039578300A555830091638300A16283003E ++:10152000C15D83002D5E8300455F8300A151830070 ++:101530004D5E8300195B83006D5A8300A9568300BA ++:10154000A5508300095783000D748300DD63830079 ++:10155000297A830001668300B9B28300D5A783008E ++:101560007D848300819383005DB38300A193830016 ++:10157000E9938300E10E010071BA0000B1BA0000E6 ++:10158000717A83005D67830051668300CD708300AC ++:1015900055718300DD7483008DAA830051A88300F8 ++:1015A000A9B183009D918300D184830039BB0000E1 ++:1015B00061848300AD77830081818300158283007D ++:1015C000B1808300E5B583006D7E8300B57983002B ++:1015D0002DBC0000916E8300758F830055878300BA ++:1015E0002913010015C1000025678300C18883000D ++:1015F000D98F8300F5AC8300E97783009D6D83006C ++:10160000A1A78300FD998300C9A4830051C40000F1 ++:10161000558B8300E58A8300CD6A8300F5868300BD ++:10162000596A8300B9AA83001566830051B283000A ++:101630009DB38300D9B6830059B1830091828300A2 ++:10164000D5B0830081868300C97A83000585830035 ++:10165000797C83008965830055A58300C9AF830029 ++:101660008D1501007999830091898300C5B58300A8 ++:101670000DB8830099D483002DC083009DC28300E0 ++:10168000ADC38300A1C68300B1C68300C5C2830079 ++:10169000A9D0830055BF8300F9CF830029BF830001 ++:1016A000C5E18300C1C0830095C083004DD883008D ++:1016B0000DD7830015D88300F1D7830079BD83004F ++:1016C000A1E1830035C28300C5E08300DDE0830033 ++:1016D000C5DC830099DA830001DA83004DB883000A ++:1016E00075C0830019C28300F9C983003DD6830009 ++:1016F00015BE8300C9D683005DBA830029D6830056 ++:1017000031B9830035BC83009DD883005DDC830044 ++:1017100029C18300A9C28300E5C0830025DB8300C3 ++:1017200075C283001DD083005DBC830061C6830049 ++:10173000D5C2830005BC830001C98300B5C88300FE ++:10174000EDC8830055D6830015D98300A5D1830049 ++:10175000F1D5830001D9830081B8830089E083003B ++:10176000E1BC8300A5DB8300EDE1830071C1830050 ++:10177000E9B783006DC783008DC183001DC8830056 ++:10178000B5D1830071DC8300E1C18300A9C183006E ++:1017900019DC830039D883004DCB8300A5B78300C3 ++:1017A00069CB83008DC98300C9D48300A5C500001F ++:1017B00099D68300E5DC83004DD483001DC38300EC ++:1017C00021DD830045D983007DD383003DD2830092 ++:1017D00041DA8300CDD88300D9BF830095BD830053 ++:1017E000EDBD830051C083002DB8830049BB830049 ++:1017F00031BB8300CDDA8300D5D0830049CA830092 ++:101800009DD5830081BF8300D5CF83003DC9830070 ++:10181000DDD18300B9D7830025C78300D1C800007C ++:101820005DBE830021E18300F9E0830071B983008C ++:101830008DE1830025D9830049D78300DDDB830058 ++:10184000A9B9830085BA83000917010059EB830009 ++:10185000C5E7830041E2830025E283006DF5830044 ++:1018600065EB830085F2830089F78300B1F2830082 ++:10187000A9F58300AD008400E100840019FD830018 ++:1018800035EE8300FDF38300D1D1000089FB830096 ++:10189000B9FA830021F98300F1FA8300D9F88300B3 ++:1018A000D9F9830031008400C5FE830049E7830035 ++:1018B000050084004DFF83006DF3830059FE830013 ++:1018C00001FE830025EB83000DEB830031018400D2 ++:1018D00035FD830081EB830059FD830011F88300FF ++:1018E000FDF78300C5ED8300ADED8300A101840009 ++:1018F000E9E78300B1F38300DDF2830025F3830081 ++:10190000F9E68300E5E28300F9120100A5E983000E ++:101910008DF5830051EE830079F8830071E2830036 ++:10192000F1E8830045E6830099F783006DEE8300BC ++:1019300041F48300B9EB830075E78300B1E88300CD ++:10194000BDD3000061F183000518010089EE83001A ++:10195000F5D40000FDE58300A9FD83000D1301000F ++:10196000B5FB8300F1F183002D108400E1158400A4 ++:10197000B1198400C5158400D90F8400CD218400DD ++:10198000491E84004D1F8400E1128400ED0884008C ++:10199000F10184002D0F8400ED238400F51E8400E6 ++:1019A000E520840049208400AD128400F11A8400EF ++:1019B000711F8400C9198400AD188400450B840090 ++:1019C000910B84000D2484008D2384000D18840065 ++:1019D000210684008D168400310384006909840087 ++:1019E000FD158400E902840001028400A909840035 ++:1019F0008D148400811E8400E10B8400751C84001A ++:101A0000AD0A840049108400712084000121840003 ++:101A1000850A8400291D840045078400390C840050 ++:101A200029198400551E840089038400E51D840063 ++:101A30002125840049138400291A8400DD12010045 ++:101A4000ED12840045068400010D84008943840062 ++:101A50006D2A8400014D84001528840069288400C3 ++:101A6000DD0B010009408400112C8400F92784005B ++:101A7000912D8400794C84008934840019338400CA ++:101A80006D2F8400C92D8400F12E84007D2E8400EA ++:101A900065258400DD348400FD2584001929840037 ++:101AA000B5408400D944840079298400B92B84008E ++:101AB0003D45840095328400B9288400D1388400E3 ++:101AC00031488400A93084006D2C8400994384003F ++:101AD000D13284006D338400FD2F84005D45840085 ++:101AE00011348400B54A840075488400C5488400D8 ++:101AF000B1278400314A8400D949840059328400D6 ++:101B0000014C840039388400314D840055448400F0 ++:101B1000D93D840055438400513C840091398400B0 ++:101B20009536840091378400F5368400E1478400BF ++:101B300015478400CD4C8400F52B84002546840095 ++:101B4000E53A8400C937840049428400292A840088 ++:101B5000A53F840059268400952A8400452B8400E3 ++:101B6000C95D8400C1230100A156840095568400FC ++:101B700019578400E956840005578400355F8400B6 ++:101B80001D628400B557840065638400ED628400A3 ++:101B900021638400BD628400194E8400B95384001F ++:101BA000B15D8400B5518400D55F8400F95584008F ++:101BB0006560840059538400E5538400E94D840036 ++:101BC00049240100E15F8400212501005125010025 ++:101BD000B55B840031568400A5638400CD60840029 ++:101BE00091638400ED5084002D5E840031518400A7 ++:101BF000155C840061548400F55E8400F15D84000E ++:101C0000352401007152840059588400815C84009D ++:101C1000715784002557840071588400AD568400A4 ++:101C2000415984006D4F840029508400E1548400A0 ++:101C3000BD6184006D61840005598400A56684003F ++:101C4000D9678400456684000D658400916784002F ++:101C5000B96384005D67840079678400F966840055 ++:101C60002165840021678400C56684008D66840038 ++:101C70006566840011688400516C8400AD6E840038 ++:101C8000016E8400F97084004D7F84007D6C8400B7 ++:101C90002D748400456A84000D7B840001120100CC ++:101CA000156E8400457A8400E56C8400456F8400DD ++:101CB000C17C8400297E8400756D8400956B84004E ++:101CC000B56D84007D7D84005D6B8400D56A8400E1 ++:101CD000816A840085748400B1808400857E8400DC ++:101CE000CD7F84004981840069818400ED8984006E ++:101CF0006D8A8400FD8984008D8984009D8984001B ++:101D0000E9858400F982840025858400518A840055 ++:101D100075858400958484008181840071838400AA ++:101D2000C18984005D898400D58984006D8984001F ++:101D30007D8984000D8A840009868400798C840062 ++:101D40007D8A84000D8B8400499484008D928400E8 ++:101D5000E98D84009D8B8400FD8C84007990840043 ++:101D60000D8C8400458C8400E9A68400A5AD840018 ++:101D700029968400C598840015C1840009A98400AF ++:101D800099C2840045B7840031C18400D1B8840071 ++:101D90008D998400B99A840025AC8400D9BF840051 ++:101DA000C9BE8400A196840025B18400519B8400A3 ++:101DB000919884004D9784001D9784007DA684002F ++:101DC000D1B784002DAB84008595840019B08400C0 ++:101DD000F5AD840029A98400C1A98400219F840055 ++:101DE00025A28400B1AE8400C1AF8400D5A38400D5 ++:101DF00075B7840041A28400E1BC84006DA8840012 ++:101E0000BD9D840095B884005D95840075BE8400F6 ++:101E100051B98400A9958400C5C18400599A8400F1 ++:101E2000419684003DB884009DA88400E5A8840004 ++:101E3000A59B8400F5A684003DAF8400159A84001C ++:101E4000F9988400EDA984006DB18400FDF0840050 ++:101E500025DF840025ED8400E5D08400CDF18400E9 ++:101E600009F2840035F2840055F28400CDF284003A ++:101E7000B1D38400F5D384002DD48400C1D4840070 ++:101E8000A5048500F90585006D0585009904850088 ++:101E90008D04850079D4840045E88400B1C58400B0 ++:101EA00095DF840031DF840075E484001DE0840048 ++:101EB000BDC9840005ED8400A500850091FB840068 ++:101EC000F9ED840091EF84009DFB840081EA840099 ++:101ED00079E28400E1E500006DE60000A1EB8400FA ++:101EE000D1E484009D028500F1E7000015CC840058 ++:101EF0005DFB840081C5840015D5840099D68400DB ++:101F000035E78400B9DF840045F48400B9C7840054 ++:101F100001DF84002D018500E1C7840025D1840004 ++:101F2000B5E60000BDDD84004DF38400E1C9840006 ++:101F300041E084002DCA84009DD4840091E7000014 ++:101F4000D900850079CB840021FC8400B9E88400A5 ++:101F5000B5D8840031FD8400BDFB84001D048500DC ++:101F60005D04850031ED8400450685005DEC84004C ++:101F700025C384001DF38400D9C684002DEC8400A1 ++:101F8000F1C5840059E9840019C884005112010088 ++:101F9000B100850049D3840001C98400E1D28400E6 ++:101FA0008DCB8400DDEB840011F4840009FC8400F7 ++:101FB000D9F3840069C38400A1C884002DEE840095 ++:101FC00071D68400790185004112010025D8840072 ++:101FD000DDF9840009F0840035F784008DE8000005 ++:101FE000D9FC840015D78400DDD584001DDE840073 ++:101FF00001E9000019F1840099F1840049F184009D ++:10200000BDE90000A1F48400F1D084003DCC84003F ++:1020100069D2840089E98400F51D0100C9D38400D8 ++:102020008506850089078500E90685004D0785003E ++:102030001107850025078500710685009506850036 ++:10204000BD06850075078500B10785009D078500E1 ++:10205000A9068500D1068500FD06850039078500A3 ++:10206000610785005D0685001509850079098500F1 ++:10207000350A8500BD0985000D0A850091EA00003A ++:10208000711201004D0A8500A90985002509850006 ++:10209000DD0A85006D0A850081088500C507850079 ++:1020A0000D0B8500590F8500ED118500C9128500C3 ++:1020B00021108500F90D8500D5118500511085008E ++:1020C000AD118500011185006D108500B1D10100B1 ++:1020D000850F850085108500990D850011128500FA ++:1020E0000D22850041178500D917850075208500D0 ++:1020F0007D2C8500352F8500B92285002D25850092 ++:102100009D238500612F8500A5278500C92A8500AC ++:102110006D2985009D22850031228500A52485003A ++:10212000E1238500B12F8500BD2C85005914850061 ++:10213000C9138500A11C8500452C8500A9178500C1 ++:10214000B1208500311A8500FD178500291D850005 ++:1021500021148500AD218500B5308500453185000D ++:1021600035278500D1318500C5148500BD2D85003A ++:102170002D23850059238500891485004D4685004F ++:102180006547850025368500514785003D46850019 ++:102190008D3C8500514A8500994A85007547850028 ++:1021A0001D478500553685005D468500D53B850079 ++:1021B00049498500D53A8500E139850041398500D6 ++:1021C000E53885000937850045358500C93C85001F ++:1021D000754B8500B9458500ED4885002146850091 ++:1021E000213A8500A940850001328500F53285003D ++:1021F000FD378500894E8500DD508500ED50850056 ++:102200005D57850009558500495085005D50850062 ++:10221000D1528500F5528500E54E8500C9558500EF ++:1022200065568500C9508500094F850071D20100AF ++:102230009D5585000D538500A94C8500B957850033 ++:10224000A55785000D518500FD5A8500D5518500A3 ++:10225000A9518500B15285009D53850039558500EF ++:102260009D4E8500C95785006D578500954C8500AA ++:10227000095785008D4F8500DDD20100FD5985008D ++:10228000014D8500ED598500D9598500194C85000F ++:10229000756C8500816E8500516C8500295C850018 ++:1022A000416E8500795E8500210F0100AD6E8500CD ++:1022B000B56C85006D6585001D5F8500196B850017 ++:1022C0008579850071738500B58E8500E19585005F ++:1022D00001828500519085002D828500D190850076 ++:1022E000FD908500BD9285006D8F8500CD928500A3 ++:1022F00055968500C58E8500857285005D8D8500AB ++:1023000001838500C1918500257085000D918500B0 ++:10231000C17685006971850041718500F97F85006E ++:1023200079708500F19385009D958500F574850091 ++:10233000497485006D788500BD728500ED8A850041 ++:10234000C98C850099918500597D8500BD718500F6 ++:10235000758185000D818500A9798500217785002B ++:102360002193850089928500D194850095968500FA ++:1023700065838500D97385006582850021D30100BE ++:102380005975850021768500556F85006D9585000E ++:10239000E583850029848500AD8F8500F16E850079 ++:1023A0009D2E010075280100292E0100A53601008F ++:1023B000F52D01001D2B0100992B0100A531010015 ++:1023C0005D2B01002D2B0100252B0100613C01003C ++:1023D000692E010041370100952801007530010088 ++:1023E000FD310100C52A0100D1280100C13F0100D3 ++:1023F000CD280100C1400100F1420100DD2D0100A6 ++:10240000DD2A01004D2E01009D32010091360100B0 ++:10241000ED2D0100C5280100BD280100613001003B ++:1024200031340100253401005930010055330100D9 ++:10243000813001008D320100152D0100F92B0100C2 ++:10244000D1450100192D0100F92D0100012E0100D7 ++:1024500089300100A53A0100F93A0100B12C0100D0 ++:10246000D52D0100853501009DEB0000D9EB000062 ++:1024700015EC000059EF00009DF40000E12C020073 ++:1024800005F500000DF5000049F8000049F90000CD ++:10249000B1F9000009FB0000452F000011310000D8 ++:1024A000493100006D31000079310000C931000070 ++:1024B000D500010011020100D931000039330000BC ++:1024C00045340000710D0100F93500006D0D01006B ++:1024D000E54F00006D6B00005D750000B19E0000CF ++:1024E0005D0D0100610D0100690D0100650D010028 ++:1024F000F5160100A9C60000450D0100410D0100BF ++:10250000310D0100390D0100D90B0100510D010001 ++:102510004D0D0100550D0100590D01002D0D01005B ++:10252000350D01003D0D0100490D01004DD50000A4 ++:1025300031D5000039D5000041D5000059D5000043 ++:10254000FD0B0100190C0100390C0100F90B010011 ++:10255000F50B0100350C0100150C0100110C0100F8 ++:102560000D0C0100090C0100050C0100010C01001B ++:10257000890C0100950C0100C50C0100E50C01005F ++:10258000E90C0100FD0C0100F90C0100F50C010043 ++:10259000F10C0100ED0C0100990D0100910D0100FD ++:1025A000890D01009D0D0100850D0100790D0100CF ++:1025B0008D0D0100750D01007D0D0100950D0100CF ++:1025C000010D010001000000200000001F000000BC ++:1025D00050000000020000000100000001000000A7 ++:1025E000010000000000000061D401000A0708009B ++:1025F000B533020051FB80006D310000C12E000098 ++:1026000000000000D1F980000000000029FB8000DC ++:1026100000000000000000009C1800409600FFFF32 ++:10262000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA ++:10263000FFFFAAAA0300409600000000000000006F ++:10264000000000000000000000000000000000008A ++:10265000000000000000000000000000000000007A ++:10266000000000000000000000000000000000006A ++:10267000000000000000000000000000000000005A ++:10268000000000000000000000000000000000004A ++:10269000000000000000000000000000000000003A ++:1026A000000000000000000000000000000000002A ++:1026B000000000000000000000000000000000001A ++:1026C000000000000000000000000000000000000A ++:1026D00000000000000000000000000000000000FA ++:1026E00000000000000000000000000000000000EA ++:1026F00000000000000000000000000000000000DA ++:1027000000000000000000000000000000000000C9 ++:1027100000000000000000000000000000000000B9 ++:1027200000000000000000000000000000000000A9 ++:102730000000000000000000000000000000000099 ++:102740000000000000000000000000000000000089 ++:102750000000000000000000000000000000000079 ++:102760000000000000000000000000000000000069 ++:102770000000000000000000000000000000000059 ++:102780000000000000000000000000000000000049 ++:102790000000000000000000000000000000000039 ++:1027A0000000000000000000000000000000000029 ++:1027B0000000000000000000000000000000000019 ++:1027C000000000002DE97043994605460E469046EC ++:1027D00020F086FA436831469C69284642464B46BB ++:1027E000A047BDE87083C0462DE9F74F0029054694 ++:1027F00092469B46009153DB438A828A514403FBF5 ++:1028000002F399424CDA806808F038DB002101902D ++:10281000A86808F005DD4369044643F000434FF023 ++:102820000008436124E000989BF8007008EB000664 ++:102830004FF0000903E00136D04517D07F0817F0AC ++:10284000010F0CD0284621463246FEF3EDF630B19A ++:1028500063694FF0FF3023F00043636122E009F128 ++:102860000109B9F1080F08F10108E4D10BF1010BDE ++:10287000D045D8DB6369A86823F000436361002179 ++:1028800008F03EDCA868012108F03ADC2846214621 ++:1028900020F0C2F9A868019908F0C2DC002001E02C ++:1028A0006FF01C00BDE8FE8F407C704713B500F050 ++:1028B0008FD8024608B904460FE000240AE010460B ++:1028C00001A90022FFF344F7019A13782C2B08BFCB ++:1028D000013201341378002BF1D120461CBDC046D3 ++:1028E000B0F8423070B50446C3B142F2197503E046 ++:1028F0000A2003F031DF0A3D236B1B6913F070439C ++:1029000007D0B3F1005F04D0B3F1405F01D0092DCF ++:10291000EED1226B136823F01003136070BDC04624 ++:1029200070B590F878310546FF2B1FD0104C406AE7 ++:10293000E36E9847D4F89C30686A984701280BD812 ++:1029400095F8141241B90B4628460A4A03F030DEC6 ++:10295000012385F8143209E0054B686AD3F89C30EE ++:1029600095F805419847241885F8064170BDC04682 ++:10297000E0A685003D98800010B5084671B191F839 ++:102980000832012B0AD091F875313BB14B691A6AB4 ++:10299000034B02EA03030BB10EF0FEFE10BDC0466E ++:1029A00000FC0101D0F8943110B59942044601D9D8 ++:1029B000002002E00EF0F0FEE08D10BDD0F8801196 ++:1029C00010B5044691B10223C068D4F8842108F000 ++:1029D00005DB074B1B684BB9D4F88011D4F8842170 ++:1029E000E06881EA0202023308F0F8DA10BDC0465E ++:1029F000AC2702002DE9F04190F817320446012B74 ++:102A000077D00123002780F8173243E0A0683146D1 ++:102A100000F082DBD4F8F0301B68984205D92846D4 ++:102A20000021324600F00EDB42E02046FFF778FF3F ++:102A300035690023AB7194F8783131462B7294F8E4 ++:102A4000063184F80731DBB26B72D4F8FC31606A6E ++:102A50000133C4F8FC316A79274BD20982F00102B4 ++:102A60005B6A9847B0B9D4F8F8106B7900293CD06C ++:102A700013F00F0F39D06A782B7843EA02230F3313 ++:102A80001B091A0A0A6918BF0023937194F8783158 ++:102A900013722AE0D4F8F0301B68012B08D904F136 ++:102AA00028052846002100F04FDA06460028ADD15F ++:102AB000002384F81732C4F8F8302FB16269043368 ++:102AC0005364204607F03CDFE28DD4F8C8319A42C7 ++:102AD00003D9206901F0C4DD0BE0D4F8CC319A426F ++:102AE00007D2206901F0AEDD03E00127C4F8F860E9 ++:102AF000D0E7BDE8F081C046E0A685002DE9F041B1 ++:102B00000746884616461D4642F2197403E00A201D ++:102B100003F022DE0A3C79690B6D002B02DA092CE6 ++:102B2000F5D11FE0AB191B0243F00042069BB3F145 ++:102B3000807F04D198F8003043F08073D21842F2BD ++:102B400019740A6503E00A2003F006DE0A3C7B697B ++:102B50001B6D002B02DA092CF5D103E0012088F867 ++:102B6000003000E00020BDE8F081C0460022C36BC9 ++:102B70000BB1013BC363531CDAB21030102AF6D1FB ++:102B80007047C0462DE9F041066805460F4670685B ++:102B90004FF4BC7104F09CD808B9044612E000213F ++:102BA0004FF4BC720446FFF34BF2D5F86031266057 ++:102BB000C4F8603195F86431C4F8687184F8643100 ++:102BC0006B6863602046BDE8F081C04603682DE96C ++:102BD000F74F012A14BF2A25322506460F465868AA ++:102BE0002946914604F0CCD8834640B93368013871 ++:102BF0001B68D3F88C20136D013313656CE007F16B ++:102C00000E0A04695146042201A8FFF3B5F1019BA5 ++:102C100006F1280803F47F421B0643EA02234AF622 ++:102C2000FE12B2EB134F0BBF2C4907F108012046EF ++:102C300020460622FFF3A0F10622A01D4146FFF325 ++:102C40009BF104F10C02B9F1000F0DD02B0A237394 ++:102C500004F10E00557022490622FFF38DF108237E ++:102C600023750623637503E008232373062353703B ++:102C70006419A4F11C05394606222846FFF37CF1AD ++:102C8000002304F8163C023304F8153C41460622A2 ++:102C900005F10800FFF370F107F11801042205F1B6 ++:102CA0000E00FFF369F107F10801062205F1120099 ++:102CB000FFF362F15146042205F11800FFF35CF1C5 ++:102CC000D6F85C3130680133C6F85C315946D6F825 ++:102CD000682125F067DA0120BDE8FE8F2C9E850073 ++:102CE00014D2850010B50368D3F800481B6893F828 ++:102CF000AB306BB1FFF73AFF08E0A16829B10120C2 ++:102D000000F0CAF808B1FFF731FF2468002CF4D1B5 ++:102D1000002010BD7047C046C3682DE9F04106464B ++:102D20000D4658683821174603F0D2DF044610B923 ++:102D30006FF01A002BE000213822FFF381F101230C ++:102D4000294623606360A360062204F10C00FFF3B0 ++:102D500013F16B8E05F10901A3742B7A04F11400B1 ++:102D6000E3742A7AFFF308F16D8D3046A586E78675 ++:102D70002146382221230BF013DE00B907E0F36867 ++:102D800021465868382203F0B3DF4FF0FF30BDE82A ++:102D9000F081C04630B50C4690F8CF1091B0944603 ++:102DA0009E460380194D91B94FF0FF330293039370 ++:102DB000049305930D3300940191069107910891B6 ++:102DC00009910A950B900C930D910E9115E04FF01F ++:102DD000FF33029303930493059300F1D00306930A ++:102DE0004BB2002207930C2300940192089209929F ++:102DF0000A950B900C930D920E927146044A63460D ++:102E0000C06824F079D811B030BDC046F920010067 ++:102E10002C9E85001FB5836D0446012B17D1B0F899 ++:102E2000583113F0010F12D1C36893F8703273B99F ++:102E300002AA01A903AB0FF0E5F9029A3AB12046C4 ++:102E40000199039BFFF7A6FF08B90223A3651FBDE5 ++:102E500010B579B1B0F8583143F00103A0F85831FA ++:102E6000836D022B15D1C3680C21D3F8680151F092 ++:102E70009FDB0EE0B0F8583113F0010F09D023F0BA ++:102E80000103A0F85831836D1BB101238365FFF75F ++:102E9000C1FF002010BDC046012801D0002000E085 ++:102EA0008868704710B50C4641B18B6823B9C06F74 ++:102EB0000968FFF767FEA060A06800E0C06F10BD62 ++:102EC0002DE9F0418C692369994202D100273E46E1 ++:102ED00004E0CE6A0EB9374600E0376863681146F1 ++:102EE000D86803F03BDFA36805461B6893F895306C ++:102EF0001BB1C38A43F08003C382636893F8AB308D ++:102F00008BB120463146FFF7CDFF60B129460AF06C ++:102F10003FD9022807D163682946D868012203F007 ++:102F2000FFDE01200BE0204629460CF039DCA068CA ++:102F300029463A4625F036D9003818BF0120BDE8A9 ++:102F4000F081C04637B5144605461146406FFFF77D ++:102F5000E1FE6368112B08D0122B01D0102B15D184 ++:102F6000A37803F001032B7510E002AA002342F8B6 ++:102F7000043DA86894F82F103CF080D930B18379D3 ++:102F800023B96188C1F3800127F03AD93EBDC0461C ++:102F90002DE9F0470446084615460DF003FF80462C ++:102FA00010B9D4F8109001E0D0F80490A368D9F8D3 ++:102FB00024701B682A6993F895303BB1EB8A13F4AF ++:102FC000006301D001262AE01E460AE0537B127BF3 ++:102FD00043EA022348F66C02934214BF00260126FE ++:102FE000EEB9204629460CF0CDDB636893F8AB3090 ++:102FF000ABB120464146FFF755FF80B1294609F0A5 ++:10300000B9DF042801D0012804D163682946D868B3 ++:10301000002244E0052802D14FF0010801E04FF002 ++:103020000008636893F895301BB116B9AB8A2D334D ++:10303000AB82002F2FD0EEB9FB6913F0010F07D040 ++:10304000637D2BB1204629460CF0A8DC024668B10E ++:10305000B8F1000F0ED1636893F8963053B1D4F8ED ++:10306000840029460EF004F9024618B9636829461F ++:10307000D86814E063682946D86803F0ABDE3B6982 ++:103080000446DB68484639462246984748B1204600 ++:1030900003F0DCDD05E063682946D8683A4603F0B2 ++:1030A0003FDEBDE8F087C0464B6A10B591F843207B ++:1030B00043F480134B62D0F8883002F00702D21834 ++:1030C00092F88030013382F88030D0F888200123D4 ++:1030D00082F88630D0F8881091F8812091F87B3002 ++:1030E0009A4211D291F8802091F87A309A420BD20C ++:1030F00091F8822091F87C309A4205D291F8832091 ++:1031000091F87D309A4201D30DF0F0D8002010BD27 ++:103110001FB5084B02460093074B08460193074B27 ++:103120000749DB6902931268064BFFF3F5F105B01E ++:1031300000BDC046DDD60100A0D601000028020077 ++:10314000AED60100D1D6010010B5436804461B7EFF ++:1031500053B1D0F880000CF049FDA06801F048FEA2 ++:103160006268002382F8203010BDC04610B5806927 ++:10317000FFF7EAFF002010BD70B504466368806861 ++:103180001E7E0EB1002515E001F0F4FC054620B9C5 ++:10319000D4F880000CF058FD05460CF0D5F86368B3 ++:1031A000D3F89C1031B10B7823B1034B3246186829 ++:1031B000FFF33AF5284670BD2428020010B5806858 ++:1031C00001F0FEFD002010BD10B50446FFF7F6FF2C ++:1031D000A06806F083FE10BD61290DDC602940DA8D ++:1031E00054293ED003DC2F293BD0442912E0A1F121 ++:1031F0005C03012B0FD834E0AC2932D005DC7C29EC ++:103200002FD0A1292DD06A2904E0DE2929D0F42964 ++:1032100027D0CD2925D0642911DC632921DA4A2958 ++:103220001FD006DC07291ADB08291ADD3C2918D033 ++:1032300015E0502915D012DBA1F15C030DE0C32984 ++:1032400005DCC2290DDAA1F1A803022B06E0B1F5D5 ++:10325000847F06D003DBA1F58973012B01D90020FF ++:1032600001E06FF01600704731B1036B1B689942A3 ++:1032700002D06FF00C0006E090F82930002B14BF4C ++:1032800000206FF00A00704730B5072A1C469DF8F1 ++:103290000C5001DD496809B9036B1968032906D090 ++:1032A0004B1E012B10D8036B1B6899420CD12DB11A ++:1032B00090F8293013B96FF00A0007E00CB92046E6 ++:1032C00004E00020216001E06FF00C0030BDC0463A ++:1032D0001FB59646BEF1070F1A4601DC002300E039 ++:1032E0005B685F2903930ADC5E2914DA4A2916D049 ++:1032F00002DC3C2913D00CE05C290ADB0FE0AA2990 ++:103300000DD002DCA82904DB0DE0C22907D0C329B7 ++:1033100009D000200EE01946FFF7A6FF0AE00021C1 ++:10332000FFF7A2FF06E000230093114603AB7246AD ++:10333000FFF7AAFF05B000BDC88810F0080018BF4D ++:103340006FF016007047C046D1F8D83270B5054608 ++:10335000188C164610BB8B6D40F2371203EA02023E ++:10336000002A0CBF012411242A6B1368022B07D1F9 ++:1033700095F85C360133DBB2012B98BF44F0200492 ++:10338000537D53B1B06B06F13C0122F063DE20B1F6 ++:1033900095F947360BB144F48064204670BDC046B1 ++:1033A00091F801C030B5BCF1010F45DDCA788B78CA ++:1033B00043EA0223012B3FD1ACF10203032B3EDD94 ++:1033C000ACF10603012B3ADD0B1D1D1D6A781B793C ++:1033D000002043EA0222864600E00130ACF10803F7 ++:1033E000904203EB0E0406D0AEF1040EACF10403E0 ++:1033F0007344042BF1DCC0EB0203A4EB830001282F ++:103400001DDD05EB8203DA789B7843EA022E821EEB ++:10341000002301E00133043A734501D0032AF9DCAB ++:10342000C3EB0E03A2EB8303012B08DD023B06D0A6 ++:10343000C3EB0C034B7002E06FF0160000E00020BD ++:1034400030BDC0462F2A30B50446964602D86FF0EC ++:103450000D0034E0B0F88031056B0B60B0F88231BC ++:10346000AA894B60EB891B0743EA023302688B6031 ++:103470001069BEF13B0FC36BCB6093680B61836A2D ++:103480004B61C36A8B61B2F87A30CB61D4F8843176 ++:103490004B62D2F8B0300B6243688B62836BCB62B5 ++:1034A0000CD92B8900220B636B89BEF13F0F4B6354 ++:1034B0008A6303D9036C1046CB6300E0002030BD63 ++:1034C00010B519B14068302203F012DC10BDC046BF ++:1034D00010B50446D0F860068E46C37A90F80AC04C ++:1034E00093B182894FF6FF739A420DD0837B43B923 ++:1034F0008378012B05D0037B03F0010383F00101E6 ++:1035000000E00021C9B20BE0216B71450ED1837B35 ++:103510002BB98378012B02D091F84C1000E00021E8 ++:103520008C4503D08172206938F0BADE002010BDCE ++:103530004FF0FF33A0F83C3210B5044600F50E7092 ++:10354000063000210C22FEF37BF523685B6B23B968 ++:103550004FF0FF33A4F840320DE04FF00F03A4F812 ++:103560003E324FF0F003A4F840324FF47063A4F8F9 ++:1035700042324FF20003A4F8443210BD70B5044645 ++:10358000D4F8741580680CF069D8D4F8F816D0F126 ++:10359000010538BF0025A0680CF060D800B90135DE ++:1035A000A068D4F8FC160CF059D800B90135D4F84D ++:1035B000E036A068196A0CF051D800B90135D4F88A ++:1035C000E0260023D360A068D4F83C150CF046D860 ++:1035D00000B90135A068D4F894170CF03FD800B9B1 ++:1035E0000135284670BDC04610B5044625F0F2DE10 ++:1035F000204617F00BD810BD2DE9F04F0746106993 ++:10360000A5B0D1F81090884601F124011A900792D4 ++:103610000693189199F80130D2F87CA199F800200E ++:10362000339C42EA0323C3F38102022A7868089399 ++:103630000B9201D0002302E0089DC5F3C013DBB25A ++:1036400041461693FFF3E6F504300A90329888B1AC ++:10365000037A0B2B08D197F8F0375BB197F8F13765 ++:1036600043B18379072B05D832990A9A91F90F3023 ++:10367000D2180A92D7F88831002B1CDA329BD3B1CA ++:103680001B7A022B17D197F8A034A3B91A9DAB6D02 ++:1036900013F0080F0FD132988379292B0BD8032B05 ++:1036A00009D90B2B07D82F99012904D10A9A19910E ++:1036B00008320A9201E000231993D8F81030B8F8C4 ++:1036C0001420A3F1760676329D1FA8F8142000215D ++:1036D0007022C8F8106030460595FEF3B1F41898D2 ++:1036E000036813F4806F01D0828827E00799A64B06 ++:1036F0004A6802EA0303D3B1089A02F0FC03882B5C ++:1037000015D199F8043013F0010F10D1B8F8163024 ++:103710002F9D03F007032E9801EB43016B1E984287 ++:10372000B1F8BE200AD1531CA1F8BE3006E00B99B7 ++:10373000012914D000224FF0100B04E00B9B012B49 ++:103740000DD04FF0000B2E9D05F00F0343EA02133E ++:103750009BB289F816301B0A89F8173001E04FF048 ++:10376000000B3098042807D138461A9932460FF0DA ++:1037700047D8ADF88C0019E02F992E9D4B1E9D4225 ++:10378000B7F8462502D1531CA7F846352E98309934 ++:1037900000F00F0343EA02135B0147F6E07203EA0D ++:1037A000020201F007031A43ADF88C20079A92F841 ++:1037B000DF3023B9089D05F0FC03802B01D14BF0CD ++:1037C000200B724B04EA03031BB1002020942194C8 ++:1037D0001FE00B99012906D9189A1368002B02DB08 ++:1037E00013F0100008D0079C002594F8483003F02F ++:1037F0007F032093219349E0396B644B8A6C02EA82 ++:10380000030343B199F8043013F0010F03D0209261 ++:1038100021920F903BE099F8043013F0010009D099 ++:103820000798002190F848300F9103F07F03209310 ++:1038300021932CE04A6C554B02EA0303002BE6D19E ++:1038400020ABD7F8600100930DF18F0301930DF1C8 ++:103850008E0302930DF18A03039323AA21AB0799E8 ++:103860004FF028DA189A136843F00062189B1A6028 ++:10387000BDF88A3013F0010F03D0189C42F40053B6 ++:1038800023602E9DD5F1010538BF00250F95D7F88F ++:103890006036219A9C7A3B6893F8463013F0030116 ++:1038A00000F0358112F0006F02F07F0104D007298B ++:1038B00006D9202904D02EE0354B5B56002B2ADA9E ++:1038C00012F0804F01D1002A25DB22F4401121F4AF ++:1038D000605112F0006F21911AD0D7F860068378FA ++:1038E000012B15D93B6B93F94D20012A0BD0079D75 ++:1038F0006B6813F0804F0BD0B2F1FF3F08D1037B10 ++:1039000013F0040F04D041F4801343F4805301E01A ++:1039100041EAC4232193209911F0006F01F07F0246 ++:1039200004D0072A06D9202A04D036E0184B9B562B ++:10393000002B32DA219B13F0804F01D1002B2CDBBE ++:1039400021F4401222F4605211F0006F209221D035 ++:10395000D7F860068378012B1CD93B6B93F94D1087 ++:1039600001290BD0079D6B6813F0804F12D0B1F185 ++:10397000FF3F0FD1037B13F0040F0BD042F48013F1 ++:1039800043F4805308E0C046400001807F000008F7 ++:10399000401B860042EAC4232093B7F8283603F47C ++:1039A0004063B3F5406F30D13B6B18690FF0BEF840 ++:1039B000219B00F44070B0F5007F14BF0222032267 ++:1039C00013F0006F03F07F0111D0202902D11546BA ++:1039D00005222EE097F9CA34B3F1FF3F12D10798C0 ++:1039E000436813F4002F23D01546042221E09C4B9A ++:1039F0005B56002BB4BF97F9C93497F9C834B3F1BB ++:103A0000FF3F15D015469AB213E0219B03F07F03C8 ++:103A1000202B04BF4FF000632193209B03F07F0312 ++:103A2000202B04BF4FF00063209302252A4600E0BC ++:103A30001546219B110223F4E06341EA030321931D ++:103A4000209B23F4E06213F0006F14BF41EA0203ED ++:103A500042EA05232092219A209312F0006F06D0AB ++:103A600097F9DC31012B02D142F4000304E097F90D ++:103A7000DC3113B922F400032193209A12F0006F75 ++:103A800006D097F9DC31012B02D142F4000304E0A7 ++:103A900097F9DC3113B922F40003209307993846D3 ++:103AA00012F03ED9219911F0006202D111920E92CA ++:103AB0001DE0D7F8583693F90530022B02D00022CA ++:103AC0000E9207E0C1F30223043B012B8CBF0023BD ++:103AD00001230E9311F4000F05D001F07F03072B93 ++:103AE00003D9202B01D0119001E0042311932099D8 ++:103AF00011F0006201D112921DE011F4000F16D0F6 ++:103B000001F07F03072B14D9202B12D00FE0209B4C ++:103B100022F4E06223F4E06342F4007243F40073A1 ++:103B200002252192209311910E91129103E012909F ++:103B300001E0042412940F9888B11A99219BD1F8BE ++:103B400010231A9801EBC201C1F814332F9C0132E3 ++:103B5000E3B202F03F02C1F81833C0F81023BAF103 ++:103B6000000F36D0FA68DAF80434D2F880410AEB54 ++:103B7000C303C3F80442D2F884013A4AC3F80802E6 ++:103B8000B8F8163003F00703D35C022B11D1DAF832 ++:103B900000100AEBC102C2F80441C2F80801219BDF ++:103BA000013153602F9C01F01F01E3B29360CAF80A ++:103BB0000010DAF80424219B0AEBC201C1F8083492 ++:103BC0002F980132C3B202F03F02C1F80C34CAF898 ++:103BD0000424219911F000642AD011F4000F01F49B ++:103BE000E06312D01B0A043B012B1F4801F07F0247 ++:103BF00005D8142302FB0303D3F80C801AE0142326 ++:103C000002FB0303D3F8088014E01B0A043B012BDA ++:103C1000154801F07F0205D8142302FB0303D3F8F3 ++:103C2000048007E0142302FB03F353F8008001E053 ++:103C300001F07F080B9A022A00D0BAB9B7F83836DB ++:103C40000A98984204DC189A136813F0806F0DD01C ++:103C500099F8043083F0010303F0010307E0C04644 ++:103C6000401B8600C4D285008418860000230D9373 ++:103C70003B6B587D50B1D7F858361B7833B12CB90F ++:103C8000924A01F07F03D356002B0BDB3B6893F87D ++:103C9000463013F0030F2CD05CB3D7F8583693F9A5 ++:103CA000053033B32F9A012A13D9D7F858361B7829 ++:103CB0000BB1162300E03023189C20932193236836 ++:103CC00023F000632360209B43EA05232093219384 ++:103CD0000FE070B1D7F858361B7853B14CB97B4A16 ++:103CE00001F07F030E98D35630EA230028BF01204D ++:103CF0000E90219A12F0006F15D102F07F03022B73 ++:103D000005D0042B03D00B2B01D0162B0BD1069919 ++:103D100039B1022B05D097F95C36013B18BF01235E ++:103D200000E000231193209B13F0006F16D103F0E5 ++:103D30007F03022B05D0042B03D00B2B01D0162BB5 ++:103D40000CD1069C44B1022B06D097F95C36013B9E ++:103D500018BF0123129301E0002012900B99079CD9 ++:103D6000022904BF079BC3F86021636813F4803FF6 ++:103D700040D097F8CE31002B3CD097F8D131002BB2 ++:103D800038D0D7F8583693F90530032B32D0219B21 ++:103D900013F0006F09D103F07F03022B2AD0042B0C ++:103DA00028D00B2B26D0162B24D099F8043013F0F2 ++:103DB000010F1FD1089800F0FC03882B1AD1189925 ++:103DC00001240B684BF4A04B43F480530B60079B1A ++:103DD0001094D3F8F0204FF69F73002A0CBF1822DE ++:103DE0001E2239F8021001EA030343F0200329F8E8 ++:103DF000023001E000201090384621990A9A059B74 ++:103E00000DF17A0419F028DC2346384620990A9AE5 ++:103E100019F022DC062206F136002146FEF3ACF052 ++:103E2000209B13F0006F10D103F07F03022B05D00D ++:103E3000042B03D00B2B01D0162B06D10A99C1F30A ++:103E4000072386F83A1086F83B30189B1A6812F45C ++:103E5000806F13D0219B13F0006F0FD0329C14B1F0 ++:103E6000237A042B0AD1189842F40063036097F870 ++:103E7000C3340D99002B18BF01210D91219911F028 ++:103E8000006F0AD1114A01F07F03D356002B04DAE8 ++:103E9000059A137803F00F0301E0059B1B78089C3B ++:103EA0000C93A42C14D099F8043013F0010F0FD107 ++:103EB000109878B9119A319B38460FF06FDE89F867 ++:103EC0000200C0F30F2089F803001DE0401B8600AC ++:103ED000109A62B1119A384640F62A1319F052D955 ++:103EE000023080B289F80200000A89F80300089BBA ++:103EF000A42B09D199F8023099F8032043EA022350 ++:103F000086F83C301B0A09E099F8043013F0010FE1 ++:103F100001D1109C2CB1002386F83C3086F83D304E ++:103F20000BE02099129A319B38460FF037DE86F865 ++:103F30003C00C0F30F2086F83D001898036813F486 ++:103F4000007F0DD083894BF4005B86F842301B0A5A ++:103F500086F84330C38986F844301B0A86F845301A ++:103F60002E9909B94BF0080B09F104021B9299F83C ++:103F7000043013F0010F14D1189B1A6812F4805FFB ++:103F80000FD197F8D03113B112F0400F09D112F4CC ++:103F9000806F04D1169C14B197F8F8310BB94BF02F ++:103FA000010B0B98022814D197F8CE318BB1B8F1E0 ++:103FB000040F0ED9AB4B30995B5C07EB4303B3F8AE ++:103FC000FE3123B1189A136813F4806F01D04BF4BB ++:103FD000805B3B6B18690EF0A9FD199B00F44060F3 ++:103FE000B0F5406F08BF4BF4807B0BB14BF4004B36 ++:103FF0004FEA1B2386F800B07370329CECB197F83F ++:10400000A034D3B91A98836D13F0080F15D1237A11 ++:104010000B2B08D197F8F0377BB197F8F13763B1E4 ++:10402000A379072B09D832998A79292A05D80B7BDD ++:1040300003F0070343EA021A01E04FF0000A189A5E ++:10404000129C1368494613F0005F18BF4AF0080A33 ++:10405000631EDBB2012B98BF4AF4005A301D0222C6 ++:10406000FDF38AF70023B371F37186F82C3086F8DC ++:104070002D303298002849D097F8A034002B45D134 ++:104080001A998B6D13F0080040D1329B1A7A0B2AD3 ++:104090000BD197F8F037002B38D097F8F137002B79 ++:1040A00034D0329CA379072B30D832998B79292BC5 ++:1040B0002CD8089C09F1180104F44073B3F5407F33 ++:1040C000169B08BF09F11E0103B10231022A11D16A ++:1040D0003246329C2318B3F8BC309375C3F30723E0 ++:1040E000D375831C02320A2B1846F2D106F1200048 ++:1040F000032209E00B2A06F1160002D10231053233 ++:1041000002E0329B93F90E20FDF336F706221B994D ++:1041100006F12600FDF330F79DF88C30002486F878 ++:104120004C309DF88D3086F84D30D7F84C011A99F7 ++:104130004AF0EEDF96F8463096F8472080B243EA20 ++:10414000022343EA00239BB286F846301B0A86F816 ++:10415000473086F84E4086F84F4086F8504086F843 ++:10416000514086F8524086F8534086F8544086F80D ++:10417000554086F8564086F857400D9808B10E9481 ++:1041800003E00E99002900F01D81002221992B46A1 ++:10419000384622F051DE00228046209938462B46D0 ++:1041A00022F04ADE18F000628346099206D12E4BB7 ++:1041B00008F07F029B56002B2ADA36E018F4000F35 ++:1041C00008F4E06310D01B0A043B012B274808F0D9 ++:1041D0007F0204D8142302FB0303DB6814E01423DA ++:1041E00002FB03039B680FE01B0A043B012B1F48E3 ++:1041F00008F07F0204D8142302FB03035B6803E08A ++:10420000142302FB03F31B58023B18BF012302E0F7 ++:10421000931E18BF012343B197F95C36012B04D0DC ++:1042200001234AF4804A139301E0002413941BF005 ++:10423000006F06D10C4B0BF07F029B56002B30DA3F ++:104240003CE01BF4000F0BF4E06316D01B0A043BA8 ++:10425000012B06480BF07F020AD8142302FB03034C ++:10426000DB681AE098E08500401B86008418860011 ++:10427000142302FB03039B680FE01B0A043B012B82 ++:104280009D480BF07F0204D8142302FB03035B68F4 ++:1042900003E0142302FB03F31B58023B18BF012366 ++:1042A00002E0931E18BF012343B197F95C36012B3E ++:1042B00004D001254AF4004A149501E0002014902E ++:1042C0000E993278737821B142EA032343F40063F4 ++:1042D00003E042EA032343F0060333701B0A7370C2 ++:1042E0000E9B06F15802002B0CBF14250E251592CB ++:1042F0001DAC2A4638464146159B19F0ADD92346D8 ++:104300002A463846594619F0A7D92146062206F111 ++:104310002E00FDF331F6139C119D0A9800940024A1 ++:104320000E99219B0195029042460394384619F05C ++:10433000B3D986F86000C0F30F2086F861001499A5 ++:10434000129A0A9B009101920E9902930394209B6A ++:1043500038465A4619F0A0D986F83400C0F30F2029 ++:1043600086F835000E9D06F162004DB16FF03B03FB ++:1043700009F10A01062286F85E3086F85F4008E0FF ++:104380006FF04B0386F85E300E990C2286F85F10B2 ++:104390001B99FDF3F1F5099A52B9584A08F07F03C9 ++:1043A000D356002B04DA159C237803F00F0301E0A9 ++:1043B00096F858300C9D1B0243EA050506F15E098C ++:1043C0000C951BE00E99062206F15800FDF338F615 ++:1043D0000E99102206F15E00FDF332F606F12E0072 ++:1043E0000E990622FDF32CF60E9886F8340086F816 ++:1043F00035008146139014908046834618990B68C7 ++:1044000013F4806F0BD0219A12F0006F07D0D7F809 ++:10441000400107990A9B2AF0B3DF86F833004FEA80 ++:104420001A23F37086F802A00C9A130AB274F3747C ++:10443000209B13F0006F02D097F8C0A40EE003F0A9 ++:104440007F03022B07D0042B05D00B2B03D0163B88 ++:1044500018BF012300E000231FFA83FA18F0006F51 ++:1044600003D097F8C0349D000EE008F07F03022BC4 ++:1044700007D0042B05D00B2B03D0163B18BF01230C ++:1044800000E000239B009DB21BF0006F03D097F863 ++:10449000C0341C010EE00BF07F03022B07D0042B6D ++:1044A00005D00B2B03D0163B18BF012300E00023DF ++:1044B0001B019CB23B6B18690EF038FB45EA0A03FE ++:1044C0002343C0B243EA002333751B0A7375219B53 ++:1044D00013F0006F02D097F8C04413E003F07F039D ++:1044E000022B0DD0042B0BD00B2B09D0B3F11600EF ++:1044F00018BF012005E0C04684188600401B8600D6 ++:10450000002084B2119D6B1EDBB2012B07D83B68E3 ++:1045100044F01004D3F88C209369013393612199FE ++:10452000384615F02BDB44EA000080B23072000AF6 ++:104530007072219938461FF055DEB072C0F30F201B ++:10454000F072209938461FF04DDE3073C0F30F2013 ++:1045500070730D9808B90E9979B1414638461FF02D ++:1045600041DEB073C0F30F20F073594638461FF098 ++:1045700039DE3074C0F30F207074219911F0006F90 ++:104580000CD0119A042A09D10A9A384618F0ACDEE8 ++:1045900086F83E00C0F30F2086F83F00209911F006 ++:1045A000006F0CD0129B042B09D10A9A384618F0E0 ++:1045B0009BDE86F84000C0F30F2086F84100079C80 ++:1045C000636813F0400F00F0CE80169D002D00F0C0 ++:1045D000CA806A4B30981B5C179307EB4303B3F810 ++:1045E000FE31002B00F0BF8018990B6813F4806F28 ++:1045F00040F08D802E9A002A40F08980219C384618 ++:104600002146119A0A9B18F0BDDD8246B9F1000FD0 ++:104610001AD04146139A38460FF082D8149A0446AD ++:10462000594638460FF07CD899F8032099F80230A3 ++:1046300043EA022303EB040896F8352096F8343059 ++:1046400043EA022318181BE0109B13B1804648462A ++:1046500016E02146119A4B4638460FF09FDA209C0F ++:10466000129A21460A9B00EB0A08384618F08ADDA8 ++:1046700021460546129A38464B460FF08FDA40190C ++:104680001FFA88F3B3711B0AF37183B286F82C30DA ++:104690001B0A86F82D30179C07EB4403B3F8FE5134 ++:1046A000CAEB0804A54225D31898036813F0400FFD ++:1046B00002D0309901291DD038462199119AC4EBB6 ++:1046C00005030FF035D8FF2802D84FF4807304E0BB ++:1046D000B7F82A36834228BF034699B2309B07EBCE ++:1046E0004302B2F82C368B4204D0A2F82C1638467E ++:1046F00026F0CCD83B6893F84430002B33D0309C64 ++:10470000032C30D8D7F864011799424628E03B685B ++:1047100093F844303BB3309D032D24D8B9F1000FFA ++:104720000CD0139A384641460EF0FADF99F8032070 ++:1047300099F8023043EA02231A180EE0219C119ADC ++:1047400021460A9B384618F01DDD119A0546214680 ++:1047500038464B460FF022DA4219D7F86401179910 ++:10476000079B3DF02FDD1898036843F08403036036 ++:10477000BDF88C0025B0BDE8F08FC04698E08500FC ++:104780002DE9F0479946536A064613F4007F8846A0 ++:1047900017469DF920A0146902F1240515D0E86898 ++:1047A00083B2000C84F8423084F844001B0A000AEB ++:1047B00084F8433084F845002378607843EA002386 ++:1047C00043F4005323701B0A637033682D6993F818 ++:1047D000443093B1F36A03EB4803B3F91C3063B977 ++:1047E0005DB12B69D3F8D43293F89D30032B04D9F3 ++:1047F000D6F864012B463DF0C5DDB8F1040F22D197 ++:1048000094F84D3094F84C2042EA0324336893F82E ++:104810003830D3B1384612F045D906EB8000D0F8D5 ++:104820004C12D1F85835D1F860055A1CC1F85825FA ++:10483000C369A1F8C8409A4288BFC261D1F8602517 ++:10484000136A013313624FF6FF74B9F1000F05D0FC ++:10485000F26A02EB4802938B534493834FF6FF7343 ++:104860009C4204D03069A821224639F0F3D933693B ++:10487000394603EB8803D8680C4B4A465B6A984775 ++:10488000002810DA0A480CF00FFF0A4A13680133B7 ++:104890001360B9F1000F06D0F26A02EB4802938B65 ++:1048A000CAEB03039383BDE8F087C046E0A685000A ++:1048B000BC568600E827020070B50D46D0F8601699 ++:1048C0000446CB7AAB420CD025B10C31B0F8282687 ++:1048D00015F098D9D4F860362046DD72216BFEF7CA ++:1048E000F7FD002070BDC0462DE9F04F89B00023D0 ++:1048F0000D46179907460492149CDDF854800793DF ++:104900000693DDF848B0DDF84C903AF073DD049A78 ++:10491000824602F001060096386829462246434640 ++:104920001EF0D2DC0590002840F0ED80B5F906308D ++:10493000002B1CDAA9882A895EB1169BCDF800806D ++:1049400003930194CDF8088049003869013123466A ++:1049500009E0169BCDF8009003930194CDF80880F0 ++:10496000386949005B4638F0FBD80590CBE0B9F1D7 ++:10497000030F0DD9042207A85946FDF3FDF2B9F142 ++:10498000070F05D906A80BF104010422FDF3F4F288 ++:10499000049A0799931E1F2B21D8DFE813F02300F8 ++:1049A0002500270029002E00310038003A004B0076 ++:1049B0004D0053005500570059005B005D005F003B ++:1049C000200065006C0074007600870089008D006F ++:1049D0008F00940096009B002000A6009D006FF0C1 ++:1049E00016038FE04A4B09E0494B71E0494B05E063 ++:1049F000002900F38580474B05E0474B1B6879E0B1 ++:104A000000297DDB444B1960444B002239E0444BC4 ++:104A1000F4E719B1434B1B68002B71D0404B0022C7 ++:104A20001960414B1A60414B1A60414B1A60414B6F ++:104A3000013A26E03B4BE1E73A4A1368002B5FDD81 ++:104A4000116060E03C4BD9E73B4B41E03B4BD5E785 ++:104A50003A4B3DE0344BD1E7334B39E0D7F86C3279 ++:104A6000D3F8D8329B6845E0354B1A68354B1B6844 ++:104A700043EA02433EE0324B0A141A60314B01F024 ++:104A8000FF021A603FE0304BB8E72F4B1960002956 ++:104A900039D02E4B002119602D4B4FF0FF321A6098 ++:104AA0002C4B1A602C4B19602C4B11E02C4BA5E7BA ++:104AB000002925DD2A4B0BE02A4B9FE74B1E092BD3 ++:104AC0001ED8284B04E0284B98E7002918DD264B18 ++:104AD000196018E0254B91E79AF8063063B9244B2A ++:104AE0000A1E18BF01221A700DE09AF806301BB991 ++:104AF0001F4B1B78236006E06FF00602059202E070 ++:104B00006FF01C030593059809B0BDE8F08FC0460F ++:104B1000EC270200D8270200E0270200B827020095 ++:104B2000C0270200401E0200D4270200D027020046 ++:104B3000C8270200B42702002C1E0200441E0200F7 ++:104B4000142C0200102C0200BC270200E4270200F3 ++:104B5000281E0200381E0200C4270200DC270200C3 ++:104B6000341E02003C1E0200241E0200CC2702005C ++:104B7000B027020037B5036804465B7E002B40F087 ++:104B8000C480026992F8EA305BB1D36ED3F8202179 ++:104B900040F2044302EA0303B3F5806F40F0B580AE ++:104BA00005E0106E0AF050FE002840F0AE80236849 ++:104BB00093F8203033B9206907F062FE22680123A0 ++:104BC00082F8203023681B6FFBB9206907F0D6FDFF ++:104BD00010F1090F19D12268136F13F0020114D1DB ++:104BE00043F0020313670D4604EB8503D3F84C1220 ++:104BF00041B18B7933B94B7923B18B7C13B120460A ++:104C00003AF03ED90135082DEED123681D6F1DB154 ++:104C1000204612F079D976E0012384F82930204625 ++:104C200021F004D82368596B39B103234FF4807203 ++:104C3000009320462946134605E0032300932046AF ++:104C40004FF480720B461EF0BFDFA0680AF02CDD27 ++:104C5000236801221A7694F89D3173B120460CF036 ++:104C6000C1FDD4F840352046598E23F0DFDE002305 ++:104C700084F89D3120461DF0C3D9B4F85C17204656 ++:104C800021F04CDF206907F0DFFF236893F82F3015 ++:104C90001BB1D4F8340730F03DD8236893F8313095 ++:104CA0007BB1002504EB8503D3F84C1231B18B792D ++:104CB00023B94B7913B1204635F0FADE0135082DC2 ++:104CC000F0D1204615F00EDF204618F0EDFA012550 ++:104CD000D4F8AC114FF448720123A0680AF076DCD6 ++:104CE000204684F8F15125F0D1DD204614F072DF22 ++:104CF000204626F02DD950B1204626F007D920466F ++:104D0000294626F00DDB002001E06FF008003EBDD3 ++:104D1000D0F8403570B55D8E064605F44063B3F5B6 ++:104D2000406F22D1036893F8463013F0030F0BD085 ++:104D300005F47041D0F85C01B1F5805F14BF00212B ++:104D4000012141F0B7DA80B92846FEF36BF2044640 ++:104D50002846FEF367F244F430640E288CBF4FF40B ++:104D600080504FF400500443A5B2326B05F47043F9 ++:104D70005268B3F5805F14BF00230123934205D02E ++:104D8000D6F85C01012140F0B9DD0546D6F85C019A ++:104D9000294641F003DB80B905F47043B3F5805F29 ++:104DA00014BF38233C23F358346BD6F85C013363CB ++:104DB000012140F0A3DD34630546284670BDC0469E ++:104DC00070B50025044680F8E85124F0B7DDE36AA9 ++:104DD0002946986A8022FDF333F1206908F0BAF978 ++:104DE000D4F840012AF09EDCC4F8885670BDC04655 ++:104DF0002DE9F04390F8A03187B00446002B40F035 ++:104E0000ED8003681B7E002B00F0E880012380F812 ++:104E1000A031006907F0E6FE2269074692F8EA3001 ++:104E20005BB1D36ED3F8202140F2044302EA0303BE ++:104E3000B3F5806518BF012503E0106E0AF004FD8C ++:104E40000546002D6FD1D4F8680104214FF0B0DB86 ++:104E5000204621F0A3DE00B90137A94604EB09037F ++:104E6000D3F84C62002E59D096F80680B8F1000FA6 ++:104E700054D1304633F06ADC73793F18002B4DD0A3 ++:104E8000236893F83130002B3FD0D6F8CC3013F0A4 ++:104E9000010F3AD0204631460CF0B4FC23683F188D ++:104EA00093F89530002B39D0D4F86C122046BC31E1 ++:104EB00050F074DC0546002830D02046294622F008 ++:104EC0008BD82B7E13F0020F19D02846022150F008 ++:104ED000B7D8B17CD4F86C32D1F1010138BF0021D0 ++:104EE000082201920291204631460332BC33CDF8AC ++:104EF0000080CDF80C80CDF8108017F00FDED4F8CC ++:104F00006C22012382F8F03008E02046314639F067 ++:104F1000B7DF3F184FF47A6001F01EDC09F1040995 ++:104F2000B9F1200F9AD10025D4F8B434EA18136BE4 ++:104F300013B1506A98473F18343540F2AC439D4254 ++:104F4000F2D194F8F1314BB1A068D4F8AC110AF069 ++:104F500085DB00B90137002384F8F1312046FEF7E4 ++:104F60000DFB236800211976236B4FF0FF32C61921 ++:104F700018690DF0B3FD204615F08ADAD4F878529E ++:104F800007E00023291D606801220093FDF35AF712 ++:104F90002D68002DF5D1236893F82F3073B1631974 ++:104FA000D3F84C1239B18B792BB10B791BB1204658 ++:104FB0000CF028FC36180435202DF0D1D4F87C02F2 ++:104FC00010B10BF03BFE3618206907F0BDFD002341 ++:104FD000801984F8293084F8A03100E0002007B05F ++:104FE000BDE8F0832DE9F04F9BB005462598089267 ++:104FF0000793827AC37A0F4642EA0323269A00F186 ++:105000000C010C3A08980A9113930B92C27D837D90 ++:105010000DF1580943EA0223C3F3C70ABAF10E0F90 ++:1050200094BF002101210F91079918F0C1F8249A2B ++:1050300028460A32114609920F9A50F0B9DB002433 ++:10504000804615AE28462599269A4B461594169407 ++:1050500000961CF0DFDF30B928462599269A4B468A ++:1050600000961EF0D7DFB8F1000F06D0D8F8043054 ++:1050700013F0010F01D00C9427E00B990A9832220B ++:10508000FDF31CF3014620B14078023120F0E2DF4D ++:1050900058B90B990A980122FDF310F3014638B173 ++:1050A0004078023120F0D6DF10B101230C9301E0EB ++:1050B00000200C90B8F1000F07D00C9929B9D8F84E ++:1050C000043043F00103C8F804300A980B99032216 ++:1050D000FDF3F4F2044608B14378A3B92B6893F8C2 ++:1050E0003F3053B1B5F82606C3B2534503D0FEF3A3 ++:1050F00099F0504501D1012300E0002300225FFA1E ++:1051000083FB0D9211E02B6893F83F3043B1B5F863 ++:105110002606FEF387F0A378834201D1012300E045 ++:1051200000235FFA83FBCDF834B0BBF1000F01D14F ++:105130005B4602E03B1E18BF01235FFA83FA2B682F ++:1051400093F8463013F0030002D11090119024E040 ++:1051500095F8723263B9BAF1000F09D0D7F8D4329A ++:10516000DB8813F0200003D110901190129018E00A ++:105170000A990B9A284620F0DFDF0A9911900B9AC2 ++:10518000284620F0A5DF2B68109093F94C0020B141 ++:1051900028460A990B9A1DF0C9DC1290BAF1000F4B ++:1051A00069D02B6893F8463013F0030F63D0109B3F ++:1051B000002B60D0119800285DD019785A782846C5 ++:1051C0000FF0E0DEB5F82696064609F47043B3F515 ++:1051D000005F0CBF38233C23EC58D5F85C016168B4 ++:1051E00040F08CDA10F0080F01D0002104E094F8B0 ++:1051F000EC30191E18BF0121119A137813F0020325 ++:1052000017BF10981A464378C3F3800209F440632D ++:10521000B3F5406F18D1B5F82636B34202D100215C ++:105220000E912EE02B6893F82F30002B40F05B841A ++:105230003046FDF3F7F70446B5F82606FDF3F2F71E ++:10524000844240F0508414E0A9B1A2B106F4406356 ++:10525000B3F5406F0FD12B6893F82F3073B93046F8 ++:10526000FDF3E0F70446B5F82606FDF3DBF78442CC ++:1052700004D10E9605E000220E9202E000230E9368 ++:105280009A462B6B5B7D002B3AD0BBF1000F37D0D9 ++:1052900095F8723233B995F87432002B30D0BAF1E8 ++:1052A000000F2DD195F849365BB1159B002B08DD19 ++:1052B000169B1B7813F0040F03D0D5F8582604234F ++:1052C000136195F8493653B10C9850B9139911F000 ++:1052D000200F0ED1D5F858260423D36009E00C9A8C ++:1052E0003AB1159B002B08DD169B1B7813F0010FBC ++:1052F00003D0D5F8582604231362284625F06CDE27 ++:105300002B6893F8463013F0030F46D0BBF1000F23 ++:1053100043D095F8723233B995F87432002B3CD0F3 ++:10532000BAF1000F39D1B5F8263603F44063B3F56E ++:10533000406F14BF00210121109B13B90C9830B9A4 ++:1053400016E0109A937803F00303032B05D1D5F8E8 ++:10535000582604239361109B53B11098837803F06F ++:105360000303022B04D119B1D5F858260233D362B6 ++:10537000119A7AB1109B6BB111985A78037813F097 ++:10538000020F07D112F0040F04D019B1D5F8582636 ++:105390000423D362284625F0D1DE2B6893F82F3002 ++:1053A000E3B1D5F8FC341B78C3B10D99B1B92846E7 ++:1053B00011992FF01FDA88B128460D992FF01CDBC8 ++:1053C00028462FF00FDBB5F8263603F44063B3F51B ++:1053D000406F03D1284601212FF080DAB8F1000F89 ++:1053E00029D0D8F8F03033B300230B99824A0A98B9 ++:1053F00000931CF087DF41460246284620F0C0D9C2 ++:105400002B6893F8463013F0030F14D0119A2AB189 ++:10541000129B28460093109B41460AE0D8F80430BE ++:1054200013F4803F07D01198119A00904146284606 ++:1054300013461DF0DBDB95F87032002B00F06C8317 ++:105440000FB93E4601E0D7F8DC62BAF1000F00F078 ++:1054500083802B6893F8463013F0030F3DD0BB7C5C ++:1054600043B9B8F1000F08D1284609990F9A50F0B6 ++:10547000B9DA8046B8F1000F2FD01199C9B1D7F829 ++:10548000CC3013F4005F05D0B7F8343543F0200377 ++:10549000A7F83435129A109B009228464146119A7B ++:1054A0001DF0A4DBB7F8343523F02003A7F834351A ++:1054B0000DE0BB7C5BB9D8F8043013F4803F06D014 ++:1054C000119B284641461A4600931DF08FDB284663 ++:1054D0000A990B9A434620F079D9089928461EF07C ++:1054E0005BDA41B238461EF099DA38461EF0EED942 ++:1054F0000899284612F0E4DA0146384611F046DAF7 ++:10550000BB797BB9D7F8E032D7F8D422188A9B8AC6 ++:105510005085938573792BB9BB7C1BB1384601212B ++:1055200035F038DF0023B371F371BC7CA4B996F871 ++:105530008530012B10D186F88540D5F8400126F042 ++:10554000FDDF284639460F22234600940194029439 ++:105550000394049417F0E2DA002F5AD0BB79002BA1 ++:1055600057D1BB7C002B54D0259925988B784A784D ++:105570001B0443EA02230A781343CA78043143EA3E ++:1055800002698B784A781B0443EA022302791343A9 ++:10559000CA7843EA0264F26912B9336A13B935E092 ++:1055A000944204D3944231D1336A99452ED2DDF826 ++:1055B00090E0002300930193029303930493284601 ++:1055C000394616220EF1100317F0A8DA384608996A ++:1055D000079A259B24F0A2DFBBF1000F16D0FB79C0 ++:1055E00063B1BB7C23B107F1BC00FDF3B5F128B971 ++:1055F00007F1BC0104E0C0460FD4010007F1D60159 ++:10560000002228461346009222F02ADDC6F8209098 ++:10561000F461BAF1000F00F01F82BB79002B40F05B ++:105620009681BB7C002B00F0928114AB00932599EE ++:105630003846269A0DF1670316F016DBBDF85010B8 ++:10564000D7F8E462A7F8201595F8EB41002C65D156 ++:1056500000284FD03378022B19D138462146B6F8AE ++:1056600026900BF0DDFDB5F8303885F8324803B1EF ++:10567000F38438461EF0A6DFD7F8E432A6F8269069 ++:105680005B8B002B4AD0384611F062DA46E02B687B ++:105690005B6B4BB195F8FA3133B1B8F1000F14D010 ++:1056A00098F8D2300F2B10D0B27822B12846394664 ++:1056B00023F0D6D832E04FF0FF330093284607F1AD ++:1056C000BC01134622F0CCDC28E095F80D372BB353 ++:1056D000B3785BB1B8F1000F05D0D8F8043023F0EF ++:1056E0000063C8F80430384616F09CDB384623F0D7 ++:1056F000B9DD13E0337A23B1718911B9384623F04B ++:10570000DFDDD7F8E4325B8B43B13378022B05D170 ++:10571000336A012B02D138461EF040DFF3781BB10B ++:105720003846002123F0C0DC737A1BB138460021D3 ++:1057300023F0B2DE2B6B5B7D002B41D0139A284601 ++:10574000C2F3802124F0B2DD169A002A38D0159BCE ++:10575000002B35DDD5F8581691F90130B3F1FF3F34 ++:1057600009D11378C3F340020B78934203D0284643 ++:10577000012120F0FDD8169B1B7813F0040318BFFD ++:10578000012385F8463695F94636012B03D0D5F826 ++:1057900058361B690BB1002300E0012385F842361F ++:1057A000B8F1000F0CD0D8F8043023F00402C8F888 ++:1057B000042095F946361BB942F00403C8F80430BA ++:1057C0002B6893F8463013F0030F36D0109B002B54 ++:1057D00033D0D5F8582692F90630B3F1FF3F27D1E0 ++:1057E000109892F90520837803F003039A4204D0BD ++:1057F00028460B211A4620F0BBD810998B78C3F3AA ++:105800008002D5F85836DB79934203D028460D2123 ++:1058100020F0AED8109A9378C3F30012D5F858361A ++:105820009B7A934209D02846102120F0A1D804E0A9 ++:10583000012B0CBF032300235371D5F85C01B5F88D ++:10584000261640F073DB90B1D5F85C01B5F826164A ++:105850003FF0ACDF2B6B18690DF068F9B5F8263610 ++:10586000834204D1002128460A461EF095DBB8F198 ++:10587000000F3FD0D8F8043013F0400F00F03F8104 ++:105880000A9B0B981893179006E02846214618AA01 ++:1058900017AB1DF063DE40B918981799DD22FCF3B1 ++:1058A0000DF704460028F0D122E1A11C0E79012E4B ++:1058B00040F025818A7995F80C3202F00F0203F04E ++:1058C0000F039A4200F01B8105F500740634204650 ++:1058D0001822FCF351F32B6893F830303BB1D5F824 ++:1058E0003407214600F563701822FCF345F338466F ++:1058F000314602E128460A990B9A10F087DC01280C ++:1059000002D128460EF018DA0E9929B195F86D35B6 ++:1059100013B9284618F0DED8259A079B0092D5F8CF ++:105920004C013946089A49F07DDAD7F8CC3013F4A7 ++:10593000005F00F0F180259B269800930190394686 ++:10594000D5F84C01089A079B4AF0C2D9E4E0BB7C29 ++:10595000002B40F081800C9909B1012102E0139ADB ++:10596000C2F34011CCB2B8F1000F15D0D8F8043012 ++:1059700014B143F0040301E023F00403C8F8043039 ++:105980000B990023664A0A9800931CF0BBDC414641 ++:10599000024628461FF0F4DE2B6B5B7D13B3159B8C ++:1059A000002B11DD169B1B7813F0040F03D0D5F8E4 ++:1059B000582604231361169B1B7813F0020F03D0A3 ++:1059C000D5F85826042353620C9B1BB9D5F85826EA ++:1059D0000433D3611CB9D5F858260423D360284674 ++:1059E00025F0FADA2B6893F8463013F0030F00F035 ++:1059F0009380109840B1837803F00303032B03D105 ++:105A0000D5F85826013393621199C9B1119BB5F8A5 ++:105A100026165A781B7843EA022010F0100F03D1A3 ++:105A2000D5F858260423536310F0020F08D101F46F ++:105A30004063B3F5406F03D1D5F8582604231363B0 ++:105A4000109828B90C9919B1D5F858260423536138 ++:105A5000284625F073DB5FE095F85735002B5BD0C7 ++:105A6000BBF1000F58D0139A12F0020F54D00A98CD ++:105A70000B990022FCF322F6034600284CD028465E ++:105A8000991C5A7839F06EDC0446002844D0837C97 ++:105A9000002B41D10899079A16F0B4DE00283BD0BC ++:105AA000259BD4F8D06226980093249B019003F1A3 ++:105AB0001002284608990123029620F053DC024682 ++:105AC00050BB296BD5F86036503106F138009B7811 ++:105AD0004BF054DA269808990090079A2046259BA7 ++:105AE00034F034DD18E000218A460E91FFF7C9BB7F ++:105AF000022385F80E32384601211CF051D90023CB ++:105B00000B990A98064A00931CF0FCDB41460246BA ++:105B100028461FF035DEEDE61BB0BDE8F08FC0462D ++:105B20000FD401002DE9F04FD2F81080C1B0D8F8A1 ++:105B3000D8A2064609910892DAF82C00DAF830105B ++:105B400000220793FCF3BAF520B1831C109342782E ++:105B50000B9205E0099A099B093210921B7A0B936C ++:105B60002CAF002128223846FCF36AF200212822BB ++:105B700022A8FCF365F2DAF830100122DAF82C00E2 ++:105B8000FCF39CF5DAF8301004463222DAF82C00E7 ++:105B9000FCF394F505463CB16278102A04D8381D10 ++:105BA000A11C2C92FCF3E8F13DB16A78102A04D8CC ++:105BB00023A8A91C2292FCF3DFF1099AD38813F0E1 ++:105BC000010F17D0316B4B7DA3B10A6D2CAC201D9A ++:105BD00054312C92FCF3D0F1D8F8CC3013F4005FA0 ++:105BE00005D0D6F84C014146224649F0E3DF0023B8 ++:105BF000229309E022AB0093099B304603F138025F ++:105C000041462CAB20F022D9B8F86250DAF82C408B ++:105C1000B5F5806FDAF8307059D0B5F5006F04D162 ++:105C20000022934611920C9257E020463946FDF32C ++:105C300051F3119020B143784FF0000B0C930BE01F ++:105C4000204639463022FCF339F5834610B9119AC3 ++:105C50000C9201E043780C93402D09D0802D07D0A1 ++:105C6000102D05D0B5F5807F02D0B5F5007F33D17A ++:105C7000D8F8582040F2371302EA030363B30C9AB2 ++:105C8000BBF1000F08BF1422402D0C922ED14FF013 ++:105C900000094F4616E0162307FB03F303F5B47320 ++:105CA00008EB03040998211D0622FCF349F140B9D1 ++:105CB00040AB03EB890204F10A0342F8B83C09F156 ++:105CC00001090137D8F8CC329F42E4D310E000221A ++:105CD000934611920C9200E045B1D8F8582040F25A ++:105CE000371302EA03030BB118230C934FF000099A ++:105CF00040F2EE5301933FAB0293079B099A002BAE ++:105D000014BF20210021304608F1C20300921CF08C ++:105D100053DB0D9030B930460D99B8F80C2332F0B2 ++:105D2000DDDE83E23F9A304602F5BC630E330A9211 ++:105D30004146099A0E93FDF707FB0A9A1070C0F3CB ++:105D40000F2050709AF8223093709AF82330D37055 ++:105D5000131D3F93079B8BB10AF124042046FCF3EB ++:105D6000FBF510B93F98214602E03F9808F1D601B3 ++:105D70000622FCF301F13F9B06333F933F9A00213B ++:105D80000F921046109B0B9A26F0EED92DAB0121F5 ++:105D90002C9A3F9026F0E8D90C9B3F90002B7CD0AA ++:105DA000BBF1000F11D0B9F1000F03D030465946B6 ++:105DB000FDF7F6FA3F9C5946204617F0A7DC3F90C6 ++:105DC0009BF80130A346637019E0402D09D0802D67 ++:105DD00007D0102D05D0B5F5807F02D0B5F5007F36 ++:105DE0005BD1A649834617F091DC099B3F9003F1F4 ++:105DF0007B02304641460BF1040313F0F5DA402DE7 ++:105E000009D0802D07D0102D05D0B5F5807F02D0A8 ++:105E1000B5F5007F41D1B9F1000F01D14C4626E024 ++:105E20009BF801300BF1020202F80390D7184FEAF9 ++:105E300019237B709BF80130002402338BF801306A ++:105E40003F9B02333F9312AB07EB041053F824102F ++:105E500002301022FCF390F09BF801300134103333 ++:105E60008BF801303F9B10334C453F93EBD1D6F874 ++:105E70006C32D3F8D8325B68022B0ED16CB10022A1 ++:105E800000920192CDF808B09BF801303046023301 ++:105E90000393572113461DF00BDE229A2AB13F9837 ++:105EA000322123AB26F060D93F90DAF82C401CE079 ++:105EB0006278C1F102031B199B18671C83421CD82E ++:105EC000119BA34219D02378012B0BD9302B09D079 ++:105ED00002323F982146FCF34FF03F9B6278023339 ++:105EE0009B183F933B78A21CD41834B1DAF82C10DD ++:105EF000DAF830000B189C42DAD3336893F8463056 ++:105F000013F0030F18D0089A536813F4803F13D08E ++:105F1000326B0DF1DB041368404621466532022BDB ++:105F200014BF0023012326F081D83F982D211A2287 ++:105F3000234626F019D93F9096F8653633B106F519 ++:105F4000CC613F98043117F0E1DB3F90336893F860 ++:105F5000463013F0030F1FD0089A536813F4803FA4 ++:105F60001AD0326B0DF1DB0113684046022B14BFCF ++:105F700000230123653226F059D83F990E9B8B42AE ++:105F800001D2002202E00E9BC1EB030230460DF16C ++:105F9000DB0325F009DF3F9033685B6B4BB3099A55 ++:105FA000D38813F0040F24D00DF1F50034490322F7 ++:105FB000FBF3E2F702238DF8F83000238DF8F93077 ++:105FC00001338DF8FA3096F8FA313BB1099A92F91B ++:105FD0006A30002B02DA96F80A3700E000238DF8C9 ++:105FE000FB303F98DD2107220DF1F50326F0BCD8E8 ++:105FF0003F90B5F5806F02D0B5F5006F06D1D8F8A7 ++:106000002C3543B33F98D8F8281505E00C9B13B303 ++:10601000119A2AB13F98114617F078DB3F901AE0A9 ++:10602000402D18D0802D16D0102D14D0B5F5807FBE ++:1060300011D0B5F5007F0ED03F9C1249204617F0D5 ++:1060400065DB099B3F9003F16B023046414604F14A ++:10605000080313F0C9D96B1E9BB2012B03D9042D81 ++:1060600001D0082D10D1099A506E002838D0B2F80E ++:1060700068100C300C39FDF32DF11BE0CCD28500FB ++:1060800017D40100E2D28500402D09D0802D07D021 ++:10609000102D05D0B5F5807F02D0B5F5007F1FD15A ++:1060A000099B586EE0B1B3F868100C300C393022FF ++:1060B000FCF304F3A0B1D6F86C32D3F8D8325B68A5 ++:1060C000022B0DD14378102B0AD902330022029003 ++:1060D0000393304657210123009201921DF0E8DC22 ++:1060E000D8F8583013F0040F01D004230EE013F059 ++:1060F000020F01D0022309E013F0010F01D00123A8 ++:1061000004E013F4807318BF4FF48073089A13648B ++:10611000336893F8463013F0030F2DD0089A136CB0 ++:10612000013B012B09D8536813F4802F05D0114689 ++:106130003046062224F0B4DD1EE0089A536813F4BA ++:10614000802F19D011463046062224F04DDD30460E ++:1061500016F07ADF012801460ED1D6F8F83742F260 ++:106160000E721B88013B9BB2934202D83046013924 ++:1061700000E0304628F0AADF3F9C0E9BA34201D2EC ++:10618000002302E00E9AC4EB020300932023019344 ++:10619000002123464FF0FF32404639F0C5DF0F9B08 ++:1061A00000273F90C01A03930490414655223B4676 ++:1061B000304600970197029716F0B0DC0A9A3F9B91 ++:1061C000A2F11805C5EB0304DAF834100D9B9C828C ++:1061D00021B17068DAF8382000F08ADD0A9A706818 ++:1061E000C5EB0203E41A214600F072DDCAF8340060 ++:1061F00040B1079BCAF838408AF83C300A992246D9 ++:10620000FBF3BAF6099A3046B2F862300197C3F34D ++:10621000401300930297089B0D99D6F804281FF0AD ++:1062200081DC0D9B002808BF00230D930D9841B021 ++:10623000BDE8F08F2DE9F04F95B0079119690692EE ++:1062400005930A9101F106098A7999F80130064609 ++:1062500042EA0323069A0893C0F87828C3F381051D ++:1062600013465B79127942EA0323099303F003038F ++:10627000022B08D1089C14F4004F04D0D5F101037F ++:1062800038BF002300E00023DBB205990B930B9A83 ++:106290008B8AA3F10A0893001DB918339845C0F200 ++:1062A000A081089B03F0FC07A42F03D0842F01D00A ++:1062B000942F03D1B8F10F0F40F3938199F8043074 ++:1062C00009F1040A13F001030C9303D00024109485 ++:1062D0000D9408E05146304639F020D8011E18BF11 ++:1062E000012110900D9125B1002293460E920F923C ++:1062F00010E009F110043046214638F0EBDF0E9033 ++:1063000010B183460F9505E03046214639F04CD850 ++:1063100083460F9096F8C83123B9326892F82C3032 ++:1063200033B925E030460699059A00230FF068DD61 ++:10633000A42F03D0842F01D0942F01D10D9B53BBE8 ++:10634000802F28D0502F26D0002D40F006840D9CA1 ++:106350000CBB5046FCF3F0F2002800F0FE83BBF1CA ++:10636000000F18D109F11000FCF3E6F298B9F4E33C ++:106370000C9981B90D9B43B192F838305BB155B996 ++:10638000BBF1000F07D1109C2CB9D2F88C20936F71 ++:1063900001339367E1E396F8C8317BB9BBF1000F95 ++:1063A00001D05C4601E0D6F86C4294F8E5302BB1A0 ++:1063B00030460699059AA3680FF022DD012D10D111 ++:1063C000C42F0ED0D42F0CD009F10A00FCF3C4F274 ++:1063D000002840F0C28399F80A3013F0010F40F012 ++:1063E000BC83059930460B69A1F8148006330B6114 ++:1063F00033684946D3F88C20D36C0133D3641FFA39 ++:1064000088F30093069A13AB12F072D830B1336858 ++:10641000D3F88C20D36F0133D3679EE3139A12B164 ++:1064200033689B6A1362012D39D1059A059B106967 ++:10643000998A00F11002059C1A61A1F11003A38250 ++:106440000B9B2BB100F11402A1F114032261A38272 ++:106450000599A42F8C8A0FD113990B699B79002B76 ++:1064600000F07B8391F8DF30002B00F0768330461C ++:10647000089A2FF0DDDD70E3336893F84230002B8B ++:1064800000F06B83842F02D0942F40F06683D6F8FF ++:10649000400113992346009728F0C2DF5DE3069A76 ++:1064A000937DD27D43EA0223C3F3C7030E2BD4BFEF ++:1064B0000023012311930C9B002B62D199F8163015 ++:1064C00099F8172043EA0228139B33B9304609F1A3 ++:1064D0000A01119A4FF06CD91390089C14F4006AC9 ++:1064E00005D0139B1BB1B3F8BC30434525D0139B9B ++:1064F0000BB1A3F8BC80139B8BB142E006EBC20347 ++:1065000003F5F3642046FCF327F270B909F10A00A1 ++:1065100021460622FBF314F5013508B906E01D46B5 ++:1065200096F8E837EAB29342E8D20024BAF1000FB5 ++:106530000CD064B1E388434521D13368D3F88C2073 ++:10654000D2F8BC310133C2F8BC3106E3BCB996F8CD ++:10655000E83709F10A0106EBC30202F5F3640133DF ++:1065600086F8E83706222046FBF306F596F8E8178A ++:106570000A23B1FBF3F202FB131386F8E837A4F801 ++:1065800006800D9961B10E9A52B19BF806303BB965 ++:10659000DBF8E4321B7A1BB15846089910F0B4DEE0 ++:1065A000059B059C1869998A00F118021A619246A8 ++:1065B0000B9AA1F11803A38232B100F11C02A1F1E0 ++:1065C0001C032261A3829246059C0899099BB4F89A ++:1065D000148011F48044C3F3C0150DD0B8F1070F37 ++:1065E00006DC3368D3F88C20536E01335366B4E273 ++:1065F000B02F40F0B28227E0502F00F087800ED8F5 ++:10660000202F00F0768205D8002F00F07282102F24 ++:1066100045D0A2E2302F42D0402F56D09DE2B02F7D ++:106620000ED006D8802F00F09080A02F00F055816A ++:1066300093E2C02F00F0AC81D02F00F07B828CE27F ++:10664000B8F1050F40F38382BBF1000F00F08582A3 ++:106650009BF80630A3B19BF80430002B00F07D823C ++:10666000069ACDF800800195137CD6F8340703F024 ++:106670000803029359464A46534604F06DFE6CE205 ++:10668000D6F8403593F93430002B00F06682584636 ++:10669000494652464346009532F09ADC5DE2B8F135 ++:1066A000050F40F35482BBF1000F00F056829BF8B7 ++:1066B0000630002B40F05182139B58460093494608 ++:1066C0005246434632F042DA47E2336893F8953057 ++:1066D00013B996F872326BB108F118030393304680 ++:1066E0002C2109F10A02234600940194CDF8089068 ++:1066F0001DF0DED9069B0A9C0093D6F84C01494652 ++:1067000052464346019449F00FDB26E2B8F10B0FE5 ++:1067100040F31D82D6F84C015146424649F0BEDC9A ++:10672000D6F868319B79002B00F017820D9900296B ++:1067300000F01382304606990A9A4B46CDF800A025 ++:10674000CDF8048010F042DF07E2B8F10B0F40F300 ++:10675000FE810A9B30460E99069ACDF80090CDF83E ++:1067600004A0CDF80880FEF73DFCD6F868319B798F ++:106770004BB1304606990A9A4B46CDF800A0CDF8A9 ++:10678000048010F023DF96F87232002B2ED19AF895 ++:106790000A3013F0010F29D030465146424617F017 ++:1067A00039D818BB069A937DD27D43EA0223C3F3FE ++:1067B000C7040E2C8CBF0023012363B10AF10C0027 ++:1067C000A8F10C010322FBF379F778B143786BB1A0 ++:1067D0008378A3420AD1336B18690CF0A7F9C0B2D1 ++:1067E000844203D1D6F868014EF0AAD80F9B0BB1B2 ++:1067F0001D4607E0304609F1100138F0D5DD0546A9 ++:10680000002846D0AA79002A43D10AF10C00A8F149 ++:106810000C01D5F8D842D5F8DC72FBF34FF7A2682B ++:1068200081460B2A08D1284606990A9A5346CDF884 ++:10683000008033F08BDE0DE0336893F831304BB1DC ++:106840000F2A07D1284606990A9A5346CDF80080A8 ++:1068500034F04CDAAB7CE3B197F85A30CBB1D6F8D0 ++:106860006801494601224EF013D930B197F85930EA ++:106870001BB9013387F859300BE0D6F86801494657 ++:1068800001224EF005D920B997F859300BB187F89D ++:1068900059000E9C002C00F06081DBF8D8329B6818 ++:1068A0000C2B40F05A815346584606990A9A23F019 ++:1068B00035DE5846002131F0FFDF336893F82F3082 ++:1068C00023B1D6F834072EF025DA46E1DBF8E432BE ++:1068D000584699780AF0A4FC3FE1B8F1010F40F363 ++:1068E0003681BBF1000F00F038819BF80630BAF812 ++:1068F00000505BBB3046139920F06EDB1398037E8B ++:1069000013F0020F14D002214EF09ADB139B1B7E72 ++:1069100013F0080F0CD130465946224609F10A03FC ++:1069200000950194CDF808A0CDF80C800AF0D8FAB3 ++:106930000E99002900F01181DBF8D8329B6813B161 ++:10694000584631F003DF58460321ADE013990B6937 ++:106950005B4540F00281304620F03EDB1398037E19 ++:1069600013F0020F10D012214EF06ADB3046594668 ++:10697000224609F10A0300950194CDF808A0CDF84C ++:106980000C800AF0ADFAAFE010214EF059DBE4E0E4 ++:10699000B8F1010F40F3DB80BBF1000F01D05F467F ++:1069A00004E0109A002A00F0D880174600252C46F3 ++:1069B0003319D3F84C1241B109F11000BC31062251 ++:1069C000FBF3BEF2002808BF01250434202CEFD1D0 ++:1069D000002D00F0C280139BBAF8004033B9304656 ++:1069E00009F10A01119A4EF0E3DE1390139911B1E7 ++:1069F000304620F0F1DABB791398002B57D10028EC ++:106A00003CD012214EF01CDB1398037E13F0010FD3 ++:106A100003D1436813F0005F30D001214EF010DB4A ++:106A2000A4F10D039BB2092B07D83368D3F88C204F ++:106A3000D2F8F8310133C2F8F83197F91030022B4F ++:106A400003D1F8680E2152F08DDD13990B7E13F0FF ++:106A500004020ED100944B683046C3F34073019397 ++:106A6000394609F10A03CDF808A0CDF80C8032F0C0 ++:106A7000B7DC139A536823F0005353600E9B002B2E ++:106A80006BD09BF81230002B67D0DBF8D82253680C ++:106A9000022B02D19368082B5FD8936813B1584634 ++:106AA00031F054DE5846022134F074DC55E0002801 ++:106AB00053D00169B94250D1D0F8F0301BB14368CE ++:106AC00023F400734360139B1B7E13F0010F44D02B ++:106AD0000022304609F10A0300940192CDF808A083 ++:106AE000CDF80C8032F07CDC304613994EF068DE35 ++:106AF00033E0B8F1030F2ADDBBF1000F2DD09BF876 ++:106B0000043053B39BF806303BB309F110000BF18E ++:106B1000BC010622FBF314F2F8B9139BD6F8340734 ++:106B2000019359464A465346CDF8008002950AF033 ++:106B300061FC12E00A99069C0291304613994A467C ++:106B40005346CDF80080019410F038DC05E033683E ++:106B5000D3F88C20136F013313670798059900222F ++:106B600000F0DED815B0BDE8F08FC0462DE9F04F3B ++:106B7000436899B0164689460493918B96F82A305B ++:106B8000126880460292D9F810A00BB9059302E072 ++:106B900096F82220059296F82C00B0B911F4006FF7 ++:106BA00013D0059A09EB4203B3F8AC20B6F87E3057 ++:106BB0009A420AD1D8F80030D3F88C20D2F8BC31F0 ++:106BC0000133C2F8BC3100F065BC9AF80630C1F35D ++:106BD000802B7BBBDAF8E442237A6BB160B9BBF15E ++:106BE000000F09D199F8D230726A134113F0010FE6 ++:106BF00002D1504610F088DBD8F800305B6BCBB187 ++:106C0000237EBBB196F82A30A3B196F828308BB119 ++:106C10000021504621F0BEDEDAF8CC3013F4005FDC ++:106C200008D0B38B13F4005204D1D8F84C0151466C ++:106C300048F0AAD9338C13F0040440F02B84B38BB2 ++:106C400003F4804373634BB9DAF8582040F23713EA ++:106C500002EA03032BB39AF8603013B3059BB463C5 ++:106C60000093404604994A4633464FF051DF08B13D ++:106C700022460EE0736B23B1D9F86C310133C9F8A9 ++:106C80006C31D8F8003093F89530002B00F0028476 ++:106C90000122736B33B1D9F868310133C9F8683117 ++:106CA00000E0002296F82C300BB1002708E005998F ++:106CB00009EB4103B6F87E10B3F8AC70A3F8AC1042 ++:106CC000D8F8000090F8953013B1002A40F0E28324 ++:106CD00096F82C50002D40F00081B6F87E20059BE0 ++:106CE00012F00F0C4FEA830E40F081800EEB090783 ++:106CF000F96E41B104982A4600F012D8FD66C7F833 ++:106D00008C50C7F83051BBF1000F00F0E68073697A ++:106D1000F168FB66D8F800307269DB6903919C6802 ++:106D20001169D368908ACB1892681B189B1A0918AE ++:106D30005B1AA34223DA0498214600F021D8F866B2 ++:106D4000002800F0A7837369006919699C689A8A12 ++:106D5000C4EB0104091BA218FBF30EF17169FA6E72 ++:106D600008698B68C01A13691B181361938A1B1A70 ++:106D700093828B8A049893822A46FFF3D1F7D8F83E ++:106D80000030D8F82828DB6903999B68AA489B1A29 ++:106D90005B1A063BC7F88C3071680822FBF3D0F011 ++:106DA00050B1A64871680622FBF3CAF048B973686F ++:106DB000DB88B3F5407F04D1D9F8043043F00803F1 ++:106DC00003E0D9F8043023F00803C9F804309C48E4 ++:106DD00071680822FBF3B4F0D9F8083010B943F019 ++:106DE000200301E023F02003C9F8083075E00EEB22 ++:106DF0000904E16E11B9D0F88C2017E022F00F02DF ++:106E000027F00F039A4204D107F00F0301339C458A ++:106E100010D02A460498FFF383F7D8F80030E566CF ++:106E2000D3F88C20C4F88C50C4F83051136E013361 ++:106E300013662FE3B068D4F88C309842E9D8049BED ++:106E400009EB0E020090019340468C3273680CF0FF ++:106E5000C7D8049871692A46FFF362F7BBF1000FA7 ++:106E60003BD1E36EC4F88CB07361C4F86CB0736945 ++:106E7000C4F830B11A69998A02F118037360A1F15C ++:106E80001803B36096F829303260F1602BB102F13B ++:106E90001E037360A1F11E03B36096F82A3043B15C ++:106EA0007368059902337360B36886F82210023B59 ++:106EB000B36032681378527843EA0223B383736B6A ++:106EC0005BB1B16B49B191F90E2073689B18736087 ++:106ED00091F90E20B3689B1AB360B36B73B11B7A40 ++:106EE000042B03D1404631464FF0C0DEB36B1B7A12 ++:106EF0000B2B03D1404631464FF0D4DFBBF1000FDE ++:106F000040F02283D8F8003093F89530002B73D0EE ++:106F1000DAF808309B7913F0010F40F0DA826BE069 ++:106F200010F4000F00F4E06310D01B0A043B012BA7 ++:106F3000444A00F07F0004D8142300FB0323DA68DE ++:106F400014E0142300FB03239A680FE01B0A043BA0 ++:106F5000012B3C4A00F07F0004D8142300FB0323DC ++:106F60005A6803E0142300FB03F39A584FF4FA73B2 ++:106F7000B2FBF3F007E000F07F034FF4FA7203FB7B ++:106F800002F3B3FBF2F0C0F307238DF825300DF1C7 ++:106F90001B05C0F307438DF824008DF82630012728 ++:106FA000030E316805F10F0018228DF827308DF897 ++:106FB0002970FAF3E1F796F82F30DBB19DF82B201A ++:106FC0009DF82A3005F1190443EA022343F40073C3 ++:106FD0008DF82A3021461B0A062205F11F008DF884 ++:106FE0002B30FAF3C9F7D8F86C122046BC310622D0 ++:106FF000FAF3C2F7BB4601E04FF0000BD8F80030BF ++:1070000093F8953013B91C461A4602E00DF11B04A3 ++:107010002D2273695B6A13F0400F15D013F0800FB7 ++:1070200000F038820092D8F83C01494632462346A7 ++:1070300029F00EDE88E2C046401E86002CD40100F6 ++:10704000481E86008418860031680DF15A07043105 ++:1070500006223846FAF390F7316815AD0A31062258 ++:107060002846FAF389F731680DF14E0420461031B5 ++:107070000622FAF381F796F829302BB1316812A86D ++:1070800018310622FAF378F7B38B13F4807F03F4F8 ++:10709000007305D1002B14BF23462B46776704E00D ++:1070A00074670BB9356701E012AB33677468BBF1E5 ++:1070B000000F00F0EE803368F3662378AA2B23D10B ++:1070C0006378AA2B20D1A378032B1DD1E378DBB9F9 ++:1070D0002379CBB9637943B9A379E179404641EA91 ++:1070E00003210BF0F1DB50B10EE0F82B0CD1A379AA ++:1070F000E179404641EA03210BF0E6DB20B1A279B9 ++:10710000E37943EA022500E03589D8F8003093F8A6 ++:107110009530D3B1DAF8E0305BB9736BABB9DAF81C ++:10712000582040F2371302EA030373B19AF8603033 ++:107130005BB1059A40460192494652463346009556 ++:107140000DF022DA002840F0A581B36B6BB11B7AF9 ++:10715000012B0AD0032B08D0404604994A463346F7 ++:1071600009F0DEFE002800F09581736F1B7813F0A4 ++:10717000010F08D0D8F80030D3F88C20D2F8D031E5 ++:107180000133C2F8D031B36B33B11B7A022B03D178 ++:10719000404631464FF06ADD726B22B996F82A30CC ++:1071A00023B3144602E0B36B93F90E4096F82A30ED ++:1071B0005BB1336802341A78597842EA012222F02E ++:1071C000800292B21A70120A5A707368581E03E055 ++:1071D00063421B5C00F8013971690A699042F7D279 ++:1071E0008B8A12191B1B0A618B82326096F82F3032 ++:1071F000BBB130684278037800F10A0443EA022305 ++:1072000043F4007303701B0A4370214606221030BA ++:10721000FAF3B2F6D8F86C122046BC310622FAF323 ++:10722000ABF69AF9103093B148F68E039D420ED119 ++:107230003168726BDAF80C001231003A18BF012283 ++:107240000AF1180351F0AEDE002840F02381716985 ++:107250000A698B8A9B18CA68D21A2C2A40F21A81B2 ++:1072600000238DF829308B8A08692D2218180DF11A ++:107270001B01FAF381F6716996F82220CB8A02F09D ++:10728000070223F007031A43CA8296F829200091C7 ++:10729000FAE0D6F814B02378DBF81070AA2BC7EB0D ++:1072A000040529D16378AA2B26D1A378032B23D1F7 ++:1072B000E3780BBB2379FBB9637943B9A379E1790F ++:1072C000404641EA03210BF0FFDA50B114E0F82BFD ++:1072D00012D1A379E179404641EA03210BF0F4DAB7 ++:1072E00050B17269A91F7B18CBF81030938A5B1AD2 ++:1072F00093821369F36628E0DAF8583013F0200F10 ++:107300000FD0204692490822FAF31AF648B972695A ++:10731000281D1169938A09181B1A11619382F1665D ++:1073200013E07269A5F10E00938A11691B1A93820A ++:1073300033890918116103F0FF021B0A43EA022393 ++:10734000F1660B73C3F30F234B73B36B6BB11B7AF3 ++:10735000012B0AD0032B08D0404604994A463346F5 ++:1073600009F0DEFD002800F09580B36B33B11B7A85 ++:10737000022B03D1404631464FF078DC0622716F74 ++:10738000F06EFAF3F9F5F06E06220630316FFAF37B ++:10739000F3F5716996F82220CB8A02F0070223F0F8 ++:1073A00007031A43736FCA821B7813F0010F08D0CA ++:1073B000D8F80030D3F88C20D2F8D0310133C2F89D ++:1073C000D0319AF8613093B199F8183013F0100F5A ++:1073D0000DD1F36E1A7B5B7B43EA022348F68E02E3 ++:1073E000934204D073695B6A13F0100F52D09AF87D ++:1073F0006530BBB199F8183013F0100F12D1F36E4D ++:107400001A7B5B7B43EA022248F6B4039A4209D016 ++:10741000263B9A4206D073695B6A002B02DB13F0AD ++:10742000100F37D09AF8063023B9DAF8E422013386 ++:1074300082F82A3098F83238013388F832389AF9CD ++:107440001030EBB1F16E0B7B4A7B42EA032248F627 ++:107450008E039A4214D10B8A03F0FF021B0A43EAFF ++:107460000223B2680C3A934214D8726BDAF80C001B ++:10747000003A18BF01220AF1180351F093DD48B910 ++:10748000736996F82920009340464946736F1FF0B0 ++:107490007BD959E0D8F80000436BA3B171692D4A3C ++:1074A000CB8AD0F8904003F00703D25C2A4B0498B3 ++:1074B0009B5C04EBC304636EA56E01336366FBF350 ++:1074C000A9F64019A066049871690022FFF328F418 ++:1074D0003AE0D8F8303005991A8940468DF81B20DB ++:1074E000130A120E8DF81C308DF81E200023B2698D ++:1074F0008DF81D30937DD27D43EA0223C3F3C70389 ++:107500008DF81F3009EB410393F8AC30D6F88010AA ++:1075100003F00F0301338DF828301CF03DDA029A96 ++:1075200040B2030E8DF82000911FD6F880008DF830 ++:1075300021308DF822308DF8233015F039FE10F00F ++:10754000006F7FF4EDAC16E519B0BDE8F08FC046D2 ++:10755000F7E38500C4D2850098E085002DE9F04F5F ++:107560000024A7B08DF832408DF83B408DF83840AC ++:107570008DF870408DF83F409A4609939B8A0546E6 ++:10758000212B02911746259412940D940A9224926D ++:107590001B9450D9DAF810901046494615F008FEB1 ++:1075A00009F1060203900492527899F8063043EAF2 ++:1075B0000223ADF82C30C3F38103ADF82E30BDF8B3 ++:1075C0002C30C3F3031203F44073B3F5407F14BFB0 ++:1075D000002301238DF83930BDF82E30ADF830206E ++:1075E000022B0ABFBDF830302346C3F3C0038DF829 ++:1075F0003A303B7903F00303022B08D1BDF92C305C ++:10760000002B04DABDF83030C3F3C00300E00023E0 ++:10761000D9B29DF839009DF83A308DF83B1000281A ++:107620000CBF2222282203B1023201B10432099B8D ++:107630009B8A934206D22B68D3F88C20536E013379 ++:107640005366A5E304990B7903F001038DF83C30F0 ++:1076500020B100231E468DF8403015E0BDF82C30D7 ++:1076600013F4807F01D0043105E013F4007F01D0D2 ++:107670000A3100E01031284637F02CDE031E18BF17 ++:10768000012306468DF840309DF83C303BB9049903 ++:107690002846043137F042DE08B1012400E000241E ++:1076A00095F8C83123B92B6893F82C3033B92FE003 ++:1076B00028463946099A00230EF0A2DB2B6893F87E ++:1076C0003F300BB98DF8403054BBBDF82C3013F46B ++:1076D000807F05D19DF83C3013B19DF840303BBB15 ++:1076E0009DF8393013B19DF83C300BBB2B6893F8F3 ++:1076F0002C30002B00F04C839DF84030002B00F024 ++:107700004783B379002B40F043834FF0010B11E026 ++:107710009DF83C301BB9002C00F03A8300E03CB1EE ++:107720009DF8393023B99DF84030002B00F03083AC ++:107730004FF0000B2B6893F895304BB346B39DF890 ++:107740003C30D6F8DC405BB914F0010F00F0208328 ++:10775000049806F1C20104300622FAF3F1F314E0B2 ++:1077600004980430FBF3E8F020B114F0080F00F0A7 ++:107770000F830DE014F0040F0AD114F0020F00F093 ++:107780000783284604990EF0A7DA002840F000830A ++:10779000099A136906331361938A063B9382049A0C ++:1077A00002F1180305939DF8393013B102F11E035D ++:1077B000059300238DF83D309DF83A306BB3059B5F ++:1077C0005A781B7843EA0221C1F3C0138DF83D308B ++:1077D0007BB126B196F81935002B40F0D98295F887 ++:1077E000CF31002B00F0D482099A536A43F0400352 ++:1077F0005362844B01F007028DF832209A5C824B71 ++:107800009B5C0D93C1F300138DF83830059B023358 ++:1078100005939DF832308DF870309DF83D3023B9D6 ++:10782000099A938A043B938206E002980999FBF334 ++:1078300069F1838A043B8382099A059C938A1269C1 ++:107840000793A41A1B1B514602980693FBF3E2F41C ++:107850000499001B08908B7DCA7D43EA0223ADF892 ++:107860008E30BBF1000F2ED1079B284600933A467D ++:1078700025AB10F03DDE002840F08A82BDF82C30A8 ++:1078800013F4407F3BD1BA7DFB7D049942EA032289 ++:10789000C2F3C70228460A310E2AD4BF00220122B1 ++:1078A0004EF0A0D8259030B92B68D3F88C20D36E39 ++:1078B0000133D3666CE20369D3F8CC30C3F3C01351 ++:1078C0008DF83F301BE0BDF82C3013F4407F16D00C ++:1078D0009DF839309BB9259B8BB9BA7DFB7D284635 ++:1078E00042EA0322C2F3C7020A310E2AD4BF0022A1 ++:1078F00001224EF077D82590002800F04982259B80 ++:107900001C69D4F8DC82BBF1000F23D19DF839301B ++:1079100003BB9DF83C3023B1BDF82C3013F4807FBD ++:1079200011D1A379BDF82C201BB112F4807F0AD0AD ++:1079300010E0A37C02F44072002B14BF4FF40073DC ++:1079400000239A4206D02B68D3F88C20936D013324 ++:1079500093651DE295F82D370AF1240A33B99DF895 ++:107960003F1019B9A3790BB10E4608E028463946F5 ++:107970001CF012D8C0B246B208B18AF80900A37947 ++:10798000FBB99DF83F30E3B9314620461CF046D89C ++:1079900020461BF09BDF3946284610F091D801465F ++:1079A00020460EF0F3DF9DF8403053B1A37C43B185 ++:1079B000E37933B198F805301BB92046012133F043 ++:1079C000E9DC95F82D3733B99DF83F301BB9259B7D ++:1079D000D3F8FC3073B16EB1259AD2F8F810D2F812 ++:1079E000F43043F82160D2F8F830013303F0070394 ++:1079F000C2F8F8309DF8393043B1B4F86200ADF800 ++:107A0000780040E0C4D2850098E08500A3792599EC ++:107A1000002B35D08A8FADF878204A6812F0400FDD ++:107A200020D09DF83A30EBB1049B9B7D13F00F0FF3 ++:107A300018D191F8DF30ABB18B7E13F0010F11D16B ++:107A4000BDF82C3013F4805F0CD012F4003F09D045 ++:107A50000D9A91F8D130134113F0010F02D028464E ++:107A60002DF034DFBDF82C30259913F4805F15BF5D ++:107A70004B684B6843F4003323F400334B6002E05F ++:107A8000898FADF8781095F82D371BB9259BD3F861 ++:107A9000FC3073B16EB1259AD2F8F810D2F8F430F8 ++:107AA00043F82160D2F8F830013303F00703C2F83D ++:107AB000F830259BD3F87C1159B1D1F808360398DA ++:107AC00001EB8302013303F03F03C2F80C06C1F857 ++:107AD0000836A3795BB9A37C4BB19DF83C3033B930 ++:107AE000BBF1000F03D188F806B088F807B09DF805 ++:107AF0003C30FBB1A379002B40F04A81A37C4BB111 ++:107B0000296804984E3110300622FAF319F2002841 ++:107B100000F03E8104980430FAF30EF750B92B6858 ++:107B200093F83E3033B9284604990EF0D5D8002892 ++:107B300040F02E81039ACAF814209DF83C308BB98E ++:107B400099F8022099F80130134399F800201A435C ++:107B500008D0BB7CFA7CD5F86001039943EA022285 ++:107B60004BF022DADAF8142012F0006F26D012F46B ++:107B7000000F02F4E06310D01B0A043B012B96486F ++:107B800002F07F0204D8142302FB0303DA6817E033 ++:107B9000142302FB03039A6812E01B0A043B012B27 ++:107BA0008D4802F07F0204D8142302FB03035A68B5 ++:107BB00006E0142302FB03F31A5801E002F07F02EF ++:107BC000864B1A6099F90330002B07DA2B68D3F83B ++:107BD0008C20D2F8D8320133C2F8D83299F8033069 ++:107BE00003F03003102B07D12B68D3F88C20D2F888 ++:107BF000E0320133C2F8E0329DF83C30002B40F017 ++:107C00009780DAF814102B6811F0006FD3F88C20ED ++:107C100026D011F4000F01F4E06310D01B0A043BDE ++:107C2000012B6D4801F07F0104D8142301FB0303ED ++:107C3000D96817E0142301FB0303996812E01B0ABB ++:107C4000043B012B644801F07F0104D8142301FB9D ++:107C50000303596806E0142301FB03F3195801E0FC ++:107C600001F07F0116293AD00CD80B2925D004D871 ++:107C7000022916D004291AD05AE00C2923D012293F ++:107C800027D055E030293CD004D818292DD02429FC ++:107C900031D04DE0602940D06C2944D0482936D0FD ++:107CA00046E0D2F870320133C2F8703240E0D2F8C8 ++:107CB00074320133C2F874323AE0D2F878320133C8 ++:107CC000C2F8783234E0D2F87C320133C2F87C3228 ++:107CD0002EE0D2F880320133C2F8803228E0D2F8A8 ++:107CE00084320133C2F8843222E0D2F88832013380 ++:107CF000C2F888321CE0D2F88C320133C2F88C32E0 ++:107D000016E0D2F890320133C2F8903210E0D2F887 ++:107D100094320133C2F894320AE0D2F89832013337 ++:107D2000C2F8983204E0D2F89C320133C2F89C3297 ++:107D300025994B6813F4802F0BD09DF83C3043B944 ++:107D4000BBF1000F05D1D5F8400104AA27F098DB5C ++:107D500003E0284604AAFEF709FF049B1B7C13F0EE ++:107D6000010F05D1259AD2F858310133C2F85831A4 ++:107D7000049B1B7C13F0010F05D0259AD2F85C31CF ++:107D80000133C2F85C31259B0398C3F864011FE0FE ++:107D90002868436BBBB19DF83C30A3B90999104AE0 ++:107DA000CB8AD0F8904003F00703D25C0D4B0298C9 ++:107DB0009B5C04EBC304636EA56E01336366FBF347 ++:107DC00029F24019A066029809990022FEF3A8F74B ++:107DD00027B0BDE8F08FC04684188600CC2702008B ++:107DE000C4D2850098E085002DE9F04FADF50F7DF8 ++:107DF000DDF860B28A46594617469946064637F07E ++:107E0000F9DAD0F8D412D0F8D822D0F8DC32D0F891 ++:107E1000E4428046089109920A930B94BBF1000F4B ++:107E200001D1D0F808B000238DF837328B9330465B ++:107E300051463A464B46FBF7CFF9041EC2F2338057 ++:107E400033685B7EEBB9326992F8EA305BB1D36E8E ++:107E5000D3F8202140F2044302EA0303B3F5806023 ++:107E600018BF012005E0106E07F0EEFC003818BFC7 ++:107E7000012030B1B068FBF767F94FF0FF3402F032 ++:107E800012B847B1B9F1030F05D98CA839460422BD ++:107E9000FAF372F001E000238C93BAF1A30F8C9DEA ++:107EA000F168706827D00DDCBAF11C0F07DCBAF15D ++:107EB0001B0F20DAAAF10203012B15D81BE0BAF13F ++:107EC000340F10E040F20B139A4514D005DCBAF1E0 ++:107ED000D60F10D0BAF1FB0F05E0BAF58B7F0AD0B0 ++:107EE00040F21B139A4506D0002F01F09587B9F197 ++:107EF000000F41F3918740F23B132A1E18BF012265 ++:107F00009A4501F2618701A454F82AF0098400001F ++:107F1000138400001D8400008F840000C99D0000B0 ++:107F2000C99D0000C99D0000C99D0000C99D0000B9 ++:107F3000E7840000F5840000C99D0000558500001D ++:107F4000C99D0000CF850000C99D0000C99D0000AB ++:107F5000C99D0000C99D0000DB850000E785000089 ++:107F60000786000023860000558600007986000001 ++:107F7000AB86000019870000979C0000899C0000D8 ++:107F8000D987000019880000D7890000E389000024 ++:107F9000438A00004F8A0000F38A0000FF8A000035 ++:107FA000158B0000218B0000638B0000C99D000031 ++:107FB000C99D0000C99D0000C99D0000858B00007F ++:107FC000418C0000478D0000FB8C0000C99D000023 ++:107FD000C99D0000538D0000958D0000C78D0000E5 ++:107FE000F38D00008F8E0000DD8E00002D8F0000CD ++:107FF000758F0000B38F0000BF8F0000979C0000BA ++:10800000F188000001890000418900007B8900009F ++:10801000C99D0000C99D0000C98F0000D58F0000D8 ++:10802000EB8F000019900000C7900000F79000004F ++:10803000C99D0000979C0000199200004592000025 ++:108040005D9200008D920000A3920000C99D000087 ++:108050006F8B00007B8B0000CD9900000384000033 ++:10806000E7920000F3920000C99D0000C99D000046 ++:10807000C99D0000C99D0000C99D0000979C00009B ++:10808000979C0000979C0000979C0000C99D0000F1 ++:10809000C99D000049930000C99D0000C99D0000D2 ++:1080A000C99D0000C99D0000C99D0000C99D000038 ++:1080B0007D90000089900000118500001D85000062 ++:1080C000BD970000CF9700007D97000087970000C4 ++:1080D000A789000093900000C99D0000C99D000081 ++:1080E000D793000057930000E5930000F993000038 ++:1080F0008794000087940000C99D0000C99D00007E ++:10810000239500004395000059950000C99D00008B ++:10811000C99D0000C99D0000C99D0000C99D0000C7 ++:10812000FD95000011960000979C00004596000008 ++:10813000C5950000C99D0000C99D0000B1960000D2 ++:10814000BF960000D39600000D9400001D9700001C ++:108150002797000031970000C99D0000C99D0000CD ++:10816000E79700001598000023980000C99D0000C3 ++:10817000C99D0000C99D0000C99D0000C99D000067 ++:10818000C99D0000C99D0000C99D0000B584000084 ++:10819000C1840000A98400006984000025960000C5 ++:1081A00031960000C99D0000C99D0000979C000009 ++:1081B000979C0000979C0000039900003D980000E8 ++:1081C000C99D0000C99D0000C99D0000C99D000017 ++:1081D000C99D0000F397000001980000DD960000A3 ++:1081E000C99D0000C99D0000578C0000C99D00007A ++:1081F000C99D0000C99D0000C99D0000C99D0000E7 ++:10820000C99D0000C99D0000C99D00005399000050 ++:108210005D990000979C0000979C0000C99D00009C ++:10822000C99D0000C99D0000C99D0000C99D0000B6 ++:1082300013940000C99D0000C99D0000C99D000065 ++:108240002799000045990000C99D0000C99D0000C4 ++:10825000C99D0000C99D0000979C0000979C0000EC ++:10826000EB990000F5990000C99D0000C99D000030 ++:10827000019A00007D9A0000879A0000978800000C ++:10828000A3880000979A0000AB9A0000199E000096 ++:10829000199E0000938A0000A18A0000C18A000094 ++:1082A000CF8A0000C99D0000C99D0000BD9A000052 ++:1082B000C99D0000C99D0000C59A0000ED9A00000C ++:1082C000C99D0000C99D0000C99D0000C99D000016 ++:1082D000C99D0000C99D0000C99D0000C99D000006 ++:1082E000C99D0000C99D0000C99D0000C99D0000F6 ++:1082F000C99D0000339B0000C99D0000C99D00007E ++:10830000C99D0000C99D0000C99D0000739C00002C ++:10831000C99D0000C99D0000C99D0000699A000028 ++:10832000739A0000FD830000FD830000C99D0000DA ++:10833000C99D0000C99D0000C99D00008D9B0000E3 ++:10834000C99D0000C99D0000C99D0000C99D000095 ++:10835000C99D0000B19B0000B19B0000C99D0000B9 ++:10836000C99D000065910000D1910000DD910000E1 ++:10837000E7910000F99100000B920000C99D0000F8 ++:10838000DB9B0000EB9B0000F99B0000C99D0000F7 ++:10839000C99D0000C99D0000C99D0000C99D000045 ++:1083A000C99D0000C99D0000C99D0000C99D000035 ++:1083B000C99D0000C99D0000C99D0000C99D000025 ++:1083C0004F9C0000619C0000279C0000C99D00009C ++:1083D000C99D0000C99D0000C99D0000C99D000005 ++:1083E000C99D0000C99D0000979C0000979C00005B ++:1083F0008D9D0000A19D0000B59D0000002101F0B1 ++:108400009EBB002401F0B9BAC14B00243B6001F0CF ++:108410004ABD012300243B6001F045BD33685B7E0B ++:10842000002B41F0F38486F89F3186F8A231304664 ++:1084300009F06AF830460EF04BDD30460EF036DEBD ++:108440003268137E002B41F0DF84136F13F0030FAB ++:1084500041F01D8513F0040F41F0D68413F0080F8E ++:1084600001F0DD8401F0D0BC33685D7E002D41F069 ++:10847000CD84012486F8A241304609F045F886F8FB ++:108480009F41304608F072FC2C4601F00CBD0123E0 ++:1084900086F89F3133685C7E002C41F0B584B0686B ++:1084A000FAF752FE01F0FFBC336800241B7E3B60EC ++:1084B00001F0F9BC96F8293000243B6001F0F3BCD0 ++:1084C00031680B7E002B41F0CB844C7E002C41F0B8 ++:1084D000DE8411463069079235F06AD9079A86F82A ++:1084E000292001F0E0BC3368002493F82C303B6075 ++:1084F00001F0D9BC336883F82C2096F82930002B82 ++:1085000001F0828430461BF0EBDA002401F0CBBC92 ++:1085100096F8C83100243B6001F0C5BC86F8C8213C ++:1085200086F8CB21304608F0EFFF96F82930002B73 ++:1085300001F06A8430461BF099DA30461BF0D0DA3D ++:10854000B0688C9907F0C4DD304620F0CBDF002402 ++:1085500001F0A9BC40461AF083D810F0006F2AD071 ++:1085600010F4000F00F4E06310D01B0A043B012B51 ++:10857000684900F07F0004D8142300FB0313DA6875 ++:1085800014E0142300FB03139A680FE01B0A043B5A ++:10859000012B604900F07F0004D8142300FB031373 ++:1085A0005A6803E0142300FB03F35A584FF4FA739C ++:1085B000B2FBF3F007E000F07F034FF4FA7203FB25 ++:1085C00002F3B3FBF2F00024386001F06CBC3368B6 ++:1085D00000245B683B6001F066BC98F81230002410 ++:1085E0003B6001F060BC98F8063013B1002D01F03B ++:1085F0002284D6F840252B1E18BF0123002482F8C0 ++:10860000343001F050BCB8F95E300BB1022004E008 ++:10861000B8F95C30181E18BF01200024386001F042 ++:1086200042BC022D0AD14FF000014FF0010200249C ++:10863000A8F85C10A8F85E2001F035BC2B1E18BF0E ++:108640000123A8F85C3000244FF00003A8F85E3046 ++:1086500001F029BCB8F80630002B01F0E983B9F12C ++:10866000050F41F3F483384608F1BC010622F9F303 ++:1086700083F4002401F017BC98F80440002C41F06A ++:10868000EF83B9F1050F41F3E28308F1BC003946ED ++:108690000622F9F371F496F82930002B01F0B48327 ++:1086A000404620F09DD901F0FEBBB9F1230F41F304 ++:1086B000CE83384600212422F9F3C2F498F80650FC ++:1086C0005DB198F8192008F11A0147F8042B3846D3 ++:1086D000F9F352F4002401F0E6BB98F80740381D86 ++:1086E00054B1089C237A04F109013B60227AF9F322 ++:1086F00043F42C4601F0D7BBD6F84025137A02F19B ++:1087000009013B60127AF9F337F401F0CCBBC046A3 ++:10871000776CE41484188600B9F1030F41F3978352 ++:108720003A68131D9945C1F29283202A03D96FF04C ++:10873000110401F062BB07F1040A3046514636F0DD ++:1087400011DE10B1404541F06A8398F806309BB1C4 ++:10875000404651463A6836F00FDA3046414636F028 ++:108760008FDB98F819303BB13046414636F03CDD9E ++:108770000446002841F0418398F80630002B41F070 ++:108780004383B9F1310F02D819461A4619E07A8DA0 ++:1087900022B1FB6A13B90125FA6200E000253046D8 ++:1087A00007F12C01A9F12C020AF034DC04460DB1CA ++:1087B0000023FB62002C41F0208307F12402A9F181 ++:1087C00024013B683046009201915246414631F007 ++:1087D000CFD8002401F067BB336B18690AF0A6F903 ++:1087E000C0B2386098F807301BB1089991F8323060 ++:1087F00003E0D6F8403593F832300024D6F868010B ++:108800007B60BC608379002B01F0FE824BF09CDF23 ++:10881000C0B2B86001F047BB0E2DCCBF4FF4805200 ++:108820004FF40052E02D03D96FF0120401F0E5BAC5 ++:1088300045F4306342EA03039DB2D6F85C01294651 ++:108840003DF0ACDD18B96FF0130401F0D6BAD6F8DC ++:10885000403532685D86137E002B01F0D58292F898 ++:108860003F40002C41F0D082336B18690AF05EF96A ++:10887000A84201F0C9822946304620F091DA3046FC ++:1088800008F0B0FF3046294620F0D0D8304619F025 ++:10889000B7DB01F008BB96F8683700243B6001F0B5 ++:1088A00002BB642D01F2BE8286F8685730699DF8DC ++:1088B000301235F021D833681B7E002B01F0A482E2 ++:1088C000D6F868319D79002D41F09E82304608F03F ++:1088D00089FF3046D6F85C410DF066D80146204647 ++:1088E0003CF042DF304619F08BDB2C4601F0DBBA5E ++:1088F000D6F86036002493F907303B6001F0D3BA14 ++:10890000304669B211F024D9041EC1F276828C9BE4 ++:10891000D6F86026D37133681B7E002B01F06B8282 ++:10892000304608F05FFF304611F054D93046D6F893 ++:10893000AC1614F005D8304619F062DB01F05BBAD2 ++:108940003368187E30B9D6F8603604469B793B60B0 ++:1089500001F0A9BA336B89A918690AF065FA0446CF ++:1089600028B19DF8243200243B6001F09CBAD6F86F ++:1089700060369B793B6001F096BA6B1C042B01F2C8 ++:108980005182B5F1FF3F01D103238C93D6F86036B5 ++:108990008C9A00249A71336B9DF8301218690AF092 ++:1089A00081FE01F080BA33681B7E002B01F0498202 ++:1089B000B1F8E8339AB24DF6AD639A4201F02F82D6 ++:1089C0004FF6FF739A4201F02A82C2F3401300244B ++:1089D0003B6001F068BAB6F83A3600243B6001F01B ++:1089E00062BA6B1EFE2B01F21D82A9B2A6F83A16DE ++:1089F0003069B6F83C2634F029DEB6F82032B6F8F5 ++:108A00003A2623F00F031343A6F82032B6F8223299 ++:108A1000304623F00F031343A6F82232B6F824326F ++:108A2000002423F00F031343A6F82432B6F82632AD ++:108A300023F00F031343A6F8263212F053D801F0A7 ++:108A400032BAB6F83C3600243B6001F02CBA6B1EFB ++:108A5000FE2B01F2E781AAB2B6F83A16A6F83C2638 ++:108A6000306934F0F3DD3146B1F82022B6F83C36F7 ++:108A700022F4706242EA0322A1F8202206F10803E0 ++:108A800002319942F0D1304612F02CD8002401F086 ++:108A90000ABA336B0024B3F806313B6001F003BA25 ++:108AA00096F82930002B01F0C9816B1EFE2B01F2D4 ++:108AB000B9813046A9B220F023D8002401F0F3B9DF ++:108AC000336B0024B3F808313B6001F0ECB996F841 ++:108AD0002930002B01F0B281A5F1FF03B3F5E06F5F ++:108AE00001F2A0813046A9B21FF0FEDF002401F0A0 ++:108AF000DAB996F95C3600243B6001F0D4B96B1CFE ++:108B0000012B02D9012D41F08D81002486F85C569D ++:108B100001F0C9B9336800241B6F3B6001F0C3B991 ++:108B20002A0C01F07F8122F00303002B41F07A81AF ++:108B3000A9B221F00303002B41F07481D04310EA65 ++:108B4000010441F06F813268136F00EA03030B43A5 ++:108B5000304613670EF0BCD930460EF0A7DA01F0AC ++:108B6000A2B9336B00241B893B6001F09CB998F8D3 ++:108B7000603000243B6001F096B9002488F8602042 ++:108B800001F091B9832D01F2508106EB8503B9F113 ++:108B9000A30FD3F8804241F35A8145AD2846002106 ++:108BA000A422F9F34DF2002C42D0E37947A82B60C0 ++:108BB000226904F114016A60F9F3DEF1237A61930A ++:108BC00096F8A0349BB9D8F8583013F0080F0ED19E ++:108BD000237A0B2B08D196F8F03743B196F8F1378A ++:108BE0002BB1A379072B02D8A379292B03D9629B38 ++:108BF00043F001036293638913F0020F03D0629B79 ++:108C000043F002036293638913F0200F03D0629B49 ++:108C100043F010036293638913F0100F03D0629B3B ++:108C200043F0200362936CA821460622F9F3A4F1D5 ++:108C3000384645A9A422F9F39FF1002401F033B985 ++:108C4000A549012330460097CDF804900293CDF852 ++:108C50000CB000F096BFB9F1070F41F3F880304631 ++:108C600036F08EDD80450BD08C9B032B01F2DD802E ++:108C700008EB83035B6F002B01F0D7809B798C930B ++:108C80008C9B832B01F2D18006EB8303D3F88042C7 ++:108C9000002C01F0CA802369002B01F0C680B8F8CF ++:108CA000623013F0010F08D02046F9F355F620B1D9 ++:108CB000B8F86C30D8F8680003E0B4F8B830D4F8ED ++:108CC000B4008DF818321B0A8DF81932030A8DF89A ++:108CD0001B32030C00248DF81A028DF81C3286A971 ++:108CE000030E082238468DF81D328DF81E428DF88D ++:108CF0001F42F9F341F101F0D6B8336893F83F30E1 ++:108D0000002B41F0B380D6F86801837923B10421A8 ++:108D100007924BF04DDC079A96F8723286F850278E ++:108D200086F85925002B41F06F80D6F85C011AB106 ++:108D300006F5AA610E3102E006F5AA610A313DF09E ++:108D400011DA01F057B896F8503700243B6001F073 ++:108D5000AAB80325304639464A4600230095CDF887 ++:108D600004800BF0BBD8044638B110F1190F01F0A4 ++:108D70004480C6F8245501F040B80223C6F82435D3 ++:108D800096F8F437C6F8285523F0010386F8F4372F ++:108D900001F089B8B9F10B0F41F23E803B680B2B13 ++:108DA000899341F239804B45C8BFCDF82492899B05 ++:108DB00030460C3B8993394689AAD6F8243510F001 ++:108DC000EDDB01F017B896F829303BB933681B6F1B ++:108DD00013F0040F01F0328001F016B898F8064045 ++:108DE000002C41F028803046414636F049D801F049 ++:108DF0005AB833681B7E002B01F02380B9F1050FB0 ++:108E000041F22580B9F10D0F0CD9304607F1080168 ++:108E1000A9F108020AF0FED83D460446002840F0B9 ++:108E2000EC870AE082AC204639460622F9F3A4F02A ++:108E3000002384934FF00E09254698F80640CCB9DC ++:108E40000A9AD2F8901039B1706892F89420FDF324 ++:108E50004FF70A9BC3F890400A9C494684F89490C7 ++:108E60007068FDF335F7C4F8900018B129464A46FA ++:108E7000F9F382F02946404632F028D90A9904468F ++:108E8000D1F89030002B40F0BF8700F0B4BF002332 ++:108E90000093304639464A468BABFAF7F5F904465B ++:108EA000002840F0AA878B99032900F0ED87326BE8 ++:108EB0001368994204D1D2F8F0303B6000F0F3BF60 ++:108EC0005368002B14BF38233C23F358D3F8F030F9 ++:108ED0003B6000F0E8BFC0467B7286000023009331 ++:108EE000304639464A468BABFAF7CEF9044600289D ++:108EF00040F083878C9A02F16403672B00F292871B ++:108F00008B99032904D0336B1B68994240F0CB87BF ++:108F1000002A04DB3046316B32F01CDA0246336B38 ++:108F2000C3F8FC20C3F8F02000F0BDBF002300937D ++:108F3000304639464A468BABFAF7A6F90446002874 ++:108F400040F05B878B99032900F09E87326B136892 ++:108F5000994204D1D2F8F4303B6000F0A4BF5368CA ++:108F6000002B14BF38233C23F358D3F8F4303B6074 ++:108F700000F099BF00230093304639464A468BAB38 ++:108F8000FAF782F90446002840F037878C9A642A61 ++:108F900000F27A878B99032904D0336B1B689942BE ++:108FA00040F08187336BC3F80021C3F8F42000F050 ++:108FB0007ABF0A9A0024D36A3B6000F074BF0A9B10 ++:108FC0000024DD6200F06FBF98F83A3000243B6067 ++:108FD00000F069BFBB49012330460097CDF80490EB ++:108FE0000293CDF80CB000F0CCBDD8F84C2006248C ++:108FF000531C03FB04F39945C0F2298747F8042B5F ++:10900000D8F84C20384602FB04F2D8F85410F8F394 ++:10901000B3F7002400F047BF3B68402B00F2028703 ++:10902000062403FB04F304339945C0F21087D8F8F3 ++:10903000541049B1D8F84C2002FB04F20432FDF37D ++:1090400057F60023C8F84C303968706801FB04F10A ++:109050000431FDF33DF6C8F8540018B96FF01A0456 ++:1090600000F0CBBE57F8042BC8F84C20394602FB61 ++:1090700004F2F8F381F7002400F015BFD8F850305F ++:1090800000243B6000F00FBF0024C8F8505000F0EF ++:109090000ABF98F807301BB1089C04F1380203E0BE ++:1090A000D6F8403503F1380211680B1D9945C0F21E ++:1090B000CE8647F8041B3846111D1268F8F35CF79A ++:1090C000002400F0F0BE78AC282200212046F8F3FE ++:1090D000B7F73046214614F0A9DC789A131D99455C ++:1090E000C0F2B58647F8042B211D3846F8F344F743 ++:1090F000002400F0D8BE3A68131D9945C0F2A78637 ++:10910000102A00F2AA8678AC002128222046F8F323 ++:1091100097F757F8042B201D39467892F8F32CF76F ++:10912000336893F8463013F0030F0ED098F80730E9 ++:1091300004F115001BB1089A02F14D0102E0D6F8C6 ++:1091400040154D311022F8F317F7304678A910F08A ++:109150008BDC0446002840F0508630460DF04AD89B ++:1091600000F0A1BE6DB100243046414623222346C3 ++:109170000094019402940394049413F0CFDC00F063 ++:1091800092BE98F806303BB9D6F8680104214BF03E ++:109190000FDA40462FF0DADAD6F878122B467068EC ++:1091A000043101220095F9F34DF698F8063043B9E1 ++:1091B000404601212A462B4602F0ACFF2C4600F027 ++:1091C00072BE3046414635F05BDE2C4600F06BBE89 ++:1091D000D6F84C3500243B6000F065BE0024C6F88C ++:1091E0004C5500F060BE384606F5AA610622F8F339 ++:1091F000C3F6002400F057BE06F5AA6039460622E1 ++:10920000F8F3BAF6002400F04EBE304641460AF0AC ++:1092100089DF002400F047BE98F8060058B998F896 ++:10922000123043B198F807302BB1089CE38D044607 ++:109230003B6000F038BED6F840350024DB8D3B6043 ++:1092400000F031BE6A1E4FF6FE739A4200F2EA85C4 ++:10925000D6F840350024DD8500F025BE98F80600DC ++:1092600060B998F812304BB198F8073033B10899CB ++:10927000044691F860303B6000F015BED6F84035EA ++:10928000002493F860303B6000F00DBE6B1EFE2B97 ++:1092900000F2C885D6F84035002483F8605000F00D ++:1092A00002BE3A6845F2AB539A420FD106490023F9 ++:1092B00030463B600097CDF804900293CDF80CB097 ++:1092C0000DE0C046AB728600DD7286000023A04927 ++:1092D0000097CDF804900293CDF80CB030463A4692 ++:1092E0004B4600F050BC0B9A002413783B6000F012 ++:1092F000DABD022D00F293850B9B1D7033681B7E37 ++:109300004BB140460DF062DCD8F8E4325B8B13B110 ++:1093100040461BF043D90B9C637E0BB18C9B33B949 ++:109320008C994046003918BF012107F079FF40466B ++:109330001CF05CDB0146404622F000DC404631F088 ++:10934000B7DF002400F0AFBD304639464A46FAF791 ++:1093500079F800F04FBD316891F830300F7E1BB1C5 ++:1093600015B96FF0190400E0002491F8953013B19D ++:10937000002D40F08F85002C40F03F8591F82F3074 ++:10938000934200F0908527B1B0680792F9F7DCFEB0 ++:10939000079A3368304683F82F20414636F0F8D9D3 ++:1093A000326892F8443023B192F82F300BB182F832 ++:1093B0004440304612F004DD002386F8DD3186F8A3 ++:1093C000DE311FB1B068F9F7D7FE0446304608F029 ++:1093D0009BF800F010BD3368002493F82F303B60F9 ++:1093E00000F061BD5B49002230460097CDF8049043 ++:1093F0000292CDF80CB0C5E35649012330460097E0 ++:10940000CDF804900293CDF80CB0BAE304238C930A ++:1094100004E0B9F10B0F40F31A85043798F80630D1 ++:10942000002B30D13B78304613F0010F39463D46D2 ++:1094300018BF08F1BC054CF0B1D9044628B1436807 ++:1094400013F4805F01D04BF02FDF98F81230002B1F ++:1094500000F0DA84002140460A460B4602F05AFE2C ++:1094600054B1BDF830323046019329462A4608F1FE ++:10947000C20300941EF086DD3046414635F000DD23 ++:10948000002400F010BDAAF179033846DDF83092CF ++:10949000012B8CBF01251025F9F34EF2BAF1790F9B ++:1094A00014BF4FF0000B4FF0010B044638B3D6F851 ++:1094B00000058AA94BF00EDE19E0D2F8F030B3B9FE ++:1094C0001369434513D1102D03D1137E13F0020FFE ++:1094D00004E0012D03D1137E13F0010F07D03046B5 ++:1094E00041465B460095CDF804904BF00BDF8AA80F ++:1094F0004BF0F8DD02460028DFD100F085BC304695 ++:1095000039464CF04BD90246002800F07D843046A5 ++:1095100041465B460095CDF804904BF0F3DE00F039 ++:10952000C2BC98F8070028B1089900240B8E3B6054 ++:1095300000F0B9BCD6F8403504461B8E3B6000F005 ++:10954000B2BCD6F8403500241D8600F0ACBCC04645 ++:10955000E3728600E8728600002F00F05D84B9F1A6 ++:109560000C0F1FD13B79391D13F0010440F05484D6 ++:1095700030464CF013D938B1012386F82D374BF023 ++:10958000A3DE386000F08FBC98F8060018B16FF0C9 ++:109590001D0400F032BCD8F8E03204461B693B6081 ++:1095A00000F081BCB9F1040F40F0368498F8060051 ++:1095B000002840F03184D8F8E03204461B693B6053 ++:1095C00000F071BC304620F0B9D93368D3F88C0074 ++:1095D000036C3B60836C7B60D0F8D831BB60D0F803 ++:1095E000B03102699B18B9F1130FFB6040F30C8492 ++:1095F000D0F83C3100243B6100F055BC9D4900226D ++:1096000030460097CDF804900292CDF80CB0B9E244 ++:109610009849012330460097CDF804900293CDF885 ++:109620000CB0AEE2B8F8623000243B6000F03BBC06 ++:109630009149012330460097CDF804900293CDF86C ++:109640000CB09EE2832D40F30284336B3D1D1869FC ++:1096500009F0FCFB089A4FF0000982F861008C9B2E ++:109660003046043B08992A46CDF8009009F0EEDD1B ++:10967000AB6F84333B6098F80630002B00F0C48356 ++:1096800007F11704204649462022F8F3D9F498F848 ++:1096900019202046AA7408F11A01F8F36DF407F1B5 ++:1096A0000C0008F1BC010622F8F366F44C46FAE31C ++:1096B00001233B60336B00241B687B60F3E396F867 ++:1096C0009C310BB9184601E0336B186800243860F0 ++:1096D000E9E33046294612F053DC8BE3B9F1020F7F ++:1096E00040F3B583336B188968B1022801D1653026 ++:1096F0000FE0052801D167300BE0042801D16A3062 ++:1097000007E0072801D1613003E0082814BF3F209B ++:10971000632000231C4638707B70C4E396F8433600 ++:1097200000243B60BFE396F9473600243B60BAE370 ++:109730006B1C012B02D9012D40F07483EAB2316811 ++:1097400086F84726087E48B191F83F40002C40F04B ++:109750005B833046214620F0A9DDA4E351B2B1F18C ++:10976000FF3F03D1044686F843069CE3012914BF5A ++:1097700000230123044686F8433694E396F84836DE ++:1097800000243B608FE396F84836934200F03C8318 ++:10979000336886F8482693F82F30002B00F0348386 ++:1097A00096F82930002B00F02F83304621F0AEDBF5 ++:1097B0003046012121F0B4DD002474E3306B0368EE ++:1097C000022B40F02183437D00243B606BE3336830 ++:1097D00093F83F30002B40F049833046E9B2012234 ++:1097E0001FF0B4D906E3D6F8583600241B783B6046 ++:1097F00059E3D6F85836002493F903303B6052E31E ++:10980000022D00F20F83304604216AB21CF0B0D85A ++:10981000002448E3D6F85836002493F901303B6021 ++:1098200041E36B1C012B02D9012D40F0FB82304635 ++:1098300002216AB21CF09CD8002434E3B9F1270F4E ++:1098400040F30583282278A83946F8F395F3789CED ++:10985000102C00F20883336B5B7D002B00F0FA8242 ++:1098600064B906F5AE600C3021462822F8F3E8F31F ++:1098700019E3C046177386001C73860033686EAC0C ++:1098800093F84630214613F0030317BFD8F8CC30C5 ++:109890001846C3F3003383F0010000227F230093B6 ++:1098A0000190134678A847F027DCD6F860360022EE ++:1098B0009B782046AC4947F061DB789A6E9B9A42D0 ++:1098C00040F0D18206F5AE6028220C302146F8F334 ++:1098D00053F33268137E002B00F0968292F82F30FB ++:1098E000002B00F0918292F83F30002B00F08C8228 ++:1098F000304621F00BDB3046012121F011DD002440 ++:10990000D1E2336B5B7D002B00F0A482B9F1270F0D ++:1099100040F39D8206F5AE6138460C312822F8F3FB ++:109920002BF30024BFE225B1022D02D0012D40F01F ++:109930009182D8F8E832404683F8E05030F046DFB4 ++:109940000024B0E2D8F8E832002493F8E0303B601D ++:10995000A9E2B6F87A3500243B60A4E23368187EA9 ++:10996000002840F07D824FF6FE739D4200F25A823D ++:109970000446A6F87A5596E201344C4502DAE35DD6 ++:10998000002BF9D1032C00F3688288AD002104225A ++:109990002846F8F355F3224639462846F8F308F4EA ++:1099A000D6F85C0129463CF0DDDB0446002840F097 ++:1099B000248230460DF07ADB06F5AA600A3029468B ++:1099C0000322F8F3F5F386F859456CE2B9F1030F79 ++:1099D00040F33D82D6F85C013BF05EDE0422014696 ++:1099E0003846F8F3C9F200245DE2D6F80C350024BD ++:1099F0003B6058E233681B7E002B00F0228229E294 ++:109A0000B9F1030F40F32382A9F1040399083B68DD ++:109A10008B4288BF396000252C460E2C8CBF4FF43A ++:109A200080514FF4005144F430631943D6F85C017F ++:109A300089B23CF0B3DC10B10DAB5C55013501349B ++:109A4000E02CEAD13B68AB4201D3002107E03D6046 ++:109A5000FDE10DAA8A5C07EB81035A600131A9423E ++:109A6000F7D100243D601EE2304639463BF064DF0A ++:109A7000C0E13046394608F0DDFCBBE196F8CE3156 ++:109A800000243B600FE286F8CE21304600210AF028 ++:109A90005FDF002407E23368114683F84120336B0F ++:109AA0000024186909F0A6F9FDE13368002493F851 ++:109AB0004130003B18BF01233B60F4E133680024D0 ++:109AC0003B60F0E1D8F87030B3F1FF3F00F0AD81BA ++:109AD00008EB8303586F002800F0A781C3790024A6 ++:109AE000AB4214BF002301233B60DCE140466FF032 ++:109AF00007040025416FB9B1CA798C9B9A4213D1F2 ++:109B0000D8F87030B3F1FF3F07D008EB83035A6FEA ++:109B10001AB1538923F0020353814B89C8F870505E ++:109B200043F002034B81002401350430042DE1D1C0 ++:109B300061E1B9F1090F40F38A8185E101314945BD ++:109B400000F08581CB5D002BF8D1A6E100230293C4 ++:109B5000304639463A19C4EB09030097CDF8049012 ++:109B6000CDF80CB00FE0C0460C1886003B19C4EBD2 ++:109B700009020093012301920293CDF80CB0304604 ++:109B800039460022134619F00BDC33E198F8063011 ++:109B9000002B40F0598198F81130002B00F05481CF ++:109BA000D8F80C00394698F8072013F0B9FB21E1EA ++:109BB00019F0010440F0308101230293AD49AE4B0E ++:109BC00040F21312924518BF1946304622460097BC ++:109BD000CDF80490CDF80CB0D4E73846B16B4FF413 ++:109BE0008672F8F3C9F100245DE138460899AC2289 ++:109BF000F8F3C2F1002456E1099C099AA36B516B5A ++:109C000047F8043B926B3846F8F3B6F1099B099C80 ++:109C10009A6B5B6CB818BB50216C626C0430F8F323 ++:109C2000ABF100243FE1336893F83F30002B00F0A4 ++:109C3000FF800899002900F0FB80496E002900F0A0 ++:109C4000F78038460822F8F397F100242BE1089AB0 ++:109C5000384602F16B011022F8F38EF1002422E164 ++:109C6000089B384603F17B011022F8F385F10024AC ++:109C700019E133681B7E002B00F0E3803046394643 ++:109C80004A460AF065DFB5E033680121186901F042 ++:109C90000DDB002407E1304651464A463B46F9F7C2 ++:109CA00017FB0446002840F0A880BAF13C0F49D1C8 ++:109CB0003D1D00F0AE807B6813F0006F40F0A9807E ++:109CC00003F07F03022B06D0042B04D00B2B02D011 ++:109CD000162B40F09E806EAC3046214613F0A6DE77 ++:109CE000304621461CF01ED8286810F0006F26D0A0 ++:109CF00010F4000F00F4E06310D01B0A043B012BAA ++:109D00005E4900F07F0204D8142302FB0313D868D5 ++:109D100017E0142302FB0313986812E01B0A043BAC ++:109D2000012B564900F07F0204D8142302FB0313D1 ++:109D3000586806E0142302FB03F3585801E000F0D2 ++:109D40007F002860336B514618698CAB0733009352 ++:109D50004A463B460AF0B4F9BAF13C0F044608D033 ++:109D6000BAF15C0F05D0BAF14A0F02D0BAF15D0F1B ++:109D700041D1002C41D1002F00F095803B68326822 ++:109D8000003B18BF012382F840308CE03C490022A0 ++:109D900030460097CDF804900292CDF80CB0F1E671 ++:109DA0003749012330460097CDF804900293CDF84F ++:109DB0000CB0E6E63349012330460097CDF8049015 ++:109DC0000293CDF80CB0DCE6D6F8680151463A466D ++:109DD0004B46CDF800B04AF0C9DC10F1170F04462D ++:109DE00009D1D6F8340751463A464B46CDF800B073 ++:109DF00029F030D90446002C55D004F12A032A2B2F ++:109E000002D83368DC664EE000244CE06FF00804B2 ++:109E100049E06FF0010446E06FF00104EDE74FF018 ++:109E2000FF34EAE76FF01C04E7E76FF00704E4E7AC ++:109E30006FF01004E1E76FF00604DEE76FF00A044C ++:109E4000DBE76FF00304D8E76FF01604D5E76FF097 ++:109E50000D04D2E76FF00C04CFE76FF00E04CCE7EF ++:109E60006FF00404C9E76FF00B04C6E76FF01B0442 ++:109E7000C3E7C0467ED701002F7386008418860092 ++:109E8000507386005D7386006FF00204B5E76FF0D3 ++:109E90000804B2E76FF01904AFE74C1CBAF5837FF2 ++:109EA0003FF454AE62E620460DF50F7DBDE8F08F1D ++:109EB0002DE9F341089C05460E4617469846009446 ++:109EC00007F0A6FD10F1170F06D1284631463A4695 ++:109ED00043460094FDF788FFBDE8FC812DE9F04181 ++:109EE0000368054693F83F30D0F80C8013B1B0F802 ++:109EF000267602E0FAF70CFF074600222869394669 ++:109F000003F0E2F85621286933F08ADBD5F888316E ++:109F10004000002BC5F8040506DA2869B22133F0A9 ++:109F20007FDB4000C5F80805A221286933F078DB03 ++:109F30004000C5F8EC07284612F03AD895F8CD3124 ++:109F40003BB928694C2133F06BDBC0F3C71085F8AF ++:109F5000CD0128461CF092DDD5F84C0104F02EFD11 ++:109F600028463DF05FDA002605EB8603D3F84C4225 ++:109F70002CB120461EF03EDF20461EF031DD0136BA ++:109F8000082EF1D12B6893F83F309BB1002205EBEE ++:109F90008203D3F84C0250B1037943B1D0F8D432E4 ++:109FA000DB8D1B04C8F888311FF05CD902E0013258 ++:109FB000082AECD12846394609F0AAD82846742147 ++:109FC000B5F87A2522F006D995F8D13142F210720F ++:109FD000002B18BF4FF4BC622846822122F0FAD829 ++:109FE0002B6B95F8D111186909F04AF80122134634 ++:109FF000B5F8781728460AF063DA0123B5F87A171E ++:10A00000002228460AF05CDAD5F8400125F0D8DBBA ++:10A010002846F9F7E9FA2B685B6B5BB1B8F888362C ++:10A02000D5F86C029BB243F00403A8F888360021EF ++:10A0300017F0B6DE2846F9F77BFAD5F8841161B936 ++:10A0400028461CF08DD80404C5F884412846022116 ++:10A050001CF086D82043C5F884012B6893F8A13002 ++:10A06000012B03D1D5F8400126F096DC284617F0E5 ++:10A07000C7DF284608F0B6DBB5F85C1728461CF0A9 ++:10A080004DDD284610F004DA424BEA68002185F8DD ++:10A090004410C2F8DC33012385F8A83185F8AA31D1 ++:10A0A0002B6893F838303BB14A1901314FF0FF3338 ++:10A0B000082982F89538F7D100244FF440763146CC ++:10A0C00028461CF04DD805EB4401B1F8203213F0BE ++:10A0D0000F0F06D123F00F0300F00F021343A1F876 ++:10A0E0002032B1F8202212F0F00F06D100F0F00378 ++:10A0F00022F0F0021343A1F82032B1F8202212F42A ++:10A10000706F06D100F4706322F470621343A1F8FB ++:10A110002032B1F820321A0B06D11B0500F4704230 ++:10A120001B0D1A43A1F8202201340236042CC6D19B ++:10A130002B68284693F94C100BF076DA2A68137EC8 ++:10A1400003B392F82F30EBB1002605EB8603D3F86A ++:10A150004C426CB1A3795BB12B6893F838302BB1CA ++:10A160002846D4F84C15002235F0F2DD0023E371C7 ++:10A170000136082EE9D1002385F87232D5F834076C ++:10A180002AF0C8DDD5F8680104214AF011DABDE8EB ++:10A19000F081C0468096980003681A6819B10123BF ++:10A1A00082F8AA3001E082F8AA1070472DE9F04742 ++:10A1B0001746937AD27A056843EA022A3B79064623 ++:10A1C00003F007044FF0000938E00B6968681A785B ++:10A1D0005B7842EA0328D6F87822936E01339366BF ++:10A1E0000122FCF39DF52B6893F8A130012B03D0DD ++:10A1F000C8F34123032B17E0182304FB0362B2F8D2 ++:10A200008232B2F88612284699420CBFB2F88032E8 ++:10A210004B1CA2F886322146012220F0E5DB09F131 ++:10A2200001031FFA83F9D1450AD02B69022103EB00 ++:10A230008403D868124B9B6B984701460029C4D110 ++:10A240002B6893F8A130012B05D02846214696F9BA ++:10A250002C2020F0C9DBBB7913F0020F0ED00024B4 ++:10A2600006E00120FCF378F2631CDCB20B2C05D075 ++:10A27000EB68D3F8703113F0010FF2D0BDE8F0872E ++:10A28000E0A685002DE9F347D0F80090044601A927 ++:10A29000D9F800054AF01EDF00263AE07B6813F487 ++:10A2A000802F36D063684FF00008FD58AA46D5F8D5 ++:10A2B000F8205FFA88FE32B391781379002918BF2D ++:10A2C00001261BB100231371D3701CE0D9B1D378E0 ++:10A2D0000133D9B2D1707B6813F4807F14BF628ED2 ++:10A2E000A28E6423B2FBF3F291420BD3D4F878220E ++:10A2F0004846D2F8C43051460133C2F8C4307246E1 ++:10A3000023F030DF012608F101080435B8F1080F09 ++:10A31000CDD101A84AF0E6DE07460028BED136B905 ++:10A32000236884F8A3639868A16B05F097D9BDE80A ++:10A33000FC87C0464368F7B5CE5805460027FCB2F7 ++:10A3400028463146224622F0DBD901370123284630 ++:10A350003146224622F040D9082FF0D12A68002346 ++:10A360000093506806F110010122F8F36BF5FEBD71 ++:10A37000D0F8AC037047C046D0F8C0037047C04661 ++:10A38000C0F8C0137047C046D0F8AC331B68DB6917 ++:10A3900018690528A8BF05207047C0462DE9F04F71 ++:10A3A000F3B00890894608999DF8F8010792D1F812 ++:10A3B000B0231C46D9F8D4320690D1F8AC730C9275 ++:10A3C000002148A828226F9115937C9DDDF8F48127 ++:10A3D000F7F336F607980C99037803F0FC03202B6B ++:10A3E00014BF002301230D9391F82F3033B1D7F818 ++:10A3F0006801837913B104214AF0DAD80D9A0AB1C1 ++:10A40000092D00E0032D40F2E58522786378211DB7 ++:10A4100042EA032AA278E37842EA03230E930D9BD3 ++:10A4200023B9043D8B4613950F9304E00A3D04F1D4 ++:10A430000A0B13950F911398012840F2CB859BF8D6 ++:10A44000013002339842C0F2C58548AB00933846CC ++:10A450005946139A002319F059DE002840F045832D ++:10A4600097F838279DF834319A4240F03E8399F8A6 ++:10A4700019309BF801209A4240F03E8309F11A00FE ++:10A480000BF10201F7F35CF5002840F0358398F8F2 ++:10A49000183013F0020F0BD098F8DF3023B1384694 ++:10A4A000414601222BF0CEDC4046FE214AF0C8DDB9 ++:10A4B00099F94820002AC0F21F8398F8183013F049 ++:10A4C000010F00F01983082392FBF3F34344197D35 ++:10A4D000A44B02EA0303002B05DA013B6FEA437346 ++:10A4E0006FEA5373013351FA03F313F0010F00F0D5 ++:10A4F000038319A80021C8F81090A8F800A101381A ++:10A500006D22F7F39DF50024214613E072AA53183B ++:10A5100013F8A43C03F07F026C2A0AD89248835CAB ++:10A520003BB119AB013B9A54835634EA230428BF4C ++:10A5300001240131489B9942E8D3D8F8043023F034 ++:10A5400007023B6BC8F804205B7D23B11CB942F0C5 ++:10A550000103C8F804303B6B5B7D43B11AF4806F94 ++:10A5600005D1D8F8043043F00203C8F804301AF0DB ++:10A57000200405D0D8F8043043F00403C8F80430B0 ++:10A58000159B0021986B0FE0159A531893F83C2007 ++:10A5900012F0800F07D019AB013B02F07F029B5CE9 ++:10A5A000002B00F0A28201318142EDD10C9890F88D ++:10A5B000463013F0030F45D05946139A38461BF026 ++:10A5C0009BDD00260546414638462A46334600961E ++:10A5D00018F00CDBB5B14DA8E91C01301022F7F3DF ++:10A5E000CBF431467B1872A893F8EB24431813F888 ++:10A5F000933C02EA0303934240F077820131102931 ++:10A60000F0D105E00C9991F84730002B40F06D82B5 ++:10A6100038465946139A43461BF0D8D83B22584631 ++:10A620001399F8F34BF0024660B141784B1EDBB250 ++:10A630001E2B07D888F80B1108F58670911C5278EC ++:10A64000F7F39AF4B9F862200023A8F83C20C8F880 ++:10A650004030B9F8623033B1D9F8582040F237139E ++:10A6600002EA030343B9D9F8583013F0400003D18C ++:10A670000646119016905EE0139B58461946CDF899 ++:10A68000C0B16E9326F02EDD119038B14378042BC3 ++:10A6900040F239820020064616904CE070986E9980 ++:10A6A000F8F318F6119050B108F1400300930898A0 ++:10A6B0004946119A08F13C0327F092DD10E0584614 ++:10A6C00013993022F7F3FAF770B1119008F14003B3 ++:10A6D000009308984946119A08F13C0327F08CDC56 ++:10A6E000002840F0108223E0584613994422F7F3E3 ++:10A6F000E5F7119080B108F14003009308984946AE ++:10A70000119A08F13C0327F0D7DB002840F0FB81C9 ++:10A7100001210E4616910EE0D9F8583013F0410F82 ++:10A7200000F0F181119A1646A8F83C20169202E03A ++:10A73000002301261693D8F8043023F4001323F0E5 ++:10A740004003C8F804303B685B6B002B3AD0D9F863 ++:10A75000CC3013F0020F35D11398CDF8C0B16E9004 ++:10A760000BE0C04607000080401B860038462946A3 ++:10A7700070AA6EAB18F0F2DE38B970986E99DD22CF ++:10A78000F7F39CF705460028F0D1404600211BF066 ++:10A79000ADD9BDB1D8F8043043F04003C8F8043057 ++:10A7A00097F8FA3173B14046297A1BF09FD998F88F ++:10A7B000D13013F00F0F05D0D8F8043043F4001354 ++:10A7C000C8F8043000231399304A5846009317F014 ++:10A7D00099DD4146024638461AF0D2DF1AF01005DC ++:10A7E0000DD0D9F8582040F2371302EA030333B9E9 ++:10A7F00012F0400F00F08D81002E40F08A810C99FC ++:10A8000091F8303053B93B6B1B68022B06D197F996 ++:10A810005C361BB914B94FF0130A24E03B6B1B687C ++:10A82000022B08D1089A53782BB11AF4806402D114 ++:10A830004FF0190A17E0384611F074DB0899D1F887 ++:10A84000C033984211D303230093079B002403F1E4 ++:10A850000A0238461721012301940294039419F047 ++:10A8600027D94FF0110A10945AE10C9890F838301B ++:10A8700073B13846494612F079D8D9F85035984224 ++:10A8800006D300214FF0110A109149E148D401008C ++:10A890000C9A92F8463013F0030F27D0D9F85820BD ++:10A8A00040F2371302EA030303B397F8692712F063 ++:10A8B000020F08D0D8F8043013F4803F03D0D8F842 ++:10A8C0004030022B0BD012F0010F0FD0D8F804301B ++:10A8D00013F4803F0AD0D8F84030012B06D1002273 ++:10A8E000384641461346009218F080D9D9F8CC304A ++:10A8F00013F4005F09D0D7F84C0141465A46139B28 ++:10A9000003F0D8FE002840F00481D8F8043013F09A ++:10A91000010F02D0012387F84D36D8F8043013F028 ++:10A92000011F02D1012387F84E36D8F8043013F402 ++:10A93000801F02D0012387F85136D8F8043013F471 ++:10A94000002F09D11598438E03F44063B3F5406F8F ++:10A9500002D1012387F85236D8F8043013F0020FE1 ++:10A9600002D0012387F84F36D8F8043013F0040FD3 ++:10A9700002D1012387F85036D8F8043013F4001FB1 ++:10A9800002D0012387F8FB31D7F8344720462AF05C ++:10A9900091D930B120462AF095D910B120462AF03D ++:10A9A00063D9D8F8043013F0007F1DD0012487F854 ++:10A9B00054460C9991F8463013F0030F14D091F9D6 ++:10A9C0004C308BB10221384618F0CAD8159A538EF4 ++:10A9D00003F44063B3F5406F06D138462AF002D83D ++:10A9E0003846214629F07ADFD8F8043003F40413FE ++:10A9F000B3F5001F02D1012387F853363B6B5B7D13 ++:10AA000013B1384620F0E8DA0C9890F8463013F08D ++:10AA1000030F02D0384620F091DBD8F8403043B91C ++:10AA20003DB1D9F8583013F0010F02D00123C8F816 ++:10AA300040300C99D9F8582091F838301BB9D7F824 ++:10AA40006C32994524D0B9F8620008BB12F0010FAE ++:10AA50001ED0D9F87030B3F1FF3F19D009EB830352 ++:10AA60005C6FACB1217A012901D0032910D1628930 ++:10AA7000E379009204F11402029208F11A020191A2 ++:10AA80000490059003923846494622693CF0F6DC72 ++:10AA9000B8F8D4302BB9D8F8100034F081DDA8F81C ++:10AAA000D400B8F8D4200C98109290F8463013F0E7 ++:10AAB000030F33D0D8F84030013B012B0AD8D8F827 ++:10AAC000043013F4802F05D038464146062220F08A ++:10AAD000E7D823E0D8F8043013F4802F1ED038468E ++:10AAE0004146062220F080D818E000214FF0120ADB ++:10AAF00011911091169113E000224FF00C0A11925F ++:10AB0000109216920CE000234FF00C0A169310934B ++:10AB100006E000204FF00C0A109001E04FF0000A10 ++:10AB20003EAC00212822204634ADF7F389F22846B6 ++:10AB300000212822F7F384F2D7F87C3533B107F5EA ++:10AB4000AE6120460C312822F7F316F21599234600 ++:10AB50003831099138464946099A00951BF076D953 ++:10AB60003E9B03F10804349B0BB10233E418D8F880 ++:10AB700004304846002BB8BF14340421002235F0BD ++:10AB800091DA97F8653604190BB10233E418D8F856 ++:10AB900004300DF5A57013F0400F18BF1A340021D2 ++:10ABA0002022F7F34DF2D8F8043013F4803F05D09B ++:10ABB000D7F8FC3434341B7803B11334D8F8083098 ++:10ABC00013F0400F06D0D7F84C014146524645F0ED ++:10ABD00041DC2418079A09F1C2030A3217920D9A30 ++:10ABE0000A9309F1BC006FAB0B9000900293002A0E ++:10ABF0000CBF102130213846179A0A9B019417F098 ++:10AC0000DBDB1490002800F0E5816F980123041924 ++:10AC100012940370013B43703B6B1B68022B05D100 ++:10AC200097F95C2612B91F3303704270D9F8582087 ++:10AC300040F2371302EA03035BB199F8603043B185 ++:10AC40000378427843EA022343F0100303701B0A9F ++:10AC5000437097F843365BB13B6B5B7D43B1037840 ++:10AC6000427843EA022343F4806303701B0A437073 ++:10AC7000002380F802A0C370109B037110990B0A87 ++:10AC80004371012106303FAB3E9A21F06DDAD8F8CE ++:10AC900004300646002B06DA0C21122207F5037356 ++:10ACA00021F062DA0646349A2AB13046322135ABB9 ++:10ACB00021F05ADA0646D7F8603648AC00229B7875 ++:10ACC0002046099946F05AD9D8F8043013F4803F49 ++:10ACD0003FD03B6B0DF5B5751B6804F11502022BD7 ++:10ACE00014BF002301234846294661AC21F09ED9B8 ++:10ACF0004846214621F0F6D830462D211A222B460F ++:10AD000021F032DA23463D21162221F02DDAD7F840 ++:10AD1000FC3406461B78E3B172AB012203F8012D27 ++:10AD20007F2121F021DAD7F8FC140DF5D574054602 ++:10AD300024310E222046F7F31FF138462146002227 ++:10AD400017F0EEDE28464A210E22234621F00CDAC7 ++:10AD50000646129AB24201D2002002E0129BC6EBD4 ++:10AD600003000423009001934846334600214FF02E ++:10AD7000FF3235F0D9D997F8653604462BB107F57F ++:10AD8000CC61043112F0C2DC0446D8F8043013F070 ++:10AD9000400F08D007F500732046DD211822063346 ++:10ADA00021F0E2D90446D8F8083013F0400F06D05D ++:10ADB000D7F84C0141465246234645F02BDB069816 ++:10ADC0000023D9F808200090019302933846149983 ++:10ADD000D26843461AF0A6DEBAF1000F40F0FA80BE ++:10ADE0001099159AA8F8D41092F860300E989BB27A ++:10ADF000834238BF0346A8F80231022140464AF098 ++:10AE00007FDB404649464AF0C5DAD9F8CC3013F426 ++:10AE1000801F09D03846494611F0A8DD012803D12A ++:10AE20003846494634F002D80C990D9A8B6AC8F816 ++:10AE300024305AB10B980F990622F7F381F028B10C ++:10AE400008981799D9F8082027F0CEDBD9F8082000 ++:10AE50000898179926F0CCDFD9F8CC2012F40053CB ++:10AE60000CBF1C4602243B6893F8463013F0030FD6 ++:10AE700007D012F4805F04D1B8F8063003F0010265 ++:10AE800000E000227F2300930192234648A808F1A6 ++:10AE90004401002246F030D9384641464AF032D9C2 ++:10AEA0000C9890F82F3063B1D8F8E81049B1C06819 ++:10AEB000D8F8EC20FBF31CF70023C8F8EC30C8F8F6 ++:10AEC000E830B9F86230002B33D0D9F8582040F27E ++:10AED000371302EA030363B312F0010F01D1119992 ++:10AEE00039B398F8DE300BB1119AB2B90C9890F8DA ++:10AEF0002F30F3B11199E1B14978C0680231FBF309 ++:10AF0000E7F6C8F8E800A0B1119B5A78194602325A ++:10AF1000C8F8EC20F7F330F00BE00224384608F1D3 ++:10AF20001A010B9A0A9BCDF8008001941DF02AD8D3 ++:10AF3000A246D9F8CC3013F4005F04D0D7F84C0106 ++:10AF4000494644F0FFD938464946012216F0E8DF69 ++:10AF500000231398009302930D9B0490002B0CBFC9 ++:10AF600008220A2238464946179BCDF804A0CDF89E ++:10AF70000CB011F0D3DD169860B3D9F87030B3F18E ++:10AF8000FF3F03D009EB83035B6F13B90DF5CD725F ++:10AF900002E003F5997312E0362313700DF5CD71BD ++:10AFA00026335370023201F110039A42F4D10C9A05 ++:10AFB00092F82F3013B137238DF89A310B46009356 ++:10AFC000F12301933846494608F11A02D8F8E830CF ++:10AFD00020F0FAD973B0BDE8F08FC0462DE9F04FEC ++:10AFE000D0F8ACA3D1B0D0F8B00389469DF86C116D ++:10AFF0000890DAF86801079206911E4683799DF859 ++:10B00000704113B1042149F0D3DA99F8063023B125 ++:10B0100099F80430002B00F09B813278737842EA73 ++:10B020000328B278F37842EA0323079A0993537806 ++:10B030001B0213F4804040F07D81099B012B00F03E ++:10B04000828083460E2545E1DBF8D830002B00F0E6 ++:10B050007F81F3789F0914B30AEB8703D3F88052FA ++:10B06000EDB12B69DBB12B7ACBB14CAC314603226D ++:10B070002046F6F381F705F114012A69E01CF6F386 ++:10B080007BF729690DF12E05204603312A46FDF391 ++:10B0900061F25A9A301D111F2A46FDF38BF2032FDD ++:10B0A00040D809EB87035B6F002B3BD01A695A9895 ++:10B0B0003146143301F02ADF002833D0321D3179B4 ++:10B0C000537841EA03289178D378B8F1010F41EA27 ++:10B0D000032309931FD1032B1DD1B37A06F10A0272 ++:10B0E000102B18D1DBF8D80006F10C010230527891 ++:10B0F000F6F326F7044670B95846414699F94820B8 ++:10B100004AF016DA8BF8DE805846414622464AF06D ++:10B110000FDA25460BE05846012199F9482049F0FD ++:10B1200099DF03E003234FF0010809930F25DBF8B3 ++:10B13000D810089E4A78F0680232FBF3D9F5002354 ++:10B14000CBF8D830C6E0D9F85050D9F84C60D9F8CF ++:10B150005410ADB10C46074609E00799062201F1EB ++:10B160000A002146F6F3ECF6063410B10137B74277 ++:10B17000F3DB012D02D1B74206DB01E0022D01D045 ++:10B18000002512E0B742FBDB03230093079B00245A ++:10B1900003F10A02504617212346019402940394B6 ++:10B1A00018F086DC0125A346AFE0BAF8822144F20C ++:10B1B00021339A4214D00E3B9A4211D007339A425F ++:10B1C0000ED010339A420BD0143B9A4208D007336A ++:10B1D0009A4205D010339A4202D025339A4200D1C8 ++:10B1E0000125079E504606F10A0421462A464AF0E8 ++:10B1F000DFDA014610B150464AF0E2DA0135002D9F ++:10B20000D3DD504621464AF0E3DB8346002800F0B8 ++:10B210009C8049464AF0BED8DBF8042012F4805FD7 ++:10B2200009D0089991F83030002B40F08E8022F43C ++:10B230008053CBF80430504659461BF0CDDEB8F1B0 ++:10B24000000F03D0B8F1010F16D041E0B9F95C301E ++:10B2500099F9482023B9584601214AF069D903E0F9 ++:10B260005846012149F0F6DE9BF8183013F0010F23 ++:10B2700069D000252C4632E0DBF8D81041B1089B9C ++:10B280004A78D8680232FBF333F50023CBF8D83084 ++:10B29000B9F86250002D56D1089E8221F068FBF368 ++:10B2A00017F5044608B945462FE0102303706FF0E8 ++:10B2B0007F0343702946DAF80C30B3F85A26631836 ++:10B2C000013180299A70F6D10025CBF8D84006E0EC ++:10B2D0000D2502E0099903293AD80024ADB9BBF144 ++:10B2E000000F12D09BF8183013F0010F0DD0079EFD ++:10B2F00050464946042206F10A0300950195CDF80F ++:10B3000008800395049511F009DC0999069A4B1CF5 ++:10B31000019300230393079B059203F10A0148461A ++:10B3200009F1BC025B46CDF80080029504941CF044 ++:10B33000F3DC0DE0079A504602F10A014AF02EDADA ++:10B34000834628B180E60D2500E001250024DCE7D6 ++:10B3500051B0BDE8F08FC0467FB5089D9DF82440F0 ++:10B360009DF82860009501940296FFF737FE7FBD97 ++:10B3700002292DE9F0410646D0F8AC5301D0002453 ++:10B3800001E000F575742B68D3F88C205368126CBB ++:10B390009B1822692361C2EB0302A3699A422378B6 ++:10B3A0000ED24BB9E26863699A4205D30123237038 ++:10B3B00063680133636028E0E3680133E36024E0FD ++:10B3C0000027E7600BB3012904D1284602311EF0A3 ++:10B3D00025DE18E0022916D1A868D6F8D01304F0AB ++:10B3E0003DD9D6F8CC3373B12B6893F87430012B68 ++:10B3F00007D02869012132F063D82A68012382F836 ++:10B400007430C6F8CC7300232370BDE8F081C046C9 ++:10B410002DE9F04F97B0DDF894B0D0F8AC6300237D ++:10B42000D0F8B0930C460746594630460392DDF8F3 ++:10B4300088A014931393129333F0DCDF039905462D ++:10B4400001F001030093484621465246239B17F022 ++:10B450003BDF1490002840F00783219A032A0DD97E ++:10B46000042213A82099F6F387F5219B072B05D911 ++:10B47000209A12A8111D0422F6F37EF5139C129A4D ++:10B48000B4F1000818BF4FF00108BBF1000F01D163 ++:10B49000D5F808B003998B1E472B00F2E182DFE854 ++:10B4A00013F0F900FE00010104016A007D008C0028 ++:10B4B000DF028E00DF029700DF0207010A01480069 ++:10B4C00058007F0195010D011F014E015401280212 ++:10B4D000DF029900A000AD00B00033013601FC008E ++:10B4E000DF023E024202DF02DF02DF02DF02DF0292 ++:10B4F000DF02DF02DF02DF02DF02DF02DF02DF0244 ++:10B50000770289028E02E500EF00E202A402DF0268 ++:10B51000DF02B402B702C002C302C602C902CC02F3 ++:10B52000DF02DC02CF02DF02DF02DF02DF021402F1 ++:10B530001B02D9F83430002B00F092820DAC30465B ++:10B5400007F56371224620F077DB50462146102232 ++:10B55000C3E0D9F83430002B00F0828211AC5146A0 ++:10B5600004222046F6F308F5304607F563712246BB ++:10B5700020F07EDB1FE0219A0023052A8DF857304A ++:10B5800040F22781384620990DF1570227F084DADE ++:10B590009DF8573014908AF8003064E251463046E6 ++:10B5A0004AF0FCD80146002800F0268238469AF876 ++:10B5B000062029F06FDC149055E29B4B00E09B4B7A ++:10B5C0000093384629465246239B27F0FFD9F2E7DD ++:10B5D000974BF5E7D6F83407FEF7CEFECAF8000021 ++:10B5E00041E2D6F834572846FEF7CEFE844200F3F7 ++:10B5F0002E8228462146FEF7C3FE34E2D5F85035A8 ++:10B600003BE03368DB691F692B79002B40F06B81CD ++:10B61000BC4200F31C82C5F85045139C18461946DD ++:10B620007318D3F84C2222B1937913B1954218BF05 ++:10B63000013004312029F3D1002800F01482C4EB3A ++:10B64000070393FBF0F000217318D3F84C224AB1A2 ++:10B6500093793BB1954205D0D2F85035834288BFEB ++:10B66000C2F8500504312029EED1FCE196F9A83842 ++:10B67000002B01DA002300E00123CAF80030F2E1D8 ++:10B68000B8F1000F01D0002301E04FF0FF3386F83E ++:10B69000A838E8E195F83C30EFE7AB79EDE785F8BD ++:10B6A0003C80E0E1D6F82837E7E7C6F82847DAE13A ++:10B6B000D7F8BC33E1E7C7F8BC43D4E16A7E049213 ++:10B6C00022B105A805F11A01F6F356F4049B1A1DE0 ++:10B6D000239B93427DDB504604A9F6F34DF4C2E16F ++:10B6E000202C02D96FF01103BCE12399231D99424C ++:10B6F0006FDB2B79002B40F0F68028460AF104011D ++:10B70000224633F039DAAEE195F83A30B5E7AB7955 ++:10B7100085F83A8085F83B80002B00F0A4812B79D6 ++:10B72000002B00F0A0813046294611F0BFDA3046E8 ++:10B730004FF000614FEAC86218F03CDA93E199F8E3 ++:10B740003830003B18BF012397E799F838301C1EAA ++:10B7500018BF0124444500F0868130461FF076DB97 ++:10B7600010B96FF015037DE154B1304601F0C2FE0F ++:10B77000736A23F4C0137362002389F8383072E1CE ++:10B78000736A304643F400237362022389F8383029 ++:10B79000D6F8AC38013B86F8A93805F081FE62E1A5 ++:10B7A000219A032A15D9002C05DB3046214614AA1C ++:10B7B00033F064DD05460DB12B795EE7149B13F180 ++:10B7C0001E0F40F05081CAF800504CE1239B072B1C ++:10B7D00002DC6FF00D0345E1032A01D1002703E0ED ++:10B7E000022A14BF00270127002C2DDB30462146FA ++:10B7F00014AA33F043DD054630BB149B13F11E0F32 ++:10B8000022D1129B002B1FDD87F0010300932A46F3 ++:10B810002B463046139933F0CBD9054650B96FF01B ++:10B820001A03149310E0C046991E8300A91E8300DA ++:10B83000F92A83003046294633F0A4DE149018B16B ++:10B840003046294633F0F8DD129B032B00F00B81C4 ++:10B85000022B00F00881149A3AB112F11E0F40F049 ++:10B860000281002B40F0FF80FCE0002B24DD2B79CF ++:10B87000002B40F0F88033681B6F13F0030F02D0E9 ++:10B880006FF00803EEE0AB7923B13046294633F080 ++:10B89000ABDC90E6D5F8CC3013F4005202D04FF078 ++:10B8A000FF33DFE06B7E304600920192294605F1BE ++:10B8B0001A022EF05DD8D6E06B79002B00F0D38011 ++:10B8C0003046294633F0DCDACDE015B195F9643520 ++:10B8D000D3E6CAF800501FE0F5B1002C1CDB012CA8 ++:10B8E0001ADC2B7913B16FF00403BBE085F86445D3 ++:10B8F000B9E099F818307BB199F82F3063B199F815 ++:10B9000030304BB999F83F3033B9D6F868319B796C ++:10B9100013B9B6F81637B0E66FF00103A2E033684A ++:10B9200093F83030A9E6336893F83030434500F09F ++:10B930009A80304633F024DF0446B8F1000F05D07A ++:10B9400043791BB13046214633F09ADA214630461E ++:10B9500088F0010233F01CDF04461490002840F008 ++:10B9600082803368012283F82F20B8F1000F03D0C2 ++:10B97000D6F8403583F834203368304683F8308079 ++:10B9800010F01EDA86F8DD41304605F0BDFD6AE0B4 ++:10B99000BAF80200F7F360F4E8B99AF80400BAF8CC ++:10B9A00002109AF800209AF801300090284628F0FA ++:10B9B000C3DD00E6D6F83437B3F8A4335DE624B926 ++:10B9C000D6F83437A3F8A4434DE0D6F85C01A1B211 ++:10B9D0003AF0E4DC10B96FF0130343E0D6F83437E3 ++:10B9E000BDF84C10A3F8A4133DE0BBF1000F03D049 ++:10B9F0009BF80430022B02D06FF01D0332E0384672 ++:10BA0000DBF8101027F01CD8D5E597F8F03334E6B2 ++:10BA1000E3B287F8D53387F8F033384626F0D6DE20 ++:10BA200021E0D7F8E83328E6C7F8E8431BE0D7F869 ++:10BA3000EC3322E6C7F8EC4315E097F8D4331CE664 ++:10BA4000D6F86C32D3F8D432DB8D9C4202DD6FF035 ++:10BA50001C0307E0A7F8C84305E0B7F8C8330CE6B5 ++:10BA60006FF016031493149817B0BDE8F08FC0461A ++:10BA70002DE9F0410468074686B020460E46904600 ++:10BA80001D461BF0B3D910B120461BF0A7D90C9B63 ++:10BA90002046029300230393049339460B22434626 ++:10BAA0000096019511F03AD806B0BDE8F081C04685 ++:10BAB00070B5114686B00546164649F06FDE04465D ++:10BAC00008B390F8DF3023B12846214601222AF03E ++:10BAD000B9D9204649F0E8DBE3681BB12846214686 ++:10BAE0003CF0CCD9002203230092019302920392EE ++:10BAF0000492284621690532334611F00FD82846B2 ++:10BB0000214649F05DDE06B070BDC04670B5036BDE ++:10BB1000002680F8D068D0F85C410546186907F027 ++:10BB200005F8014620463AF001DA20B12846012105 ++:10BB3000324618F031DA70BDF0B505688BB00646B4 ++:10BB40000021EF681DF0D6DA304610F01BDFD5F883 ++:10BB5000E4366BB1A868D5F8741503F07FDD0023D7 ++:10BB6000C5F8E43695F8583503F0FD0385F85835E7 ++:10BB7000D5F85C013AF0BAD92A6992F8EA3063B193 ++:10BB8000D36ED3F8202140F2044302EA0303B3F555 ++:10BB9000806F14BF0020012006E0106E03F054FEF9 ++:10BBA000D0F1010038BF002000283CD0284605F025 ++:10BBB00019FE2B6BD5F85C41186906F0B7FF0146FA ++:10BBC00020463AF0B3D930B195F8D0281AB92846B2 ++:10BBD000012118F0E1D9304611F06EDC4FF000433E ++:10BBE000C7F888310F21286931F010DE286940F24A ++:10BBF000FF3131F0F9DD2B6B1B68022B04D1286972 ++:10BC000095F8431631F05EDE284616F02DDC284606 ++:10BC100016F0F6D900232846694600931AF082D818 ++:10BC200028461DF0D7DB0BB0F0BDC0462DE9F04F24 ++:10BC30000668D0F8D022D0F8D81297B00746D0F8CE ++:10BC4000E8B23046069107921DF04CDC069BB068C6 ++:10BC5000196803F003DD384602212CF02DDEF7E1F0 ++:10BC6000D6F8D83603EB82035D686C8E04F470431B ++:10BC7000B3F5805F14BF38233C2356F8039004F4D7 ++:10BC80004063B3F5406F28D1336893F8463013F022 ++:10BC9000030F15D0D6F85C01D9F8041039F02EDD69 ++:10BCA00010F0080F0CD199F8EC304BB1D9F80030F6 ++:10BCB000022B12D1D6F8FC349B7813F0020F0CD073 ++:10BCC0002046F7F3AFF20E2894BF4FF400534FF421 ++:10BCD000805340F4306003439CB2D6F85C012146A7 ++:10BCE0003AF05CDB002800F0AE81688EF7F39AF240 ++:10BCF0000446688EF7F396F244F430640E288CBF45 ++:10BD00004FF480504FF400500443A1B238462BF05A ++:10BD100087DE002800F09781D7F8E832002B78D032 ++:10BD2000D3F8DC30002B74D04FF00001A7F85C1082 ++:10BD300095F8AA004FF00C0800FB08B0EA8814A997 ++:10BD400082F08002C2F3C0121C30F7F3D1F3BDF8C9 ++:10BD500050200DF1540AA7F8622095F8AA00514628 ++:10BD600000FB08B02030F7F321F4159B33BB95F8A6 ++:10BD7000AA1013AC01FB08B1042224312046F6F3CB ++:10BD8000FBF020469A490422F6F3DAF048B995F818 ++:10BD9000A920A2F10803DBB2022B40F254818DF8F6 ++:10BDA0004F2020465146F7F301F4024630B9009087 ++:10BDB000CDF8048095F832300293FAE0159B8D4956 ++:10BDC00013F0040F1CBF43F002031593159B30467C ++:10BDD00013F0020F1CBF43F00103159315AB009342 ++:10BDE0000423019301230293BB68002203931346AB ++:10BDF00017F0D6DA002207230192009395F8AA30B3 ++:10BE00003046029303920492394618322B4610F0C2 ++:10BE100085DEB5F8623013F0100F0FD0BA6D40F226 ++:10BE2000371302EA03034BB9734B1A7832B9012373 ++:10BE30000092019395F832300293FCE02846F6F325 ++:10BE40007BF518B100230222009327E03B6D002B05 ++:10BE500032D0336893F83030002B2DD11C469846F1 ++:10BE600009E0796D284641440622F6F369F008F1AD ++:10BE7000060818B10134FB6C9C42F2D33B6D012BD8 ++:10BE800003D1FB6C9C4206D316E0022B14D1FB6C51 ++:10BE90009C420DD210E0002300930322019295F8FA ++:10BEA0003220039302920493304639461722C7E0AA ++:10BEB000002304220093F1E7336893F8953083B1AF ++:10BEC000D6F84C35012B09D1284606F5AA61062281 ++:10BED000F6F336F0002840F0B68002E0022B00F0C6 ++:10BEE000B28095F9344074B9D6F85C01698E3AF0A5 ++:10BEF000E9D840B105230094019395F832300394BA ++:10BF000002930494D0E7B7F862306BB1BA6D40F297 ++:10BF1000371302EA03033BB1304639462A462BF079 ++:10BF2000A1DF002840F08F80D9F80030022B0AD121 ++:10BF300099F815203AB9FD33009305F1380009A9A5 ++:10BF40000123019214E0336805F1380093F846307C ++:10BF500009A913F0030317BFD7F8CC301A46C3F36F ++:10BF6000003383F001020192FF2300220093134665 ++:10BF700045F0C2D8336B09F1500493F8EC1039B195 ++:10BF80006B8E03F44063B3F5406F14BF1421282176 ++:10BF9000204645F059D8D6F86036002209A8214637 ++:10BFA0009B7844F0EBDF024630B9009009230193FF ++:10BFB00002920392049277E79DF8382096F838377A ++:10BFC0009A4240D195F93430C3B96A8E304602F4B2 ++:10BFD0007042B2F5805F14BF0222012205F13801E0 ++:10BFE0002BF0E4DC024648B90A230090DFE7C046A4 ++:10BFF00058D4010017738600B0270200336893F805 ++:10C00000303053B32946304649F0C8DB014620B3EF ++:10C01000037E13F0020F06D0436813F4805202D15E ++:10C020000D230092C3E7D1F8F030B3B100220F2303 ++:10C0300000920193029203920492304639461732DD ++:10C040002B4610F06BDDD6F8DC36013BC6F8DC364B ++:10C05000D6F8DC26002A7FF403AED6F8DC36FBB136 ++:10C06000069B00219977D6F8DC26D6F8D836013A17 ++:10C0700003EB8203C6F8DC26069A9C685368012B02 ++:10C080000AD0009101910291039104913046394602 ++:10C090002022234610F042DD38462EF011DA35E03A ++:10C0A000D7F8CC3013F4005F06D0FB7923B9D6F86B ++:10C0B0004C01394643F0F8DF0799FA7991F93430A9 ++:10C0C0004AB1002238460121934214BF00230123C4 ++:10C0D0002CF0DAD809E038460121D3F1010338BF4A ++:10C0E0000023009201922CF009DA97F91030022B0C ++:10C0F00003D1F86800214DF035DA96F875323846EC ++:10C1000023F0040386F875322CF0A6D917B0BDE8E9 ++:10C11000F08FC0462DE9F04F9B460568D0F8D0322D ++:10C1200089B003932B68064693F83F308A469046C1 ++:10C13000D0F8D872D0F8D492002B00F08281C37965 ++:10C14000002B00F07E81837C0DF1160013B106F107 ++:10C15000D60100E049460622F5F30EF700242B68CD ++:10C1600085F84A4593F844301BB1D5F8640135F0A1 ++:10C1700067DFB37C2BB1D5F84C013146224605F080 ++:10C1800067F82A6992F8EA305BB1D36ED3F82021C0 ++:10C1900040F2044302EA0303B3F5806418BF0124AC ++:10C1A00005E0106E03F050FB041E18BF0124CCB153 ++:10C1B000002130462FF012DA3046FFF7BDFCB37C89 ++:10C1C0003046D3F1010338BF0023009300210DF165 ++:10C1D00016020823FFF74CFC002130460A4632F0D5 ++:10C1E000CBDC1AE1B37C002B00F08F80D6F8DC3278 ++:10C1F000D3F8901041B193F894206868FAF378F579 ++:10C20000D6F8DC32C3F89040BB6823B10D2B02D0C6 ++:10C2100030462CF09BDAD5F86801042148F0C8D9E3 ++:10C220000DF11601284649F0B9DA002421460746E7 ++:10C2300086F8944030461CF06FDC2146304619F0F9 ++:10C240002DDC304621460FF01FDEBAF1000F45D03D ++:10C2500006F1BC00F6F380F300283FD12B6BB9F850 ++:10C260003240186906F062FC844237D1D5F85C018F ++:10C27000B9F8321039F0AADE30B9D5F85C01B9F856 ++:10C28000321039F01FDF80B1B8F1000F0DD1D5F8B1 ++:10C290005C01B9F8321039F049DE30B9DFF8ACA1F1 ++:10C2A0000123C34685F8D03800E0C24608230DF1CB ++:10C2B00016010193284606F1C2030A4600971BF0B7 ++:10C2C00091DE034658B1BAF1000F08D02846514616 ++:10C2D0005A4618F053D810B9824600E0C2460FB94A ++:10C2E0003C462FE038460E2148F0AADE2B6893F832 ++:10C2F000443023B1D5F86401394635F0B5DE28461F ++:10C3000039461AF069DE00241CE02B6893F895305A ++:10C3100093B1D5F8000507A948F0DCDE06E05368C4 ++:10C3200013F0005F1CBF23F00053536007A848F0D0 ++:10C33000D9DE02460028F2D10124B474304616F04A ++:10C34000B3DEC246304600212FF048D905F5007112 ++:10C35000284606311FF0E2DC2B6893F83F20A2B993 ++:10C3600095F9473685F84226B3F1FF3F08BF85F8B7 ++:10C370004326284619F0B2DA2B6893F8463013F0BA ++:10C38000030F02D0284619F0C5DA06F1BC00F6F317 ++:10C39000E3F2014630B930460DF11602082300944D ++:10C3A000FFF766FB95F872323BB9D5F86C329E42C6 ++:10C3B00003D13046FFF7C0FB05E0304611F07CD8D2 ++:10C3C000304610F0DFDAD9F8641049B16868B9F87E ++:10C3D0006820FAF38DF40023C9F86430A9F86830B6 ++:10C3E00002230DF11602009328463346002117F070 ++:10C3F0002FD93046002117F0FDDA304617F066DA03 ++:10C40000284605F081F8BAF1000F03D02846002134 ++:10C410005A46D047B8F1000F01D0002013E0304653 ++:10C420004146424632F0A8DB414606220398F5F326 ++:10C4300007F606F1BC0041460622F5F301F6404638 ++:10C4400001E04FF0FF3009B0BDE8F08F0DBB0000F8 ++:10C450002DE9F04F062989B007460D4692469B46C6 ++:10C460009DF848900468D0F8D86246D061BBB9F115 ++:10C47000000F03D12046394633F098DB94F872322E ++:10C48000002B3AD0D4F8000507A948F023DE03E0DA ++:10C490001B7E13F0020F30D107A848F023DE0346BD ++:10C4A0000028F5D151E0236B186906F03FFBD7F85F ++:10C4B000D4325B8E834220D0204628F00DD8D4F8A9 ++:10C4C000340728F027DC18E0B368093B012B14D8A7 ++:10C4D0002046114649F062D910B10C2148F0B0DD78 ++:10C4E000022D07D0A068316803F0B8D8052D01D01F ++:10C4F000012D02D14FF0010801E04FF00008139B1D ++:10C500000095CDF804B00293336C20460393736C0E ++:10C5100039460493B9F1000F0CBF07220922534694 ++:10C5200010F0FCDAB8F1000F13D0052D01D0022D68 ++:10C5300007D1B27F337F9A4203D238462DF0C0DF55 ++:10C5400007E03846FFF772FB03E07368032BAAD1BC ++:10C55000D3E709B0BDE8F08F0048704760E70100FD ++:10C560000048704780E8010010B5836F40F2EE226A ++:10C570001C6A044B94219C4208BF4FF4166231F0B0 ++:10C5800069DB10BD50200800816F10B508310446EA ++:10C590002FF06CDEFFF7E0FF014620462FF046DE6D ++:10C5A00010BDC0462DE9F04104460D469046BDF849 ++:10C5B00018E09DF81C701E4633B18368DA6A02EBFE ++:10C5C0004102938BFB1893834FF6FF739E4503D074 ++:10C5D000A821724631F03EDB04EB8503D868084B96 ++:10C5E000414632465B6A9847002807DA36B1A368AD ++:10C5F000DA6A02EB4502938BDB1B9383BDE8F08183 ++:10C60000E0A6850010B507490446406EF6F3E0F158 ++:10C61000034620B9606E0449F6F3DAF10346184682 ++:10C6200010BDC04699D501000AAA860070B50D4616 ++:10C630000669144608460A220021F5F301F56B88C5 ++:10C640001C43F36C6C8013F0200F03D02B8843F451 ++:10C6500080632B80B16F42F250030A8C9A4206D15C ++:10C660004B8C052B03D86B8843F004036B8070BDA3 ++:10C670004FEA810210B513188E468168DB6F52189D ++:10C680008367936B0B6390F8EB3063B190F8E830FD ++:10C690004BB94FF40051006EBEF1000F0CBF0A46BB ++:10C6A0000022FEF3BFF310BDB1F1FF3F2DE9F041D1 ++:10C6B00004460E4605D1836F596A09B90E4600E05B ++:10C6C0009E6994F8E9701FB9204639462FF004DBC3 ++:10C6D000206EFEF307F580B1002504EB8503D868D2 ++:10C6E00010B1254B9B6898470135062DF5D1E368BD ++:10C6F0001BB1204600212FF03BDB94F8E8203AB133 ++:10C70000A3680022DA612046032130F071DC30E0BA ++:10C71000206E46F0040184F8EA20FEF393F3A06F44 ++:10C72000012184F8EA1018B1406A08B106F0D0F887 ++:10C7300020462FF0F5DBE26E206ED2F8E0310121C9 ++:10C7400023F02003C2F8E031F9F326F4002120465B ++:10C750002FF0C2DA204630F03DDD2046012130F0D6 ++:10C7600011D9A2680023D3611FB9204602212FF0FE ++:10C77000B3DABDE8F081C046E0A6850070B50121BE ++:10C78000044631F0ABDA206E03F05CF8204600215D ++:10C790002FF0A2DA204630F0FDDE054630B120460B ++:10C7A000002131F09BDA6FF0080005E020464FF0E1 ++:10C7B000FF31FFF779FF284670BDC04673B50469A5 ++:10C7C000054620460E46FFF7DFFEA36F3146586A46 ++:10C7D00007F0F6FB2A68012382F8743020462FF018 ++:10C7E0007DDCA36F2046998A31F010D8A36F2046D4 ++:10C7F000D98A30F0F9DF204694F886102FF0FED960 ++:10C80000A36F204652219A8B31F024DAA36F502176 ++:10C81000DA8B204631F01EDA20462FF081DC2046EC ++:10C82000FFF7A2FE032300932046042108220023E1 ++:10C8300030F0F0DB20462EF0B1DF7CBD10B504698E ++:10C840004FF440412046002230F0D2DBD4F8F830DB ++:10C850001B691BB120462EF0A1DF02E020462FF01D ++:10C8600059DDE26C206E02F00202002A0CBF114674 ++:10C870004FF400710A460023FEF384F310BDC04656 ++:10C8800070B5836804461B6893F82050F5B9012100 ++:10C8900031F024DA206E02F0D5FF204629462FF031 ++:10C8A0001BDA20462FF036DDA068D0F848381B7818 ++:10C8B0000BB12FF061DBA36F586A05F0FBFFA36893 ++:10C8C00084F85E501A68012382F8203070BDC0469B ++:10C8D00070B5082986B005460C4602DD6FF00100F0 ++:10C8E0002DE1836897491B685869F6F345F0082CD9 ++:10C8F00024D12A6E936913F0005F03D0D36913F03B ++:10C90000010F0BD0EB6C13F0010F0BD02B6D13F05C ++:10C91000800F07D1D36913F0010F03D06B6D13F0B3 ++:10C92000005F05D12B6D13F0800101D10C4612E0A0 ++:10C9300043B2022B40F30181052400E05CB1D5F83D ++:10C94000F8305B68022B06DDAB6D13F0005F02D19F ++:10C950006FF00200F3E00A220DF10E000021F5F362 ++:10C960006FF3D5F8F8304FF000021A8195F8903047 ++:10C970000BB91E4604E0EB6ED3F8203103F001063C ++:10C9800095F8903053B164B9D5F8F8301B68002B96 ++:10C9900000F0888028462FF0BDDC83E0002C00F0FA ++:10C9A0008180BDF80E30D5F8F82043F01003ADF8C3 ++:10C9B0000E305368022B6B6D03D123F000536B656F ++:10C9C00039E043F0005314F0040F6B6503D1138971 ++:10C9D00043F0140313812A6E936913F0005F03D0B0 ++:10C9E000D36913F0010F0BD0EB6C13F0010F12D0D1 ++:10C9F0002B6D13F0800F0ED1D36913F0010F0AD005 ++:10CA00006B6D13F0005F06D0D5F8F820138943F062 ++:10CA1000400313810FE0D5F8F8305B68042B05D193 ++:10CA2000BDF8123043F40053ADF81230D5F8F820B9 ++:10CA300000231361D360D5F8F8205368022B12D17C ++:10CA4000EB6C13F4804FBDF8103008D043F48073C2 ++:10CA5000ADF810303023D3602023136103E023F4BA ++:10CA60008073ADF8103014F0020FD5F8F81003D031 ++:10CA70000B8943F0010304E00A894FF6FE7302EAD2 ++:10CA8000030314F0040F0B81D5F8F81003D00B89C1 ++:10CA900043F0080304E00A894FF6F77302EA030340 ++:10CAA0000B8109E0BDF80E3023F01003ADF80E3015 ++:10CAB0006B6D23F000536B65D5F8F8301C60AB6FDD ++:10CAC000696D586A06F08AF995F890301BB116B175 ++:10CAD000284630F033DF0224BDF80E30284600210E ++:10CAE0001022009430F096DABDF81030284601216B ++:10CAF0004FF48072009430F08DDABDF81230284681 ++:10CB000021464FF40052009430F084DA28462FF08A ++:10CB1000A1D895F8903073B1AB6F1B68A34206D1D2 ++:10CB2000D5F8F8301B6813B128462EF037DE16B161 ++:10CB300028462FF05DDF002001E00124FFE606B06B ++:10CB400070BDC046C65C860070B5054690F8900082 ++:10CB5000002846D0AB6F002185F89010586A05F088 ++:10CB6000BDFEAB681A6992F8EA305BB1D36ED3F8B8 ++:10CB7000202140F2044302EA0303B3F5806018BFAA ++:10CB8000012002E0106E02F05FFE68B10024AB6F7E ++:10CB900085F8EB4085F8EA40586A214605F098FE92 ++:10CBA000A8682FF033D91BE0286EFEF39BF20446F1 ++:10CBB00080B1EB6ED3F8203113F0010F02D028467C ++:10CBC00030F0BCDEAB689868F6F7F8FA0446284601 ++:10CBD00031F0A2D895F8E81011B9284631F07ED886 ++:10CBE000204670BD70B5054690F8900050B3AB6814 ++:10CBF0001A6992F8EA305BB1D36ED3F8202140F283 ++:10CC0000044302EA0303B3F5806418BF012403E080 ++:10CC1000106E02F019FE0446AA6814B100231362D4 ++:10CC20000CE0906802F056DD284621462FF054D8DB ++:10CC300095F8E83013B928462FF06CDBAB6F586AD3 ++:10CC400006F014FB70BDC0460121836F10B580F85B ++:10CC500090100446586A05F041FE204602212FF04C ++:10CC60003BD8A368986802F03FDD002010BDC046A5 ++:10CC70002DE9F3418668062733680DF10204DB696C ++:10CC800005461B6AD0F86C80C6F8AC3830493A4685 ++:10CC90002046F5F371F16B6C2E48214603FB07002B ++:10CCA0003A46F5F369F10423C6F8AC38013B86F83F ++:10CCB000A938A8681EF0CAD808B93C4604E0D6F8DE ++:10CCC000AC389B0001339CB2D5F8B8700026F05DFB ++:10CCD00004F0FF01201880B2421E02F0FF0341EA77 ++:10CCE000032102F48072C4F300231A43330243F495 ++:10CCF000004301369BB2062EA8F840350446A8F83A ++:10CD00002015A8F82C25A8F84035E0D12846982110 ++:10CD10007A7830F09FDFD5F8B83028469A219A7893 ++:10CD200030F098DFD5F8B8302846DC781A789C21A6 ++:10CD300042EA042230F08EDFD5F8B83028465C791C ++:10CD40001A799E2142EA042230F084DFBDE8FC819A ++:10CD500061DB0100301E02002DE9FF410569074635 ++:10CD60009221284630F05CDC400080B2A7F84200F7 ++:10CD700000282FD04FF000080DF101060F2130469A ++:10CD8000154A4346F5F3A0F1686E3146F5F320F6F7 ++:10CD900060B13146686EB7F84240F5F3EDF504EB4B ++:10CDA000480482B22146284630F054DF08F10108D9 ++:10CDB000B8F1770FE0D1686E0849F5F309F648B18C ++:10CDC000686E0649D5F8F840F5F3D6F52081284677 ++:10CDD0002EF040DFBDE8FF81AEAC8600177C8600F8 ++:10CDE0002DE9F041056986B04FF0FF31AC4A80462D ++:10CDF0002846EE6E30F0FCD8D5F8F8302846196891 ++:10CE0000FFF766FDAB6D3BB14FF00303A6F8B436F8 ++:10CE10004FF0FF03A6F8B836EB6C13F0010F27D0E4 ++:10CE2000A04A136823BB012111602B6D286E13F0FB ++:10CE3000800F03D0023102F0BBFD19E002F0B8FD13 ++:10CE40002B6D13F0005F13D12846922130F0E8DB00 ++:10CE5000400080B260B100F1CE042146284630F097 ++:10CE6000DFDB40F040022146284692B230F0F2DE8D ++:10CE70004FF0FF31C6F8281128468B4A30F0B8D859 ++:10CE80008A4C03E00A20F9F367F40A3CD6F828310B ++:10CE900013F0010F01D1092CF4D14046D6F8283106 ++:10CEA000FFF7CCFCD5F8F4302BB92B6E9A6A40F220 ++:10CEB00094539A4213D1286E7D4B826BD318012B69 ++:10CEC00007D94AF6E6039A4203D04AF6E5039A42A6 ++:10CED00005D10823002128220093FDF3D7F7002174 ++:10CEE0000A46286EFDF3B6F7FFF73AFB01462846DF ++:10CEF0002FF09CD92846FFF7BBFE4FF480330093F8 ++:10CF00002846062398210DF10E022FF0CFDCD8F829 ++:10CF1000003093F83830D3B140461DF097DF012838 ++:10CF200015D100231C461F4605930AE04FF4C02389 ++:10CF300000933946284605AA04232FF0DDDC01348E ++:10CF40002437D8F80030DB691B6A9C42EED32846B0 ++:10CF50008021082230F07EDE28465C210A2230F053 ++:10CF600079DE4FF08073534AC6F8003128465249A3 ++:10CF700030F03ED84FF00043C6F8883103F1024349 ++:10CF8000C6F88C314FF48043C6F8283103F540438E ++:10CF900073620121284630F019D8286E02F0A0FCF7 ++:10CFA00083B2A8F818001621A6F8A8362846B5F8C6 ++:10CFB000442030F04FDE2846C021B5F8542030F030 ++:10CFC00049DE2846C221B5F8562030F043DE3B4BFF ++:10CFD0002846C6F86031D6F86031B5F8883044216B ++:10CFE000C6F86431364BB5F88C20C6F86031D6F8F7 ++:10CFF0006031B5F88A30C6F8643130F02BDE28464F ++:10D000004621B5F88E2030F025DEB6F888361B05AF ++:10D010001B0DA6F888364FF00103A6F89C360023B6 ++:10D02000C8F848301C4605EB8403D86810B1254B7E ++:10D030005B6898470134062CF5D1224CE868236DD3 ++:10D040009847E36EE86898474046FFF785FE2B6EE9 ++:10D050009A6B4AF662139A421ED1EB6C13F0010FE1 ++:10D060001AD02B6D13F0800F16D113F0005F13D17F ++:10D070002846922130F0D4DA400080B260B100F14D ++:10D08000CE042146284630F0CBDA40F0400221465B ++:10D09000284692B230F0DEDD06B0BDE8F081C04631 ++:10D0A00004040004F02702000204020449420F00B5 ++:10D0B0001D57FFFF0000024000000640060002006E ++:10D0C00007000200E0A685002DE9F04790F8E9701E ++:10D0D00004460E469046856817B939462EF0FCDDA9 ++:10D0E000A86802F0F7DA06F47041B1F5805F14BF6A ++:10D0F0000021012181462046FFF7BAFAA36F31468D ++:10D10000586A05F00FFDA36F586A05F0EDFB28463D ++:10D11000FFF766FEB8F1000F04D0012120460A4651 ++:10D120002FF0D4DF28463146FFF748FBA868494670 ++:10D1300002F0E4DAD4F8D43043F00403C4F8D43075 ++:10D140000123C4F8D0301FB9204602212EF0C4DDDF ++:10D15000BDE8F087816810B50B680446D3F88C20D1 ++:10D16000D2F8B4300133C2F8B4300A6992F8EA3028 ++:10D1700063B1D36ED3F8202140F2044302EA0303E3 ++:10D18000B3F5806F14BF0020012006E0106E02F09E ++:10D190005BFBD0F1010038BF002020B120464FF0EA ++:10D1A000FF31FFF781FAA0682EF030DEA06819F099 ++:10D1B0008BDC10BDD0F8EC1010B5044631B100681E ++:10D1C0000C22F9F395F50023C4F8EC3010BDC046ED ++:10D1D0002DE9F04FD1F8D43289B0B3F832A0D0F8AD ++:10D1E0004C31804603938B798946D0F80CB0002BE4 ++:10D1F00000F0B58000273E4608EB8603D3F84C527A ++:10D200008DB1AB797BB9EB796BB1D5F8D432588E4F ++:10D21000F6F308F004465046F6F304F0844201D0D9 ++:10D220002F4606E02F460136082EE5D1002F00F0EC ++:10D230009680D7F8D432588EF5F3F4F7044650466A ++:10D24000F5F3F0F7844205D0D7F8D432D9F8D422D8 ++:10D25000DB8DD385404605A904AA18F08BDF39463B ++:10D26000D8F84C0141F0E2DF182300FB03F4D8F8B2 ++:10D270004C0104F13A0142F0C3DC38B9049A059B31 ++:10D28000039839460092019301F0DCFA04F1400161 ++:10D29000D8F84C0142F0B4DCD7F8D4320599DB8DD4 ++:10D2A00040019E02CE42079001D3B04209D321F043 ++:10D2B0007F4323F460038219984201D21046F6E7B7 ++:10D2C000079006AC07AD22462B46049803F0FAFC03 ++:10D2D000384618F0E5D929460346002220461DF0BD ++:10D2E000EDDDD9F8D4327608DB8D29469F02204641 ++:10D2F000334600221DF0FCDD3B46012101E049469A ++:10D300001346DA19B34201F10109F8D306A807A9B7 ++:10D31000002204AC05AD1DF0EBDD20462946069A3F ++:10D32000079B1DF0E5DD059B2046CBF88031049B73 ++:10D330002946CBF88431002304930593069A079B72 ++:10D340001DF0D6DDD8F84C010499059A42F010DFA3 ++:10D35000BB01CBF8883107FB09F3CBF88C3109B05E ++:10D36000BDE8F08F2DE9F34100EB8101D1F84C428B ++:10D37000064690461D469DF8207014B94FF0FF33C5 ++:10D3800019E004F11A0000212022F4F359F60023D9 ++:10D39000637615B9336803F14E054346304621469E ++:10D3A0002A46009730F09ADF034620B930462146DE ++:10D3B00032F0E8D803461846BDE8FC81D1F8CC30FD ++:10D3C00073B543F40053C1F8CC3005460C4632F037 ++:10D3D000D9D80646002840F08880B5F8822144F26A ++:10D3E00021339A421AD00E3B9A4217D007339A4201 ++:10D3F00014D010339A4211D0143B9A420ED0073306 ++:10D400009A420BD010339A4208D025339A4205D065 ++:10D41000AB6B5B7D13B96FF00B0666E02B6B93F87B ++:10D42000EC300BB91E4608E0B5F8263603F440632D ++:10D43000B3F5406F14BF142628262B6893F84630A6 ++:10D4400013F0030305D0D4F8CC30C3F3003383F0DA ++:10D4500001030093284633462146022231F024DAA4 ++:10D460000646002841D1D4F8CC3013F4803F0AD1CD ++:10D47000D5F84C01214641F0E1DFC4F8F00280B953 ++:10D480006FF01A0631E0062204F1BC0004F1C2017B ++:10D49000F4F372F5D4F8D432B5F8262683F8346064 ++:10D4A0005A86A379D3B194F8F532312B11D82B6871 ++:10D4B0001B7E2BB1284694F8F4120D4A1BF0B6DF00 ++:10D4C000D5F84C0194F8F41241F0FCDE322384F8D4 ++:10D4D000F43294F8F53284F8F43206E0D5F84C01D1 ++:10D4E00004F53D7141F0B2DE064630467CBDC046D3 ++:10D4F000329E85002DE9F041054632F041D90026E3 ++:10D500000746AB19D3F84C426CB1A3795BB1BC426E ++:10D5100009D063791BB12846214631F0B1DC284699 ++:10D52000214631F089DF0436202EEAD1BDE8F081B2 ++:10D53000002010607047C04610B505F021F810BDFE ++:10D5400010B504F05DFFC0B210BDC04610B508466E ++:10D55000114604F037FF10BD2DE9F0470446884618 ++:10D560004768002110469146C922F4F369F5204628 ++:10D57000414638F013DF78B997F85037002B00F0A8 ++:10D58000D08707F5AA6138460E3138F061D90646D2 ++:10D59000002800F0C68700E0266908F47043B3F560 ++:10D5A000805F14BF38233C233078FF5804F0D0FF4D ++:10D5B0000446B07804F0B4FF637C5FFA88F513F09A ++:10D5C0000102064602D097F904E106E097F904311A ++:10D5D000182BD4BF9646A3F1180E934B9C4203D14F ++:10D5E00058214FF0520C0BE0904B9C4205D0904BD1 ++:10D5F0009C4202D04FF07F0C01E04FF0580C614686 ++:10D600003B68022B5FD1012D01D8002303E00A2DD6 ++:10D610008CBF02230123E31893F90620854B9C421B ++:10D6200003D10B2D10D14C2240E0834B9C4203D1FF ++:10D630000E2D3BD1362239E0804B9C4202D0804BEC ++:10D640009C4204D10B2D30D00E2D2ED02EE07D4BE0 ++:10D650009C4203D10E2D29D12A2227E07A4B9C42ED ++:10D6600007D1022D01D1582220E00A2D1ED15422CB ++:10D670001CE0764B9C4203D10A2D17D1502215E0B5 ++:10D68000734B9C4203D10E2D10D128220EE0714B1A ++:10D690009C4203D10B2D09D13E2207E06E4B9C42E8 ++:10D6A00004D10C2D02D1442200E04022CEEB020333 ++:10D6B00023EAE3738B42A8BF0B46002202F809302D ++:10D6C0000132042AFAD1654B9C4208D0644B9C423B ++:10D6D00005D0644B9C4202D0634B9C4207D197F922 ++:10D6E0000431182BD4BF4FF0000EA3F1180E3A6886 ++:10D6F000022A40F01081012D01D8032303E00A2DF6 ++:10D700008CBF05230423E31893F90600494B9C4280 ++:10D7100001D10B2D6CE0554B9C4204D1022D00F041 ++:10D720000E810A2DCFE0444B9C4201D10B2D58E0D5 ++:10D73000424B9C4202D0424B9C4201D10B2D11E046 ++:10D740004B4B9C4202D04B4B9C4204D10D2D40F0E0 ++:10D7500007812E2004E1484B9C4206D10B2D00F09E ++:10D76000F2800D2D00F0F380FAE03E4B9C4258D041 ++:10D77000344B9C4204D10B2D40F0F2803E20EFE070 ++:10D78000314B9C4219D0314B9C4206D1022D00F006 ++:10D79000E4800A2D00F0E180E2E0384B9C4206D1A3 ++:10D7A000022D00F0D8800A2D00F0D580D8E0344B4F ++:10D7B0009C4202D0334B9C4206D1022D00F0C9801E ++:10D7C0000A2D00F0C680CBE02F4B9C420CD1022DDD ++:10D7D00000F0BD800A2D00F0BA80032D00F0BF805C ++:10D7E000092D00F0BC80BBE0284B9C4203D10A2DE0 ++:10D7F00000F0A780B4E0164B9C4205D1A5F10C03C4 ++:10D80000012B40F2A280ABE0214B9C4203D10B2DB7 ++:10D8100000F29D80A4E01F4B9C423DD10C2D00F0F6 ++:10D8200096800D2D75E0C046BC108600F010860075 ++:10D8300024118600400986002CDC0100BC0C860007 ++:10D84000D00C8600700D86007C0986009009860049 ++:10D85000840D8600DCDC010094DE0100340D8600BE ++:10D860005C0D860080118600FC0D860080DE0100C4 ++:10D87000E40C86000C0D8600FCE30100CC09860058 ++:10D88000A4098600B8098600F409860018098600F4 ++:10D89000980D8600381186008C4B9C4203D1022DD6 ++:10D8A00055D00A2D26E08A4B9C4231D0894B9C42B0 ++:10D8B00003D10B2D54D1322052E0874B9C4204D12E ++:10D8C0000B2D40D00C2D3AD04AE0844B9C4205D120 ++:10D8D0000C2D44D00D2D43D13A2041E0804B9C4289 ++:10D8E00004D1A5F10B03012B29D939E07D4B9C42D2 ++:10D8F00002D10B2D29D033E07B4B9C4205D10C2D5E ++:10D900002BD00D2D2CD144202AE0784B9C4227D1DE ++:10D910000B2D18D024E0332D01D800200BE03D2D35 ++:10D9200001D8012007E0632D01D8022003E0942DE7 ++:10D930008CBF04200320231893F9060010E04A202E ++:10D940000EE042200CE038200AE03C2008E04020B5 ++:10D9500006E0502004E0482002E04C2000E0462091 ++:10D96000CEEB000323EAE3736345B4BF1846604679 ++:10D97000022A04D199F800309842A8BF1846002224 ++:10D9800009EB02030132082A1871F9D1C0B2CC4662 ++:10D990004A4600210023013182F83430107382F8A6 ++:10D9A0003C3001320829F5D1337F13F0010202D057 ++:10D9B00097F9040106E097F90431182BD4BF1046FB ++:10D9C000A3F118003B68022B01D16B1E0FE0332D31 ++:10D9D00001D800230BE03D2D01D8012307E0632D82 ++:10D9E00001D8022303E0942D8CBF04230323F256B5 ++:10D9F0009B19997B3E4B9E4205D1A5F16403022BF6 ++:10DA000001D83E2110E03B4B49B29E4203D1642D28 ++:10DA100000F05C850BE0384B9E4205D1A5F1640314 ++:10DA2000022B01D83E2108E0344B9E420ED0344BED ++:10DA30009E420BD0334B9E4208D0334B9E4205D0C2 ++:10DA4000324B9E4202D0324B9E4214D1A5F1680364 ++:10DA5000242B10D82B4B9E421BD02B4B9E4218D010 ++:10DA60002B4B9E4215D0264B9E4223D0274B9E42E5 ++:10DA700020D044224A21274B9E420CD1A5F16803B5 ++:10DA8000202B03D98C2D00F03F8549E04422402112 ++:10DA900001E042224A21204B9E420DD1642D06D046 ++:10DAA000A5F168030C2B3BD840223C216CE04022BE ++:10DAB000342101E044210A46184B9E4230D1A5F1A1 ++:10DAC0006403102B2CD85222422160E068098600A2 ++:10DAD000DCDC0100B4DC010010DD010094DE01009B ++:10DAE00014E10100A8DE0100BCDE0100C8DC010079 ++:10DAF000B50886005BE30100D2088600DC058600DD ++:10DB00002E0586004B058600680586008505860083 ++:10DB100033068600F90586006D0686008A068600B3 ++:10DB20009C4B9E421AD1A5F16403082B98BF30216B ++:10DB3000A5F16E0398BF3422162B98BF4621A5F19C ++:10DB40008603022B98BF3E218C2D08BF3622A5F1FB ++:10DB5000950308BF48210F2B98BF44228E4B9E424D ++:10DB600012D1A5F16E03162BA5F1860398BF3A22B8 ++:10DB700098BF4421022B98BF3A2298BF3E218C2D9A ++:10DB800008BF362208BF4821844B9E4202D0844BF6 ++:10DB90009E4204D1A5F18403082B98BF2C22814B0F ++:10DBA0009E4202D1262D08BF2C21C0EB020323EA9E ++:10DBB000E377C0EB010323EAE37E4A4613790021B1 ++:10DBC000137582F8441009F1080301329A42F5D125 ++:10DBD0004B460A4601321F7783F84CE00133082A8E ++:10DBE000F8D1714B9E425BD0704B9E4258D0704B27 ++:10DBF0009E4255D06F4B9E4252D06F4B9E424FD0AB ++:10DC00006E4B9E4236D06E4B9E4249D06D4B9E422B ++:10DC100046D06D4B9E4243D06C4B9E4240D06C4BE5 ++:10DC20009E423DD06B4B9E423AD06B4B9E423DD0C4 ++:10DC30006A4B9E4234D06A4B9E4231D0694B9E4221 ++:10DC40002ED0694B9E422BD0684B9E4228D0684B09 ++:10DC50009E4225D0674B9E4222D0674B9E421FD0EA ++:10DC6000664B9E421CD0664B9E4219D0654B9E422D ++:10DC700016D052E0032D02D14FF03C0E0FE02B1FC7 ++:10DC8000042B0AD9092D00F04384A5F10C03012BC4 ++:10DC900000F217842C2700F015BC4FF0400E4027EF ++:10DCA0004D4B9E4202D04D4B9E4207D1EB1E082B9E ++:10DCB00094BF4FF0400E4FF0000E4027524B9E4253 ++:10DCC00022D1A5F124030C2B03D838274FF0300EB6 ++:10DCD0001AE0A5F13403082B03D84FF0440E774621 ++:10DCE00012E0A5F16403022B03D834274FF03E0E57 ++:10DCF0000AE0A5F16803202B03D844274FF04A0E11 ++:10DD000002E08C2D08BF32274B46002201321F75DE ++:10DD100083F844E00133082AF8D14B460022002161 ++:10DD2000013283F8241083F854100133082AF6D105 ++:10DD30004B460A46013283F82C7083F85CE00133CD ++:10DD4000082AF7D1184B89F864E09E4206D0174B99 ++:10DD50009E425BD0174B9E4270D0CEE0012D00F06A ++:10DD6000A780022D00F09980032D00F0A6802B1FC4 ++:10DD7000042B04D84C273C2338243E21A1E0092D54 ++:10DD800001D14C2750E00A2D00F087800B2D00F0C8 ++:10DD90008F808EE0A2058600BF0586002C078600D6 ++:10DDA000F40486002CE201007E0A86009B0A8600AD ++:10DDB000B80A8600F20A8600BD0B8600980E86001F ++:10DDC00040DC01006AE0010097DC010046DE010052 ++:10DDD00001DF0100E4DE0100630F860014108600FD ++:10DDE000B50E860024DD010041DD0100D2DD010019 ++:10DDF000EFDD01005DDC01007ADC01000CDE0100DA ++:10DE000029DE0100880C8600DC058600012D4FD03C ++:10DE1000022D44D0032D01D14C2743E02B1F042BAE ++:10DE20004BD9092D04D14A2734233024362148E028 ++:10DE30000A2D34D00B2D3CD136273AE0012D01D1EB ++:10DE40002C2736E0022D31D0EB1E052B18D8032DE0 ++:10DE500004D144272C2328242E2132E0042D20D065 ++:10DE6000082D1ED06B1F022B4FF044078CBF0023E0 ++:10DE700038238CBF002434248CBF00213A2120E0B9 ++:10DE8000092D04D142272E232A24302119E00A2DFE ++:10DE90000CD00B2D0DD12A270BE0402709E03E279F ++:10DEA00007E044273623322438210AE03C2700E0EB ++:10DEB000382700231C46194603E04C273823342416 ++:10DEC0003A214A460020042894BF82F84C4082F848 ++:10DED0004C300130177701320828F4D1FCB24A46A1 ++:10DEE0000020032894BF82F85C3082F85C10013077 ++:10DEF00082F82C4001320828F3D1A74B9E4206D06D ++:10DF0000A64B9E420DD0A64B9E4221D062E0032D2F ++:10DF100045D0092D43D02B1F042B38D83024342270 ++:10DF200033E0032D03D14224462248203AE0042D59 ++:10DF300031D06B1F022B03D84C245022522031E0E9 ++:10DF4000082D28D0092D22D13E244222442029E048 ++:10DF5000032D03D12E243022322023E0042D03D1BF ++:10DF60003024322234201DE06B1F022B03D83224D0 ++:10DF700036223A2016E0082D03D1302434223820EE ++:10DF800010E0092D03D12E24322236200AE000228F ++:10DF90001446104606E046244A224C2002E028247B ++:10DFA0002C222E204B460021042994BF83F84C409C ++:10DFB00083F84C20013101330829F5D14B4600216B ++:10DFC000032994BF83F85C2083F85C00013101339E ++:10DFD0000829F5D1734B9E422AD1032D0CD02B1F5B ++:10DFE000042B03D838203C213E2408E0092D03D01F ++:10DFF000002108460C4602E0342038213A244B46E2 ++:10E000000022042A94BF83F84C0083F84C1001329C ++:10E010000133082AF5D14B460022032A94BF83F826 ++:10E020005C1083F85C4001320133082AF5D134E0FA ++:10E030005D4B9E422AD1A5F124030C2B01D8382731 ++:10E0400004E0A5F134030C2B03D83A274FF0340E2B ++:10E0500012E0A5F16403282B03D83C274FF0400EB3 ++:10E060000AE0A5F19503102B8CBF002746278CBF33 ++:10E070004FF0000E4FF0480E4B46002201321F7544 ++:10E0800083F844E00133082AF8D10AE0474B9E4266 ++:10E0900069D0474B9E4200F0DF80464B9E4200F025 ++:10E0A000DB80454B9E4200F0D780444B9E4200F0FF ++:10E0B000D380434B9E4200F0CF80424B9E4200F003 ++:10E0C000CB80414B9E4200F0C780404B9E4200F007 ++:10E0D000C3803F4B9E4200F0BF803E4B9E4200F00B ++:10E0E000BB803D4B9E4200F0B7803C4B9E4200F00F ++:10E0F000B3803B4B9E4200F0AF803A4B9E4200F013 ++:10E10000AB80394B9E4200F0A780384B9E4200F016 ++:10E11000A380374B9E4200F09F80364B9E4200F01A ++:10E120009B80354B9E4200F09780344B9E4200F01E ++:10E13000F481334B9E4200F08F80324B9E4200F0C0 ++:10E140008E80314B9E4200F08780304B9E4200F023 ++:10E1500083802F4B9E427FD02E4B9E427CD02E4BF5 ++:10E160009E4271D0B5E0A5F12403082B02D84FF0F0 ++:10E17000380E67E0A5F12E03022B40F29880A5F13E ++:10E180003403082B01D8382792E0A5F13E03022B77 ++:10E1900044D8342747E0C046D50A8600A00B860045 ++:10E1A000DA0B86004E0C860011058600F905860004 ++:10E1B00049E2010066E20100A9E301001EDF01005F ++:10E1C0004DE0010013E0010098DD0100D8E00100FE ++:10E1D000F0DC0100F6DF0100F5E001008CE3010056 ++:10E1E00075DF010083E2010030E001000CDC01007A ++:10E1F000BCDF01005BE30100DCE3010063DE010042 ++:10E200005EDD01007BDD01003EE30100D9DF01009E ++:10E210003BDF010058DF010016068600A5F164030C ++:10E22000082B03D844274FF0380E49E0A5F16E03C0 ++:10E230001E2B01D832273BE0A5F19503102B36D9D0 ++:10E240004FF0000E77463BE0A5F124030C2B37D8A6 ++:10E2500038274FF0340E33E09E4B9E4201D1242DDF ++:10E260005CE19D4B9E4203D18C2D29D13A2727E0BA ++:10E270009A4B9E4204D1642D1FD08C2D1DD01FE0DF ++:10E28000974B9E4203D1A5F19503102B0DE0954BC2 ++:10E290009E4215D1A5F124030C2B10D9A5F134030E ++:10E2A0000C2B0CD9A5F16403282B08D908E04427CE ++:10E2B0004FF0400E04E0382702E0482700E03C27FA ++:10E2C0004B46002201321F7583F844E00133082ACF ++:10E2D000F8D1854B9E420BD0844B9E4208D0844B94 ++:10E2E0009E4205D0834B9E4202D0834B9E426DD10D ++:10E2F000A5F12403082B0DD87F4B9E4201D13A2073 ++:10E3000006E07E4B9E4202D13420014655E0342087 ++:10E31000382152E0A5F12E03022B08D8774B9E42FC ++:10E3200014BF3821342114BF4220402045E0A5F11C ++:10E330003403082B02D8462144203EE0A5F13E03D9 ++:10E34000022B06D86D4B3A219E4214BF34202C205C ++:10E3500033E0A5F16403082B06D8684B3E209E42AB ++:10E3600014BF44213A2128E0A5F16E031E2B17D8D3 ++:10E37000A5F18603022B09D85F4B9E4201D14420B0 ++:10E3800005E05E4B9E4201D13C2000E048208C2DF0 ++:10E3900010D1594B9E420FD0584B9E420CD009E0F1 ++:10E3A000A5F19503102B8CBF002146218CBF0020C6 ++:10E3B0004A2002E0442100E03C214B460022013289 ++:10E3C000197583F844000133082AF8D14C4B9E425A ++:10E3D00002D04C4B9E421ED1A5F124030C2B01D838 ++:10E3E00038210EE0A5F134030C2B09D9A5F1640303 ++:10E3F000282B05D9A5F19503102B01D9002100E0A8 ++:10E40000402108464B4600220132187583F844101B ++:10E410000133082AF8D14846002202EB090191F89D ++:10E420003C301BB990F84C3081F83C304AB999F82F ++:10E430003D300BB1013204E090F84C30012289F8F4 ++:10E440003D3001320130072AE7D94A46002192F8CF ++:10E4500044301BB992F84C3082F84430013101321B ++:10E460000829F4D14846002202EB090191F8343022 ++:10E470001BB990F8443081F834304AB999F83530F6 ++:10E480000BB1013204E090F84430012289F83530B4 ++:10E4900001320130072AE7D900229CF824301BB949 ++:10E4A0009CF81C308CF824309CF854301BB99CF834 ++:10E4B0004C308CF854300132082A0CF1010CECD1AC ++:10E4C0002FE040274FF0000EFFF7F8BB3822FFF790 ++:10E4D000ABBAC0467BDD01003EE301003BDF01003B ++:10E4E000F6DF01008CE301004B058600680586001D ++:10E4F0008505860033068600A2058600BF058600D6 ++:10E50000A70686005006860036210A46FFF708BB9C ++:10E5100040274FF0380EFFF7C3BB642D3FF4CBAE5E ++:10E52000CEE6BDE8F087C0462DE9F041069D0746DE ++:10E530000E4610461946002A4ED0002B4CD0002D16 ++:10E540004AD0B30A012B3FD914790EF031FEE40909 ++:10E5500001460023384622460FF046D895F8651547 ++:10E56000012911D195F86725531C0F2A85F86735C5 ++:10E5700032D90023C5F86865064685F8653585F803 ++:10E58000661585F8673527E095F8662532B90123C9 ++:10E59000114685F86635C5F8686513E0D5F8683525 ++:10E5A000F11A09D48B12012B06D995F86725531C53 ++:10E5B0000F2A85F8673505D9002385F86735C5F832 ++:10E5C000686519460E1807E0012385F86535013B9B ++:10E5D00085F8673585F866353046BDE8F081C04678 ++:10E5E0002DE9F3410A9D0B9E9846002304463360B3 ++:10E5F00017462B600846D9B18B784A781B0443EA4A ++:10E6000002230A781343CA78043143EA0263336071 ++:10E610008B784A781B0443EA022302791343CA78B1 ++:10E6200043EA02632B60427A037A53EA022001D163 ++:10E630004FF48060296832680EF0A2DE0C9B014620 ++:10E6400000933A4643462046FFF76EFF04463146A4 ++:10E650002846002223461CF04BDC0898099900222A ++:10E6600023461CF045DCBDE8FC81C046F0B50768D8 ++:10E670001C460E4687B019463846154617F07ADD17 ++:10E680002268D6F8A0309A4202D22B68013B2B6058 ++:10E69000D6F8A030002223600C9B384602930D9BD5 ++:10E6A000716E03931346009501940492FFF798FF4F ++:10E6B00007B0F0BD2DE9F04F8A460668002189B009 ++:10E6C000834690461F4689460D460791069105915F ++:10E6D000029103912BE063789D1C029B43B907AB29 ++:10E6E0000093304621462A4602233EF017DD029071 ++:10E6F000B9F1000F08D106AB0093304621462A46F7 ++:10E700000D233EF00BDD8146039B43B905AB00931F ++:10E71000304621462A4610233EF000DD0390C5EB2B ++:10E7200007031B1B03EB080704EB05080125404604 ++:10E730003946F4F3B7F504460028CCD1304607A992 ++:10E740003EF036D8304606A93EF032D8CDB1DAF8E0 ++:10E75000083043F04003CAF80830029B9BB1B9F17E ++:10E76000000F01D1039B73B1DBF810305AF803306E ++:10E770003BB9584651463DF0FFDE10B16FF01A002C ++:10E7800003E0002001E04FF0FF3009B0BDE8F08F5A ++:10E790002DE9704F066886B08B46104619469046A4 ++:10E7A0009A460F9C109D0EF003FD014630460EF078 ++:10E7B000F9DE41468146224630462B4617F002DDFF ++:10E7C0002046294600224B461CF078DB119B304640 ++:10E7D0000293129B0E99039342465346009401956F ++:10E7E000CDF810B0FFF7FCFE06B0BDE8708FC04654 ++:10E7F00043682DE9F04106460C4617460568F3B11B ++:10E8000099421CD12B681B7E73B1284691F8F412F3 ++:10E8100004F1C2021AF00ADE7368212293F8F4129E ++:10E82000284613461AF00CDEF37B022B07D13B6817 ++:10E830002BB9384606F114012422F3F39DF3BDE809 ++:10E84000F081C0462DE9F7430A9C0B9D0F46814697 ++:10E85000164698460094019540F00ED94346484626 ++:10E86000394632460094019540F0F4D901224846D9 ++:10E87000394640F0D7D9B7F8343513F0100F03D02C ++:10E88000484639463EF008D8BDE8FE8370B58B791E ++:10E8900006461546002B2DD0D1F8CC3013F4005F7E ++:10E8A00028D0107828B15378092B02D86FF00100D6 ++:10E8B00024E0D1F8F042237F834204D1E8B1627FA3 ++:10E8C0006B789A4219D020776B786377638843F02E ++:10E8D000020313F0080F63800FD0304621463EF04C ++:10E8E00063DD304621463EF043D9304621463EF0B6 ++:10E8F000BBDE02E04FF0FF3000E0002070BDC046FC ++:10E900002DE9F743D0F8009004460027E31993F867 ++:10E910003B80B8F1FF0F4CD0FD0000262046294671 ++:10E9200041F06ED9002840D020462946002241F00F ++:10E9300085DE4846414601AA30F0A0DC002834D0EC ++:10E94000D0F8F01221B9002E2FD10EF059D92CE0B9 ++:10E95000837933B1D0F8CC3013F4005F01D0037960 ++:10E960001BB34B8813F0080F1FD0032E1DD8DFE810 ++:10E9700006F002060F1620463EF0C8DE15E013F042 ++:10E98000020F12D00B7F83B120463EF0FBD80CE083 ++:10E9900013F0010F09D020463DF0AEDF05E013F083 ++:10E9A000010F02D020463FF035DA01360235042E41 ++:10E9B000B4D10137042FA9D1BDE8FE832DE9F3417D ++:10E9C000D0F8008007463EF021D9AE21404617F02E ++:10E9D000C7DB4000B8641421404617F0C1DB262491 ++:10E9E000A7F84C0021464046284A1AF01FDD214670 ++:10E9F000002340464FF6FF7201341AF021DD322C1D ++:10EA0000F0D126E0294600223846013441F016DED6 ++:10EA100002350C2CF6D118369A2E1BD11DE0294652 ++:10EA200000223846013441F009DE0235042CF6D1CB ++:10EA30000836202E12D114E029460022384601342F ++:10EA400041F0FCDD0235042CF6D10836BA2E09D18E ++:10EA50000BE03A2635460024D4E70026354600244C ++:10EA6000DDE79A2635460024E6E7384620210022D5 ++:10EA700041F0E4DD032310220093404604211346B5 ++:10EA800015F0A2D80020BDE8FC81C046329E85006A ++:10EA9000F0B50E4649691569908A0A68002A01DABC ++:10EAA000821831D44C68131983422DD8B36801F110 ++:10EAB000080C0CEB040705EB020E6BB9184608E0D6 ++:10EAC00010F80E3010F80C20C15D134099421BD194 ++:10EAD0000130A042F4DB19E0012B15D12B18C4EB57 ++:10EAE00003050DE010F80E3010F80C20C15D134046 ++:10EAF000994203D10130A042F4DB07E00EF1010E90 ++:10EB0000AE4501D80020F6E7002000E00120337B6D ++:10EB10000BB180F00100F0BD036870B50446586881 ++:10EB2000A36A0D46164623B99021F8F3D1F0A062EE ++:10EB300070B1A06A0123AA8A03607F3382604660B5 ++:10EB4000C360296910309A4228BF1A46F3F314F2C1 ++:10EB500070BDC04668468369416920300BB52038D6 ++:10EB600003695A4651460EB44A46414606B4C36844 ++:10EB700082684168FEB40368C269EFF303810EB492 ++:10EB80008269EFF3058106B4034801680029FED0CD ++:10EB90006846884714B000BD3CEC00000A490842B2 ++:10EBA00002D062B6C94308400849084202D061B6A3 ++:10EBB000C943084006490840002803D005490A68AF ++:10EBC00002430A607047000000000080000000401F ++:10EBD000FFFF000000E100E00A49084202D072B6DF ++:10EBE000C94308400849084202D071B6C9430840E9 ++:10EBF00006490840002804D005490A68C04302407D ++:10EC00000A6070470000008000000040FFFF000025 ++:10EC100080E100E0024909689022885870470000AE ++:10EC200048EC0000024909689C22885070470000A7 ++:10EC300048EC0000DDBAADBB0000000000000000A1 ++:10EC400000000000000000000000000000000000C4 ++:10EC50000000000000000000024A11681060081C5B ++:10EC6000704700003CEC0000024A11681060081C6C ++:10EC70007047000040EC0000034908600348016849 ++:10EC80000029FED08847FEE734EC000040EC00008D ++:10EC90006348644900220A500168634A0A40634F8E ++:10ECA0000F403F4232D1002398469A46604A0A40BC ++:10ECB0001821CA405F4943585F4C1C405F4DAC422D ++:10ECC00004D180465E4D4519A9460EE05D4DAC422B ++:10ECD0000BD182465A4D4519AB460F241D1C2340CB ++:10ECE000594C25402D0A2B439C460023984501D0C2 ++:10ECF0009A4504D1554BC018013ADCD105E0504685 ++:10ED0000004202D04046004229D1FEE7FC21415892 ++:10ED10000A680F2313400F2BF1D0012B01D00431CF ++:10ED2000F6E708314A4B13404A4CA34206D100F0A3 ++:10ED3000BBF8804600F0C4F88146E9E7464CA342A0 ++:10ED4000E6D10B1F1B68454C23401824E3409C462A ++:10ED500000F0AAF8824600F0B3F88346D8E74049AD ++:10ED6000212242502E4A3F498958FF23194219D087 ++:10ED700051683D4B194215D011683C4B1940D36A7C ++:10ED800010E0A3420ED0C0460CE039498958194220 ++:10ED900008D03849895819409942FAD12B4B11694A ++:10EDA0001942FCD049463F4204D19823CB58102445 ++:10EDB000E34001E0304BCB581C242340002B01D012 ++:10EDC00000F08CF840462D49086048462C49086000 ++:10EDD00050462C49086060462B4908602B490F605B ++:10EDE0002B4D2C490D60043DAD46009DEC43102396 ++:10EDF000DD41AC4201D081B009E0240CA400264DD5 ++:10EE00002C606B461B1B254D2B60043B9D46244804 ++:10EE10002449002204C08142FCD80EF0E5FAFEE746 ++:10EE20000000001814060000F8FF0000000000F0C9 ++:10EE30000000000FFC0F0000F08F0000A082000017 ++:10EE4000000F0000E08000000070000000100000D3 ++:10EE500000FF0F00002A0800000E0800000000FF5D ++:10EE6000E00100000406000000003800FFFF000081 ++:10EE7000180600000C0600000804000048EC000022 ++:10EE80004CEC000050EC000054EC000044EC00009E ++:10EE900000C00300F81E0200001F0200FC1E02005A ++:10EEA000AC270200182C020008680F22043102402F ++:10EEB000052AF9D1014A1040F746000000F0FFFF93 ++:10EEC00008680F2204310240052AF9D1802210423D ++:10EED000F6D0014A1040F74600F0FFFFFEE70000C1 ++:10EEE00010B57146034802F0DFFB40F61100FFF752 ++:10EEF000C3FE10BD8E1F860010B5002128220446D7 ++:10EF0000F3F39EF00A4B23600A4B63600A4BA36045 ++:10EF10000A4BE3600A4B23610A4B63610A4BA3610E ++:10EF20000A4BE3610A4B23620A4B636210BDC04681 ++:10EF300000000000C71D0200C81D0200AC2702002F ++:10EF4000AC270200182C0200182C020021D202006B ++:10EF500024D20200005903002DE9F04399B00CA817 ++:10EF6000FFF7CAFF0C9B0D99DFF8DC91C91A0F9DC2 ++:10EF70000E9BD9F80060ED1A119C109B06F5A05667 ++:10EF80006048E41A76180B9102F08EFB0B9905F598 ++:10EF90007E7376190733361901F57E729B0A019448 ++:10EFA00004F57E740732009307340523A40A920AFD ++:10EFB000039355482B460294DFF8848102F074FBDA ++:10EFC000524BD8F800401968D9F80050C4EB01033F ++:10EFD00003F57E7001F57E7207300194039504F508 ++:10EFE0007E7405F57E75800A073207340735920A6C ++:10EFF0000090A40AAD0A46480294049502F054FB1E ++:10F00000444B45481968D8F80030C91806F57E7396 ++:10F0100001F57E7207339B0A0732920A009333464A ++:10F0200002F042FB3D4B3E48196802F03DFB3D4B70 ++:10F030001F683D4B3A689A4203D03C4802F034FBCB ++:10F0400024E0179705E03268374B9A4205D1331D0B ++:10F050001793179E16AB9E42F5D3354BC7EB0600B0 ++:10F060001A6817ABC7EB0301C3EB0204C6EB02053A ++:10F070000092019102910390049039462D48324646 ++:10F08000059406940795089502F00EFB2A4C20681B ++:10F09000002834D0C588F3F363F52368013D5C890B ++:10F0A0004FF4806104FB05F6443405FB04F406F5D7 ++:10F0B0007E73073393FBF1F3009304F57E730733FC ++:10F0C00093FBF1F302460293294633461B48019411 ++:10F0D00002F0EAFA1A4B0F4A1B681268C6EB0306E5 ++:10F0E0009B181B1B03F57E7106F57E720731890A9A ++:10F0F0000732009113483146920A02F0D5FA19B04E ++:10F10000BDE8F083E11F8600F01F8600C8260000DE ++:10F110002E208600A4260000722086009026000083 ++:10F12000AC208600F82702004B415453C6208600CD ++:10F13000FC270200E9208600BC260000662186002C ++:10F140008826000092218600CC2600000D4B10B5C9 ++:10F150001A680D4CD2F81416D2F8143699420B4B9B ++:10F1600018BFD2F8141622681B68C2EB010098423F ++:10F1700001D2002004E0B0FBF3F003FB0023236086 ++:10F1800010BDC0469C260000E4260000C8250000F3 ++:10F190002DE9F04301688FB0022907461AD15A4B76 ++:10F1A0005A481A6800235361046814F4805F11D030 ++:10F1B000574B584A1960C169043B1960136804230E ++:10F1C000136024F4805343F400530360524802F068 ++:10F1D0006BFA96E03B680C2B14D14C4C236813F46B ++:10F1E000005F0FD023F4005343F400632360676093 ++:10F1F0004A48F96C02F058FA236803F40063002BC4 ++:10F20000FDD17EE03B68103B0F2B02D8F7F3E2F014 ++:10F2100077E03E4B4248D96902F046FABA6C786C06 ++:10F22000BC68FD683968FB6C009201903A463D4825 ++:10F230000294039502F038FA3B4B7E6C1B68F86928 ++:10F24000D7F828E03C6A7D6A9B1B39697A694FEAE6 ++:10F250009309BB6900903548CDF80CE00194029504 ++:10F2600002F022FAB86BFC6B3D6CF96A3A6B7B6B6F ++:10F2700000902F480194029502F016FAF068316868 ++:10F280007268B36800902B4802F00EFAF069316999 ++:10F290007269B3690090284802F006FA04A8FFF7E3 ++:10F2A0002BFE264802F000FA0024A04625461CE06A ++:10F2B000725912F0010F13D0FF2A11D9059B9A42FF ++:10F2C00008D91F4B1B0D1B059A4209D303F5801368 ++:10F2D0009A4205D81B48294602F0E6F908F10108D0 ++:10F2E0000435B8F10F0F02D801344C45E0D1074A7C ++:10F2F00040F203301368576043F480631360FFF7F4 ++:10F30000BBFC0FB0BDE8F0837428020000280200A7 ++:10F31000241000E0281000E0C4E50100C8E5010069 ++:10F32000D4E50100E1E50100F81E020015E6010048 ++:10F3300048E6010077E6010095E60100FC1C860026 ++:10F340009D668000B2E60100F0B51F4E8BB06846A6 ++:10F35000FFF7D2FD3578F5B90698079B1C1A07D040 ++:10F3600029462246F2F36CF606982146F6F358F742 ++:10F370002146164802F098F9154B1D700123337091 ++:10F38000144B1968E9B10B78DBB1134B2A461868A6 ++:10F39000F3F34AF415E0114F3D7895B90898099BAD ++:10F3A0001C1A07D029462246F2F34AF6089821464D ++:10F3B000F6F336F70A48214602F076F90123357054 ++:10F3C0003B700BB0F0BDC0463C280200C9E601000E ++:10F3D0003E280200BC260000242802003D2802002E ++:10F3E000FBE6010010B50446FBF384F60146204617 ++:10F3F00000F034F910BDC04670B50446FBF37AF650 ++:10F400002046FBF3B7F505462046FBF337F500220F ++:10F41000064640F62A012046FBF3F0F60123AB40F6 ++:10F420008269134201D0002500E0013520463146B3 ++:10F43000FBF3F6F6284670BD10B5FFF7DDFF10BDF3 ++:10F440002DE9F04107460C46FBF354F63846FBF332 ++:10F4500015F540F62A01804600223846FBF3CEF629 ++:10F4600083690646456944B14FF4004043F00044C7 ++:10F4700045F00045FFF792FB07E04FF4004023F012 ++:10F48000004425F00045FFF7A7FBB46138467561DD ++:10F490004146FBF3C5F6BDE8F081C0462DE9F041D9 ++:10F4A0000E465021804617461D46F7F311F40446D8 ++:10F4B00018B300215022F2F3C3F540F23C736363AA ++:10F4C000A3F55573E363A3F5737323640C2363649B ++:10F4D00004230020E56026606760C4F80880A36408 ++:10F4E0000749F3F349F2C0B284F84C000138C0B2C6 ++:10F4F000012802D9022384F84C302046BDE8F0816F ++:10F500003E2986000048704718F9010000487047FE ++:10F5100090F901000048704700A60E00D2F80036AE ++:10F5200070B50546C3F38404FFF7ECFF03E083786E ++:10F53000A34204D00C3020B10388002BF7D10388FC ++:10F5400013B92846FFF7E2FF03884FF47A7003FBF4 ++:10F5500000F070BD0123C2F8603610B5D2F86446E1 ++:10F56000FFF7D8FF04F0FF04B0FBF4F34FF47A7018 ++:10F5700003FB00F010BDC0462DE9F0411C460646D5 ++:10F580001546FBF37BF4002107463046FBF348F6B3 ++:10F590000223C0F8583654B1D0F85C3605F03F026B ++:10F5A00023F4FC4343EA4223C0F85C3603E0D0F87E ++:10F5B0005C36C3F3452530463946FBF331F6284621 ++:10F5C000BDE8F0812DE9F041DFF860800646D8F80B ++:10F5D000004034BBFBF352F4214607463046FBF3B0 ++:10F5E0001FF6D0F81456D0F8143604469D4218BFC2 ++:10F5F000D0F8145642F21070F7F3AEF0D4F8142697 ++:10F60000D4F8143630469A4218BFD4F81426394636 ++:10F61000C5EB0203642203FB02F3C8F80030FBF3DE ++:10F62000FFF5024B1868BDE8F081C046842802004F ++:10F6300070B504460D46FBF321F400210646204632 ++:10F64000FBF3EEF5294602462046FFF783FF3146DD ++:10F6500005462046FBF3E4F5284670BD10B5FFF7DC ++:10F66000E7FF10BD70B504460D46FBF307F400211B ++:10F6700006462046FBF3D4F5294602462046FFF70E ++:10F680004DFF314605462046FBF3CAF5284670BDBE ++:10F690002DE9F04F1746C7F820361D46036A85B09E ++:10F6A0000C2BCBBFD2F82836D2F82836C3F3094B3F ++:10F6B000C3F3072B01230024AB4080468946029404 ++:10F6C00003940094F6F30AF30646012212FA04F3B7 ++:10F6D000334207D00092404649463A46F6F3FEF2DE ++:10F6E00026EA000601341F2CEFD1404603A902AAE6 ++:10F6F000F6F31EF3039B00256FEA030A2C46012351 ++:10F70000A34006EA0A021A4208D0404649463A4651 ++:10F71000E3B2FFF7BDFF854238BF054601341F2C19 ++:10F72000EDD10BF10200401905B0BDE8F08FC046E5 ++:10F730002DE9704305468846FBF3A0F3002181467E ++:10F740002846FBF36DF50446284600F0F3F8224600 ++:10F750000646414618232846FFF79AFF0B2302303E ++:10F7600000FB03F0074C49463419B4FBF6F404FBE4 ++:10F7700000F42846FBF354F50A23B4FBF3F4A0B2DB ++:10F78000BDE870833F420F0073B5044616461D4620 ++:10F7900000914FF4CB6200214FF0FF33FBF376F37F ++:10F7A0002046002140F25C6233460095FBF36EF385 ++:10F7B0007CBDC046002270B513460C4604210546A8 ++:10F7C000FFF7E2FF012C20F0F07308BF43F0F07365 ++:10F7D000284604214FF0FF32FFF7D6FF012C03D15A ++:10F7E00049F64040F6F3B8F770BDC04610B50021A9 ++:10F7F000FFF7E0FF10BDC04610B50121FFF7DAFFAB ++:10F8000010BDC04610B508B1F6F366F510BDC04690 ++:10F8100070B5094B06461D6808E030462C68FBF3BE ++:10F8200069F429466A68F7F363F22546002DF4D19E ++:10F83000014B1D6070BDC0466C270000002343666D ++:10F840007047C0467047C0460020704710B5FFF7AC ++:10F85000D3FF10BD10B5FFF7C9FF10BD2DE9F04172 ++:10F8600006460D461446FBF30DF4804618B93046A3 ++:10F870000121FBF345F4304613F032FA074610B984 ++:10F880006FF01D0415E014B96FF0190418E04FF083 ++:10F8900000032B80002404F182013846F2F34AF27F ++:10F8A000C0B2A0402B8801341843052C2880F2D127 ++:10F8B0000024B8F1000F03D130464146FBF320F499 ++:10F8C0002046BDE8F081C04607B54FF0000302A90D ++:10F8D00021F8023D0122FFF7C1FFBDF806000EBD71 ++:10F8E000416E2DE9F041044661B1D0F8C83000EB1B ++:10F8F0008303D3F8D020C36D9A4203D1006E8847AA ++:10F90000064600E000262046616DFFF711FFA56E58 ++:10F9100007465DB1D4F8C83004EB8303D3F8D02098 ++:10F92000E36D9A4202D1206E3146A8473846BDE8C1 ++:10F93000F081C04610B50446FBF3DCF301462046D7 ++:10F94000FFF740FE10BDC04610B50446FBF3D2F3EE ++:10F9500001462046FFF786FE10BDC046416E2DE9E8 ++:10F96000F041044661B1D0F8C83000EB8303D3F80E ++:10F97000D020C36D9A4203D1006E8847064600E04E ++:10F9800000262046616DFFF753FEA56E07465DB168 ++:10F99000D4F8C83004EB8303D3F8D020E36D9A4247 ++:10F9A00002D1206E3146A8473846BDE8F081C046F6 ++:10F9B00043692DE9F743222B06460F4640F3A0800A ++:10F9C000FBF314F4002800F09B80072F00F29880CE ++:10F9D000B268B2F5026F01D101220AE040F60403D9 ++:10F9E0009A4201D0002204E0F3680C2B94BF00225D ++:10F9F00001225FFA82F8B8F1000F0BD130464FF4C4 ++:10FA000000614246D6F8C890FBF3F8F3054600289B ++:10FA100077D006E0D6F8843013F5405571D04FF01A ++:10FA20000009032F03D030460121FBF379F4D5F808 ++:10FA3000303123F00403C5F8303101239F42C5F86B ++:10FA4000303103D9042F01D0083300E00D23C5F86D ++:10FA50003031D5F83031012F23F00103C5F83031B2 ++:10FA600001D9042F36D1FF2400214FF4E27223463E ++:10FA700030460094FBF30AF22223009300214FF456 ++:10FA8000EE7223463046FBF301F228230093002157 ++:10FA90004FF4E67223463046FBF3F8F181230093DE ++:10FAA00000214FF4E87223463046FBF3EFF10123C7 ++:10FAB000009300214FF4A4724FF0FF333046FBF364 ++:10FAC000E5F1304600214FF4A6724FF6FF73009423 ++:10FAD000FBF3DCF1D5F8303123F0700343EA071370 ++:10FAE000C5F83031D5F8303123F00803C5F830318E ++:10FAF000B8F1000F05D130464946FBF391F300E021 ++:10FB000000252846BDE8FE8370B50446FBF36EF37E ++:10FB1000002839D0A268B2F5026F01D101220AE0B3 ++:10FB200040F604039A4201D0002204E0E3680C2B63 ++:10FB300094BF00220122D5B24DB920464FF4006196 ++:10FB40002A46D4F8C860FBF359F3E8B105E0D4F8CD ++:10FB5000843013F5405017D00026D0F8303123F010 ++:10FB60000403C0F8303143F00103C0F83031C3F36F ++:10FB70000213032B03D020460021FBF3D1F31DB960 ++:10FB800020463146FBF34CF370BDC0462DE977416A ++:10FB90000022012113460546F6F352F10024804667 ++:10FBA00021462822234628460094FBF36FF10121C9 ++:10FBB0000646434628464FF0FF32F6F341F1284609 ++:10FBC000214628224FF0FF330096FBF35FF1BDE89A ++:10FBD0007E81C046D0F86C32994201D0002004E00A ++:10FBE0008B79D3F1010038BF002070472DE9F04137 ++:10FBF000002605460446374608E02B68216A9868C7 ++:10FC0000FFF32CF500B90136013718346B689F42B9 ++:10FC1000F3DB3046BDE8F08103682DE9F0411E6852 ++:10FC20000546B7688846144638462969FFF316F535 ++:10FC300044B133681B7E2BB1384629694246012303 ++:10FC4000FFF3C4F4BDE8F08170B505460446002614 ++:10FC50000DE0616949B1236A3BB1182006FB00F051 ++:10FC6000103028180122FFF7D7FF013618346B68CF ++:10FC70009E42EEDB002070BD2DE9F3411F46036874 ++:10FC8000044601910092DDF820801E6809B10D291B ++:10FC900041DD61680022FFF7BFFFE1680025656074 ++:10FCA00031B1236822891B685868F7F321F0E560B9 ++:10FCB000009B2BB1B3F5967F02DA6FF01C002CE0AD ++:10FCC00030464146FFF786FF28B3019969B12368A2 ++:10FCD0001B685868F6F3FCF7E06010B96FF01A0083 ++:10FCE0001BE03946019AF2F347F101A90422C4F856 ++:10FCF000148004F10800F2F33FF1201D694604224C ++:10FD0000F2F33AF1009840B1204661680122FFF712 ++:10FD100083FF002001E06FF00100BDE8FC81C046D8 ++:10FD20002DE9F047154686B00268DDF84080DDF821 ++:10FD300044A005F00103009306465346106842466E ++:10FD4000DDF84C9013F0C0DA0746002840F0A1809F ++:10FD5000022D54D0032D1FD0012D02D06FF01607B5 ++:10FD600097E04146042203A8F2F306F1022208F1CB ++:10FD700004010DF11600F2F3FFF056F8100B49469E ++:10FD8000BDF81640039D2FF035DB214600902A4632 ++:10FD9000304608F106032EE00222414605A8F2F3A0 ++:10FDA000EBF0042208F1040103A8F2F3E5F00222CB ++:10FDB0000DF1160008F10801F2F3DEF0BDF8143081 ++:10FDC000012B02D06FF0240763E098F80A70736883 ++:10FDD0009F425CDA49463068BDF81640039D2FF01B ++:10FDE00009DB182307FB03F3103300902146F018BA ++:10FDF0002A4608F10B03FFF73FFF074649E00E9B39 ++:10FE00001A6873689A4242DA002A40DB4FF0010315 ++:10FE1000ADF8143004924FF00B030DF116012A4691 ++:10FE200008F10200ADF81630F2F3A6F005A92A4653 ++:10FE30004046F2F3A1F004991824013101FB04615A ++:10FE40002A4608F10800F2F397F0012204A908F10C ++:10FE50000A00F2F391F00499042201FB046108F115 ++:10FE600004001431F2F388F0049B013303FB04F324 ++:10FE70009A5B991902F10B039A4502D26FF00D07B4 ++:10FE800007E008F10B004968F2F376F001E06FF04B ++:10FE90000107384606B0BDE8F087C046F7B50168EF ++:10FEA00005460E6896F87032002B2CD002894769FF ++:10FEB0003AB9304607F1BC011346009218F0D0D889 ++:10FEC00021E0898970688918F6F35AF72A68044690 ++:10FED00018B993680133936015E09289A38A006989 ++:10FEE0009B1A8018A382E9682A892061F2F344F002 ++:10FEF00004F124025389304643F0400353812146E4 ++:10FF0000BA6818F04FD9FEBD13B54FF0000310F0DA ++:10FF10000104ADF8063006D0002904DD10F8013BDD ++:10FF200001398DF8073010F0030F05D0012903DDEA ++:10FF300030F8022B023913E0002211E00368D218D6 ++:10FF4000436828BF0132D218836828BF0132D21813 ++:10FF5000C36828BF0132D21828BF013210301039CF ++:10FF600031F00F03EAD113041B0C03EB124203E040 ++:10FF700030F8023C0239D218034602300129F7DC7E ++:10FF800004BF1B788DF80630BDF80630D3181A046C ++:10FF9000120C02EB134213041B0C03EB124024B1AE ++:10FFA000030243EA10231804000C1CBD10B5FFF730 ++:10FFB000ABFF02E003041B0C9818020CFAD1C043FB ++:10FFC00080B210BD2DE9F041BDF818500C4629460D ++:10FFD00016469846FFF798FF3204120C02EB1442C3 ++:10FFE0002404240C121905F0FF0302EB16421B0235 ++:10FFF00002EB082243EA1523D218101802E003048A ++:020000021000EC ++:100000001B0C9818020CFAD1C04380B2BDE8F081F5 ++:100010002DE9F0418D8A16460D2D1F460C6952DDE3 ++:10002000A38904F10C0003F0FF021B0A43EA022338 ++:10003000B3F5C06F0BD2152D45DD254804F10E0137 ++:100040000622F1F37DF700283DD104F11400038866 ++:1000500003F0FF021B0A43EA0223B3F5014F0AD162 ++:100060000430821C63199A422DD8038803F0FF02E2 ++:100070001B0A43EA0223B3F5006F24D1811CC4EBB1 ++:100080000103C3EB0504132C1DDD82781309042B37 ++:1000900019D102F00F039A00132A14D9A24212DCDC ++:1000A0008A78CB7843EA0223A34201DA1C4600E0B7 ++:1000B00009DC8A79CB7943EA02239804800C10B9D1 ++:1000C00031603C6001E04FF0FF30BDE8F081C04698 ++:1000D00035FA01002DE9F043436887B013F0020FB1 ++:1000E0000546884600F08F8005AA04ABFFF790FF15 ++:1000F0000028C0F288800598037803F00F039E0063 ++:100100003146FFF753FF48B1B8F8163023F010031B ++:10011000A8F816302B6A01332B6274E0EB69059F57 ++:100120000133EB6197F80990B9F1060F24D107F17B ++:100130000C01042202A8049CF1F31EF70599042285 ++:100140001031A41B03A8F1F317F7A4B2B819029950 ++:10015000039A4B460094FFF735FF48B1B8F81630C4 ++:1001600023F01003A8F81630AB6A0133AB624AE003 ++:100170006B6A01336B623EE0B9F1110F24D107F1D4 ++:100180000C01042203A8049CF1F3F6F6059904225D ++:100190001031A41B02A8F1F3EFF6A4B2B819039929 ++:1001A000029A4B460094FFF70DFF48B1B8F816309D ++:1001B00023F01003A8F816302B6B01332B6322E0D9 ++:1001C000EB6A0133EB6216E0B9F1010F13D1049928 ++:1001D000B819891B89B2FFF7E9FE48B1B8F81630A3 ++:1001E00023F01003A8F81630AB6B0133AB630AE0C1 ++:1001F0006B6B01336B63B8F81630002043F01003CB ++:10020000A8F8163001E04FF0FF3007B0BDE8F083EA ++:100210002DE9F043436887B013F0010F804600F0EA ++:100220008780CB8A13F0080F03D183680133836082 ++:100230007EE005AA04ABFFF7EBFE002878DB059A09 ++:1002400000271378977203F00F039E00D772314690 ++:100250000598FFF7ABFE059B9872C0F30F20D8728C ++:10026000D8F80C3005990133C8F80C3091F8099092 ++:10027000B9F1060F21D18D19049C0C3104222F7481 ++:100280006F7402A8F1F378F6059904221031A41BCB ++:1002900003A8F1F371F6A4B24B4628460299039ADB ++:1002A0000094FFF78FFE2874C0F30F206874D8F80D ++:1002B00010300133C8F810303AE0B9F1110F22D1F3 ++:1002C0008D19049CAF71EF71059904220C3103A8BC ++:1002D000F1F352F6059904221031A41B02A8F1F3A0 ++:1002E0004BF6A4B24B4628460399029A0094FFF7B6 ++:1002F00069FEA871C0F30F20E871D8F814300133FB ++:10030000C8F8143014E0B9F1010F11D18C19049917 ++:100310002046891BA770E77089B2FFF747FEA070DF ++:10032000C0F30F20E070D8F818300133C8F8183047 ++:1003300007B0BDE8F083C0462DE9F34114460A9F9B ++:100340000268DDF82C8004F0010300930546434663 ++:1003500010683A4612F0B8DF064618BB052C04D8E0 ++:10036000DFE804F00A061403030D6FF0160619E027 ++:10037000281D3946042213E06B683B6012E005F14A ++:10038000080000214C22F1F35BF60BE0B8F14B0FB3 ++:1003900002D86FF00D0605E0384605F108014C2241 ++:1003A000F1F3EAF53046BDE8FC81C04610B58C6B30 ++:1003B00000200BE00B1893F83C30064A03F07F0353 ++:1003C000D356002B01DA012003E00130A042F1D125 ++:1003D000002010BD401B86002DE9F84F02298346FE ++:1003E0000E4690469A4614BF4FF0FF37002714BFC1 ++:1003F000002401244FF000092EE0022E14BF4FF01C ++:10040000FF3300239F4211D0022E08D1B8F1040F10 ++:1004100007D0B8F1060F04D0B8F1080F01D00422BC ++:1004200000E00022C7EB0403934214DD0E2CCCBF86 ++:100430004FF480534FF4005344F4306213439DB2A1 ++:10044000DBF85C01294635F0A9DF20B12AF8195004 ++:10045000274609F101090134022E0CBF0E230023A7 ++:100460009C4202DCB9F11F0FC7D90A9BC3F8009068 ++:10047000BDE8F88F2DE9F04F88469BB0402100275A ++:10048000DDF890B09DF894900646C0F82077C0F84B ++:100490001C1740689A46F6F31BF40446C6F8180782 ++:1004A00010B96FF0150473E0D8F800306BB9203341 ++:1004B000C6F82037336B30461A8906F5E46300939B ++:1004C00059462346FFF788FF1FE0202B6CD845468E ++:1004D00017E0AC88D6F85C01214635F05FDF0028D4 ++:1004E00062D01FB12B78E2B29A425DD9D6F820379C ++:1004F000D6F81827013722F813400133C6F8203701 ++:100500000435D8F800309F42E3D3D6F82037002BCB ++:100510004AD070681021F6F3DBF30746002835D087 ++:10052000279B002411AD446083600473214606605C ++:1005300080F80DB080F80E9024222846F1F380F563 ++:10054000A24514BF0023012301934FF0FF33029310 ++:10055000039304930593D6F8183730460693D6F8DC ++:10056000203702210793144B144A0A9303230C9358 ++:100570000123089409940D940E9400950B9716F09E ++:10058000BBDC044698B9269B7B6010E06FF01A0430 ++:10059000D6F8181759B17068D6F81C27F6F3A8F3E7 ++:1005A0000023C6F8183702E06FF00104F0E7204698 ++:1005B0001BB0BDE8F08FC046410B01002C9E8500AA ++:1005C00030B590F8143789B00446002B3ED0D0F8EF ++:1005D00068319D79002D62D1036880F814571B7E25 ++:1005E000002B5CD0B0F81637002B58D0036B18697D ++:1005F00002F09CFAB4F81617884250D0204618F042 ++:10060000CFDB204601F0EEF82046B4F8161718F0BC ++:100610000DDA236893F82F306BB1D4F86C32204692 ++:10062000D3F8D412383113F0B9D80146C4F8AC0667 ++:1006300020460CF051D920461AF068DC20462946A5 ++:100640001AF06EDE204611F0DBDC28E003681B7E2A ++:100650002BB3D0F868319B790BBBD0F8000507A904 ++:1006600044F038DD03E02B7E13F0020F17D107A80A ++:1006700044F038DD05460028F5D1236B05901B6852 ++:1006800005A90093032301930290039001222046C1 ++:100690002B46FFF7EFFE10B9012384F8143709B099 ++:1006A00030BDC0462DE9F74F0192D0F800A090F878 ++:1006B0000D801F460C464FF0000BE5E0072200219D ++:1006C0002046F1F3BDF40C9AB8F1020F12F81B00AA ++:1006D000207001D0022308E0042F05D0062F03D09C ++:1006E000082F01D0434600E00023C3EB0002B8F11D ++:1006F000020F14BF002301239A4210DBB8F1020F4E ++:1007000001D0022108E0042F05D0062F03D0082FC6 ++:1007100001D0414600E00021C1EB00060FE0B8F136 ++:10072000020F14BF0026012606E0DAF85C0131460C ++:1007300035F0F2DD18B9013623789E42F5D9B8F1CB ++:10074000020F207802D0002202230BE0042F07D0F2 ++:10075000062F00F0A680082F00F0A3804346A1E0FA ++:100760000E2200231B1893420FDCB8F1020F01D0B8 ++:10077000022108E0042F05D0062F03D0082F01D056 ++:10078000414600E000210D180FE0B8F1020F0CBF48 ++:100790000E25002506E0DAF85C01294635F0BCDDBF ++:1007A00018B9013D23789D42F5D24FF0000963E06E ++:1007B00002EB89039968CB88B1F832E013F020038B ++:1007C0005FFA8EF00DD00EF44072B2F5807F02D148 ++:1007D000821C023806E0B2F5007F02D1821E023090 ++:1007E00000E00246B04201D3A84203D9B24241D34D ++:1007F000AA423FD8B3B1B04214D3A84212D80EF4E3 ++:100800004073B3F5807F05D12379FF2B0AD00133E4 ++:10081000237107E0B3F5007F04D16379FF2B01D08A ++:1008200001336371CB8813F0200F0BD0B24209D390 ++:10083000AA4207D8824205D0A379FF2B1AD00133F0 ++:10084000A37117E023780E2B0FD85046FFF7AEFDAB ++:1008500028B1E378FF2B0DD00133E3700AE0A378D1 ++:10086000FF2B07D00133A37004E06378FF2B01D086 ++:100870000133637009F10109DAF818251368994505 ++:1008800096D30BF1010B07340D9B9B4504DA019ABB ++:1008900013689B45FFF612AF019BC3F800B0BDE89B ++:1008A000FE8F00230E225DE72DE9F84F5FFA83FCEF ++:1008B0001E4603F44073B3F5007F14BF4FF00009E8 ++:1008C0004FF0010905468A4693460CF10200ACF14F ++:1008D0000203B9F1000F02D08646984601E09E4619 ++:1008E00080460027394629E011F80A40ACF105039B ++:1008F0009C4221DB0CF105039C421DDC0AEB01004C ++:1009000082783AB9C3782BB903791BB943790BB90B ++:1009100083798BB1744506D1837993B9B9F1000F0E ++:1009200008D0037907E044450BD152B9C37843B9E5 ++:10093000037933B9437923B9013707315F45D3DBF5 ++:100940001BE0BEF10E0FD4BF4FF400534FF48053A1 ++:100950004EF4306213439CB2D5F8FC341B7893B14B ++:100960002846002124F048D8284624F03BD80AE045 ++:100970002846012124F040D804E0D5F8FC341B7847 ++:10098000002BF5D134462046BDE8F88F2DE9F04F15 ++:10099000D0F8008090F80DA0D8F83010DDB00989AB ++:1009A000814614464FF0000B5B9300E004210022C7 ++:1009B0005B98964608E01EF804300EF1070E052BF2 ++:1009C00001D9934602E001328242F4DB082900F2A9 ++:1009D000B08001A252F821F0FD090100330B0100A3 ++:1009E000030A0100330B0100AF0A0100330B0100C1 ++:1009F000330B0100330B0100AD0901004FF6FF7608 ++:100A00001AE00025AE464FF6FF7612E00EEB0B0221 ++:100A100092FBF0F300FB1323072203FB02F16218A1 ++:100A2000937823B9D378B3423CBF655C1E460EF180 ++:100A3000010E8645EADB15B90025AC4621E00E2DF6 ++:100A400094BF4FF400524FF4805245F4306343EAB0 ++:100A500002006FE00CEB0B0292FBF0F300FB1323A0 ++:100A6000072203FB02FE04EB0E0359789A78DB7829 ++:100A70005218D218B242BCBF14F80E5096B20CF104 ++:100A8000010C8445E6DB3DB99BFBF0F300FB13B39F ++:100A9000072203FB02F31D5D0E2D94BF4FF400539C ++:100AA0004FF4805345EA030343F4306042E0BAF167 ++:100AB000020F3ED15AAB00930024404651465246A5 ++:100AC0004AAB5A94FFF788FCD8F818771FB3D8F8C8 ++:100AD000206706B35A99254610E000243AAB37F850 ++:100AE0001520E05A904205D15CAA02EB410323F89D ++:100AF000480C01310234402CF0D10135B542ECDB19 ++:100B000020230E485B935A9100F0CEFD4AAB009330 ++:100B10005A9B02AC04E020233AAA5B9302AC0092F9 ++:100B20000193214648465BAA0223FFF7BBFD022141 ++:100B30003DE700205DB0BDE8F08FC046B4FA01008B ++:100B4000F0B50546BDB004680E4609B108292DD19F ++:100B50002023D4F818273B93236B03AF1B89009203 ++:100B6000D4F82027394601923BAAFFF79BFD6B7B07 ++:100B7000022B13D1D4F8FC341B787BB1D4F8343772 ++:100B8000B3F8A4E30EF44063B3F5406F06D12046FA ++:100B900039463B9A7346FFF787FE05E02846002159 ++:100BA00003AA3B9BFFF7F2FEA4F816076B6813B18C ++:100BB000A86831469847D4F81817D4F81C276068FD ++:100BC000F6F396F00023C4F818376068294610221F ++:100BD000F6F38EF03DB0F0BD7047C04610B5C3F8D7 ++:100BE000A010082019461C4631F03ADE84F8A40013 ++:100BF00010BDC0467047C0460020704700207047B7 ++:100C0000002070477047C0467047C0467047C046D6 ++:100C1000002070477047C04603680246D3F86C3224 ++:100C2000D3F8E432987818B1938A181E18BF0120BF ++:100C30007047C0467047C0467047C04670B5037DD8 ++:100C400004469BB1457D8DB9C068A169FEF306F5E8 ++:100C500001236375E36906460BB1A0689847D6F196 ++:100C6000010038BF00206575257500E0002070BDCB ++:100C70000846002110B5016141810172017306220D ++:100C8000F1F3DEF110BDC04610B50068F4F7B0F81E ++:100C900010BDC04690F832007047C0460246086852 ++:100CA000430D5B056BB922F07F4323F46003520DC3 ++:100CB00083422CBF4FF40013002352059B180343BB ++:100CC0000B60704770B510600D461C46084619460B ++:100CD0001646FFF7E3FF2368AB4202D233680133C5 ++:100CE000336070BD002070477047C04600207047D9 ++:100CF000002070477047C0467047C0467047C046E6 ++:100D000030B50568B5B061B10DF107040171C922B4 ++:100D100000212046F1F394F12B6B2146186902F073 ++:100D20001BFF35B030BDC046406B70477047C046B2 ++:100D3000002070477047C046002070477047C0468B ++:100D4000002070477047C046002070477047C0467B ++:100D50007047C0467047C0467047C0460020704785 ++:100D60007047C0467047C046002070477047C04675 ++:100D70007047C0467047C0467047C0464FF0FF30CE ++:100D80007047C0467047C04600207047002070473B ++:100D90007047C0467047C0467047C0460020704745 ++:100DA0007047C04603490A6812B100230B60104621 ++:100DB0007047C046E82B020070B515460C464E6CD5 ++:100DC00018F00CD9024628B915F4001F02D0636C44 ++:100DD0006664A364104670BD73B500EB420440F630 ++:100DE0002A15B4F82C66A4F82C56069D009503F03D ++:100DF0008FDCA4F82C667CBD10B511F0F7DC024640 ++:100E000040B1416A11F4002F04D1036813B141F4D9 ++:100E100000234362104610BD2DE9F3411E460368CE ++:100E200004461B7E0F469046002B4BD090F875323F ++:100E3000002B47D10D682846FFF776FF016902466F ++:100E40008B79B3B1837E13F0010F12D0D1F8CC307F ++:100E500013F4806F0DD1B4F8263603F47043B3F564 ++:100E6000805F14BF40234423CB5813B193F8DF3085 ++:100E700043BB5168002925DB164B01EA03030BB97C ++:100E8000184602E0EB8A03F0070011F0400F19D07A ++:100E9000114B02A91B5C204641F8043D336009F068 ++:100EA000EFDDB0F1FF3F0DD0019A3368934209D0D6 ++:100EB0000A4B32609A5CEB8A02F0070223F00703C8 ++:100EC0001A43EA82204639464246334614F06CD82B ++:100ED000BDE8FC8140000180C4D28500301E0200C4 ++:100EE000F0B585B00A9C0D4600940B9C1F460194FA ++:100EF0000C9C064602940D9C039428F02FDBAB79E2 ++:100F000043B13946304644F063DD014610B1304606 ++:100F100044F056DC05B0F0BD10B520F00BDE10BD7E ++:100F20002DE9FF4107461D469E6B146945F0C8DB5D ++:100F30008046002834D1337A022B31D1A3797BB398 ++:100F4000B5F8683063B3A26D40F2371302EA0303C9 ++:100F500033B394F884301BBBD4F888303A6853B963 ++:100F6000D2F88C30D3F8E4210132C3F8E4213C23D9 ++:100F7000C4F8883009E0D2F88C30D3F8E42101328B ++:100F8000C3F8E421012384F89430002394F9482025 ++:100F9000384600930293296F1133019644F068DFBD ++:100FA000404604B0BDE8F0812DE9F74F80460E467B ++:100FB00093461F46002B5FD001295DD14FF4C073CB ++:100FC0000193FAF397F04FF440718246F5F380F6FF ++:100FD000044610B94FF0FF3555E000214FF4407240 ++:100FE000F1F32EF040463146224601ABF0F3BEF657 ++:100FF00010F11E0F3AD1019B4FF0FF325D004A23E2 ++:1010000023700B23637015332371042363716FF016 ++:101010002F03A371923323726FF0560363724FF064 ++:1010200002096319A270E27084F8079003F8022C99 ++:1010300003F8012C07F10C039D4202DC6FF00E0552 ++:101040000DE059463A4604F10A00F0F395F795FB96 ++:10105000F9F340463146224611F074FE05465046EB ++:1010600021464FF44072F5F343F60CE0504621461A ++:101070004FF44072F5F33CF6404631465A463B4643 ++:10108000EFF3A0F705462846BDE8FE8F70B504468D ++:101090001E46FEF39FF3054640B1636893F8AB30FC ++:1010A00023B1E06F3146F1F76DFDA860284670BDB1 ++:1010B0002DE9F0411F4603680C461B68164693F85D ++:1010C000953005460969A28A1BB1E38A13F0800FA7 ++:1010D00009D0152A07DD08480E310622F0F330F753 ++:1010E00008B9013805E02846214632463B46FCF364 ++:1010F000A5F4BDE8F081C046BAD4010010B59E4603 ++:10110000D0F8683103B19B68054C23607346FCF34B ++:10111000F3F1B0F1FF3F01D10023236010BDC046C1 ++:10112000E82B02002DE9F04F87B0DDF854808946A6 ++:1011300015469A46129FDDF84CB00446B8F1000FF0 ++:1011400006D0D8F8081019B10120F1F7A5FE044621 ++:1011500014B96FF0160632E0226805F0010300931F ++:10116000106849463A465B4612F0AED8064630BB98 ++:10117000112D02D0132D09D00FE03846F1F3ECF316 ++:10118000E8B904F5B8703946062203E004F5B670F4 ++:1011900039460422F0F3F0F611E0109B204600934C ++:1011A000119B49460193149B2A4604935346029788 ++:1011B000CDF80CB0CDF81480FCF3C2F006463046F2 ++:1011C00007B0BDE8F08FC04670B50546D0F8B40052 ++:1011D00058B103784BB1F1F767FB044630B9D5F845 ++:1011E000B4000121F1F31AF500E001242846F3F3DD ++:1011F000DBF724B9D5F8B4002146F1F30FF570BD43 ++:1012000010B5FFF735FD10BD10B5FAF7B1F810BDF8 ++:10121000B0F8543810B50BB119F03ED910BDC04626 ++:1012200010B5044638B102682AB121B992F80B37DB ++:101230000BB182F80B17204617F090DF10BDC046A7 ++:1012400010B521B11AB1536E0BB13DF037DE10BDB0 ++:1012500010B50C4651B1002381F8653581F866352B ++:1012600081F86735C1F868353DF0A2DE10BDC04693 ++:10127000036A10B50C46002B2CD0036809691B6863 ++:10128000B4F814E093F895302BB1E38A13F0800F93 ++:1012900001D11E2200E00C2202F10B039E4519D35E ++:1012A0008B188A5C591C5B7803EB02239BB2B3F565 ++:1012B000006F0FD14B784A1C1B09042B0AD1537ABB ++:1012C000012B07D1436A01334362C3680133C36012 ++:1012D000002002E021463FF03BDD10BD036810B561 ++:1012E0001A68536B2BB192F8443013B130F0AEDF73 ++:1012F00000E0002010BDC04610B50C462DF0C0D94E ++:1013000018B994F8F53284F8F43210BD70B50122A2 ++:1013100005460C46D1F84C152EF01ADD284621461C ++:101320002DF0EAD870BDC0460C2A2DE9F0410446E4 ++:101330000F46154651D80122AA4041F2485302EA0D ++:101340000303002B49D0D0F8B4364BB1D3F8D832D0 ++:1013500033B15B68012B40D0032B3ED0022B3CD035 ++:10136000204615F043DD002837D1D4F868315B6999 ++:10137000012B32D0D4F81808FEF3F6F0064628B157 ++:10138000D4F86801092143F013D91AE0082D01D0DF ++:101390000C2D04D1D4F868319B7923BB11E0D4F82B ++:1013A0006801837913B3D4F82835022B04D094F85C ++:1013B000F43713F0010F16D0092143F0F9D8304665 ++:1013C00015E0082D12D1204639460222002325F0CF ++:1013D0003BD958B14FF0FF3009E0204639462A4644 ++:1013E00029F0E6DC03E06FF0180000E00020BDE823 ++:1013F000F081C0462DE9F04F85B005469B468846F2 ++:1014000091460F9F9DF840A0F8F7B2FFD5F8B06362 ++:1014100004460AF087DDD5F8C03398420CD3032385 ++:10142000009300230193029303932046172109F1AF ++:101430000A02013312F03CDB96F8463013F0030F3A ++:1014400019D0D8F8582040F2371302EA030393B1B9 ++:1014500094F8693713F0010F0DD07B6813F4803FC7 ++:1014600009D03B6C012B06D1002220463946134699 ++:10147000009211F0BBDB094C7F2323600E9B2846B2 ++:10148000009341465B464A460197CDF808A0F8F71D ++:1014900085FF0023236005B0BDE8F08F0C2C02000F ++:1014A00010B50446F5F346F0B0F5C05F05DD204603 ++:1014B00043F006DE204643F003DE10BD2DE9F04187 ++:1014C000074619F0DFDF0026BB19D3F84C42B4B150 ++:1014D000D4F88C509DB9A3798BB1A36D13F0020F92 ++:1014E0000DD094F8843053B1F5F38CF0D4F890100B ++:1014F00027F042DF18B1C4F8885084F884500436CD ++:10150000202EE1D1BDE8F08170B590F8A1310546FB ++:1015100063B903681B6F4BB1D0F81C48F5F372F048 ++:10152000D5F82038E41A2418C5F81C48284614F0C9 ++:10153000BBDB70BD10B588B00A9C00940B9C019475 ++:101540000C9C02940D9C03940E9C04940F9C059497 ++:10155000109C0694119C0794F3F3C2F1044B0421F0 ++:10156000D3F88C300A4604469847204608B010BD90 ++:10157000E0A6850070B504460D461EF04BD92946FD ++:1015800006462046F8F708FE304670BD2DE9F041CA ++:101590000546D5F8D8320E465B681746012B006821 ++:1015A000D5F8DC4202D14FF0000805E0042914BF51 ++:1015B0004FF000084FF001080368DB691A6D636A99 ++:1015C000934238BF62624EB9D4F8901031B140688E ++:1015D00094F89420F5F38CF3C4F8906028463146D3 ++:1015E0003A4625F0F5D8B8F1000F01D00023636228 ++:1015F000BDE8F0812DE9F04385B00C9F0546984683 ++:10160000D7F80090D2F8D462144600970AF0F0DCC4 ++:10161000296891F8463013F0030F3FD0D4F8CC205E ++:1016200012F4805F3AD196F93430002B36D14B6BEF ++:10163000002B33D012F0020F30D13B680DF10900BE ++:101640001849032208EB0304F0F396F495F8FA31F5 ++:1016500033B196F96A30002B02DA95F80A0700E0F8 ++:10166000002008EB0901A14201D2002100E0091B82 ++:1016700002238DF80C3000238DF80D3001338DF8E6 ++:101680000E300DF109038DF80F000093204607235B ++:10169000DD221AF07BDD3B6809333B6005B0BDE815 ++:1016A000F083C046C1D401000FB430B5104BADF586 ++:1016B000037D9E4501D1002513E002A887AB0538C4 ++:1016C00040F20121869A8193F0F3F0F5002405465B ++:1016D00005E002AB053BE05CF5F332F20134AC42CD ++:1016E000F7DB28460DF5037DBDE8304004B07047B8 ++:1016F000DB62820010B502490248FFF7D5FF10BD3A ++:10170000CCFB0100E3FB0100C36970B513F4006F6B ++:101710000E460546016915D00368D3F88C20936BFB ++:101720005C1C4FF47A739463B4FBF3F202FB134333 ++:1017300023B90748C96B2246FFF7B6FFEB6923F4CC ++:101740000063EB61284631462CF03CDB70BDC0469F ++:101750007CDB010010B590F81632044663B1084BEB ++:101760001B684BB1D0F88011D0F884210223C068E7 ++:1017700081EA0202F9F332F42046F7F36FF610BD66 ++:10178000AC27020010B50446F7F3B8F7002384F83D ++:10179000173284F8183210BD10B5074C2378012B8E ++:1017A00009D0064B1B78012B05D001232370F8F3D9 ++:1017B00073F70023237010BD002C0200EC2B0200F5 ++:1017C00070B50546F1F7EEF80128014607DD044C37 ++:1017D000012328462370F8F3EDF50023237070BD34 ++:1017E000EC2B020010B5064902690B782BB1D2F838 ++:1017F000D03013B100230B7001E018F051DD10BDA3 ++:10180000F42B020010B58B7913B1044B01221A702E ++:101810002DF0B6DB014B00221A7010BDF42B020034 ++:1018200070B5044C8568A54201D1002001E0F0F3B9 ++:1018300009F770BD0800002070B505460E461AF085 ++:101840002BDD0446C0B13146284640F26C521AF0F6 ++:1018500035DE064620B9284621461AF091DD0AE019 ++:10186000214640F26552F0F387F32846214640F2C4 ++:101870006552F5F33DF23446204670BD2DE9F04146 ++:101880008AB088460023159917460546129C09938D ++:101890002DF0B0DD07F001030093414606462246D5 ++:1018A0002868139B11F010DD8046002840F0AA80C4 ++:1018B000119B032B04D909A810990422F0F35CF3BF ++:1018C0000D2F08D8DFE807F00A0F07071722363C6C ++:1018D0004B07074E93976FF0160892E0284608F0E2 ++:1018E0002DDA40B22AE02846099908F051DA00289A ++:1018F00000F0858085E0B6F95E300BB102201DE076 ++:10190000B6F95C30181E18BF012017E0099B022BA6 ++:1019100006D14FF00003A6F85C304FF0010306E05B ++:10192000003B18BF0123A6F85C304FF00003A6F877 ++:101930005E3066E0D5F83407F8F71EFD206060E001 ++:10194000099BD5F834070393F8F71EFD039B8342E8 ++:1019500055DCD5F834070999F8F712FD51E0B5F8D0 ++:10196000BE3846E02B6893F8A030002B3FD00DF135 ++:101970001608264906224046F0F3FEF221460422CC ++:1019800008A8F0F3F9F2211D042207A8F0F3F4F2FD ++:10199000404604F108010622F0F3EEF2079F57B922 ++:1019A000D5F86821937993B95369012B0FD02B682F ++:1019B00093F83F305BB904F1100301932846314698 ++:1019C000089A3B46CDF8008015F084DC0DE02B68CA ++:1019D0001B7E13B96FF0030813E0284631460DF162 ++:1019E000160204F1100315F061DC804609E095F859 ++:1019F000C334236005E0099B85F8C33401E06FF030 ++:101A00001C0840460AB0BDE8F081C0462C9E850007 ++:101A10002DE9F04790B0DDF860A00C461E46514617 ++:101A20000023054617460F932DF0E4DC8046D0F8DE ++:101A3000DC9277B1032E04D90FA839460422F0F3C3 ++:101A40009BF237B1032E04D90FA839460422F0F3D4 ++:101A500093F2352C6BD010DC162C00F07C8105DC69 ++:101A60000B2C21D0152C00F065811AE01C2C00F005 ++:101A700086812F2C00F0288113E0382C00F0E580BF ++:101A800006DC362C00F09880372C00F0B58008E09A ++:101A90009F2C00F07A81A52C00F03F81392C00F0BA ++:101AA000F5806FF01604A1E12B6893F8A030002BAD ++:101AB0003DD00DF12606A24906223046F0F35CF235 ++:101AC000394604220DA8F0F357F2391D04220CA860 ++:101AD000F0F352F2304607F108010622F0F34CF21F ++:101AE0000C9C54B9D5F8682193798BB95369012BB3 ++:101AF0000ED02B6893F83F3053B907F110030193D0 ++:101B0000284641460D9A2346009615F0E3DB0CE08B ++:101B10002B681B7E002B00F05D81284641460DF1AD ++:101B2000260207F1100315F0C1DB04465EE12B68C5 ++:101B30001B7E002B00F04E81052E40F24E810D2EB3 ++:101B40000BD9284607F10801A6F1080201F062DA74 ++:101B50000446002840F04A8109E005AC3946204699 ++:101B60000622F0F309F2002307930E26274698F881 ++:101B70000640B4B9D9F8901031B1686899F894204A ++:101B8000F5F3B6F0C9F8904089F89460686831467A ++:101B9000F5F39EF0C9F8900018B139463246F0F3DB ++:101BA000EBF14046394629F091DAD9F890300446F5 ++:101BB000002B40F01A8119E1002300932846394692 ++:101BC00032460EABF1F760FB0446002840F00E8170 ++:101BD0000E99032900F004812A6B1368994202D1FF ++:101BE000D2F8F03050E05368002B14BF38233C2368 ++:101BF000EB58D3F8F03047E00023009328463946ED ++:101C000032460EABF1F740FB0446002840F0EE8070 ++:101C10000F9A02F16403672B02D96FF01C04E5E010 ++:101C20000E99032904D02B6B1B68994240F0DE808B ++:101C3000002A04DB2846296B29F08CDB02462B6B3B ++:101C4000C3F8FC20C3F8F020D0E00023009328461E ++:101C5000394632460EABF1F717FB0446002840F038 ++:101C6000C5800E99032900F0BB802A6B1368994246 ++:101C700002D1D2F8F43007E05368002B14BF3823A8 ++:101C80003C23EB58D3F8F4303B60AFE000230093E3 ++:101C90002846394632460EABF1F7F6FA04460028DC ++:101CA00040F0A4800F9A642A00F29A800E990329CA ++:101CB00004D02B6B1B68994240F098802B6BC3F8C3 ++:101CC0000021C3F8F42091E02B680F9C93F83F307B ++:101CD00013B16FF01B0489E0D5F86801837913B163 ++:101CE000042142F065DC95F87232221E18BF0122F1 ++:101CF00085F8502785F85925002B76D12AB105F5AE ++:101D0000AA61D5F85C010E3104E005F5AA61D5F8A9 ++:101D10005C010A3134F026DA07E70123002202933E ++:101D200028460849134600970196CDF80CA011F0FB ++:101D300037DBFAE6B8F95E3033B1022009E0C0467D ++:101D40002C9E85001C738600B8F95C30181E18BFE5 ++:101D50000120386049E00F9B022B06D14FF00003B1 ++:101D6000A8F85C304FF0010306E0003B18BF0123E8 ++:101D7000A8F85C304FF00003A8F85E3035E02B681F ++:101D800001211869F9F392F22FE0331F0622B3FB09 ++:101D9000F2F33B60D5F8000500230BA90F9343F045 ++:101DA00099D910E00B7E13F0020F0CD00F9B5C1C36 ++:101DB0000F943B68A34210D3B81E062204FB020016 ++:101DC0001A31F0F3D9F00BA843F08CD90146002862 ++:101DD000E8D108E06FF0030408E06FF00D0405E0BF ++:101DE0006FF0020402E00F9B3B600024204610B01D ++:101DF000BDE8F0872DE9F04F056889B082460C46B2 ++:101E00001E4628460023179907939346DDF848801D ++:101E10002DF0F0DA139B032B04D907A841460422C6 ++:101E2000F0F3AAF0BBF10D0F56D12846414698F8C1 ++:101E3000066098F8087098F809402DF06FDA10B134 ++:101E40006FF00107F1E098F80630003E18BF012658 ++:101E5000022B14BF4FF400594FF4811947EA0427AD ++:101E60006EB13846F1F3F8F1002840F0E080D5F883 ++:101E70005C01394634F092DA002800F0D880284618 ++:101E80002DF070DBB0F1FF3F014600F0D280284614 ++:101E90004A46434600962CF08BDE0446002800F0AC ++:101EA000C88028462146FBF789FA20B128462146FA ++:101EB0002DF0C2DABDE0002E00F0B9803946284688 ++:101EC000A2683BF0CDD90746002800F0AE80284636 ++:101ED00021462DF0B1DA12E0139B50460193149B7A ++:101EE00021460293159B5A460393169BCDF800801A ++:101EF0000493179B059333463AF03ADF074617F1F0 ++:101F0000170F40F09280DAF80060002330461799EE ++:101F100006932DF06FDA139B0446032B04D906A811 ++:101F200041460422F0F328F0BBF11B0F7DD130466F ++:101F3000414698F8065098F8089098F809702DF0E6 ++:101F4000EDD9034620B1A04202D06FF0010373E047 ++:101F5000B5F1000A18BF4FF0010ABAF1000F0BD01B ++:101F6000032D0BD09A68304649EA07213BF078D917 ++:101F70000346002860D111E0032D0FD130462146E1 ++:101F80002CF070DF012394F94810304600934FF491 ++:101F90008802013BFBF7E6F903464DE0D4F8CC306C ++:101FA000304643F40003C4F8CC3021462CF05ADF0D ++:101FB000A37913B1322384F8F43294F8F41231295E ++:101FC0000FD833681B7E1BB130461D4A17F02EDA3E ++:101FD000D6F84C0194F8F4123DF074D9322384F809 ++:101FE000F4324146062204F1C200EFF3C5F784F84B ++:101FF00006A030462146FBF7E1F9054640B1D4F88A ++:10200000CC3023F40003C4F8CC304FF0FF3313E09E ++:1020100030460321A26811F087D8D4F8CC3023F4DD ++:102020000003C4F8CC302B4606E03B4604E0002712 ++:10203000FBE74FF0FF37F8E7184609B0BDE8F08F2F ++:10204000329E85002DE9F04704468946FCF3F4F7FB ++:10205000F4F3D8F294F854318046012B1ED825466B ++:10206000002717E06E69B379022B11D1B4F86C30F8 ++:1020700013F4807F0CD0204649464246F0F74CFED0 ++:1020800030B90423B37194F8CD30013B84F8CD30DE ++:1020900001370435B4F910309F42E3DBBDE8F08727 ++:1020A00030B54FF0000E044691B08C461546704690 ++:1020B00009E023185A690EF1010ED1794DF800108C ++:1020C000536B0430D371B4F910309E45F1DB2046D8 ++:1020D00061462A46FCF3A4F10020014606E063189D ++:1020E0005A695DF801300130D3710431B4F9103010 ++:1020F0009842F4DB11B030BD2DE9F0410C290446C3 ++:102100000D46164690F853710DD100210122FCF3C3 ++:1021100087F1204600210122FCF33EF1002384F8E0 ++:10212000CE3084F8CD30A36E2046B3F1FF3F08BF18 ++:1021300084F8563129463246FCF392F2B4F86C30FA ++:1021400003F0C003C02B16D1D4F85C319BB194F8D6 ++:102150005331BB420FD9E368A1689868FDF37EF262 ++:10216000E368A1689868D4F85C210123FDF32EF29E ++:102170004FF0FF33A366BDE8F081C046836E10B513 ++:10218000B3F1FF3F01D0FBF39FF510BD2DE9F04106 ++:1021900004460D46866EFCF3C5F6074690B9042248 ++:1021A00004F5AE7005F11401EFF3E6F6D4F85C31F6 ++:1021B0004FF47A7203FB02F3B6F1FF3FC4F85C31CF ++:1021C00008BFA6663846BDE8F081C0460E2937B57F ++:1021D00005468E4614460BD00F2910D1114601A892 ++:1021E0000422EFF3C9F628460199F0F731FE08E022 ++:1021F000B0F85831002003F00103136001E0FCF354 ++:10220000E9F13EBD70B514460546FCF39FF1236825 ++:102210000BB10223AB6570BD70B50D460446FBF3F0 ++:10222000FDF7014610BBA36DEDB1FBB9D4F8542105 ++:102230000F4B02EA03037BB194F85431022B04D113 ++:1022400094F8573113F0010F05E0012B07D194F8F2 ++:10225000573113F0020F02D16FF0010300E00023A9 ++:1022600084F8563102E00BB184F85601084670BD7F ++:10227000FF0000FF10B50446FBF362F7002384F86B ++:102280005731A4F85831C4F85C3184F8563110BD88 ++:102290002DE9F041A2B0882205460C4690F8558100 ++:1022A00090F8567190F854616846EFF365F6284649 ++:1022B0002146FBF3AFF60246002836D1009B85F895 ++:1022C00056719E4285F854612CD01BB995F8573150 ++:1022D00073B112E0022B04D195F8573113F0010FBE ++:1022E00005E0012B07D195F8573113F0020F02D109 ++:1022F0006FF0010314E096B90DE0012E02D113F046 ++:10230000010F05E0022E05D195F8573113F0020FA9 ++:1023100005D107E036B995F85531434502D200237F ++:1023200085F85631009B85F85431104622B0BDE83F ++:10233000F081C0462DE9F04104460E46154690F85E ++:102340005671FBF363F48646A0B92A4601460DE0B8 ++:102350007318DB88083113F0100F06D194F8573149 ++:1023600043F0010384F8573102E0083A072AEFD816 ++:1023700084F856717046BDE8F081C0462DE9F04101 ++:1023800004460D46164690F85671FBF3DBF386467D ++:1023900098B9294632460CE04B6A13F0100F06D16B ++:1023A00094F8573143F0020384F8573103E0383A88 ++:1023B0003831372AF0D884F856717046BDE8F0817C ++:1023C000002070472DE9F0410B4C07460E460025D2 ++:1023D0000BE038462146EFF3A1F620B923799E425F ++:1023E00001D1A06806E001350C34044B1B689D4206 ++:1023F000EFD30020BDE8F08120FC0100F02B0200AB ++:1024000070B50D4600240AE00849284601EBC401D6 ++:102410000422EFF395F508B9013005E00134044BCF ++:102420001B689C42F0D3002070BDC04620FC010018 ++:10243000F82B020010B5034C216033F0F9DA0023C9 ++:10244000236010BD082C02002DE9F0412A4B0646FE ++:10245000D3F800800F4600250BE0284B304603EBF5 ++:10246000C5042146EFF35AF610B9E3789F4241D0F4 ++:1024700001354545F1D1224B0025D3F800800FE00E ++:10248000204B304603EBC5042146EFF347F630B945 ++:10249000E3789F4203D11C4B01221A7010E00135F2 ++:1024A0004545EDD117BB194B3D46D3F800800AE0F6 ++:1024B000174B304603EBC5042146EFF32FF608B95E ++:1024C000201D17E001354545F2D1124B124DD3F8CE ++:1024D0000080002408E029463046EFF31FF604355B ++:1024E00008B90E4806E001344445F4D13046394677 ++:1024F00032F074DEBDE8F081042C0200E3FB010041 ++:102500009421020018FC010098210200F82B02001F ++:1025100020FC0100FC2B020018FC0100CA0286000E ++:1025200010B5084B02461B783BB1074B1B6898421D ++:1025300003D2064B53F8200010B9104632F026DFC4 ++:1025400010BDC046982102007C200200781F0200C6 ++:1025500010B5084B02461B783BB1074B1B689842ED ++:1025600003D2064B53F8200010B9104633F006DBB7 ++:1025700010BDC04698210200802002008420020085 ++:102580002DE9F04F234B8FB01C68234B82468946C0 ++:10259000D3F800B00CB9204638E0036BA168186985 ++:1025A00007AA00F0FFFD00261C4DB0462BE0A368F3 ++:1025B0006F1F012B03D12878FFF702FF03E015F806 ++:1025C000010CFFF7C5FF694633F00EDC002107ABB5 ++:1025D0001DF80120CB5C1A420FD05046394632F02C ++:1025E000E5DD40B1B9F1000F05D009EB86003946B1 ++:1025F0000422EFF3DDF5013602E001311C29E6D1BA ++:1026000008F101080835D845D1D130460FB0BDE8F2 ++:10261000F08FC046082C0200F82B020025FC0100B8 ++:10262000012902D14FF6FF7010E0D0F8BC304FF016 ++:102630000002082BD0F8B03008BF41F40071A3F8B5 ++:10264000D813B3F8DA33A0F8202698B27047C04602 ++:10265000D0F8B030A3F8D813A3F8DA237047C046F7 ++:10266000D0F8B0300021A3F8D8134FF0010230B5F4 ++:10267000B3F8DA434FF00205A3F8D823B3F8DA230E ++:10268000A3F8D853B3F8DA3392B29BB2A0F820166D ++:10269000C4F3031040EA047042EA032240EA023025 ++:1026A00030BDC04670B505460E461446FFF7B8FF6C ++:1026B000314600EA04022846FFF7CAFF70BDC04653 ++:1026C00070B505460E461446FFF7AAFF40EA04021D ++:1026D0003146284692B2FFF7BBFF70BD2DE9F041AD ++:1026E0001546064688461C46FFF79AFF2C4020EA0E ++:1026F000050222433046414692B2FFF7A9FFBDE8EA ++:10270000F081C0462DE9F0411C46069B9046198099 ++:10271000079D0E46FFF784FF089B28801E802B88AC ++:1027200004EA080423EA0803099A23431380BDE856 ++:10273000F081C046D0F8B0304FF00002A3F8FC138F ++:10274000A0F82026B3F8FE0380B27047D0F8B0306E ++:1027500041EA0242C3F8FC237047C046D0F8B030CB ++:10276000A3F8FC13B3F8FE130A40A3F8FE234FF0BE ++:102770000003A0F82036704710B5D0F8B040A4F898 ++:10278000FC13B4F8FE339BB21A434FF00003A4F8D5 ++:10279000FE23A0F8203610BD10B5D0F8B04013408D ++:1027A000A4F8FC13B4F8FE1389B221EA02010B432A ++:1027B000A4F8FE334FF00003A0F8203610BDC04649 ++:1027C0002DE9F04106460C462CE0254635F8023B43 ++:1027D000571E990403F44043890CB3F5804F11D080 ++:1027E00001DC3BB11CE0B3F5004F10D0B3F5404F16 ++:1027F00012D015E03046628835F8023FFFF7CCFF73 ++:10280000013F0DE030466288FFF7A0FF08E0304648 ++:102810006288FFF7A3FF03E030466288FFF7ACFF52 ++:10282000AC1C7A1E002AD0DCBDE8F0812DE9F04115 ++:102830001C46069B90461980079D0E46FFF77AFFBF ++:10284000089B28801E802B8804EA080423EA0803DA ++:10285000099A23431380BDE8F081C04600234FF05E ++:10286000FF3280F8E33041F21A03C25403F59B7340 ++:10287000C254704710B531B140F23B414FF6F87287 ++:10288000FFF76CFF03E002490422FFF799FF10BD38 ++:102890002E03020060B1B0F8DE00B0F5006F05D085 ++:1028A000B0F5406F04D1A0F5386002E0402000E0B0 ++:1028B00000207047012380F8E130704780F824162B ++:1028C0007047C04690F924067047C0467047C0461E ++:1028D00010B1C06900B141777047C04610B1C069FE ++:1028E00000B101777047C04610B590F8E330044658 ++:1028F000002B49D14FF064014FF44872A0F88428AE ++:10290000A0F87C18A0F87E18C0F880381A46A318E2 ++:1029100002324FF06401102AA3F88618F7D14FF065 ++:102920000003A4F82E38A4F8AC37A4F8AE374FF063 ++:102930000A034FF00A02A4F83E38A4F83C38A4F881 ++:102940004038636A4FF01401A4F83228A4F84428F0 ++:10295000A4F83428A4F84628A4F82A28A4F828289B ++:10296000A4F82C28A4F89027A4F892274FF050023E ++:10297000A4F83018A4F89427A4F842180BB1204604 ++:102980009847012384F8E33010BDC04610B5FFF727 ++:1029900067FE10BD2DE9F84F0C46D1F810A00D6868 ++:1029A0009B468968E368064643EA812311469AB24A ++:1029B000BDF82880FFF7CAFE0027B9461EE0BAF12D ++:1029C000200F0BD159F8052030465946120CFFF75D ++:1029D000BDFE39F80520304641460AE0BAF1100F35 ++:1029E00004D135F817203046414602E07A5D304682 ++:1029F0004146FFF7ABFE013709F1040963689F42C6 ++:102A0000DDD3BDE8F88FC0462DE9F74F0D460193A1 ++:102A1000D1F810B00E68EB688968074643EA812355 ++:102A200011469AB2BDF83090FFF790FE4FF00008C3 ++:102A3000C24626E0BBF1200F0FD149463846FFF7CA ++:102A400079FE019904464AF806003846FFF772FEFF ++:102A500044EA00444AF806400FE0BBF1100F06D1EB ++:102A600038464946FFF766FE26F8180005E0384666 ++:102A70004946FFF75FFE08F8060008F101080AF171 ++:102A8000040A6B689845D5D3BDE8FE8F7FB50293E5 ++:102A9000089B03910593099B0192049301A90A9B4A ++:102AA000984707B000BDC0467FB50293089B0391CD ++:102AB0000593099B0192049301A90A9B984707B0CB ++:102AC00000BDC0460B46D0F8F81012B141EA03032E ++:102AD00001E021EA0303C0F8F830704700B5D0F8F0 ++:102AE000F8308E4621B143F01003C0F8F83012E000 ++:102AF00023F0100312F0010FC0F8F8300BD041F2B0 ++:102B0000D413C258C369196A986E814294BF714642 ++:102B1000091AC2F8901000BD00207047A0F8DE101E ++:102B20007047C046A0F8DA107047C046B0F8DA0027 ++:102B30007047C04640F6C313984201D800200BE00E ++:102B400041F2C843984201D8012005E041F24463B4 ++:102B500098428CBF032002207047C0467047C04691 ++:102B600000B5002286460748910030F822307345B0 ++:102B700002D10B18588803E001320E2AF3D100204D ++:102B800000BDC046A8FC010010B5C8B2FFF7E8FFC1 ++:102B9000FFF7D0FF10BDC04610B541F22823C45C3A ++:102BA0004FF0000C134B3CF803E0BEF10E0F8CBF4E ++:102BB0004FF480524FF400524EF4306342EA030067 ++:102BC0002CB1BEF1940F02D9BEF1A50F0AD902298A ++:102BD00003D1BEF10E0F0BD904E0012902D1BEF1E1 ++:102BE0000E0F05D80CF1040CBCF1380FDAD1FF2020 ++:102BF00010BDC046A8FC010010B590F8B2321446D2 ++:102C00000B6090F82B3653B190F8F83690F92A26DD ++:102C100023B1534243F080430B6000E00A6014B1DB ++:102C200090F8F7362370002010BDC04610B58646D8 ++:102C30001C4641F21B031EF8033002989B000E292C ++:102C4000137008D80028ACBF0EEB00030EF1000390 ++:102C500093F81E3127E07F23237030EA200028BF3D ++:102C600004200022114BD35A994202D00432382A50 ++:102C7000F8D1A1F122031E2B04D80EEB000393F828 ++:102C800083312370A1F16403282B04D80EEB0003D9 ++:102C900093F8E8312370A1F19503102B04D80EEBC3 ++:102CA000000393F84D32237010BDC046A8FC01000C ++:102CB0002DE9FF4700250746884691469A46FF269C ++:102CC0002C461EE0009341460DF10E020DF10F035C ++:102CD0003846FFF7ABFF41F2E623FA5C9DF80F1090 ++:102CE00053B2994201DC002302E0C2EB0103DBB2E4 ++:102CF0008DF80F30AB4228BF1D46B34238BF1E4689 ++:102D00000134142CE3B2DDD189F800508AF8006058 ++:102D1000BDE8FF877047C04690F829067047C04657 ++:102D2000B0F8DA3003F47043B3F5805F09D1032AB9 ++:102D300018DDA2F16503032B14D9A2F1C9030F2BEF ++:102D400010D9132A0EDCA2F13403642B0AD9A2F1A4 ++:102D5000A9031F2B06D9A2F1D103072B94BF002092 ++:102D6000012000E00020704770B590F8DA5004466A ++:102D70002846FFF7F5FEB4F8DA3003F47043B3F5F4 ++:102D8000005F01D0002004E02B1903F59A530F33A4 ++:102D9000187940B270BDC04600B54FF0000E00EB90 ++:102DA0000E021EF801300EF1010EBEF1040F82F882 ++:102DB0002C36F4D14FF0000E01EB0E0200EB0E03A7 ++:102DC00012790EF1010EBEF1080F83F83026F3D10F ++:102DD00000BDC04680F8E0107047C046C3699961E5 ++:102DE0007047C04680F8D5104176704780F8D910FA ++:102DF0007047C0467047C04690F81A067047C046F4 ++:102E000041F22403C35C33B141F21C2380F81A164B ++:102E100080F81B16C154704790F8D83013B10023C6 ++:102E200080F8D83000207047C369012093F88130C2 ++:102E30000B70704722B10023C0F8E83FA0F8EC3FC8 ++:102E400000F58153012019607047C0460022C16916 ++:102E500010460B1893F982300130D2180828F8D1A7 ++:102E600092FBF0F040B270477047C0466FF016001A ++:102E70007047C04670B541F21E23C35C04468B42C6 ++:102E80000D46164603D0D0F8883003B1984704F5B4 ++:102E900091531E8041F21E23E55470BD0021C36989 ++:102EA000CB180131082983F88220F8D10021C369A9 ++:102EB0006FF05B02CB180131082983F88220F6D12C ++:102EC000C2690023C2F88C30D36E032B08D1D0F82E ++:102ED000F83F13F0010F03D0136A0833C0F8F03F36 ++:102EE00000F58A531233002204E0002241F2D2138B ++:102EF000C25470474FF6A47101321980198402330D ++:102F0000102AF7D1F1E7C04649F675334B6000232C ++:102F10000B60F0B50C469842ACBF01214FF0FF3179 ++:102F200003F5340301FB03F103F53403081890FBA8 ++:102F3000F3F202FB1303581A03D4C31301335B10DB ++:102F400004E04342DB1301335B105B425A2BD4BFD6 ++:102F50000023012313B1A0F5340014E0002803DBA3 ++:102F6000C31301335B1004E04342DB1301335B10F6 ++:102F70005B4213F15A0FACBF002301230BB90126AA ++:102F800003E000F534004FF0FF364FF0000EF4463A ++:102F90007546604561682268144F0BDD41FA0EF3F7 ++:102FA0009B18236042FA0EF3C3EB01036360EB59F5 ++:102FB0009C440BE041FA0EF3C3EB0203236042FA98 ++:102FC0000EF35B186360EB59C3EB0C0C0EF1010EB2 ++:102FD0000435BEF1120FDCD1636806FB03F36360B6 ++:102FE000236806FB03F32360F0BDC046F4FC010038 ++:102FF00080EAE071A1EBE0710022D0B251FA00F357 ++:103000000132002BF9DC70470146002000B58646EE ++:103010004FF0804343FA0EF31A188A424FEA5000E9 ++:1030200002D8891A43EA00000EF1020EBEF1200F09 ++:10303000EED1884238BF013000BDC046C36983F875 ++:103040009010C36983F89120C36983F89210C36913 ++:1030500083F893207047C046C36983F89210704785 ++:1030600041F21633C256013BC0568242B4BF012022 ++:10307000022070470048704750FD01000020704753 ++:103080007047C046084670470020704741F2D81389 ++:10309000C05803E0C3888B4202D000680028F9D1F1 ++:1030A0007047C04610B5B0F8DA10FFF7EFFF10BD5B ++:1030B000C3699B6913F0005F09D0D0F8B0304FF0BE ++:1030C0000302A3F8B4264FF0FF02A3F8B826704716 ++:1030D000D0F8F83013F0060F0CBF00200120704725 ++:1030E0002DE9F0410F46B0F8DA10044615461E46A9 ++:1030F000FFF74AFD40B9B4F9FC302B60B4F9FE305B ++:103100003360B4F900313B60BDE8F081D0F8A8002D ++:103110007047C04670B541F2D813C15805460AE061 ++:103120000B6841F2D8142B51EB694FF43D7298684B ++:10313000F3F3DEF529590029F2D141F2D81305F550 ++:1031400090523032E950043BEA504FF6CE70F033E3 ++:10315000E852C2F8901070BD10B590F8E93094B004 ++:1031600043F0010380F8E93004460021302201A831 ++:10317000EEF366F7002110220DA8EEF361F70021AF ++:10318000042213A8EEF35CF711A800210822EEF345 ++:1031900057F794F8E930002023F0010384F8E93070 ++:1031A00014B010BD70B506460D46104614460021F9 ++:1031B0001C22EEF345F700200F4BC25A41F22823A0 ++:1031C000F35C1BB1942A01D9A52A10D9022D02D192 ++:1031D0000E2A04D90BE0012D09D10E2A07D9D108F6 ++:1031E00002F0070301229A40635C134363540430E6 ++:1031F0003828E1D170BDC046A8FC010010B50C46CE ++:10320000002103F025F82070012010BD10B5002129 ++:1032100003F01EF840B210BD41F2D41310B5C458EB ++:10322000F433C15819B1C36918693DF095DA002328 ++:103230006370A37010BDC04610B59E462BB941F215 ++:103240000723C35C704613600FE041B1012906D02B ++:10325000022904D0032902D06FF01C0005E041F2DE ++:103260000723C154FFF7D8FF002010BD41F2C82347 ++:10327000C15810B509B9084607E0C36918693DF09F ++:103280006BDAD0F1010038BF002010BD10B541F25B ++:10329000F423C35C0BB104F097FD10BD10B503F02F ++:1032A000B5FB10BDC36970B5DC681B6D054613F036 ++:1032B000010F0E4608D02046F7F3FAF520B1EB696E ++:1032C0009B6913F0005F12D1EA69136D13F0010FCF ++:1032D0003BD0536D13F0800F37D1D068F7F386F7EA ++:1032E000002832D0EB699B6913F0005F2DD0D5F830 ++:1032F000F83013F0020F28D1EEB106F47043B3F5A5 ++:10330000005F18D163691149232BB4BF00230C233C ++:10331000F2B2B8BF0F2120469A400123F7F3D0F54F ++:1033200063690B49222B2046D8BF7021CCBF4FF4D4 ++:103330000072102206E0636904492046222BD8BFA0 ++:103340000F2100220123F7F3BBF570BD00F05555A6 ++:10335000000E5555D0F8B030C269D3F82031136D46 ++:1033600070B513F0010F04460D4608D0D068F7F38E ++:103370009FF520B1E3699B6913F0005F11D1E26909 ++:10338000136D13F0010F18D0536D13F0800F14D18B ++:10339000D068F7F32BF780B1E3699B6913F0005F06 ++:1033A0000BD025B920462946FFF77CFF0AE02046CE ++:1033B000B4F8DA10FFF776FF00E01DB104492046AB ++:1033C000062202E0034920460E22FFF7F9F970BDFC ++:1033D000360302008CFC010010B514299E46D0F87B ++:1033E000A82004D015290CD06FF016000CE092F93B ++:1033F0001A3002A941F8043F70460422EEF3BCF5EE ++:1034000001E0039B9376002010BDC04610B590F8F4 ++:103410001A360C462BB10231224601F091FDA378F9 ++:10342000637010BD10B5012103F072FA10BDC046E3 ++:103430002DE9F0418A79CB790D4642EA03216B7977 ++:103440002A79074642EA0328C3695B690A2B07D930 ++:10345000EB7C1B0213F4807002D10123EB7735E083 ++:103460002A7A6B7A384601F0FF0442EA0326FFF716 ++:103470004DFE7F2C1B4AC8BFA4F58074B30AD356F7 ++:1034800090F85F00E21818F4006F14BF41F23B336C ++:1034900041F23A33FB56D11843B2C918AA7DEB7DED ++:1034A0007F2942EA0322C2F3C702C8BFA1F5807197 ++:1034B0000E2AD4BF4FF400534FF4805342F43062CD ++:1034C000384649B243EA0202FFF7DCFD6A79C1B22D ++:1034D0002977384649B2C2F3801201F00DFBBDE8EE ++:1034E000F081C0461A22020010B590F8E9309646E5 ++:1034F00053B313F0010F19D0D0F8F0308B420FD135 ++:10350000C369D3F88C209B1883F882E0C269D2F893 ++:103510008C30072B01D1002300E00133C2F88C303E ++:1035200090F8E93023F0010380F8E93090F8E930B1 ++:1035300013F0020F08D023F0020380F8E930C369CA ++:10354000724618693DF01CD910BDC04690F8E930AC ++:1035500010B5ABB9012902D0022902D003E0C0F8AE ++:10356000F02080F8E910C3691B6AC0F8EC3041F222 ++:103570000503C35C23B111466FF05E02FFF7B4FF91 ++:1035800010BDC04637B5044602F01CFFE3691A6A55 ++:1035900001321A6294F8E830002B77D041F262339E ++:1035A000E35A1BB1A4F86E38A4F8703841F26633C0 ++:1035B000E35A1BB1A4F86838A4F8643841F26433C4 ++:1035C000E35A1BB1A4F86238A4F86638E369196AB3 ++:1035D0001A6EB1FBF2F302FB131323B92046B4F8C1 ++:1035E000DA10FFF75FFED4F8F83013F00E0F05D1B4 ++:1035F0002046012194F8DA20FFF7A8FF94F8E9307B ++:103600004BB1E369D4F8EC201B6A9B1A052B02D955 ++:10361000002384F8E93041F22805615929B1E369B2 ++:103620001A6A1B6E521A9A420BD3D4F8F83013F070 ++:10363000020F06D12046FFF76FFA10B1E3691B6A4B ++:103640006351D4F8F83013F00F0F1FD1D4F88C3039 ++:103650000BB120469847E36918693DF005D868B179 ++:10366000E36901A918690DF107023DF007D820466A ++:103670009DF80710BDF80420FFF7FCFBD4F8F830E4 ++:1036800013F00F0F02D1204603F0C0F900203EBD19 ++:1036900010B50446FFF74AFA0221C2B22046FFF7EE ++:1036A00055FF10BDC36973B5012983F88110044625 ++:1036B0000D46C36906D9186901220323009300212E ++:1036C000134605E0186900210323009301220B46ED ++:1036D0003CF0FADFE269537F002B30D0D4F8B030F1 ++:1036E000D3F8203183F0010313F0010602D11069F1 ++:1036F0003DF050D8012D0FD90222134620464FF439 ++:103700008261FFF749F820464FF482610122022DC1 ++:1037100014BF002301230BE020464FF482610222F4 ++:103720000023FFF739F820464FF4826101222B462F ++:10373000FFF732F81EB9E36918693DF017D87CBD70 ++:10374000C36970B547F67F750446582118692A4643 ++:103750003CF0EEDFE3695A2118692A463CF0E8DFC5 ++:10376000E369702118692A463CF0E2DFE3697221BF ++:1037700018692A463CF0DCDF70BDC046F7B5C26967 ++:103780000546537F002B62D090F81A36002B45D0A7 ++:10379000106928213F223CF0CBDFEB692421186916 ++:1037A00010223CF0C5DFEB6995F82926186926211F ++:1037B00012013CF0BDDFEB6932211869B5F8FC2637 ++:1037C0003CF0B6DF2E460027EB691869204BF95C08 ++:1037D0003CF086DFEB6996F914250446A11D1869B3 ++:1037E00092B23CF0A5DF96F914250223E96992FB19 ++:1037F000F3F25242086992B204F10E0101373CF033 ++:1038000097DF0136082FDFD1EA690323009310699F ++:103810008022012113463CF057DF18E001460420C6 ++:1038200091F914350822073393FBF2F3DB000130E2 ++:1038300081F8143501310C28F2D195F91425EB6982 ++:10384000073218694E21C2F3CF023CF071DFFEBD92 ++:103850002503020010B5012102F0B6FC40B210BDF4 ++:1038600010B500210446621801317F23652982F8D2 ++:103870009136F8D12046FFF7EDFF2046FFF7C6FC52 ++:1038800010BDC0462DE9F04FB0F8DA30A5B003F412 ++:103890007041B1F5805F14BF022201220592D0F879 ++:1038A000A83004460693C3695A6C40F239539A42D1 ++:1038B00004D052339A4201D0002304E0B1F5805F76 ++:1038C00014BF00230123DBB2002165220DF1290082 ++:1038D0000893EEF3B5F3B4F8DAA00AF44073B3F545 ++:1038E000407F02D15FFA8AF810E0B3F5007F5FFAFB ++:1038F0008AF104D1DD2904D801F1020806E0022989 ++:1039000002D84FF0000801E0A1F102082046059915 ++:10391000FFF7A6FF2046FFF727FA4FF0000BC0B2D3 ++:10392000FF255E4607900395CDF810B070E0204665 ++:1039300051462A46FFF7F4F9002867D005EB040941 ++:1039400099F8B26224AA571907F8676C94F8AC305A ++:1039500043B1059A204641462B46FFF78FFB3018AE ++:1039600007F8670C41460DF18E020DF18F032046DA ++:103970000095FFF75BF999F82C269DF88F309A4255 ++:1039800034BF1146194641F2E623E25C53B2994234 ++:1039900001DC002002E0C2EB0103D8B224AB5919CC ++:1039A00011F8673C984234BF02461A4601F8672C6A ++:1039B00094F8E030642B06D803FB02F3642293FBF7 ++:1039C000F2F301F8673C11F8673C9DF88E20079EE2 ++:1039D0009A4238BF1A462B1993F891368DF88F000A ++:1039E000934294BFC6EB0306C6EB0206049AF3B2F9 ++:1039F0005B4588BF2A46049201F8673C039D5B45FE ++:103A000028BF9B46AB4238BF1D460395099E013631 ++:103A10000996099A142AD5B289D104F5A260002129 ++:103A20005132EEF30DF3039B049D84F8293684F89C ++:103A30002A360023184684F818B684F8F83684F835 ++:103A4000195616E024AE731813F8672C94F81A363A ++:103A5000091981F875250BB1089B1BB194F818362C ++:103A60009B1A03E094F82936C3EB020381F8103562 ++:103A700001301428C1B2E5D121460020069D91F9FC ++:103A80001035B5F9E623D218431CD8B281F81025B9 ++:103A900001310428F2D1E36A0BB12046984725B0E2 ++:103AA000BDE8F08F70B505460E462C46FFF774F959 ++:103AB000294600203218137D03B91379013081F8AB ++:103AC000383601310828F5D10021721892F84430B7 ++:103AD00003B91379013184F8483601340829F4D147 ++:103AE000EB6918693CF056DE2846FFF7CBFEEB6920 ++:103AF00018693CF03BDE70BD7F2970B5044601D9E2 ++:103B0000052028E0002213190132652A83F8B21239 ++:103B1000F9D10023E26984F8F736137FD3B1D4F8E2 ++:103B2000F83013F0020F15D1D4F8B030D3F82031AB ++:103B300083F0010313F0010502D110693CF02ADE85 ++:103B40002046FFF79FFE2DB9E36918693CF00EDEB1 ++:103B5000284600E0002070BD70B5054600F52C70C9 ++:103B6000042202300C46EEF307F205F52C70211DFD ++:103B700008220630EEF300F205F52E70082206301A ++:103B800004F10C01EEF3F8F105F538700822063067 ++:103B900004F13401EEF3F0F105F53A700822063035 ++:103BA00004F13C01EEF3E8F105F53070082206302F ++:103BB00004F11401EEF3E0F105F53270082206304D ++:103BC00004F11C01EEF3D8F105F53470082206303B ++:103BD00004F12401EEF3D0F105F536700822063029 ++:103BE00004F12C01EEF3C8F105F53C700822063013 ++:103BF00004F14401EEF3C0F105F53E7004F14C010F ++:103C000008220630EEF3B8F105F5407008220630C0 ++:103C100004F15401EEF3B0F105F5427006300822CC ++:103C200004F15C01EEF3A8F194F8643085F81633E2 ++:103C3000D5F8B030D3F8203113F0010309D11C4678 ++:103C40002846FFF71FFE54B1EB6918693CF08EDD82 ++:103C500005E0EB69012418693CF09CDDF0E770BDDC ++:103C60002DE9F0410F460546FFF710FA07F47043BF ++:103C7000B3F5805FEB69FAB208BF42F48072044684 ++:103C8000A02118693CF054DDAE6A2CB104F517721E ++:103C900041F2D413EA5005E005F59053303341F278 ++:103CA000D412AB5016B128463946B0472CB341F276 ++:103CB000D413EA58537873B1EB6941F2C8242959F7 ++:103CC00018693CF049DDEB6900221869295913464F ++:103CD0003CF0C0DC11E041F20723EB5C6BB1032B3D ++:103CE0000BD0E969D2F890200B6A9B1A8A6E934236 ++:103CF00003D328460221FFF7D5F928463946FFF7B6 ++:103D0000D1FABDE8F081C046E02910B50B46044663 ++:103D100002DD6FF0120012E043F430630E29D4BFCD ++:103D20004FF400514FF48051194389B2FFF798FFC7 ++:103D30000123204684F8D83008F092FF002010BDFF ++:103D400070B50C460546FFF767F844B9284605F0FC ++:103D5000D9FE28464FF4404106F0AEF910E0214666 ++:103D600028460022FFF7D0FF044648B928462146DE ++:103D70007022234605F04AFB28465E2106F0EEFD40 ++:103D8000204670BD2DE9F0410D460446FFF744F88A ++:103D900045B92046294602F0B3FC2F4641F2D42310 ++:103DA000E55213E0204629460122FFF7ADFF074602 ++:103DB00060B941F2D426A35B23B920460A21FEF75D ++:103DC000B9FCA0532046294602F09AFC3846BDE8CB ++:103DD000F081C04670B50E460546D0F8B040FFF7FA ++:103DE0001BF83EBB41F2D6240A2128462A5BFEF787 ++:103DF000ADFC284640F24B413246FEF7A7FC284670 ++:103E0000314602F0DDFBEB692E531B6D13F0020F00 ++:103E100056D041F2D823D5F8B020EB5A4FF47A703F ++:103E2000A2F89C3441F2DC23EB5AA2F89E34F2F360 ++:103E300093F445E0EB691B6D13F0020F1FD0D5F82A ++:103E4000B01041F2D822B1F89C344FF47A709BB292 ++:103E5000AB50B1F89E3404329BB2AB50B4F89C34F2 ++:103E600023F400731B041B0CA4F89C34B4F89E3498 ++:103E70009BB243F40073A4F89E34F2F36DF4314620 ++:103E800028460122FFF740FF0646C8B941F2D62472 ++:103E90002B5B5BB90A212846FEF74CFC40F24B41F4 ++:103EA00028534FF6FF722846FEF750FC28460121A2 ++:103EB00002F086FB28460A214FF49472FEF75CFC60 ++:103EC000304670BD2DE9F0418AB005AED0F8B07033 ++:103ED00005468846142238493046EEF34DF0142248 ++:103EE00036496846EEF348F0EB6900216C461869E4 ++:103EF000142288450CBF234633463CF023DC4FF0A8 ++:103F00000003A7F86835B8F1000F4FF48073A7F8E5 ++:103F1000C0370CBF40234123A7F80C3541F60223DC ++:103F2000A7F814354FF00003A7F80835A7F80A35AD ++:103F3000A7F84C354FF01403A7F86A3540F626036E ++:103F4000A7F868354FF00003A7F800354FF0D0030D ++:103F5000A7F80235B7F802350CBFFA251E25002454 ++:103F600002E00A20F2F3F8F3AC420ADAB7F80E35B1 ++:103F7000013413F0800FF4D103E00A20F2F3ECF3E4 ++:103F800000E0002401340B2C09D0B7F80E3513F4EF ++:103F9000806FF2D003E00A20F2F3DEF300E00024A9 ++:103FA00001340B2C04D0B7F8903613F4807FF2D193 ++:103FB0000AB0BDE8F081C046E0FC01003CFD010014 ++:103FC00070B590F8E2200446002A6CD1012380F8F5 ++:103FD000E230D0F8B030A0F8DA10D3F8203100F594 ++:103FE00081531A60D0F8F82012F0020F06D190F831 ++:103FF000803E1BB942F02003C0F8F830256A002D3E ++:1040000051D001212046FEF735FCB4F8DA30B4F87F ++:10401000DE2003F44061914203D0E36918693CF06B ++:1040200035DB012141F2CD23E1542046FFF792F91F ++:104030002046A847002384F8E1302046FFF79EFB86 ++:10404000E369204693F88110FFF72CFBE26992F8B0 ++:104050008030012BB4F8DA300BD103F47043B3F5A0 ++:10406000005F01D1936F0BE0D36F012B88BF00235A ++:1040700006E003F47043B3F5005F0CBF136F536F9A ++:10408000D366E3690022D96E2046FEF7D3FE0023F3 ++:1040900084F8E230E369922118693CF02BDB41F2AD ++:1040A00022234000E05270BDC36910B518693CF08E ++:1040B0002BDB10BDC36910B518693CF02FDB10BDB8 ++:1040C000F7B5089F04460D461E463BB1032A05D9A5 ++:1040D000684619460422EDF34FF701E000230093F0 ++:1040E000A82D009900F0FB8015DC5C2D00F0AE805F ++:1040F00008DC3C2D00F0A0804A2D00F093801B2DA1 ++:104100002AD020E05E2D30D0C0F2A8805F2D3DD0B7 ++:10411000872D1BD017E0C32D75D006DCAA2D49D002 ++:104120007BDBC22D00F0DB800DE0D42D00F0AB80F6 ++:1041300003DCD32D00F09B8005E0A5F59A73033BCB ++:10414000012B40F2D2806FF01605CFE02046FEF73B ++:104150007DFE40B23060C8E0E3691D7F002D40F075 ++:10416000B8802046FEF77AFBC0E001233B70E3698C ++:104170005B7F002B00F0B0802046FFF79BFF2046BE ++:10418000BDF80010FEF7D6FA30600FE001233B7057 ++:10419000E3695B7F002B00F09F802046FFF78AFFDA ++:1041A000009A204691B2120CFEF7D0FA2046FFF793 ++:1041B0007BFF9AE0E269537F002B00F08D8010694D ++:1041C0003CF0E8DA00252046FFF774FF3560D4F8AC ++:1041D000BC30082B13D10DF1060220460DF107016A ++:1041E0008DF807508DF8065000F0AAFE9DF90720C3 ++:1041F0009DF9063092B29BB243EA02233360204617 ++:10420000FFF752FF60E0E3691B7F002B6AD0338821 ++:10421000022B64D96FF0010568E0E3691B7F002B76 ++:1042200060D05CE0E3691B7F002B52D1236B002B35 ++:104230005BD02046984718E0E3691B7F002B48D1EC ++:1042400020467268B368FFF7C5FD0EE0E3691B7F87 ++:10425000002B3ED12046FFF773FD06E0E3691B7F8C ++:10426000002B36D12046FFF78DFD05463EE0E36981 ++:10427000DA6E3260D4F8F83F13F0010F35D042F017 ++:104280008003336031E0042902D96FF01C052DE072 ++:10429000E269D36E8B4228D0137FD1662BB31069AD ++:1042A0003CF078DA009B23B1204600210122FEF782 ++:1042B000C1FDE36901222046D96EFEF7BBFD00284F ++:1042C00014BF00256FF00205E36918693CF04EDA6F ++:1042D0000CE06FF0040509E06FF00A0506E06FF0EE ++:1042E0000C0503E06FF0030500E000252846FEBD45 ++:1042F0002DE9F04389B09946109B0026032B074611 ++:104300000C46DDF84480139D079604D907A849465A ++:104310000422EDF331F6079940F286230A1E18BFF6 ++:1043200001229C4200F013812CD80C3B9C427CD093 ++:104330000FD8532C08D8522C80F04081502C00F01C ++:104340003D81512C6AD02DE140F26A239C4250D02D ++:1043500028E1B4F5207F00F0E48009D840F27B2307 ++:104360009C4200F0A48003339C4200F0D58019E108 ++:10437000B4F5217F00F0E48040F285239C4200F0F8 ++:10438000DB800FE140F2D6239C4200F0178114D865 ++:10439000413B9C423ED006D8043B9C4234D0023381 ++:1043A0009C4234D0FEE0B4F5277F00F0D78040F285 ++:1043B0009D239C4200F0D680F4E040F2DD239C4235 ++:1043C00000F0EB8008D8033B9C4200F0D180B4F5AC ++:1043D000377F00F0D680E5E0B4F53D7F00F0F38054 ++:1043E000C0F0E080A4F53E73063B012B00F2DA80BA ++:1043F000E9E03846FFF75EFE38464146FFF706F82B ++:104400003846FFF751FE50E041F2623304E041F2DA ++:10441000643301E041F26633F95246E00123009330 ++:1044200038464346FEF722FDCFE0FA69137F13B901 ++:104430006FF00300C9E0D7F8B030D3F8203183F033 ++:10444000010313F0010902D110693CF0A3D93846E9 ++:10445000FEF72EFE3846FFF72DFE41F2E61341F23D ++:10446000E910F95C385C0133FA5C013317F803E0BA ++:10447000009041F2EA103D5C01303C5C1630385C43 ++:10448000734603903846019502940496FEF764FE45 ++:10449000C8F800003846FFF707FEB9F1000F40F0FA ++:1044A0008D80FB6918693CF061D930468DE0C1F31D ++:1044B000036CBCF1010F00F28380C1F3015EBEF119 ++:1044C000010F7DD8C1F38155032D79D0C1F3034489 ++:1044D000012C75D8C1F30722A2F10A03DBB2052B28 ++:1044E0006ED8C8B2012801D9032869D10E2A28BF85 ++:1044F0000E2241F2E613FA540133F8540133FC540E ++:10450000013307F803E00133FD54013307F803C01A ++:104510000A0F1633FA54C8E708A9012341F8043DED ++:1045200007E0B7F8DA103846FEF72EFB08A941F885 ++:10453000040D40462A462DE041F21B03F954B4E72E ++:1045400041F21B03FB5C08A941F8043D17E0D7F8D2 ++:10455000F830C3F30013C8F80030A6E738464246E7 ++:10456000334602E0384642460123FEF765FE9CE7EB ++:104570000121384601F03AFF08A941F8046D404690 ++:1045800007E007AC38463146224601F093FF40462B ++:1045900021460422EDF3F0F487E73846324601F075 ++:1045A00089FF82E701910292384621464A464346F6 ++:1045B0000095FEF711FF10F1170F04D0002004E062 ++:1045C0006FF01C0001E06FF0160009B0BDE8F08349 ++:1045D0002DE9F04391460A6801230B7342F008036A ++:1045E0000B60B0F9FA3685B0B3F1FF3F04BF42F07B ++:1045F00009030B6090F81A3605460C461BB10B6890 ++:1046000043F002030B602F4626464FF0000897F850 ++:10461000B2322846B37749460DF10E030DF10F0271 ++:10462000CDF80080FEF702FB9DF80E3008F101087E ++:1046300086F8B03197F87535013786F8793201364A ++:10464000B8F1140FE3D195F81A3633B3EB691B7F39 ++:104650001BB32846FFF72EFD95F818362846A3759C ++:1046600095F81836E37595F81936A37695F8193646 ++:10467000E37600F05BFC236810B143F0030301E034 ++:1046800023F003032846236004F10D0104F1150211 ++:1046900000F056FC2846FFF707FD05B0BDE8F083A3 ++:1046A00010B5054B1B78012B03D1013B18461B703D ++:1046B00001E014F00BFE10BD3C28020010B5054BC4 ++:1046C0001B78012B03D1013B18461B7001E014F04D ++:1046D00023FE10BD3C2802002DE9F04105460E46A0 ++:1046E00017461C46FFF7EAFF30B1234628463146FD ++:1046F0003A4614F04BFE04462046BDE8F081C04621 ++:1047000010B50023FFF7E8FF10BDC04610B51446F2 ++:10471000FFF7D4FF20B100210A46EEF319F004465A ++:10472000204610BD10B50022FFF7F0FF10BDC046B7 ++:104730001FB5079B0C890093089B11460193099BA9 ++:10474000224602930A9B03930069069B28F02EDD04 ++:1047500004B010BD00B5B0FBF1FE01FB1E0001F07E ++:10476000010C0CEB51010BE0884228BFC1EB0003A8 ++:104770004FEA4E0E26BF0CEB43000EF1010E400037 ++:10478000531EDAB2FF2AEFD1884228BF0EF1010E84 ++:10479000704600BD00FB01F19202800103FB002086 ++:1047A00001F5004101EB4000490090FBF1F070473A ++:1047B000D0F8A8304FF001025A8670472DE9F04733 ++:1047C00098469DF820308A4691469DF82470B3B1F2 ++:1047D00000246FF000462546204651464A4643468F ++:1047E000FFF7D8FFB04204DA6B1CDDB2BD421AD02D ++:1047F00006460134802CEFD16FF0004013E07F2497 ++:104800004FF0FF361D46204651464A464346FFF7C5 ++:10481000C1FFB04204DD6B1CDDB2BD4203D00646D1 ++:10482000013CF0D22046BDE8F087C04610B5B0F894 ++:10483000DA300446DAB203F47043B3F5005FD0F81F ++:10484000A81003D1531893F8E72486E0702A5ED0AD ++:104850001CD8382A49D00CD82C2A3DD004D8242A78 ++:1048600034D0282A35D02FE0302A38D0342A39D015 ++:104870002AE0642A42D004D83C2A39D0402A3AD0CF ++:1048800022E0682A3DD06C2A3ED01DE0882A50D014 ++:104890000CD87C2A44D004D8742A3BD0782A3CD047 ++:1048A00012E0802A3FD0842A40D00DE0992A49D0D6 ++:1048B00004D88C2A40D0952A41D005E0A12A47D0BF ++:1048C000A52A48D09D2A40D0002246E091F8F6243F ++:1048D00043E091F8F72440E091F8F8243DE091F8A6 ++:1048E000F9243AE091F8FA2437E091F8FB2434E017 ++:1048F00091F8FC2431E091F8FD242EE091F8FE249B ++:104900002BE091F8FF2428E091F8002525E091F8AC ++:10491000012522E091F802251FE091F803251CE013 ++:1049200091F8042519E091F8052516E091F806257F ++:1049300013E091F8072510E091F808250DE091F8B3 ++:1049400009250AE091F80A2507E091F80B2504E013 ++:1049500091F80C2501E091F80D25D1F8E40494F8C4 ++:104960002A36C01A801840B210BDC04608467047AB ++:1049700049B24B1C5B104910C3F10803083141EAEE ++:10498000031188B27047C046B0F8DA3003F47043C0 ++:10499000B3F5005FD0F8A82005D192F83C05FF28B8 ++:1049A00001D0C0B200E000207047C04670B5054697 ++:1049B000D0F8A840FFF7E8FF10B994F8460540B1D9 ++:1049C000B5F8DA3003F47043B3F5005F14BF00208C ++:1049D000012070BD10B50C468EB0D0F8A8109646D8 ++:1049E000002000220DF10603C25401303228F8D114 ++:1049F000BEF1FF3F91F8E93306D114B1B1F93EE5BC ++:104A000003E0B1F940E514E09CB1A02B09D00023EC ++:104A10008DF806308DF807308DF808308DF80930A4 ++:104A200004E000238DF806308DF808308DF80A3048 ++:104A300033E0A02B17D001238DF81A308DF81B30EE ++:104A40006FF0010300228DF81E308DF81F30013306 ++:104A50008DF81C208DF81D208DF820208DF8213038 ++:104A60008DF8242019E002238DF81A306FF003032B ++:104A70008DF81E30023300228DF81F308DF8203063 ++:104A80008DF8213006338DF81B208DF81C208DF811 ++:104A90001D208DF824208DF832300EAA02EB0E0373 ++:104AA00013F9320C0EB010BD30B5C46900F5805357 ++:104AB000226A1B68D0F8A8509A4202D3C3EB0201C5 ++:104AC00001E0DB43991895F8BC2290F8DA309A425D ++:104AD00001D0012004E0A36E994234BF00200120E0 ++:104AE00030BDC0467047C046D0F8A83093F80604E1 ++:104AF000002808BF1020704700B5D0F8A8008E46E7 ++:104B0000D0F8D4240EF0FF0343EA0223110EC0F8BC ++:104B1000D434D0F8D8347F29C8BFA1F5807173444C ++:104B20005B1AC0F8D8349B10C0F8DC3400BDC04616 ++:104B3000844610221B4810B5964600244EF34603C7 ++:104B40005FFA83FE10EA0C0F4FFA8EF104D0884012 ++:104B50000EEB0203DAB203E0C840CEEB0203DAB296 ++:104B60000134042CEAD110EA0C0FD3B201D1013B7D ++:104B7000DAB251B2032301FB03F30329DAB20EDDEB ++:104B8000CB1E2CFA03F00D2801D9D31C06E00A280D ++:104B900001D9931C02E0082801D9531CDAB250B2A3 ++:104BA00010BDC0460000FFFFD0F8A820002382F807 ++:104BB000903382F8913382F8923382F8933382F8FB ++:104BC000943370477047C04670B540F22341D0F827 ++:104BD000A8500446FDF7AEFDC0B2A5F864034FF43B ++:104BE000AA612046FDF7A6FD8005800DA5F86803A3 ++:104BF00040F234412046FDF79DFDC0B27F28C8BF7A ++:104C0000A0F58073A5F8660340F23241C8BFA5F84D ++:104C100066332046FDF78EFDC0B27F28C4BFA0F5E5 ++:104C2000807398B285F8BC0370BDC0462DE9F0478B ++:104C3000884640F2B76104469146FDF77BFD40F29D ++:104C4000B66105462046FDF775FD40F2B5610646A2 ++:104C50002046FDF76FFD40F2B46107462046FDF7A0 ++:104C600069FD4FF0000C6246644650FA04F313F0FD ++:104C7000010101D0012103E00CF101035FFA83FC83 ++:104C8000531CDAB2102A12D001340029EDD00EE004 ++:104C9000A2F1100357FA03F313F0010F01D0012121 ++:104CA00003E00CF101035FFA83FC531CDAB21F2A04 ++:104CB00011D80029ECD00EE0A2F1200356FA03F33C ++:104CC00013F0010F01D0012103E00CF101035FFAA1 ++:104CD00083FC531CDAB22F2A11D80029ECD00EE045 ++:104CE000A2F1300355FA03F313F0010F01D00121B3 ++:104CF00003E00CF101035FFA83FC531CDAB23F2A94 ++:104D000001D80029ECD04FF03F0E00220F2455FAB5 ++:104D100004F313F0010101D0012103E00EF1FF3390 ++:104D20005FFA83FE531CDAB2102A12D0013C00292C ++:104D3000EDD00EE0C2F11F0356FA03F313F0010F9A ++:104D400001D0012103E00EF1FF335FFA83FE531C13 ++:104D5000DAB21F2A11D80029ECD00EE0C2F12F03DD ++:104D600057FA03F313F0010F01D0012103E00EF114 ++:104D7000FF335FFA83FE531CDAB22F2A11D80029C1 ++:104D8000ECD00EE0C2F13F0350FA03F313F0010F31 ++:104D900001D0012103E00EF1FF335FFA83FE531CC3 ++:104DA000DAB23F2A01D80029ECD088F800E089F86F ++:104DB00000C0BDE8F087C04670B50D4640F23941ED ++:104DC0000646FDF7B7FCC0F3C210E88040F2B541DB ++:104DD0003046FDF7AFFC40F2FB4104463046FDF79C ++:104DE000A9FC04F0FF03C0B2C4F307242B806C803D ++:104DF000A88070BD2DE9F047B0F8DA30074603F41B ++:104E00007043B3F5805FD0F8A82009D1B2F89205BD ++:104E100003B2B3F1FF3F0CBF4FF4C87080B24CE057 ++:104E2000B2F8904523B2B3F1FF3F01D0A0B244E005 ++:104E300040F2A541FDF77EFC40F2A541814638468F ++:104E4000FDF778FC40F20D4106463846FDF772FC4E ++:104E500040F20D4104463846FDF76CFC40F2A24199 ++:104E600005463846FDF766FC40F2A24180463846CA ++:104E7000FDF760FCC6F30236012313FA06F6C0F311 ++:104E80000220C5F3022513FA05F58340E4B25FFA68 ++:104E900089F94C44B6B2A419ADB29BB25FFA88F856 ++:104EA0006419434404EB430464005034A4B2B4F5E1 ++:104EB000C86F2CBF20464FF4C860BDE8F087C046DD ++:104EC00010B540F2FB41FDF735FCC0F3062010BDE4 ++:104ED00070B540F2A4410446D0F8A850FDF72AFC72 ++:104EE000C0F38130032814D141F22403E35C83B181 ++:104EF000204640F27341FDF71DFC95F96635C0056B ++:104F0000C00D013303FB00F3022293FBF2F3D8B28E ++:104F100001E095F8C10240B270BDC04610B540F244 ++:104F2000A441FDF707FC00F4404010BD10B5FFF7A9 ++:104F3000F5FFB0F5404F14BF0020012010BDC04662 ++:104F400070B5002313700B7041F22403C35C044658 ++:104F50000D4616461BB340F2AB41FDF7EBFB10F4D8 ++:104F6000004F03D0204640F2AB410AE0204640F219 ++:104F70003C61FDF7DFFB10F4004F07D0204640F204 ++:104F80003C61FDF7D7FBC0F3470028702046FFF7D0 ++:104F9000CDFF08B194F810052B781B18337070BD45 ++:104FA0002DE9F04140F2FF340E4605469046334667 ++:104FB000224640F24561FDF7EFFB28462246434674 ++:104FC00040F24661FDF7E8FB28462246334640F2B0 ++:104FD0004761FDF7E1FB2846224643464FF4C9618D ++:104FE000FDF7DAFB28462246334640F24961FDF7D9 ++:104FF000D3FB284640F24A6122464346FDF7CCFBEC ++:10500000BDE8F08170B5002914BF4FF48073002310 ++:1050100004460D1E18BF01254FF480724FF49661AF ++:10502000FDF7BAFB0122204640F24C412B46FDF72A ++:10503000B3FB2B0320464FF496614FF4805203F4E8 ++:105040007043FDF7A9FB6B0320464FF496614FF4C4 ++:10505000005203F46043FDF79FFB6B0120229BB2DB ++:1050600020464FF49661FDF797FB6B0203F47E43F5 ++:10507000204640F2AE414FF40072FDF78DFBB4F8CC ++:10508000DA3003F47043B3F5005F11D1AB02204670 ++:105090004FF496614FF4806203F47C43FDF77CFB90 ++:1050A000EB009BB2204640F2E5410822FDF774FB7D ++:1050B00070BDC04670B50C02A4B20546234640F24E ++:1050C000FB414FF4FE42FDF767FB284640F2FD41ED ++:1050D0004FF4FE422346FDF75FFB70BD70B500291B ++:1050E00014BF802300230C1E18BF012480224FF41C ++:1050F00096610546FDF750FBA303A40128464FF433 ++:1051000096614FF4804203F44043A4B2FDF744FBA0 ++:10511000284640F23B4140222346FDF73DFB70BD4F ++:1051200070B540F239440D4621460646FDF702FBB4 ++:1051300040F67F4300EA030343EAC51330462146A5 ++:1051400040F6FF729BB2FDF727FB70BD2DE970435F ++:105150000C460646FFF7B4FE628823884FF6FF79B7 ++:1051600043EA022305464A46304640F2B5419BB227 ++:10517000FDF712FB2D02A388ADB247F6FF7830464B ++:10518000424645EA030340F2FB41FDF705FB628816 ++:105190002388304643EA022340F2FC414A469BB250 ++:1051A000FDF7FAFAA3883046424645EA030340F287 ++:1051B000FD41FDF7F1FA3046E188FFF7B1FF3046D7 ++:1051C0000121FFF78BFFBDE87083C04610B502498F ++:1051D0000C22FDF7F5FA10BD380D02002DE9F0475D ++:1051E0009846BDF82CA0BDF824308946BDF82010A3 ++:1051F0000AF00304164603F00F03BDF8282044EA22 ++:10520000032301F00F0102F0030243EA013343EAF2 ++:10521000821343EA021343EA840340F2B6414FF695 ++:10522000FF720746BDF83050FDF7B6FA0F2208EAC4 ++:105230000203384640F2B741FDF7AEFA4FEACA23FF ++:105240009CB22346384640F2B1414FF460522D03E0 ++:10525000FDF7A2FAADB2062238462049FDF7B0FAB2 ++:105260007602384640F2AE414FF470422B46FDF7CD ++:1052700093FA384640F2B1414FF4007206F47E438F ++:10528000FDF78AFAD9F1010338BF0023012238461D ++:1052900040F24D41FDF780FAB7F8DA3003F470437D ++:1052A000B3F5005F10D1384640F2B1414FF4C0521F ++:1052B0002346FDF771FA4FEACA039BB2384640F223 ++:1052C000E6411822FDF768FA384640F2AE414FF445 ++:1052D00070422B46FDF760FABDE8F087A209020094 ++:1052E00010B5044686B021B90D490E22FDF768FAC3 ++:1052F00014E00C490922FDF763FA0021032206237A ++:10530000009302920423039220460A4604910193DB ++:10531000FFF764FF20460121FFF774FE06B010BDC1 ++:10532000420702005E07020010B5D0F8A830D3F89B ++:10533000741529B1C3694FF420729868F1F3D8F459 ++:1053400010BDC0462DE9F041D0F8A8300646D3F88C ++:105350007C55D3F8787500240DE0142302FB03F389 ++:10536000EA1811695268F06902FB01F28068E95895 ++:10537000D208F1F3BDF4E2B20134BA42EDD3BDE894 ++:10538000F081C04670B5D0F8A8500446D5F87C35F9 ++:105390006BB10121FFF7D6FFE369D5F878451422F8 ++:1053A0009868D5F87C1504FB02F2F1F3A1F470BD06 ++:1053B00041F2F023C15810B5044629B1C36942F641 ++:1053C00008529868F1F394F42046FFF7ADFF2046A9 ++:1053D000FFF7D8FFE369D4F8A81098684FF4B962D2 ++:1053E000F1F386F410BDC04610B54FF48052044668 ++:1053F000002340F2C961FDF7CFF9D4F8A820B2F834 ++:10540000C234EBB192F8E933A02B04D1204640F22C ++:105410008961232203E0204640F289613022FDF7B2 ++:1054200095F9D4F8A830B3F8C234022B0ED14FF45A ++:105430008052204640F2C9611346FDF7ADF905E000 ++:10544000204640F289612322FDF780F9042220469C ++:105450002749FDF7B5F90022204640F27961FDF7B2 ++:1054600075F9082220462349FDF7AAF9D4F8A83097 ++:105470002046B3F8C2244FF4D961FDF767F906223C ++:1054800020461D49FDF79CF9D4F8A8304FF48072EE ++:10549000B3F8C23420461A41013A4FF4D06192B2B7 ++:1054A000FDF754F9D4F8A8304FF4A072B3F8C23421 ++:1054B00020461A41013A92B240F28161FDF746F965 ++:1054C000D4F8A830B3F8C224012A04D0022A14BFA9 ++:1054D0003422082200E01822204640F27F61FDF7C6 ++:1054E00035F9204605490E22FDF76AF910BDC04680 ++:1054F000440B02004C0B02002E0C02003A0C02007E ++:105500002DE9F04740F23C4631460446FDF712F9DA ++:1055100040F23B48824641462046FDF70BF94AF0EF ++:10552000010281463146204692B2FDF70FF949F05B ++:105530000102204641464FF6FE7592B2FDF706F98C ++:10554000204631460AEA0502FDF700F920464146A9 ++:1055500009EA0502FDF7FAF8204631465246FDF702 ++:10556000F5F8204641464A46FDF7F0F8BDE8F087D9 ++:10557000802270B513460C4640F2D1610546FDF716 ++:105580000BF90CB1012C05D128464FF4DA610F223A ++:10559000FDF7DCF82846FFF7B3FF70BD2DE9704337 ++:1055A0000E46B0F8DA10054601F47041B1F5005F1F ++:1055B00014BFA521892199469046FDF731F8B5F829 ++:1055C000DA10044601F47041B1F5005F14BFA52163 ++:1055D00089212846FDF724F804F00F04C0F30310D6 ++:1055E000241A3470B5F8DA10284601F47041B1F588 ++:1055F000005F14BFA6218A21FDF712F8B5F8DA1072 ++:10560000044601F47041B1F5005F14BFA6218A2160 ++:105610002846FDF705F804F00F04C0F30310241A20 ++:1056200088F80040B5F8DA10284601F47041B1F569 ++:10563000005F14BFA7218B21FCF7F2FFB5F8DA1049 ++:10564000044601F47041B1F5005F14BFA7218B211E ++:105650002846FCF7E5FF04F00F04C0F30310241AFA ++:1056600089F80040B5F8DA10284601F47041B1F528 ++:10567000005F14BFA8218C21FCF7D2FFB5F8DA1027 ++:10568000044601F470412846B1F5005F14BFA8211B ++:105690008C21FCF7C5FF04F00F04C0F30310069B38 ++:1056A000241A1C70BDE87083B0F8DA1010B501F44C ++:1056B00070410446B1F5005F14BFA52189218822FD ++:1056C000FCF7C6FFB4F8DA10204601F47041B1F5DA ++:1056D000005F14BFA6218A218822FCF7B9FFB4F825 ++:1056E000DA10204601F47041B1F5005F14BFA72124 ++:1056F0008B218822FCF7ACFFB4F8DA10204601F4C5 ++:105700007041B1F5005F14BFA8218C218822FCF7FD ++:105710009FFF10BD10B5D0F8A830044693F8E933C8 ++:10572000A02B03D110490422FDF74AF8204600229D ++:105730004FF48E71FCF78CFF204618220B49FDF7C1 ++:105740003FF841F2EE23E35A2046FF2240F2346153 ++:10575000002B08BF0C23FDF71FF82046044909223F ++:10576000FDF72EF810BDC046580D0200600D020076 ++:10577000900D020070B504220D4607490646FDF75C ++:105780001FF80024054B625BE15A30460234FCF7F7 ++:105790005FFF302CF6D170BDD60B0200D2040200A0 ++:1057A0002DE97043054698461646B0F8DA40FFF7F3 ++:1057B000DFF804F47044B4F5005F14BFA524892415 ++:1057C0000246214628469DF81890FCF741FF3146D5 ++:1057D0002846FFF7CDF8B5F8DA40024604F47044E5 ++:1057E000B4F5005F14BFA6248A2428462146FCF79E ++:1057F0002FFF41462846FFF7BBF8B5F8DA400246CE ++:1058000004F47044B4F5005F14BFA7248B24284629 ++:105810002146FCF71DFF49462846FFF7A9F8B5F8D1 ++:10582000DA40024604F47044B4F5005F14BFA824C3 ++:105830008C2428462146FCF70BFFBDE87083C04648 ++:1058400070B505460E460024074BA25BE15A284678 ++:105850000234FCF7FDFE182CF6D1284603492246F7 ++:10586000FCF7AEFF70BDC046800B0200880C020042 ++:1058700070B506220E4644490446FCF7A1FF0025F8 ++:10588000424B2046E95AFCF7CBFEA8530235182DAF ++:10589000F6D1072101222046FCF7DAFE1022FF2173 ++:1058A00013462046FCF71AFF04221346204640F216 ++:1058B0001F11FCF713FF0C2220463549FCF780FF2F ++:1058C00001223A2113462046FCF708FF04223A2120 ++:1058D00013462046FCF702FF0822134620464FF4E9 ++:1058E0008D71FCF7FBFE0822052113462046FCF7CC ++:1058F000F5FE0122134620464FF48D71FCF7EEFEB3 ++:10590000122220462349FCF75BFF20228221134606 ++:105910002046FCF7E3FEB4F8DA3003F47043B3F545 ++:10592000005F02D000252E4608E0D4F8A8309A7A0D ++:10593000D97A42F400721D7B42EA01160122204608 ++:1059400013464FF49B61FCF727FF2046B3004FF44A ++:105950009B6140F6FC72FCF71FFF022220461346B3 ++:105960004FF49B61FCF718FF2B0320464FF49B611B ++:105970004FF4E04203F47043FCF70EFF2046064963 ++:105980000622FCF71DFF70BD16080200800B020006 ++:10599000AE090200C6090200EA0902002DE9F74F2C ++:1059A000D0F8A830814693F80B809C7A1A7E1F7B32 ++:1059B0004FEA081844F4007493F817B09E7D44EA47 ++:1059C0000804009293F814A0DD7C44EA07345B7D60 ++:1059D00047F2FF38A4B2092223490193FCF7F0FEF5 ++:1059E00048464246234640F2DB41FCF7D5FE484696 ++:1059F0004246234640F2DC41FCF7CEFE4846424692 ++:105A0000234640F20A41FCF7C7FE4FEA0A1A019BFF ++:105A100045F4007545EA0A0545EA0335484642461D ++:105A2000ABB240F20B41FCF7B7FE4FEA0B1B009AFA ++:105A300046F4007646EA0B0646EA023648464246F7 ++:105A4000B3B240F20C41FCF7A7FE20224846822167 ++:105A50001346FCF743FE012248467C211346FCF71F ++:105A60003DFEBDE8FE8FC046C40B0200012970B5A3 ++:105A700005460C4616D106222949FCF7A1FE284608 ++:105A80003A2122462346FCF729FE082228461346DF ++:105A90004FF48D71FCF722FE28467F210022FCF78F ++:105AA000D7FD33E079B91F490622FCF789FE284665 ++:105AB0003A2101222346FCF711FE082228464FF422 ++:105AC0008D71134620E0022920D1B0F8DA3003F4BA ++:105AD0007043B3F5005F02D17D21032201E07D21F7 ++:105AE0002246FCF7B5FD284628210F220123FCF7AA ++:105AF000F5FD8022134628464FF48971FCF7EEFD30 ++:105B00002846052107220223FCF7E8FD284640F23B ++:105B100037614FF440420023FCF73EFE70BDC046A3 ++:105B2000AE060200560C02002DE9F047C369D0F81A ++:105B3000A8501B6D0C4613F4805F40F2234114BF44 ++:105B40004FF006094FF00909064695F844A3FCF703 ++:105B5000F1FD40F2344107463046FCF7EBFD2046AC ++:105B6000FEF7E6FF95F84433C1B2B5F8642395F823 ++:105B700048030BB9012092E007F0FF07C0EB0103D7 ++:105B8000C2EB07029B1A5FFA83F84FFA88F4002CE5 ++:105B90001DDAF36930461B6D03F48053002B0CBFF4 ++:105BA0000B21042114BF0322082263429A42A8BF9A ++:105BB0001A46B5F8683301FB02324FF4AA6192B27B ++:105BC000FCF7C4FD14F1030F06DAFB1C05E0032CFF ++:105BD00002DDFB1E9BB200E0BBB2B5F8640319B254 ++:105BE00002B2D31C994201DDC31C03E09142ACBF59 ++:105BF0000B4613469CB2BAF1000F13D023B2BB423E ++:105C000010D02346304640F22341FF22FCF7C4FD6A ++:105C1000304624490422FCF7D3FD1420F0F39CF510 ++:105C2000002700E00127B5F866434FFA88F220B25A ++:105C3000C9EB000352429A42B8BFC9EB040391B2C8 ++:105C4000B8BF99B20AB200F109039A42C4BF04F185 ++:105C5000090399B2B6F8DA3003F47043B3F5005F84 ++:105C60000CBF95F94B3395F94C335B189BB2BAF1E5 ++:105C7000000F05D0304640F23441FF22FCF78CFD86 ++:105C8000304640F22341FCF755FD95F8BC33C0B2D5 ++:105C900085F8BD0385F8BE0385F8BF333846BDE8F7 ++:105CA000F087C0465C0B020070B5D0F8A8500446DF ++:105CB000FF22B5F8663340F23441FCF76DFDB5F8CC ++:105CC00064332046FF2240F22341FCF765FD204665 ++:105CD000B5F868234FF4AA61FCF738FD2046044963 ++:105CE0000422FCF76DFD1420F0F336F570BDC046BC ++:105CF0008A050200082270B5134605465721FCF7B5 ++:105D0000EDFC56212846FCF78BFC00F0F8045621E8 ++:105D100022462846FCF79CFC0120F0F31DF5562195 ++:105D200044F003022846FCF793FC0120F0F314F53D ++:105D3000562144F007022846FCF78AFC4FF496707F ++:105D4000F0F30AF52846572108220023FCF7C6FC89 ++:105D500070BDC0462DE9F04140F24A4631468046CA ++:105D6000FCF7E8FC40F04404A4B24FF6BF7540468F ++:105D70003146224604EA0505FCF7E8FC31462A468E ++:105D80004046FCF7E3FC25F004050420F0F3E4F4BE ++:105D9000404631462A46FCF7D9FCBDE8F081C046B2 ++:105DA0002DE9F04706460C461546384906221F469F ++:105DB000DDF82090BDF82480FCF702FD304640F26B ++:105DC00082414FF6FF722346FCF7E6FC304640F274 ++:105DD0008141FF222B46FCF7DFFC3FB9304640F201 ++:105DE00081414FF480723B46FCF7D6FC304628498F ++:105DF0000322FCF7E5FC0A2308FB03F5002407E077 ++:105E0000AC4201DD002439E06420F0F3A5F4013454 ++:105E1000304640F28141FCF78DFC10F4007FEFD159 ++:105E200040F283413046FCF785FC40F28441044651 ++:105E30003046FCF77FFC40EA0440C9F8000040F21D ++:105E400085413046FCF776FC40F2864104463046F8 ++:105E5000FCF770FC40EA0440C9F8040040F28741B6 ++:105E60003046FCF767FC4FF4916104463046FCF77E ++:105E700061FC40EA0440C9F80800012430460549A5 ++:105E80000622FCF79DFC2046BDE8F087980702003B ++:105E9000F40502002A06020070B50546002407E05A ++:105EA0006420F0F359F4013441F289339C4207D065 ++:105EB000284640F25141FCF73DFC10F4404FEFD131 ++:105EC000284640F25141FCF735FC10F4404F14BF16 ++:105ED0000020012070BDC04610B540F24C414FF685 ++:105EE000FC72FCF73BFC10BDC36970B504460D465F ++:105EF00018698E2116463AF0FDDBE3694119490025 ++:105F0000186932463AF014DC70BDC046C36970B5FA ++:105F100004460D4618698E213AF0ECDBE36941191D ++:105F2000490018693AF0E6DB70BDC0462DE9F04142 ++:105F30000C46272180461646FFF7E8FF10F00103C4 ++:105F400002D101271D4605E04FF6F07500EA050570 ++:105F50004FF6F07728214046FFF7D8FF3840A84297 ++:105F600001D1012009E0013C631C002B02DD14205B ++:105F7000F0F3F2F3002CEDDC002006B13460BDE854 ++:105F8000F081C0462DE9F0410646D0F8A850FEF752 ++:105F9000C5FFB0F5404F46D1F369E02118693AF0EA ++:105FA000A9DBEC8D8046C4EB000440F2A5413046ED ++:105FB000FCF7C0FB0123C0F30227BB40A4B29C4204 ++:105FC00031DD95F8C134A5F82E80BB4208D90137E0 ++:105FD000304640F2A5414FF4E0623B02FCF7DCFBA7 ++:105FE0003046FEF775FF40B280B22886B6F8DA3048 ++:105FF0006F8603F47043B3F5005F0CBF85F854045B ++:1060000085F85504D6F8A8202B8E92F966255B00FA ++:10601000013293FBF2F3304640F2A44140F2FF120A ++:106020009BB2FCF7B9FBBDE8F081C0462DE9F04F0B ++:10603000044685B00D46D0F8A860FFF7A3FFD4F85A ++:10604000B030D3F8203183F0010313F00103039340 ++:1060500003D1E36918693AF09DDB07212046FCF77C ++:10606000DFFAFF2101902046FCF7DAFA40F21F1117 ++:1060700002902046FCF7D4FA40F23B41834620468A ++:10608000FCF758FB40F23C4182462046FCF752FBAD ++:1060900040F2D74181462046FCF74CFB4FF49B6110 ++:1060A00080462046FCF746FB0F224649074620461D ++:1060B000FCF786FB0122072113462046FCF70EFB66 ++:1060C0001022FF2113462046FCF708FB042213464A ++:1060D00040F21F112046FCF701FB0A20F0F33CF3CD ++:1060E000202220464FF49A611346FCF755FB0A2004 ++:1060F000F0F332F3012D21D140F276412046FCF736 ++:1061000019FB40F27741C5052046FCF713FBC0059B ++:10611000C00DED0DFF288ABFA0F5007302469AB2AC ++:10612000FF2D88BFA5F50073A6F86E058CBF98B249 ++:106130002846C0EB0203A6F86C550AE0204640F260 ++:106140007541FCF7F7FAC005C00DFF2803D9A0F58B ++:1061500000739DB200E00546019B2046DAB207219C ++:10616000FCF776FA029B2046DAB2FF21FCF770FAC0 ++:10617000204640F21F115FFA8BF2FCF769FA2046C5 ++:1061800040F23B415246FCF7E1FA204640F23C41E6 ++:106190004A46FCF7DBFA204640F2D7414246FCF77C ++:1061A000D5FA20464FF49B613A46FCF7CFFA039BA1 ++:1061B0001BB9E36918693AF0D9DA28B205B0BDE82D ++:1061C000F08FC046F807020070B5D0F8A83001295A ++:1061D000D3F8DC63D3F8D853D3F8E04304D10131CA ++:1061E000FFF724FF02B20AE040F27541FCF7A2FA81 ++:1061F000C005C00DFF288CBFA0F500720246631FCA ++:1062000001209840801905FB1200231F184140B25D ++:1062100070BDC04610B50129D0F8A83003D1FFF7F2 ++:1062200005FF00B212E0B3F86C25B3F86E35FF2B12 ++:1062300086BFA3F5007399B21946FF2A86BFA2F55F ++:1062400000739BB21346C3EB010318B210BDC046E6 ++:1062500070B5D0F8A830D3F8D443D3F8D053D3F8DE ++:10626000CC63FFF7D7FF621E0123934000B25B1996 ++:1062700006FB1030204140B270BDC0462DE9F04110 ++:10628000B0F8DA20074602F47043B3F5005FD0F8A7 ++:10629000A85004D1B5F85463B5F8844513E0D3B2DF ++:1062A000942B03D9B5F88645022308E0632B03D964 ++:1062B000B5F88845012302E0B5F88A45002305EBCF ++:1062C0004303B3F85663FF2E1ED001213846FFF773 ++:1062D000BFFF40B2193804FB00F000B20028CCBF69 ++:1062E00000F5FA73A0F5FA734FF47A7293FBF2F3A8 ++:1062F00098B28419A4B2384640F23441FF222346B2 ++:10630000FCF74AFAA5F86643BDE8F08170B505468A ++:10631000D0F8A8600C4689B340F2DA6142F2080274 ++:10632000FCF72AFA284640F2A6510522FCF70EFA9D ++:10633000284640F2A251C322FCF708FA284640F250 ++:10634000A5510722FCF702FA284640F283514FF488 ++:106350004872FCF7FBF9284640F284510022FCF712 ++:10636000F5F9284640F285514FF40072FCF7EEF93A ++:10637000284640F286510022FCF7E8F928462721FA ++:10638000FFF7C4FD1CB140F001039CB203E04FF6DF ++:10639000FE7400EA040496F894332846F31893F840 ++:1063A0009523052302FB03F22621042A98BF1A46EF ++:1063B000FFF79AFD04F110022846272192B2FFF759 ++:1063C00093FD70BD70B5D0F8A850044695F84233DF ++:1063D0005BB10021FFF79AFF204619210022FFF749 ++:1063E000A5FD10B9012385F8453370BD70B5D0F80F ++:1063F000A840054694F8423393B990F8E93013F079 ++:10640000010F1CBF23F0010380F8E93090F8E93058 ++:1064100013F0020F2DD023F0020380F8E93028E0BA ++:1064200094F847330BB1012303E0D1F1010338BFE6 ++:10643000002384F84733E1B100230126C4F86C330C ++:1064400084F8453384F846632846FFF7BBFF94F889 ++:106450004333003B18BF012384F8443313B128466B ++:10646000FFF722FC2846FEF79FFB28463146FFF740 ++:106470004DFF70BD70B5D0F8A83000260C4683F8EB ++:10648000466331460546FFF741FF14B12846FFF742 ++:106490000BFC03222846134640F67A01FCF77CF9F0 ++:1064A000284640F2DA6142F208023346FCF774F9FA ++:1064B00070BDC04670B50546D0F8A84016467AB102 ++:1064C00094F8433394F842438C2144EA4304C3696B ++:1064D000146018693AF00ED944EA004434600FE0C1 ++:1064E000CB080DD101F0010384F84233C1F340031E ++:1064F00084F8433394F8423313B90121FFF7BAFF0C ++:1065000070BDC04610B500210446FFF7B3FF20461A ++:10651000FEF74AFB10BDC04610B50122044640F606 ++:106520000501FCF729F920460722052340F22F41F7 ++:10653000FCF732F920463021F8234FF4FF62FCF7D4 ++:106540002BF90623204630210722FCF725F92046A7 ++:1065500040F2144141F61062FCF7F8F8204640F290 ++:1065600015414FF4C862FCF7F1F8204640F2DF41D4 ++:106570004FF47F424FF47743FCF70EF92046FFF7C4 ++:10658000E9FB204602492D22FCF71AF910BDC0464E ++:10659000680E0200002914BF0223002310B5002A50 ++:1065A00018BF43F001030446032240F24D41FCF7BB ++:1065B000F3F8204640F24C410322FCF7DDF810BD11 ++:1065C00010B5044611B91049132219E012220F49DF ++:1065D000FCF7F6F8012100222046FFF7DBFF2046FA ++:1065E0000B490622FCF7ECF8B4F8DA3003F47043F8 ++:1065F000B3F5005F07BF20460649204606491E2224 ++:10660000FCF7DEF810BDC04692080200B808020090 ++:10661000DC080200660A0200E80802002DE9F041E9 ++:1066200004460D46164640F2DA6148F280021F46E3 ++:106630009DF81880FCF7A0F82046FEF7B7F9B8B12E ++:1066400040F652112046FCF775F8FF22C3B240F61F ++:1066500048112046FCF7A0F840F653112046FCF7FD ++:1066600069F840F64911C3B2FF222046FCF794F8BE ++:10667000D4F8A83093F8463573B140F2EB41204688 ++:10668000FCF758F8C0F3402340F2EB4120464FF4AA ++:1066900080629B02FCF780F86B1EFF22204640F2CE ++:1066A00042619BB24FF6FF75FCF776F8AE4201D01F ++:1066B000731E9EB220464FF4C8612A463346FCF74B ++:1066C0006BF8204640F241612A463B46FCF764F8ED ++:1066D000B8F1000F05D0204608490422FCF770F8F5 ++:1066E00009E0204640F23F610122FCF72FF82046E6 ++:1066F0000121FFF765FFBDE8F081C046DE0B020017 ++:106700002DE9F0410C4640F23B410546FCF712F8FA ++:1067100040F23C4107462846FCF70CF8064674B1A7 ++:106720000E2228460F49FCF74BF828460121FFF7B7 ++:1067300047FF28460C490722FCF742F810E028469C ++:106740000A490422FCF73CF8284640F23B413A460D ++:10675000FBF7FCFF284640F23C413246FBF7F6FFD0 ++:10676000BDE8F08186090200980B0200500D02007E ++:106770002DE9F04F0546C5B001910092FDF79AFC56 ++:10678000EB694FF0805118690A4639F093DF052014 ++:10679000EFF3E2F7002328464FF489614FF480427B ++:1067A000FBF7FAFF284640F255414FF4A842FBF7A9 ++:1067B000CDFF284640F25641FBF7BCFF00F00F002A ++:1067C000052809D14FF4A842284640F25541FBF76D ++:1067D000BDFF4FF4807207E045F20142284640F2C7 ++:1067E0005541FBF7B3FFFE22803A521022EAE272D3 ++:1067F000102AA8BF10225100002301F18006C2EB2D ++:10680000060B1F46994698469A464393429340E0AA ++:1068100040F256412846FBF78DFF40F25741C0F346 ++:106820000B142846FBF786FF5E4544EA003021DC66 ++:10683000BAF17F0F1EDC8104890CB1F5005FC8BF7F ++:10684000A1F5804101F50063B3F5805F23D802AB69 ++:1068500023F8191044AB03EB880252F8083C0AF104 ++:10686000010ACB1842F8083C08EB090383F0400901 ++:1068700088F00108C0F3033303F00C0343EA071365 ++:1068800016F0010F9FB203D007F0FF03402B02D197 ++:10689000013E002EBCDCEB69002218694FF08051EC ++:1068A00039F008DF2846FDF7FFFB429B9B1142931E ++:1068B000439B9B11BAF1800F43931DD0002022E02F ++:1068C00041EA801202AB33F9123001315B1B4029DF ++:1068D00003FB0344F4D1013002280FD1009AA3092D ++:1068E0001460019A1360A3F53A63084A183B934277 ++:1068F0008CBF0020012006E00020044642AB53F884 ++:1069000020500021DCE745B0BDE8F08F48F4FF0FD0 ++:1069100070B504460D46FDF7CDFB20226B012046E5 ++:106920004FF49661FBF738FF0023204640F2B14157 ++:106930004FF40072FBF730FFB4F8DA3003F4704321 ++:10694000B3F5005F02D04FF0000E04E0D5F1010E68 ++:1069500038BF4FF0000E002D0CBF2023002343EA68 ++:106960008E13204660224FF48261FBF715FF20460C ++:106970004FF482618022EB01FBF70EFF2046FDF70A ++:1069800093FB70BD2DE9F047044688461746D0F8C2 ++:10699000A890FCF78DFB20460121FFF7B9FF0025E9 ++:1069A0002E460CE0012100222046FDF78BFA3846E6 ++:1069B000EFF3D2F62046FEF78BFA40B285B2F3B27F ++:1069C00001364345EED320460021FFF7A1FF89F8A9 ++:1069D000C052BDE8F087C04670B505460846FEF7D0 ++:1069E000A7F8EB69A02144B2186939F083DE9D3C19 ++:1069F000A4B26FF0610324B29C42B8BF1C46C1B27E ++:106A000062B22846FCF770FD70BDC04673B5D0F881 ++:106A1000A840064694F84233002B00F0DC8094F83E ++:106A20004633002B00F0D780D0F8B030D3F82031B7 ++:106A300013F0010F00F0CF8000230093019394F82E ++:106A40004553002D40F0AA8029462A46FFF76EFAEA ++:106A5000002800F0A380304601A96A46FFF788FEAF ++:106A6000002800F09B80009BC4F86C3394F84633F8 ++:106A7000012B40F0938094F891030199AC46AE4607 ++:106A80001FE045B204EB8502D2F87033994201D37E ++:106A9000002203E0C2F870131946012204EB8503BB ++:106AA000D3F870339C440EF101035FFA83FE431C5C ++:106AB000D8B243B2072BC8BF002012B1019101998F ++:106AC00019E094F990334FFA8EF29A42D9DBF5E748 ++:106AD00043B204EB8303D3F87023C3F87013431C51 ++:106AE000D8B243B2072BC8BF00200EF101038C447B ++:106AF0005FFA83FE11464FFA8EF3072BE8DD019112 ++:106B000094F8902353B2072B05DC002384F89233CA ++:106B1000531C84F8903394F99033082B3ED194F8A9 ++:106B20009433E31893F8972393F8995394F8923396 ++:106B3000FC2B02D8013384F8923394F892339342B9 ++:106B40002CD194F89133013384F891335BB2072B45 ++:106B500002DD002384F8913394F890333046023BF1 ++:106B600084F890336146FEF7DFFF18B93046FEF730 ++:106B70001BF810E094F89333FC2B02D8013384F80F ++:106B8000933394F89333AB4205D194F8943313B90B ++:106B9000013384F89433002384F8923394F8461335 ++:106BA0000023012984F8453303D13046FFF7AEFBBB ++:106BB00003E030461946FFF75DFC3046D4F86C130D ++:106BC000FFF70AFF002384F8473394F89C3313B986 ++:106BD000013384F89C337CBD2DE9F04F0746D0F893 ++:106BE000A800E1B00B9041F22403FB5C0C46002BA3 ++:106BF00000F09C82FB696A21186939F07BDD400056 ++:106C00001FFA80FBBBF1000F00F090823846FEF7C0 ++:106C100085F9FB69024610B91869594684E218697A ++:106C2000594639F067DD012800F080820BF1060338 ++:106C30009BB20C930BF13A039BB20D930BF16E03D5 ++:106C40009BB20E930BF1AA039BB20F93002C00F0A2 ++:106C50005A82384640F2F941FBF76CFD10F0080FFC ++:106C600040F064824CAD38ACAB1C0193A31C039381 ++:106C70003846002340F2764140F2FF12009502941C ++:106C8000FBF7D4FD2B1D0093AB1D0193231D029335 ++:106C9000A31D03933846002340F2774140F2FF12D0 ++:106CA000FBF7C4FD05F10803009305F10A03019306 ++:106CB00004F10803029304F10A030393384640F2F7 ++:106CC000AA4148F2FF1248F27F03FBF7AFFD05F13E ++:106CD0000C03009305F10E03019304F10C0316223B ++:106CE000029304F10E0303933846134640F23B41EE ++:106CF000FBF79CFD05F11003009305F112030193CE ++:106D000004F11003029304F1120346220393384660 ++:106D1000002340F23C41FBF789FDB7F8DA3005F17A ++:106D2000140E03F47043B3F5005F05F11C030A93DE ++:106D300005F11E03099304F11C03089304F11E03DB ++:106D4000079305F12003069304F1200305F11602D1 ++:106D500004F1140104F1160005F1180605F11A08F2 ++:106D600004F1180904F11A0A05F12205059304F14A ++:106D7000220437D1019241F22B0213460291039073 ++:106D800040F24C413846CDF800E0FBF74FFD384665 ++:106D900040F24D4144F22B0244F20A030096CDF832 ++:106DA0000480CDF80890CDF80CA0FBF73FFD089AC1 ++:106DB0000A980999079B0292072200900191039378 ++:106DC0003846134640F2F941FBF730FD0698059925 ++:106DD000072200900291384640F2FA41134601958D ++:106DE000039436E0019241F22B0213460291039084 ++:106DF00040F24C413846CDF800E0FBF717FD38462D ++:106E000040F24D4144F22B0244F222030096CDF8A9 ++:106E10000480CDF80890CDF80CA0FBF707FD0A9A86 ++:106E2000099B089807990092072201930290134644 ++:106E30000391384640F2F941FBF7F8FC069A059BAE ++:106E40000092029301950394384640F2FA410722DA ++:106E5000002324ACFBF7EAFCA31C019310AB012236 ++:106E600002930DF142030721039338461346009421 ++:106E7000FBF748FC231D0093A31D019311AB1022C7 ++:106E800002930DF14603FF21039338461346FBF7A7 ++:106E900039FC04F10803009304F10A03019312ABD7 ++:106EA000042202930DF14A034CAE03933846134675 ++:106EB00040F21F11FBF726FC06F1240338AD0093C6 ++:106EC00006F12603019305F1240340F644020293E0 ++:106ED00005F1260303933846134640F63811FBF7B5 ++:106EE000A5FC06F12803009306F12A03019305F19E ++:106EF0002803029305F12A030393384640F639111B ++:106F000040F6440240F60403FBF790FC04F10C0346 ++:106F1000009304F10E03019313AB012202930DF1D0 ++:106F20004E033A21039338461346FBF7EBFB04F17B ++:106F30001003009304F11203019314AB082202938F ++:106F40000DF152030393384613464FF48D71FBF74E ++:106F5000D9FB04F11403009304F11603019315AB5C ++:106F6000082202930DF15603052103933846134678 ++:106F7000FBF7C8FB04F11803009304F11A03019313 ++:106F800016AB042202930DF15A033A2103933846BB ++:106F90001346FBF7B7FB04F11C03009304F11E0337 ++:106FA000019317AB012202930DF15E030393384660 ++:106FB00013464FF48D71FBF7A5FB06F12C030093EC ++:106FC00006F12E03019305F12C03029305F12E0324 ++:106FD0000393384640F2D74147F2CB0242F24B03CB ++:106FE000FBF724FC04F12003009318AB202202934A ++:106FF0000DF1620382212234039338461346019433 ++:10700000FBF780FB0B98037B827AC17A1B0342F467 ++:10701000007242EA011243F0030343EA820306F1DD ++:107020003002009205F13002323602923235384693 ++:107030004FF49B6147F6FF729BB201960395FBF7F5 ++:10704000F5FBDDF83090DDF834800026FB694CACB0 ++:10705000325B1869494639F06BDBFB6938AD725B0E ++:107060001869414639F064DBFB69A419186909F114 ++:107070000201628839F05CDBFB69AD1908F102019D ++:1070800018696A88043639F053DB342E09F1040993 ++:1070900008F10408DAD1DDF83890DDF83C800026EC ++:1070A000FB6924AC325B1869494639F041DBFB6966 ++:1070B00010AD725B1869414639F03ADBFB69A419DF ++:1070C000186909F10201628839F032DBFB69AD19F8 ++:1070D00008F1020118696A88043639F029DB242E88 ++:1070E00009F1040908F10408DAD1FB690BF1020186 ++:1070F00018690D2239F01CDBFB690BF104011869DA ++:10710000092239F015DBFB690B991A6A18690B9B88 ++:10711000C1F83824B3F83C240BF1E60139F008DB60 ++:10712000FB6959461869012239F002DB61B0BDE8FC ++:10713000F08FC0462DE9F04F8DB007460F220E4666 ++:107140000DF12100B249EAF317F7D7F8A880002221 ++:10715000B04D14016359B34203D001320E2AF7D166 ++:1071600075E3384691210022FBF772FA3846382140 ++:107170000722FBF76DFA0A2238468821FBF768FAE6 ++:10718000D7F8A83093F882251AB138468821FBF742 ++:107190005FFA64192A213846227AFBF759FA30211E ++:1071A00003223846637AFBF799FA91210322384685 ++:1071B000A37AFBF793FAE37A38210F223846FBF7DC ++:1071C0008DFA912100223846FBF742FA3821072236 ++:1071D0003846FBF73DFA237B30210C229B003846D2 ++:1071E000FBF77CFA5E210F223846637BFBF776FAC9 ++:1071F000A37B5E211B01F0223846FBF76FFA6C215E ++:107200003846E27BFBF724FA384638210822FBF7A0 ++:107210001FFA384691210322FBF71AFA0CA98B19A1 ++:1072200013F8102C38465E21FBF712FA012238467B ++:107230007E21FBF70DFA98F8EE231AB13846382173 ++:10724000FBF706FA0722134638462A21FBF746FACF ++:1072500038462C210022FBF7FBF938462A210C2264 ++:10726000FBF7F6F9012238462C21FBF7F1F9D7F8A4 ++:10727000A82092F852352BB338465E2192F8532558 ++:10728000FBF7E6F9D7F8A830384693F854252A21B9 ++:10729000FBF7DEF9D7F8A830384693F855252B21AF ++:1072A000FBF7D6F9D7F8A830384693F856252C21A5 ++:1072B000FBF7CEF9D7F8A83038462D2193F857259B ++:1072C000FBF7C6F9B7F8DA3003F47043B3F5805F23 ++:1072D00004D13846BF21EE22FBF7BAF90222134649 ++:1072E000384640F21F11FBF7F9F90422F721134643 ++:1072F0003846FBF7F3F9F121032200233846FBF768 ++:10730000EDF9F221F82290233846FBF7E7F9A223A2 ++:10731000F321FF223846FBF7E1F9B7F8DA3003F43E ++:107320007043B3F5005F04D1D7F8A83093F818354F ++:1073300006E0B3F5805F06D1D7F8A83093F8193589 ++:10734000012B00F07B82042238469D210023FBF7AD ++:10735000C5F90022079244213846FBF761F940F253 ++:107360002B1101903846FBF75BF94421029007226C ++:107370003846FBF7A5F9384640F22B110E22FBF7F1 ++:107380009FF941F2080357F803A0079B0BB9554634 ++:1073900001E04FEA4A05204B9A4502D84FF0010917 ++:1073A00006E01E4B9A4594BF4FF002094FF00409C6 ++:1073B000B7F8DA3003F47043B3F5005F03D000216F ++:1073C0000591069106E06268032302FB03F2059231 ++:1073D0006A000692124C102221465046FDF7BAF977 ++:1073E000102221462846FDF7B5F91022049009FB2A ++:1073F00004F15046FDF7AEF9B7F8DA30039003F424 ++:107400007043B3F5005F0DD04FF0000B10E0C046A5 ++:10741000C80602001424020080BA8C01007519030A ++:1074200040420F00059802211022FDF793F9834690 ++:107430004F2102223846FBF70BF9CD4B4FEACA0524 ++:1074400009FB03F3B5FBF3F301335B08013B5FFA80 ++:1074500083F85221072238464FEA9803FBF73EF99A ++:1074600008F101065321602238464FEA4813FBF722 ++:1074700035F909FB06F3BF4CB5FBF3F5BE4B2C19F0 ++:10748000B4FBF3F4013CE4B2512122463846FBF749 ++:10749000DFF8039B10221D0158462946FDF75AF9D3 ++:1074A000013406FB04F600FB06F000280BDB58460F ++:1074B00029461022FDF74EF900FB06F0C0130130FB ++:1074C0004010441E0EE0584629461022FDF742F9AE ++:1074D0006FEA080303FB04F300FB03F0C013013061 ++:1074E0006FEA6004C4F3072353210F223846FBF7E9 ++:1074F000F5F85421E2B23846FBF7AAF806999F4BFB ++:107500000A22B1FBF3F30599384601FB02F2B2FB04 ++:10751000F3F803FB1822590802F0010401EB0454AC ++:107520005208B4FBF3F49B0803EB0253B3FBF1F3F3 ++:10753000E41845211F22C8F30713FBF7CFF84FEAE1 ++:107540000813462138464FF4F87203F0F003FBF7B6 ++:10755000C5F8C4F3074346210F223846FBF7BEF8AF ++:107560004721C4F307223846FBF772F84821E2B2FC ++:107570003846FBF76DF8079A41F29416002A08BFC7 ++:107580004FF4FA56A6F5D8760CBF4FF482794FF433 ++:10759000E1794FF4F572033E96FBF2F606FB02F535 ++:1075A00005F52A754FF425636D02B5FBF3F540F23E ++:1075B0007C6405FB04F4A4F55834A4F5C064B4FB62 ++:1075C000F2F4640AC4F3820242EAC6023846422157 ++:1075D00092B2A4B2FBF73CF804F0030204F01F04DB ++:1075E00044EA421238464321FBF732F84FEA492475 ++:1075F0004FF48773B4FBF3F404FB05F4604B640AA7 ++:10760000604AB3FBF4F39A184FF41243B2FBF3F25F ++:107610005D4B02F00F02B3FBF4F3A3F54C23A3F58B ++:1076200000631B0C42EA03123846402192B2FBF77A ++:107630000FF84FF02552554BB2FBF4F2B3FBF4F3C5 ++:10764000A2F546324FF4B841A2F50072A3F56E33AD ++:10765000B2FBF1F2A3F50073B3FBF1F302F00F02FA ++:1076600042EA03123846412192B20BF17444FAF710 ++:10767000EFFF04F590044FF4966394FBF3F4292391 ++:1076800004FB03F44FF45C7308FB03F840F22B5344 ++:1076900006FB03F606F5E46109FB08F00C31102245 ++:1076A000FDF758F804F5D81400EB640090FBF4F0F3 ++:1076B000C0B23C2894BF0025012515B14308043B06 ++:1076C00000E0031FDCB23C213F2223463846FBF793 ++:1076D00005F8AB013C2140223846FAF7FFFFB7F826 ++:1076E000DA3004F1040603F47043B3F5005F05F1EA ++:1076F000010404D1D7F8A83093F8273506E0B3F594 ++:10770000805F19D1D7F8A83093F82835012B13D111 ++:10771000049B40F245105946102203FB00F0FDF790 ++:1077200019F804FB06F39E2100FB03F4C02238463F ++:107730004023FAF7D3FF0BE00499962001FB00F0F9 ++:1077400010225946FDF706F804FB06F300FB03F48C ++:10775000B4F5160FD4BF002501256B1C032203FBD3 ++:1077600002F394FBF3F0B0F5003F11D5002315E0D0 ++:10777000404B4C003F420F0040420F00A0860100EA ++:10778000000068600021F6FF000084A30000302A9A ++:10779000A0F5C033DB130133C3F347033D213F2280 ++:1077A0003846FAF79BFFAB013D2140223846FAF7F5 ++:1077B00095FF284B9A4504D9202238465721134675 ++:1077C00003E03846572120220023FAF787FF224B97 ++:1077D0009A4504D9102238465721134603E038460B ++:1077E000572110220023FAF779FF049AB2F5341FCB ++:1077F00005DD38464A210222FAF762FF04E03846E6 ++:107800004A21FD22FAF74EFF0C2244211346384646 ++:10781000FAF764FF0120EEF39FF73846FEF76AFAA5 ++:10782000019B38464421DAB2FAF712FF029B384630 ++:1078300040F22B11DAB2FAF70BFF08E004229D2187 ++:1078400038461346FAF74AFF0121079183E50DB048 ++:10785000BDE8F08F80BA8C010075190341F208036E ++:107860002DE9F047C4588A4B4FF48475B4FBF3F408 ++:1078700004FB05F41A235721B4FBF3F40646FAF788 ++:10788000CFFE172181463046FAF7CAFE182130464E ++:10789000FAF7C6FE40F20511FB2207463046FAF71A ++:1078A00001FF304604214022FAF70AFF30464FF428 ++:1078B00090711022FAF704FF304657210222FAF79E ++:1078C000FFFE304640F205110422FAF7F9FE304679 ++:1078D0004FF483712A22FAF7BBFEA4B2304640F27D ++:1078E00007116E22FAF7B4FEE2B230462946FAF7E3 ++:1078F000AFFEC4F30422304640F20911FAF7A8FEA5 ++:10790000304640F20511FD22FAF7CCFE30464FF426 ++:1079100083710122FAF7D4FE3220EEF31DF75D4C9D ++:1079200003E00A20EEF318F70A3C30464FF4857165 ++:10793000FAF776FE10F0010F01D1092CF1D1304693 ++:107940004FF48571FAF76CFE10F0010F08D1FAB20E ++:1079500030461821FAF7B4FE4FF00B0847460CE00A ++:10796000304640F20F11FAF75BFE00F01F071D2FA3 ++:107970008CBF4FF00B0807F1020819213046FAF7C7 ++:107980004FFE4FF48371FE2205463046FAF78AFE19 ++:10799000304640F20511FB22FAF784FE304640F2F1 ++:1079A00005110422FAF78CFE304640F2051102223E ++:1079B000FAF786FE30464FF483710122FAF780FE13 ++:1079C0003220EEF3C9F6334C03E00A20EEF3C4F69E ++:1079D0000A3C30464FF48571FAF722FE10F0010F91 ++:1079E00001D1092CF1D130464FF48571FAF718FE18 ++:1079F00010F0010F06D1EAB230461921FAF728FE3D ++:107A0000092506E030464FF48871FAF709FE00F0C8 ++:107A10001F053046FE224FF483716C01FAF742FED7 ++:107A200044EA85243046FB2240F20511FAF73AFE7B ++:107A30002C43304657215FFA89F2FAF709FE3046A7 ++:107A4000224640F63311FAF781FE2246BC02304648 ++:107A500044EA471440F63411FAF778FE304645EA16 ++:107A6000040240F63511FAF771FE304644EA070287 ++:107A700040F63611FAF76AFE48EA4812D205304657 ++:107A800040F63711D20DFAF761FEBDE8F087C04627 ++:107A900040420F008996980070B55B210446FD2294 ++:107AA000FAF700FE204604214022FAF709FE20469C ++:107AB0004FF490711022FAF703FE204678218022BD ++:107AC000FAF7FEFD204640F229110222FAF7F8FDEE ++:107AD000204657210122FAF7F3FD20465B210222BE ++:107AE000FAF7EEFD41F28830EEF336F6154D03E07D ++:107AF0000A20EEF331F60A3D5C212046FAF790FDAC ++:107B000010F0200F01D1092DF2D15C212046FAF7A7 ++:107B100087FD10F0200F03D020465C21FAF780FD8E ++:107B200020465B21FD22FAF7BDFD20465721FE22AB ++:107B3000FAF7B8FD204640F22911FD22FAF7B2FD0E ++:107B400070BDC0468996980070B504460E46002563 ++:107B50006E4B2046E95AFAF763FDA8530235302DE3 ++:107B6000F6D1182220466A49FAF72AFE3A21FB226A ++:107B70002046FAF797FD012220464FF48D71FAF75F ++:107B80009FFD362101222046FAF79AFD10224FF47C ++:107B90008D712046FAF794FD1420EEF3DDF53A21BD ++:107BA00001222046FAF78CFD1420EEF3D5F5B4F847 ++:107BB000DA3003F47043B3F5005F03D120463A2175 ++:107BC000012208E020463A2101220023FAF786FD2F ++:107BD0002046CA2104221346FAF780FD08222046D7 ++:107BE0004FF48D71FAF76CFD25210E222046FAF72D ++:107BF0002FFD252101222046FAF762FDB4F8DA3084 ++:107C000003F47043B3F5805F04D1204628211E227F ++:107C1000082303E0204628211E220C23FAF75EFDEC ++:107C20001420EEF399F5052108222046FAF710FDFD ++:107C300080224FF489712046FAF742FD1420EEF3BA ++:107C40008BF5FF2110222046FAF73AFD442240F23C ++:107C50001F112046FAF734FD1420EEF37DF50B21B9 ++:107C600007222046FAF72CFD102240F2131120467D ++:107C7000FAF726FD1420EEF36FF5072101222046C6 ++:107C8000FAF7E6FC1420EEF367F502230322204600 ++:107C9000FC21FAF723FDFD212046A622FAF7D8FCA5 ++:107CA000442240F21F112046FAF70AFD1420EEF399 ++:107CB00053F5FF2110222046FAF702FD1420EEF3BF ++:107CC0004BF5B4F8DA3003F47043B3F5805F03D1B9 ++:107CD00010492046082202E00F4920460622FAF702 ++:107CE0006FFD20465921CC22FAF7B2FC20465C21D8 ++:107CF0002E22FAF7ADFC20467821D722FAF7A8FC0D ++:107D0000204692211522FAF7A3FC70BDD20402008E ++:107D1000360A0200040B0200140B02002DE9F04F9A ++:107D200004468BB0894609B98B4608E040F2D7413A ++:107D3000FAF700FD01A983462046FDF799FD2022B0 ++:107D400013464FF49A612046FAF726FD6420EEF3BD ++:107D500003F540F276412046FAF7ECFC40F2A641EA ++:107D600080462046FAF7E6FC09A9824608AA204682 ++:107D700007ABFBF7B5F9099F089E079DB9F1000F06 ++:107D800009D0204601A9FDF75BFD204640F2D7410E ++:107D90005A46FAF7DBFC4FEAC850C00D4FEACA5307 ++:107DA00080F48070DB0D00F5FE70033083F4807387 ++:107DB000C01A8010394632462B46FCF7EBFC4000D7 ++:107DC0000BB0BDE8F08FC046F0B5D0F8A85085B034 ++:107DD00095F858340646002B7BD00023019302937C ++:107DE0000393FDF775F8C7B20FB17F2F71D101ABC7 ++:107DF00002AA304603A9FBF773F940F23E61304610 ++:107E0000FAF798FC40F2A641C4053046FAF792FC16 ++:107E1000C005C00DE40DFF288ABFA0F5807300F5F2 ++:107E200080729AB2FF2C84BFA4F5807398B2C2F519 ++:107E3000FE7398BF04F5807003331B18C3F38F00E3 ++:107E4000C7B995F856340133DBB2042B85F85634A4 ++:107E50003FD985F85674029A019B0399FCF79AFC66 ++:107E6000D5F848244310043B9342B8BF1346C5F8E5 ++:107E700044341AE07F2F2CD195F857340133DBB20C ++:107E8000042B85F8573424D9002385F85734029AF7 ++:107E9000019B0399FCF77EFCD5F84424431004337E ++:107EA0009342A8BF1346C5F84834D6F8A8109BB231 ++:107EB000D1F8442430469342A8BF1346D1F8482451 ++:107EC00040F2A7419342B8BF13469BB2FF22FAF794 ++:107ED00063FC05B0F0BDC0462DE9F04F474B87B0BD ++:107EE00003AC80460D4693E8070084E8070040F2A3 ++:107EF00045614046D8F8A8B0FAF71CFC40F246614C ++:107F000087054046FAF716FC3D498605062240469D ++:107F1000FAF756FC00210A464046FDF741F84FF4B7 ++:107F2000FA730193404629462022A3F5FA73009480 ++:107F3000FDF736FFBF0DB60D8246002849D0049DDF ++:107F4000DDF81490039C09EB0503012B02D84FF0D8 ++:107F5000000A3EE02046FBF74BF806464846FBF792 ++:107F600047F8A6F114031AB2002A06DB35FA02F12B ++:107F70003FD0013235FA02F206E0534215FA03F11E ++:107F800037D0D24315FA02F233B2C3F11E0314FA0A ++:107F900003F3C3EB0204A0F10B031BB2002B0A4650 ++:107FA00002DB35FA03F102E05B4215FA03F120D05F ++:107FB00003B2C3F11F0309FA03F394FBF2F493FB3A ++:107FC000F1F004FB1400FBF71FF8A7058605BF0DB1 ++:107FD000B60D404639463246FCF7E2FF40460949B5 ++:107FE0000622FAF7EDFB5046ABF8B872ABF8BA626E ++:107FF00000E0002007B0BDE8F08FC046BC060200DC ++:10800000C20E0200DC0E020070B504460D46C9B176 ++:1080100004221249FAF7D4FBD4F8A83093F8E933D4 ++:10802000A02B05D1204640F64A1140F24F1203E042 ++:10803000204640F64A11A722FAF788FB0849204655 ++:108040000E2201E007490A22FAF7BAFBE369291E6A ++:1080500018BF0121186938F0A7DB70BDBE0D020002 ++:10806000A20D0200D80D020070B50C46062226496A ++:10807000E4B20546D0F8A860FAF7A2FB0C2C01D8B0 ++:10808000002405E041F25013EB561C1E18BF0124DA ++:1080900096F81A35002B31D0284640F64211FAF7EF ++:1080A00049FB14B10F280BD100E0A8B9D5F8F8307E ++:1080B00013F0060F22D196F82C30A3421ED05CB1EB ++:1080C000EB690122D8689968EDF398F728460121F9 ++:1080D000FFF79AFF01230AE0EB690022D86899684C ++:1080E000EDF38CF728460021FFF78EFF002386F87A ++:1080F0002C30284605490C22FAF762FB2846044931 ++:108100000422FAF75DFB70BDB6070200700702009B ++:108110008807020070B50D46B0F8DA101646D0F8A0 ++:10812000A840FAF731FD28B994F84C342B7094F834 ++:108130004D3401E000232B70337070BD2DE9F04702 ++:108140004FF0000886B0054602ABCDF81080CDF8A0 ++:108150000C80CDF8088003AA8A4604A9D0F8A8901C ++:10816000FAF7BEFF28460DF117010DF11602FFF7D1 ++:10817000D1FF9DF8173004990193039A029B0124C3 ++:1081800028460094FCF71AFB9DF816300746019329 ++:108190002846029B0499039ACDF80080FCF70EFB59 ++:1081A00099F8E83306460BB39DF81700B5F902219C ++:1081B000B5F90431B5F906110190284603920293EE ++:1081C00004910094FCF7FAFA9DF8163004460193E6 ++:1081D00028460499039A029BCDF80080FCF7EEFA3A ++:1081E000A742B8BF27468642A8BF0646BAF1010F8C ++:1081F00002D0BAF1030F02D17B10C9F84434AAF1BE ++:108200000203DBB2012B02D87310C9F8483406B060 ++:10821000BDE8F08707B540F25643009340F255425F ++:108220000133FAF7F1FB0EBD2DE9F04340F2DF41D7 ++:1082300089B0D0F8A8400546FAF77CFAC3B27F2B84 ++:10824000A4F84C30C0F30720C4BFA3F58073A4F892 ++:108250004C307F28C8BFA0F58073A4F84E0001AF52 ++:10826000C8BFA4F84E301123039320262A330DF102 ++:1082700018094FF00208284639460493CDF80490B7 ++:10828000CDF808800596FFF7C5FF069B3F2B01D967 ++:10829000803B0693069B2365079B3F2B01D9803BC0 ++:1082A0000793079B40F2344163652846FAF742FA88 ++:1082B000C0B27F28C4BFA0F5807398B284F858007C ++:1082C00040F224412846FAF735FAC0F30720A4F813 ++:1082D0005A0040F225412846FAF72CFA0D23C0B285 ++:1082E000A4F85C00039328460F3339460493CDF875 ++:1082F0000490CDF808800596FFF78CFF069B236459 ++:10830000079B636409B0BDE8F083C0462DE9F041E6 ++:10831000B2F1FF3F8AB0064688461746D0F8A8500B ++:1083200002D1FCF7E1FB47B295F966355FFA88F4B4 ++:10833000013394FBF3F407230393193305930123CB ++:10834000E4B2029301AD07AB0193304604F5A0738C ++:1083500029460493FFF75EFF079BC034C3F307531E ++:108360000793304606AB294601930494FFF752FF6A ++:10837000002107980DF126020DF12203F0F31AF007 ++:108380000021402008AB09AAF0F314F0BDF9223017 ++:10839000BDF920108B4209DABDF92400C91AF0F3A7 ++:1083A000BBF0BDF82240ADF8240009E0BDF926007D ++:1083B000C1EB0301F0F3B0F0BDF82040ADF82600AA ++:1083C000BDF92600BDF92410F0F3B0F023B2032B61 ++:1083D00080B201DD231F01E0C4F104039AB212B29E ++:1083E00008FA02F103B2052003FB0010911E0123DD ++:1083F0008B40013AC018104107FB00F0C0F3CF00DA ++:108400000AB0BDE8F081C04670B5182386B0D0F838 ++:10841000A840039300238022049340F27666203321 ++:1084200005460593314613460292FAF7B5F904F171 ++:108430009C03284601A90193FFF7ECFE40F271610D ++:108440002846FAF777F940F27361A4F89C022846AF ++:10845000FAF770F940F27461A4F89E022846FAF720 ++:1084600069F940F27561A4F8A2022846FAF762F9A8 ++:1084700040F27961A4F8A0022846FAF75BF9314688 ++:10848000A4F8A4022846FAF755F940F2DA61A4F8F4 ++:10849000A6022846FAF74EF940F22551A4F8A802A0 ++:1084A0002846FAF747F994F86735A4F8AA0284F841 ++:1084B000AC324FF48F612846FAF73CF94FF49A61D9 ++:1084C000A4F8AE022846FAF735F940F22451A4F890 ++:1084D000B0022846FAF72EF9B4F86835C0F3C03078 ++:1084E000A4F8B43294F80734A4F8B20284F8B6328F ++:1084F00094F8083484F8B73206B070BD7FB5002315 ++:108500000293103304930DF116030093012301939A ++:10851000694654330393FFF77DFEBDF8160007B09C ++:1085200000BDC0462DE9F84FD0F8A860074696F880 ++:1085300046355BB9FFF7E2FF40F3072340B21FFA6D ++:1085400083F81FFA80F9C246CB4607E0B6F84A85A1 ++:10855000B6F84C95B6F84EA5B6F850B5B7F8DA307F ++:10856000384603F47043B3F5005F0CBFB6F866609D ++:10857000B6F868604FF0FF320121FCF72BFA36B2F3 ++:108580000121324684B23846FCF724FA0021241A2D ++:108590004FF0FF323846FCF71DFA0121324685B212 ++:1085A0003846FCF717FAA4B2C4EB0806B6B2C4EB1F ++:1085B00009042D1AFF2238463346A4B240F6521160 ++:1085C000FAF7EAF83846FF22234640F65311FAF745 ++:1085D000E3F83846FF22334640F65611FAF7DCF846 ++:1085E000ADB23846FF22234640F65711FAF7D4F8C9 ++:1085F000C5EB0A033846FF2240F648119BB2C5EB93 ++:108600000B05FAF7C9F8384640F64911FF22ABB21C ++:10861000FAF7C2F8BDE8F88F2DE9F04F93B00DF1ED ++:1086200026080C46D0F8A8503B49064693464046DB ++:10863000222201AFE9F3A0F4384638492222E9F3B7 ++:108640009BF4BCB10022304640F60F11FAF77EF8D9 ++:1086500095F8E933324AA02B324B14BF052403248A ++:1086600014BF1046184614BF4FF0100A4FF0110AFD ++:10867000B94616E0012230464FF41161FAF766F868 ++:1086800095F8E933284AA02B284B14BF0E240A245E ++:1086900014BF1046184614BF4FF0100A4FF0110ACD ++:1086A000C1460022114604E00B5A013224319B4599 ++:1086B00006D0A2421FFA82F8F6D14FF6FF7416E0F8 ++:1086C0000FFA88F2242302FB03070024254607E063 ++:1086D00035F80910304637F81420FAF737F8023524 ++:1086E00001340AF101039C42F2D11FFA88F43046AA ++:1086F000FCF74AF910B13046FFF714FF3046FCF79B ++:1087000065FD20B2B0F1FF3F0CBF4FF0FF300020FD ++:1087100013B0BDE8F08FC046E20A0200680802000C ++:10872000F826020040220200F4240200AC220200DB ++:108730002DE9F0438BB006460F4691460DF1060039 ++:108740001D492222E9F318F4D6F8A83093F8E9334A ++:10875000A02B14BF4FF010084FF0110817B93D4679 ++:108760003C4619E000252C4609E00DF10603E15ACC ++:108770003046F9F7DFFF013524F80900023445459A ++:10878000F3D10BE00DF10603E15A34F8092030462D ++:10879000F9F7DCFF013502344545F3D13046FCF7EB ++:1087A000F3F810B13046FFF7BDFE17B93046FCF7BD ++:1087B0000DFD0BB0BDE8F0830C0C020030B587B0A6 ++:1087C00005AB0093022301930023029350330C4620 ++:1087D00003936946102315460493FFF71BFDBDF86C ++:1087E00014302380BDF816302B8007B030BDC04652 ++:1087F0007FB50DF11603009301230193013B029312 ++:1088000057330393694610230493FFF703FDBDF824 ++:108810001600000A07B000BD07B540F256430093AA ++:1088200040F255420133FAF7B5F80EBDF0B5B0F895 ++:10883000DA30D0F8A85003F47043B3F5005F0CBFF2 ++:1088400095F8403395F8413387B085F8423395F871 ++:108850004233064685F84333B0F8DA3003F4704308 ++:10886000B3F5005F14D195F8492353B2002B02DD14 ++:1088700085F8482309E0C3691B6D13F4805F01D0BC ++:10888000342300E0302385F8483395F85C3313E057 ++:1088900095F84A2353B2002B02DD85F8482309E0FE ++:1088A000C3691B6D13F0805F01D0342300E03023D7 ++:1088B00085F8483395F85D335BB2002B4CDD03221D ++:1088C000022BA8BF022303FB02F340F2DF41304634 ++:1088D000DFB2F9F72FFFC1B27F29C0F30720C4BF71 ++:1088E000A1F5807399B203B27F2BC8BFA0F5807346 ++:1088F0007AB2C8BF98B292B2C2EB0003C2EB0102D7 ++:10890000DBB202F0FF0242EA0322304640F2DF41CE ++:10891000F9F71CFF0DF116030093022301930F33A7 ++:1089200002930F2303933046082369460493FFF70D ++:1089300071FC9DF81630FAB29B1A8DF816309DF82E ++:10894000173030469B1A69468DF81730FFF764FFE1 ++:1089500030466C46FDF7FEF94FF0FF3385F89A3349 ++:1089600095F84D33002285F8472385F89C23BBB149 ++:1089700085F8422385F84323304640F22341FF32F5 ++:10898000B5F85033F9F708FF30464FF4AA61B5F84F ++:108990006023F9F7DBFE304604490422F9F710FFA3 ++:1089A0003046FCF711F907B0F0BDC046EC0D0200EF ++:1089B0002DE9F04FC3690C464FF08051BBB005461E ++:1089C000D0F8A870164618690A4637F073DE0520FD ++:1089D000EDF3C2F628464FF489614FF4804200233C ++:1089E000F9F7DAFE0122284640F20A511346F9F758 ++:1089F000D3FE0DF1E70334930123359310333693FF ++:108A00000F2337932846082334A93893FFF702FC35 ++:108A10000CB1314612E0B5F8DA3003F47043B3F527 ++:108A2000005F40F03E81EB6997F8BF641B6D13F463 ++:108A3000805F0CBF08210621FF2E00D10E469DF855 ++:108A4000E720032306FB13238DF8E6300DF1E60340 ++:108A500034932846102334A93793FFF7DDFE7300C3 ++:108A6000FE229BB2284640F20A51F9F795FE97F88C ++:108A7000C044FF2C00F0EA80002C00F0C980102CCC ++:108A800028BF1024C4F12403D9B272B24BB29A4267 ++:108A900001DDCEB202E0002E08BF012670B2A04276 ++:108AA000019002DC5FFA86F902E0631C5FFA83F949 ++:108AB00004F1010BC9EB0B035FFA83F80D23369326 ++:108AC000133338934FFA89F35B004FFA88F204931B ++:108AD00009AB03EBC203570003937B1CDBB2079384 ++:108AE0006300013305934FEA4B03029206934FF064 ++:108AF000000A0198049AA042CABF73B2CDF8DCB054 ++:108B00003793379B34A953445B003793039B284624 ++:108B100035923493FFF77EFB07990AE03AA800EB01 ++:108B2000810353F8C42C42F0800243F8C42C8B1C00 ++:108B3000D9B2059A9142F1DD002111E03AAB03EB85 ++:108B4000810203EB870353F8C43C3AA842F8C43CC3 ++:108B500000EB870353F8C03C42F8C03C8B1CD9B2F1 ++:108B6000B942EBDB069A09AB349328464FEA4A0335 ++:108B700034A90AF1250A35923793FFF74DFEBAF171 ++:108B80004A0FB6D1019B4FFA88F2A342C4BF73B219 ++:108B900037934FFA89F335930DF1AE0303EB42039C ++:108BA000D8BFCDF8DCB034931023389328460E2379 ++:108BB00034A93693FFF72EFB0CE03AAE06EB4803E0 ++:108BC00033F83A2C42F4006223F83A2C08F10103FE ++:108BD0005FFA83F8A045F0D9002109E0029E3AA887 ++:108BE00000EB430200EB460333F83A3C22F83A3CF0 ++:108BF0000298CBB201318342F0DB0DF1AE03349326 ++:108C00002846002334A9CDF8D4B03793FFF704FEEB ++:108C100001221346284640F20E51F9F7BDFD4FF4EC ++:108C20007E4263021340284640F20E51F9F7B4FD2C ++:108C3000284640F20F517F222346F9F7ADFD284622 ++:108C400040F20F514FF47E52E3011BE0284640F200 ++:108C50000E5101220023F9F79FFD284640F20E51E4 ++:108C60004FF47E420023F9F797FD284640F20F515A ++:108C70007F220023F9F790FD284640F20F514FF470 ++:108C80007E520023F9F788FDEB694FF08051186997 ++:108C9000002237F00FDD2846FDF75CF83BB0BDE859 ++:108CA000F08F2146CAE6C0462DE9F041D0F8A86011 ++:108CB0000746D6F87C45002505E021463846FFF7F3 ++:108CC000ABFD01351434D6F878359D42F5D3BDE8B7 ++:108CD000F081C046F0B5C369D0F8A85087B0074608 ++:108CE00080219868EDF3F4F7044600286DD0B5F8BC ++:108CF0001C34002603F4807C03F4007E30464FF0E1 ++:108D0000000316F0100206F00101035316D0BEF165 ++:108D1000000F03D0D5F81C34C3F3802116F0080FE0 ++:108D200002D095F81A3408E0D5F8183416F0200F60 ++:108D300014BFC3F3072303F0FF030353BCF1000F79 ++:108D400000D062BB16F0040F09D016F0020F025BD0 ++:108D500002D0D5F80C340EE0D5F80C3418E016F03B ++:108D6000200F06F002030CD0025B13B1D5F81034CB ++:108D700001E0D5F8143409B11B0E0EE0C3F307432C ++:108D80000BE0025B13B1D5F8103401E0D5F81434D0 ++:108D900011B1C3F3072300E0DBB2134303530136E1 ++:108DA0000230402EABD10F230393002304933846A7 ++:108DB000103301A9059302960194FFF72DFDFB697D ++:108DC000214698688022EDF393F707B0F0BDC046C6 ++:108DD0002DE9F041002486B00594D0F8A88006461D ++:108DE000FBF782FE072302931933049307460123FE ++:108DF0002546019316E00BB90C4603E011F0010F74 ++:108E00000FD14C0830467AB2FFF780FA06AB43F830 ++:108E1000040D0093304604F5107369460393FFF781 ++:108E2000FBFC0135802DE9B298F96635E3D17BB1C1 ++:108E300001230193402405AB0093304604F51073E1 ++:108E400069460393FFF7E8FC631CDCB2802CF2D187 ++:108E500006B0BDE8F081C0462DE9F04FB0F8DA3039 ++:108E600089B003F47043B3F5005F07468B46D0F832 ++:108E7000A85002D1B5F8C42304E0B3F5805F08D14F ++:108E8000B5F8C62313B2B3F1FF3F02D01FFA82FA3E ++:108E900001E04FF0700A072304931933069301236E ++:108EA0004FF00009039307AB0293C846CDF8049036 ++:108EB000019B18F0010F0BEB0306F378009303D02E ++:108EC00095F96635002B59D1B7F8DA3003F47043C1 ++:108ED000B3F5005F03D0019B13F80B9012E0B5F8D7 ++:108EE000402413B2B3F1FF3F18BF1FFA82F9B5F85F ++:108EF0003E2408BF4FF00F0913B2B3F1FF3F1CBF70 ++:108F000092B20092B37872781B0443EA022343EAD8 ++:108F10000A6343EA0903079395F9663502AC013306 ++:108F2000B8FBF3F3C033384621460593FFF774FCD2 ++:108F300007AB029395F9663538460133B8FBF3F376 ++:108F400003F5A07321460593FFF764F93279009B7E ++:108F5000120542EA0372079B384623F07F4323F44D ++:108F600070031A43079295F9663521460133B8FB21 ++:108F7000F3F303F5A0730593FFF74EFC019B08F193 ++:108F800001080533B8F1800F019391D195F9663549 ++:108F9000002B36D05E4608F1800896F8423196F8EC ++:108FA00041211B0443EA022302AC43EA0A6343EA79 ++:108FB00009033846214608F180050793CDF814804F ++:108FC000FFF72AFC07AB3846214602930595FFF7C9 ++:108FD00021F996F84421009B120542EA0372079B8F ++:108FE000384623F07F4323F470031A43214608F1E7 ++:108FF0000108079205950536FFF70EFCB8F5A07F2E ++:10900000CBD109B0BDE8F08F10B5B0F8DA30D0F8A8 ++:10901000A82003F47043B3F5005F03D1D2F87415B0 ++:10902000FFF71AFF10BDC0462DE9F043054687B093 ++:10903000D0F8A890002940D0072399F8C272029373 ++:1090400019330493012301934FF0000805AB0093FB ++:109050002AE007F1C003284669460393FFF7DAF8D0 ++:1090600006F1C003284669460393FFF7D5FB07F5D1 ++:10907000A073284669460393FFF7CCF806F5A07362 ++:10908000284669460393FFF7C7FB07F51073284688 ++:1090900069460393FFF7BEF806F510732846694644 ++:1090A0006C460393FFF7B8FB99F8C2325FFA88F673 ++:1090B000B34208F10108CCD20CE0B0F8DA3003F486 ++:1090C0007043B3F5005F02D10449FFF7C5FE28469F ++:1090D000FFF77EFE07B0BDE8F083C04684C90200FA ++:1090E0002DE9F041D0F8A84086B094F907144FF06C ++:1090F000FF3289B20646FFF709F994F9673505464C ++:10910000022B01D0002007E094F90814304689B200 ++:109110004FF0FF32FFF7FAF8072302931933049355 ++:109120000123C0EB05070193304605ABB4F8681581 ++:109130004FF0FF320093FFF7E9F84FF000084FF0CF ++:109140000003C019A4F86A3548BFA4F86A0521E0F5 ++:1091500094F8662512B111F0010F19D1B4F86835F1 ++:10916000B4F96A558B4253B238BFED1B013391FB02 ++:10917000F3F3DBB203F5107330464FF0FF32039385 ++:10918000FFF7C4F8401B059069463046FFF744FBE3 ++:1091900008F10108B8F1800F5FFA88F1D8D194F98D ++:1091A00066357BB10123019305AB0093402404F5A0 ++:1091B0001073304669460393FFF72EFB631CDCB245 ++:1091C000802CF4D106B0BDE8F081C04630B518233C ++:1091D00087B0D0F8A8400393083305936033029317 ++:1091E00000230546049301A904F19C030193FFF7B2 ++:1091F00013FB2846B4F89C2240F27161F9F7A6FAF5 ++:109200002846B4F89E2240F27361F9F79FFA284687 ++:10921000B4F8A22240F27461F9F798FA2846B4F83B ++:10922000A02240F27561F9F791FA2846B4F8A42219 ++:1092300040F27961F9F78AFA2846B4F8A62240F29A ++:109240007661F9F783FA2846B4F8A82240F2DA6189 ++:10925000F9F77CFA2846B4F8AA2240F22551F9F72A ++:1092600075FA2846B4F8AE224FF48F61F9F76EFA1A ++:109270002846B4F8B0224FF49A61F9F767FAB4F8C7 ++:10928000B2324FF40042DB032846134040F224512F ++:10929000F9F782FA94F8AC32284684F86735B4F8C6 ++:1092A000B432A4F8683594F8B63284F8073494F8E8 ++:1092B000B73284F80834FFF713FF07B030BDC0465B ++:1092C0002DE9F04F8DB0039202930BAB0646D0F818 ++:1092D000A8708B4600930DF12F010DF12D030DF1B8 ++:1092E0002E02FCF75BF930460DF12A010AAAFFF7BE ++:1092F00065FA3046FFF702F90723069319330893FE ++:1093000009AB04934FF000080123059381464FF405 ++:1093100050735D46C246079338E097F8662522B140 ++:109320000AEB0B0313F0010F2DD153B2013304AC40 ++:10933000B5FBF3F303F5A073304621460793FEF720 ++:1093400069FF099BBDF828201B0D92051B05920D96 ++:109350001A43BDF82A3030469B059B0D42EA83280C ++:109360002146CDF82480FFF757FACDF8249097F9DD ++:10937000663530460133B5FBF3F303F5E073214660 ++:109380000793FFF749FA01350AF1010A039A95425A ++:10939000C3D997F96635C3B17F2A16D14FF4C0758A ++:1093A00004AC304621460795CDF82480FFF734FA07 ++:1093B00005F18003304621460135CDF8249007930E ++:1093C000FFF72AFAB5F5E07FEAD1029A07EB4203EC ++:1093D000BDF82A20A3F86C20BDF82820A3F87890C7 ++:1093E000A3F872209DF82F3087F87E309DF82E303C ++:1093F00087F87F309DF82D3087F880309DF82C302D ++:1094000087F881300DB0BDE8F08FC0462DE9F04FF0 ++:109410008DB00393C369D0F8A86005460C469868E0 ++:109420004FF480619346EDF353F40746002800F0B3 ++:109430008A80C5F8FC4F28460121FDF769FA96F8A5 ++:109440002C3043B1284641490622F9F7B9F928469C ++:109450000021FEF7D9FDA4B101203D4984EAE47260 ++:10946000A2EBE47200FB01F1B1FBF2F39EB202FB4E ++:1094700006F2431C8A4298B2EFD1B6F5807F01D93B ++:109480005AE00226242304FB03F349F6404293FBEF ++:10949000F2F300241B04642293FBF2FAA146A046D7 ++:1094A0002EE048460AA9F9F72FFD0B9B03FB0BF3AF ++:1094B000002B04DBDB130133C3F3490206E05B42FC ++:1094C000DB1301335B105B429A05920D0A9B03FB91 ++:1094D0000BF3002B04DBDB130133C3F3490306E07A ++:1094E0005B42DB1301335B105B429B059B0D43EA40 ++:1094F000822347F82830631CD1449CB208F101084C ++:10950000B442CED1062228461249F9F759F915235B ++:10951000079300240B33284605A90993059706965F ++:109520000894FFF779F9039B2846009331464FF6DC ++:10953000FF722346FDF772F8EB69394698684FF4DD ++:109540008062EDF3D5F30DB0BDE8F08FCE070200D9 ++:10955000005A6202C207020030B587B005AB009323 ++:1095600001230193173302930833002204934FF42D ++:109570000023054603920593144628466946FFF7E3 ++:109580004BF9039B01330393631CDCB2802CF4D1B1 ++:1095900007B030BDF0B5D0F8A83087B093F89A2561 ++:1095A0000746002A2DD1324B324D1E68144605E085 ++:1095B00029463846FFF730F901341435B442F7D163 ++:1095C0002D4A002453683846019310230293082340 ++:1095D00004931368694600930394FFF71DF9FB6930 ++:1095E0001B6B082B0DD1254A3846536869460193F9 ++:1095F000122302930E330493136803940093FFF72E ++:109600000BF9102304930DF1160300934FF072032E ++:1096100008260125ADF81630384600236946039325 ++:1096200002960195FFF7F8F84FF082033846694635 ++:10963000ADF816300395FFF7EFF84FF006036946D3 ++:109640003846ADF816300396FFF7E6F83846FFF7D0 ++:10965000DBFC3846FFF728FB3846FFF73BFB384674 ++:10966000FFF7B6FB38466C46FFF776FF07B0F0BD54 ++:10967000F8100200D4150200181D0200F41C0200AC ++:1096800070B5B0F8DA30054603F47043B3F5005F07 ++:10969000D0F8A8200CD192F9F133B3F1FF3F37D1C4 ++:1096A000B2F9F833B3F1FF3F32D1B2F92C352CE0E7 ++:1096B000B3F5805F35D192F95B35B3F1FF3F27D128 ++:1096C00092F9F333B3F1FF3F22D192F95C35B3F154 ++:1096D000FF3F1DD1B2F90034B3F1FF3F18D1B2F909 ++:1096E0003035B3F1FF3F13D1B2F90234B3F1FF3F8C ++:1096F0000ED1B2F93435B3F1FF3F09D1B2F90434D8 ++:10970000B3F1FF3F04D1B2F93835B3F1FF3F08D0D0 ++:10971000012482F86645102228464FF49A611346C8 ++:1097200007E0002482F8664528464FF49A6110222B ++:109730002346F9F731F84FF48F6103222346284678 ++:10974000F9F72AF82846FFF725FF2846FBF7E2FF3E ++:109750002846FCF7E1FE2846FFF768F870BDC046D2 ++:1097600010B5002388B00593103307930DF106035D ++:10977000039301230446ADF80610049303A9543360 ++:109780000693FFF749F82046FBF7FEF810B1204694 ++:10979000FEF7C8FE08B010BD2DE9F041D0F8A87062 ++:1097A0000646002419E0B6F8DA3003F47043B3F546 ++:1097B000805F07D1A218137923B1890492783046CB ++:1097C000890C07E06B4BE21853792BB18904D278EE ++:1097D0003046890CF8F73CFF0634664A4FF6FF73B3 ++:1097E000A15A9942DFD1304673210022F8F730FFA9 ++:1097F000304632216A22F8F72BFF192230463321F6 ++:10980000F8F726FF97F8EC231AB130463321F8F722 ++:109810001FFFC2216F223046F8F71AFF9021102255 ++:109820003046F8F715FF102100223046F8F710FFF8 ++:109830009B2107223046F8F70BFF1D2102223046FC ++:10984000F8F706FF1E2106223046F8F701FF3046E2 ++:1098500040F2EA4144F28862F8F778FFB6F8DA306D ++:1098600003F47043B3F5005F0DD197F8E933B6F810 ++:10987000DE1FA02B14BF022204220BB2B3F1FF3F64 ++:109880000DD0CAB20BE0B3F5805F07D1B6F8E02F78 ++:1098900013B2B3F1FF3F01D0D2B200E0022253B2C3 ++:1098A0001FFA83F807224346304640F2EB41F8F7AF ++:1098B00073FFB6F8DA3003F47043B3F5005F05D0F8 ++:1098C000B3F5805F04D197F83B350BB9002400E075 ++:1098D00001242346254624010F22A4B2304640F23B ++:1098E000F241F8F759FFF0222346304640F2F241A8 ++:1098F000F8F752FF0F22304640F2F1412B46F8F7BD ++:109900004BFFF0222346304640F2F141F8F744FF86 ++:109910004FEA0823304640F2F2414FF4E06203F48C ++:109920007F43F8F739FFB6F8DA30304603F4704376 ++:10993000B3F5805F0CBF03F53B7341F2EA23F45AA1 ++:1099400040F2EB41630203F47E434FF40072F8F7F8 ++:1099500023FFB6F8DA3003F47043B3F5805F0BD021 ++:1099600041F23433F25A13B2B3F1FF3F04D0930201 ++:1099700003E0C046EC260200A3024FF4806203F429 ++:109980007C43304640F2EB41F8F706FF40F2EB41F2 ++:109990003046D6F8A840F8F7CDFEC0F3802084F812 ++:1099A000470540F2EB413046D6F8A840F8F7C2FE32 ++:1099B000C0F3402084F84805D6F8A820304692F835 ++:1099C000481592F847355B1A18BF012382F84635CF ++:1099D000FAF7ECFF830203F47C43304640F646116D ++:1099E0004FF48062F8F7D8FE304643490622F8F774 ++:1099F000E7FE41F21D23F35C2BB10F2230467721A5 ++:109A00001346F8F76BFE30460021FFF7A9FE97F8E2 ++:109A10009A352BB93046FEF73FF83046FDF71EFF6A ++:109A2000F3697A21186936F065DE97F8EC23400077 ++:109A300084B22AB124B1F369A11C186936F078DE2A ++:109A400097F8ED232AB124B1F3692146186936F05D ++:109A50006FDE97F8BB34DBB104221346304640F288 ++:109A60001D11F8F73BFE30469F213F2297F8BC348A ++:109A7000F8F734FE30469E213F2297F8BD34F8F7C0 ++:109A80002DFE304677210F2297F8BE34F8F726FED8 ++:109A9000B6F8DA3003F47043B3F5805F29D197F953 ++:109AA000583533B3B42124223046F8F7D1FDB7211D ++:109AB00024223046F8F7CCFD0322B8213046F8F7CF ++:109AC000C7FD97F95825022A07D13046B821F8F783 ++:109AD000BFFD3046B521012209E0032A09D13046F5 ++:109AE000B821013AF8F7B4FD3046B5210022F8F765 ++:109AF000AFFDBDE8F081C046C604020010B5FFF717 ++:109B00004BFE10BD70B50026D0F8A850C0F8FC6F11 ++:109B100095F82C3004463BB12A490622F8F750FE4E ++:109B200020460121FEF770FA204640F24461F8F722 ++:109B300001FE10F0010309D020463146FCF740FD3C ++:109B40000222204640F23F61134607E010F0020F68 ++:109B500006D0204640F253414FF40042F8F71CFE75 ++:109B6000204619490922F8F72BFE20460021FCF770 ++:109B7000CFFE2046FAF71AFF30B12046FEF7BEFCB2 ++:109B800001462046FFF7ECFD95F8473520469B023D ++:109B900003F47C4340F2EB414FF48062F8F7FCFDA4 ++:109BA000B5F84E356BB1204640F64811FF22F8F764 ++:109BB000F3FD204640F64911FF22B5F85035F8F77D ++:109BC000EBFD70BDE60B0200F20B020070B50C4617 ++:109BD00088B00546F9F720F944B92846FFF792FF07 ++:109BE00028462146FCF794FE204622E028462146DE ++:109BF0000122FAF789F8064608B1012019E0284643 ++:109C00000121FCF785FE0C4B40240393152305939B ++:109C10002846102303A9079304940696FEF7FCFD3B ++:109C2000284621464FF6FF7233460096FCF7F6FCB5 ++:109C3000304608B070BDC0469A21020070B50023BE ++:109C400086B002931033049305AB009302230446BD ++:109C5000ADF8141001930D464E3369461646ADF823 ++:109C600016200393FEF7D8FD2046FAF79FFE78B33F ++:109C7000204640F6461140F2FF322B46F8F78CFDA5 ++:109C8000204640F6471140F2FF323346F8F784FD94 ++:109C900020464FF4156140F2FF322B46F8F77CFD69 ++:109CA000204640F6511140F2FF323346F8F774FD7A ++:109CB000204640F6541140F2FF322B46F8F76CFD77 ++:109CC000204640F6551140F2FF323346F8F764FD66 ++:109CD00006B070BD2DE9F04F8DB004910392D0F81D ++:109CE000A860074606EB4303B3F872B0B3F86C10F4 ++:109CF000B3F878905A460591FFF7A0FF38464946D9 ++:109D0000FFF72EFD0723089319330A934FF000083D ++:109D10000123049D0793C2460BAB069337E096F8E8 ++:109D200066252AB104990AEB010313F0010F2BD128 ++:109D300053B2013306ACB5FBF3F303F5A073384619 ++:109D400021460993FEF766FA0B9B05994FEA8B5261 ++:109D50001B0D1B05920D1A438B059B0D42EA8328B0 ++:109D600038462146CDF82C80FEF756FD96F966352B ++:109D700038460133B5FBF3F303F5E073214609934D ++:109D8000CDF82C90FEF748FD01350AF1010A039A3F ++:109D90009542C4D996F96635C3B17F2A16D14FF4DE ++:109DA000C07506AC384621460995CDF82C80FEF7E3 ++:109DB00033FD05F18003384621460135CDF82C905E ++:109DC0000993FEF729FDB5F5E07FEAD196F8810009 ++:109DD00096F87E1096F87F2096F8803000903846EE ++:109DE000FBF7DEFC0DB0BDE8F08FC04670B500217A ++:109DF0000446D0F8A8500B467F22FFF76BFF2046A1 ++:109E0000FFF7E4F92046B5F8B812B5F8BA22FBF727 ++:109E1000C7F8204640F2D16104220023F8F7BCFCC9 ++:109E200070BDC04670B50446D0F8A8300D4699B153 ++:109E300093F8BC3233B3FFF7D9FF20460422002346 ++:109E400040F2D161F8F7A8FC8022204640F276610A ++:109E50001346F8F7A1FC15E00422134640F2D16145 ++:109E6000F8F79AFC8022204640F276612B46F8F7FC ++:109E700093FC20462946FFF773FC204629462A46D4 ++:109E8000FFF7DCFE70BDC04630B500238BB00893F1 ++:109E9000079306930733054603930A4609B90491CD ++:109EA00002E04FF4307304932023059309AB019330 ++:109EB000012302933AB9284608A907AA06ABF9F785 ++:109EC0000FF9002409E0B5F902310793B5F904311F ++:109ED0000693B5F906310893F3E70899069B2046E7 ++:109EE000079AFAF757FC01A909902846FEF794FC57 ++:109EF000049B01340133802C0493EED10BB030BDB0 ++:109F0000F0B5284B8BB005AC05460F460FCB84E867 ++:109F10000F0041F22403EB5CD5F8A8601BB196F862 ++:109F2000E034002B3BD028461F490822F8F748FCB4 ++:109F3000072302931933049304230193009403F538 ++:109F40004F7301240393284686F86A406946FEF75A ++:109F500063FC0023099309AB019400934FF45174FF ++:109F6000284669460394FEF757FC013440F25E33FD ++:109F70009C42F5D128460D491222F8F721FC7B00BE ++:109F80009BB2284640F2A94140F2FF12F8F704FCC8 ++:109F9000284640F2A36110220023F8F7FDFB0BB026 ++:109FA000F0BDC04668050200620C020054090200C0 ++:109FB00030B5D0F8A8509BB004460022A31893F9FE ++:109FC000103501A95B4241F822300132142AF5D143 ++:109FD00095F86A3063B907331793193319931591BC ++:109FE00003F54873204615A916921893FEF714FC42 ++:109FF000D4F8A81094F82936D1F844242046934286 ++:10A00000A8BF1346D1F8482440F2A7419342B8BFF5 ++:10A0100013469BB2FF22F8F7BFFB95F8E833F3B184 ++:10A02000B5F8E62394F8293620469B1A1B024FF414 ++:10A030007F42134040F2D141F8F7AEFB94F8292655 ++:10A0400095F825352046C3EB420395F8E62340F208 ++:10A05000D1419B1A5BB2FF229BB2F8F79DFB2046D1 ++:10A06000FAF7A6FB1BB030BD70B5C6B001ACD0F896 ++:10A07000A8500646002120464FF48072E7F3E0F72F ++:10A080000723439319334593419495F86A3043B9B4 ++:10A090001E33429330464FF4507341A94493FEF768 ++:10A0A000BBFB402342933046DB1841A94493FEF7A3 ++:10A0B000B3FB46B070BDC0462DE9F04106460C46E4 ++:10A0C000FAF72CFF214605463046FAF74FFC2946A1 ++:10A0D00004463046FAF74AFC4022B4F5404F0CBF24 ++:10A0E00013460023054640F2DA613046D6F8A870E0 ++:10A0F000F8F752FB1022B4F5404F14BF134600236B ++:10A10000304640F2A361F8F747FB0122B4F5404F17 ++:10A1100014BF00230123304640F26E41F8F73CFBA8 ++:10A12000A54200F09580B5F5404F02D13046FFF7CB ++:10A130009BFFB4F5404F3CD13046FFF739FFD6F8CE ++:10A14000A8203B8E92F966255B00013293FBF2F367 ++:10A15000304640F2A44140F2FF129BB2F8F71CFBDC ++:10A160007B8E30461B0240F2A5414FF4E06203F4BF ++:10A170007F43F8F711FB04223046002340F21F1101 ++:10A18000F8F7ACFAF369E021186936F0B3DA002188 ++:10A19000F8853046FAF7A2FF4FF0FF3387F83430E6 ++:10A1A000304640F2A9414FF400420133F8F7F4FA87 ++:10A1B00003E030460121FAF791FF304640F2A44116 ++:10A1C0004FF460422346F8F7E7FAB4F5404F0FD159 ++:10A1D0003046FAF7EBFB40F2A44100280CBF4FF4E5 ++:10A1E000005300234FF400523046F8F7D5FA15E03B ++:10A1F0004EF201039C4211D13046FAF717FB01469B ++:10A200003046FFF77DFE304640F2A941F8F792FA5A ++:10A210000223C0B290FBF3F087F8C10297F96735CB ++:10A22000012B0DDD40F2A4413046F8F783FAC0F36C ++:10A23000803340F2255130464FF40042DB0305E005 ++:10A24000304640F225514FF400420023F8F7A4FABB ++:10A25000BDE8F08170B50023D0F8A82080F82B3637 ++:10A2600092F8E03405468BB190F92A16D2F84834BA ++:10A27000994203DBD2F81035994207DA4EF2010118 ++:10A28000FFF71AFF012385F82B3612E041F2240371 ++:10A29000EB5C73B12846FAF741FE002104462846DC ++:10A2A000FFF70AFF2846FFF783FE28462146FFF7FF ++:10A2B00003FF70BD30B5072389B0D0F8A8400393E1 ++:10A2C0001933059306AB0193012302930546013B25 ++:10A2D000049308E0284601A9FEF79EFA049B013387 ++:10A2E0000493069B01330693069B7F2BF2D94FF410 ++:10A2F00030730493A3F5307308E0284601A9FEF7F4 ++:10A300008BFA049B01330493069B01330693069B4F ++:10A310007F2BF2D9092228465B49F8F751FA01212F ++:10A320002846FBF7A3FB242228465849F8F748FAA9 ++:10A330002846FAF75FFDC0F34F00E62801DDFF2352 ++:10A3400005E02846FAF756FD4008193083B2FF228F ++:10A3500040F2A5412846F8F71FFA2846FFF784FE89 ++:10A36000B4F8E623B4F8E433284603EB42039B0138 ++:10A370009BB24FF49A6147F6C072F8F70DFA0922C2 ++:10A3800028464349F8F71CFAB5F8DA30282103F4D7 ++:10A3900070431E22B3F5005F14BF18231C23284608 ++:10A3A000F8F79CF901223A2113462846F8F796F966 ++:10A3B0000822134628464FF48D71F8F78FF92521AE ++:10A3C0000C222846F8F744F9B5F8DA3003F4704364 ++:10A3D000B3F5005F04D1022228463A21134603E078 ++:10A3E00028463A2102220023F8F778F9082213467A ++:10A3F00028460521F8F772F9284606222549F8F77C ++:10A40000DFF947F20802284640F2D7414FF40053E3 ++:10A41000F8F7C2F92846FAF7EDFC102305930DF181 ++:10A420001E03019301230824ADF81E000293284661 ++:10A43000053301A904930394FEF7EEF928460F2291 ++:10A440001549F8F7BDF928463521FF220023F8F712 ++:10A4500045F92846362103220023F8F73FF928461C ++:10A46000224623464FF48D71F8F738F94FF4806295 ++:10A47000284640F2A4411346F8F78EF92846FBF728 ++:10A480008DFA09B030BDC046C60D02009A05020023 ++:10A49000A4070200F40D0200000E02007FB50902BD ++:10A4A00006AB23F8021D009301230193013B0293A5 ++:10A4B00057330393694610230493FEF7ADF907B0B1 ++:10A4C00000BDC0462DE9F041D0F8A8308AB083F82D ++:10A4D000341083F8C11293F9663506460F466BB106 ++:10A4E00011F0010304D04FF48F610C22082302E025 ++:10A4F0004FF48F610C22F8F74FF97F08072303937D ++:10A5000001AC07F5A07320254FF0010804933046F5 ++:10A5100009AB214601930595CDF80880FDF77AFE39 ++:10A5200007F1C003049330460DEB05032146019368 ++:10A530000595FDF76FFE089B304603F0FF02ADF86E ++:10A540001820C3F30722C3F30743ADF81C30099B5F ++:10A5500006A9C3F30273ADF81A20ADF81E30FAF75E ++:10A56000F5FD09993046C1F30751FFF797FF3046D3 ++:10A570004146FAF7B3FD0AB0BDE8F0812DE9F04F8E ++:10A5800091B0BDF8783002AC0193BDF87C3007463D ++:10A590000093534B9DF880601D460FCD0FC495E886 ++:10A5A0000F009DF8748084E80F0038464D4904225E ++:10A5B000BDF87090BDF884A0BDF888B0F8F700F938 ++:10A5C000384640F2A36102227300F8F7E5F8B8F1CB ++:10A5D000000F18D010AB4FF4002243F8042D0A935B ++:10A5E00001230B9317330C9308330E9300230D9321 ++:10A5F0001C4638460AA9FEF70FF90D9B01340133BA ++:10A60000402C0D93F5D1032409FB04F43846FAF7E6 ++:10A61000EBFE0134384640F2A1615246F8F796F855 ++:10A62000A4B2384640F2A2615A46F8F78FF82246A3 ++:10A63000384640F27E61F8F789F838462A49042204 ++:10A64000F8F7BEF80134142304FB03F4013CA2B272 ++:10A6500038464FF4C861F8F779F80022384640F2DE ++:10A660007761F8F773F808230B930D330C930B33D2 ++:10A6700000240E93384602AB0AA90A930D94FEF704 ++:10A68000CBF8384640F27B61019AF8F75FF838461C ++:10A6900040F27C61009AF8F759F82246384640F2B9 ++:10A6A0007D61F8F753F821463846FFF7F7FE384644 ++:10A6B0000E490422F8F784F80D4C03E00A20ECF36D ++:10A6C0004BF00A3C384640F27661F8F733F810F068 ++:10A6D000010F01D0092CF1D111B0BDE8F08FC046B7 ++:10A6E000B80C0200780B02008A0802001E0E02005D ++:10A6F00049420F002DE9F043D0F8A8908BB00646F0 ++:10A700008846052503270F2DA8BF0F250024ABB2CF ++:10A71000019330460121224623460094029403947B ++:10A720000494FAF75BFDDB2302934FF4AF630493C9 ++:10A730004FF482430593A3F58143012207933046EA ++:10A740002146234600940194039206940894FFF74F ++:10A7500015FFB8F1000F1DD140F2BA613046F7F78E ++:10A76000E9FF40F2BB6104B23046F7F7E3FFA40112 ++:10A77000A4B244F3891404FB04F440F3090000FB81 ++:10A780000043B3F5005F01DAED1B03E0B3F5804F42 ++:10A7900004DBED1917B17B1EDFB2B4E7092D01DD33 ++:10A7A000092501E025EAE5752846C9F838500BB0BF ++:10A7B000BDE8F0832DE9F043D0F8A8608DB096F99C ++:10A7C000663507468846CCB2D3B1634B01EA030332 ++:10A7D000002B05DA013B6FEAC3736FEAD3730133D1 ++:10A7E000012B04D14FF48F610C22073303E04FF4A7 ++:10A7F0008F610C220023F7F7CFFF022398FBF3F8B9 ++:10A80000072386F8344086F8C14201AD039308F56A ++:10A81000A07320244FF00109049338460BAB29465E ++:10A8200001930594CDF80890FDF7F4FC08F1C003FE ++:10A83000049338460AAB294601930594FDF7EAFCD8 ++:10A840000A9B384603F0FF02ADF81820C3F3072235 ++:10A85000C3F30743ADF81C300B9B06A9C3F3027387 ++:10A86000ADF81E30ADF81A20FAF770FC9DF82B10E9 ++:10A87000384601F07F01FAF71DFC0B993846C1F309 ++:10A880000751FFF70BFE38464946FAF727FC0B9AAB ++:10A890003846C2F389219205920DFFF7CFF908F5EA ++:10A8A000E0730493384609AB29460193FDF7B2FCE7 ++:10A8B0003846BDF82410FEF753FF08F510730493D3 ++:10A8C00038460DEB040329460193FDF7A3FC089BD2 ++:10A8D0003846DB009BB240F2A66141F6FF72F7F703 ++:10A8E0005BFF96F967354B4532DD40F2255138461E ++:10A8F000F7F720FF4FF48072C3B29845D4BF00240D ++:10A90000012438469845CCBF1346002340F2255118 ++:10A91000F7F742FF6302384640F225514FF40072C8 ++:10A9200003F47E43F7F738FFA302384640F225517F ++:10A930004FF4806203F47C43E402F7F72DFF3846BE ++:10A9400040F225514FF4006204F47843F7F724FFF6 ++:10A950000DB0BDE8F083C0460100008070B504462C ++:10A960000D460021FFF7A8FB20462946FFF722FFEE ++:10A9700070BDC0462DE9F04F89B0054600920191A7 ++:10A98000FAF7CCFA40F23B4103902846F7F7D2FEA3 ++:10A9900004A902902846FAF70FFA00244FF47A70BF ++:10A9A0000134EBF3D9F6022CF8D141F2F023EA5846 ++:10A9B00092F820301F1E18BF012792F821300BB1EA ++:10A9C0007B1C9FB292F822300BB17B1C9FB292F895 ++:10A9D00023300BB17B1C9FB24FF00009C8464FF0EB ++:10A9E000140ABCE0D5F8B030D3F8203183F001036D ++:10A9F00013F0010403D1EB69186935F0CBDE28466A ++:10AA0000F8F756FB41F2F023EB58284603EB4803D6 ++:10AA1000998CFFF7A3FF28465146FFF73FFD1CB96D ++:10AA2000EB69186935F0A2DE4FF40042284640F287 ++:10AA3000A4411346F7F7B0FE002441F288300134F8 ++:10AA4000EBF38AF6032CF8D1284640F2A641F7F73B ++:10AA500071FEC005C00DFF2886BFA0F580731FFAE8 ++:10AA600083FB00F5807B00263446284640F23E6199 ++:10AA7000F7F760FE631CC005C00D9CB23618102CA1 ++:10AA8000F3D1C6F30F13FF2B8CBFA3F5807303F52F ++:10AA90008073504600210DF11E029EB20DF11A0383 ++:10AAA000EDF388F441F2F023EB580021434493F88E ++:10AAB000200007AA06ABEDF37DF4BDF91A30BDF90D ++:10AAC00018108B4209DABDF91C00C91AEDF324F500 ++:10AAD000BDF81A40ADF81C0009E0BDF91E00C1EB3D ++:10AAE0000301EDF319F5BDF81840ADF81E00BDF9EE ++:10AAF0001C10BDF91E00EDF319F523B2032B81B232 ++:10AB000001DD231F01E0C4F1040398B200B2431E2B ++:10AB100001229A4009B2052301FB032353FA00F0F6 ++:10AB200000F10C03182B16D841F2F023EB58019AD0 ++:10AB300003EB88031B69C31802F809304FEA9B0333 ++:10AB4000C3F17F03009A03EB960302F8093009F181 ++:10AB500001031FFA83F908F101031FFA83F8B845CE ++:10AB6000FFF440AF0AF101035FFA83FABAF1640F10 ++:10AB700002D84FF00008F2E7029B2846C3F3801189 ++:10AB8000FAF7ACFA284604A9FAF7E0FA284603993E ++:10AB9000FFF792FA484609B0BDE8F08F2DE9F04F73 ++:10ABA0001E46C369A9B0D0F8A88004460F4698682D ++:10ABB0004FF483711546ECF38BF00790002800F0FA ++:10ABC000EF81022E0FD016E00E4694F8DA3011F81D ++:10ABD0000629013D9A420BD17188B2882046FAF7C6 ++:10ABE000DFF90126CCE1062305FB03F3063BF91848 ++:10ABF000002DE9D1C3E1012E40F0C1812046FAF7D2 ++:10AC00008DF9002108902046FFF756FA0025934B56 ++:10AC10002046E95AF7F704FD1AABE8520235182D21 ++:10AC2000F5D140F231612046F7F784FD15220B90F3 ++:10AC300040F231612046F7F79FFD40F24C4120463B ++:10AC4000F7F778FD40F24D410C902046F7F772FD82 ++:10AC50004FF496610D902046F7F76CFD40F2B1413C ++:10AC60000E902046F7F766FD40F2F9410F9020461E ++:10AC7000F7F760FD40F2FA4110902046F7F75AFDD1 ++:10AC800040F6381111902046F7F754FD40F639117F ++:10AC900012902046F7F74EFD40F23B4114902046BB ++:10ACA000F7F748FD40F23C4115902046F7F742FD8A ++:10ACB00040F2DA6116902046F7F73CFD40F2DB6186 ++:10ACC00018902046F7F736FD40F2B741199020461C ++:10ACD000F7F730FD40F23B4113902046F7F72AFD8D ++:10ACE000C0F380100A9008B9099007E0204626A911 ++:10ACF000FAF762F898F8C182CDF82480204632999C ++:10AD0000FFF72CFE062220465549F7F759FDB4F807 ++:10AD1000DA3003F47043B3F5005F04D12046982184 ++:10AD20000322F7F795FC20464E491922F7F748FD14 ++:10AD300020464D491822F7F743FDB4F8DA304FF0BA ++:10AD4000030B03F47043B3F5005F14BF0423002327 ++:10AD5000179322E11FFA88F300931FFA89F3002664 ++:10AD600001931FFA8BF3324602932046179B31461C ++:10AD700003960496FAF732FA20460121FAF742F9CF ++:10AD80003346204639493C22FEF740FB20464FF42B ++:10AD900089713246F7F75CFC20AB00934FF4FA7AE6 ++:10ADA00020464FF4806120223346CDF804A0FAF704 ++:10ADB000F7FF054620B92E48F6F776FC2F4636E019 ++:10ADC0003346204629497822FEF720FB20464FF4DF ++:10ADD00089713246F7F73CFC23AB009320464FF4D1 ++:10ADE000806120223346CDF804A0FAF7D9FF18B9C4 ++:10ADF0002048F6F759FC1AE0219A24982299B0EBE2 ++:10AE0000420F0ED993009B1898420AD2259AB2EBB2 ++:10AE1000410F06D98B005B189A422CBF00270127EF ++:10AE200000E00027B8F1010801D3002F92D0B9F15A ++:10AE3000010902D3002F00F0AC80BBF1010B02D35B ++:10AE4000002F00F0AA80204640F2D16104220023A6 ++:10AE5000F7F7A2FC87B93E4614E0C046020502009F ++:10AE60001A05020026050200FA05020080841E0071 ++:10AE7000EC0602000607020020464FF48061FDF751 ++:10AE80002BF806462046FEF73DFE204640F2316193 ++:10AE90000B9AF7F75BFC204640F24C410C9AF7F70F ++:10AEA00055FC204640F24D410D9AF7F74FFC2046E5 ++:10AEB0004FF496610E9AF7F749FC204640F2B141F3 ++:10AEC0000F9AF7F743FC204640F2F941109AF7F742 ++:10AED0003DFC204640F2FA41119AF7F737FC204634 ++:10AEE00040F63811129AF7F731FC204640F6391136 ++:10AEF000149AF7F72BFC204640F23B41159AF7F7DE ++:10AF000025FC204640F23C41169AF7F71FFC2046EC ++:10AF100040F2DA61189AF7F719FC204640F2DB613B ++:10AF2000199AF7F713FC204640F2B741139AF7F746 ++:10AF30000DFC204640F24C4104220023F7F72CFC84 ++:10AF40000025194B2046E95A1AABEA5A0235F7F7A1 ++:10AF50007FFB182DF5D10A9B23B120460999FFF7F5 ++:10AF6000FDFC03E020460A99FAF7B8F82046089954 ++:10AF7000FFF7A2F820460021FAF744F800E0002687 ++:10AF8000E369079998684FF48372EBF3B1F63046A2 ++:10AF900006E000274FF00608DCE64FF00409F8E76A ++:10AFA00029B0BDE8F08FC046020502002DE9F04F40 ++:10AFB000B3B00F939DF8F8409DF8F4300D940E93C4 ++:10AFC0009DF800419DF8FC300B940C93012405463C ++:10AFD0001646D0F8A89088469DF8F0B0BDF80471E8 ++:10AFE0008DF8C7408DF8C640FDF702FC40F2D7410E ++:10AFF00012902846F7F79EFB40F2D7411090284662 ++:10B00000F7F798FB3449119006222846F7F7D8FB4A ++:10B01000284632490F22F7F7D3FB284621461AAAC1 ++:10B02000FDF786FB284621460022FDF7F5FABBF125 ++:10B03000000F02D00023199318E028462146FBF7A1 ++:10B0400067FCD5F8B030D3F8203183F0010313F05A ++:10B05000010319930AD1EB69B821186942F2107201 ++:10B0600035F066DBEB69186935F094DB2846012181 ++:10B07000F9F7C8FF28460121FBF7A2FA284601216B ++:10B08000FAF72EF940F2EA412846F7F753FB40F26F ++:10B09000EB4117902846F7F74DFB40F2EB41189033 ++:10B0A0002846F7F747FB00F0070340F2EB4128463C ++:10B0B0003822DB00F7F770FB28462DA999F8C1A2CA ++:10B0C000F9F77AFE86B1337A53B12846717AFFF7E1 ++:10B0D00045FC96F809A007E0F6090200A60B02005D ++:10B0E00028463146FAF732F840F29C412846F7F7F5 ++:10B0F00021FB40F2316113902846F7F71BFB40F229 ++:10B10000D66115902846F7F715FB40F2DA611490E6 ++:10B110002846F7F70FFB002116902846FAF728FA81 ++:10B12000284688490722F7F74BFB2FAB23930123CF ++:10B1300024930633259376B199F96625737A013203 ++:10B1400093FBF2F303F5107326932846202323A9DB ++:10B150002793FDF75FF82F9A2846D2002F9240F2EE ++:10B16000716192B2F7F7F2FA284677490C22F7F7A5 ++:10B1700027FB0024754B284633F81410F7F750FAD4 ++:10B180000DF1A203E0540134122CF3D1072228461A ++:10B190004FF48B71F7F75CFAB5F8DA3003F47043CB ++:10B1A000B3F5005F05D1284640F22D110122F7F7D3 ++:10B1B0004FFA072228464FF49671F7F749FAB5F887 ++:10B1C000DA3003F47043B3F5005F14D128466A21E6 ++:10B1D000C222F7F73DFA284698210C22F7F738FAF1 ++:10B1E000284640F22F110322F7F732FA284697211A ++:10B1F000F922F7F72DFA0B2107222846F7F728FA4C ++:10B200001022284640F21311F7F722FA1D210122DD ++:10B210002846F7F71DFA012228464FF48A71F7F7FE ++:10B2200017FAB5F8DA3003F47043B3F5005F04D1D0 ++:10B2300028462E211022F7F70BFA082228464FF451 ++:10B240009571F7F705FA092102222846F7F700FA67 ++:10B2500004221346284640F21F11F7F73FFAFF2158 ++:10B26000102200232846F7F739FA0721012200238C ++:10B270002846F7F733FA0521082200232846F7F776 ++:10B280002DFA4FF400421346284640F2DA61F7F7F0 ++:10B2900083FA41460F9A53462846FFF72BFA0024BB ++:10B2A00080B2012101902246284623460094029450 ++:10B2B00003940494F9F792FF0E9BA74208BF4FF442 ++:10B2C000824700930D9B284601930C9B41460293B5 ++:10B2D0000B9B224603934FF4AF630493A3F59F6344 ++:10B2E00007935B46059706940894FFF747F90DF11D ++:10B2F000C60228460DF1C701F9F798FC9DF8C62053 ++:10B300003F2A53D89DF9C730A3424FDB3F2B4DDC7A ++:10B3100052B29A424ADCB8F1000F27D123AC18236D ++:10B3200021462593284630AB26922393FCF772FFE3 ++:10B330009DF9C73021462846309E2693FCF76AFFC8 ++:10B3400044460EE0020A0200200D0200260E020012 ++:10B3500030AB284623A9269430962393FDF75CFA58 ++:10B3600001349DF9C62063B29A42F1DC182323AC64 ++:10B37000259326332693284630AB21462393FCF7AA ++:10B3800049FF3F23284621462693FDF745FA01232E ++:10B39000284621462693FCF73DFF002328462146F8 ++:10B3A0002693FDF739FA2846FDF72EF8284640F295 ++:10B3B000EA41179AF7F7CAF9284640F2EB41189A82 ++:10B3C000F7F7C4F92846D72102220023F7F786F9B8 ++:10B3D000082213462846D721F7F780F9002328468C ++:10B3E0004FF494710822F7F779F928464FF48B71DE ++:10B3F0000022F7F72DF9284640F29C41139AF7F7FF ++:10B40000A5F9284640F23161159AF7F79FF92846C9 ++:10B4100040F2D661149AF7F799F9169C284644F041 ++:10B42000010292B240F2DA61F7F790F92846012161 ++:10B43000FAF79EF8109C082204EA0203284640F21C ++:10B44000D741F7F7A9F9119C4FF4E04204EA02034F ++:10B45000284640F2D741F7F79FF92846FAF73CFD16 ++:10B460000024234B284633F814100DF1A203E25CAC ++:10B470000134F7F7EDF8122CF3D14FF400620023FA ++:10B48000284640F24C41F7F787F928460021FBF7A0 ++:10B4900097F828460021F9F7B5FD284640F23B41D0 ++:10B4A00001220023F7F778F900234FF400622846C1 ++:10B4B00040F63811F7F770F928460021FBF728FA13 ++:10B4C000284600211AAAFDF733F9284609490F2218 ++:10B4D000F7F776F9199B1BB9EB69186935F046D96E ++:10B4E00028461299FEF7DAFF33B0BDE8F08FC04668 ++:10B4F000260E0200C40A02002DE9F04FD0F8A83051 ++:10B5000091B093F8F49318230C930FAB0A93202374 ++:10B510000E93012317460B9301FB01FB3E330521DC ++:10B5200000228046B9F1FF0F08BF4FF001090D93CB ++:10B530000791099206230024039347F6FF733A46C6 ++:10B540000125059340462346214600940194029428 ++:10B550000495FFF72BFD40460AA9FCF75BFE0F9A06 ++:10B5600042F30B3303FB03F342F30B0202FB023201 ++:10B570007B7A5A45069303D307990894CEB206E026 ++:10B58000B9F1000F4DD1079908954B42DEB273B265 ++:10B5900006999DB26B189CB24FF0000A06990AEB0F ++:10B5A000010308999BB221B15A4506D99B1B7B72B6 ++:10B5B0002DE0089B0BB95A4529D322B27F2A26DCFD ++:10B5C0000AEB0503002A1FFA83FA20DB06237C72AC ++:10B5D000039301230021049347F6FF733A46059332 ++:10B5E00040460B46009101910291FFF7DFFC404677 ++:10B5F0000AA9FCF70FFE0F9A42F30B3303FB03F388 ++:10B6000042F30B0202FB023263199CB2C6E70799B0 ++:10B61000099A41F346030132DBB2032A07930992E8 ++:10B6200088D111B0BDE8F08F2DE9F04F8DB0DDF875 ++:10B6300058A01F460123834616468AF808304FF06B ++:10B6400000094FF0640808EB09030021C3F34F051C ++:10B65000DB238AF8095001245246039358460B46CF ++:10B6600000910191029105910494FFF79FFC18232A ++:10B670000893273309930BAB06935846202306A95A ++:10B680000A930794FCF7C6FD0B9B43F30B3202FBB6 ++:10B6900002F243F30B0303FB03231A464FEAE27360 ++:10B6A000BB4202D803D1B24201D9A94600E0A84664 ++:10B6B0000B484FF0FF31801941EB07018B4202D854 ++:10B6C00006D1824204D99F4206D801D1964203D8BE ++:10B6D000C9EB0803012BB6DC28460DB0BDE8F08F9E ++:10B6E00030F8FFFFF7B50546D0F8A87090F8DA00FB ++:10B6F0000E46F7F735FA40F6B41398420446B5F80B ++:10B70000DA2001D11E480AE0D3B2012B02D14FF456 ++:10B71000523004E00302A3F5C420A0F580600022AB ++:10B720004FF47A71F9F716F8A0FB0023284600962B ++:10B73000FFF77AFFA0F128039BB21D2B1BD9272806 ++:10B7400002D84FF434300BE040F6B4139C4202D1DF ++:10B750004FF4703004E02302A3F5BE20A0F5007082 ++:10B7600000224FF47A71F8F7F5FFA0FB002328467A ++:10B770000096FFF759FF031F87F8C232FEBDC0468F ++:10B78000008E03002DE9F04390F8DA30D0F8A8607D ++:10B790008BB086F8BC32D0F8B0300546D3F82031F3 ++:10B7A00083F0010313F001090AD1C369B8211869B4 ++:10B7B00042F2107234F0BCDFEB69186934F0EADF52 ++:10B7C00040F2A5412846F6F7B5FF04462846F9F7AA ++:10B7D000A5FB002180462846FEF76EFC4FF4404151 ++:10B7E0002846FEF769FC2846FEF73EFCD5F8A8205F ++:10B7F0002846D2F84434D2F84824402BA8BF40232E ++:10B800009342B8BF134640F2A741FF229BB2F6F71E ++:10B81000C3FF0023284640F2A5414FF4E062F6F74B ++:10B82000BBFF4FF47A7232212846FBF7ABF80121B7 ++:10B83000284696F8C072FBF76BF82846F7F738FCF5 ++:10B840004FF4E06204EA0203284640F2A541F6F70D ++:10B85000A3FF00212846FEF72FFC96F8C4420DF105 ++:10B860001E0E012C35D171462846FFF73BFF2846B6 ++:10B870002146FDF7D9FBD5F8A8202846D2F8443454 ++:10B88000D2F848243E2BA8BF3E239342B8BF1346AC ++:10B8900040F2A741FF229BB2F6F77EFF0023284625 ++:10B8A00040F2A5414FF4E062F6F776FF28463221D8 ++:10B8B0004FF47A72FBF766F896F8C032DBB996F867 ++:10B8C000C2322846043386F8C2322146FDF7ACFB6B ++:10B8D00011E000210122DB238DF82620039304923E ++:10B8E000284672460B468DF827700091019102910F ++:10B8F0000591FFF75BFB28464146FEF7DDFB284636 ++:10B9000008490422F6F75CFFB9F1000F03D1EB6997 ++:10B91000186934F02BDF28460021FAF7F9FF0BB045 ++:10B92000BDE8F083800C02002DE9F04F044695B08D ++:10B93000D0F8A86040F2E7300F46EAF30DF7072190 ++:10B940002046F6F76DFEC0B20390FF212046F6F7C1 ++:10B9500067FEC0B2049040F21F112046F6F760FE69 ++:10B96000C0B2059005212046F6F75AFE25215FFA60 ++:10B9700080FB2046F6F754FE4FF489715FFA80FA97 ++:10B980002046F6F74DFE00250190864B2046E95AE9 ++:10B99000F6F7D0FE07ABE85202351C2DF5D1D4F8EE ++:10B9A000B030D3F8203183F0010313F00103029388 ++:10B9B00003D1E369186934F0EDDE40F2A44120467A ++:10B9C000F6F72EFE002181462046FEF775FB7F210B ++:10B9D000204696F8C182FEF7C1FF012207211346D7 ++:10B9E0002046F6F77BFE1022FF2113462046F6F78D ++:10B9F00075FE04221346204640F21F11F6F76EFE34 ++:10BA0000362220466849F6F7DBFE2046F9F7F2F9C0 ++:10BA1000C0F34F00E62801DDFF2305E02046F9F7DB ++:10BA2000E9F94008193083B2FF22204640F2A541CF ++:10BA3000F6F7B2FE25210C222046F6F709FE082271 ++:10BA4000134605212046F6F749FE092257492046AC ++:10BA5000F6F7B6FE2046F9F7CDF91023129301232D ++:10BA6000ADF84E0008260F9306250DF14E03204633 ++:10BA70000EA910960E931195FCF7CEFE012F0CD156 ++:10BA80002A4620464A49F6F79BFE2022204682217C ++:10BA90001346F6F723FE042506E02A4620464549CC ++:10BAA000F6F78EFE07260A250122134620464FF49C ++:10BAB0009B61F6F771FE45F4007343EA06139B00A1 ++:10BAC00020464FF49B6140F6FC72F6F765FE0222B9 ++:10BAD000134620464FF49B61F6F75EFE20464FF476 ++:10BAE0009B614FF4E0424FF40053F6F755FE2022DD ++:10BAF000134620464FF49A61F6F74EFE01210022CC ++:10BB00002046F8F7DFF9204640F27641F6F712FEBC ++:10BB100010F4004F02D10A20EAF31EF62046072156 ++:10BB2000039AF6F795FD2046FF21049AF6F790FD5B ++:10BB3000204640F21F11059AF6F78AFD204605219E ++:10BB40005A46F6F785FD204625215246F6F780FD38 ++:10BB5000019B20464FF48971DAB2F6F779FD002592 ++:10BB6000104B2046E95A07ABEA5A0235F6F7EEFDCC ++:10BB70001C2DF5D120464FFA88F1FEF7EFFE204646 ++:10BB800040F2A4414A46F6F763FD029B1BB9E36904 ++:10BB9000186934F0EBDD40F2E730EAF3DDF515B07B ++:10BBA000BDE8F08F1A0A020036060200780502008E ++:10BBB000A2060200740C02002DE9F04FBDB007464A ++:10BBC0000C469146002116220DF15E000493E6F327 ++:10BBD00037F2A8490E220DF19E00E6F3CDF1A649F9 ++:10BBE0000E2224A8E6F3C8F148F2670148F2452284 ++:10BBF000ADF8EA10ADF8E820A04908220DF1C60022 ++:10BC0000E6F3BAF19E490E220DF18200E6F3B4F19B ++:10BC10009C4908220DF1BE00E6F3AEF19A490E22CE ++:10BC20001DA8E6F3A9F147F69733002108220DF18C ++:10BC3000B600ADF8E630ADF8E430E6F301F2FB69AA ++:10BC400030219868D7F8A880EBF342F005900028DF ++:10BC500000F0AB8240F2DB613846F6F76BFD40F254 ++:10BC6000DA610B903846F6F765FD88490A900422A0 ++:10BC70003846F6F7A5FDB9F1070F0BD8DFE809F054 ++:10BC800011040A0A0A22352D1DAA069224AB0DF1D1 ++:10BC90005E0214E00DF18202002306921A46079319 ++:10BCA00019E000210A460B4638460091F9F778FD65 ++:10BCB0000DF1820106910DF15E020DF19E03072147 ++:10BCC00007933EE00DF1E6030DF1EA01069308F15A ++:10BCD0008202079101230E9334E039A906913AAB11 ++:10BCE00008F18202012107932BE03BAB00930DF199 ++:10BCF000EF010DF1EE020DF1ED033846F9F74EFCC0 ++:10BD00009DF8EF209DF8EE300DF1BE0143EA0223CD ++:10BD10004FF00002ADF86C30ADF86E209DF8EC30BD ++:10BD20009DF8ED20069143EA0223ADF870304FF004 ++:10BD30000003ADF872300DF1C6030DF15E020793FA ++:10BD400004210E911023009330330193504B0021B6 ++:10BD5000029338460B23F6F7A7FE05224D493846D5 ++:10BD6000F6F72EFD3846F9F7D9F84FF4805213460E ++:10BD7000089040F2A4413846F6F70EFD00213846FF ++:10BD8000FEF79AF940F2DB413846F6F7D3FC424918 ++:10BD9000062209903846F6F713FDB7F8DA3003F4B7 ++:10BDA0007043B3F5005F07BF38463C4938463C490D ++:10BDB0001222F6F705FD40F2D7413846F6F7BAFCF5 ++:10BDC000059911903846FBF7BFFE384640F23B41DB ++:10BDD000F6F7B0FCC0F380100C9020B138460DF19E ++:10BDE000B601F8F7E9FF64B90C9A22B93846B8F8F9 ++:10BDF0003010FEF7B3FD0DF1CE0438462146F8F7BA ++:10BE0000DBFF638822881B0143EA0223A2882146C4 ++:10BE100013439EB2B7F8DA30082203F470430DF1F1 ++:10BE2000D600B3F5805F14BF00250125E6F3A4F02A ++:10BE30000A222BA80021E6F303F11A4B002233F863 ++:10BE40001540104633E0184B53F82530C1180B88C5 ++:10BE50001230B3422AD14B882BA8ADF8D6308A884D ++:10BE6000ADF8D82031F8063F0A22ADF8DA30E6F313 ++:10BE700083F01EE078090200CE0E020022080200C4 ++:10BE800058050200BC0A02005A080200900702008E ++:10BE900019880100D806020024090200FC0C0200E7 ++:10BEA00030090200720C0200F80C02000132A242BA ++:10BEB000C9D138460DF1D601F9F748F9002404221A ++:10BEC00038463749374DF6F77BFC10260A233846AB ++:10BED0002146354A009601940295F6F7E5FD2023A8 ++:10BEE000019338460A2321462F4A00960295F6F719 ++:10BEF000DBFD40F25341384640F2A472F6F726FCCF ++:10BF0000B8F8C81340F6A663A14208BF1946B9F1B4 ++:10BF1000050F01D14B4299B2D7F8FC3F0CB22BB1BF ++:10BF20003846FDF7EFFD0520EAF316F44FF47A7179 ++:10BF300001235822384604FB01F1FDF767FA40F26D ++:10BF4000DA614FF6FF723846F6F700FCB7F8DA30E0 ++:10BF5000384603F47043B3F5005F0CBF98F895952D ++:10BF600098F89695F8F7B4FF0021C0B2FF228B46EF ++:10BF700010900D910F929AE04FF000030799ADF8E1 ++:10BF8000E0303BF80130C3F30324B9F1000F1AD0BD ++:10BF9000042C0BD00F9A042A13D110990EE0C0463E ++:10BFA000A20A020019880100640B0200109901EB3B ++:10BFB0000903D9B211F0800F18BF7F213846FEF770 ++:10BFC00081FAE2B20F92069B3CA93BF8032001EBF9 ++:10BFD000440333F8441C21B102F0FF0343EA012378 ++:10BFE0009AB2384640F25241F6F7B0FBE31E1FFA10 ++:10BFF00083FABAF1010F16D86D4B10254524029330 ++:10C00000384600210DF1E202012300950194F6F774 ++:10C010003DFD684B38460293002138AA0123009564 ++:10C020000194F6F741FD079B384640F251413BF839 ++:10C030000320F6F78BFB3846F9F72EFF00287CD05B ++:10C040005B4A602112AC10250B2301910292002162 ++:10C05000384622460095574EF6F718FD40230193C7 ++:10C0600000210B233846224600950296F6F71CFD68 ++:10C07000BAF1010F0AD845230193384600210DF18A ++:10C08000E202012300950296F6F70EFD484960236F ++:10C090000193029108F18202384600210B2300959A ++:10C0A000F6F7F4FC0D9A0BF1020B01320D920D9B89 ++:10C0B0000E998B427FF460AF602301933C4B08F1F3 ++:10C0C0008206102402933846002132460B23394D54 ++:10C0D0000094F6F7DBFC4FF001025023A8F89820FB ++:10C0E0003846019300213246042300940295F6F766 ++:10C0F000DBFC552301933846002108F18C02022312 ++:10C1000000940295F6F7D0FC3846F8F74FFCA0B142 ++:10C1100038A90DF1DE023846FCF750FB3846FCF733 ++:10C12000EDF9BDF8E0100446BDF8DE203846FDF715 ++:10C1300085FD38462146FDF713FB049B13B93846AD ++:10C14000FDF7E0FC38460599F9F714FB384640F254 ++:10C15000D741119AF6F7FAFAFB69059998683022E7 ++:10C16000EAF3C6F5384640F2DB41099AF6F7EEFAF3 ++:10C1700040F2534138460022F6F7E8FA0C9921B113 ++:10C1800038460DF1B601F8F7E1FF38460899FDF79A ++:10C1900093FF384640F2DA610A9AF6F7D7FA384642 ++:10C1A00040F2DB610B9AF6F7D1FA3DB0BDE8F08FB3 ++:10C1B00015820100198801002DE9F0470546D0F8E5 ++:10C1C000A8404FEA0118F8F783FE40F2D74147B282 ++:10C1D0002846F6F7AFFA94F925258146B2F1FF3FDC ++:10C1E00011D0042392FBF3F3984505DA284640F278 ++:10C1F000D7414022002304E04022284640F2D741A4 ++:10C200001346F6F7C9FAD5F8FC3F53B12846FDF7B7 ++:10C2100079FC0520EAF3A0F21C492846702200238D ++:10C2200002E01A4928467022FDF7F0F82846394600 ++:10C23000FEF794FB002601212846FBF76FFD04233F ++:10C24000C8EB00047A1E94FBF3F3D2187F2AA8BF30 ++:10C250007F2222EAE277284639460434FEF77EFB45 ++:10C26000082C03D90A2E01D00136E4E72846FDF751 ++:10C2700049FC284640F2D7414A46F6F767FA284675 ++:10C28000F8F726FE40B2BDE8F087C04600093D0041 ++:10C290002DE9F04391B08046D0F8A860F8F718FE79 ++:10C2A0001C23B8F8DA208DF83B3001238DF83A30A2 ++:10C2B00002F47043B3F5805F5FFA80F907D1D3B21F ++:10C2C000402B01D81B2300E02D238DF83B30B8F81C ++:10C2D000DA2002F47043B3F5005F33D1B6F82A25B3 ++:10C2E00013B2B3F1FF3F04D04FF6FF73002A08BF2B ++:10C2F0001A46B6F8F6130BB2B3F1FF3F02D14FF472 ++:10C30000917104E04FF6FF73002908BF1946B6F893 ++:10C310002C5596F8F0032BB2B3F1FF3F04D04FF643 ++:10C32000FF73002D08BF1D46B6F8F84323B2B3F1E2 ++:10C33000FF3F04D04FF6FF73002C08BF1C4696F851 ++:10C34000F1739FE0D3B2402B33D8B6F82E2513B249 ++:10C35000B3F1FF3F04D04FF6FF73002A08BF1A461F ++:10C36000B6F8FA130BB2B3F1FF3F02D14FF491715B ++:10C3700004E04FF6FF73002908BF1946B6F83055A0 ++:10C3800096F859052BB2B3F1FF3F04D04FF6FF7377 ++:10C39000002D08BF1D46B6F8004423B2B3F1FF3F9D ++:10C3A00004D04FF6FF73002C08BF1C4696F85B754F ++:10C3B00068E08C2B33D8B6F8322513B2B3F1FF3FC7 ++:10C3C00004D04FF6FF73002A08BF1A46B6F8FC13D4 ++:10C3D0000BB2B3F1FF3F02D14FF4917104E04FF67D ++:10C3E000FF73002908BF1946B6F8345596F8F203D2 ++:10C3F0002BB2B3F1FF3F04D04FF6FF73002D08BFFF ++:10C400001D46B6F8024423B2B3F1FF3F04D04FF605 ++:10C41000FF73002C08BF1C4696F8F37332E0B6F8A1 ++:10C42000362513B2B3F1FF3F04D04FF6FF73002A55 ++:10C4300008BF1A46B6F8FE130BB2B3F1FF3F02D1A4 ++:10C440004FF4917104E04FF6FF73002908BF1946BD ++:10C45000B6F8385596F85A052BB2B3F1FF3F04D021 ++:10C460004FF6FF73002D08BF1D46B6F8044423B2F3 ++:10C47000B3F1FF3F04D04FF6FF73002C08BF1C46FA ++:10C4800096F85C7513B2B3F1FF3F04D040461946ED ++:10C49000FFF792FE0DE009B2B1F1FF3F07D0404631 ++:10C4A0000DF13202FFF728F89DF83B3007E0FF2836 ++:10C4B00002D086F8070404E09DF83B300BB186F803 ++:10C4C000073429B2B1F1FF3F05D04046FFF774FEB3 ++:10C4D00086F8080411E021B2B1F1FF3F09D04046CF ++:10C4E0000DF13202FFF708F89DF83B3086F808346A ++:10C4F00003E0FF2F18BF86F8087496F9EF33B3F105 ++:10C50000FF3F1CBF4FF0FF3386F8083496F808044D ++:10C5100041B2B1F1FF3F76D096F8072453B2994269 ++:10C52000D8BF86F8082496F80834D8BF86F80704E0 ++:10C5300000248DF83B30DB2301250393404623463E ++:10C5400021460DF132020495009401940294059461 ++:10C55000FEF72CFD18230993083308950B93254605 ++:10C5600007AC0FAB4046214607930A95FBF752FEF6 ++:10C5700005F140034046214601350A93FCF74CF98A ++:10C58000402DEDD196F9072496F908349B18022224 ++:10C5900093FBF2F3A6F86835B8F8DA2002F470439A ++:10C5A000B3F5005F02D1B6F85E3583B9D3B2402B44 ++:10C5B00005D8B6F8602512B1A6F8682509E08C2BDD ++:10C5C00002D8B6F8623513B9B6F864350BB1A6F8DF ++:10C5D0006835404640F224514FF400420023F6F7FC ++:10C5E000DBF896F96625B6F86835013293FBF2F36D ++:10C5F0009BB2404640F22551FF22F6F7CDF80223C8 ++:10C6000086F8673529E0012386F86735404640F211 ++:10C610002551FF227E33F6F7BFF8404640F2255100 ++:10C620004FF480720023F6F7B7F8404640F22551E8 ++:10C630004FF400720023F6F7AFF8404640F2255160 ++:10C640004FF480620023F6F7A7F8404640F22551E8 ++:10C650004FF400620023F6F79FF84FF00003A6F8AE ++:10C660006A35404640F2255196F96645F6F762F87C ++:10C670000134C0B204FB00F496F96635A6F86845AB ++:10C6800013B14046FCF72CFD96F8EF330DF1320262 ++:10C69000FF2B08BF96F8073400218DF83B30DB23D1 ++:10C6A00003930123049340460B46009101910291AC ++:10C6B0000591FEF77BFC40464946FEF74FF94046A0 ++:10C6C00040F27161F6F736F8B6F96A3540F27161F9 ++:10C6D000A0EBC30292B24046F6F738F84046FBF7AB ++:10C6E00093FE11B0BDE8F08370B58E46BEF1FF3FFA ++:10C6F0000546144619469DF9106002D006EB0E015E ++:10C700000DE022B990F82916FFF756FD02E0B2F1CC ++:10C71000FF3F04D021462846FFF74EFD81192846E9 ++:10C72000FEF71CF970BDC0462DE9F04F87B00446F6 ++:10C73000F8F7F4FB04A981462046D4F8A850F8F78E ++:10C740003BFB2046F8F7BCFB40F2D741834620462E ++:10C75000F5F7F0FF03902046FCF74AF88246B9F15E ++:10C76000000F02D0FF23029304E02046F8F7B0FB4D ++:10C7700040B20290B4F8DA304FF02A0803F4704364 ++:10C78000B3F5005F0CBF95F81E1595F81F152046F0 ++:10C790004FB239460F223C23CDF80080FFF7A4FFAB ++:10C7A00095F84665002E00F09080204640F2EB415F ++:10C7B000F5F7C0FF1221C0F3402301222046F5F710 ++:10C7C0008DFF6A780021521A18BF01220B462046BD ++:10C7D000FFF7F2F92046FBF791FE40F3072340B242 ++:10C7E000A5F84A35A5F84C0540F2EB412046F5F78F ++:10C7F000A1FFC0F380235B02204640F2EB414FF4DF ++:10C800000072F5F7C9FF002107220B462046FFF70B ++:10C81000D3F92046FBF772FE40F3072340B2A5F898 ++:10C820004E35A5F85005FF222046B5F84A3540F6AA ++:10C830005211F5F7B1FF2046FF22B5F84C3540F60E ++:10C840005311F5F7A9FF2046FF22B5F84A3540F607 ++:10C850005611F5F7A1FF2046FF22B5F84C3540F6FA ++:10C860005711F5F799FF2046FF22B5F84E3540F6EF ++:10C870004811F5F791FFFF222046B5F8503540F6F4 ++:10C880004911F5F789FF95F84A3595F84C1520467A ++:10C8900041EA0321FCF764FF95F8473520469B02E7 ++:10C8A00040F2EB414FF4806203F47C43F5F774FFF0 ++:10C8B00095F8483520465B0240F2EB414FF4007298 ++:10C8C00003F47E43F5F768FF10E0204639460F2257 ++:10C8D0003C23CDF80080FFF707FF6A7820463146F9 ++:10C8E000003A18BF01223346FFF766F92046F8F7F1 ++:10C8F0004BF810B12046FBF715FE00217F220B46B6 ++:10C900002046FCF7DDFC20465146FDF7C7FD2046DA ++:10C910005946F8F7CFFB204604A9F8F717FC204644 ++:10C9200040F2D741039AF5F711FFB9F1000F04D097 ++:10C9300020464946FDF7C0FB03E020460299FEF77A ++:10C940000DF807B0BDE8F08F2DE9F04F89B004462F ++:10C95000D0F8A870F8F7E2FA04902046F8F7B8FA91 ++:10C960004FF489715FFA80FA2046F5F759FE0721E6 ++:10C9700005902046F5F754FEFF2101902046F5F77B ++:10C980004FFE40F21F1102902046F5F749FE40F29B ++:10C99000AB4103902046F5F7CDFED4F8B030D3F884 ++:10C9A000203183F0010313F0010B03D1E36918690F ++:10C9B00033F0F0DE00212046FDF77EFB2046F6F73F ++:10C9C00077FB40F23B412046F5F7B4FE0DF1180924 ++:10C9D000494680462046F8F7EFF920460121F8F74E ++:10C9E0007DFB20467F21FDF7B9FF0122134620463B ++:10C9F0000721F5F773FE102213462046FF21F5F7B5 ++:10CA00006DFE0422134640F21F112046F5F766FE24 ++:10CA10002046FDF74FFC06224B492046F5F7D0FE95 ++:10CA20002046FBF7E5FE002106462046FDF736FDD1 ++:10CA3000002220460121F7F745FA40F2AB4120469B ++:10CA4000F5F778FE40F23E612046F5F773FEC50526 ++:10CA5000ED0D2B46204640F2A64140F2FF12F5F7BD ++:10CA60009BFE97F8E8330BB3204638490922F5F7C7 ++:10CA7000A7FE002220460121F7F724FA40F2AB413D ++:10CA80002046F5F757FE40F23E612046F5F752FE8C ++:10CA9000C30540F29A41204640F2FF12DB0DF5F744 ++:10CAA0007BFE20462A490922F5F78AFE2B462046BE ++:10CAB00040F2A64140F2FF12F5F76EFE00234FF45C ++:10CAC0008052204640F24C41F5F766FE2046314642 ++:10CAD000FDF7E4FC2046C8F38011F8F7FFFA204682 ++:10CAE0004946F8F733FB20465146FDF737FF20460D ++:10CAF0000499FDF7E1FA20464FF48971059AF5F79C ++:10CB0000A7FD019D012205EA020320460721F5F752 ++:10CB1000E5FD029D102205EA02032046FF21F5F7FC ++:10CB2000DDFD039D0422204640F21F1105EA0203A9 ++:10CB3000F5F7D4FDBBF1000F03D1E369186933F0B9 ++:10CB400015DE09B0BDE8F08FD80C0200E205020046 ++:10CB5000E40C02002DE9F3410446F8F7DFF9E3693C ++:10CB6000D4F8A8501A6A04F580531A6094F8DA30A1 ++:10CB7000002685F8BC3241F20403E654D4F8B03004 ++:10CB80008046D3F8203183F0010313F001070AD166 ++:10CB9000E369B821186942F2107233F0C9DDE36924 ++:10CBA000186933F0F7DD20460121F9F7B1FE0F22B5 ++:10CBB00023492046F5F704FE2046F8F775FD204688 ++:10CBC0003146FCF7CDFD204631463246FDF736F8BA ++:10CBD0002046F6F76DFA41F22403E35C6BB1204680 ++:10CBE000FFF7B2FE20463146FDF74EF995F8E833DF ++:10CBF0001BB120460121FDF747F92046FFF794FDC0 ++:10CC000000217F230A46009320460123FDF7C6FF3B ++:10CC10004FF0FF3385F8073485F808342046FFF7D6 ++:10CC200037FB20464146FDF747FA20460021F9F739 ++:10CC30006FFE1FB9E369186933F098DDBDE8FC8128 ++:10CC4000DA070200082910B503D00A2904D0022906 ++:10CC500004D1FFF77FFF01E0FEF794FD10BDC04651 ++:10CC600010B50446F6F724FA20460021FDF724FA11 ++:10CC700020460821FFF7E6FF10BDC04670B541F21F ++:10CC80000403C35C0446D0F8A85013B9F7F70CFFAF ++:10CC9000F0B1D4F8F83013F0070F06D194F8F5305E ++:10CCA0001BB920460921FFF7CDFFD4F8F82012F078 ++:10CCB0000F0F0DD141F20C03E3564BB912F0800F68 ++:10CCC00006D194F8F5301BB920460221FFF7BAFFD0 ++:10CCD000D4F8F83013F00E0F02D12046F9F752F9CC ++:10CCE000D4F8F83013F0060F3ED1D5F8340448B329 ++:10CCF000E169D5F838240B6A9B1A834234D308695A ++:10CD00006A2133F0F7DC400081B2B1B1E369186900 ++:10CD100033F0F0DC88B940F276412046F5F70AFDA1 ++:10CD2000C005C00DA5F86C0540F277412046F5F727 ++:10CD300001FDC005C00DA5F86E0520460021F9F7DC ++:10CD40004BFF11E040F276412046F5F7F3FCC005B9 ++:10CD5000C00DA5F86C0540F277412046F5F7EAFCD6 ++:10CD6000C005C00DA5F86E052046F8F7D7F8B0F558 ++:10CD7000404F0CD02046F8F7ABF8C0B220B10023EA ++:10CD80007F2885F8563402D0002385F8573470BDCB ++:10CD90002DE9F047CCB20746D0F8A8602046894676 ++:10CDA000F5F7DEFE494680463846F5F7BBFE3846C5 ++:10CDB000B7F8DA10FBF758F9042238465B49F5F763 ++:10CDC000FFFC21463846FAF7B5F90A20E9F3C4F426 ++:10CDD0004FF4004213464FF489613846F5F7DCFC06 ++:10CDE0003846F8F78DFB052100224FEA4800F7F797 ++:10CDF000B1FC0022054641464FF42010F7F7AAFC8B ++:10CE000040F257610446AAB23846F5F79FFC38460F ++:10CE10004FF4CB61A2B2F5F799FC4FF4007338469A ++:10CE20004FF489614FF44072F5F7B6FC97F8DA30A9 ++:10CE30000E2B01D11E2206E0B6F8622013B2B3F128 ++:10CE4000FF3F08BF1522A6F840253846002112B240 ++:10CE5000FBF7E2FB20B1384600211422FBF7DCFB94 ++:10CE600097F8DA3038220E2B0CBF182300233846EF ++:10CE700040F2EB41F5F790FCB7F8DA30384603F4AE ++:10CE80007043B3F5005F0CBFB6F86620B6F86820B3 ++:10CE9000012113B2B3F1FF3F08BF0222A6F83E25DD ++:10CEA00012B2FBF7B9FB182238462149F5F788FC86 ++:10CEB0003846F6F70DF996F8BC2298B10E2AB7F865 ++:10CEC000DA3003D9DBB20E2B03D805E0DBB20E2B30 ++:10CED00002D83846012101E0384600214A46FCF7D5 ++:10CEE000A1FF21E097F8DA309A4201D1012A04D15A ++:10CEF00038460821FFF7A6FE02E03846FCF776FF29 ++:10CF000000210A463846FBF753FD3846F9F7B6F9D3 ++:10CF100038460121F9F76AFA41F22403FB5C1BB1A0 ++:10CF200038460321FBF70AF9BDE8F08792050200B5 ++:10CF30002A080200D0F8B03073B5D3F82031044687 ++:10CF400083F0010313F00106D0F8A85003D1C369A0 ++:10CF5000186933F01FDC41F22403E25C42BBB4F8F1 ++:10CF6000DA3003F47043B3F5005F08D14FF00403E7 ++:10CF7000ADF800304FF00C03ADF8023007E04FF091 ++:10CF8000FF03ADF80030ADF802304FF0F00320465B ++:10CF90006946ADF80430ADF80620F8F7D7F820461A ++:10CFA0009621FDF77BFA20460121FEF7BDFC56E0F5 ++:10CFB0002046FFF7C9FC2046FDF756F82046002121 ++:10CFC000FCF762FF204635490F22F5F7F9FB95F88B ++:10CFD000E833DBB120460121FCF756FF95F92435F3 ++:10CFE000204640F2D141FF229BB2F5F7D5FB95F8E0 ++:10CFF0002535204640F2D1414FF47F421B02F5F720 ++:10D00000CBFB204626490C22F5F7DAFB0522204609 ++:10D010002449F5F7D5FBD4F8A8202046D2F84434AB ++:10D02000D2F848243C2BA8BF3C239342B8BF1346F8 ++:10D0300040F2A741FF229BB2F5F7AEFBB4F8DA301D ++:10D04000204603F47043B3F5005F0CBF95F85434E9 ++:10D0500095F855344FF440412B86FDF72DF840F2FA ++:10D0600076412046F5F766FBC005C00DA5F86C05B6 ++:10D0700040F277412046F5F75DFBD5F83434C00522 ++:10D08000C00DA5F86E051BB120460121F9F7A4FDDE ++:10D090001EB9E369186933F069DB7CBD4A0E0200F2 ++:10D0A0002A070200100A02002DE9F041D0F8A8601A ++:10D0B000012386F86130013B86F8C033B0F8DA30DE ++:10D0C000074603F47043B3F5005F02D196F8C1330D ++:10D0D00004E0B3F5805F06D196F8C233022B02D18B ++:10D0E000012386F8C033B7F8DA30384603F47043CA ++:10D0F000B3F5805F0CBF96F8EB3396F8EA33002463 ++:10D1000086F8E933738B0125A6F8BE320422234941 ++:10D11000347086F8C24286F8C34286F8C44286F864 ++:10D120006755F5F74DFB38462946F8F721FA0422F2 ++:10D130001B493846F5F744FB3846FCF7A1FA384658 ++:10D14000FCF7DCFC3846FFF7F5FE86F82C40B7F814 ++:10D15000DA103846F6F784FD3846FBF765F84FF4E9 ++:10D16000804213464FF489613846F5F715FB642079 ++:10D17000E9F3F2F2234638464FF489614FF48042D6 ++:10D18000F5F70AFB38464FF44041FCF795FF41F2B2 ++:10D190008833F38686F89A55BDE8F08122070200AD ++:10D1A000040C020010B58068F2F36AF210BDC046AC ++:10D1B00010B5437902790C4642EA032E0EF00303C0 ++:10D1C000012B0AD0022B0ED013B14FF400702EE0C9 ++:10D1D0000A780523B2FBF3F029E00B78144A03F038 ++:10D1E0000703D05C23E00978E378227911F0800FFF ++:10D1F00043EA022201F07F0343F0006002D040F4D2 ++:10D20000806006E01EF0200F1CBF20F4E06343F4B2 ++:10D21000407012F0800F18BF40F4000012F0400F71 ++:10D2200018BF40F48000C2F3011340EA035010BD60 ++:10D2300050FD010070B585680446D4F8F811A8685F ++:10D24000F2F30CF24FF0FF3384F8E231A36123686C ++:10D2500000229A712B6B064602211869F5F732FC01 ++:10D26000204636F00FDDD6F1010038BF002070BD3A ++:10D2700070B50D460968044671B1D1F87C1129B129 ++:10D28000036840F20C72D868E9F332F52368296824 ++:10D29000D8686269E9F32CF523682946D86810221A ++:10D2A000E9F326F570BDC04637B5054601A9D0F8AB ++:10D2B000000537F00FDF09E02846214638F06AD92B ++:10D2C000636C1BB92846214638F07ADA01A837F09A ++:10D2D00009DF04460028EFD13EBDC046036870B5A3 ++:10D2E00010210546D868E9F3F3F408B9064615E0BD ++:10D2F0002B6806466969D868E9F3EAF404463060A9 ++:10D3000028B931462846FFF7B3FF264606E000233A ++:10D31000C0F87C313146284637F0BCDD304670BD60 ++:10D320002DE9F3470D469246002853D0002951D0ED ++:10D330000B88D0F80490D0F89843D0F89463002B71 ++:10D340004BD00027E780A7804B880A8813F001089C ++:10D3500024D0402A14D1043120463B4600973BF0AC ++:10D36000DBDFB8423BDBB6F8023113F0400F34D0BC ++:10D37000BAF1000F31D0D9F80C003AF06FDF0BE0B2 ++:10D38000A2F108039BB2372B29D804F1080004311D ++:10D39000E4F3F2F52D88A580384622E0202A19D83A ++:10D3A000043104F14800E4F3E7F5A4F804802D8883 ++:10D3B0000123E580C6F8CC30B6F8023113F0400FF7 ++:10D3C0000BD0BAF1000F08D0D9F80C003AF046DFC4 ++:10D3D000404606E06FF0010003E0002001E04FF05E ++:10D3E000FF30BDE8FC87C04610B50DF09DFD04463A ++:10D3F000F1F7AAFF2046E8F3BDF710BDAAAA030083 ++:10D400001958000040960000904C00001472000073 ++:10D41000101800000FAC000050F2000050F20100A4 ++:10D420000050F20200000050F2020100AAAA03001C ++:10D43000195800000000000050F2040000147200AF ++:10D44000000FAC000050F200001018000050F20075 ++:10D45000000FAC0000409600000000000000101813 ++:10D4600000696C306D6163616464723D30303A31E3 ++:10D47000313A32323A33333A34343A353500626F26 ++:10D48000617264747970653D3078666666660062C4 ++:10D490006F6172647265763D3078313000626F6121 ++:10D4A0007264666C6167733D38006161303D3300C2 ++:10D4B00073726F6D7265763D3200AAAA0300195827 ++:10D4C000000050F200000000594D80009557800088 ++:10D4D00049588000315680000D5A8000C1588000A4 ++:10D4E000295A8000455A8000795780004D568000A7 ++:10D4F000755A800025558000F15980000D58800034 ++:10D5000069548000C14E8000E9518000555280006E ++:10D51000C9518000DD58800051518000D1558000F4 ++:10D52000A555800015568000E14F80008955800088 ++:10D53000FD4E800025508000C9110100ED4D800096 ++:10D54000854E8000A94F8000D94D8000094E800093 ++:10D55000514C8000654C800000000000000000007D ++:10D5600000000000C14F800025528000F95180006A ++:10D57000E12800002800000073645F6C6576656C2C ++:10D580005F74726967676572007370695F70755F59 ++:10D59000656E6162006172705F6D61636164647287 ++:10D5A000006172705F72656D6F7465697000000074 ++:10D5B000F83B86000000000007000000FF3B8600EB ++:10D5C00001000000070000000B3C86000200000084 ++:10D5D000000000001B3C8600030000000700000064 ++:10D5E000263C86000400000000000000373C860056 ++:10D5F0000500000008003000413C860006000000E5 ++:10D600000000000095D501000800000006000000A1 ++:10D61000A1D5010009000000070000000000000083 ++:10D62000000000000000000070666E5F737573708C ++:10D63000656E640058408600000000000800140079 ++:10D6400060408600010000000800880068408600F5 ++:10D65000020000000800380070408600030000004F ++:10D66000080008007E408600040000000100000061 ++:10D670008240860005000000000000008B4086000C ++:10D68000060000000800380028D60100070000004E ++:10D690000100000000000000000000000000000089 ++:10D6A000352E39302E3139352E38392E3600776CFB ++:10D6B00025643A2025732025732076657273696F7F ++:10D6C0006E20257320465749442030312D25780A95 ++:10D6D0000041707220323220323031330031343A1E ++:10D6E00035303A3030000000DA4386000000000098 ++:10D6F00008000000E3438600010000000100000074 ++:10D700000000000000000000000000005C782530F0 ++:10D71000325800253034780A007478636861696E85 ++:10D72000007278636861696E00776C635F696F7619 ++:10D730006172733200727373695F6F6666736574CA ++:10D740000064796E74785F7164626D5F6F76657284 ++:10D75000726964650064796E74785F726174655F84 ++:10D76000616C6C00505A443A2025643E2564206F59 ++:10D77000722025643E256420613D25640A006F7493 ++:10D780007077006164640064656C006C6F775F7231 ++:10D790007373695F74726967676572006C6F775F36 ++:10D7A000727373695F6475726174696F6E0074631C ++:10D7B0005F656E61626C650074635F706572696F4E ++:10D7C000640074635F68695F776D0074635F6C6F9A ++:10D7D0005F776D0074635F73746174757300617358 ++:10D7E000736F635F73746174650064796E7478003D ++:10D7F00074785F737461745F63686B0074785F73CF ++:10D800007461745F63686B5F7072640074785F73D7 ++:10D810007461745F63686B5F726174696F007478C0 ++:10D820005F737461745F63686B5F6E756D007278AF ++:10D830005F726174650069735F5750535F656E7204 ++:10D840006F6C6C65650069735F7770735F656E728E ++:10D850006F6C6C65650002000000000035D70100A8 ++:10D8600001000000060000008BD70100020000004C ++:10D87000060000009CD70100030000000600000025 ++:10D88000AED701000400000006000000B8D7010078 ++:10D890000500000006000000C2D7010006000000DD ++:10D8A00006000000CBD701000700000006000000C2 ++:10D8B000D4D701000800000006000000DED70100F8 ++:10D8C0000900000006000000EAD701000A0000007D ++:10D8D00006000000F0D701000B0000000600000069 ++:10D8E000FCD701000C000000060000000CD801006D ++:10D8F0000D000000060000001ED801000E00000010 ++:10D90000060000002ED801000F00000006000000F5 ++:10D9100036D80100100000000100000046D80100C8 ++:10D9200010000000010000000000000000000000E6 ++:10D930000000000005A58100FDA581000000000099 ++:10D94000000000000DCD820089E68200F5CB820048 ++:10D95000EDCC820067898600000080000100000095 ++:10D96000458B860001000000080002004F8B8600F6 ++:10D970001D000000080002005C8B86000F00000004 ++:10D98000030000006A8B8600100080000700000082 ++:10D990007A8B860002000000080007008B8B86004F ++:10D9A00003000000080007009C8B86000400800034 ++:10D9B00001000000AE8B860006000000020000009F ++:10D9C000B98B86000C00000002000000C88B8600A6 ++:10D9D00021008000030000000000000000000000A3 ++:10D9E000000000004CDB01001000000006000000F9 ++:10D9F000529B860001000000010000005D9B860034 ++:10DA000002002000070000006F9B8600030040001A ++:10DA1000080007007C9B860004004000080004000A ++:10DA20008B9B860005004000080004009A9B86003E ++:10DA300006000000080004004FDB01000D0010008C ++:10DA400007000000A79B86000E00200007000000D2 ++:10DA5000B49B86000700100007000000BF9B8600F3 ++:10DA6000080000000800100058DB01000900000059 ++:10DA700006000000C99B860024000000060000008C ++:10DA80005CDB01000A00000006000000AB728600AB ++:10DA90000F00000001000000D59B86000B008000F5 ++:10DAA00001000000DA9B86000C0000000500000069 ++:10DAB000E59B86001D00000003000000FA9B860025 ++:10DAC0001E00000007000000139C86001F000000DD ++:10DAD00007000000259C86002100000005000000D2 ++:10DAE0003B9C86002000000003000000499C86004B ++:10DAF00011008000010000004F9C860018004000CB ++:10DB000008000600539C8600190000000500000074 ++:10DB1000619C86001A000000010000006C9C8600D9 ++:10DB20001B00400001000000000000000000000099 ++:10DB3000000000000050F20201010000013200006C ++:10DB400027A4000041325E0061212F006170006D4A ++:10DB500061786173736F63006273730073736964D8 ++:10DB600000092F160E0E057573696E6720703270EE ++:10DB7000206D6963726F636F64650A00776C25645A ++:10DB80003A205048595458206572726F72282564A3 ++:10DB9000290A000091BA8600000080000100000000 ++:10DBA00030BB860002000000080044003ABB86003B ++:10DBB000030000000800440044BB8600040000008D ++:10DBC000080000004FBB860005000000080044006C ++:10DBD00059BB8600060000000800000067BB8600F5 ++:10DBE0000700000008004C0074BB8600080000001D ++:10DBF00008004C0081BB8600090080000200000084 ++:10DC000000000000000000000000000054545454C4 ++:10DC10005400000000000000000050505050500020 ++:10DC200000000000000000002300000003000000CE ++:10DC300000084C4C4C4C4C4C1414140000010000D7 ++:10DC400064646464646464646464646464000000C0 ++:10DC5000000000000000000000000000013C424203 ++:10DC6000424242424242423C0000000000000000AA ++:10DC700000000000000000000000344A4E4E4E4EEE ++:10DC80004E4E4E4A38000000000000000000000028 ++:10DC9000000000000000004C4C4C4C4C4C4C4C4CD8 ++:10DCA0004C4C4C4C00000040404040404040000084 ++:10DCB00000000001030000000001424242324242E3 ++:10DCC0001414140000000000030000000008444485 ++:10DCD0004438444414141400000000000300000001 ++:10DCE00000013E3E42343E42141414000000000085 ++:10DCF00054545400540000000000000000000000D4 ++:10DD000000000000000000000000000023000000F0 ++:10DD1000030000000001444444384440141414003B ++:10DD200000000000484A4A4A4A4A4A4A4A4A4A4A7D ++:10DD300048000000343434343434343434000000C7 ++:10DD4000004E4E4E4E4E4E4E4E4E4E4E4E4E0000DD ++:10DD50000000000000000000000000000008545413 ++:10DD6000540054000000000000000000505050001B ++:10DD700050000000000000000000233A3E3800423E ++:10DD80000000000000000000000000000000000093 ++:10DD9000000000000000000A000000006400000015 ++:10DDA000000000000000000000005800000000001B ++:10DDB00000000000013242424242424242424232AC ++:10DDC00042420000000000000000000000000000CF ++:10DDD000000836444444444444444444364A4000E1 ++:10DDE0000000000000000000000000000000082EFD ++:10DDF0004444444444444444442E463A0000000011 ++:10DE00000000000000000000000000083C3E3E3E14 ++:10DE10003E3E3E3E3E3E3C3E3E00000000000000D6 ++:10DE2000000000000000000008344444444444441E ++:10DE3000444444384440000000000000000000005A ++:10DE40000000000000085C5C5C5C5C5C5C5C5C5C32 ++:10DE50005C5C5C00005050505050505050500000DE ++:10DE6000000001383E383E42000000000000000083 ++:10DE70000000000000000000000000000000000A98 ++:10DE80000100000000014E4E4E344C381E1E1E0094 ++:10DE90000000000003000000000142444230443012 ++:10DEA00014141400000000000300000000013E3EB6 ++:10DEB0003E3C3E3E1414140000000000030000002D ++:10DEC0000001444444364C3814141400000000008F ++:10DED0000300000000013E3E30363A2C14141400BA ++:10DEE000000000004242424242424242424242421A ++:10DEF000420000002E343434343434343400000012 ++:10DF0000004A4A4A4A4A4A4A4A4A4A4A4A4A00004F ++:10DF1000002E34343434343434340000000054548B ++:10DF20005400540000000000000000004848480071 ++:10DF300048000000000000000000233E3E3E4A0072 ++:10DF40000000000000000000002828284000000019 ++:10DF500000000000000000004644444A00000000A9 ++:10DF600000000000000000000000000000000000B1 ++:10DF7000000000000A545454005400000000000047 ++:10DF80000000004848480048000000000000000071 ++:10DF900000230000030000000000424242424242CF ++:10DFA00014141400000000000300000000003E3EB6 ++:10DFB0003E3E3E3E141414000000000054545454DD ++:10DFC0000000000000000000000050505050000011 ++:10DFD0000000000000000000233844444A4A0000CA ++:10DFE0000000000000000000000000000000000031 ++:10DFF00000000000000A00000000340000000000E3 ++:10E0000000000000000000003400000000000000DC ++:10E01000000000545454545400000000000000005C ++:10E020000048484848480000000000000000002365 ++:10E03000545454545400000000000000000050509C ++:10E04000505050000000000000000000235C5C5CA9 ++:10E050000050000000000000000000504850004444 ++:10E06000000000000000000000234C4C4C4C4C4CC5 ++:10E070004C4C4C4C4C4C4C0000000000000000008C ++:10E0800000000000000009000100000000013E3E09 ++:10E090003E323E361414140000000000010000005F ++:10E0A00000013E3E3E343E381414140000000000CF ++:10E0B0000100000000014242423C423C1E1E1E0084 ++:10E0C000000000000100000000014E4E4E364C38AA ++:10E0D0001E1E1E0000000000545454545400000042 ++:10E0E00000000000000048484848480000000000C8 ++:10E0F0000000000023000000006400000000000099 ++:10E1000000000000000000580000000000000000B7 ++:10E1100000010000030000000000464646484A484F ++:10E120001717170000000000610A86007E0A8600AB ++:10E130009B0A86000F0B8600490B8600660B860043 ++:10E14000630F8600240E8600410E860014108600A0 ++:10E150006B108600311086009C108600D01086005F ++:10E160000411860060118600B1118600830B8600C1 ++:10E17000A00B86000C0F8600F70B8600CE118600E0 ++:10E18000310C86006B0C860094118600DA0B860039 ++:10E190005E0E86004E0C8600290F8600B80A8600A7 ++:10E1A000D50A8600F20A86007B0E86004E10860095 ++:10E1B000BD0B8600980E86009D0F8600B50E86006A ++:10E1C000880C8600D20E8600140C8600290F86006B ++:10E1D000BA0F86002C0B8600440A8600800F86004A ++:10E1E000460F8600EF0E8600B5DD0100D2DD01008E ++:10E1F000EFDD01005DDC010024DD01000CDE01002B ++:10E2000001DF010046DE010097DC01006AE0010049 ++:10E2100040DC01007ADC010041DD010029DE010063 ++:10E22000E4DE010021E3010004E30100383838385E ++:10E2300038000000000000000000343434343400A2 ++:10E240000000000000000000003A3A3A3A460000A0 ++:10E2500000000000000000000000000000000000BE ++:10E26000000000000008384444444A000000000058 ++:10E27000000000000000000000000000000000009E ++:10E2800000002A0000000054000000000000000010 ++:10E290000000000000440000000000000000000139 ++:10E2A00018098600C00D8600E80D8600200D860046 ++:10E2B000AC0D8600DCDC01009CE00100C8E301003D ++:10E2C000A8DF010088E0010094DF0100B4DC010058 ++:10E2D00010DD010094DE0100B0E0010014E1010056 ++:10E2E000A8DE0100FCE3010080DE010078E301000C ++:10E2F00010E40100C4E00100BCDE0100D0DE01003A ++:10E30000C8DC010038444444444444444444384450 ++:10E31000440000002C3838383838303434000000DD ++:10E3200000343A3A3A3A3A3A3A3A3A3A2C2C00001D ++:10E3300000323C3C3C3C3C000000000000003E48F9 ++:10E3400048424600000000000000000000000000FD ++:10E35000000000000000000000000A0038383E42C3 ++:10E3600000000000000000000000000000000000AD ++:10E37000000000000000000A030000000000444408 ++:10E38000444C4C4C17171700000000003232323852 ++:10E39000000000000000000000003838383800009D ++:10E3A0000000000000000000004C0000004C0000D5 ++:10E3B00000000000000000500000005000000000BD ++:10E3C00000000000000100000300000000004242C5 ++:10E3D00042424242171717000000000054545400F4 ++:10E3E000000000000000000000005050500000003D ++:10E3F00000000000000000002300000003000000F7 ++:10E400000001444444344444141414000000000047 ++:10E410000300000000006464646464642424240035 ++:10E42000000100003CE486000000800001000000C4 ++:10E4300084E5860001000000080024008DE58600C8 ++:10E44000020000000100000096E5860003000000C5 ++:10E45000030000009EE586000400000008000000A4 ++:10E46000A7E586000500000008000200B1E586006F ++:10E470000600000008000800BBE586000700000059 ++:10E4800008000600C5E58600080000000800060038 ++:10E49000CCE586000900000008000200D4E58600F3 ++:10E4A0000A00000008000300DCE586000B00000005 ++:10E4B00007000000E9E586000C00000008000600E7 ++:10E4C000EDE401000D00000008000700F7E4010082 ++:10E4D0000E0000000100000000000000000000002D ++:10E4E000000000006368616E7370656300703270D5 ++:10E4F0005F6966757064007032705F646566696537 ++:10E5000000000000C8E686000000000008000C00C3 ++:10E51000D7E686000100000007000400E9E6860057 ++:10E520000200000008000800FBE68600030000006F ++:10E53000070004000BE786000400000008001C0030 ++:10E540001BE786000500000008000C002CE7860091 ++:10E55000060000000700040043E7860007000000F3 ++:10E560000700040094E50100080000000700040013 ++:10E57000A4E501000900000007000400B8E501005F ++:10E580000A000000080090000000000000000000E9 ++:10E5900000000000706B745F66696C7465725F697F ++:10E5A000636D7000706B745F66696C7465725F692F ++:10E5B000636D705F636E740077616B655F7061633C ++:10E5C0006B6574005365742042525054206174206E ++:10E5D00025780A000A465749442030312D25780A0B ++:10E5E000000A54524150202578282578293A207075 ++:10E5F000632025782C206C722025782C20737020C5 ++:10E6000025782C207073722025782C2078707372F6 ++:10E610002025780A00202072302025782C207231A5 ++:10E620002025782C2072322025782C20723320254A ++:10E63000782C2072342025782C2072352025782CD7 ++:10E640002072362025780A00202072372025782C69 ++:10E650002072382025782C2072392025782C2072C1 ++:10E6600031302025782C207231312025782C2072F1 ++:10E6700031322025780A000A20202073702B3020A8 ++:10E6800025303878202530387820253038782025F6 ++:10E690003038780A00202073702B31302025303834 ++:10E6A0007820253038782025303878202530387883 ++:10E6B0000A0073702B257820253038780A006465AD ++:10E6C00061646D616E5F746F007265636C61696D2A ++:10E6D0002073656374696F6E20313A2052657475DA ++:10E6E000726E656420256420627974657320746F8E ++:10E6F0002074686520686561700A007265636C61EA ++:10E70000696D2073656374696F6E20303A205265BD ++:10E710007475726E65642025642062797465732057 ++:10E72000746F2074686520686561700A0072616D9D ++:10E730007374627964697300706125643D30782573 ++:10E74000257800706425643D3078252578006E7644 ++:10E7500072616D5F6F7665727269646500000000BA ++:10E7600086060200D0090000800602003E3E00003E ++:10E77000820602003E020000000702003C0000008A ++:10E780008406020012020000600104000300010080 ++:10E7900064010200C00000006001040003000100E9 ++:10E7A000660102000A00000060010400040001008C ++:10E7B0006401020014000000600104000700010071 ++:10E7C00064010200830100006001040025000100D3 ++:10E7D00064010200F40100006001040096050100DC ++:10E7E000660102002B04000060010400970501008F ++:10E7F000640102000001000060010400D701010073 ++:10E80000640102003C00000060010400DC01010022 ++:10E81000660102003400000060010400E201010012 ++:10E82000640102003000000060010400E701010003 ++:10E83000660102002C00000060010400ED010100EF ++:10E84000640102002C00000060010400F2010100DC ++:10E85000660102002800000060010400F8010100C8 ++:10E86000640102002800000060010400FD010100B5 ++:10E870006601020028000000FFFF00000000000009 ++:10E880006001040005000103640104000000190098 ++:10E89000240104000400000028010400000000001E ++:10E8A0002C01040000000000300104000000000002 ++:10E8B000340104000A04700034010400EFBED400E7 ++:10E8C00034010400050000FF3401040001FF02FFD1 ++:10E8D0003001040018000000340104000A04E000C4 ++:10E8E00034010400EFBE480034010400050000FFBD ++:10E8F0003401040001FF02FF34010400001018017C ++:10E9000034010400020300103401040018F1F2F392 ++:10E9100034010400BBCC0000300104006806000094 ++:10E92000340104001404700034010400EFBE5801E7 ++:10E9300034010400000000FF3401040001FF02FF65 ++:10E94000340104000010180134010400020303091B ++:10E9500034010400BF000010340104000000000076 ++:10E960003001040038000000340104000000000001 ++:10E970003001040088060000340104001404800003 ++:10E9800034010400EFBE1802340104000000030942 ++:10E9900034010400BF00000334010400000102033D ++:10E9A00034010400040500013401040002030405DD ++:10E9B0003401040000000000300104005800000091 ++:10E9C00034010400000000003001040038000000A1 ++:10E9D000340104000F2000073401040000009400FB ++:10E9E000340104000000009034010400747576774F ++:10E9F00034010400000000003401040000000500A0 ++:10EA000034010400FFFFFFFF300104006802000032 ++:10EA1000340104006E84330034010400DCBA500079 ++:10EA200034010400D40000AB34010400BADABADACD ++:10EA300034010400001018F134010400F2F3001056 ++:10EA40003401040018F1F2F3340104001000000056 ++:10EA500034010400000000003401040000000A003A ++:10EA6000340104000100000E340104004252434D01 ++:10EA7000340104005F54455334010400545F535380 ++:10EA800034010400494401043401040082848B965B ++:10EA900034010400030101063401040002000000F7 ++:10EAA0003001040068000000340104000A04280258 ++:10EAB00034010400DCBA8000340104000000FFFFD0 ++:10EAC00034010400FFFFFFFF34010400001018F1BF ++:10EAD00034010400F2F300103401040018F1F2F3E1 ++:10EAE00034010400D0AF0000340104000000000035 ++:10EAF0003401040000000001340104000200000E93 ++:10EB0000340104004252434D340104005F54455324 ++:10EB100034010400545F5353340104004944010498 ++:10EB20003401040082848B96340104000301010641 ++:10EB300034010400020100003001040068040000F8 ++:10EB4000340104000A04280234010400DCBA800005 ++:10EB5000340104000000FFFF34010400FFFFFFFF49 ++:10EB600034010400001018F134010400F2F3001025 ++:10EB70003401040018F1F2F334010400D0AF0000B6 ++:10EB80003401040000000000340104000000000112 ++:10EB9000340104000200000E340104004252434DCF ++:10EBA000340104005F54455334010400545F53534F ++:10EBB00034010400494401043401040082848B962A ++:10EBC00034010400030101063401040002010000C5 ++:10EBD0000001040000000001900402000000000099 ++:10EBE000A0040200F1F30000B0040200EFFD0000F9 ++:10EBF000A8040200FFFF0000A804020000000000BB ++:10EC0000AA04020000000000A4040200CF1A0000C1 ++:10EC1000AC04020000000000BC0402000000000080 ++:10EC2000A6040200D7020000B6040200FFFD0000A7 ++:10EC3000AE040200FFFF0000060402000100000015 ++:10EC400006040200000000000C040200180000008E ++:10EC5000060402000000000048040200000C00004E ++:10EC600002040200A00700000205020000000000EC ++:10EC70000005020000400000020502000400000040 ++:10EC8000000502000040000002050200080000002C ++:10EC90000005020000400000020502000C00000018 ++:10ECA000000502000040000002050200C000000054 ++:10ECB00080050200FFFF000082050200FFFF000048 ++:10ECC00084050200FFFF000086050200FFFF000030 ++:10ECD00088050200FFFF00009C050200F0FF000015 ++:10ECE000400502000080000020050200060F000021 ++:10ECF0004005020000800000400502000081000085 ++:10ED000020050200101D00004005020000810000E7 ++:10ED10004005020000820000200502001E280000BD ++:10ED20004005020000820000400502000083000050 ++:10ED30002005020029310000400502000083000088 ++:10ED4000400502000084000020050200323F000060 ++:10ED5000400502000084000040050200008500001C ++:10ED6000200502004041000040050200008500002F ++:10ED700012060200010000002E060200CDCC0000A9 ++:10ED8000300602000C0000000006020004800000B3 ++:10ED900096060200080000009A060200E400000047 ++:10EDA00088060200000000009C060200020000002D ++:10EDB00088060200001000009C060200020000000D ++:10EDC00088060200002000009C06020002000000ED ++:10EDD00088060200003000009C06020002000000CD ++:10EDE000880602000B0F00009E06020007000000CC ++:10EDF000100502000B00000050040200014E00004C ++:10EE0000520402005B010000E404020090000000D4 ++:10EE100004040200B400000054050200FF3F00009B ++:10EE2000600104000400010364010400000000000C ++:10EE300064010400B40000006401040047004700BE ++:10EE40006401040000006400640104003009400013 ++:10EE5000600104000D0001036401040002000200CF ++:10EE6000640104000100800064010400050000004A ++:10EE70006401040000008000640104006400640078 ++:10EE8000640104000E004700640104000005000056 ++:10EE90006001040015000103640104000000420841 ++:10EEA00064010400E00B0700640104000A00000094 ++:10EEB000600104001A0001036401040000C0660B35 ++:10EEC000600104001D00010364010400102700001C ++:10EED0006401040000007A036001040020000103C3 ++:10EEE00064010400060010276001040023000103F0 ++:10EEF000640104000000F606640104000000AA0A90 ++:10EF00006401040000003200640104000A0E0B09D1 ++:10EF1000640104000E020000640104000000520AB3 ++:10EF20006401040000003F0164010400FFFF000CC5 ++:10EF30006401040032046E06640104000200F20958 ++:10EF4000600104002E000103640104000000008041 ++:10EF50006001040032000103640104000000320B70 ++:10EF60006001040034000103640104000000CC05CA ++:10EF70006001040058000103640104004252434D43 ++:10EF8000640104005F54455364010400545F53530B ++:10EF900064010400494400006001040060000103B2 ++:10EFA0006401040039000000640104005000000006 ++:10EFB00064010400C000000060010400700001034F ++:10EFC00064010400AA03AA0364010400AA03AA03BB ++:10EFD00064010400AA03AA0364010400AA03AA03AB ++:10EFE00064010400EC03D60364010400C003AA0317 ++:10EFF00064010400F703E10364010400CB03B503DB ++:10F0000064010400AA03AA0364010400AA03AA037A ++:10F0100064010400AA03AA0364010400AA03AA036A ++:10F0200064010400EC03D60364010400C003AA03D6 ++:10F0300064010400F703E10364010400CB03B5039A ++:10F0400064010400020402046401040002040204D6 ++:10F05000640104000E0402046401040002041A04A2 ++:10F0600064010400020402046401040002040204B6 ++:10F070006401040002040204640104002604020482 ++:10F080006401040002040204640104000204020496 ++:10F09000640104000E0402046401040002041A0462 ++:10F0A0006401040002040204640104000204020476 ++:10F0B0006401040002040204640104002604020442 ++:10F0C0006401040000001F0064010400FF031F002E ++:10F0D000640104000200000064010400020000005A ++:10F0E00060010400980001036401040000001F0097 ++:10F0F00064010400FF031F0064010400010000001C ++:10F10000640104000100000060010400A00001038C ++:10F110006401040000001F0064010400FF031F00DD ++:10F12000640104000100000064010400010000000B ++:10F1300060010400A80001036401040000001F0036 ++:10F1400064010400FF031F006401040001000000CB ++:10F15000640104000100000060010400B800010324 ++:10F1600064010400E700EC006401040000007B007F ++:10F17000640104007E00000064010400000000003F ++:10F180006401040000004F51640104003F000000CE ++:10F19000640104000000001060010400C0000103CD ++:10F1A0006401040037243724640104003724372421 ++:10F1B0006001040093010103640104000F0040009A ++:10F1C00064010400E60600006001040097010103E9 ++:10F1D000640104001A08000060010400A00101039A ++:10F1E00064010400FFFFFFFF64010400FFFFFFFF55 ++:10F1F00064010400FFFFFFFF64010400FFFFFFFF45 ++:10F2000064010400FFFFFFFF64010400FFFFFFFF34 ++:10F2100064010400FFFFFFFF64010400FFFFFFFF24 ++:10F2200060010400BC01010364010400000005004A ++:10F2300060010400C5010103640104000000100323 ++:10F2400064010400E000FFFF640104000309BF0043 ++:10F25000640104000000030964010400BF00001001 ++:10F26000640104000309BF006401040000030000FE ++:10F2700060010400CD01010364010400FFFFFFFFF2 ++:10F2800064010400FFFFFFFF64010400FFFFFFFFB4 ++:10F2900064010400FFFFFFFF64010400FFFFFFFFA4 ++:10F2A00064010400FFFFFFFF64010400FFFFFFFF94 ++:10F2B00064010400FFFFFFFF640104002000CB0194 ++:10F2C0006401040000005400640104000000AB0865 ++:10F2D00064010400000010046401040084000200C2 ++:10F2E000640104000000140064010400CF01020066 ++:10F2F000640104004400000064010400AF0802003F ++:10F3000064010400100464006401040002020000AF ++:10F31000640104001000CA016401040002003C0002 ++:10F32000640104000000AA08640104000200100443 ++:10F330006401040054000208640104000000080095 ++:10F3400064010400CE0100006401040034000000E8 ++:10F3500064010400AE0800006401040010044400CD ++:10F3600064010400020A0000640104000800C901ED ++:10F370006401040002003000640104000000A908D8 ++:10F380006401040002001004640104003C00021047 ++:10F39000640104000000040064010400CD010000C9 ++:10F3A000640104002C00000064010400AD080000AA ++:10F3B000640104001004340064010400021200001F ++:10F3C000640104000400C8016401040000002C0072 ++:10F3D000640104000000A808640104000000100497 ++:10F3E0006401040030000219640104000000000000 ++:10F3F00064010400CC010200640104002C00000040 ++:10F4000064010400AC080200640104001004300030 ++:10F4100064010400021A000064010400C0000A0430 ++:10F420006401040070000000640104003A010A0451 ++:10F430006401040028022CC064010400F2020A04E2 ++:10F440006401040000000001640104006000140471 ++:10F450006401040038000000640104000201140487 ++:10F460006401040014012CC064010400DE011404D2 ++:10F4700064010400000080006401040022003704DD ++:10F48000640104001500000064010400DF0037047B ++:10F490006401040065002CC0640104002E013704DF ++:10F4A0006401040000002F006401040011006E8458 ++:10F4B000640104000B00000064010400D4006E84A9 ++:10F4C0006401040033002CC064010400FC006E845D ++:10F4D00064010400000018006401040002008A9D19 ++:10F4E00064010400FB00020864010400C54EFA0038 ++:10F4F00064010400020A833464010400FE00021067 ++:10F50000640104006227F900640104000212421A37 ++:10F5100064010400FD00021964010400B113F80045 ++:10F5200064010400021A811164010400FC00021C41 ++:10F5300064010400C10FFC00600104007B030103AF ++:10F540006401040007001400640104001E000000B0 ++:10F55000600104008303010364010400000000F063 ++:10F5600064010400C3301092640104005031802211 ++:10F5700064010400C330000060010400880301033B ++:10F580006401040000001004600104008C03010306 ++:10F590006401040080000000600104008E03010388 ++:10F5A0006401040005000000600104000B04010375 ++:10F5B0006401040000000702600104001404010358 ++:10F5C000640104000100000060010400160401034E ++:10F5D000640104000C0000006001040053050103F5 ++:10F5E00064010400000018006001040055050103D7 ++:10F5F00064010400983A983A64010400A60E64007D ++:10F60000640104000000F40164010400050000002E ++:10F6100064010400A861A8616401040030751E0043 ++:10F62000600104005D0501036401040050C3000093 ++:10F63000600104005F05010364010400000014057B ++:10F640006401040050C3000060010400630501036D ++:10F6500064010400204E00006401040000000F005B ++:10F6600064010400F4010400600104006905010361 ++:10F670006401040000003100640104000000030084 ++:10F68000640104000100070064010400C8AF000029 ++:10F690006401040088130000640104002C17FF00BB ++:10F6A00060010400700501036401040000002C01E6 ++:10F6B000640104000000A00F600104007305010351 ++:10F6C00064010400000003006401040000002C0138 ++:10F6D00064010400C00000006401040088130000FD ++:10F6E000640104006400000064010400DC05401FA4 ++:10F6F000600104007A0501036401040001000100B7 ++:10F700006401040002000000600104007D050103A3 ++:10F710006401040002000000640104000000409C39 ++:10F7200064010400204E000064010400B80B0000D6 ++:10F730006001040082050103640104000000204E02 ++:10F74000640104000000050064010400DC053F00C2 ++:10F7500064010400710200006401040030750000BF ++:10F76000600104008A05010364010400C409A00FBC ++:10F77000600104008D050103640104000A00D00744 ++:10F78000600104008F05010364010400204E204E37 ++:10F79000600104009505010364010400BE0000003F ++:10F7A00060010400B105010364010400E8030000E6 ++:10F7B00060010400ED050103640104000000000085 ++:10F7C00060010400F60501036401040088130000D1 ++:10F7D0006001040003000200640104001F00000037 ++:10F7E000600104000400020064010400FF03000043 ++:10F7F0006001040005000200640104001F00000015 ++:10F80000600104000600020064010400070000001B ++:10F81000600104000700020064010400040000000D ++:10F82000600104000800020064010400FFFF000002 ++:10F8300060010400090002006401040000000000EF ++:10F84000600104000A0002006401040000000000DE ++:10F85000600104000B0002006401040000000000CD ++:10F86000600104000C0002006401040000000000BC ++:10F87000600104000D0002006401040000000000AB ++:10F88000600104000E00020064010400000000009A ++:10F89000600104000F000200640104000000000089 ++:10F8A0006001040010000200640104001F00000059 ++:10F8B0006001040011000200640104000000000067 ++:10F8C0006001040012000200640104000000000056 ++:10F8D0006001040013000200640104000000000045 ++:10F8E0006001040015000200640104000000000033 ++:10F8F0006001040016000200640104000000000022 ++:10F90000FFFF000000000000636275636B5F7377A8 ++:10F910006672657100000000E02E010101500000D8 ++:10F9200000000000C832020101490000899DD80092 ++:10F930004038030101420000AAAAAA00003C0401C9 ++:10F94000013E000000008000483F05010139000031 ++:10F95000D05E4200A0410601013900004992240016 ++:10F96000004B07010132000000000000584D080163 ++:10F9700001300000071F7C00204E0901013000000B ++:10F9800000000000A8610A0101260000666666000A ++:10F9900090650B0101240000C44EEC0030750C0191 ++:10F9A000012000000000000018920D020133000049 ++:10F9B000F93E560000960E020132000000000000E1 ++:10F9C000409C0F02013000000000000080BB1002CC ++:10F9D00001280000000000000000000000000000FE ++:10F9E0000000000009FA0100000000000800080003 ++:10F9F00008FA01000100000008000B0000000000F0 ++:10FA000000000000000000006D6B6565705F616CB8 ++:10FA100069766500746F655F6F6C00746F655F7306 ++:10FA20007461747300746F655F73746174735F6382 ++:10FA30006C65617200AAAA030000000014FA0100BC ++:10FA400000000000070000001BFA01000100000098 ++:10FA500008004C0025FA0100020000000000000030 ++:10FA6000000000000000000000000000D58D8600AE ++:10FA70000C00800001000000A98E86000B00000031 ++:10FA800001000000B58E86000300000005000000A4 ++:10FA9000C18E86000400000007000000D08E8600A2 ++:10FAA00005008000010000000000000000000000D0 ++:10FAB000000000005B574C414E5D636F756E742013 ++:10FAC0003D2025640A000000D550830021578300A3 ++:10FAD0000000000000000000627461006274616D4B ++:10FAE00070006274616D705F666C61677300627450 ++:10FAF000616D705F6368616E006274616D705F312B ++:10FB0000316E5F737570706F7274006274616D70C6 ++:10FB10005F6662006274616D705F73746174656CBE ++:10FB20006F6700414D502D253032782D25303278C9 ++:10FB30002D253032782D253032782D253032782D14 ++:10FB400025303278000000007DC5860000000000EE ++:10FB50000800240084C586000100000008000000A1 ++:10FB600093C586000200000008000C00A4C58600B2 ++:10FB7000030000000800E402AFC586000400000096 ++:10FB800007000000C0C58600050000000800240032 ++:10FB9000C9C586000600000001000000D1C586002E ++:10FBA0000700000007000000DBC586000800000019 ++:10FBB0000100000049C586000900000001000000A6 ++:10FBC000000000000000000000000000776C635F90 ++:10FBD00061757468656E74696361746F725F646F78 ++:10FBE000776E0025733A2063616C6C65640A00705F ++:10FBF000617463685F696F76617273006F747072AD ++:10FC00006177006175746800666162696400616DA6 ++:10FC10007064755F727473005856000243004000B0 ++:10FC2000207986000000004003000000FCFB01007A ++:10FC300007000800080000003D7D860001000880E4 ++:10FC40000800000003FC0100020000400600000064 ++:10FC50004FDB0100030010000700000008FC01005A ++:10FC60000400000005000000647D8600050000001F ++:10FC700008001C000EFC010006000000010000004E ++:10FC80000000000000000000000000004D84FF8321 ++:10FC90004CC4001FB784FF80B184FFDFB0C40808E4 ++:10FCA000FA84F7FFF9C4080001006C090200710929 ++:10FCB0000300760904007B09050080090600850918 ++:10FCC00007008A0908008F09090094090A009909A8 ++:10FCD0000B009E090C00A3090D00A8090E00B40931 ++:10FCE000CC0102000000D400000000000000000170 ++:10FCF0000000000000002D00A7901A0047090E0028 ++:10FD0000012007008B93030038CA01002AE5000098 ++:10FD1000977200004C390000A61C0000530E000032 ++:10FD20002907000095030000CA010000E50000005B ++:10FD300073000000390000001D0000006E840B00FD ++:10FD40000000D400000000000000000100000000DE ++:10FD50006030180C6C482412776C25643A20536389 ++:10FD6000616E20696E2070726F67726573732C20EC ++:10FD7000736B697070696E67207478706F776572E5 ++:10FD800020636F6E74726F6C0A00706F77657220FB ++:10FD900061646A210A002E6661622E0025732E6658 ++:10FDA00061622E25640063636B6277323032677064 ++:10FDB0006F0063636B62773230756C3267706F000F ++:10FDC0006C65676F66646D627732303267706F00A2 ++:10FDD0006C65676F66646D62773230756C32677020 ++:10FDE0006F006D6373627732303267706F006D63DE ++:10FDF0007362773230756C3267706F006D63736257 ++:10FE00007734303267706F006C65676F66646D625F ++:10FE100077323035676C706F006C65676F66646D44 ++:10FE200062773230756C35676C706F006C65676F28 ++:10FE300066646D6277323035676D706F006C656730 ++:10FE40006F66646D62773230756C35676D706F0008 ++:10FE50006C65676F66646D62773230356768706FA6 ++:10FE6000006C65676F66646D62773230756C3567FC ++:10FE700068706F006D63736277323035676C706FD6 ++:10FE8000006D637362773230756C35676C706F002C ++:10FE90006D63736277343035676C706F006D6373B8 ++:10FEA0006277323035676D706F006D6373627732E1 ++:10FEB00030756C35676D706F006D637362773430C9 ++:10FEC00035676D706F006D637362773230356768C8 ++:10FED000706F006D637362773230756C3567687070 ++:10FEE0006F006D637362773430356768706F006DD3 ++:10FEF00063733332706F006C65676F66646D3430A6 ++:10FF0000647570706F00616E7473776974636800F4 ++:10FF1000616135670074737369706F733267006570 ++:10FF2000787470616761696E3267007064657472BD ++:10FF3000616E6765326700747269736F3267006162 ++:10FF40006E74737763746C32670074737369706F67 ++:10FF50007335670065787470616761696E35670035 ++:10FF60007064657472616E67653567007472697379 ++:10FF70006F356700616E74737763746C35670070FA ++:10FF80006132677730613300706132677731613396 ++:10FF9000006D61787032676130006D617870326732 ++:10FFA00061310070613267773061300070613267B3 ++:10FFB0007730613100706132677731613000706194 ++:10FFC00032677731613100706132677732613000BA ++:10FFD0007061326777326131006D61787035676CBE ++:10FFE0006130006D61787035676C6131007061352A ++:10FFF000676C7730613000706135676C77306131E4 ++:020000022000DC ++:1000000000706135676C7731613000706135676C05 ++:100010007731613100706135676C77326130007023 ++:100020006135676C77326131006D61787035676179 ++:1000300030006D61787035676131007061356777C8 ++:100040003061300070613567773061310070613543 ++:1000500067773161300070613567773161310070E9 ++:1000600061356777326130007061356777326131B1 ++:10007000006D6178703567686130006D617870354A ++:100080006768613100706135676877306130007092 ++:100090006135676877306131007061356768773145 ++:1000A00061300070613567687731613100706135AA ++:1000B0006768773261300070613567687732613127 ++:1000C000006D61787035676133006D6178703567F8 ++:1000D0006C61330070613567773061330070613572 ++:1000E000676C773061330070613567773161330059 ++:1000F000706135676C7731613300706135677732D5 ++:10010000613300706135676C773261330062773438 ++:1001100030706F00636464706F0073746263706F3B ++:10012000006277647570706F00747870696432670C ++:100130006130007478706964326761310069747489 ++:100140003267613000697474326761310063636BD8 ++:100150003267706F006F66646D3267706F006D6339 ++:10016000733267706F30006D63733267706F310088 ++:100170006D63733267706F32006D63733267706FD7 ++:1001800033006D63733267706F34006D6373326771 ++:10019000706F35006D63733267706F36006D637317 ++:1001A0003267706F3700747870696435676C6130DE ++:1001B00000747870696435676C6131006F66646DD6 ++:1001C00035676C706F006D637335676C706F3000EE ++:1001D0006D637335676C706F31006D637335676C79 ++:1001E000706F32006D637335676C706F33006D63D1 ++:1001F0007335676C706F34006D637335676C706F47 ++:1002000035006D637335676C706F36006D637335E1 ++:10021000676C706F3700747870696435676130009F ++:100220007478706964356761310069747435676129 ++:10023000300069747435676131006F66646D3567CD ++:10024000706F006D63733567706F30006D63733569 ++:1002500067706F31006D63733567706F32006D6367 ++:10026000733567706F33006D63733567706F34007B ++:100270006D63733567706F35006D63733567706FCD ++:1002800036006D63733567706F370074787069641A ++:10029000356768613000747870696435676861310A ++:1002A000006F66646D356768706F006D63733567E6 ++:1002B00068706F30006D6373356768706F31006D03 ++:1002C0006373356768706F32006D6373356768708C ++:1002D0006F33006D6373356768706F34006D6373DF ++:1002E000356768706F35006D6373356768706F369A ++:1002F000006D6373356768706F3700656C6E6132CF ++:100300006700656C6E6135670074656D706F666659 ++:100310007365740070687963616C5F74656D706497 ++:10032000656C7461000C1218243048606C003CC489 ++:1003300007003BC407004C84FFE0B084F7F7F98462 ++:10034000F7FF000008040200350108300800030030 ++:100350001204020043010000010000001C0402001E ++:1003600048010800030000002C04020049010800B5 ++:1003700003000000390402004A01080003000000E5 ++:10038000470402004E01080003000000520402006E ++:100390003D014000070007005E0402007A010004EE ++:1003A000070000006C0402003F010000060000008E ++:1003B00077040200400100000200000082040200F5 ++:1003C0007C010000020000008F04020042010000D6 ++:1003D000070000009B040200280008000300000042 ++:1003E000AC0402002900000001000000B904020072 ++:1003F0007F0100000200000000000000000000007B ++:1004000000000000706879007478696E737470770A ++:1004100072007068795F6D75746564007068795FEB ++:10042000676C697463687468727368007068795F78 ++:100430006E6F6973655F7570007068795F6E6F6964 ++:1004400073655F64776E007068795F706572636171 ++:100450006C007068795F7278697165737400706898 ++:10046000796E6F6973655F73726F6D006E756D5F26 ++:1004700073747265616D0062616E645F72616E6754 ++:10048000650073756262616E643567766572006DD2 ++:10049000696E5F7478706F776572007068795F6FEE ++:1004A000636C736364656E61626C65007068795F2C ++:1004B0007278616E7473656C007068795F637273D3 ++:1004C0005F7761720000EB04C00100006A04FFFF67 ++:1004D000190036001A013A00250028000500120113 ++:1004E000FF001F010B0013010700FC00FD00FF00CF ++:1004F000C000CA00C5001200570059005C00780017 ++:100500009200980016012C016A000B001B001301D9 ++:100510001D0014012E002A011201F904010001003E ++:10052000FA04010000004C04001800184D0400609B ++:1005300000603809FF01FF013909FF019E003B04FB ++:10054000030003003C0403000000DA46FFFFDBC6A3 ++:100550000300D10604000400977A977A977A977A75 ++:10056000877A877A977B000006000000060000006B ++:1005700006000000060000003809040004003909E4 ++:1005800004000400A404001000104AC444004A44BB ++:1005900080004AC444004A448000A4040040000093 ++:1005A000A40400800080D00420000000A404FF0107 ++:1005B0000000A504FF00FF00A50400700050A50482 ++:1005C000000700000D04FF0040000D0400070004B8 ++:1005D000A204FF004000A20400070004A804FF00DA ++:1005E0000100D70401000100D704400000003706D5 ++:1005F00000C00080810400020002B704007F006C8C ++:10060000B10400200000390900020000380900028E ++:100610000002B00408000800B0040008000839090E ++:10062000000800003809000800081004080008004D ++:10063000DA062000000003050100000003050400A5 ++:100640000000A40400400000A40400800000D004C6 ++:1006500020000000A504FF00FF00A504007000506A ++:10066000A504000700000D04FF0040000D04000772 ++:100670000006A204FF004000A20400070006D904FF ++:1006800070002000D90400070003D9040070001096 ++:10069000DA0400100000DA0400200020A604008024 ++:1006A0000080D70408000800D70400700010D904A7 ++:1006B00004000000D9040800080000000000000049 ++:1006C0000000000000000000FFEEDDCCBB99887741 ++:1006D0006655443322110000DA46FFFF0305080087 ++:1006E000080025642009202564200A004572726FE5 ++:1006F000722067657474696E67206C6F772069710A ++:10070000206573740A004572726F72206765747495 ++:10071000696E672068696768206971206573740A6B ++:1007200000004AC480004A847F00D0040200000018 ++:10073000D204FF000000D20400FF0000D004080033 ++:1007400000004C04000800084D0400200000B00424 ++:1007500000010001B644FFFFB7040F000F004C0476 ++:10076000000800084D0400200020B0040001000132 ++:100770003B04010001003C04010001003C040100B5 ++:1007800000003B04010000004AC444004A448000C9 ++:10079000DAC64000DBC60300DA06200020001004A1 ++:1007A00008000000A60400800080A604FF01FF00EE ++:1007B0009A04FF01FF008007000400048007000284 ++:1007C0000002D60603000000DA06080008004249CD ++:1007D00002003B4900003C49000076068000000012 ++:1007E000DA06010000006C08040000006C084000FC ++:1007F00000006C0800040000D70408000000D804C2 ++:1008000001000000D804020000003B0404000400C2 ++:100810003C04040000003B04040004003C04040009 ++:10082000000084806782568034823B04010001000E ++:100830003C04010001003C04010000003B040100F5 ++:1008400000003B04020002003C04020002003C04E1 ++:10085000020000003B0402000000977A977A977A22 ++:10086000977A877A877A977B0F0900090109060929 ++:10087000070908090209030909090A090B090409FA ++:1008800005090C090D090E09110987466000424649 ++:1008900007003B84EDFF3C04020002004C84D0EFD3 ++:1008A0004D84D7BF4D04040004004D040300010033 ++:1008B000F984F8FFFA84F8FF3B04020002003C04CC ++:1008C000020000003B04100010003C044000000047 ++:1008D0004C04001000104D04004000404D04040082 ++:1008E00000004C04040004004C04080008004D04FF ++:1008F000080000004C04200020004D0420002000CF ++:10090000F90402000200FA0402000000F9040400E5 ++:100910000400FA0404000000F90401000100FA04D4 ++:1009200001000000DB04FF03A602DB0400700020CE ++:100930009A05FF0326009B05FF03A5009C05FF0306 ++:10094000A6009C0500FC00289D05003C001C9D05A0 ++:10095000FF03A800A40400800080A404004000401D ++:10096000A40400200020B004800000003B044000EC ++:100970000000A904008000802184238434838480C3 ++:100980006782568034823B04020002003C0402006D ++:1009900000003B04100010003C04400000004B44E9 ++:1009A000FFFFB10400040000B1040080000038091A ++:1009B00040004000380904000400390940000000EC ++:1009C000390904000400D70402000200D7048000A3 ++:1009D0000000D70401000100D70440004000D70404 ++:1009E00008000800D70400700020DA06400040002C ++:1009F000A40400200000D70408000800D7040070F9 ++:100A0000002031C61500D60603000000DAC68F00AC ++:100A1000100480000000A8440A000305A404D004C8 ++:100A2000D904DA04A60438093909D804D004D70453 ++:100A3000A5040D04A2044C04001000104D04004055 ++:100A400000404C04000800084D04002000003B0456 ++:100A5000020002003C04020000003B04010001000F ++:100A60003C04010000004C04080008004D0408008C ++:100A700008004C04200020004D0420000000F90470 ++:100A800002000200FA0402000200F904040004005B ++:100A9000FA0404000400F90401000100FA04010052 ++:100AA00001005344A90A3D49C000000000000000B5 ++:100AB000000000000000000000000000977A877A24 ++:100AC000877A977B760680008000DA0601000100B5 ++:100AD0006C08040004006C08400040006C0800042E ++:100AE000000410091E091F092409250926092009E7 ++:100AF000210927092809290922092309300931096F ++:100B000032091209D7440000D70401000100D704BC ++:100B100040000000D70401000100D704400040005D ++:100B20001004020000001004010000001004020084 ++:100B30000000100401000100100402000200100473 ++:100B4000010000007A46030073467017744644049F ++:100B500075463F00704681068C4649004AC44400F1 ++:100B60004A448000004001400240034004400540E8 ++:100B700006400740075B0780A3C60100A386FEFF6F ++:100B80000700FF001F013A001A01050082008600DD ++:100B90002E0113017D002800340600FF0000DAC694 ++:100BA00080000AC02802760680000000DA060100F4 ++:100BB00000006C08040000006C08400000006C0895 ++:100BC00000040000D80401000000D8040200000066 ++:100BD000D704080000004C84FFE73B840C005384DA ++:100BE000FF7F53C40080424907003B4917203C491E ++:100BF000C527D60603000100DA0608000000DA0661 ++:100C0000800000000A46A0006A4419000F0900098C ++:100C100001090609070908090209030909090A095E ++:100C20000B09040905090C090D090E091109C9462A ++:100C300000068046FF0081463F01CE460000CB46BD ++:100C40000000CC460000CD4600009D46FF07A446AC ++:100C50000000A5460000D90404000400D9040800DF ++:100C60000000A40400400040A40400400000DAC6D4 ++:100C700040000100D70408000800D70400700030CD ++:100C80004AC444004A4480003B0404000000380980 ++:100C900040000000380904000000D70402000000F2 ++:100CA000D70401000000D70408000000D8040100A8 ++:100CB0000000D8040200000000FC070069A5050040 ++:100CC000FF010000695D0A0000040800975E0A0049 ++:100CD0000102000097A60500D70401000100D70417 ++:100CE00040004000D70401000000D90401000100C9 ++:100CF000D904020000000000AA0A02009A05FF03BE ++:100D000026009B05FF0389009C05FF038A009C05C4 ++:100D100000FC00209D05003C002C9D05FF038C007D ++:100D20003B04010001003C040100000038090008F8 ++:100D30000008390900080008DA0600800080D306A0 ++:100D400000800080D30600800000DA0600800000EA ++:100D50000A80D7FDDA867FFFD7C6010031C60018AA ++:100D60003B4400003C4400004C440000E6440000CA ++:100D7000F9440000B044000038490000B0440000CD ++:100D80004E44000067C503004AC444004A44800042 ++:100D90004804000300010806FF0017000406FF07CF ++:100DA000EA0342490F004249000042490F004A4409 ++:100DB00084004A448000D3462222D34620223B4965 ++:100DC00017203C49C5270305010000000305040066 ++:100DD00000000305100010004249000042490F00C6 ++:100DE000424900003B4917003C49C5074AC444003A ++:100DF0004A448000D70408000000D7040070002097 ++:100E0000380904000400390904000400A404001097 ++:100E10000010D70404000400D704000F00008B4624 ++:100E200000007646A1B816012D012C016A00980039 ++:100E300097002F010B0013011D0014012E002A0141 ++:100E400009001F010700FF000500D0040100000099 ++:100E5000D304FF000000D30400FF0000D004100002 ++:100E60000000D004040000003A0980008000230440 ++:100E7000FF0049003404FF00FCFF1604FF00A4FF3C ++:100E8000160400FF009F240400FF002A230400FF33 ++:100E9000002D2504FF000F000005FF000F000005D6 ++:100EA00000FF000F2004FF000A00340400070001C7 ++:100EB0003204FF00BF00320400FF00B8FF0400FC52 ++:100EC0000018D106040000004B06400040002184B9 ++:100ED0002384348384806782568034824B060100E9 ++:100EE00001004B06080008005F36291F5F36291FE6 ++:100EF0005F36291F5F36291F000000000000000038 ++:100F000000000000000000000000000000000000E1 ++:100F100000000000000000000400000000000000CD ++:100F200004000000080000000100000005000000AF ++:100F3000090000000D0000004D0000008D000000C1 ++:100F40000D0000004D0000008D000000CD000000ED ++:100F50005200000092000000D2000000D600000005 ++:100F600016010000160500001609000056090000D1 ++:100F7000560D000056110000961100009651000019 ++:100F80009691000096D1000096110100000000002B ++:100F90000000000000000000000000000000000051 ++:100FA0000000000004000000000000000400000039 ++:100FB000080000000100000005000000090000001A ++:100FC0000D0000004D0000008D0000000D0000002D ++:100FD0004D0000008D000000CD0000005200000018 ++:100FE00092000000D2000000D600000016010000B0 ++:100FF000160500001609000056090000560D0000F5 ++:1010000056110000565100005691000056D10000C4 ++:1010100056110100565101005691010056D10100B0 ++:1010200000000000000000000000000000000000C0 ++:1010300000000000000000000000000000000000B0 ++:1010400000000000000000000000000000000000A0 ++:101050000000000000000000000000000000000090 ++:101060000000000000000000000000000000000080 ++:1010700000000000000000000A0009000600050052 ++:101080000A000900060005000A0009000600050024 ++:101090000A000900060005000A0009000600050014 ++:1010A0000A000900060005000A0009000600050004 ++:1010B0000A000900060005000A00090006000500F4 ++:1010C0000A000900060005000A00090006000500E4 ++:1010D0000A000900060005000A00090006000500D4 ++:1010E0000A000900060005000A00090006000500C4 ++:1010F0000A000900060005000E00000000020003BF ++:10110000000400060008000B00100110021003107C ++:10111000041005100610071007170720072D0740B9 ++:1011200000000000000000000000000000000000BF ++:1011300000000000000000000000000000020003AA ++:10114000000400060008000B00100110021003103C ++:10115000041005100610071007170720072D074079 ++:10116000000000000000000000000000000000007F ++:10117000000000000000000000000000000000006F ++:10118000000000000000000000000000000000005F ++:10119000000000000000000000000000000000004F ++:1011A00000000000000000000000004000000000FF ++:1011B000000000000000000000000000000000002F ++:1011C000000000000000000000000000000000001F ++:1011D000000000000000000000000000000000000F ++:1011E00000000000000000000000000000000000FF ++:1011F00000000000000000000000000000000000EF ++:1012000000000000000000000000000000000000DE ++:1012100000000000000000000000000000000000CE ++:1012200000000000000000000000000000000000BE ++:1012300000000000000000000000000000000000AE ++:10124000000000000000000000000000000000009E ++:1012500000000000F8410100F8210000FB2100001F ++:10126000FB410000DBFE01007B2100003321000078 ++:10127000EB400000A3FE01004B0200004D014D01B8 ++:101280004D014D014D014D014D014D014D014D01EE ++:101290004D014D014D014D014D014D014D014D01DE ++:1012A0004D014D014D014D014D014D014D014D01CE ++:1012B0004D014D014D014D014D014D014D014D01BE ++:1012C0004D014D014D014D014D014D014D014D01AE ++:1012D0004D014D014D014D014D014D014D014D019E ++:1012E0004D014D014D014D014D014D014D014D018E ++:1012F0004D014D014D014D014D014D01090F1418D6 ++:10130000FE070B0FFBFE0105080B0E111417000062 ++:1013100000000000000306090C0F1200000000008E ++:1013200000000000000306090C0F1215181B000036 ++:101330000000000003EB000001001000100020007E ++:101340000100300010004000220050002201600027 ++:101350002202700022038000220490002205A000D7 ++:101360002206B0002207C0002208D0002209F000A7 ++:10137000220A1000220B2000220C3000220D400017 ++:10138000220E5000220F600000000000000000004C ++:10139000000000000000000000000000000000004D ++:1013A0000000000000000000040000000000000039 ++:1013B000040000000800000001000000050000001B ++:1013C000090000000D0000004D0000008D0000002D ++:1013D0000D0000004D0000008D000000CD00000059 ++:1013E0004F0000008F000000CF000000D30000007D ++:1013F0001301000013050000130900005309000049 ++:10140000530D000053110000931100009351000090 ++:101410009391000093D1000093110100000000009F ++:1014200000000000000000000000000000000000BC ++:1014300000000000040000000000000004000000A4 ++:101440000800000001000000050000000900000085 ++:101450000D0000004D0000008D0000000D00000098 ++:101460004D0000008D000000CD0000004F00000086 ++:101470008F000000CF000000D30000001301000027 ++:10148000130500001309000053090000530D00006C ++:1014900053110000535100005391000053D100003C ++:1014A00053110100535101005391010053D1010028 ++:1014B000000000000000000000000000000000002C ++:1014C000000000000000000000000000000000001C ++:1014D000000000000000000000000000000000000C ++:1014E00000000000000000000000000000000000FC ++:1014F00000000000000000000000000000000000EC ++:1015000000000000000000000104020403040404C1 ++:10151000050406040704080409040A048B058C0565 ++:101520008D058E058F059000910092009301940126 ++:10153000950196019701980199019A019B019C01DF ++:101540009D019E019F01A001A101A201A301A4018F ++:10155000A5010000010101010101010101010101D9 ++:10156000010101010101010101010101010101016B ++:101570000101020301030201010101010101010155 ++:10158000010101010101010101010101010101014B ++:10159000010101010101010101010101010101013B ++:1015A000010101010101010101010101010101012B ++:1015B0000101020301030201010101010101010115 ++:1015C000010101010101010101010101010101010B ++:1015D000010101017C120200400000000200000035 ++:1015E0000000000010000000D411020040000000C4 ++:1015F0000100000000000000100000005412020072 ++:101600000A0000000B0000000000000020000000A5 ++:1016100038130200140000000C000000000000005D ++:1016200020000000A41A0200940000000D00000039 ++:101630000000000020000000081502002600000045 ++:101640000E000000000000001000000078100200F2 ++:10165000400000000F00000000000000100000002B ++:10166000081D020010000000100000000000000033 ++:1016700008000000FC1202003C0000001100000005 ++:101680000000000008000000881302006000000055 ++:1016900012000000000000002000000054150200AD ++:1016A000800000001400000000000000080000009E ++:1016B000EC1602009A000000170000000000000075 ++:1016C00010000000FC1002006C0000000000000090 ++:1016D000000000001000000020180200A000000020 ++:1016E0001800000000000000200000001A00340074 ++:1016F0004E0068009C00D000EA000401340068003D ++:101700009C00D0003801A001D40108024E009C00CA ++:10171000EA003801D4017002BE020C036800D00058 ++:101720003801A00170024003A803100418009C00B7 ++:10173000D0000401EA0038018601D0000401040150 ++:1017400038016C016C01A001380186018601D401C9 ++:10175000220222027002040138016C0138016C017E ++:10176000A001D401A001D401080208023C028601B4 ++:10177000D4012202D40122027002BE027002BE0213 ++:101780000C030C035A0336006C00A200D80044017D ++:10179000B001E6011C026C00D8004401B0018802CF ++:1017A0006003CC033804A2004401E6018802CC03A4 ++:1017B0001005B2055406D800B00188026003100578 ++:1017C000C0069807700818004401B0011C02E60129 ++:1017D00088022A03B0011C021C028802F402F402EF ++:1017E000600388022A032A03CC036E046E041005EA ++:1017F0001C028802F4028802F4026003CC03600336 ++:10180000CC0338043804A4042A03CC036E04CC03AC ++:101810006E041005B2051005B20554065406F6060E ++:101820000000080000000800000008000000080098 ++:101830000000080000000800000008000000080088 ++:101840000000080000000800000008000000080078 ++:101850000000080000000800000008000000080068 ++:101860000000080000000800000008000000080058 ++:101870000000080000000800000008000000080048 ++:101880000000080000000800000008000000080038 ++:101890000000080000000800000008000000080028 ++:1018A0000000080000000800000008000000080018 ++:1018B0000000080000000800000008000000080008 ++:1018C00000000800000008000000080000000800F8 ++:1018D00000000800000008000000080000000800E8 ++:1018E00000000800000008000000080000000800D8 ++:1018F00000000800000008000000080000000800C8 ++:1019000000000800000008000000080000000800B7 ++:1019100000000800000008000000080000000800A7 ++:101920000000080000000800000008000000080097 ++:101930000000080000000800000008000000080087 ++:101940000000080000000800000008000000080077 ++:101950000000080000000800000008000000080067 ++:101960000000080000000800000008000000080057 ++:101970000000080000000800000008000000080047 ++:101980000000080000000800000008000000080037 ++:101990000000080000000800000008000000080027 ++:1019A0000000080000000800000008000000080017 ++:1019B0000000080000000800000008000000080007 ++:1019C00000000800000008000000080000000800F7 ++:1019D00000000800000008000000080000000800E7 ++:1019E00000000800000008000000080000000800D7 ++:1019F00000000800000008000000080000000800C7 ++:101A000000000800000008000000080000000800B6 ++:101A100000000800000008000000080000000800A6 ++:101A20000000080000000800000008000000080096 ++:101A30000000080000000800000008000000080086 ++:101A40000000080000000800000008000000080076 ++:101A50000000080000000800000008000000080066 ++:101A60000000080000000800000008000000080056 ++:101A70000000080000000800000008000000080046 ++:101A80000000080000000800000008000000080036 ++:101A90000000080000000800000008000000080026 ++:101AA0000500000000000000000000000000001021 ++:101AB00000000000000000200000000000000030D6 ++:101AC0000000000000000040000000000000005086 ++:101AD0000000000000000060000000000000007036 ++:101AE00000000000000000800000000000000090E6 ++:101AF00008000000000000A008000000000000B086 ++:101B000008000000000000C008000000000000D035 ++:101B100008000000000000E008000000000000F0E5 ++:101B20000800000000000000090000000000001094 ++:101B30000900000000000020190000000000003033 ++:101B400019000000000000401900000000000050D3 ++:101B50001900000000000060190000000000007083 ++:101B60001900000000000080190000000000009033 ++:101B700019000000000000A019000000000000B0E3 ++:101B800019000000000000C019000000000000D093 ++:101B900019000000000000E019000000000000F043 ++:101BA00019000000000000001A00000000000010F2 ++:101BB0001A000000000000201A00000000000030A1 ++:101BC0001A000000000000401A0000000000005051 ++:101BD0000200000000000060020000000000007031 ++:101BE00002000000000000800200000000000090E1 ++:101BF00002000000000000A002000000000000B091 ++:101C000002000000000000C00A000000000000D038 ++:101C10000A000000000000E00A000000000000F0E0 ++:101C20000A000000000000000B000000000000108F ++:101C30000B000000000000200B000000000000303E ++:101C40000B000000000000400B00000000000050EE ++:101C50001B000000000000601B000000000000707E ++:101C60001B000000000000801B000000000000902E ++:101C70001B000000000000A01B000000000000B0DE ++:101C80001B000000000000C01B000000000000D08E ++:101C90001B000000000000E01B000000000000F03E ++:101CA0001B000000000000001C00000000000010ED ++:101CB0001C000000000000201C000000000000309C ++:101CC0001C000000000000401C000000000000504C ++:101CD0001C000000000000601C00000000000070FC ++:101CE0001C000000000000801C00000000000090AC ++:101CF0001C000000F80E020060000000120000004E ++:101D000000000000200000005F36291F5F36291FF9 ++:101D10005F36291F5F36291FE80E02001000000001 ++:101D200010000000000000000800000090E886009D ++:101D30000000800001000000000000000000000022 ++:101D4000000000007363616E0000000044EB860039 ++:101D50000100204005000000A2A5860002002040EE ++:101D60000500000090A5860003002040050000004B ++:101D70007EA58600040020400500000075998600BD ++:101D80000500104005000000EBE88600060020403A ++:101D9000020000004CEB86000C0000000100000077 ++:101DA0005EEB860007002000080000000000000035 ++:101DB00000000000000000006E6F63726300534477 ++:101DC000494F0043444300000D1680008D138000EE ++:101DD00025118000291480001D138000A1168000A9 ++:101DE000A90F0100011380002D13800000000000E6 ++:101DF0001D168000E9270000776C0000000000003D ++:101E00000000000000000000F025000000000000BD ++:101E100000000000000000000000000000000000C2 ++:101E20000000000005000000FFFFFFFF140000009D ++:101E30000100050605000000FFFFFFFF0500000090 ++:101E400005000000050000000E0E0E0E0E02090D2A ++:101E50000A080D01090D0A080D01090D0A080D01F6 ++:101E6000090D0A080D01090E0A090E060A0E0B09D2 ++:101E70000E02093A160E0E05093A160E0E050A0E46 ++:101E80000B090E050A0E0B090E020A0E0B090E02B3 ++:101E900014C0C015110514C0C015110514C0C0151B ++:101EA000110514C0C015110514C0C0151105093A5B ++:101EB000160E0E0514C0C015110514C0C01511056D ++:101EC000093A160E0E05093A160E0E05093A160EB7 ++:101ED0000E0514C0C0151105093A160E0E05093A73 ++:101EE000160E0E05093A160E0E0509B21C0E0E0549 ++:101EF00012B11911110800000000000000000000DC ++:101F00000000000065660200416602002D660200C6 ++:101F100055AA80000000000021AA800085AA800048 ++:101F200031AA80006DAA8000C993800095A9800025 ++:101F3000BDA98000D5938000B59380007593800083 ++:101F4000D191800000000000B1A98000736470632B ++:101F50006D6465760000000000000000041F0200B0 ++:101F60000000000000000000000000000000000071 ++:101F70000000000000000000000000000000000061 ++:101F80000000000000000000000000000000000051 ++:101F90000000000000000000000000000000000041 ++:101FA0000000000000000000000000000000000031 ++:101FB0000000000000000000000000000000000021 ++:101FC0000000000000000000000000000000000011 ++:101FD0000000000000000000000000000000000001 ++:101FE00000000000000000000000000000000000F1 ++:101FF00000000000000000000000000000000000E1 ++:1020000000000000000000000000000000000000D0 ++:1020100000000000000000000000000000000000C0 ++:1020200000000000000000000000000000000000B0 ++:1020300000000000000000000000000000000000A0 ++:102040000000000000000000000000000000000090 ++:102050000000000000000000000000000000000080 ++:102060000000000000000000000000000000000070 ++:10207000000000000000000004E301004100000037 ++:10208000440000000000000000000000000000000C ++:102090000000000000000000000000000000000040 ++:1020A0000000000000000000000000000000000030 ++:1020B0000000000000000000000000000000000020 ++:1020C0000000000000000000000000000000000010 ++:1020D0000000000000000000000000000000000000 ++:1020E00000000000000000000000000000000000F0 ++:1020F00000000000000000000000000000000000E0 ++:1021000000000000000000000000000000000000CF ++:1021100000000000000000000000000000000000BF ++:1021200000000000000000000000000000000000AF ++:10213000000000000000000000000000000000009F ++:10214000000000000000000000000000000000008F ++:10215000000000000000000000000000000000007F ++:10216000000000000000000000000000000000006F ++:10217000000000000000000000000000000000005F ++:10218000000000000000000000000000000000004F ++:10219000C8DC0100010000000100F918010DE40095 ++:1021A000F4DEF106FC0F27FAFF1DF01018090AF201 ++:1021B00010E01714041114F1FAF2DBF7FCE2FBE172 ++:1021C000EE130DFF1CE91A17180300DAE803E617EF ++:1021D000E4E9F3FF121305E104E225F706F2ECF15E ++:1021E000FC11E914F0E0F6F2E8091010011DD9FA2B ++:1021F000040F0F060CDE1C00FF0D07181AF60EE484 ++:10220000160FF905EC181B0A1EFF0026E2FFE50A6F ++:1022100014180705EA0FF2E4E6F6080808080808AB ++:1022200008090A0808070701020202020202020264 ++:102230000202020202020202020201010000000088 ++:1022400000000000C5011DFFE0FFC0FFE0FF00002F ++:10225000000000FF000000006B0382FEE7FFCCFFE0 ++:10226000E7FF080002000000D7010BFFEEFFDCFFD4 ++:10227000EEFFA7033CFEECFF1700ECFF720385FEA8 ++:10228000AEFEF801AEFE070004000000980160FFFA ++:10229000CBFF96FFCBFF9C0345FE2500C1FF250029 ++:1022A000B10316FEE4FEA501E4FE070014000100E0 ++:1022B000BF0131FFF20049FEF200870361FE33FFE8 ++:1022C000620133FF800378FEDAFEE900DAFE0800DF ++:1022D00015000100BF0131FF18010EFE1801870330 ++:1022E00061FE16FF7C0116FF800378FE8FFF9300CE ++:1022F0008FFF090016000100BF0131FF620055FF8A ++:102300006200870361FE1FFF6B011FFF79037EFEE2 ++:10231000F4FE5D00F4FE080017000100BC0131FF6F ++:10232000740042FF7400870361FE52FF020152FFF6 ++:10233000800378FE7FFFF1FF7FFF08001800010097 ++:10234000B40131FFDFFF1D00DFFF880361FE87FF5F ++:1023500090FF87FF7F0378FECDFEF401CDFE0800DD ++:1023600019000100AD0131FFB8FF3E00B8FF820344 ++:1023700061FEAAFFB1FFAAFF7F0378FEC7FEFE0140 ++:10238000C7FE08001A000100930154FFD9FF0C009A ++:10239000D9FF1B03C7FE4CFF38004CFF3303B8FEC8 ++:1023A00080FF280080FF08001B000100890154FF06 ++:1023B000CFFF1300CFFF1703C7FE00FF500000FF41 ++:1023C0002E03BDFE8BFF25008BFF08001E000100C1 ++:1023D000BB0119FFC3FF1D00C3FF6B0361FE66FF56 ++:1023E000480066FF7C0378FE56FF4F0056FF08004A ++:1023F0002C000100BF0131FFE00071FEE000870307 ++:1024000061FE8BFFC4008BFF800378FEB2FEC0002C ++:10241000B2FE0800010000006C0900000B0A000772 ++:102420000A88888002000000710900000B0A00077A ++:102430000A88888003000000760900000B0A000764 ++:102440000A888880040000007B0900000B0A00074E ++:102450000A88888005000000800900000B0A000738 ++:102460000A88888006000000850900000B0A000722 ++:102470000A888880070000008A0900000B0A00070C ++:102480000A888880080000008F0900000B0A0007F6 ++:102490000A88888009000000940900000B0A0007E0 ++:1024A0000A8888800A000000990900000B0A0007CA ++:1024B0000A8888800B0000009E0900000B0A0007B4 ++:1024C0000A8888800C000000A30900000B0A00079E ++:1024D0000A8888800D000000A80900000B0A000788 ++:1024E0000A8888800E000000B40900000B0A00076B ++:1024F0000A888880000001009F0152074000800088 ++:102500004000180378064000800040000A032E06B1 ++:1025100040008000400008000100010092013707E0 ++:1025200003013B0003019F02020744003600440000 ++:10253000600247075D00A7005D000800020001007F ++:102540009F01520740008000400018037806C00039 ++:102550008001C0000A032E064000800040000800F1 ++:10256000030001002E013107810002018100920267 ++:10257000B806CD009A01CD00F202E006AA0054018F ++:10258000AA0008001400010068015CFFF200C6FE0A ++:10259000F200F002B8FE33FFCB0033FFFF02E0FE93 ++:1025A00003FF49FF03FF08001500010068015CFFFD ++:1025B000950052FF9500F002B8FE33FFA40033FFF0 ++:1025C000FF02E0FE00FFEFFE00FF08001600010022 ++:1025D00068015CFF62009CFF6200F002B8FE33FFFE ++:1025E0007C0033FFFF02E0FE00FFA0FE00FF0800BA ++:1025F000170001005E015CFF8CFF52008CFFF002AF ++:10260000B8FE33FF280033FFFF02E0FE7FFF15FF17 ++:102610007FFF08001800010045015CFFE0FFD8FFC4 ++:10262000E0FFF402B8FE00FF29FE00FFFE02E0FE1C ++:10263000FAFEAA00FAFE0800190001002B015CFF57 ++:10264000CDFFC0FFCDFFE002B8FE00FF29FE00FF76 ++:10265000FD02E0FEFAFEAA00FAFE08001A000100E0 ++:10266000150197FFD9FF8BFFA8FF7D022EFFC0FF4A ++:1026700040FF70FF660248FF80FF80FEE0FE08001A ++:102680001B000100F50097FFCFFF6DFF92FF720264 ++:102690002EFF5EFF1BFE95FE650248FFC2FF46FF50 ++:1026A00075FF08001E0001002E0131FFC3FF86FFE9 ++:1026B000C3FF9202B8FE33FF66FE33FFF202E0FE74 ++:1026C00056FFACFE56FF08002800010068015CFFC1 ++:1026D000F200C6FEF200F002B8FECD0035FFCD00DC ++:1026E000FF02E0FEFF017201FF0108000501000882 ++:1026F0000001FFFF0000000000000000A200000039 ++:1027000000FF00FF00000000000000FF00000000CC ++:102710007802A0FE80FF00FF80FF0800010000009B ++:10272000760179FFF0FFE0FFF0FF1F0374FECEFF9C ++:10273000E0FFCEFFEE022BFE2CFF32002CFF080044 ++:1027400002000000770116FFDBFFB4FFDBFF1F0371 ++:1027500074FEE0FFECFFE0FFEC02F2FE80FF1E00E3 ++:1027600080FF080003000000770116FFDBFFB4FFC5 ++:10277000DBFF1F0374FEE0FFECFFE0FFEC02F2FE64 ++:102780006CFF23006CFF0800040000003301AEFF63 ++:10279000CBFF96FFCBFF0B0385FECBFF0A00CBFFE1 ++:1027A000FD022BFE2CFFCA002CFF080000000000D9 ++:1027B0000000000000000000000000000000000019 ++:1027C0000000000000000000000000000000000009 ++:1027D00000000000000000000000000000000000F9 ++:1027E00000000000000000000000000000000000E9 ++:1027F00000000000000000000000000000000000D9 ++:1028000000000000000000000000000000000000C8 ++:1028100000000000000000000000000000000000B8 ++:1028200000000000000000000000000000000000A8 ++:102830000000000000000000000000000000000098 ++:102840000000000000000000000000000000000088 ++:102850000000000000000000000000000000000078 ++:102860000000000000000000000000000000000068 ++:102870000000000000000000000000000000000058 ++:102880000000000000000000000000000000000048 ++:102890000000000000000000000000000000000038 ++:1028A0000000000000000000000000000000000028 ++:1028B0000000000000000000000000000000000018 ++:1028C0000000000000000000000000000000000008 ++:1028D00000000000000000000000000000000000F8 ++:1028E00000000000000000000000000000000000E8 ++:1028F00000000000000000000000000000000000D8 ++:1029000000000000000000000000000000000000C7 ++:1029100000000000000000000000000000000000B7 ++:1029200000000000000000000000000000000000A7 ++:102930000000000000000000000000000000000097 ++:102940000000000000000000000000000000000087 ++:102950000000000000000000000000000000000077 ++:102960000000000000000000000000000000000067 ++:102970000000000000000000000000000000000057 ++:102980000000000000000000000000000000000047 ++:102990000000000000000000000000000000000037 ++:1029A0000000000000000000000000000000000027 ++:1029B0000000000000000000000000000000000017 ++:1029C0000000000000000000000000000000000007 ++:1029D00000000000000000000000000000000000F7 ++:1029E00000000000000000000000000000000000E7 ++:1029F00000000000000000000000000000000000D7 ++:102A000000000000000000000000000000000000C6 ++:102A100000000000000000000000000000000000B6 ++:102A200000000000000000000000000000000000A6 ++:102A30000000000000000000000000000000000096 ++:102A40000000000000000000000000000000000086 ++:102A50000000000000000000000000000000000076 ++:102A60000000000000000000000000000000000066 ++:102A70000000000000000000000000000000000056 ++:102A80000000000000000000000000000000000046 ++:102A90000000000000000000000000000000000036 ++:102AA0000000000000000000000000000000000026 ++:102AB0000000000000000000000000000000000016 ++:102AC0000000000000000000000000000000000006 ++:102AD00000000000000000000000000000000000F6 ++:102AE00000000000000000000000000000000000E6 ++:102AF00000000000000000000000000000000000D6 ++:102B000000000000000000000000000000000000C5 ++:102B100000000000000000000000000000000000B5 ++:102B200000000000000000000000000000000000A5 ++:102B30000000000000000000000000000000000095 ++:102B40000000000000000000000000000000000085 ++:102B50000000000000000000000000000000000075 ++:102B60000000000000000000000000000000000065 ++:102B70000000000000000000000000000000000055 ++:102B80000000000000000000000000000000000045 ++:102B90000000000000000000000000000000000035 ++:102BA0000000000000000000000000000000000025 ++:102BB0000000000000000000000000000000000015 ++:102BC0000000000000000000000000000000000005 ++:102BD00000000000000000000000000000000000F5 ++:102BE00000000000000000000000000000000000E5 ++:102BF00000000000000000000000000000000000D5 ++:102C000000000000000000000000000000000000C4 ++:102C1000000000000000000083682DE9F0415B69BE ++:102C20000546152B0F460AD0182B08D01B2B06D0B3 ++:102C3000242B01D0272B04D12B8A7F2B05D80C23E2 ++:102C400004E0172B01D0182B01DD1423AB624FF0E9 ++:102C500004430022BB6100E00132BB69002B03DAB0 ++:102C60001D4B9A42F8D134E01C4B9A4231D8AE6ADF ++:102C70003C69331DAB83AC61A868298ADEF346F357 ++:102C8000022390FBF3F014F4807F68840AD0284676 ++:102C900039463246DEF352F3C0F30F1083B2E883B5 ++:102CA0002B8403E0AB8B2B846B8CEB83AB6913F42D ++:102CB000007F0AD0AA6A284639460132DEF33EF385 ++:102CC000C0F30F1083B2688400E02B8CAB842B8A96 ++:102CD000EB84BDE8F081C046809698007F9698000E ++:102CE00070B50446DEF33CF1002144220546DFF3D3 ++:102CF000A7F16369152B2B6001D0162B01D9104B5E ++:102D00006B60686808B9054617E0AC602046E8F3D8 ++:102D1000F1F1E8602046E8F3B5F1064618B920461F ++:102D20000121E8F3EDF16B6820469B689847054662 ++:102D30001EB920463146E8F3E3F1284670BDC0468F ++:102D4000C81D02002DE9F0470546884691469A467F ++:102D5000E8F398F1074618B928460121E8F3D0F1C5 ++:102D60002846E8F38FF1D0B12846E8F381F1B0B9F5 ++:102D70002846FFF7B5FF064610B94FF0FF3410E0C4 ++:102D80002846ECF763FD736830465C6941464A4665 ++:102D90005346A04704462846ECF75CFD01E06FF07F ++:102DA00018041FB928463946E8F3AAF12046BDE8C1 ++:102DB000F087C0460523C0F894310223C0F898314B ++:102DC0001E33C0F89C31234B4FF010021B68002BC0 ++:102DD0000CBF07230023C0F8A0314FF00103C0F857 ++:102DE000AC3103F16303C0F8B0314FF00603C0F813 ++:102DF000C03140F23C73C0F8C4314FF00803C0F852 ++:102E0000C83103F10D03C0F8A421C0F8B821C0F8FF ++:102E1000BC21C0F8CC31C0F8D02101D1032302E09D ++:102E20000D4B1B68013BC0F8D4311C230422C0F8B1 ++:102E3000DC310C23C0F8E0319B18C0F8E4310623E4 ++:102E4000C0F8EC310023C0F8D821C0F8E821C0F860 ++:102E5000F0317047EC260000D4250000D0F81012A5 ++:102E600070B5044609B90D460CE08068DFF39CF6A6 ++:102E7000D4F810120546E822A068E3F339F70023DE ++:102E8000C4F81032284670BD70B50024054680F89D ++:102E90007541006903F04AFC2846E6F30DF7E8683F ++:102EA0002146E7F3C7F7D5F8900128B1E3F306F21E ++:102EB000D5F89001E3F34CF2D5F88C0128B1E3F397 ++:102EC000FDF1D5F88C01E3F343F2E86805F0CAFCA4 ++:102ED000D5F8103223B11B7813B12846FFF7BEFF97 ++:102EE000A86829464FF40772E3F302F770BDC046A5 ++:102EF0001FB5044606238068E8210393E3F3E8F650 ++:102F0000C4F8100210B94FF0FF300CE00021E822A5 ++:102F1000DFF396F000230093A068D4F8101203AA00 ++:102F20001C33DFF3D9F604B010BDC0462DE9F047DD ++:102F30008AB01F46129D9C4B08461D601146904664 ++:102F4000E6F33CF6002800F02A8138464FF407717A ++:102F5000E3F3BEF60446002800F0218100214FF47F ++:102F600007720646DFF36CF0A76065612046FFF745 ++:102F700021FF8E4B1B68C4F80C320BB99A4605E052 ++:102F80001B78B3F1000A18BF4FF0010A884B04F117 ++:102F900028001A680121002A14BF31221122DFF310 ++:102FA0006DF70023009301930293404639462A4669 ++:102FB000139B05F095FDE060002800F0EA80E7F340 ++:102FC00051F72060E068E7F36BF7656960606B6854 ++:102FD000784A83F00103784903F00103002B0CBF0A ++:102FE00088469046226884F8763140F629039A4252 ++:102FF000D4F80890D4F80CC00AD120B905F5007EA9 ++:1030000005F5047508E005F5007E05F5087503E093 ++:1030100005F5007E05F50475D4F8B831D4F8BC2167 ++:10302000D4F8C411D4F8C00101934FF0FF330493D6 ++:1030300009330693002302920391059007934846B3 ++:103040004146624673460095EEF774FA60620028C6 ++:1030500000F09F80D4F80C12C1B10B78B3B1E1F34A ++:10306000C7F556492246D4F80C02DFF389F5D4F8A7 ++:103070000C0253492246DFF3BDF5BAF1000F05D02B ++:103080002046FFF735FF002840F0838001210A46E3 ++:10309000606AE1F3B5F520460021E2683B4603F0A3 ++:1030A00051FB2061002874D000210B462046454A80 ++:1030B000E3F370F10023C4F8900184F879314248B9 ++:1030C000E4F3D4F518B3DFF303F2012383403F4860 ++:1030D000C4F88031E4F3CAF510B1DFF3F9F108B1B7 ++:1030E000D4F88001C4F8840139490020DFF344F4A6 ++:1030F000030CA4F888319BB2A4F88A013BB10021EB ++:103100002046344A0B46E3F345F1C4F88C01002015 ++:103110003149DFF331F4012809D184F816022F492F ++:103120000138DFF329F4012804BF2D4B1860204635 ++:10313000E6F3A4F320B30025C4F8A051284629499A ++:10314000DFF31AF428B1012384F8F9312648EEF7A9 ++:10315000ABFA28462549DFF30FF488B12349284606 ++:10316000DFF30AF44FF0807300F00F000AA901F8B2 ++:10317000010D4FF44072009320460F23DFF7BEFC91 ++:103180001B481C492246E3F3B5F41B48EBF76CFDE2 ++:1031900006E0A06821464FF40772E3F3A9F5002684 ++:1031A00030460AB0BDE8F087F4260000BC260000D7 ++:1031B000EC260000AE278600B6278600DD9B800047 ++:1031C0007929000065A68000052886000E28860063 ++:1031D00017288600499B80001F28860078D50100AB ++:1031E000AC2702002A2886003428860089D50100F1 ++:1031F0004D288600E59A8000D596800010B50446DB ++:1032000060B1036806491868224600F09DDE236815 ++:10321000214658684FF4BC72E3F36AF510BDC0460E ++:10322000853B86007FB505464FF4BC714068E3F3EB ++:103230004FF508B9064619E000214FF4BC72064666 ++:10324000DEF3FEF60B4B356000930B4B002401932D ++:103250002868334609490A4A0294039400F03CDE88 ++:103260004FF49663C6F8603186F86441304604B086 ++:1032700070BDC04625110100E52C0000B0D501004D ++:10328000853B860070B5044608B906462AE0816889 ++:1032900009B90E460CE0C3689868ECF3DFF1E36807 ++:1032A000D0F1010638BF0026A1689868ECF3E8F178 ++:1032B000616F0025A56529B1E368A26F5868E3F343 ++:1032C00017F565672046EEF7D5FFE36806491868ED ++:1032D000224600F039DEE368214658684FF4B072A8 ++:1032E000E3F306F5304670BDEB3D860030B54FF494 ++:1032F000B07185B005464068E3F3EAF40446E0B1F6 ++:1033000000214FF4B072DEF39BF6E560C5F8184873 ++:10331000A8680D4922460023ECF3CEF1A06060B10D ++:103320000A4B2868009300230193029303930849F2 ++:10333000084A234600F0D0DD18B12046FFF7A2FF6F ++:103340000024204605B030BD152E0000D9E18000D4 ++:1033500034D60100EB3D8600034B012210B51A70F4 ++:10336000EBF7F2FF10BDC0463C28020070B50446E2 ++:10337000D0F884000D4608B102F0D8FCD4F88000E3 ++:1033800008B105F0E5FBE06F08B1FFF737FFA06F6C ++:1033900008B105F06BFC606F08B1FFF773FFA06820 ++:1033A00008B100F0CDFB284621468C22E3F3A0F4BF ++:1033B00070BDC0462DE9F04F064689B00D4600208D ++:1033C0008C2191469846139FE3F382F4044600282B ++:1033D00077D000218C22DEF333F62760304605F0EB ++:1033E000B1F807AB0190059383464FF0000A2046E1 ++:1033F00041F2E44142463B460295CDF800A0CDF8AB ++:103400000C90049400F06EFD054600285BD0A0608F ++:1034100002F066DB2B696060E3602F4B1021A36430 ++:103420002E4A3B46266164643046DEF34DF62B6936 ++:1034300039461B6E2A489A6B2A4BEEF735F93A4605 ++:1034400050461299284B0096CDF8049002F0ECFDFE ++:103450000746002837D16368012683F87860362153 ++:103460003246D5F87C0223F08FD9204B2846E363FF ++:10347000FFF73CFF606730B36368284683F8A460B9 ++:1034800005F006FCA067F0B12846FFF7CBFEE06729 ++:10349000C8B1284605F088FBC4F8800098B12846DA ++:1034A00002F072FCC4F8840068B1114B01970093DC ++:1034B0000297039728680F490F4A234600F00CDD56 ++:1034C00008B9204604E020465946FFF74FFF002088 ++:1034D00009B0BDE8F08FC04655F78000FB4186007B ++:1034E00008B10200A0D6010029FB8000EFBEAD0D9F ++:1034F00099F88000E8D60100C542860041F2E44315 ++:10350000984201D00020AFE044F22033994200F00D ++:10351000AA800533994200F0A680223B994200F030 ++:10352000A2801E33994200F09E800333994200F03E ++:103530009A800C3B994200F096800133994200F04A ++:1035400092800133994200F08E80093B994200F04D ++:103550008A800233994200F08680013B994200F054 ++:103560008280023399427ED0013399427BD001336D ++:10357000994278D00533994275D00133994272D07F ++:10358000013399426FD001F53C43D8339BB2022BF3 ++:1035900069D94BF6D543CB189BB2022B63D944F2C1 ++:1035A000413399425FD0013B99425CD001F53C43E5 ++:1035B000B0339BB2022B56D944F25333994252D0C6 ++:1035C000043399424FD04AF69D1399424BD044F2AE ++:1035D0005433994247D0253B994244D0013B99420C ++:1035E00041D0063399423ED0013399423BD001335A ++:1035F000994238D04BF6C943CB189BB2022B32D933 ++:1036000044F2167399422ED0113399422BD0A3F570 ++:103610007973994227D001F53C43A0339BB2012B2B ++:1036200021D901F53C43BA339BB2022B1BD94BF68F ++:10363000CF43CB189BB2012B15D94BF6AB43CB181C ++:103640009BB2012B0FD901F53C43A8339BB2012B50 ++:1036500009D944F26333994205D00D33994214BF1E ++:103660000020012000E001207047C0462DE9F84FFE ++:1036700000264FF0010842F601334FF0FF344FF0BF ++:10368000640B0746A0F8283680F8474680F8C44403 ++:103690000221224680F8288080F868B780F84266C8 ++:1036A00080F84C8680F8436680F8498680F8466644 ++:1036B00002F05ED938464146324602F059D90C2113 ++:1036C0002246384602F054D90B213846324602F0E1 ++:1036D0004FD90E212246384602F04AD90D213846EC ++:1036E000324602F045D90F212246384602F040D931 ++:1036F00004210222384602F03BD9D7F860364FF059 ++:10370000030987F8488683F80690D7F860364FF0AB ++:10371000020A83F8079040F62A13A7F82A36A7F87A ++:103720002C369BB2A7F82E3640F62A13A7F830366F ++:10373000A7F83236A7F83436A7F8363640F62B13FA ++:10374000A7F838363B68A7F87A6583F895604FF09C ++:103750000703A7F83A364FF00403A7F83C360F23C7 ++:1037600087F80C37D7F89034A7F83E96C7F8803220 ++:10377000A7F840A6A7F87C68A7F87EB887F8EA61A2 ++:1037800087F8EB6187F81E6287F8EE6187F8EC61D5 ++:1037900087F8FA8187F80B6787F8A0649E71D7F8DD ++:1037A00094340B22C7F8843283F80680D7F8983413 ++:1037B0003146C7F8883283F806A0D7F89C343546DE ++:1037C000C7F88C3283F806903B6887F8506783F817 ++:1037D0004D805C633B6807F5CC6483F842803B68AE ++:1037E000043483F843603B6887F8CF6183F839601D ++:1037F0003B68204683F8AA803B6887F8DF6187F83A ++:10380000E081C7F8E46187F8E161DE66DEF318F471 ++:103810006FF0220387F864362C3387F865364A4602 ++:1038200004EB0A001A49DEF3A7F33B6887F869A6A0 ++:1038300087F8568587F8578583F84C603A6887F88B ++:103840009267A7F89067A7F88CB892F8463013F003 ++:10385000030F0CD092F94C304BB1D7F8FC04243054 ++:10386000F1F3F6F4D7F8FC043230F1F3F1F44FF44D ++:103870004873A7F85C373B68012287F8252883F84E ++:10388000A2203A684FF0FF3382F8B530BDE8F88FD8 ++:103890000FD40100836B70B5002483F84C40C36BD8 ++:1038A000012583F84C500646816BDFF711FEF16B62 ++:1038B0003046DFF70DFE21463046F6F349F2B36B92 ++:1038C000304683F84D40F36B294683F84D40D6F8D7 ++:1038D00060364FF0FF34DD72D6F860369C81F6F327 ++:1038E00037F2D6F860369B78AB4214D9B36B83F8C5 ++:1038F0004D40F26B4FF0FF3382F84D3096F8CB34E9 ++:1039000096F8CC2443EA022343F0800386F8CB34B4 ++:103910001B0A86F8CC3470BDD0F8AC1110B5044643 ++:1039200029B18068EBF3ACF60023C4F8AC31D4F8CD ++:10393000C41129B1A068EBF3A3F60023C4F8C43185 ++:10394000D4F8741529B1A068EBF39AF60023C4F8F3 ++:103950007435D4F8F81629B1A068EBF391F600237A ++:10396000C4F8F836D4F8FC1629B1A068EBF388F651 ++:103970000023C4F8FC36D4F8E036196A31B1A068E7 ++:10398000EBF37EF6D4F8E02600231362D4F83C155E ++:1039900029B1A068EBF374F60023C4F83C35D4F8E1 ++:1039A000941729B1A068EBF36BF60023C4F89437A1 ++:1039B000D4F8B01829B1A068EBF362F60023C4F87C ++:1039C000B03810BD70B505462D4980682A460023E1 ++:1039D000EBF372F6C5F8AC0100284ED0A86829496F ++:1039E0002A460023EBF368F6C5F8C401002844D04A ++:1039F000A86825492A460023EBF35EF6C5F874054E ++:103A000000283AD0A86821492A460023EBF354F64F ++:103A1000C5F8F806002830D0A8681D492A460023BA ++:103A2000EBF34AF6C5F8FC0638B3A86819492A46EC ++:103A30000023D5F8E046EBF33FF62062E8B1A86832 ++:103A400015492A460023EBF337F6C5F83C05A0B12B ++:103A5000A86812492A460023EBF32EF6C5F894070E ++:103A600058B1A8680E492A460023EBF325F6C5F89D ++:103A7000B008003818BF012000E0002070BDC0462B ++:103A80003DAA81003D708100253E81009591810015 ++:103A9000858F8100256E810089598100396B8100F5 ++:103AA000496F810010B50446006805F0B3FED4F8F4 ++:103AB000583113B10023C4F85831D4F83C0120B177 ++:103AC00005F00EF90023C4F83C31D4F8400120B1D0 ++:103AD00001F080F80023C4F84031D4F84C0120B143 ++:103AE00002F09AF80023C4F84C31D4F8540120B104 ++:103AF00005F070FA0023C4F85431D4F8600120B105 ++:103B000007F000F80023C4F86031D4F8383113B15D ++:103B10000023C4F83831D4F8640120B101F0FEFE6E ++:103B20000023C4F86431D4F8000520B107F026F969 ++:103B30000023C4F80035204605F0D2FA10BDC04677 ++:103B40002DE9F041054608B9074695E001F046FB2E ++:103B50000746284602F06AD800B90137D5F8F016B2 ++:103B600049B16868D5F8F426E3F3C2F00023C5F83C ++:103B7000F436C5F8F0362846D5F81815F8F38AF764 ++:103B80002846D5F8D816F8F385F7D5F82015284635 ++:103B9000F8F380F7D5F82C1521B168684FF49662D8 ++:103BA000E3F3A6F0D5F87C0220B105F051FA00232A ++:103BB000C5F87C3200242B19D3F84C1211B12846D9 ++:103BC0001BF03ADC0434202CF5D10121284631F0D9 ++:103BD000C9DD284601F078FE2E6BB16911B1284687 ++:103BE00031F054D80024B461D5F85C0101F05EFFD7 ++:103BF0002846FFF791FE2846FFF754FF2846D5F8E0 ++:103C00002C18DFF75DFCC5F82C48D5F8B84404E063 ++:103C100068681022E468E3F36BF02146002CF7D1CA ++:103C2000C5F8B844286816492A4600F08DD9D5F859 ++:103C3000340718B101F010F9C5F83447D5F8680118 ++:103C400018B106F0C5FFC5F86841D5F8181759B185 ++:103C50006868D5F81C27E3F34BF0C5F8184703E074 ++:103C60002846696807F0B0D8D5F87822002AF7D13D ++:103C70002846696800F034FD3846BDE8F081C0464A ++:103C8000BB5C8600036870B55E6905461449304622 ++:103C9000DEF372F6C0B218B930461249DEF36CF6A4 ++:103CA00040B2431E0E2B0ED8012803D1D5F8603642 ++:103CB000002204E0022806D1D5F8603601229A716C ++:103CC000D5F86036DA71084930462C6BDEF354F6CD ++:103CD00084F804012846EFF3EFF1012070BDC046DF ++:103CE000C65C8600CB5C86000E5D8600036870B5FE ++:103CF0001B490546D0F860465869DEF33DF6207052 ++:103D00002B6818495869D5F86046DEF335F6E0703F ++:103D1000D5F8602613780BB10F2B01D10123137056 ++:103D2000D5F8603601211A785A70D5F860462046D9 ++:103D3000DEF3DEF3A070D5F86026D3780BB10F2B3D ++:103D400001D10123D370D5F860360121DA781A71D8 ++:103D5000D5F86046E01CDEF3CBF3607170BDC04661 ++:103D600019D7010021D7010070B50446214600682B ++:103D700007F012F8C4F8000508B929305EE02068A1 ++:103D800005F050FD2068214601F08AF8C4F8340798 ++:103D900008B92A3052E02A4B2046C4F8583104F0C2 ++:103DA000B9FFC4F83C0108B9313047E0204600F0C3 ++:103DB0004BFFC4F8400108B932303FE0204606F01E ++:103DC000B3FEC4F8600108B9353037E020682146F9 ++:103DD000A2681C4B05F058F9C4F87C0208B93930C8 ++:103DE0002CE0204601F0EAFDC4F8640108B93C303B ++:103DF00024E0154B0125C4F838310023A4F83038ED ++:103E000084F8883884F88A3884F88958204601F084 ++:103E100013FFC4F84C0108B93F300FE02368214676 ++:103E200083F83A50236883F8A950206805F062F9B6 ++:103E300008B1452002E0236883F8A05070BDC04659 ++:103E4000EFBEADDE9D6D8100EFBEAD0DF0B5D0F8DB ++:103E500040750021AC2287B006463846DEF3F0F00C ++:103E60004FF06403FB85032387F8603000220123B1 ++:103E7000D6F85C014FF42C5121F0D4DFFF2804D197 ++:103E8000336B18691968EEF787FE31687886A6F8F3 ++:103E9000260691F84640336B00F44065FF201A89EE ++:103EA00000211B68B5F5406F14BF1425282501902B ++:103EB00004F00304D6F8600600910294039580781C ++:103EC000049007F138002DF0D9D8336893F84630C4 ++:103ED00013F0030F03D0FB8843F02003FB8007B0EF ++:103EE000F0BDC0462DE9F04F8DB01A9F9A460023D1 ++:103EF00007910B930646934610461799189A199BFB ++:103F00009DF85890009709F08DF9044610B11E23D2 ++:103F10000B937FE3FFF720FA179851460BAA00F0A6 ++:103F20000DFD0546002800F07583179AD0F860361D ++:103F300042604FF0FF32D0F8008083F81C21836B81 ++:103F4000C8F804A00363436B8660C362179BC0F884 ++:103F50007871C8F80C30B54B88F82190C8F8B030AB ++:103F6000032380F86937C0F8CC2880F89D4151467A ++:103F7000FFF77CFB2846F7F323F7284605F0D4F833 ++:103F80000446002840F04F8328463146179A53468E ++:103F900006F03EFEC5F8680108B91F23D3E2A44B22 ++:103FA0000194009302940394A249A34A2B462868E3 ++:103FB000FFF392F7A14B0194009302940394A0495C ++:103FC000A04A2B462868FFF387F7189A199B179E7B ++:103FD00002920393284607995A465346CDF800901B ++:103FE0000196049701F04AFA04460B90002840F02D ++:103FF0001A832B69186EEBF767FCA5F8BE082846F4 ++:10400000F5F38EF508B914239DE2264631460AAA37 ++:104010002846F7F311F231462846BDF8282001362C ++:10402000F7F314F2062EF1D1012488F89A4005F531 ++:10403000BE72286908F1140118F054DC8249D8F8DE ++:104040001400DEF399F481498146D8F81400DEF3B8 ++:1040500093F47F49A5F86208D8F81400DEF38CF4D5 ++:10406000B5F86228A5F86408A5F87827A5F87A07B6 ++:104070007849D8F81400DEF37FF47749A5F854089E ++:10408000D8F81400DEF378F485F856087349D8F8A8 ++:104090001400DEF371F485F858087149D8F814005B ++:1040A000DEF36AF485F85A086E49D8F81400DEF396 ++:1040B00063F485F857086C49D8F81400DEF35CF413 ++:1040C00085F859086949D8F81400DEF355F485F8E5 ++:1040D0005B086749D8F81400DEF34EF485F85C08F5 ++:1040E0006449D8F81400DEF347F485F85E086249A5 ++:1040F000D8F81400DEF340F485F860085F49D8F87A ++:104100001400DEF339F485F85D085D49D8F8140031 ++:10411000DEF332F485F85F085A49D8F81400DEF36C ++:104120002BF485F861082846FFF7E0FDD5F86026F6 ++:104130002B6B85F8F04785F8F14718691178D2782C ++:10414000EEF77CFF2869EA6AD0F8A03005F5CB7459 ++:104150005360D0F8A43021469360D0F8A830D360E3 ++:10416000D0F8AC301361D0F8B0305361D0F8B4302F ++:10417000936118F0E7DC08F14E0021463246DDF38A ++:10418000FBF6B5F8822144F221339A4217D00E3B58 ++:104190009A4214D007339A4211D010339A420ED06B ++:1041A000143B9A420BD007339A4208D010339A42FC ++:1041B00005D025339A4214BF0024012400E00124D5 ++:1041C00005EB84039B6B28462B63FFF75BFD08B967 ++:1041D0001823B8E1296B4FF00F0340F2FF36A1F826 ++:1041E000063101F1FC0201F58073A1F8086128464F ++:1041F00000F0B4FE2A6BD2F8FC30C2F8F830C2F8F6 ++:10420000F030D2F80031C2F8F4301368022B07D135 ++:10421000013B53752B6B284603215A7D01F0A8DB27 ++:1042200019F0010F30D000222FE0C0465F7D5A0503 ++:1042300079DB810078D48500BB5C8600E94800000A ++:104240005CD8010029D70100D6688600E2688600A4 ++:10425000F5688600076986001C6986002B69860060 ++:104260003A698600496986005A6986006B6986004A ++:104270007C6986008A69860098698600A66986003E ++:10428000B6698600C6698600012288F846200A21A0 ++:10429000284601F06DDB296B28461C31F9F3C6F383 ++:1042A0007F23296B00932B68002293F8463001F19D ++:1042B0001C0003F003030193503113462CF01CDF64 ++:1042C000B4F1FF3F3FF45DAF2846F5F383F44FF4BC ++:1042D000D163C5F874382846FFF746FD04460B90B5 ++:1042E000002840F0A0812869214619F00FDB2869D9 ++:1042F00098F83A1018F052DF28465146FFF762FB53 ++:1043000008B920231FE1284601F0DAFBC5F85C015B ++:1043100008B9212317E12846FFF798FD2146AD4A49 ++:10432000AD4B28460094019506F008FDAB4B6E4658 ++:104330001A1D07CA1B6886E80700072128462A4677 ++:1043400006F094DC04212846A54AA64B009401956A ++:1043500006F0F4FC0028C5F88C0701DA2223F2E00D ++:104360002846179906F006DD08B96423EBE0C5F886 ++:1043700004084FF0FF3728469B499C4A9C4B009706 ++:10438000FEF342F6C5F82C08002800F04C812846C0 ++:1043900001F0A4FA044608B12323D4E02B684FF0BF ++:1043A000060293F8A130A8F86420012B04BF402333 ++:1043B000A8F86430D8F88C304FF006064FF4397204 ++:1043C0001E805A80D8F890304FF0C4024FF001069A ++:1043D00005F5007128461E805A80063107F09EDCE4 ++:1043E000D5F83C010CF028DD08B185F8CF61022337 ++:1043F00085F8C0341C3385F8CB3410222B6B85F83C ++:10440000CC245B89022B02D81C2385F8CB342846A8 ++:10441000214685F8CA7485F8C97485F8C874F6F31E ++:104420003BF12B68284683F8B4402146C5F8D47187 ++:10443000F1F34AF185F8DC412846FFF72BFA19F031 ++:10444000080F18BF85F8DC4119F0100F03D028467B ++:104450002146F1F339F119F0020F13D0AB6B83F859 ++:104460004D40EB6B83F84D4095F8CB3495F8CC2458 ++:1044700043EA022323F080039BB285F8CB341B0A66 ++:1044800085F8CC3419F0040F03D028462146F5F303 ++:104490007FF419F0800F0DD095F8CB3495F8CC242B ++:1044A00043EA022323F010039BB285F8CB341B0AA6 ++:1044B00085F8CC342B6893F842308BB119F0600F3B ++:1044C0000ED019F0200F0CBFFF21002119F0400F72 ++:1044D000284649B214BF00226FF0000200F068FBCA ++:1044E00006220DF122004349DDF346F5B5F882219D ++:1044F00044F221339A4217D00E3B9A4214D007332C ++:104500009A4211D010339A420ED0143B9A420BD0EB ++:1045100007339A4208D010339A4205D025339A4285 ++:1045200014BF0027012700E0012705EB8706B46BC5 ++:104530000DF122012846224630F06ADBB16BA06102 ++:10454000886910B937230B936DE04430503128222D ++:10455000DDF312F5B36BB7F1FF3F9B699F62BFD0EC ++:10456000D8F85C30179E43F00403C8F85C30224B47 ++:10457000F560B3602846ECF7C7FF1B9A0AB1002329 ++:1045800013602B681D495869DEF322F230B1002117 ++:104590000A46DEF3DDF01A4BC0B218602B681949E9 ++:1045A0005869DEF315F230B100210A46DEF3D0F08F ++:1045B000154BC0B218602B6814495869DEF308F235 ++:1045C00030B100210A46DEF3C3F0114BC0B21860CF ++:1045D00028462CE039AE820001AE820034D90100B9 ++:1045E000D5A18100ADA181002D57810041578100E7 ++:1045F0001957810056D80100B542820035D7010015 ++:10460000EC27020041D70100102C020055D7010011 ++:10461000142C02001B9B0BB9184608E00B9B1B9E39 ++:104620000020336003E02846FFF78AFAF2E70DB076 ++:10463000BDE8F08F20230360436040F23C73836049 ++:10464000092330B50361836107330362303383622A ++:104650000F230822036340F29E3304240125002126 ++:1046600042618263C3640322A3F56773C460C561BA ++:104670004462C46244630164456402654166436503 ++:104680008465C265036630BD70B505460C4631B31E ++:10469000496D11B1C022E2F32BF3D4F88C1039B17B ++:1046A00028464FF43972E2F323F30023C4F88C3028 ++:1046B000D4F8901031B12846C422E2F319F3002354 ++:1046C000C4F89030E16929B128466822E2F310F37A ++:1046D0000023E36128462146B822E2F309F370BDC6 ++:1046E00070B50D460446002800F0E580D0F8181596 ++:1046F00039B128464FF48472E2F3FAF20023C4F889 ++:104700001835D4F8201539B128464FF48472E2F3F5 ++:10471000EFF20023C4F82035D4F8B41439B1284698 ++:1047200040F2AC42E2F3E4F20023C4F8B434D4F82B ++:10473000401531B12846AC22E2F3DAF20023C4F886 ++:104740004035D4F86C1229B1284607F019DE002351 ++:10475000C4F86C32D4F8FC1431B128464022E2F39C ++:10476000C7F20023C4F8FC34D4F8841671B123686E ++:1047700063B1DB6953B19B690C22013303FB02F285 ++:104780002846E2F3B5F20023C4F88436D4F8BC140A ++:1047900019B12846B422E2F3ABF2D4F8901421B157 ++:1047A00028464FF4AE62E2F3A3F2D4F8581631B1C2 ++:1047B00028463822E2F39CF20023C4F85836D4F895 ++:1047C000601639B128464FF49072E2F391F200235B ++:1047D000C4F86036D4F8F81731B128460622E2F35F ++:1047E00087F20023C4F8F837D4F8D81639B1284630 ++:1047F0004FF48472E2F37CF20023C4F8D836D4F884 ++:10480000E01631B128462422E2F372F20023C4F804 ++:10481000E036D4F8EC1631B128466822E2F368F2AB ++:104820000023C4F8EC36D4F8441731B12846EC2202 ++:10483000E2F35EF20023C4F84437A16B21B12846AD ++:104840004FF40672E2F354F2616B79B1896A31B1C7 ++:1048500080222846E2F34CF2626B002393622846E2 ++:10486000616B2C22E2F344F200236363216821B1DF ++:104870002846FFF709FF002323602369ABB1D3F873 ++:10488000F81028461822E2F333F223690026D96F84 ++:10489000C3F8F86019B128465822E2F329F22846F5 ++:1048A0002169FC22E2F324F226612846214640F6E3 ++:1048B000D402E2F31DF270BD2DE9F0411646B82294 ++:1048C00007460D4607F0FADD044610B940F2E93319 ++:1048D0002BE038462946682207F0F0DDE06110B988 ++:1048E00040F2044321E0FFF7A5FE38462946C022E6 ++:1048F00007F0E4DD606510B940F2EB3315E03846AF ++:1049000029464FF4397207F0D9DDC4F88C0010B98C ++:104910004FF47B7309E038462946C42207F0CEDD08 ++:10492000C4F8900038B940F2ED3321463360384680 ++:10493000FFF7AAFE00242046BDE8F0812DE9F041F2 ++:10494000174640F6D40280460E4607F0B7DD05460E ++:1049500000283BD02623C0F82838314640463A4646 ++:10496000FFF7AAFF2860002800F018818F4B056030 ++:104970001B683146C0F89C30FC22404607F09EDDA3 ++:104980000446286110B940F2ED3306E185603146F6 ++:104990004046182207F092DDC4F8F800B0B1404656 ++:1049A000314658222C6907F089DDE06770B12B6928 ++:1049B0004046DA6F31462C32C3F880204FF48472BF ++:1049C00007F07CDDC5F8180518B105E040F2EE33BC ++:1049D000E3E040F2EF33E0E0404631464FF48472CA ++:1049E00007F06CDDC5F8200510B94FF47C73D4E0F6 ++:1049F0004046314640F2AC4207F060DDC5F8B404F1 ++:104A000010B940F2F133C8E040463146AC2207F01D ++:104A100055DDC5F8400510B940F2F233BDE031462E ++:104A20004046ECF709FF0146C5F86C0210B940F2A8 ++:104A3000F333B2E028461AF091D84046314640227E ++:104A400007F03CDDC5F8FC0410B94FF47D73A4E019 ++:104A50002B680C22DB6940469B693146013303FB1E ++:104A600002F207F02BDDC5F8840610B940F2F533E9 ++:104A700093E040463146B42207F020DDC5F8BC047F ++:104A800010B940F2F63388E0404631464FF4AE624A ++:104A900007F014DDC5F8900410B940F2F7337CE05C ++:104AA0002A464FF4AE71D5F89034CB1801F5AE71AB ++:104AB000C2F894340432B1F5AE6FF4D140463146B9 ++:104AC000382207F0FBDCC5F8580610B94FF47E73A6 ++:104AD00063E0404631464FF4907207F0EFDCC5F8D2 ++:104AE000600638B140463146062207F0E7DCC5F8DB ++:104AF000F80710B940F2F9334FE0404631464FF421 ++:104B0000847207F0DBDCC5F8D80610B940F2FA333E ++:104B100043E040463146242207F0D0DCC5F8E006E9 ++:104B200010B940F2FD3338E040463146682207F0C4 ++:104B3000C5DCC5F8EC0610B940F2FE332DE0404666 ++:104B40003146EC2207F0BADCC5F8440710B940F250 ++:104B5000FF3322E0404631464FF4067207F0AEDCE8 ++:104B6000A86358B100F58673EB63404631462C22AA ++:104B700007F0A4DC0446686318B105E040F2014385 ++:104B80000BE040F2024308E040463146802207F045 ++:104B900095DCA06238B940F203433B6028464146A9 ++:104BA000FFF79EFD00252846BDE8F081BC260000E9 ++:104BB000D0F84031B1F1FF3F18BF83F89C13B2F138 ++:104BC000FF3F83F89E1383F89F2318BF83F89D232C ++:104BD0007047C04670B50446002831D000256319DF ++:104BE000D3F8501221B12368F4225868E2F380F020 ++:104BF0000435282DF3D1A16B69B194F8A3331BB10F ++:104C000023689868EAF32AF52368A16B9868EAF3A9 ++:104C100037F50023A363D4F8781221B12368E82282 ++:104C20005868E2F365F02368064918682246FFF3E6 ++:104C30008BF12368214658684FF46A72E2F358F00A ++:104C400070BDC046678986002DE9F0434FF46A7154 ++:104C500085B006464068E2F33BF0054608B9814658 ++:104C6000CFE000214FF46A728146DDF3E9F12E6056 ++:104C70007068E821E2F32CF0C9F87802002800F00F ++:104C8000B1800021E822DDF3DBF1002101236A1865 ++:104C9000C91808299372F9D1013B2B746B742B73DB ++:104CA000EB721A460121AB185218082A83F89413A4 ++:104CB000F8D11023EB74062385F827304FF0FF332B ++:104CC00085F82830213385F8A233052385F829306B ++:104CD0004FF47A736B864FF0C803AB86002385F8D8 ++:104CE0002A30023385F82B302B682A75A9741B688B ++:104CF0002A4693F8A1308B4218BF032385F82C3045 ++:104D00004FF0FF3385F89E3385F89F334FF40063EF ++:104D1000EB63012385F82D3004336B750223AB75EB ++:104D20006B7DD375AB7DD377013205F108039A42D1 ++:104D3000F6D100244FF0010895F82910284685F88F ++:104D40002E4085F82F8007F09DDE284686F8C38424 ++:104D500009F0B8DC042130462C4A2D4B0094019513 ++:104D600005F0ECFFA04268603CDB2A4B3068009302 ++:104D7000294B2A4901932A4B2A4A03932B46029432 ++:104D8000FFF3AAF0074668BBB06827492A463B46AE ++:104D9000EAF392F4A86328B3244C85F87C82231D9F ++:104DA00093E807006B4683E807002A4623683046ED ++:104DB000062105F05BDF4FF0FF3385F8A133336840 ++:104DC000284693F842100AF0DDDCC823C5F8E0322B ++:104DD000284609F0BDDE28464146ECF7CBFB85F8B6 ++:104DE000A3730EE0D5F8781219B17068E822E1F3E8 ++:104DF0007FF7706829464FF46A72E1F379F74FF054 ++:104E00000009484605B0BDE8F083C04695CB820056 ++:104E10001DCB820045CF820011E7820054D90100EA ++:104E200079D982006789860085A2000044D90100F3 ++:104E300070B5182686B00C46324668460549DDF343 ++:104E40009BF02046694632466D46DDF395F006B08C ++:104E500070BDC04634DB010070B5D0F8AC530446D9 ++:104E6000D0F8B063284603F09DFFD4F8D013A868AB ++:104E7000EAF3F4F3A868D4F8D013EAF301F40023BA ++:104E80002246C4F8D03330460449FFF35DF0F068A1 ++:104E900021464FF47E72E1F32BF770BDAB9986008B ++:104EA0002DE9FF413C23C1F824370523C1F82837F9 ++:104EB00007460D46C0684FF47E71E1F309F70446DA ++:104EC00000283DD000214FF47E724FF00008DDF342 ++:104ED000B7F0C4F8AC53C4F8B07384F8018020462E ++:104EE000E5F752FAC4F8C003284603F071FF0646FE ++:104EF00038B1F86821464FF47E72E1F3F9F6404686 ++:104F00001FE0204604F56371FFF792FFA8680E4981 ++:104F100022463346EAF3D0F3C4F8D00380B12046EA ++:104F20000DF054DC094B38460093094B09490193B5 ++:104F3000094A234602960396FEF3CEF7204600E088 ++:104F4000002004B0BDE8F0818D25830011B400007D ++:104F5000190F0100E4D90100AB99860010B5044691 ++:104F60000846B0F80CE0194642F256039E4506D8B2 ++:104F7000013B9E452ED2053B9E4509D02AE042F2D8 ++:104F800060039E451BD04EF2F5439E451CD021E0A8 ++:104F9000C389012B04D16FF03B0313604B3303E053 ++:104FA0006FF0450313605A330B602368D3F88030E9 ++:104FB00013F4805F13D01368023B13600FE06FF0AF ++:104FC0004A0313605A3309E06FF09503136003F549 ++:104FD000967303E06FF04A0313605F330B6010BDFC ++:104FE00070B504460025E06820B1054B1B68984762 ++:104FF0000023E36001350434062DF4D170BDC046B2 ++:10500000E0A685000D4B82685362002380F886304D ++:105010004FF00303A0F88C304FF00203A0F88E305D ++:105020004FF00703A0F888304FF00403A0F88A304F ++:1050300042F60133A0F89C307047C04664A8E7BE32 ++:10504000426C1F2A01D9002004E04FF00073134185 ++:1050500003F001007047C046026EB0F84A1010B568 ++:10506000946AB9B1FF2901D8012014E00B0B013B70 ++:10507000012B0FD8C1F30323092B0BD853B1C1F374 ++:105080000313092B06D801F00F03092B8CBF002056 ++:10509000012000E00020D26A41F2E4439A4210D19C ++:1050A000A4F58263073B012B01D83F2907E040F2BA ++:1050B0000C439C4204D015339C4202D1502900D8A5 ++:1050C000002010BD00B58E46C16E4FF0407394466F ++:1050D0007046C1F8603115E00379C2781B0443EAD9 ++:1050E000026382791343427943EA0223C1F86431AF ++:1050F000437802781B0243EA024382780730134365 ++:10510000C1F86431CEEB00036345E5D300BDC04672 ++:10511000C16E4FF48030C1F860011D4AD1F8603192 ++:1051200010B5D1F86441C1F86001D1F86031C1F81F ++:105130006421C1F86001D1F86031D1F86431934243 ++:1051400024D1144AC1F86001D1F86031C1F864215A ++:10515000C1F86001D1F86031D1F86431934215D1C2 ++:10516000C1F86001D1F860310023C1F86441C1F891 ++:105170008C31D1F82001084B984201D1012006E082 ++:10518000064B984214BF0020012000E0002010BD13 ++:10519000AA5555AA55AAAA55000400040004008483 ++:1051A000D0F8501810B5044641B1D0F84C284068EA ++:1051B0009200E1F39DF50023C4F85038D4F8481864 ++:1051C00059B16068DDF3F0F46068D4F84818E8225B ++:1051D000E1F38EF50023C4F8483810BD70B50469BA ++:1051E0000646206E08B1EAF729FB2046FFF7F8FED5 ++:1051F000A56F686A18B104F035F800236B62606F20 ++:1052000003F0C2FF206F05F05BFC616E29B12068DE ++:10521000A26EE1F36DF500236366206E18B103F012 ++:1052200021FB002323662046E7F7C4FF3046FFF743 ++:10523000B7FF002070BDC0462DE9F04F0368076935 ++:105240008FB00890DE691446FB6B0CA80821704AE9 ++:10525000DCF33AF7FB68002B40F0CE80F96E386E35 ++:1052600001F50071D7F800B0DFF31EF3BB6801460B ++:105270009868EAF3B7F1002800F0C680D7F860E03C ++:105280000CB9A44602E0FB6E03F5007CFB6E03F54F ++:10529000087504B13468B168BB687268F068D3F807 ++:1052A000283803915B490DF130094FF0FF38029225 ++:1052B0000590724606930791634649465846009505 ++:1052C0000194CDF81080ECF735F93168F8603A6E4A ++:1052D000FB6E01914F4900240546079103F51073B9 ++:1052E00049465846009402940394CDF810800594E2 ++:1052F0000694ECF71FF9316838613A6EFB6E019144 ++:1053000044490990079103F5207349465846009493 ++:1053100002940394CDF8108005940694ECF70AF9F2 ++:10532000316878613A6EFB6E01913A490A900791B3 ++:1053300003F5307349465846009402940394CDF81F ++:10534000108005940694ECF7F5F83168B8613A6E70 ++:10535000FB6E01912F490B90079103F5407349466D ++:105360005846009402940394CDF810800594069456 ++:10537000ECF7E0F83168F8613A6EFB6E019125496F ++:105380008246079103F550734946584600940294AB ++:105390000394CDF8108005940694ECF7CBF8099AA5 ++:1053A000A54214BF002501250A9BA24208BF45F073 ++:1053B00001050B99A34208BF45F00105A14208BFB2 ++:1053C00045F00105A24508BF45F001053862A0423D ++:1053D00014BF284645F00100B0B90F4B3C46D3F846 ++:1053E00084600546E06818B10C49B047C4F8A000D5 ++:1053F00001350434062DF5D1B96F08980831002223 ++:10540000E7F714F9012000E000200FB0BDE8F08FAD ++:10541000FB41860014260000E0A68500C326860016 ++:105420001FB5022303930C330446C0F84C383821CF ++:105430004068E1F34DF4C4F85008D0B1D4F84C28DA ++:1054400000219200DCF3FCF56068E821E1F340F410 ++:10545000C4F8480868B10021E822DCF3F1F5012323 ++:1054600000936068D4F8481803AAB333DDF334F42A ++:1054700001E04FF0FF3004B010BDC0462DE9F04F01 ++:10548000056997B0DDF884A014469B469DF88020FE ++:10549000EB63EB6FA860AB672A710746C5F800A005 ++:1054A00028460E46FFF7AEFD249B05F1640205F188 ++:1054B000680100930192029120465146229A239B53 ++:1054C00003F00EFB2866002800F0D581D5F8648033 ++:1054D00095494046DDF37CF220B100210A46DDF318 ++:1054E00037F186B240469149DDF372F248B10021AE ++:1054F0000A46DDF32DF14FF6FF7380B2984218BFD4 ++:10550000044630462146FDF7F9FF08B90C30B7E1F3 ++:1055100040F612010022A5F84060A5F84240286E2E ++:10552000E5F36CF6E866286EE5F3BAF4D5F86C900E ++:105530006864C7F80C902846FFF782FD08B90D3063 ++:105540009EE1286EEAF77EF92846002116F0C4DBBA ++:1055500028464FF0FF31E7F7A7F82846FFF7D8FDB8 ++:1055600008B90E308CE140467149DDF305F2FF28A1 ++:1055700008BF0120A5F84A002846FFF76DFD08B9CD ++:105580000F307DE16B494046DDF3F6F16A4985F85D ++:1055900048004046DDF3F0F16849E8644046DDF339 ++:1055A000EBF1296E2865CA6A41F26B039A420AD16F ++:1055B0008B6A4E2B07D1B5F84A30402B03D9EB6CE0 ++:1055C00043F00203EB64EB6C13F0200F04D00121D5 ++:1055D00028460A4617F036DFB5F840200123A7F821 ++:1055E0008021C5F89830B5F842303A68A7F8823182 ++:1055F0002B6E284613616B6C936095F8483082F8E7 ++:105600007C303A68B5F84A30B968A2F87A30EB6C69 ++:10561000C2F880302B6DC2F88430D5F898305362D0 ++:105620003A4605F057FA286708B9193028E12B6E79 ++:10563000CDF810A005932B6FCDF81CB0B5F8402025 ++:1056400006936B6CADF8302008932A6EB5F84230A3 ++:10565000CDF82C80ADF83230936B04A80D93D36B4A ++:105660000E93136C0F9395F848301093936A11932F ++:10567000B5F84A301293D36A1393EB6C14932B6DE5 ++:10568000159353680993D3680A9303F085FD6867FF ++:1056900008B91030F4E0B5F8421044F221339942D1 ++:1056A00017D00E3B994214D00733994211D01033D2 ++:1056B00099420ED0143B99420BD00733994208D03F ++:1056C0001033994205D02533994214BF0026012694 ++:1056D00000E0012631462846E6F7CAFFAA6F002EF1 ++:1056E0000CBF02230123136056603A6B286E1360CF ++:1056F0005660FC6AE5F3C2F32060D9F85C31696C4E ++:105700000F4A6B65AB65062301FB0323AC6FC5F83D ++:10571000B830686F49462268434603F0D5FE6062A0 ++:1057200080B91130ACE0C046D1AD86004837860064 ++:1057300084AE8600E5AE8600863786009E798600B8 ++:10574000301E0200AB6F696D586AEDF747FBAB6F17 ++:1057500003F1220203F11C01586A009203F11E02B8 ++:10576000203303F0F9FCAC6F606A03F005FD84F8A8 ++:105770002800AB6F3C6B586A03F0FEFC2075AC6FE1 ++:10578000606A03F0FDFCA96FA061CB8B032B01D0F5 ++:10579000122075E03B6B4A6A38461A618A8B1A817F ++:1057A000CA8B5A810A8C9A814A8CDA8140F2FF3284 ++:1057B0004FF00F03CA828B8201223146FFF73CFD76 ++:1057C00008B913305CE0B6F1FF3F3FF464AFAB6F54 ++:1057D0003A68586A92F89910EDF704FB00212846C0 ++:1057E00016F062DF08212846E7F772F8284618F01D ++:1057F00093DA286E2449254A00230097E5F3BAF48A ++:105800002846002118F06ADA2846E6F7FBFE08B9B8 ++:10581000153035E005F1DC042146DCF3CDF62046F9 ++:10582000DDF38AF048BB2046DDF396F0044620BB4A ++:10583000284616F099D8AB681B68D3F89C00F0B1E5 ++:105840000378E3B112492A46DDF39AF1AB681149B6 ++:105850001B682A46D3F89C00DDF3CCF1A868FFF75B ++:10586000DFFDE86858B1AB681B68D3F89C10DFF324 ++:10587000BFF1204604E00B2002E0162000E00020EB ++:1058800017B0BDE8F08FC04669C1830085C18300B1 ++:1058900025C0830049C0830010B590F85E300446EF ++:1058A0005BB90648EBF700FF054B20461A6805492F ++:1058B000FFF708FC012384F85E3010BD67DB0100B0 ++:1058C000FC580300A4D2020010B5044619F058DFBA ++:1058D00001220146204619F0CBDF10BD37B5054641 ++:1058E00019F04EDF0023C5F84C0280F848302A68D2 ++:1058F000044692F82F10284600914E32214618F0A7 ++:10590000EDDC30B12846214619F096DD4FF0FF302E ++:1059100003E02846214619F035DE3EBD37B5044682 ++:10592000002847D0D0F8201131B103689868E9F316 ++:10593000A7F60023C4F820312268136893F82F30AB ++:105940003BB3D2F8000501A92FF0C4DB13E0536884 ++:1059500013F0400F0FD0D4F82C31D51807E00B68A6 ++:105960004822C5F8103123685868E1F3C1F1D5F831 ++:1059700010110029F3D101A82FF0B4DB0246002852 ++:10598000E5D106E00B684068C4F840314822E1F3F5 ++:10599000AFF1D4F8401120680029F3D1064922461E ++:1059A0000068FEF3D1F22368214658684FF4A472D0 ++:1059B000E1F39EF13EBDC04691BA8600F0B54FF4CA ++:1059C000A47185B005464068E1F382F1064608B946 ++:1059D000074655E000214FF4A4720746DCF330F38C ++:1059E000294B35600093294B29490193294B002409 ++:1059F00003932868284A33460294FEF36DF2314639 ++:105A00002A6B1368022B03D1537D0BB9163300E0C8 ++:105A1000302301340B744431042CF1D1A8681F49A0 ++:105A20002A460023E9F348F60446C6F8200130B9B7 ++:105A3000686831464FF4A472E1F35AF11FE04FF465 ++:105A40009673C6F81C3145F27353A6F838314FF0FF ++:105A50004603A6F83A31124B0024C6F840412846C6 ++:105A600000934FF48A710F4A0F4B019505F066F9C8 ++:105A7000A042C6F82C0103DA3046FFF74FFF274655 ++:105A8000384605B0F0BDC046F90C8400DD120100B7 ++:105A900094DB01007D0A840091BA86003D068400F3 ++:105AA000D9128400E5128400A512840010B50146C5 ++:105AB00020B10368B022D868E1F31AF110BDC046E6 ++:105AC0002DE9F34107680546B021F868E1F300F1DC ++:105AD000064608B980468BE00021B02201AC804622 ++:105AE000DCF3AEF20422002137607560C5F85C611A ++:105AF0002046DCF3A5F22A6892F87C30012B07D906 ++:105B00003D495069DCF364F7014690B120460AE054 ++:105B100050693A49DCF330F70928034609D8384977 ++:105B2000204601EB83010322DCF342F300238DF8CE ++:105B3000073001AC0322214606F10800DCF338F3FC ++:105B40000023F3722B682F495869DCF315F7396984 ++:105B5000F060CA6A41F26B039A420CD18B6A8B2BBC ++:105B600009D1022807D1204627490422DCF300F39B ++:105B700008B90323F360396941F26B03CA6A9A4298 ++:105B80000DD18B6A932B0AD101A820490422DCF3A2 ++:105B9000EFF220B9F368042B01D10233F36001AFB7 ++:105BA000284639461FF054DE044650B91849384695 ++:105BB0000322DCF3FDF2284639468DF807401FF03A ++:105BC00047DE05F5AA60394603220A30DCF3F0F21D ++:105BD000002405F5AA600F4985F85D450E300322C3 ++:105BE000DCF3E6F285F861453046394620F0BADA52 ++:105BF0004046BDE8FC81C046B3C48600B9C48600F7 ++:105C0000CE028600BCC48600C3C4860071C2860072 ++:105C1000C6C48600CAC4860070B50568044622461C ++:105C200028680449FEF390F1686821465022E1F3A8 ++:105C30005FF070BD3CE486002DE9FF410546502130 ++:105C40004068E1F345F0064608B904465AE00021F1 ++:105C500050220446DCF3F4F1FF210422356006F102 ++:105C60003B00DCF3EDF1284619F08ADD002790F8BF ++:105C7000483080F8387586F83B3096F840304FF061 ++:105C8000FF3843F00803202186F840301F4AC6F849 ++:105C9000488006F11800DCF317F27061304626F0F8 ++:105CA000B5DF042128461A4A1A4B0097019605F0E1 ++:105CB00045F8B84230611FDB174B02970093174B32 ++:105CC00017490193174B184A039328683346FEF38C ++:105CD00003F188B9012586F83A50304629F00ADAEE ++:105CE00018B13046294627F0FFD9A37BA4F84C8091 ++:105CF00043F00203A37305E0686831465022E0F3E5 ++:105D0000F7F70024204604B0BDE8F08140E48600A7 ++:105D10001DDF8400F9DE8400F51D01001DED840007 ++:105D200024E40100DDD084003CE4860070B5054623 ++:105D3000002826D00368134918682A46FEF304F1A8 ++:105D40006B6905E01C68596828462AF0E7DD2346A0 ++:105D5000002BF7D12B6905E01C68596828462AF00A ++:105D6000DDDD2346002BF7D1A96A21B12B689022F3 ++:105D70005868E0F3BDF72B68294658682C22E0F3F9 ++:105D8000B7F770BD91E6860030B52C21044685B08A ++:105D90004068E0F39DF708B9054618E000212C2281 ++:105DA0000546DCF34DF10823AB610A4B2C600093F0 ++:105DB0000023019302930393074A2B462068074967 ++:105DC000FEF38AF02268012382F896302B71284670 ++:105DD00005B030BD050B850091E6860004E50100A5 ++:105DE0002DE9F047154680460F461E46E5F346F07E ++:105DF000002181464046E5F313F200220446114695 ++:105E00000F480B185B6873B90C3302FB03F31D508A ++:105E10001A18636A576096600A4A45EA03031360DA ++:105E20006362012404E001320C31052AE8D1002428 ++:105E300040464946E5F3F4F12046BDE8F087C04608 ++:105E40003C260000782600002DE9F04705468846EC ++:105E5000E5F350F100212846E5F3E2F10646284635 ++:105E60006C69AF69E9F7E8FA0A2C814616D90F2C5C ++:105E700019D02846E9F768FD142C054603D9B36804 ++:105E800023F00803B360B36843F00103B36003D9A0 ++:105E9000B36843F00803B360012211E0022C02D87A ++:105EA000174D30220CE02846E9F758FDD6F8A4300B ++:105EB000054623F0FF0343F00203C6F8A430022294 ++:105EC000B36813F0010F07D107F01803082B14BFB4 ++:105ED0004FF4E115B5FBF2F507F0030700240BE0E2 ++:105EE00006F54073B8F1000F05D003EB04204946D6 ++:105EF0002A460023C0470134BC42F1DBBDE8F087ED ++:105F000000C63E0537B5134B1546136001E0114B33 ++:105F100013600432ADF17C039A42F8D3033020F0D1 ++:105F200003000D4BC0EB01041C600C4B00211960F9 ++:105F30000B4B05F5A05219600A4B083C19600A4B3F ++:105F400041601D60094B1A60094B1960094B0460E0 ++:105F500058603EBD4B415453C826000088260000BF ++:105F6000A4260000CC260000F8270200FC2702002F ++:105F700090260000C0260000436910B5142B01DDF7 ++:105F800002F09CFB10BDC0461FB5E8200021E0F3E5 ++:105F90003DF20C4C2060A0B10021E822DCF350F06F ++:105FA00004AA012342F8043D013B0093064B2168FB ++:105FB000186840F23C73DCF38FF620680E21DCF3A6 ++:105FC000D5F61FBDBC26000024280200B1F5E06F05 ++:105FD00073B505460C46164606D1036900910021AB ++:105FE00001911C680A460CE00D4B00221868E5F38D ++:105FF00005F1014680B12B690022009401921C68D2 ++:1060000028463346A04738B1064AA86113680020E5 ++:106010002B626E61156001E04FF0FF307CBDC04621 ++:106020008C260000202802002DE9F04710200E46A3 ++:10603000002117469946E0F3E9F1044610B96FF0E4 ++:106040001A001EE0104D2868E4F318F7099B8046FB ++:1060500023B9286831463A46E5F3D0F02868E4F3DE ++:1060600089F701238340094AE360089BC4F8049040 ++:10607000A36013682868236041461460E5F3D0F0FC ++:106080000020BDE8F087C0468C260000982600005E ++:1060900007B50021E5F3C4F0074B4FF40061186029 ++:1060A000064B00F57060186000200246044B00901B ++:1060B0000190FFF7B9FF0EBD9C260000F4270200F7 ++:1060C0006D60800037B5234B234C02AD00211C22AC ++:1060D00045F8043D2046DBF3B3F7012323601F4B53 ++:1060E000A5F5A0551B6843F8044C00F00DF92946AE ++:1060F0002A461B48FFF706FFE0F344F300F042F89E ++:10610000002002F01FFA174B174C186002F0BCFC7D ++:106110002060FFF7BDFF206800F01EF9E9F716F8D0 ++:10612000206800F0A5F8002210481149E0F3E2F4DD ++:10613000002210481049E0F3DDF410490022104815 ++:10614000E0F3D8F42068FFF717FFFFF71DFF206882 ++:106150003EBDC046ADDEADDE00280200F81E0200E6 ++:1061600000590300242802008C260000D81F860056 ++:1061700059EF0000DB1F8600656580008D608000A0 ++:10618000DE1F860070B5A4200021E0F33FF1124D20 ++:10619000286080B10021A422DBF352F74FF4806025 ++:1061A00000212C68E0F332F1A060286884682CB9E3 ++:1061B000E0F392F02C604FF0FF300CE04FF480627F ++:1061C000C2608460446100212046DBF339F72A680D ++:1061D000024B00201A6070BD38280200D42600004F ++:1061E00070B51C4D06462B6833B91B4C23680BB9A0 ++:1061F000FFF7C8FF23682B60164C184B20685861C6 ++:1062000030B3002505604560336CC0F89C500E3BF0 ++:10621000012B03D930461249FFF716FE114A936845 ++:1062200013B12368C3F89C20246807E0D4F89C00CD ++:1062300018B1A368595DE0F349F4013523699D4223 ++:10624000F4D3094809492246E0F354F4014B186895 ++:1062500070BDC046D4260000382802000028020085 ++:106260009562020028280200BD218600A5688000F2 ++:1062700010B54022002305490446FFF7B1FD044B49 ++:1062800000229A602046FFF7ABFF10BDA96980008D ++:106290002828020070B51B4DAE68002E31D11409BC ++:1062A0002C60AB8104F561444FF4E13394FBF3F4CB ++:1062B000A8606960284603218022E0F3FDF32846A8 ++:1062C0003146E2B2E0F3F8F3284601212212E0F36E ++:1062D000F3F303210A462846E0F3EEF301210A46D0 ++:1062E0002846E0F3E9F3284604210822E0F3E4F32A ++:1062F000284602210122E0F3DFF34FF47A70E0F345 ++:106300002BF270BD28280200104A0721136843F0C1 ++:1063100010031360136843F008031360136823F439 ++:1063200000731360E832136843F0807343F48033E2 ++:106330001360074B00221960043B1A6008331A6887 ++:106340001960044B20221A607047C04614ED00E02B ++:10635000241000E000E400E02DE9F041054600F0E3 ++:10636000ADF82A48E8F778FC2846E9F73BF8284BCF ++:10637000284AC318B3FBF2F3274A28461360E9F70B ++:10638000D9FA00F5787007304FF47A73B0FBF3F068 ++:10639000224B234A18602B6A2249002BCCBF6FF096 ++:1063A0007F4340F2FF3313601D4A1F4F1368B3FB56 ++:1063B000F0F31360284620220023FFF711FD002090 ++:1063C0001A49DCF3D9F204463860E8B12846E9F707 ++:1063D00009F8B4FBF0F0861E002E15DD144C0021E8 ++:1063E00034222046DBF32CF6124B4FF47A71A36073 ++:1063F0006560204606FB01F10122DFF3FBF618B1D0 ++:1064000028463968DEF306F2BDE8F08191F100001C ++:106410003F420F0040420F00D0250000C825000079 ++:10642000CC25000001678000E8260000BEE60100E0 ++:1064300040280200E56680002DE9F04707461E4629 ++:1064400015460C46E4F356F63846E4F317F52946AC ++:10645000324681463846E4F3D1F63846E4F38AF50D ++:1064600040F62A01064600223846E4F3C7F6054600 ++:106470008CB1012414FA06F3826932EA030802D1CE ++:106480002046E8F7A9FB701C14FA00F0E8F786FB39 ++:10649000C5F818800CE00124701C14FA00F0E8F72D ++:1064A0009BFB2046B440E8F779FBAB691C43AC6129 ++:1064B00038464946E4F3B4F6BDE8F0872DE9F047E5 ++:1064C0000746E4F317F6384640F60E010022E4F3DF ++:1064D00095F60446002831D0D0F80080056838468B ++:1064E000E4F3DEF40428064604D827D1C5F30243BA ++:1064F000032B23D100204849DCF33EF2F0B9474991 ++:10650000C8F3031212E0013A072E22610AD90C2EB9 ++:1065100008D0236C13F4806F02D013F4006F01D104 ++:1065200008B903E0012041F004516161002AEAD179 ++:10653000D4F8E83123F01003C4F8E831002240F623 ++:106540002A013846E4F35AF6354C20603846E4F325 ++:10655000A7F4344B22681860136843F6A12443F073 ++:1065600080731360136843F0020313600023C2F8C2 ++:10657000E03103E00A20E0F3EFF00A3CDFF8A090FE ++:10658000D9F80030D3F8E03113F4003F01D1092CE1 ++:10659000F0D100210B4638464FF40062FFF74CFF64 ++:1065A00000210B46384640F61202FFF745FF002156 ++:1065B0000B46384640F62902FFF73EFF38460121D8 ++:1065C000E8F73EFF00201849DCF3D6F1E0B1384689 ++:1065D000E4F354F440F62A01804600223846E4F3FE ++:1065E0000DF646690446D0F898503846E4F346F470 ++:1065F0000123834045F00105334363613846C4F805 ++:1066000098504146E4F30CF6D9F80020136A43F0A1 ++:1066100003031362BDE8F0872DE70100FF7F01004F ++:106620007428020078280200BEE6010010B58469D3 ++:10663000A068FCF729FCE068E9F7E4F8002010BD49 ++:1066400010B584690021342204F11C00DBF3F8F456 ++:10665000034BA06863622462EBF794F8002010BD3E ++:1066600005AA80002DE9F347DFF8AC809946D8F8F9 ++:1066700000300546072B0F46924643DC01F062FFCF ++:1066800050210646E0F324F3044600283AD00021C6 ++:106690005022DBF3D5F4D8F8003065602360A4F80D ++:1066A00014902761E660204641F2E4414A463346B1 ++:1066B0000097CDF804A0FCF739FCA06010B30020CF ++:1066C0000A990B9A114B0095CDF804A0FFF7ACFC8A ++:1066D00018B1A068FCF7D8FB14E0A068E2F3B4F6A8 ++:1066E0000B49A061D8F800202846DBF3FDF40948E7 ++:1066F0002946EAF7D9FFD8F8003020460133C8F818 ++:10670000003000E00020BDE8FC87C04631AA8000D0 ++:106710005CB102003CB102007C280200014610B5C9 ++:1067200050228068E0F3E4F210BDC046C36B10B5A0 ++:106730001BB100225A62836B5A62C068FFF7EEFFFA ++:1067400010BDC0462DE9F041184E1C46337807466F ++:10675000072B904626D820464C21E0F3B9F2054697 ++:1067600000B300214C22DBF36BF46C602F60C5F8A2 ++:1067700008803378204685F8443001333370022393 ++:10678000AB640821E0F3A4F20446286420B10021A0 ++:106790000822DBF355F406E029464C22E0F3A8F288 ++:1067A000254600E000252846BDE8F081802802004B ++:1067B0002DE9F04FD1F8FC3091B00F93054603F569 ++:1067C0006063079335E10FAF0E2200232846394658 ++:1067D000D9F37AF60F28044600F0368100222846C5 ++:1067E00039461346D9F370F610F00E0640F02681B4 ++:1067F00040F23B43B3EB145FC4F30B21C0F3041826 ++:1068000004D140F6FF73994200F01381C0F3442293 ++:106810000992002A00F00D81C0F3C443C0F3843B09 ++:1068200013EB0B02089319D140F26733994240F001 ++:1068300000810EAB01930DAB02930CAB03930BAB3A ++:1068400004932846394613460092D9F3DBF5002815 ++:1068500000F0EF800E9BC5F85433EAE0D5F8CCA0E9 ++:1068600005EB8A03C3F8D4423446C3F81403C3F8D3 ++:10687000D0100BE00122284631461346D9F324F606 ++:1068800000F00E00022840F0D980013444450FAEDC ++:10689000F0D1002213460DF138090DF134080CAF88 ++:1068A0000BAC284631460092CDF80490CDF8088014 ++:1068B00003970494D9F3A6F50246E8B94023009360 ++:1068C000284631461346CDF80490CDF8088003974A ++:1068D0000494D9F397F510B14FF001080EE00D9B29 ++:1068E000002B40F0AB800B9B002B40F0A7800C9B53 ++:1068F000B3F5805F40F0A2804FF000080E9A05EBE0 ++:106900008A03C3F810210C9A0124C3F8D0210EABDE ++:1069100001930DAB02930CAB03930BAB00220493DA ++:1069200028460FA923460092D9F36CF508B9012730 ++:1069300027E0012C40F086800C99B1F5805F40F093 ++:1069400081800E9B05EB8A02C2F89031C2F81012CA ++:1069500078E00024002300930EAB01930DAB02936B ++:106960000CAB03930BAB049328460FA93A4623467E ++:10697000661CD9F347F508B13446EBE7002E5DD02D ++:106980000137099A9742E4D100241FE0C023009305 ++:106990000EAB01930DAB02930CAB03930BAB0493C3 ++:1069A00028460FA922460023D9F32CF5002845D00C ++:1069B0000B9B002B42D10C9BB3F5805F3ED124B9D9 ++:1069C0000E9B05EB8A02C2F8943201345C45DDD19E ++:1069D000002423E0802300930EAB01930DAB0293C0 ++:1069E0000CAB03930BAB049328460FA9012F0CBFEC ++:1069F0002246621C0023D9F305F5F8B10B9BEBB9D5 ++:106A00000C9BB3F5805F19D1BBF1000F05D124B900 ++:106A10000E9B05EB8A02C2F894320134089B9C421B ++:106A2000D8D1B8F1000F04D1D5F8CC300133C5F876 ++:106A3000CC300F9B079A9342FFF4C5AE0023C5F8F4 ++:106A4000CC3001E0013462E711B0BDE8F08FC04600 ++:106A500082604160016070470EB4F3B581680646FC ++:106A6000012901D8002044E008AB4068079A01934F ++:106A7000DBF31CF4B0F1FF3F074603D0B368023BE1 ++:106A8000984203DD00231846B36032E070683D2170 ++:106A9000DBF33AF330B373683568C3EB00041EE0F0 ++:106AA00028462246DBF34CF2A8B92B5D3D2B12D1D0 ++:106AB0002846DBF355F37268441CBA1829190132D1 ++:106AC0002846521ADBF38EF273681B1B7360B3689F ++:106AD0001B19B36006E015F8013B002BFBD1716870 ++:106AE0008D42DDD3B368781C1B1AB36073681B1822 ++:106AF0007360BDE8FC4003B07047C0462DE9F0412B ++:106B0000C1EB0204012C0E461F46DDF8188010DD93 ++:106B10002146E0F3DDF0054610B96FF01A000DE0F4 ++:106B200031462246DBF328F200203D60C8F80040E1 ++:106B300004E000233B60C8F800301846BDE8F0814F ++:106B40002DE9F04FA5B008914FF4805109900792BC ++:106B50000693E0F3BDF00A9018B96FF0010401F05C ++:106B600029B921A80A994FF48052FFF771FF4FF419 ++:106B700080520A980021DBF363F200234FF0FF32CA ++:106B80008DF844300B930D930E9201F0DEB80D9BFF ++:106B9000089A002152F8239001230C910F930F9B28 ++:106BA00019F8012073B1531EDBB2FD2B01F101086E ++:106BB00098BF19F808B016468CBF4FF0000B08F1CB ++:106BC00001080CE002F1FF33DBB2FE2B93462CBF31 ++:106BD0001646802628BF4FF0000B01F101080BEB91 ++:106BE0000803B3F5607F81F2AD80202E2AD005D84E ++:106BF000152E0AD01B2E6DD001F078B8222E3AD077 ++:106C000036D3802E72D001F071B808EB09035A78A0 ++:106C100019F8083003EB0223072B13DD09F10204F6 ++:106C2000444421AD874922462846FFF715FF2046F8 ++:106C3000DBF396F209F1030200EB080382492846D0 ++:106C4000D2184FE008EB0904637819F8082021AD49 ++:106C500002EB032228467D49FFF7FEFEE378A27887 ++:106C600028467B4902EB0322FFF7F6FE01F03EB80F ++:106C700019F8082003E00C9B0C2B03D100220C9286 ++:106C800001F036B89DF84430002B41F0318019F8FE ++:106C90000830042B41F02C8009F1020404EB0805B4 ++:106CA0002846DBF359F6002841F0228014F808301A ++:106CB00013F0010F41F01C80284611A9DBF394F476 ++:106CC0000E9BB3F1FF3F41F0138008EB09039A7963 ++:106CD000DB790DE108EB0903DC799A795D4921A89C ++:106CE00042EA0422FFF7B8FE01F002B819F80830B2 ++:106CF000822B00F2FD87DFE813F09200B300380129 ++:106D00003B02D4021102CB01DA014701EA02FB0285 ++:106D100010031703FB077F020302FB073603570329 ++:106D200097007A037F0390039503F700E903FB07BD ++:106D3000770107047F01FB07FB07FB071004220410 ++:106D4000270472045305FB07FB0721068D0088000A ++:106D50008300AE06D306DA06E106FB0726037101BF ++:106D6000FB07FB070001F007E806FB07FB07FB0733 ++:106D7000FB07FB07FB07FB07FB0787011307280738 ++:106D8000490764077F079907B307CD07D407FB07B7 ++:106D90008E01FB07FB07FB07FB07FB07FB07FB0756 ++:106DA000FB07FB07FB07FB07FB07FB07FB07FB07D3 ++:106DB000FB07FB07FB07FB07FB07FB07FB07FB07C3 ++:106DC000FB07FB07FB07FB07FB07FB07FB07FB07B3 ++:106DD000FB07FB07FB07FB07FB07FB07FB07FB07A3 ++:106DE000FB07FB07FB07FB07FB07FB07FB07FB0793 ++:106DF000FB07FB07FB07FB07FB07FB07FB07DE07A0 ++:106E000009EB0804002500F00BBE09EB080400257F ++:106E100000F0F4BD09EB0804002500F0DEBD0E49CA ++:106E200008EB090321A8DDE008EB0901CA780B791A ++:106E3000120442EA03624B7821A81A438B7807496F ++:106E40007EE2C04640B202009CB40200FEB10200E5 ++:106E500093B5020062B80200D9B3020075B1020016 ++:106E600008EB0904A378627821AE02EB0322AE4955 ++:106E70003046FFF7F1FD2379E2783046AB4902EB6B ++:106E80000322FFF7E9FDBBF1060F40F23187A3793A ++:106E900062793046A64902EB0322FFF7DDFDBBF124 ++:106EA000080F40F22587237AE2793046A14902EBA8 ++:106EB0000322FFF7D1FDBBF10A0F40F2198709F158 ++:106EC0000A0409F1090514F8083015F808209A4950 ++:106ED00002EB03223046FFF7BFFD14F8083015F827 ++:106EE0000820964930464CE008EB09039A785B7815 ++:106EF00003EB02220E9200F0FBBE0623904ABBFB7E ++:106F0000F3F309EB08074FF0000A137027E019ADFF ++:106F1000534610218B4A1DAE2846DBF3D5F053466D ++:106F20001021894A3046DBF3CFF0BB787A7821AC68 ++:106F300042EA032229462046FFF78EFD7A79BB7983 ++:106F4000120442EA0362FB7820461A433B79314639 ++:106F500042EA0322FFF780FD0AF1010A0637784B67 ++:106F60001B789A45D3DB00F0C3BEBBF1020F21A80A ++:106F700008EB090202D175495278B3E69378734958 ++:106F8000527802EB0322ADE608EB0904A27863789D ++:106F9000BBF1040F03EB022505D92379E2781B0628 ++:106FA00003EB02431D4321AE304669492A46FFF7F1 ++:106FB00053FDBBF1060F40F29B86A2796379BBF1CA ++:106FC000080F03EB022505D9237AE2791B0603EBB0 ++:106FD00002431D435F4930462A4683E65E4908EB7B ++:106FE000090321A85A787DE608EB09039C785A78B2 ++:106FF000524921A800F05BBE0BF101035FFA83FB4D ++:1070000000230F9300F074BE08EB09039C785A78B4 ++:10701000524921A864E64A4B4FEADB0209EB080714 ++:107020004FF0000A1A702DE01DAD53461021454A5D ++:1070300019AE2846DBF348F053461021424A304649 ++:10704000DBF342F0FA783B79120442EA03627B7880 ++:1070500021AC1A43BB78294642EA03222046FFF7B7 ++:10706000FBFCFA793B7A120442EA03627B79204600 ++:107070001A43BB79314642EA0322FFF7EDFC0AF1DD ++:10708000010A08372E4B1B789A45CDDB00F030BE45 ++:1070900021AD08EB0904284631496278FFF7DCFC92 ++:1070A000BBF1020F40F224862E49284659E121AD5A ++:1070B00008EB0904002228462B496378FFF7CCFC33 ++:1070C000BBF1020F40F20F86012228462649A37821 ++:1070D000FFF7C2FCBBF1030F00F005860222284631 ++:1070E0002149E378FFF7B8FCBBF1040F00F0FB8502 ++:1070F00028461D4903222379FFF7AEFC00F0F3BDBB ++:1071000021AC08EB090517496A782046FFF7A4FC73 ++:107110001549AB782046012200F0DCBD134908EB8D ++:10712000090321A85EE7C046B4B6020075B70200A5 ++:10713000BEB502000AB2020021B3020021B2020071 ++:107140008128020038E7010043E7010056B302003E ++:1071500037B7020082B2020054B40200CAB702007C ++:1071600081B10200ACB7020081B4020045B8020050 ++:10717000ABF10203082B00F2BB85DFE813F0090036 ++:10718000B905B905B905B9052B001C0015000E009D ++:10719000A74908EB090321A824E708EB090321A864 ++:1071A000A4495A7AFFF758FC08EB090321A8A04923 ++:1071B0001A7AFFF751FC09F1070521AC9E4915F831 ++:1071C00008202046FFF748FC20469C4915F8082077 ++:1071D000FFF742FC9A4D09EB0804A3786278294630 ++:1071E00002EB032221A8FFF737FC964B0935023446 ++:1071F0009D42F2D100F07CBDBBF1140F19D0BBF160 ++:10720000170F04D0BBF1130F1AD000F071BD21ACE1 ++:1072100008EB09058C49AA7D2046FFF71DFC8B4928 ++:107220006A7D2046FFF718FC204689492A7DFFF732 ++:1072300013FC08EB090321A88649DA7CFFF70CFC54 ++:10724000854D09EB0804A3786278294602EB0322F6 ++:1072500021A8FFF701FC814B093502349D42F2D190 ++:1072600009EB08057E4E2C46237AE279314602EB83 ++:10727000032221A8FFF7F0FB7A4B0B3602349E4223 ++:10728000F2D1794CAB7B6A7B214602EB032221A829 ++:10729000FFF7E2FB754B0B3402359C42F2D100F054 ++:1072A00027BD08EB0901C8784A788B7800900879E7 ++:1072B00001904879029088790390C8790490097AFE ++:1072C00021A805916A49FFF7C7FB00F011BD09EB42 ++:1072D000080400256378FF2B04D021A865492A46BD ++:1072E000FFF7BAFB01350134042DF3D100F000BDE6 ++:1072F00008EB09035A780AB19B7823B921A85E49A3 ++:10730000FFF7AAFB03E021A85C49FFF7A5FB08EB08 ++:1073100009035B49DA7821A8E4E408EB09039C78C7 ++:107320005A78584921A8DBE408EB0901CA780B799F ++:10733000120442EA03624B7821A81A438B7852491F ++:1073400042EA0322CEE421AD08EB090428464F4966 ++:107350006278FFF781FBBBF1020F40F2C9844C4910 ++:107360002846A278BEE409F1010515F8082021ACF1 ++:10737000484902F00F022046FFF76EFB15F808207F ++:107380004549120909F102052046FFF765FB15F88A ++:107390000820424902F007022046FFF75DFB15F87E ++:1073A00008203F4920461FE009F1010515F8082093 ++:1073B00021AC3C4902F00F022046FFF74DFB15F8C7 ++:1073C00008203949120909F102052046FFF744FB5C ++:1073D00015F80820354902F007022046FFF73CFB6C ++:1073E00015F8082032492046C2F3C1027AE4314937 ++:1073F00008EB090321A8F5E521AC08EB09052E49A6 ++:107400006A782046FFF728FB2C49AA782046FFF728 ++:1074100023FB2B49EA78204664E42A4908EB090358 ++:1074200021A8DFE5284908EB090321A8DAE5C046D1 ++:10743000ECB60200ADB602009FB50200E3B1020057 ++:1074400022B402003DB40200D4B10200EDB2020049 ++:1074500049B30200F1B1020002B602001DB60200FB ++:10746000EEB302000FB40200F9B602001AB7020030 ++:1074700050B7020097B1020025B802003AB80200E6 ++:1074800058B802005DB4020004B80200B6B70200AA ++:10749000E4B3020068B102003DB40200B3B10200DF ++:1074A00047B7020091B7020075B20200F7B70200B9 ++:1074B000C1B7020010B8020068B40200A4B602000E ++:1074C0004AB4020046B502000AB3020009F1010401 ++:1074D00004EB08052846DBF33FF2002840F008845F ++:1074E00014F8083013F0010F40F00284284611A967 ++:1074F000DBF37AF00E9BB3F1FF3F40F0F98308EB2A ++:1075000009035A799B79F3E408EB09039A785C78CC ++:107510008C49120621A8FFF7E3BB08EB090421AD53 ++:10752000894962782846FFF797FA8849A278284661 ++:10753000FFF792FA2379E2788549284621E58549C3 ++:1075400008EB090321A84DE508EB0906B378747828 ++:1075500021AD04EB0324A4B2E20A7F492846FFF7D9 ++:107560007BFA7E49C4F302222846FFF775FA7C496C ++:10757000C4F3C4022846FFF76FFA7A49C4F3410204 ++:107580002846FFF769FA2846774904F00102FFF719 ++:1075900063FABBF1040F40F2AB833379F47873499B ++:1075A00004EB0324A4B2E20A2846FFF755FA704917 ++:1075B000C4F302222846FFF74FFA6E49C4F3C4020F ++:1075C0002846FFF749FA6C49C4F341022846FFF701 ++:1075D00043FA6A49284604F00102FFF783BB08EB2F ++:1075E000090621AF664972783846FFF735FA4FF041 ++:1075F000000A6449B2783846FFF72EFACDF800A0A9 ++:107600003279F378604903EB022301930222534657 ++:107610003846FFF721FACDF800A0B27973795A49BC ++:1076200003EB02230193022201233846FFF714FAE9 ++:10763000CDF800A0327AF379384603EB0223022218 ++:10764000019351491346FFF707FABBF11E0F40F2B1 ++:107650004F834E49727A3846FFF7FEF94C49B27AA9 ++:107660003846FFF7F9F94B49F27A3846FFF7F4F953 ++:107670004949327B3846FFF7EFF9CDF800A0B27BDD ++:10768000737B414903EB022301930522534638469D ++:10769000FFF7E2F9CDF800A0327CF37B3A4903EB27 ++:1076A00002230193052201233846FFF7D5F9CDF8CF ++:1076B00000A0B27C737C344903EB022301930522C2 ++:1076C00002233846FFF7C8F9CDF800A0CDF804A092 ++:1076D000327DF37C314903EB0223029305226C23B4 ++:1076E00001253846FFF7B8F90095CDF804A0B27D22 ++:1076F000737D2A4903EB0223029305226C2338464B ++:107700000224FFF7A9F90094CDF804A0327EF37D9E ++:10771000224903EB0223029305226C233846FFF72C ++:107720009BF9CDF800A0CDF804A0B27E737E384658 ++:1077300003EB02230293194905226823FFF78CF912 ++:107740000095DFE0D7B5020086B5020050B5020013 ++:1077500077B502002BB70200E7B7020093B2020030 ++:10776000A0B2020071B80200A4B1020046B6020045 ++:107770008EB80200C1B802008BB40200D8B7020074 ++:10778000E3B102005DB5020080B702002AB6020034 ++:107790002FB30200E4B5020048B202000FB40200A9 ++:1077A00008EB090621AFAF4972783846FFF754F964 ++:1077B0004FF0010AAC49B2783846FFF74DF9CDF8E1 ++:1077C00000A03279F378A94903EB02230193022246 ++:1077D00000233846FFF740F9CDF800A0B27973795D ++:1077E000A24903EB02230193022253463846FFF7D6 ++:1077F00033F9CDF800A0327AF379384603EB02234F ++:107800000222019399491346FFF726F9BBF11E0F97 ++:1078100040F26E829649727A3846FFF71DF9954913 ++:10782000B27A3846FFF718F99349F27A3846FFF7EB ++:1078300013F99249327B3846FFF70EF9CDF800A0D4 ++:10784000B27B737B894903EB02230193052200235A ++:107850003846FFF701F9CDF800A0327CF37B83496D ++:1078600003EB02230193052253463846FFF7F4F851 ++:10787000CDF800A0B27C737C7C4903EB022301931A ++:107880000522022300253846FFF7E6F80095CDF8DB ++:1078900004A0327DF37C7A4903EB02230293052294 ++:1078A0006C233846FFF7D8F8CDF800A0CDF804A037 ++:1078B000B27D737D724903EB0223029305226C2390 ++:1078C00038460224FFF7C8F80094CDF804A0327EB1 ++:1078D000F37D6B4903EB0223029305226C233846A8 ++:1078E000FFF7BAF80095CDF804A0B27E737E384653 ++:1078F00003EB02230293624905226823FFF7ACF8E9 ++:10790000CDF800A0CDF804A0327FF37E384603EB1B ++:1079100002230293052268235949FFF79DF800943A ++:10792000CDF804A0B27F737F384603EB02230293A5 ++:10793000534905226823FFF78FF8D9E108EB0904C2 ++:10794000A378627821AD02EB03224E492846FFF767 ++:1079500083F86279A379120402EB0362E378284684 ++:10796000D2182379484902EB0322FFF775F8BBF1DF ++:10797000120F40F2BD81627AA37A120402EB036215 ++:10798000E3794249D218237A284602EB0322FFF713 ++:1079900063F8627BA37B120402EB0362E37A28465E ++:1079A000D218237B3A4902EB0322FFF755F8627C99 ++:1079B000A37C120402EB0362E37BD218237CABE0CE ++:1079C000A278637821A803EB0223009331492B4668 ++:1079D0000222FFF741F801350234B5EB5B0FEFDD12 ++:1079E00086E1A278637821A803EB0223009329495A ++:1079F0002B460522FFF730F801350234B5EB5B0F5B ++:107A0000EFDD75E10095A278637821A803EB0223EE ++:107A10000193214905226C23FFF71EF8013502343A ++:107A20004FEA9B06B542EDDD002411E008EB5B0355 ++:107A30004B44009403EB44039A785B7821A803EB52 ++:107A400002230193144905226823FFF705F8013446 ++:107A5000B442EBDD4CE108EB09039C785A780F49FE ++:107A600021A824E1FCB202006AB5020080B702003E ++:107A700038B602003CB30200F3B5020057B2020070 ++:107A80000FB402004BB802009EB70200C9B5020055 ++:107A900066B2020030B2020056B60200ABB4020079 ++:107AA00008EB09039C785A78934921A8FFE008EB7A ++:107AB00009039C785A78914921A8F8E008EB09035A ++:107AC0009C785A788E4921A8F1E008EB0904E27805 ++:107AD0002379120402EB0362637821ADD218A378F4 ++:107AE000884902EB03222846FEF7B6FFE279237AA3 ++:107AF000120402EB036263792846D218A379824903 ++:107B000002EB0322FEF7A8FFE27A237B120402EBCA ++:107B10000362637AD218A37A7C492846FFF731BA08 ++:107B200008EB0904A378627821AD2846784902EB76 ++:107B30000322FEF791FFBBF1040F40F2D9802379B5 ++:107B4000E27874492846FFF71CBA08EB0904E2788A ++:107B50002379120402EB0362637821ADD218A37873 ++:107B600028466D4902EB0322FEF776FFBBF1060FB4 ++:107B700040F2BE80E279237A120402EB0362637959 ++:107B80006649D218A3792846FFF7FBB9644E09EB82 ++:107B900008040225AB45C0F2AB80E27823791204D9 ++:107BA00002EB036263783146D218A37821A802EB76 ++:107BB00003220435FEF750FF043418361A2DE9D19C ++:107BC00096E0584E09EB08040225AB45C0F29080C0 ++:107BD000E2782379120402EB036263783146D2180B ++:107BE000A37821A802EB03220435FEF735FF043405 ++:107BF00013360E2DE9D17BE04B4E09EB080402252C ++:107C0000AB4575DBE2782379120402EB03626378FB ++:107C10003146D218A37821A802EB03220435FEF7DF ++:107C20001BFF043414360E2DEAD161E03F4E09EB00 ++:107C300008040225AB455BDBE2782379120402EBF2 ++:107C4000036263783146D218A37821A802EB03229D ++:107C50000435FEF701FF043414360E2DEAD147E057 ++:107C6000334E09EB08040225AB4541DBE27823796A ++:107C7000120402EB036263783146D218A37821A87C ++:107C800002EB03220435FEF7E7FE043414360E2D12 ++:107C9000EAD12DE008EB09039C785A78254921A800 ++:107CA00005E008EB09039C785A78234921A802EBE8 ++:107CB0000422FFF717B808EB0901CB780A791B04F7 ++:107CC00003EB02634A788C789B181C4921A8012297 ++:107CD00003EB0423FEF7C0FE0AE0194908EB090391 ++:107CE00021A8FFF77FB901220B9201E0FF2E29D0D6 ++:107CF0000BEB0801FEF753BF19B802008BB102006D ++:107D00001DB60200C9B5020066B2020072B40200DC ++:107D10009BB80200AEB80200C0B60200D6B60200A0 ++:107D2000B6B4020064B30200B1B202009DB3020017 ++:107D300068B6020014B30200C0B102001AB7020014 ++:107D4000ACB502000D9B01330D930D9A079B9A422F ++:107D50007EF41DAF0E9AB2F1FF3F03D021A8174960 ++:107D6000FEF77AFE9DF8443023B121A8144911AAE8 ++:107D7000FEF772FE00201349DAF32AF638B90B9B9E ++:107D80002BB91A4621A81049FF33FEF765FE229A47 ++:107D9000002302F8013B2E9B0A9900930998069B49 ++:107DA0002292FEF7ABFE0A9904464FF480520998DE ++:107DB000DEF39EF7204625B0BDE8F08F82B80200C2 ++:107DC0002FB802000E5D860081B402002DE9F04F4D ++:107DD0009A468FB000230D936D4B06461C7889465A ++:107DE0000592002C40F0C180142208A82146DAF345 ++:107DF00027F17369232B05DC01224FF0040B069455 ++:107E0000079214E01C222346304621460094E3F3F7 ++:107E10003DF00028ACBF03230123ACBF00220122A8 ++:107E200007930692ACBF4FF00C0B4FF0020B30469D ++:107E3000E2F3E0F70128054602D0022806D013E05D ++:107E400030464946DAF330F040000CE03046FAF7AD ++:107E500047FF044640B1D9F3D5F710F4807F03D033 ++:107E60002046D9F3C5F70D900D99002900F08480C4 ++:107E70004846DEF32DF7044610B96FF01A0083E090 ++:107E8000012D0746DDF8348003D0022D0ED00025E9 ++:107E90001CE0002102900091CDF80480039130464F ++:107EA000059A4B46D9F3FAF705460DE00EAB4FEABB ++:107EB000580243F8042D304601212246D9F356F7E3 ++:107EC0000D9B05465B000D93002D45D123884FF691 ++:107ED000FD72013B9BB2934205D94846214642467A ++:107EE000DEF306F74AE0069B1BB104EB4B03089355 ++:107EF00015E0638804EB0B01227901EB132303EBFC ++:107F00000223A3F580530993E3880891CB18A3F5C6 ++:107F100080530A932389C918A1F580510B91DDB9CB ++:107F2000189A4846009208A9079A5346FEF708FE99 ++:107F300090B91849DAF320F538B1189B3046DAF8D1 ++:107F400000101A6800F024FB06E0189B3046DAF8AF ++:107F500000101A6800F004FB27B148463946424633 ++:107F6000DEF3C6F60A4B01221A700023189A18464F ++:107F7000CAF80030136007E00D468846064B00271C ++:107F8000089301230793CAE70FB0BDE8F08FC046FE ++:107F9000402700004EE7010019B2020013B5049C0F ++:107FA0009E4605994CB141B1002323600B600091BE ++:107FB00023467146FFF70AFF00E000201CBDC046C3 ++:107FC000094A13888B4201D1002206E093888B4234 ++:107FD00002D04FF0FF3005E00122034B03EB820398 ++:107FE00093F902007047C0461CB902002DE9F04128 ++:107FF000074614461E46002B7ED0E7F783FA054657 ++:1080000002E0B34205D00C35002D75D02B88002B33 ++:10801000F7D12B88002B6FD0D4F80036AA78C3F3A1 ++:108020008403934268D0D4F81836642023F0C073D8 ++:10803000C4F81836D4F81C3643F6A12623F0C073D2 ++:10804000C4F81C36DEF388F303E00A20DEF384F381 ++:108050000A3ED4F8E03113F4003F01D0092EF4D1E8 ++:108060000023C4F86036EA782B79D4F864161B062E ++:10807000120502F4700203F07063134321F07F6174 ++:108080000B43C4F864360223C4F86036D4F864366F ++:108090006A7923F0FE5323F4781343EA025343F43E ++:1080A0008023C4F864360323C4F86036D4F8642609 ++:1080B000AB6802F07F4223F07F431343C4F8643679 ++:1080C0003B6A012B05DDD4F8003643F48063C4F825 ++:1080D0000036AA782988D4F8000692004FF68373F8 ++:1080E0007F3102F07C0200EA0303C9111A4301390F ++:1080F00042EA0142C4F80026BDE8F081036A70B587 ++:10810000092B054601DC00242CE0E2F3B7F6002140 ++:1081100006462846E3F384F0D0F80836044613F404 ++:10812000807001D1044619E04FF00043C4F86C366A ++:108130004FF47A70DEF310F3D4F86C360022DB04CF ++:10814000DB0C5B03C4F86C2603F54243064A03F5D7 ++:10815000A873B3FBF2F3642203FB02F42846314612 ++:10816000E3F35EF0204670BDA086010070B50446C2 ++:10817000E2F384F6002105462046E3F351F0236A3A ++:10818000012B04D1D0F8003623F4007304E005DDA0 ++:10819000D0F8003643F40073C0F800362046294674 ++:1081A000E3F33EF070BDC0462DE9F04104461646AB ++:1081B0000D46E2F363F6002180462046E3F330F0FB ++:1081C0002946024633462046FFF710FF2046414627 ++:1081D000E3F326F0BDE8F0812DE9F043002485B0FB ++:1081E000074603940294E2F349F621468146384655 ++:1081F000E3F316F07B6A4E4A0546C3F3042605E016 ++:10820000137AC5F82036D368C5F82836494B083AA2 ++:108210009A42F5D14FF0000820E008216846464A0E ++:108220004346D9F351F700206946DAF3D1F398B108 ++:1082300000210A46DAF38CF23B6A0C2B08DDB0F51C ++:10824000803F05D200F0FF02C0F3072342EA03405B ++:10825000C5F82086C5F8280608F10108B045DCD12C ++:10826000364C28E0E36A13B13846984710B3002132 ++:108270001EE001238B40226A134218D0C5F8201655 ++:1082800094F924302BB1012B05D0B3F1FF3F07D077 ++:108290000DE0A36A09E0D5F82436A26A134304E08E ++:1082A000D5F82436A26A23EA0203C5F82436013140 ++:1082B000B142DED1103C224B9C42D3D1002614E0C7 ++:1082C000082168461F4A3346D9F3FEF60020694666 ++:1082D0006C46DAF37DF338B10021C5F820660A4612 ++:1082E000DAF336F2C5F8240601364645E8D103A98B ++:1082F00002AA3846DDF31CF5029B039941EA03020A ++:10830000D5F81C3642EA0303C5F81C360AB1C5F895 ++:108310001C2609B1C5F818164FF4FA600292DEF374 ++:108320001BF238464946E2F37BF705B0BDE8F0831F ++:1083300014B90200F4B8020051368600D4B8020025 ++:10834000A4B80200563686002DE9F04385B00546F4 ++:10835000E2F394F5002181462846E2F361F72B6AA7 ++:108360008046042B6B6A01DDDF0E01E0C3F3436737 ++:10837000002614E0102168460D4A3346D9F3A4F6CE ++:10838000002069466C46DAF323F338B100210A462F ++:10839000DAF3DEF1C8F85066C8F854060136BE427A ++:1083A000E8D128464946E2F33BF705B0BDE8F08343 ++:1083B0005B3686002DE9F043036A85B0042B436ADF ++:1083C0000546CCBFC3F38458C3F34358E2F356F5D4 ++:1083D000002181462846E2F323F70026074615E0F0 ++:1083E000102168460E4A3346D9F36EF600206946DE ++:1083F0006C46DAF3EDF238B100210A46DAF3A8F15F ++:10840000C7F85866C7F85C06731CDEB24645E7D16C ++:1084100028464946E2F304F705B0BDE8F083C046BC ++:1084200063368600F7B5053A06461F46062A2BD85E ++:10843000DFE802F00A0C12040E2A060005250CE003 ++:108440001125032402230AE0012502E0052500E0AE ++:1084500011250F24042302E000251F240323009389 ++:1084600000214FF4CB624FF0FF333046E2F30EF5BC ++:1084700004EA0703AB4030460093002140F25C62FF ++:1084800014FA05F3E2F302F5FEBDC0462DE9F04112 ++:1084900005460E4600201749DAF36EF2164984B2FB ++:1084A0000020DAF369F240F2DC51002C18BF2146BB ++:1084B000C7B22846FFF784FDC0B210F0800F0CD180 ++:1084C000C4B23146284607222346FFF7ABFF2846B1 ++:1084D000314608222346FFF7A5FF2FB12846314633 ++:1084E0003A460123E7F748F828463146FFF762FF8E ++:1084F000BDE8F0816F36860008F9010070B50546C9 ++:108500000C46FFF721FF002221462846DDF364F5E3 ++:108510002846E2F3B3F40A4904460020DAF32CF2C9 ++:108520004FF4002210F001034FF00001284618BF5D ++:108530001346DDF385F428462146E2F371F670BD5B ++:108540007836860070B5002105461020DDF35EF711 ++:10855000002110220446D9F373F52046656070BDF2 ++:1085600070B50C461546E2F3C5F51021DEF3B0F305 ++:1085700010B96FF01A0008E0044A10234360136832 ++:10858000C460036085601060002070BD6C2700002F ++:1085900070B515460C46E2F3ADF51021DEF398F305 ++:1085A000024610B96FF01A0010E01023436008492A ++:1085B000002303600B68C46085601BB9086018461F ++:1085C00004E0034618680028FBD11A6070BDC0465D ++:1085D0006C27000070B50C461546E2F38BF51021B0 ++:1085E000DEF376F310B96FF01A0008E0044A1023A6 ++:1085F00043601368C460036085601060002070BD34 ++:108600006C270000064B10B51B683BB9054B196879 ++:1086100021B1054B1A680AB1FFF7DCFF002010BD3D ++:108620006C270000FC1E0200001F020001207047A2 ++:108630000020704710B50020DAF39EF110BDC0464F ++:1086400010B50B490446FFF7F5FF80B278B9E06F2B ++:108650000749DAF391F180B248B9E06F0549DAF3DE ++:108660008BF14FF6FF7380B2002808BF184610BD8B ++:10867000483786004E37860041F2E44370B5C36246 ++:1086800004460D4629B108460949DAF375F1A0629E ++:1086900040B900200749DAF36FF1A06210B94FF634 ++:1086A000FF73A36228460449DAF366F1206370BDC4 ++:1086B000543786005B37860086378600836973B53A ++:1086C00013F0005F04466FD08268B2F5026F01D1EB ++:1086D00001220AE040F604039A4201D0002204E09D ++:1086E000C3680C2B94BF002201224FF00003D5B2C7 ++:1086F000ADF8063055B920464FF400612A46D4F84B ++:10870000C860E2F37BF500284ED005E0D4F8843051 ++:1087100013F5405048D000266369222B03DC002368 ++:10872000C0F8683100E00023C0F86431C0F860315F ++:108730006369222B03DC1F4BC0F8443105E00123A1 ++:10874000C0F84831FE33C0F84C316369222B07DC96 ++:108750000023C0F88031C0F87C31C0F8783104E0E3 ++:108760000023C0F87431C0F870311DB9204631467D ++:10877000E2F356F520460DF10601FFF759FF0546D5 ++:10878000A8B9BDF8063093B163690B49222B204686 ++:10879000D8BF4FF48021CCBF40224FF480222B461B ++:1087A000E2F38EF3284603E04FF0FF3000E00020B4 ++:1087B0007CBDC0460000FBBF400055552DE9F04789 ++:1087C000002104461F46DDF82080DDF82490E2F306 ++:1087D00027F505462046E2F363F360610A28C4BF2B ++:1087E000EB6A63646B68A3616369222BC4BFD5F82D ++:1087F000AC30E361A36913F0805F05D0D5F804368F ++:10880000636203F0FF0323624FF4E063A3604FF061 ++:10881000FF33E360254612330026236116E031461C ++:108820002046E2F3FDF42046E2F31CF32046E2F397 ++:1088300037F31FB1D5F810319F4203D0D5F88830F7 ++:10884000994501D1C8F8006001360435D4F8CC3020 ++:108850009E42E4D32046D8F80010E2F3E1F4012070 ++:10886000BDE8F08730B585B00190002504A840F838 ++:10887000045D01A90422D9F37FF3019CD4B12246FF ++:108880002946D2F8883013B10023C2F8883001316C ++:1088900004321029F5D10398D9F30CF30398E6F7C5 ++:1088A000B7FF054B9C4205D0606D21464FF45672D0 ++:1088B000DEF31EF205B030BD8C2802002DE9FF4723 ++:1088C0000C9E1446DDF834808A464FF4567200211F ++:1088D00005461F46DDF83890012E08BF0026D9F363 ++:1088E000AFF311232B61C5F88470C5F858806C650F ++:1088F0006E60002E40F0B98028463146524643460D ++:10890000FFF794FE002800F0B0804FF0C0542268BA ++:108910002846130F2B6013041B0CAB63C2F30343F5 ++:10892000C2F303522A640E3A012A8CBF00220122AC ++:10893000EB6385F8482021465246FDF739FFD5F80C ++:10894000CC30002B00F0918004AB43F8046D009311 ++:1089500028462146324633460197FFF72FFF00286D ++:1089600000F083802846FFF74DFE0F9A6B6D284676 ++:10897000019231463A46CDF80090FFF70FFB0028F0 ++:1089800073D1B9F1000F01D14E4601E0D9F8006072 ++:1089900028463146FFF770FE364B1C78002C30D14C ++:1089A0006B69132B0BDD4FF4006128462246E2F37E ++:1089B00025F48465C46503992846E2F331F428461A ++:1089C000696DFFF7D3FB2846696DFFF797FD3046C9 ++:1089D0002949D9F3D1F7024620B92846696DFFF736 ++:1089E0008DFB02462846696DFFF7DEFB2846696D60 ++:1089F000FFF7F2FB2846696DFFF748FD1D4B01228A ++:108A00001A706B690F2B0FDD1C493046D9F3B4F790 ++:108A10001B4B0021002808BF1846009088222846DA ++:108A20004FF0FF33E2F332F230461649D9F3D0F774 ++:108A300038B114493046D9F39FF701462846E7F785 ++:108A4000A5F86B69142B11DD00242146082223466A ++:108A500028460094E2F31AF2214640F0040308226B ++:108A600028460093E2F312F200E00025284604B005 ++:108A7000BDE8F087E42B0200E2388600EB38860080 ++:108A80005A000A00F13886001FB5104C864621783E ++:108A9000C9B90F4A0F4B002808BF024608BF03465A ++:108AA00000910191029303920B4844F210717246B7 ++:108AB0004FF0C053FFF702FF00B905E0074A20233B ++:108AC000136001232370044804B010BD88280200FD ++:108AD0000C290200082902008C28020074270000DB ++:108AE0002DE9FF4781460D4608464FF456719246E0 ++:108AF0001E460D9FDDF83880DEF3EAF0044610B321 ++:108B00000C9B494601932A46534600960297CDF89E ++:108B10000C80FFF7D3FE064638B9284621464FF4AD ++:108B20005672DEF3E5F030460EE00FB93B4600E04A ++:108B30003B68E367B8F1000F01D1434601E0D8F884 ++:108B40000030C4F88030204604B0BDE8F087C0464D ++:108B500070B5044628B30368124918682246FBF32F ++:108B6000F3F12546002610E0296A29B123689868A8 ++:108B7000E6F386F500232B62E96921B123682A8B8D ++:108B80005868DEF3B5F00136183561688E42EBDBCC ++:108B9000182201FB02F22368214658681032DEF3E6 ++:108BA000A7F070BD08FA01002DE9F043036885B015 ++:108BB00081467021D868DEF38BF0044608B906467A ++:108BC00048E0002170220646D9F33AF2042363609C ++:108BD00027464FF0B40325464FF00008C4F8009034 ++:108BE000A38112E0182208FB02F210322C61D9F89E ++:108BF00008001A49A2180023E6F35EF5286218352A ++:108C000008B905461CE008F1010863689845E9DBEE ++:108C1000134BD9F8000000930023019302930393B0 ++:108C20001049114A2346FBF357F113E0396A29B181 ++:108C300023689868E6F324F500233B620135183772 ++:108C400063689D42F2DB2368214658687022DEF398 ++:108C50004FF00026304605B0BDE8F0839DFE0000D1 ++:108C600021FD0000E4F9010009FA010010B50446F5 ++:108C700058B10368054918682246FBF365F123687B ++:108C8000214658685422DEF333F010BD2B7A86005B ++:108C900030B55421044685B04068DEF319F008B9B8 ++:108CA000054611E0002154220546D9F3C9F1084BCD ++:108CB0002C600093002301930293039320680549DD ++:108CC000054A2B46FBF308F1284605B030BDC046E7 ++:108CD000390301003CFA01002B7A8600002070471E ++:108CE00010B5044698B107F0ADDE09496068224628 ++:108CF000FBF32AF1E16E21B163683C22D868DDF311 ++:108D0000F7F763682146D8687022DDF3F1F710BDEC ++:108D1000D58D86007FB5054670214068DDF3D8F714 ++:108D2000064608B9044631E0002170220446D9F312 ++:108D300087F12B683560736068683C21DDF3C8F704 ++:108D4000E066F8B100213C22D9F37AF1114B1249C7 ++:108D50000093002301930293104B114A0393706810 ++:108D60003346FBF3B9F068B94FF001037382B38265 ++:108D700030462946FFF7B2FF002803DB304607F0F4 ++:108D80005DDF03E03046FFF7ABFF0024204604B070 ++:108D900070BDC046390B83006CFA0100290C8300BA ++:108DA000D58D860070B5D0F8305704466DB10749AF ++:108DB00022460068FBF3C8F0606829464FF40A6257 ++:108DC000DDF396F70023C4F8303770BD529E86005D ++:108DD0002DE9FF4106464FF40A614068DDF378F75C ++:108DE000074618B9C6F830070138E1E000214FF412 ++:108DF0000A62D9F325F107F120033B6033680822AA ++:108E000000247A613C61DC211A6630466A4A6B4B69 ++:108E10000094019601F092FFA042B86105DA304655 ++:108E2000FFF7C0FF6FF00100C2E0A6462546644B85 ++:108E300000221EF0010FEA501FD0624B19780D2955 ++:108E400002DD4FF4004C03E04A1C012303FA02FC4C ++:108E50005C4BD8780D2802DD4FF4004403E0421C3F ++:108E6000012313FA02F4012313FA00F28B401A4390 ++:108E700042EA0C02524B2243EA501EF0020F24D069 ++:108E80004F4B55F803804F4B58780D2802DD4FF4B7 ++:108E9000004C03E0421C012303FA02FC494B997881 ++:108EA0000D2902DD4FF4004403E04A1C012313FAAC ++:108EB00002F4012313FA01F283401A4342EA0C023E ++:108EC00022433F4B42EA0802EA501EF0040F24D02E ++:108ED0003B4B55F803803B4B18790D2802DD4FF4CE ++:108EE000004C03E0421C012303FA02FC354B597984 ++:108EF0000D2902DD4FF4004403E04A1C012313FA5C ++:108F000002F4012313FA01F283401A4342EA0C02ED ++:108F100022432B4B42EA0802EA501EF0080F24D0ED ++:108F2000274B55F80380274B98790D2802DD4FF425 ++:108F3000004C03E0421C012303FA02FC214BD979C7 ++:108F40000D2902DD4FF4004403E04A1C012313FA0B ++:108F500002F4012313FA01F283401A4342EA0C029D ++:108F60002243174B42EA0802EA500EF1010E043583 ++:108F7000BEF1100F7FF45BAF134B0025134C03932E ++:108F80002946134A33463068009501950295FAF355 ++:108F9000A3F7231D93E807006B4683E807003046DC ++:108FA00023680321324601F061DEC6F83077284697 ++:108FB00004B0BDE8F081C04601578300A15683008C ++:108FC0008427000090E085009D508300C8FA0100CE ++:108FD000529E86002DE9F041066805461B4930681F ++:108FE0002A46FAF3B1F72C460027D4F8081121B12C ++:108FF0007068B4F81021DDF37BF6D4F80C1121B1C0 ++:109000007068B4F81221DDF373F601374034042F91 ++:10901000EBD1D5F80C1221B17068B5F81022DDF350 ++:1090200067F6D5F81C1211B1B068E6F329F3D5F84C ++:10903000201219B170683A46DDF35AF67068294675 ++:109040004FF42372DDF354F6BDE8F081D8FA010045 ++:1090500010B50446E7F7F2FDA16961B1237D23B1A4 ++:10906000E068E6F3FBF200232375E068A169E6F30C ++:1090700007F30023A36123692146D8682C22DDF37E ++:1090800037F6002010BDC0462DE9F041074688465E ++:10909000C0682C2114461E46DDF31AF608B90546B1 ++:1090A00019E0054600212C22D8F3CAF7EC602046CF ++:1090B000EE61C5F808802F6108492A460023E6F3CF ++:1090C000FBF20446A86130B92B692946D8682C22E6 ++:1090D000DDF30EF625462846BDE8F0813D668400A6 ++:1090E00010B5034900220068FAF32EF7002010BDE6 ++:1090F00049C586001FB5094A0B460092002201921D ++:10910000029203920649074AFAF3E6F6002814BFD2 ++:109110004FF0FF30002005B000BDC0460968840054 ++:1091200048FB010049C586001FB5084A0346009266 ++:1091300000220192029203920549064A0068FAF35E ++:10914000CBF6003818BF012005B000BD7D18010026 ++:1091500020FC0100EFFB010010B5B0F8BC400C8012 ++:10916000B0F8C0101180B0F8C6201A8090F8C8205E ++:10917000029B01201A8010BD90F8D4007047C046B1 ++:10918000D0F8CC007047C04610B5014618B18068D1 ++:109190009822DDF3ADF510BD70B598210446006846 ++:1091A000DDF396F508B9054633E00021982205461F ++:1091B000D8F346F72368AB606368EB60A3682B6164 ++:1091C000E3686B6023696B61238CAB84638CEB84F5 ++:1091D000636AAB62A36AEB62E36A2B63236B6B6324 ++:1091E000636B6B64A36BAB64E36BEB64236C2B6509 ++:1091F000636C6B656369AB65A369EB650F232B66D5 ++:109200002D336B663C33AB660323EB66002385F896 ++:109210009430284670BDC04670B501210446E9F778 ++:1092200029FB2046E9F7B2FBC0F30F33A4F8C630A0 ++:10923000B4F8C620030F84F8C83042F2640300F08B ++:109240000F009A4284F8C90005D002339A4202D036 ++:109250004FF0FF3500E0002520460021EAF77AF8BC ++:10926000284670BD70B5044600282DD0D0F8E430F3 ++:109270005D1EC0F8E4503DBB41F2C826815921B1C2 ++:10928000C3691869F3F78EFFA55141F2DD13E55468 ++:109290002046E9F73FFFE1690A68A24203D1D4F80A ++:1092A000B4300B6005E0D2F8B430A34208BFC2F876 ++:1092B000B450E36E0BB120469847E36921469868A5 ++:1092C00041F26832DDF314F570BDC04670B5D0F8D8 ++:1092D000B8400E46E9B10846D8F342F70546C0B19A ++:1092E0000FE0204631462A46D8F32AF628B9635DB6 ++:1092F0003D2B02D1631C58190CE014F8013B002BE4 ++:10930000FBD114B12378002BEBD13046DEF3AEF461 ++:1093100000E0002070BDC0462DE9F34141F2383530 ++:10932000435B064688462BB30846D8F319F7044634 ++:109330001448D8F315F724181034F369A7B29868C5 ++:109340003946DDF3C5F4044608B9054617E0735BFA ++:109350000D4A009339464346D8F3B6F621463046C7 ++:10936000EBF79EF9F3690546214698683A46DDF326 ++:10937000BFF425B930464146EBF792F90546284639 ++:10938000BDE8FC8196FD01009CFD01002DE9F04F38 ++:1093900041F2383B85B0039330F80B3006468946DE ++:1093A0009246D0F8B880002B38D00846D8F3D8F6CB ++:1093B00004462448D8F3D4F62418F3691034A7B22D ++:1093C00098683946DDF384F4054608B9044634E06C ++:1093D00036F80B30394600931B4A4B46D8F374F6E7 ++:1093E00030462946EBF76AF9834668B1404629467C ++:1093F000D9F75CFA40B1504506DD40462946524651 ++:10940000D9F3C8F2044600E0039CF3692946986842 ++:109410003A46DDF36DF4BBF1000F0ED140464946EC ++:10942000D9F744FA40B1504506DD40464946524618 ++:10943000D9F3B0F2044600E0039C204605B0BDE835 ++:10944000F08FC04696FD01009CFD010070B590F8BC ++:10945000C43001229A401A49013A0446D5B2EBF7CA ++:1094600061F941F21202C0B2A0540138C0B2FD2825 ++:1094700001D97323A354A25C41F21303E2542046A2 ++:109480001049EBF74FF941F21402C0B2A05408B1F1 ++:109490000F2801D10523A35441F21203E25C0233E9 ++:1094A000E35CD21A41F21503E25400220133E25484 ++:1094B0000233E25445EA0512013BE25470BDC04656 ++:1094C00075B902004FB902002DE9F84F8846002116 ++:1094D000846807469246C0680A469B46E1F3BAF4A0 ++:1094E00010F0080F814615D03E689EB130465146B7 ++:1094F00000F084FA002800F07481F369D6F8CC10EB ++:10950000186927F0CDD8D6F8E43030460133C6F8D4 ++:10951000E4306DE1204641F26831DDF3D9F30546D0 ++:10952000002800F05C81002141F268320646D8F341 ++:1095300087F5012105F59053303341F2D41285F8B7 ++:10954000E110AB50FA6C41F26B039A42C5F8B0805F ++:10955000EF6105D17B6C932B02D1A5F8221603E0B5 ++:109560004FF01802A5F822266423002185F8E03088 ++:1095700041F218230422E9540133EA540133E95437 ++:109580000133BAF1020FC5F8B8B0EA5406D119F0A8 ++:10959000010F1CBF4FF40053C5F8CC30EB69D5F870 ++:1095A000CC10186927F07CD8D5F8B030B3F8E03388 ++:1095B0009CB2EB69D868E6F787F941F23833E85294 ++:1095C000C4F30323C5F8BC3004F00F03C5F8C03062 ++:1095D000EB699A6A874BD318012B06D94AF6E60342 ++:1095E0009A4202D0043B9A4207D1EB69DB6A023B04 ++:1095F000012B02D80923C5F8C030D5F8BC30092B9F ++:1096000007D10423C5F8BC30D5F8C0301033C5F8F5 ++:10961000C030012385F8C430230BC5F8D030D5F80D ++:10962000BC30022B0CD9042B0AD0052B08D0062BFA ++:1096300006D0082B04D00A2B02D0072B40F0D18093 ++:109640003C23C5F8F43F0023C5F8F83F4FF400630E ++:10965000A5F8DE3042F6013241F62433BAF1020FAA ++:1096600008BF1346A5F8DA3095F8DA30284685F8B1 ++:1096700000376149EBF722F890B15F492846EC6961 ++:10968000EBF750F85C4920672846EC69EBF74AF89D ++:10969000EA69BAF1020F60670CBF136F536FD366AC ++:1096A0000A2241F2E613EA5403210133E95401236B ++:1096B000002485F8E83005F59053013A1C7041F21A ++:1096C0001B03EA54EB6985F8E94585F8EE4585F812 ++:1096D000F34585F8F84585F8FD45284683F893104D ++:1096E000FFF7B4FE41F21903EC544FF6CE7241F28B ++:1096F000C423EA5285F8F440621901347F23652CB3 ++:1097000082F82C3682F8913682F8B232F4D14FF0DA ++:10971000FF33A5F8FA36002385F8AC3028465146C9 ++:1097200001F03AF900285CD02846E9F797F8284676 ++:10973000FFF772FD0446002853D13049062228461F ++:10974000EAF7E4FF41F2E623E8542D4901222846D6 ++:10975000EAF7DCFF41F2F423E8542A49224628467E ++:10976000EAF7D4FF41F23A33E85427492846072262 ++:10977000EAF7CCFF41F23B33E8542246284623491E ++:10978000EAF7BEFF631903F5985301343833182CF8 ++:109790001871F2D10024224628461D49EAF7B0FF8D ++:1097A000631903F59A53013410330E2C1871F2D15A ++:1097B000D5F8E430EA690133C5F8E4301368D068BD ++:1097C000C5F8B4303D60FEF779FF05F1B803C5F880 ++:1097D000B830284605F1BC011C22D8F3CDF3284649 ++:1097E00006E0B868314641F26832DDF381F20020CC ++:1097F000BDE8F88F1D57FFFF80B9020024B90200B1 ++:1098000043B9020036B9020060B902006EB9020025 ++:109810002FB9020010B502490268FAF395F310BDA2 ++:10982000040402001FB5094B09490093002301936A ++:1098300002930393074A0368FAF34EF3002814BF18 ++:109840004FF0FF30002005B000BDC0463147010099 ++:1098500044030200040402002DE9F0410025804683 ++:109860000F4616462C4607E004EB0800E1190522D6 ++:10987000D8F382F301350534B542F5D1BDE8F08166 ++:10988000022970B505460C460AD0032911D00129DA ++:1098900016D106220B49E8F793FFEA69002305E099 ++:1098A00006220949E8F78CFFEA69012382F8813032 ++:1098B00006E006490622E8F783FFEB6983F881405A ++:1098C00070BDC046200B02002C0B0200380B0200BA ++:1098D00070B5D0F8A840002394F8C113C4F87435CB ++:1098E0000F4A104B022914BF15461D46C3694FF499 ++:1098F00020719868DDF3ECF1C4F8740578B180222A ++:109900002946FFF7A9FF94F83A35022B06D1D4F87F ++:1099100074050549A0301522FFF79EFF012070BD98 ++:1099200084C90200A8C4020048CC02002DE9F04717 ++:10993000D0F8A8308146D3F87C55D3F878A54FF0FD ++:10994000000817E0142403FB04F42B191A695B6860 ++:109950002F5903FB02F3DE08D9F81C303146986812 ++:10996000DDF3B6F108F10108285140B1394632461D ++:10997000D8F302F35FFA88F35345E3D30120BDE83F ++:10998000F087C0462DE9F041194BD0F8A8501A686D ++:10999000C369002614210746C5F87C65C5F87825FB ++:1099A000986802FB01F1DDF393F10446C5F87C05EC ++:1099B000E0B1B0460FE0FB6906EB04001B6D08F157 ++:1099C000010813F4805F14BF0A490B49142271186F ++:1099D000D8F3D2F21436D5F878359845EBD338461B ++:1099E0000121FFF7A3FF003818BF0120BDE8F08177 ++:1099F000A01A0200C4C2020084D102002DE9F04185 ++:109A0000884686B07A490546D0F8A860EAF78AFE0B ++:109A1000784930722846EAF785FE77497072284601 ++:109A2000EAF780FE7549A5F8FC002846EAF77AFEB9 ++:109A30007349A5F8FE002846EAF774FE7149A5F8B7 ++:109A400000012846EAF73AFE38B128466D49EAF7A0 ++:109A500069FE10B1012386F8E83396F8E8330BB3BA ++:109A600068492846EAF75EFE6749A5F802012846DC ++:109A7000EAF758FE6549A5F804012846EAF752FEC0 ++:109A80006349A5F806012846EAF74CFE614986F8C5 ++:109A900024052846EAF746FE002241F21B0386F819 ++:109AA0002505EA545C492846EAF73CFE5B49C6F8BE ++:109AB000340414222846EAF729FE5949A6F83C0442 ++:109AC0005A222846EAF722FE564986F8540408220C ++:109AD0002846EAF71BFE544986F84C040322284620 ++:109AE000EAF714FE514986F84D0408222846EAF7A1 ++:109AF0000DFE4F4986F84E0403222846EAF706FE7B ++:109B00004C4986F84F0408222846EAF7FFFD4A49E7 ++:109B100086F8500403222846EAF7F8FD474986F8FC ++:109B2000510408222846EAF7F1FD032286F8520480 ++:109B300043492846EAF7EAFD424986F85304284695 ++:109B4000EAF7F0FD404986F8580402222846EAF771 ++:109B5000DDFD3E4986F8C1042846EAF7AFFD28B18D ++:109B600028463A49EAF7DEFDF07400E0F074284632 ++:109B70003749EAF7A3FD28B128463549EAF7D2FD6F ++:109B8000307501E00823337528463249EAF796FD1F ++:109B900028B128462F49EAF7C5FD707501E0022378 ++:109BA000737528462C49EAF789FD28B128462A49C9 ++:109BB000EAF7B8FDB07501E00423B37528462749DC ++:109BC000EAF77CFD28B128462449EAF7ABFDF07599 ++:109BD00001E00823F37528462149EAF76FFD0028C4 ++:109BE00040D028461E49EAF79DFD30763CE0C0464D ++:109BF00045C10200E3C002002ABE020030BE0200DE ++:109C000036BE0200C3C00200E2BD0200CDBC0200AD ++:109C1000D5BA0200EABA02009AC202006BBD020085 ++:109C2000A6C102001DC202007EBF0200EBC10200FD ++:109C3000ABB90200FCC10200BCB90200DAC10200EB ++:109C4000B3C202009ABC02000BBB02001ABC0200A5 ++:109C500007BC020065C0020015C202000DC202006E ++:109C60003DC1020002233376B7492846EAF75AFD80 ++:109C7000B649B0722846EAF755FDB549F072284654 ++:109C8000EAF750FDB17AF27AC3B230737173B273EE ++:109C9000F37331747274B374AE492846EAF742FD27 ++:109CA000B5F8FC2041F21A33EA5205F599531A80AF ++:109CB000B5F8FE2041F21C33EA520633EA52B5F8F9 ++:109CC0000021043BC7B2EA52063385F81A71EA5202 ++:109CD0002846A149EAF726FD002480B22A1900F09F ++:109CE0000F030134A7EB43030009042C82F81E3153 ++:109CF000F4D128469949EAF715FD2A1900F00F0317 ++:109D00000134A7EB430300090C2C82F81E31F4D177 ++:109D100093492846EAF706FD924904462846EAF7A1 ++:109D200001FD80B240EA0441716014202A1801F05C ++:109D30000F030130A7EB430309091C2882F81631F1 ++:109D4000F4D189492846EAF7EDFC88497083284612 ++:109D5000EAF7E8FC864930772846EAF7E3FC8549CC ++:109D600070772846EAF7DEFC8349B0772846EAF7A1 ++:109D7000D9FC8249F0772846EAF7D4FC804986F876 ++:109D800022002846EAF7CEFC7E4986F821002846C4 ++:109D9000EAF7C8FC7C4986F8E0042846EAF7C2FCEA ++:109DA0000127C6F8E40401AC784920463A46D8F3C6 ++:109DB0009BF1D5F8B8002146D8F30AF630B100215E ++:109DC0000A46D8F3C5F4F31983F8E70401370F2FD7 ++:109DD000E9D16F492846EAF7A5FC6E4986F8F604F2 ++:109DE0002846EAF79FFC6C4986F8F7042846EAF70C ++:109DF00099FC6A4986F8F8042846EAF793FC684912 ++:109E000086F8F9042846EAF78DFC664986F8FA04D4 ++:109E10002846EAF787FC644986F8FB042846EAF7F7 ++:109E200081FC624986F8FC042846EAF77BFC60491D ++:109E300086F8FD042846EAF775FC5E4986F8FE04BC ++:109E40002846EAF76FFC5C4986F8FF042846EAF7E3 ++:109E500069FC5A4986F800052846EAF763FC584928 ++:109E600086F801052846EAF75DFC564986F80205A2 ++:109E70002846EAF757FC544986F803052846EAF7CE ++:109E800051FC524986F804052846EAF74BFC504934 ++:109E900086F805052846EAF745FC4E4986F806058A ++:109EA0002846EAF73FFC4C4986F807052846EAF7BA ++:109EB00039FC4A4986F808052846EAF733FC484940 ++:109EC00086F809052846EAF72DFC464986F80A0572 ++:109ED0002846EAF727FC444986F80B052846EAF7A6 ++:109EE00021FC424986F80C052846EAF71BFC40494C ++:109EF00086F80D052846EAF715FC3E49A6F8140534 ++:109F00002846EAF70FFC4FF00042A6F816053A493A ++:109F10002846EAF7FBFB3949C6F810052846EAF758 ++:109F200001FC374986F824002846EAF7FBFB35494F ++:109F300086F823002846EAF7F5FB334986F8200027 ++:109F40002846EAF7EFFB61E0E7B902000CBF020028 ++:109F5000C5BD0200F2BD020077BD020044BC020094 ++:109F600096B902008DB902008DBE0200DDB9020073 ++:109F7000F6BF020001C00200CDB90200B2BC02006F ++:109F8000E3BC0200B9BE0200FFBE020033BC020007 ++:109F90003CBE02008CBF02009DBF0200B7BF0200A2 ++:109FA000FEC002000FC102002BC202004CC2020020 ++:109FB0006FBE02009ABE0200C7BE020020C10200AE ++:109FC0000CC0020056C1020068C102007AC1020042 ++:109FD0006DC202007FC2020031BA02005BBA020009 ++:109FE00074BB02009DBB020088BC0200A9BA02003B ++:109FF000FCBA020034BD020059BB0200B1C102002C ++:10A00000BDC102005DC2020046C00200B94985F828 ++:10A0100026062846EAF786FBB74986F8C103284694 ++:10A02000EAF780FBB54986F8C2032846EAF77AFBCF ++:10A0300086F8C30395F8261611B12846FFF720FCD1 ++:10A040004FF0FF32AE492846EAF760FB80B210F4C9 ++:10A05000004F18BF4FF0FF324FF0FF33A6F86200F9 ++:10A06000A6F8663018BFA6F86220A6F86830284621 ++:10A07000A449EAF723FB58B12846A249EAF752FB64 ++:10A0800080B210F4004F04BFA6F86600A6F868007E ++:10A0900028469D49EAF712FB48B128469A49EAF753 ++:10A0A00041FB80B210F4004F08BFA6F866002846B6 ++:10A0B0009649EAF703FB48B128469449EAF732FB90 ++:10A0C00080B210F4004F08BFA6F8680090494FF026 ++:10A0D000FF322846EAF71AFB4FF0FF32A6F8C40316 ++:10A0E0008C492846EAF712FB8B49A6F8C603284696 ++:10A0F000EAF718FB8949A6F8C8034FF4CF7228463F ++:10A10000EAF704FB8649C6F8CC0347F69A6228466C ++:10A11000EAF7FCFA8349C6F8D0030A222846EAF790 ++:10A12000F5FA8149C6F8D40308222846EAF7EEFA80 ++:10A130007E49C6F8D80341F26E022846EAF7E6FAED ++:10A140000A22C6F8DC037A492846EAF7DFFA794999 ++:10A15000C6F8E0032846EAF7E5FA7749A6F8E403EB ++:10A160002846EAF7DFFA96F8E83380B2A6F8E60365 ++:10A170002BB103B2002BC4BF0022A6F8E623502265 ++:10A180006E492846EAF7C2FA6D4986F8EA0328467E ++:10A19000EAF7C8FA6B4986F8EC032846EAF7C2FAF0 ++:10A1A000694986F8ED032846EAF7BCFA674986F85C ++:10A1B000EE034FF0FF322846EAF7A8FA644986F822 ++:10A1C000F0034FF0FF322846EAF7A0FA4FF0FF34D1 ++:10A1D00086F8F1035F49224686F8EF432846EAF7FE ++:10A1E00095FA5D4986F8F20322462846EAF78EFA88 ++:10A1F0005A4986F8590522462846EAF787FA584907 ++:10A2000086F85A0522462846EAF780FA554986F824 ++:10A21000F30322462846EAF779FA534986F85B05A4 ++:10A2200022462846EAF772FA504986F85C0522462B ++:10A230002846EAF76BFA4E4986F8F4032246284688 ++:10A24000EAF764FA4B4985F8DA0522462846EAF728 ++:10A250005DFA4949A6F8F60322462846EAF756FA77 ++:10A260004649A6F8F80322462846EAF74FFA444939 ++:10A27000A6F8FA0322462846EAF748FA4149A6F822 ++:10A28000FC0322462846EAF741FA3F49A6F8FE03B6 ++:10A2900022462846EAF73AFA3C49A6F80004224644 ++:10A2A0002846EAF733FA3A49A6F802042246284635 ++:10A2B000EAF72CFA0022A6F8040436492846EAF701 ++:10A2C00025FA0022A6F85E0533492846EAF71EFA69 ++:10A2D0000022A6F8600531492846EAF717FA00225D ++:10A2E000A6F862052E492846EAF710FA2D49A6F885 ++:10A2F000640559E04FBA020043BA0200A7C0020049 ++:10A300008DBD02004BC0020094C10200C0BB020020 ++:10A31000D2BB020067BF020035BB02005BC0020077 ++:10A32000A0BA0200BEBD0200D9BB02004DC10200AE ++:10A33000EBBD02009AC002007FBD0200BCBC02005F ++:10A34000AEBF020010BA0200DCBF020095BA0200E4 ++:10A3500002BD020032C1020039C0020090BB0200FF ++:10A36000A6BC02003EBB0200BBBA0200F0BB02006A ++:10A37000EBBE02001FBE0200C9BA02006DC002009F ++:10A38000B3BD02004CBB0200F4BC020016BF0200C9 ++:10A390005CBC02007AC002006EBF020059BF02001E ++:10A3A000D3C00200C6BC02002846EAF7BBF9B8F1E8 ++:10A3B000020F86F8060414D12846A449EAF77EF96C ++:10A3C000002800F0A382344600273A4628469F49D9 ++:10A3D000EAF796F90137C4F80C040434052FF4D1D8 ++:10A3E00016E0B8F1010F13D128469949EAF766F94A ++:10A3F000002800F08B82344600273A4628469449CC ++:10A40000EAF77EF90137C4F820040434052FF4D1AB ++:10A4100090494FF0FF322846EAF778F98E49A6F8BE ++:10A420003E044FF0FF322846EAF770F98B49A6F850 ++:10A4300040044FF0FF322846EAF768F98849A5F84A ++:10A44000DE0F2846EAF73AF930B128468449EAF7A0 ++:10A4500069F941F2EA23E852824928464FF0FF3277 ++:10A46000EAF754F941F23433E8527F492846EAF7D3 ++:10A4700025F930B128467C49EAF754F941F2EE2338 ++:10A48000E852284679490022EAF740F9C0B286F836 ++:10A490004D0358B176492846EAF744F97549C6F89C ++:10A4A00050032846EAF73EF9C6F860032846724989 ++:10A4B000EAF704F928B3D5F8B8006F49D8F7F6F9E8 ++:10A4C00006281ED1344600273A466B49D5F8B80015 ++:10A4D000D8F360F284F895037A1C6749D5F8B80080 ++:10A4E000D8F358F284F89703BA1CD5F8B80062493B ++:10A4F000D8F350F2033784F899030134062FE3D1DF ++:10A5000011E0012386F89533313386F896330E3304 ++:10A5100086F8973386F89833042386F899334FF0FA ++:10A52000FF3386F89A3355492846FF22EAF7EEF8BA ++:10A530004FF0FF03A6F85403A6F85633A6F8583395 ++:10A54000A6F85A3328464E49EAF7B8F828B3D5F8A2 ++:10A55000B8004B49D8F7AAF934460328B4BF80465F ++:10A560004FF00308002707E03A4628464449EAF737 ++:10A57000C7F80137A4F8540302344745F4DB06EB6F ++:10A58000470303F55473063304E0B6F85623013746 ++:10A5900023F8022C0233022FF7DD01223949284625 ++:10A5A000EAF7B4F8384986F840032846EAF7BAF8DB ++:10A5B000012286F84B0335492846EAF7A7F83449C3 ++:10A5C00086F841032846EAF7ADF8324986F84C038D ++:10A5D0004FF0FF322846EAF799F82F4986F84903E9 ++:10A5E0004FF0FF322846EAF791F82C4986F84A03E3 ++:10A5F0004FF0FF322846EAF789F8294986F85C03CC ++:10A600004FF0FF322846EAF781F8264986F85D03C5 ++:10A610002846EAF753F8002846D0012421490022B1 ++:10A6200086F8BB442846EAF76BF81E4986F8BC0456 ++:10A6300022462846EAF764F81A4986F8BD04022241 ++:10A640002846EAF75DF886F8BE042FE0E3BB020077 ++:10A65000EFBA02001ABD0200CCC002000CBE02001C ++:10A660000EBD02003CC202001EC0020066BB02001A ++:10A67000C8BF020050BD0200AFBB020037BF0200DE ++:10A68000A3C20200EAC002006ABC020016BB0200BC ++:10A6900022BF020079BA0200FBBD0200E5BF020042 ++:10A6A0004DBE020091C2020086F8BB04FF22994908 ++:10A6B0002846EAF72BF8FF2286F8BF049649284679 ++:10A6C000EAF724F8954986F8C0042846EAF72AF8FC ++:10A6D0000022A6F8C20492492846EAF717F8002299 ++:10A6E00086F818058F492846EAF710F8C0B286F8B0 ++:10A6F0001A05EB69DB685B6C03F00703052B03D9D4 ++:10A7000010B1002386F81A35874900222846E9F758 ++:10A71000FDFF864986F81C0500222846E9F7F6FF6A ++:10A72000834986F81D054FF0FF322846E9F7EEFF12 ++:10A73000804986F81E0500222846E9F7E7FF7E4992 ++:10A7400086F895054FF0FF322846E9F7DFFF7B4991 ++:10A75000A6F8200501222846E9F7D8FF784986F8AF ++:10A7600027054FF0FF322846E9F7D0FF7549A6F8D4 ++:10A770002A054FF0FF322846E9F7C8FF7249A6F8CC ++:10A780002C0500222846E9F7C1FF704986F83A05F2 ++:10A7900000222846E9F7BAFF6D4986F83B054FF0DD ++:10A7A000FF322846E9F7B2FF6A4986F83C05284699 ++:10A7B000E9F784FF30B128466649E9F7B3FF86F828 ++:10A7C000420503E04FF0FF3386F8423528466249E0 ++:10A7D000E9F774FF30B128465F49E9F7A3FFA6F80F ++:10A7E000440503E04FF0FF33A6F844355B492846A3 ++:10A7F0004FF0FF32E9F78AFF5949A6F8900528463D ++:10A80000E9F75CFF30B301245549002286F8524530 ++:10A810002846E9F775FF524986F85305224628462F ++:10A82000E9F76EFF4E4986F8540502222846E9F7FB ++:10A8300067FF4B4986F8550503222846E9F760FF74 ++:10A84000474986F8560504222846E9F759FF86F855 ++:10A85000570501E086F8520542494FF0FF3228467D ++:10A86000E9F754FF404986F858054FF0FF32284673 ++:10A87000E9F74CFF3D4986F859054FF0FF3228466D ++:10A88000E9F744FF3A4986F85A0500222846E9F7D5 ++:10A890003DFF384986F8700500222846E9F736FF63 ++:10A8A000032286F8800534492846E9F72FFF33490B ++:10A8B00086F881052846E9F735FF314986F8820593 ++:10A8C0002846E9F72FFF2F49A6F884052846E9F71F ++:10A8D00029FF2D49A6F886052846E9F723FF2B49CD ++:10A8E000A6F888052846E9F71DFF2949A6F88A0534 ++:10A8F0002846E9F717FF2749C6F88C0500222846A5 ++:10A90000E9F704FF86F89405012000E0002006B076 ++:10A91000BDE8F08145C102008CC10200DABA020034 ++:10A920001DBA0200CFBD02005EBE0200B2C002002E ++:10A93000ACBE020003BA0200FABB0200F1B9020089 ++:10A940002ABB020081BE020086BB02009FB9020042 ++:10A950009CBD0200D6BC02006DBA02000FBC020012 ++:10A960008ABA0200A6BD020039C0020090BB0200F4 ++:10A9700043BD02004DBC020022BC02007FBC0200AD ++:10A9800028C0020088C00200D9BE020047BF0200F2 ++:10A9900022BD0200CBC10200C36970B504460E4659 ++:10A9A00098684FF4B961DCF393F1C4F8A80000286B ++:10A9B0005CD000214FF4B962D7F342F3E369D4F8D5 ++:10A9C000A8501B6D13F4803F05D1012241F22403EE ++:10A9D00084F81A26E254E369D868E4F7B5FF41F237 ++:10A9E0000803E0500023EB63214B20462362214BF8 ++:10A9F00031466362204BA362204BE362204BA36786 ++:10AA0000204BE367204BC4F89030204BC4F88430CF ++:10AA10001F4B23631F4B63631F4BE3631F4B636435 ++:10AA20001F4B63651F4BA3651F4BC4F88C301F4B36 ++:10AA3000C4F888301E4BE3661E4BC4F89C301E4B96 ++:10AA4000C4F8A0301D4BC4F8A430FEF7D7FF68B19E ++:10AA50002046EBF757FD2046FEF73AFF30B120467F ++:10AA6000FEF790FF003818BF012000E0002070BD05 ++:10AA7000A9D00100E54A010091CD010055A20100D5 ++:10AA8000B9A001001D4F010075A901005DA90100D9 ++:10AA9000CD9B0100BD8701003D9C0100FD840100AC ++:10AAA0009D550100A15701007DCC0100C54B01005F ++:10AAB000B1530100198801001582010045CC010045 ++:10AAC00010B5014620B103680C221868DCF310F1C0 ++:10AAD00010BDC0462DE9F04105460F4600680C2127 ++:10AAE0001646DCF3F5F008B9044607E004460021F9 ++:10AAF0000C22D7F3A5F225606660A7602046BDE86A ++:10AB0000F081C04610B5044650B10649224640685F ++:10AB1000F9F31AF263682146D8688822DCF3E8F07A ++:10AB200010BDC04603E88600F0B5882185B0054613 ++:10AB30004068DCF3CDF0074608B904463BE000214D ++:10AB400088220446D7F37CF22B683D607B600026A8 ++:10AB500004212846194A1A4B0096019700F0EEF896 ++:10AB6000B042B86021DB174B019600930296039622 ++:10AB700078681549154A3B46F9F3AEF1A8B91E238A ++:10AB80007B610423FB7302233B74083301227B7433 ++:10AB90004FF6AF7384F82000FA773A73BA61A07465 ++:10ABA0006073A073BB83BA7705E068683946882272 ++:10ABB000DCF39EF00024204605B0F0BD5123850053 ++:10ABC00025238500811485002C1D020003E88600E2 ++:10ABD00070B50468CCB1D4F8F811A56829B1A8689B ++:10ABE000E4F34EF50023C4F8F831084928682246FA ++:10ABF000F9F3AAF1216819B168681C22DCF378F036 ++:10AC0000686821466269DCF373F070BD441D020080 ++:10AC10002DE9FF4740F2C45681468A461046314628 ++:10AC200017469846DCF354F00446002879D00021FA ++:10AC30003246D7F305F238461C21DCF349F00546CD ++:10AC4000206030B9384621463246DCF351F02846C0 ++:10AC500067E000211C22D7F3F3F122684FF0FF33A5 ++:10AC6000A36100254FF014036661C4F80890E76003 ++:10AC7000C4F804809571A4F808324FF02803A4F8B2 ++:10AC800006324FF02D03A4F804324FF0FA03A4F873 ++:10AC90000A320223146084F80C324FF06403A4F8E3 ++:10ACA0003E3284F80D5250461F4922462B46E4F3AB ++:10ACB00003F5C4F8F80108B30523C4F81C32373390 ++:10ACC000C4F8283204F51072184BC4F81822C4F8DE ++:10ACD000142204F53D72C4F82422C4F82022009303 ++:10ACE000134BD9F8000003931249134A23460195E8 ++:10ACF0000295F9F3F1F008B9206812E0D4F8F811E0 ++:10AD000011B15046E4F3BCF4216819B138461C2255 ++:10AD1000DBF3EEF73846214640F2C452DBF3E8F7A6 ++:10AD2000002004B0BDE8F087C13C8500F537850000 ++:10AD300035D201004C1D0200441D020070B5D0F850 ++:10AD400000451E46A3698E460F2B154602D94FF0CB ++:10AD5000FF3011E01801E1690133A361049B42183F ++:10AD60009360059B5660D36062694550D31C734461 ++:10AD700023F003036361104670BDC04610B5014661 ++:10AD800040B190F820200368D200D86802F5927292 ++:10AD9000DBF3AEF710BDC046C36908221B692DE97D ++:10ADA000F041073393FBF2F3DFB2FB0003F5927639 ++:10ADB00005463146C068DBF38BF708B9044614E05A ++:10ADC000044632460021D7F33BF104F12403E3614A ++:10ADD000FAB204F59273E36003EB820323614FF44C ++:10ADE0000373256084F8207063612046BDE8F0811C ++:10ADF0007047C0462DE9F04F3B4F89B038683B495A ++:10AE0000D7F3BAF50128DFF81881DFF8189157D089 ++:10AE1000DFF800C1364EDCF8001000220091354901 ++:10AE200013680968344D354C0291316834480193F8 ++:10AE300004912B68216803930691036831490593B7 ++:10AE40000B68DFF8D4E007932A4B02602E481A60A3 ++:10AE50000A602E4B08F10401D7F800A0DEF800B01C ++:10AE60003A60CEF80020CCF8002032602260091A47 ++:10AE7000013A2B60D7F3D4F5254B9842FCD11A4BFD ++:10AE80000099C3F800A0234B1960234B0021C3F89D ++:10AE900000B00A68214B1A60019A164B0A600299A9 ++:10AEA000039A1960144B04991A60114B059A1960A2 ++:10AEB000134B06991A60114B079A1960114B1A60CF ++:10AEC00098F81B3089F8003098F81C3089F8013068 ++:10AED00098F81D3089F8023098F81E3089F8033050 ++:10AEE00009B0BDE8F08FC046FC1E0200B81D02008C ++:10AEF00044EC000048EC000034EC000050EC000092 ++:10AF00004CEC000054EC000000000000DDBAADBBCA ++:10AF1000E320BBDE001F0200F81E020038EC000038 ++:10AF2000005903001C2802002DE9F04F91B0FFF7F3 ++:10AF300061FF684B1B68043B012B03D8664B186804 ++:10AF4000FFF756FFFBF7BEF800210746E0F3AEF12E ++:10AF500038460021E0F364F128B1036A002BBCBF3E ++:10AF60004FF0004303620EA90822B86BD7F3F6F244 ++:10AF7000FA6B0B9038460C92E4F7E6FC574E00F55E ++:10AF8000424000F5A870B0FBF6F00D903846E4F7AB ++:10AF9000DBFC04463846E4F7D7FC00F54248384667 ++:10AFA000E4F7DCFC00F5424A3846E4F7D7FC04F548 ++:10AFB000424408F5A87804F5A874B8FBF6F808FB35 ++:10AFC000164804463846E4F7C9FC00F542453846C1 ++:10AFD000E4F708FA00F542493846E4F703FA04F5C5 ++:10AFE000424405F5A87504F5A874B5FBF6F505FB14 ++:10AFF000164504463846E4F7F5F9394A00F542406B ++:10B00000019204F542440B9A00F5A870B0FBF6F0EB ++:10B010000AF5A87A09F5A87904F5A874BAFBF6FA36 ++:10B02000B9FBF6F9029200FB16460C9ADFF8D4B091 ++:10B0300003920D9A2B4B04922B492C4AB8FBFBF838 ++:10B04000B5FBFBF5B6FBFBF629480093CDF8148061 ++:10B05000CDF818A00795CDF820900996E6F724FBC7 ++:10B06000244840F60D0144F2F432FAF7AFFF48B13C ++:10B07000204840F6290144F2F432FAF7A7FF08B15C ++:10B08000002403E01C4A1D4B1A4C1A603846FDF799 ++:10B09000D7FA44F218334FF6FF72904214BF0246BB ++:10B0A0001A4640F612011648FAF790FF144B002892 ++:10B0B0000CBF194600214CB141B1104B20461B6812 ++:10B0C0005B689847236920465B689847384611B00B ++:10B0D000BDE8F08F54EC000050EC000040420F003F ++:10B0E000A0D60100ABFF8600BE1D0200C31D0200FA ++:10B0F000E8D102004C1F0200281F0200F8260000C1 ++:10B10000F81D0200A0860100776C25643A20427287 ++:10B110006F6164636F6D2042434D25642038303287 ++:10B120002E313120576972656C65737320436F6EE1 ++:10B1300074726F6C6C65722025730A0025733A2057 ++:10B1400042726F6164636F6D20534450434D4420DD ++:10B15000434443206472697665720A0073647063C5 ++:10B160006D6463646325640072737369736D663222 ++:10B17000673D2564007874616C667265713D256475 ++:10B1800000616132673D3078257800627734307035 ++:10B190006F3D30782578006C6564626825643D30C9 ++:10B1A0007825780074737369706F7332673D3078F7 ++:10B1B0002578007273736973617632673D25640088 ++:10B1C0006C65676F66646D3430647570706F3D30A8 ++:10B1D0007825780070613168696D61787077723DAB ++:10B1E0002564006D617870326761303D3078257874 ++:10B1F000007061316974737369743D2564006D6119 ++:10B200006E6669643D307825780073756276656E88 ++:10B210006469643D30782578002004D0023643FF0D ++:10B22000FF626F617264747970653D3078257800D3 ++:10B230006D6373256467706F25643D3078257800F1 ++:10B240006D616E663D2573006D61787035676C6168 ++:10B25000303D30782578006D61787035676C6131EC ++:10B260003D30782578006F66646D35676C706F3D92 ++:10B27000307825780072737369736D6335673D2587 ++:10B280006400626F617264666C616773323D30782E ++:10B29000257800747269736F32673D3078257800C5 ++:10B2A0007064657472616E676532673D30782578C9 ++:10B2B000006D63736277323035676C706F3D307844 ++:10B2C00025780000006D637362773230756C3567E6 ++:10B2D0006C706F3D30782578006D63736277343021 ++:10B2E00035676C706F3D30782578000000706131F3 ++:10B2F0006C6F6D61787077723D2564006D61787058 ++:10B30000326761313D30782578007278706F35672B ++:10B310003D2564006D63733332706F3D307825785E ++:10B320000073756264657669643D307825780069DC ++:10B330007474356761303D307825780069747435F0 ++:10B340006761313D30782578007061316D617870CA ++:10B3500077723D256400626F6172647265763D307C ++:10B36000782578006D6373627732303267706F3D95 ++:10B37000307825780000006D637362773230756C29 ++:10B380003267706F3D30782578006D637362773473 ++:10B39000303267706F3D307825780000006D637340 ++:10B3A0006277323035676D706F3D307825780000F8 ++:10B3B000006D637362773230756C35676D706F3D09 ++:10B3C00030782578006D63736277343035676D703F ++:10B3D0006F3D3078257800000073726F6D7265766E ++:10B3E0003D2564007770736C65643D256400706171 ++:10B3F000316C6F62303D2564007061316C6F623179 ++:10B400003D2564007061316C6F62323D25640070CF ++:10B410006125646725637725646125643D3078255F ++:10B42000780070613062303D2564007061306231B7 ++:10B430003D25640070613062323D25640072737393 ++:10B4400069736D6332673D2564007472693567689E ++:10B450003D25640075736266733D25640063636B0C ++:10B46000706F3D307825780074726935676C3D25C2 ++:10B4700064006F66646D356768706F3D307825785D ++:10B4800000616725643D30782578006578747061C7 ++:10B490006761696E35673D307825780070726F643A ++:10B4A0007563746E616D653D257300636464706FD0 ++:10B4B0003D30782578006C65676F66646D62773221 ++:10B4C0003035676C706F3D307825780000006C6512 ++:10B4D000676F66646D62773230756C35676C706F5C ++:10B4E0003D30782578006C65676F66646D627732F1 ++:10B4F0003035676D706F3D307825780000006C65E1 ++:10B50000676F66646D62773230756C35676D706F2A ++:10B510003D30782578006C65676F66646D627732C0 ++:10B5200030356768706F3D307825780000006C65B5 ++:10B53000676F66646D62773230756C356768706FFF ++:10B540003D30782578007278706F32673D25640051 ++:10B550007278636861696E3D30782578006974742B ++:10B56000326761303D3078257800697474326761E4 ++:10B57000313D3078257800616E7473776974636843 ++:10B580003D30782578007478636861696E3D307865 ++:10B5900025780070726F6469643D3078257800709A ++:10B5A00061306974737369743D25640063636B640F ++:10B5B000696766696C74747970653D2564006368B9 ++:10B5C00069707265763D2564006F66646D356770DD ++:10B5D0006F3D30782578006C656464633D30782574 ++:10B5E000303478006D61787035676861303D30784F ++:10B5F0002578006D61787035676861313D30782558 ++:10B60000780070613162303D2564007061316231D3 ++:10B610003D25640070613162323D256400627764CB ++:10B620007570706F3D30782578006D617870356782 ++:10B6300061303D30782578006D6178703567613113 ++:10B640003D3078257800616E74737763746C35676C ++:10B650003D30782578006D63732564672563706FCE ++:10B6600025643D30782578006D637362773230351C ++:10B670006768706F3D307825780000006D637362F5 ++:10B68000773230756C356768706F3D30782578009B ++:10B690006D637362773430356768706F3D3078253D ++:10B6A0007800000074726935673D2564006F706F23 ++:10B6B0003D25640076656E6469643D3078257800C8 ++:10B6C0006C65676F66646D627732303267706F3DAC ++:10B6D0003078257800006C65676F66646D6277323C ++:10B6E00030756C3267706F3D307825787061306DE1 ++:10B6F00061787077723D25640070613168696230ED ++:10B700003D256400706131686962313D25640070D7 ++:10B710006131686962323D256400637573746F6DD1 ++:10B7200076617225643D30782578007265677265B0 ++:10B73000763D3078257800626F617264666C61676F ++:10B74000733D307825780062786132673D2564006A ++:10B750006F656D3D2530327825303278253032786E ++:10B7600025303278253032782530327825303278DD ++:10B77000253032780064657669643D30782578003C ++:10B7800070612564677725646125643D307825788C ++:10B790000072737369736D6635673D2564006F666B ++:10B7A000646D3267706F3D30782578006161356770 ++:10B7B0003D30782578007770736770696F3D256438 ++:10B7C0000062786135673D25640075736265706E4F ++:10B7D000756D3D307825780074737369706F7335BB ++:10B7E000673D3078257800616E74737763746C32CE ++:10B7F000673D3078257800727373697361763567B9 ++:10B800003D2564006F66646D706F3D30782578006B ++:10B8100074726932673D25640073746263706F3DB2 ++:10B82000307825780063636F64653D307830006D53 ++:10B830006163616464723D25730063636F64653D99 ++:10B84000256325630063633D25640063636B326792 ++:10B85000706F3D30782578006363746C3D307825D7 ++:10B86000780072656777696E646F77737A3D2564D7 ++:10B870000065787470616761696E32673D30782564 ++:10B880007800626F6172646E756D3D25640074723C ++:10B8900069736F35673D307825780063636B627735 ++:10B8A00032303267706F3D30782578000000636376 ++:10B8B0006B62773230756C3267706F3D3078257807 ++:10B8C000007064657472616E676535673D30782518 ++:10B8D0007800000080000000FF0000000C00000065 ++:10B8E0000000000000040000FF0000000C00000049 ++:10B8F0000000000000000800FF0000000E00000033 ++:10B90000000000000200000001000400030000002D ++:10B91000010002000A00000002006000DC050000D7 ++:10B9200008071700747870777262636B6F66003275 ++:10B93000675F6367610072737369636F72726E6FC2 ++:10B94000726D00747373696C696D75636F640074F4 ++:10B95000656D70735F687973746572657369730080 ++:10B9600072737369636F7272617474656E003567A8 ++:10B970005F6367610074656D7074687265736800F9 ++:10B98000696E746572666572656E6365006D63737A ++:10B990003267706F30006D63733267706F3100749F ++:10B9A000786761696E74626C356700747373696F70 ++:10B9B00066667365746D696E35676C007473736960 ++:10B9C0006F66667365746D696E35676D0074656D5D ++:10B9D0007073656E73655F736C6F7065006D656124 ++:10B9E00073706F7765720072737369736D66326717 ++:10B9F00000706C6C646F75626C65725F6D6F64650E ++:10BA000032670069716C6F7374316F6666326700FC ++:10BA100072667265673033335F63636B00706C6CA2 ++:10BA2000646F75626C65725F656E61626C653267CA ++:10BA3000006F70656E6C706761696E696478613102 ++:10BA400034300065787470616761696E35670065D0 ++:10BA5000787470616761696E3267006F70656E6CD3 ++:10BA6000706761696E69647861313439007478692E ++:10BA7000716C6F7061673267006E6F6973655F63C9 ++:10BA8000616C5F7265665F3267006C6F67656E5FE1 ++:10BA90006D6F646500706163616C69647832670022 ++:10BAA00074656D705F616464006F70656E6C706763 ++:10BAB00061696E6964786131363500706163616C0B ++:10BAC000696478356768693100706163616C6174BD ++:10BAD0006832673100706D696E00706163616C700F ++:10BAE000756C7365776964746800706D6178007354 ++:10BAF000776374726C6D61705F3567006F70656E2F ++:10BB00006C7074656D70636F727200747373696DBD ++:10BB100061786E7074006E6F6973655F63616C5FEE ++:10BB2000656E61626C655F356700706163616C7042 ++:10BB30007772326700747869716C6F746600706137 ++:10BB400063616C69647835676C6F31007061636143 ++:10BB50006C61746835676869006F70656E6C7070D1 ++:10BB600077726C696D006E6F6973655F63616C5F9E ++:10BB7000646267006F70656E6C706761696E69649E ++:10BB800078613135330074786761696E74626C0076 ++:10BB9000706163616C69647835676869006F7065AE ++:10BBA0006E6C706761696E69647861313537006EFB ++:10BBB0006F6973655F63616C5F7570646174650064 ++:10BBC0006F66646D64696766696C747479706535F5 ++:10BBD000670070616763326700766261745F6D75DC ++:10BBE0006C740073776374726C6D61705F326700A0 ++:10BBF000706163616C616C696D0069716C6F636128 ++:10BC00006C70777232670076626174736D63006185 ++:10BC10006463726673657132670076626174736D16 ++:10BC2000660072786761696E6261636B6F666676E3 ++:10BC3000616C006F70656E6C706761696E696478C5 ++:10BC4000622564006F66646D3267706F007278679A ++:10BC500061696E74626C776C6267610070616361C8 ++:10BC60006C6174683567686931006E6F6973655F10 ++:10BC700063616C5F706F5F626961735F32670072EE ++:10BC800066726567303838006F70656E6C7067611A ++:10BC9000696E696478613136310064796E707772EB ++:10BCA0006C696D656E00706163616C69647835679D ++:10BCB000310074656D70636F7272780064616372D5 ++:10BCC0006174653267007061726670730070613014 ++:10BCD00062325F6C6F00747869716C6F706170753F ++:10BCE00032670074656D7073656E73655F6F707435 ++:10BCF000696F6E00706163616C61746835676C6F49 ++:10BD00003100706163616C69647832673100747806 ++:10BD1000616C706662797032670064616367633278 ++:10BD20006700756E6D6F645F727373695F6F6666CF ++:10BD3000736574006F70656E6C70766F6C74636F92 ++:10BD400072720072786761696E74626C31303000B3 ++:10BD50006E6F6973655F63616C5F6E665F7375625A ++:10BD60007374726163745F76616C00747373697469 ++:10BD70007864656C61790063636B3267706F006330 ++:10BD8000636B507772496478436F72720063636BC0 ++:10BD900064696766696C7474797065006C6F63635D ++:10BDA0006D6F646531006C6F696461636D6F6465AC ++:10BDB000356700706163616C617468356700746534 ++:10BDC0006D705F71007273736973617632670073AF ++:10BDD00070757261766F69645F656E61626C653201 ++:10BDE000670070613062315F6C6F00766261745F12 ++:10BDF00071006D61787032676130006E6F697365D4 ++:10BE00005F63616C5F7265665F3567006F66646D66 ++:10BE1000616E616C6F6766696C746277326700701F ++:10BE20006163616C61746832670070613062300018 ++:10BE30007061306231007061306232006F70656E27 ++:10BE40006C706761696E696478613336006E6F6922 ++:10BE500073655F63616C5F61646A5F356700697118 ++:10BE60006C6F63616C69647832676F666673006FCC ++:10BE700070656E6C706761696E69647861313030CD ++:10BE800000706163616C7077723267310072617744 ++:10BE900074656D7073656E7365006F70656E6C7040 ++:10BEA0006761696E696478613130340069716C6F03 ++:10BEB00063616C6964783267006F70656E6C707076 ++:10BEC00077726374726C006F70656E6C7067616915 ++:10BED0006E696478613130380072786761696E74B8 ++:10BEE000656D70636F727235676D0074785F746F23 ++:10BEF0006E655F706F7765725F696E646578006FFD ++:10BF000070656E6C707265667077720072737369BB ++:10BF1000736D63326700706163616C61746835676B ++:10BF200031006E6F6973655F63616C5F706F5F6234 ++:10BF30006961735F3567006E6F6973655F63616C1C ++:10BF40005F706F5F32670072786761696E74656DEC ++:10BF500070636F727235676C00706163616C6964E5 ++:10BF600078356731746800706167633567007061A8 ++:10BF700063616C69647835676C6F317468007473E1 ++:10BF800073696F66667365746D696E006F70656E58 ++:10BF90006C706761696E696478613430006F7065D8 ++:10BFA0006E6C706761696E696478613434007266C2 ++:10BFB000726567303333006F70656E6C70676169EE ++:10BFC0006E696478613438006E6F6973655F6361B0 ++:10BFD0006C5F686967685F6761696E007266726549 ++:10BFE00067303338006E6F6973655F63616C5F61E2 ++:10BFF000646A5F3267006D656173706F7765723177 ++:10C00000006D656173706F77657232006F70656E79 ++:10C010006C706761696E6964786131313600627095 ++:10C0200068797363616C650072786761696E7465C5 ++:10C030006D70636F7272326700706163616C696406 ++:10C040007835676C6F0061613267006F66646D649C ++:10C05000696766696C74747970650074656D705F8A ++:10C060006D756C74007662617473617600706163E3 ++:10C07000616C61746835676C6F00706163616C69D5 ++:10C08000647832673174680072786761696E7465CC ++:10C090006D70636F72723567680063636B5077729F ++:10C0A0004F6666736574007478707772696E646544 ++:10C0B000780069716C6F63616C69647835676F666D ++:10C0C00066730070613062305F6C6F00676D67632C ++:10C0D000326700706163616C6964783567686931E3 ++:10C0E0007468007278706F3267006E6F6973655F95 ++:10C0F00063616C5F656E61626C655F3267006F7073 ++:10C10000656E6C706761696E696478613532006F65 ++:10C1100070656E6C706761696E6964786135360050 ++:10C120006F70656E6C706761696E696478613131DA ++:10C130003200706163616C69647835670074656DA5 ++:10C140007073617600747269736F32670076626132 ++:10C15000745F616464006F70656E6C706761696EB6 ++:10C1600069647861313230006F70656E6C70676140 ++:10C17000696E69647861313234006F70656E6C701D ++:10C180006761696E6964786131323800747269641C ++:10C19000783267006F66646D64696766696C747491 ++:10C1A000797065326700696E69747869647832679E ++:10C1B0000068775F697163616C5F656E00697163C8 ++:10C1C000616C5F7377705F646973006D75785F672A ++:10C1D00061696E5F7461626C6500747373696F6628 ++:10C1E000667365746D617835676800747373696F21 ++:10C1F00066667365746D617835676C007473736916 ++:10C200006F66667365746D617835676D0074656D12 ++:10C2100070736D630074656D70736D660074737315 ++:10C22000696F66667365746D6178006F70656E6CBA ++:10C23000706761696E696478613630007478616C2A ++:10C24000706662797032675F63636B006F70656EF2 ++:10C250006C706761696E6964786136340066726516 ++:10C26000716F66667365745F636F7272006F70657D ++:10C270006E6C706761696E69647861313332006F2A ++:10C2800070656E6C706761696E69647861313336B0 ++:10C29000007874616C6D6F646500747373697469A0 ++:10C2A0006D65006E6F6973655F63616C5F706F5F72 ++:10C2B000356700747373696F66667365746D696E54 ++:10C2C00035676800B8C70200600000001200000077 ++:10C2D000000000002000000028C702002600000027 ++:10C2E0000E0000000000000010000000B4CC0200AE ++:10C2F000980000000D000000000000002000000079 ++:10C3000074C702004400000011000000000000009B ++:10C310000800000074D102001000000010000000AE ++:10C3200000000000080000000000000040000000C5 ++:10C3300080000000C00000000100000005000000B7 ++:10C3400002000000060000000A0000004A00000091 ++:10C350008A000000CA0000000A0100004A01000033 ++:10C360008A0100008A0500008A0900008A0D000089 ++:10C370008A1100008A5100008A9100008AD10000D1 ++:10C380008A1101008A5101008A9101008900000090 ++:10C390008AD101008A1102000000000000000000A4 ++:10C3A000000000000000000000000000000000008D ++:10C3B000000000000000000000000000000000007D ++:10C3C000000000000000000000000000000000006D ++:10C3D000000000000000000000000000000000005D ++:10C3E000000000000000000000000000000000004D ++:10C3F000000000000000000000000000000000003D ++:10C40000000000000000000000000000000000002C ++:10C41000000000000000000000000000000000001C ++:10C42000000000000000000000000000000000000C ++:10C4300000000000000000000000000000000000FC ++:10C4400000000000000000000000000000000000EC ++:10C4500000000000000000000000000000000000DC ++:10C4600000000000000000000000000000000000CC ++:10C4700000000000000000000000000000000000BC ++:10C4800000000000000000000000000000000000AC ++:10C49000000000000000000000000000000000009C ++:10C4A000000000000000000003001300410300131F ++:10C4B000004003001200410300120040030011007D ++:10C4C0004103001100400300100041030010004030 ++:10C4D000030010003E030010003C030010003A036C ++:10C4E000000F003D03000F003B03000E003D030062 ++:10C4F0000E003C03000E003A03000D003C03000D4B ++:10C50000003B03000C003E03000C003C03000C0049 ++:10C510003A03000B003E03000B003C03000B003B02 ++:10C5200003000B003903000A003D03000A003B032F ++:10C53000000A0039030009003E030009003C030023 ++:10C5400009003A0300090039030008003E0300080F ++:10C55000003C030008003A0300080039030008000B ++:10C5600037030007003D030007003C030007003AC3 ++:10C5700003000700380300070037030006003E03EE ++:10C580000006003C030006003A03000600390300E1 ++:10C5900006003703000600360300060034030005DA ++:10C5A000003D030005003B030005003903000500C2 ++:10C5B000380300050036030005003503000500338D ++:10C5C000030004003E030004003C030004003A039F ++:10C5D00000040039030004003703000400360300A0 ++:10C5E000040034030004003303000400310300049A ++:10C5F0000030030004002E030003003C030003008E ++:10C600003A03000300390300030037030003003638 ++:10C61000030003003403000300330300030031036D ++:10C6200000030030030003002E030003002D03006D ++:10C6300003002C030003002B030003002903000266 ++:10C64000003D030002003B0300020039030002002A ++:10C6500038030002003603000200350300020033F5 ++:10C6600003000200320300020030030002002F0327 ++:10C670000002002E030002002C030002002B030026 ++:10C6800002002A030002002903000200270300021F ++:10C69000002603000200250300020024030002001C ++:10C6A00023030002002203000200210300020020F5 ++:10C6B000030001003F030001003D030001003B03B4 ++:10C6C00000010039030001003803000100360300B7 ++:10C6D00001003503000100330300010032030001B3 ++:10C6E0000030030001002F030001002E03000100B1 ++:10C6F0002C030001002B030001002A030001002984 ++:10C7000003000100270300010026030001002503A8 ++:10C7100000010024030001002303000100220300A4 ++:10C7200001002103000100200004000400040004B3 ++:10C7300000040004000400040004000400040104D8 ++:10C7400080048204830484040004000400040004C0 ++:10C7500000040004000400040004010480048204B6 ++:10C760008304840485048604050506050705080579 ++:10C7700009050A05090C12181818090C12181818BE ++:10C7800000000C076F7A060C0F7B7E0105080B0E6C ++:10C79000110000000000000000000306090C0F1249 ++:10C7A000000000000000000000000306090C00006B ++:10C7B0000000000000000000000000000400000075 ++:10C7C0004000000080000000C000000001000000E8 ++:10C7D000050000004500000085000000C5000000C5 ++:10C7E00005010000450100008501000085050000ED ++:10C7F00085090000850D000089090000890D0000F1 ++:10C8000089110000895100008991000089D1000040 ++:10C8100089110100854D0000858D000085CD000047 ++:10C820008951010089910100000000000000000012 ++:10C8300000000000000000000000000000000000F8 ++:10C8400000000000000000000000000000000000E8 ++:10C8500000000000000000000000000000000000D8 ++:10C8600000000000000000000000000000000000C8 ++:10C8700000000000000000000000000000000000B8 ++:10C8800000000000000000000000000000000000A8 ++:10C890000000000000000000000000000000000098 ++:10C8A0000000000000000000000000000000000088 ++:10C8B0000000000000000000000000000000000078 ++:10C8C0000000000000000000000000000000000068 ++:10C8D0000000000000000000000000000000000058 ++:10C8E0000000000000000000000000000000000048 ++:10C8F0000000000000000000000000000000000038 ++:10C900000000000000000000000000000000000027 ++:10C910000000000000000000000000000000000017 ++:10C920000000000000000000000000000000000007 ++:10C9300000000000000000008000800080008000F7 ++:10C9400080008000800080008000810082008300E1 ++:10C9500084008500040105018000800080008000C3 ++:10C9600080008000800081008200830084008500B8 ++:10C9700004010501060107011901870188018901E8 ++:10C980008A018B0107001F004807001F00460700AF ++:10C990001F004407001E004307001D004407001C41 ++:10C9A000004407001B004507001A00460700190055 ++:10C9B0004607001800470700170048070017004601 ++:10C9C0000700160047070015004807001500460736 ++:10C9D000001500440700150042070015004007003D ++:10C9E00015003F0700140040070013004107001323 ++:10C9F000004007001200410700120040070011002C ++:10CA000041070011004007001000410700100040DE ++:10CA1000070010003E070010003C070010003A0716 ++:10CA2000000F003D07000F003B07000E003D070010 ++:10CA30000E003C07000E003A07000D003C07000DF9 ++:10CA4000003B07000C003E07000C003C07000C00F8 ++:10CA50003A07000B003E07000B003C07000B003BB1 ++:10CA600007000B003907000A003D07000A003B07DA ++:10CA7000000A0039070009003E070009003C0700D2 ++:10CA800009003A0700090039070008003E070008BE ++:10CA9000003C070008003A070008003907000800BA ++:10CAA00037070007003D070007003C070007003A72 ++:10CAB00007000700380700070037070006003E0799 ++:10CAC0000006003C070006003A0700060039070090 ++:10CAD0000600370700060036070006003407000589 ++:10CAE000003D070005003B07000500390700050071 ++:10CAF000380700050036070005003507000500333C ++:10CB0000070004003E070004003C070004003A0749 ++:10CB1000000400390700040037070004003607004E ++:10CB20000400340700040033070004003107000448 ++:10CB30000030070004002E070003003C070003003C ++:10CB40003A070003003907000300370700030036E7 ++:10CB50000700030034070003003307000300310718 ++:10CB600000030030070003002E070003002D07001C ++:10CB700003002C070003002B070003002907000215 ++:10CB8000003D070002003B070002003907000200D9 ++:10CB900038070002003607000200350700020033A4 ++:10CBA00007000200320700020030070002002F07D2 ++:10CBB0000002002E070002002C070002002B0700D5 ++:10CBC00002002A07000200290700020027070002CE ++:10CBD00000260700020025070002002407000200CB ++:10CBE00023070002002207000200210700020020A4 ++:10CBF000070001003F070001003D070001003B075F ++:10CC000000010039090C12181818090C121818180C ++:10CC100000000C076F7A060C0F7B7E0105080B0ED7 ++:10CC2000110000000000000000000306090C0F12B4 ++:10CC3000000000000000000000000306090C0000D6 ++:10CC4000000000000000000007001000390700107D ++:10CC500000380700100036070010003407001000ED ++:10CC60003307001000310700100030070010002FBC ++:10CC7000070010002D070010002C070010002B07E4 ++:10CC80000010002A070010002807001000270700E6 ++:10CC900010002607001000250700100024070010D0 ++:10CCA00000230700100022070010002107001000D9 ++:10CCB0002000000000000000400000000000000014 ++:10CCC00040000000000000004000000000000000E4 ++:10CCD00040000000000000004000000000000000D4 ++:10CCE00040000000000000004000000000000000C4 ++:10CCF00040000000000000004000000000000000B4 ++:10CD00004000000000000000400000000000001093 ++:10CD1000400000000000000048000000000000206B ++:10CD20004800000000000030480000000000004003 ++:10CD300048000000000000504800000000000060B3 ++:10CD4000480000000000005050000000000000609B ++:10CD50005000000000000070500000000000008043 ++:10CD6000500000000000009050000000000000A0F3 ++:10CD700050000000000000B050000000000000C0A3 ++:10CD800050000000000000D050000000000000E053 ++:10CD900050000000000000F050000000000000E023 ++:10CDA00058000000000000005900000000000010C2 ++:10CDB0005900000000000020590000000000003071 ++:10CDC0005900000000000040590000000000005021 ++:10CDD0005900000000000060590000000000000041 ++:10CDE00040000000000000004000000000000000C3 ++:10CDF00040000000000000004000000000000000B3 ++:10CE000040000000000000004000000000000000A2 ++:10CE10004000000000000000400000000000000092 ++:10CE20004000000000000010400000000000000072 ++:10CE30004800000000000020480000000000003012 ++:10CE400048000000000000404800000000000050C2 ++:10CE50004800000000000060480000000000005092 ++:10CE60005000000000000060500000000000007052 ++:10CE70005000000000000080500000000000009002 ++:10CE800050000000000000A050000000000000B0B2 ++:10CE900050000000000000C050000000000000D062 ++:10CEA00050000000000000E050000000000000F012 ++:10CEB00050000000000000705100000000000080E1 ++:10CEC0005100000000000090510000000000002010 ++:10CED0005900000000000030590000000000004030 ++:10CEE00059000000000000505900000000000060E0 ++:10CEF00059000000000000A059000000000000B030 ++:10CF000059000000000000000000000000000000C8 ++:10CF10000000000000000000080000000000000009 ++:10CF200008000000000000000800000000000000F1 ++:10CF300008000000000000000800000000000000E1 ++:10CF400008000000000000000800000000000000D1 ++:10CF500008000000000000000800000000000010B1 ++:10CF60000800000000000020080000000000003061 ++:10CF70000800000000000040080000000000005011 ++:10CF800008000000000000401000000000000050F9 ++:10CF900010000000000000601000000000000070A1 ++:10CFA0001000000000000080100000000000007071 ++:10CFB0001800000000000080180000000000009031 ++:10CFC00018000000000000A018000000000000B0E1 ++:10CFD00018000000000000C018000000000000D091 ++:10CFE00018000000000000E018000000000000F041 ++:10CFF00018000000000000001900000000000010F0 ++:10D00000190000000000002019000000000000309E ++:10D01000190000000000004019000000000000504E ++:10D0200019000000000000601900000000000070FE ++:10D03000190000000000008019000000000000003E ++:10D0400008000000000000000800000000000000D0 ++:10D0500008000000000000000800000000000000C0 ++:10D0600008000000000000000800000000000000B0 ++:10D070000800000000000010080000000000002070 ++:10D080000800000000000030080000000000004020 ++:10D0900008000000000000500800000000000040F0 ++:10D0A00010000000000000501000000000000060B0 ++:10D0B0001000000000000070100000000000009050 ++:10D0C0001100000000000070180000000000008047 ++:10D0D000180000000000009018000000000000A0F0 ++:10D0E00018000000000000B018000000000000C0A0 ++:10D0F00018000000000000D018000000000000E050 ++:10D1000018000000000000F01800000000000000FF ++:10D1100019000000000000101900000000000020AD ++:10D12000190000000000003019000000000000405D ++:10D13000190000000000005019000000000000600D ++:10D1400019000000000000701900000000000080BD ++:10D1500019000000000000A019000000000000B04D ++:10D1600019000000000000000000000000000000A6 ++:10D17000000000005F36291F5F36291F5F36291F18 ++:10D180005F36291F28C30200600000001200000063 ++:10D19000000000002000000038C902002600000046 ++:10D1A0000E000000000000001000000014CF02007C ++:10D1B000980000000D0000000000000020000000AA ++:10D1C00004CC020044000000110000000000000038 ++:10D1D0000800000074D102001000000010000000E0 ++:10D1E00000000000080000000A5254452028257362 ++:10D1F0002D25732573257329202573206F6E2042FA ++:10D20000434D25732072256420402025642E25641B ++:10D210002F25642E25642F25642E25644D487A0A17 ++:10D22000000000002DE9FF4106460D460846FC219E ++:10D2300017469846D9F34CF5044608B91E302DE040 ++:10D240000021FC22D4F3FCF60A9B04F1640204F1F1 ++:10D250006801009301920291304629463A464346BE ++:10D26000FBF73EFC206608B90B2017E040F61201E0 ++:10D270000022DDF3C3F700210A46E0662560206E38 ++:10D28000DDF3E0F52046F8F707FB206EFBF7EAFA3E ++:10D2900028462146FC22D9F32BF5002004B0BDE836 ++:10D2A000F081C04601BC600300104E03BFDE02F0F7 ++:10D2B0000C0E0280C12700000403BFDE02F00D6FD8 ++:10D2C000035B5E02F0000601BC6013001043000126 ++:10D2D0005E02F0000000025E02F0117A00025E02BF ++:10D2E000F0118F020200BF00007302045EFF000015 ++:10D2F0000E006B446557800E01846002F7F7BF0192 ++:10D30000BC6003000AAE00025E02F00F960202DE6D ++:10D31000FF000013006B44655620130182E002F702 ++:10D32000F7BF03BFDE02F005A200682B6F000018F4 ++:10D330000280DEFF000073006B44655B6073018454 ++:10D34000E006F577AB00025E02F0112F020480C701 ++:10D3500000001A028180C700001C01806002F7F7FC ++:10D36000BF01BC6003000AE200682B070000270031 ++:10D37000E844655837A1006DDE8557402300682BCF ++:10D380004300002700E844655A17A1006DDE855769 ++:10D39000402503BFDE02F0002701BC6003000AC283 ++:10D3A00001BC6003000AC101BC6003000AD001BCDB ++:10D3B0006003000AC80202DEB300002A0200420332 ++:10D3C00000002A00025E02F00B1602845EB3000029 ++:10D3D000730068AB0F0000730283DEB700002E02FB ++:10D3E0000180C700004800B02ACB0017A202802BA2 ++:10D3F000F300003500B02B230017A1006DDE855C23 ++:10D40000E06400685E8700003500682C0700003586 ++:10D4100000B02C070017A200682B0B00003A00E8B0 ++:10D4200044655857A1006DDE86F4406400E05E85D7 ++:10D4300055F7A1006DDE86F440640202DEBB0000F9 ++:10D440004800682ABB00004800E8446556D7A100A0 ++:10D45000E02ABB0157A2006EDE86F440420182E062 ++:10D4600002F5D7AE01BC6003000AAE03BFDE02F0D6 ++:10D47000004800E82ABAF437A100902ABB0037A27E ++:10D48000006E2ABEF4404600B02ABF0017A2006911 ++:10D49000DE86F4404803BFDE02F000640283DEB79C ++:10D4A00000005C028881AB00005A02035EB70000F6 ++:10D4B00073020480C700004D02005EFF00005A02A4 ++:10D4C0008080BF00005A0204DEB700005100682BC4 ++:10D4D0001708607303BFDE02F0005A028400C70021 ++:10D4E0000053028600C700005500682B0B00005A4D ++:10D4F00002812C4700005A00E844655737A1006DAF ++:10D50000DE8558005A006CC46557607300B04467EC ++:10D51000000ABB02845EB700007300025E02F011D5 ++:10D520004903BFDE02F0007301BC63FF1FF7A100D7 ++:10D53000684586F4205A0203C57300006402845EC5 ++:10D54000B7000064020100C7000073006B44655718 ++:10D5500080730020E3FE1460730282DEBB00007360 ++:10D5600002022C470000670282DEBB00006703BF97 ++:10D57000DE02F0005A028881AB0000730282DEB343 ++:10D58000000073028080BF0000730284DEAF0000E1 ++:10D590007302825EBB00007303A0DE02F0006F0224 ++:10D5A00000420300006F00025E02F00B1601836070 ++:10D5B00002F5B7AD0184E006F577AB01BC6003006E ++:10D5C0000AC300B04467000AC4018060020D906C79 ++:10D5D00003595E02F0007503D85E02F0007603D8AE ++:10D5E000DE02F0007701BC618300112900B0007BEE ++:10D5F00000112B01BC630300112303125E02F00A29 ++:10D600008F03975E02F00B2703D05E02F002F40353 ++:10D61000D0DE02F0051003D5DE02F00A4C03915E65 ++:10D6200002F005760396DE02F00A470288C1730015 ++:10D63000009E03C45E02F006E703C75E02F0071611 ++:10D6400003DCDE02F011CF03AA5E02F00759038665 ++:10D65000DE02F00A870287C037000A8703835E0272 ++:10D66000F008AB0391DE02F005F803C2DE02F00A17 ++:10D67000EC00025E02F00F9500025E02F0117A03E8 ++:10D68000D4DE02F0068103A3DE02F0000200025E97 ++:10D6900002F00C6300025E02F00EC403A25E02F010 ++:10D6A000009B03565E02F000980186600609104850 ++:10D6B000031F5E02F00098006A5E2300009700B02E ++:10D6C000002700178800E85E2300378803A65E0263 ++:10D6D000F0010500025E02F00F5D0028600E08E117 ++:10D6E0002803C4DE02F00B5E0020C20300213003D9 ++:10D6F000BFDE02F0017D03815E02F000A00300DEC8 ++:10D7000002F000820188E0020B905C03BFDE02F0B1 ++:10D7100002F1028740630000A20282C1070000A359 ++:10D7200001866006F43018028640630000A500B050 ++:10D730005E870017A10002DE02F00000028740634E ++:10D740000000A800B05E8B0010190186E006F430DE ++:10D75000180281DEAF0000AD0286C0630000AC009D ++:10D76000B05E870017A10002DE02F0000001BC607D ++:10D77000030280060280DE070000B901DA6002F0D1 ++:10D78000178002085E070000C901BC60031E17A1D4 ++:10D7900000E05E02F4306501BC60031C17A100E0EC ++:10D7A0005E02F4306401BC600300281803BFDE028F ++:10D7B000F000CF01105E030017A100885E870037DC ++:10D7C000A200E05E86F457A100E0015AF430630243 ++:10D7D0008600C30000C200B0560B00106200B054B7 ++:10D7E0000300106201BC600300281803BFDE02F0D2 ++:10D7F00000D100B0418F0010620109DE030017A1C3 ++:10D8000000885E870057A100E05E850597A100E0D3 ++:10D810005E8703C00601BC600300481803BFDE0238 ++:10D82000F000D101BC60070217A100E05E02F430F5 ++:10D830006501BC60070017A100E05E02F4306401DE ++:10D84000BC600318000601BC600300081800B05A51 ++:10D850000300106200B0580300106301050143008B ++:10D8600017A10088001AF420060002DE02F0000072 ++:10D8700001BC600306379201BC63FF1FF0C301BC0B ++:10D8800060031890E301BC63FF1FF0C501BC63FF98 ++:10D890001FF0C601BC63FF1FF0C700B02C5B001077 ++:10D8A000E500B02C5F0010E600B02C630010E7022A ++:10D8B00080AC470000E701BC600300101000B040DE ++:10D8C0004300180000B040470010E501BC600300B1 ++:10D8D000301000B0404300180000B040470010E690 ++:10D8E00001BC600300501000B0404300180000B0BD ++:10D8F00040470010E701BC63FF1FF0C40002DE02D6 ++:10D90000F0000000E840330097A100B0400B001782 ++:10D91000A3006D5E86F460EE00905E8F0037A30377 ++:10D92000BFDE02F000EF00905E870037A301BC600D ++:10D930001F1417A100E05E8EF437A301F041970099 ++:10D9400017A1006DDE86F461030287C1970000F71E ++:10D9500001385A030017A1013C5A030017A203BF64 ++:10D96000DE02F000F9013C5A030017A101385A0702 ++:10D970000017A200685E86F480FE00D85E8B003738 ++:10D98000A200E14196F4506500E1C19700306503C3 ++:10D99000BFDE02F000F100D85E8B0037A200E1414B ++:10D9A00096F457A100E1DE870037A101F05E870001 ++:10D9B00017A1006EDE86F4610401BC63FF1FF7A4AB ++:10D9C0000002DE02F000000020E38E090002031EC8 ++:10D9D000DE02F0010B039F5E02F0010B01BC60430D ++:10D9E0000117A100A84122F4304803BFDE02F00075 ++:10D9F0000200689B6F0000990208411F00010801A6 ++:10DA0000816005620B1000025E02F00B1600B00090 ++:10DA1000AB00108600B0016300108A00025E02F0C5 ++:10DA20000D9601BC600304179200B0003B00111D6D ++:10DA30000190600609104803A1DE02F00122018175 ++:10DA4000E00609104801BC600300904201BC60037D ++:10DA500000112D039EDE02F0012501846002F29781 ++:10DA60009400B0451700178F00B05E1700179002A2 ++:10DA700000441F00012001856002091048018160F7 ++:10DA80000700104701F0DE0F0037A100A044B6F4F4 ++:10DA90003145039EDE02F0012501BC613712B080E2 ++:10DAA00003BFDE02F0000200A044B42A314501BCED ++:10DAB000612712708003BFDE02F000020020E082C6 ++:10DAC000090002010CDE530017A101885E870010D7 ++:10DAD0004701BC60030050420108411F0017A1012B ++:10DAE0008CDE86F2979403BFDE02F000020002DEB5 ++:10DAF00002F000000020E07E09000200025E02F059 ++:10DB00000F670283C21F000002020280F300013A85 ++:10DB100000B044670017A1017C5E862357A30283EF ++:10DB20005EFF00013900E000FAF46830018360060E ++:10DB3000F7F7BF006BDE8D06013E0206D003000141 ++:10DB40004200E950862337A100E8D08A2357A2007B ++:10DB500069DE8B00014200025E02F00B160191604B ++:10DB60001684F42700E020C300883003BFDE02F0F3 ++:10DB700002CC00025E02F002CF020400BF00014AA4 ++:10DB800003945E02F000020020C28F02000200A097 ++:10DB9000428F01F78000685E002DC00200025E0225 ++:10DBA000F00B1603BFDE02F000040201C28F00007A ++:10DBB00002011400630017A100685E870060020084 ++:10DBC000025E02F00B160194600F00001800025E66 ++:10DBD00002F0015103BFDE02F000040114006300F3 ++:10DBE00017A100B05E870010A501BC601311106082 ++:10DBF00000685E8700015800E0418306D06000E8BD ++:10DC00005E870037A103BFDE02F00154028050C3DB ++:10DC1000000162018760040310A000B000630010DF ++:10DC2000B400B042D3001800008841830030B60130 ++:10DC3000BC60030B10B500B0006300B0B40317DE86 ++:10DC400002F0015F0397DE02F0016001806006864A ++:10DC500014300002DE02F000000020E01280417C5F ++:10DC6000018760040310A000B000630010B401BC81 ++:10DC700060030E10B500B0006300F0B401BC605743 ++:10DC80000490B600B000630010B401BC600302D081 ++:10DC9000B50207500B00017901BC600303D0B50148 ++:10DCA0008E6002F297940204500B0001720204D0BD ++:10DCB0000B00017201866006F2979400E042D700E3 ++:10DCC000D0B500A0500B1117A10068DE87110178B4 ++:10DCD0000186E006F2979400E042D70050B50207B3 ++:10DCE000D00B00017800E042D70090B500B042D7D9 ++:10DCF0000011E100B0006300B0B40317DE02F001D0 ++:10DD00007A0397DE02F0017B0002DE02F0000000E1 ++:10DD10006820DF000180006CC46506E00401BC607F ++:10DD200003000837006820D7000183006CC4650633 ++:10DD3000C00401BC60030008350020E0BE090002F9 ++:10DD400003905E02F0000403A25E02F001BE020234 ++:10DD500000BF0001880203C5730001B100682F6B8A ++:10DD600000018C00E844657B57A1006D5E857B2136 ++:10DD7000B101BC6003000BDA00682D9B0001B10209 ++:10DD800082C1070001B1028042030001B10285C5D2 ++:10DD9000230001B1028640370001B10181E006F5A0 ++:10DDA00077AB00B02D9F0017A101BC602F1077A2A8 ++:10DDB00001BC60030017A300025E02F0131200B062 ++:10DDC0002DA30017A101BC602F1777A201BC60032F ++:10DDD0000017A300025E02F0132001BC60131A17A3 ++:10DDE000A100025E02F000A200B040670417A2008A ++:10DDF000025E02F000A800E0446700D7A1006CC4F6 ++:10DE000066F4219F01BC60130ED7A100025E02F0F0 ++:10DE100000A200A040673FF7A201BC601314D7A185 ++:10DE200001BC62030017A300B05E8AF477A200026F ++:10DE30005E02F000A800B02D9F0017A101BC602F6A ++:10DE40000D37A201BC60030017A300025E02F013AD ++:10DE50001200B02DA30017A101BC602F13B7A201BF ++:10DE6000BC60030017A300025E02F013200181E0F2 ++:10DE700002F577AB01BC6003000B6600025E02F0A6 ++:10DE80000E74020200BF0001BD0284DEAF0001B8C3 ++:10DE900002035EB70001BD00025E02F010FB020348 ++:10DEA0005EB70001BD03BFDE02F0000202035EB7F1 ++:10DEB0000001BB020480C70001BD02805EFF0001BB ++:10DEC000BD00025E02F010BC03BFDE02F0000200E3 ++:10DED000025E02F00F670200421F0001D600684296 ++:10DEE000F30001C1006D42F30041D601140063004C ++:10DEF00017A100B05E870017A203A25E02F001CA5C ++:10DF00000183E0020D906C03145E02F001D8006EF4 ++:10DF1000C4568061D8028145230001D8006E5E8717 ++:10DF20000061D601BC60030077A200886006F45748 ++:10DF3000A300885E8B01001800E85E8B0037A2000A ++:10DF400020C28EF461D0006ADE86F441CA03BFDECF ++:10DF500002F001D6020400BF00020200900063013B ++:10DF60000165008085970217A100E064820DA1661B ++:10DF700000025E02F00F1D03BFDE02F0020201820A ++:10DF8000600209104803BFDE02F0000201BC60031A ++:10DF900000111500B0017F0017A6031F5E02F001FB ++:10DFA000E7020300C30001DD0020C28F0201E1038C ++:10DFB000255E02F001E70020C28F0201E1006881C6 ++:10DFC00053FFE00403BFDE02F001E301946013009D ++:10DFD000001803BFDE02F00202039EDE02F001E63B ++:10DFE0000068DE980BC1E60201411F000CB40185F8 ++:10DFF000600209104800685E980BC1EB00695E9FE3 ++:10E000000062070298428F0001EB03BFDE02F002BC ++:10E01000070201411F000CB4020400BF0001F2021C ++:10E0200018428F000CB400025E02F00EFF00025E88 ++:10E0300002F00F1D0194058700001803BFDE02F0F7 ++:10E040000202020013BB0001FB0200156B0001FE7F ++:10E0500000B013470017A10068DE84A7A1FB00B041 ++:10E06000134B0017A10068DE84A7C1FB00B0134F5B ++:10E070000017A10068DE84A7E1FB029E1397000150 ++:10E08000FE0201C28F0002000194600F000018031D ++:10E09000BFDE02F002020201C28F000200018060B6 ++:10E0A000060D906C0200C28F000CB4019460070052 ++:10E0B000001800025E02F00151020400BF000237A6 ++:10E0C000028500630002370183E0060D906C03BFF8 ++:10E0D000DE02F0023701BC60031810600129500B0A ++:10E0E00000179200B0017B001065006800EB000291 ++:10E0F0001000885A130117A100E84466F437A10004 ++:10E100006EDE8407421000E0029B0020A603BFDE03 ++:10E1100002F0067A019060120910480194601F0015 ++:10E12000001801085A0F00178101885E0681540A01 ++:10E1300001345A0F00178000025E02F000AF00B0F9 ++:10E14000017B00106500B056230017A100E05E8639 ++:10E15000A097A100E85E8400F40300E85E8400F468 ++:10E160001600B05A0300141300B05A07001414002C ++:10E17000B05A0B0014150068DE0700422800E800C2 ++:10E18000970057A101BC5E86F0141B017C5E8700DE ++:10E19000F41C00B0206300178100025E02F00D9AAB ++:10E1A00000B0017B00106501085A0F00178100B014 ++:10E1B0005E8700141E03BFDE02F0022B00B056176C ++:10E1C00000141B00B0561B00141C00B054130014A4 ++:10E1D0001E00B05013001086006D00A700823101B0 ++:10E1E00090016300108A00B0418F00106200025E4F ++:10E1F00002F0119C00B0422B00140601BC60031811 ++:10E2000017A1006DC18C20023401BC60030297A1EC ++:10E2100000E05E840377A100E05E86B0111D03BFBD ++:10E22000DE02F002AB020300C7000247020CD0037B ++:10E23000000247011400630017A102850063000279 ++:10E24000470080DE8701F7A201BC601B0257A200D5 ++:10E25000E05E8A0DB06500B041970014320080DEA8 ++:10E260008700B7A201BC60171FD7A200E05E8A0D2D ++:10E27000B06400B041930014330068D81300025218 ++:10E2800002005A1B0002490180600684F42703BF84 ++:10E29000DE02F005A20201D00300024900B0509B4B ++:10E2A00000142F0281D0C70002C900025E02F002F2 ++:10E2B000CF010BD0030017A1013C502B0017A20186 ++:10E2C0008C5E86F457A1014801430017A200685EE6 ++:10E2D00086F442520191601284F42703BFDE02F0FB ++:10E2E00002CC00025E02F0016300B0501300108601 ++:10E2F00000B0501700108A00682FC300025D029121 ++:10E30000D01700025B0291D01B00025B0291D01F6C ++:10E3100000025B0291D02300025B03BFDE02F00229 ++:10E320005D0191600284F42703BFDE02F002CC039A ++:10E33000A25E02F0028A020CD003000279020300FE ++:10E34000C700027800B050CB00106500025E02F0FA ++:10E350001235020350C700026601BC60230097A17A ++:10E3600000A85002F4340003BFDE02F0027D020474 ++:10E3700081AB000268006D4246C0800400B05A13B1 ++:10E3800000178000025E02F000B900B0540F0014C4 ++:10E390001E00B05A070017A100B05A1300178001E1 ++:10E3A000875A16F0178000B0418F00106500025E9A ++:10E3B00002F011A500E05E86A0740302875E0300F0 ++:10E3C00002770109DE030017A300E05E8B0077A24D ++:10E3D00000E05E8AF477A200885E8B0037A100E03F ++:10E3E0005E86F4508903BFDE02F0027D006D424A72 ++:10E3F000848004010650070017A1028CD00300029C ++:10E400007C00685E8700027D0182DE8686343101F1 ++:10E410008260028634310020D00304028300B050B1 ++:10E420004F0011F200B050530011F300B0505700EC ++:10E4300011F401BC60030091F003945E02F0028AC3 ++:10E44000020650030002860287DEAF00028A0281C4 ++:10E4500050030004F10202D0C70002890208502BC9 ++:10E4600000028A0285D003000508019060128634FC ++:10E470003103A25E02F0029700B0500F00111602A5 ++:10E4800002D0C700028F00B0505B0011160282D08C ++:10E4900003000297028147C30002900280504F00A0 ++:10E4A0000295002047C73F82970020C7DB00C2CB00 ++:10E4B00003BFDE02F0029703A55E02F0029702801E ++:10E4C000C7DF0002CB028850C70002B10129500B00 ++:10E4D000001792020300C70002A4020CD00300023E ++:10E4E000A4028350C70002A400B050CB0010650105 ++:10E4F000385A1300178001825A17005781010E5AAB ++:10E50000130017A1018E5E86F037810202D0C7008A ++:10E5100002B100B0501B00108A03BFDE02F002B14E ++:10E520000282D0C70002AB013850270017800108D3 ++:10E530005013001781010250130017A101825E865B ++:10E54000F0378100B0507F00108903BFDE02F00277 ++:10E55000B10138506F0017800108502B001781015E ++:10E5600006D0070017A101825E86F0378100B05007 ++:10E570001B00108A00B0508300108900025E02F078 ++:10E5800000AF00025E02F00D8D0102421B001781F8 ++:10E5900001825E0503178100025E02F00D9A00E021 ++:10E5A0005E840117A101D9DE8700108301BC6137A9 ++:10E5B00003B79100685E4B0282DF020400BF0002D5 ++:10E5C000BD028750030002BD03945E02F002BE0349 ++:10E5D000225E02F002C001BC610300308003BFDE96 ++:10E5E00002F0000201BC613303B791032BDE02F09D ++:10E5F00002C6009000630097A100E06482F43065D9 ++:10E60000006E5A130022C60188E006F237910068B6 ++:10E61000DE4B0482C801BC61BB03B79103BFDE02BD ++:10E62000F002DF0191600E84F42703BFDE02F002E6 ++:10E63000CC0191600684F42701BC60030010B40192 ++:10E6400081E00686343103BFDE02F005A2011C50D2 ++:10E650008F0017A100E0015EF43065010C5A4700FD ++:10E6600017A10080DE870197A200E0015E0DB06572 ++:10E6700002805A7F0002DE02815A7F0002DA020322 ++:10E68000DA7F0002DE00685A870002DE008860063A ++:10E69000F437A1002019FAF422DE00025E02F00B2A ++:10E6A000160191601E84F42700015E02F000000351 ++:10E6B000BFDE02F002CC0002DE02F0000003C4DE86 ++:10E6C00002F00B5E020650030002E70207DEAF0015 ++:10E6D00002E701BC6103003791020750030002E525 ++:10E6E00001BC620300F79100E0010B00204203BF70 ++:10E6F000DE02F002E801BC600300204200B05E4789 ++:10E70000001080020400BF0002F000B0058B001072 ++:10E7100064006E45170000020068DE4B0282EF00C5 ++:10E72000A044B42A314503BFDE02F0000200025EBD ++:10E7300002F00DA70068C51700000203D05E02F0CA ++:10E7400002F400025E02F00DA703BFDE02F0000239 ++:10E7500001836002F7F7BF01BC600300900400A8CA ++:10E76000412330104801BC620F0011E001816002BA ++:10E77000F5D7AE020200BF0003050068DE4B0202BF ++:10E78000FC00025E02F0130C0068DE4B062305025B ++:10E79000045EB30003050200456F00030500E84472 ++:10E7A000655737A100E82AB6F437A100695E8708EB ++:10E7B00023050183E0022B915C020701AB000305F6 ++:10E7C0000180E00209D04E0187E002F577AB0068D6 ++:10E7D000810B00230800B044670000430182E0067B ++:10E7E000091048018160020D906C01826006289139 ++:10E7F000440188E0020B905C00025E02F00F95017C ++:10E8000085E002F7F7BF0288421B0003100185E094 ++:10E8100006F7F7BF035B5E02F0031201BC60130052 ++:10E82000104301BC600300108501BC60030010B8F8 ++:10E83000008850770090B90208502B000319013866 ++:10E8400050730017A1017C506EF437A100885E87D9 ++:10E850000090B9020047A300031D01BC6003001132 ++:10E86000EA009042E70091EB00B047A300D1E80234 ++:10E870000047B300031F01B0E08E3D91EC01D2E0F0 ++:10E880000210908403A95E02F0041601BC6003002C ++:10E89000108400E001C30020700320DE02F0037347 ++:10E8A00001816006F5B7AD0068DE4B04A3370203B3 ++:10E8B000DEBB00032900E02C9300106503BFDE02DD ++:10E8C000F0032A01BC602301D06500A05E7FFE102A ++:10E8D000EC00B05A030010ED00B05A070010EE0033 ++:10E8E000B05A0B0010EF00B05A0F0010F001BC63DB ++:10E8F000FF1EF08401BC600300308501BC60030092 ++:10E9000010B401BC600301D0A601BC60030450B583 ++:10E9100001BC602304D0B400E002AF0020AB03BF11 ++:10E92000DE02F003BB0068DE4B05233D01BC600343 ++:10E930000010B401BC60071350A601BC600302D0F4 ++:10E94000B501BC602304D0B403BFDE02F00347006E ++:10E9500068DE4B0243540285C38F00034000E05E33 ++:10E960002700378901DA5E270010EE01BC63FF1F24 ++:10E97000F0CE01BC60030010B401BC600300D0A65F ++:10E9800001BC600303D0B501BC602304D0B400E037 ++:10E9900001D300207401BC61FF1FF08401BC60033F ++:10E9A000001085018460070011E00282DEB30004DC ++:10E9B000D802045EB30004D80183E00609104800C1 ++:10E9C000B0412300180001BC600306B78E0181E04E ++:10E9D00006F5D7AE00B054130017A100E05E840125 ++:10E9E00017A100885E8700708303BFDE02F004D8A1 ++:10E9F00001BC60031FF0840103DE530017A200680E ++:10EA0000121B00035900B0121B0017A2009019FA44 ++:10EA1000F457A202005EFF00035B01BC60030037F5 ++:10EA2000A200682B6F00035D01BC60030037A201E8 ++:10EA3000865E8A1C70E3006AC39300036700E843A4 ++:10EA40009000D0E40202421B0003650090001B000E ++:10EA500037A10020421B00436400B020B30017A17F ++:10EA600000E04392F430E40069C39300036701BC03 ++:10EA700060030010E400682B6F00036900E043911D ++:10EA80005C30E401BC60030010B401BC6003001002 ++:10EA9000A601BC60030210B501BC602304D0B40021 ++:10EAA000685E4B06A37100E001CB00207201BC60E0 ++:10EAB0000300083803BFDE02F003BB00E001CF0013 ++:10EAC000207303BFDE02F003BB03205E02F003C22B ++:10EAD0000181E00209104800E001D7002075031E03 ++:10EAE000DE02F003A201BC60030017A2006A5E23ED ++:10EAF00000037B0102428F0017A201855E8A091084 ++:10EB0000480180E0061030810284DE530003820059 ++:10EB1000B000770017A100E05E840437A100885E92 ++:10EB2000870057A100E05E870D57A103BFDE02F00A ++:10EB3000038301BC60030D57A1006800270003A2F6 ++:10EB400000E05E8401F7A101BC60230150650088EC ++:10EB500041970030B601BC60030010B400905E879E ++:10EB60000050A601BC60030110B501BC602300B0D9 ++:10EB7000B40317DE02F0038B0397DE02F0038C0070 ++:10EB800020DE870043950020DE8700239201B85ED7 ++:10EB900022D0168001805E8AD0368103BFDE02F06B ++:10EBA000039B01BC5E22D0168001845E8AD0368130 ++:10EBB00003BFDE02F0039B0020DE8700239901B82B ++:10EBC0005E22D0368101805E8AD0568203BFDE028B ++:10EBD000F0039B01BC5E22D0368101845E8AD05650 ++:10EBE0008201886002F430A800B05A030010B0001F ++:10EBF000B05A070010B1028042A300039E00E04219 ++:10EC0000A30090A800B05A0B0010B000B05A0F003B ++:10EC100010B10187600610908400E05E27003789FC ++:10EC200001DA5E270010EE01BC60030010B401BCE5 ++:10EC300060030350A600B000330010B50284DE5319 ++:10EC40000003AC00E0606803B0A600E04298043026 ++:10EC5000A600B000370010B501BC602304D0B40199 ++:10EC6000846006F2979401866002091048039EDED4 ++:10EC700002F003B60280441F0003B900B05E3F00FB ++:10EC8000114501BC600300178F00B05E430017857B ++:10EC900000B05E0F00179003BFDE02F003B900B0B2 ++:10ECA0005E0F0017850280441F0003B900A044B620 ++:10ECB000F0B14501BC600301104201836006F29788 ++:10ECC00094018460070011E003A05E02F004D60204 ++:10ECD000065EAF0004D80186E006F577AB01BC60A4 ++:10ECE0000300108000025E02F00B1C03BFDE02F086 ++:10ECF00005F803A15E02F0043D011400630017A1B2 ++:10ED00000068DE8700E3C70181600609104803BF81 ++:10ED1000DE02F0043D01816006F5D7AE011C508F84 ++:10ED20000017A100E0015EF43064010C58470004B4 ++:10ED3000870206508F0003D100B044670010F30033 ++:10ED4000B0446B0010F401BC63FF1FF0D301BC633F ++:10ED5000FF1FF0D400B042170310850020600E861C ++:10ED600023F5018760040310A000B000630010B415 ++:10ED700001BC60030B10B500B0006300F0B40203E7 ++:10ED800000C70003E3020CD0030003E3028050C776 ++:10ED90000003DB00B054130017A100E05E8680740E ++:10EDA0001A00B0506B0010E400B04213021084024D ++:10EDB00009502B0003E300B0421300308401D2E07D ++:10EDC0003AA030E0028050C70003E901D2E052A02F ++:10EDD00030E003BFDE02F003E90202D0C70003E91E ++:10EDE00000B0505F0010E000B050630010E100B0D0 ++:10EDF00050670010E200B0506B0010E400B0421306 ++:10EE000002F084020050C70003F000B0006300105D ++:10EE1000B401BC60030210B500B0006304D0B401BB ++:10EE20008460070011E001BC600300178E03BFDEA1 ++:10EE300002F004DA00E001C700207100B0006300B6 ++:10EE400010B401BC600302D0B500B0006304D0B4BC ++:10EE500003BFDE02F0046D01856006F7F7BF010312 ++:10EE600050030017A100B85E870037A101875E86B6 ++:10EE7000101080020CD00300043C020300C7000401 ++:10EE80000C00B050CB00106501BC6003001685007B ++:10EE9000E05A3300368C020350C700040100E05AE8 ++:10EEA0002700368903BFDE02F0043D01BC60030089 ++:10EEB00017B200B05A0B000B2501385A130017A1E6 ++:10EEC00001BC5A06F430E0013C5A130017A1017C42 ++:10EED0005A06F430E10181E0061090840185E007D4 ++:10EEE0000010E30185E0070010C30282D0C70004D0 ++:10EEF0001103BFDE02F004140202D0C700041600A2 ++:10EF0000B02A4B0017A101B8506EF430E000B050A9 ++:10EF1000730017A101B82A4EF430E10282421300B7 ++:10EF2000041400B0507B0010E400B04213021084BF ++:10EF30000185E0061C30E100B042130070840187B7 ++:10EF400060040310A0020300C700042B00B050CBE4 ++:10EF5000001065006D5ECAD1C41C0185E002187006 ++:10EF6000C300E05ECB00368E01BC601B09D065009B ++:10EF7000E04196F6506500B050970016800068DEBC ++:10EF8000CB00042301BC60230150B800682C97001B ++:10EF9000242903BFDE02F0043500B05ECB0010B5BB ++:10EFA00000B000630870B4028342D300042501BCA2 ++:10EFB00060030170B80068AC9700243501BC6003A1 ++:10EFC0000170B802BC506700043403BFDE02F004D5 ++:10EFD00033010CD0030017A103A95E02F004300135 ++:10EFE000BC60230150B800685E8700643303BFDE55 ++:10EFF00002F0043501BC60030170B800685E870050 ++:10F00000443501BC60030170B80181E0021710B8FB ++:10F0100001BC600300F0A501BC60030E10B500B098 ++:10F0200000630010B400B0006300F0B400B042D33D ++:10F03000001800018860080310B4018160060D907B ++:10F040006C03BFDE02F0046D0202D0C7000443006F ++:10F05000B0506F0010E000B050730010E100B050ED ++:10F06000770010E20282421300044200B0507B009D ++:10F0700010E400B0421302F08400E05E9F0037A766 ++:10F0800003A15E02F0044C01BC60030017A70187D6 ++:10F0900060040310A000B000630010B401BC600362 ++:10F0A0000E10B500B0006300F0B4018860080310D2 ++:10F0B000B403BFDE02F0046200B0017B0010650003 ++:10F0C000B05A030010E501BC63FF1FF0C500B05A41 ++:10F0D000070010E601BC63FF1FF0C600B05A0B002A ++:10F0E00010E701BC63FF1FF0C70068A0670004556C ++:10F0F00000E05E2700378900682067000459018519 ++:10F10000E0070010E30185E0070010C300B04213E0 ++:10F1100001108401DA5E270010EE0187600610906E ++:10F120008400B042131C108401BC60030010B400C2 ++:10F13000E0606803B0A600B000970010B501BC60A5 ++:10F140002304D0B4018460070011E003BFDE02F0A5 ++:10F1500004C601085E4B0017A100685E8700246D9D ++:10F160000202500300046C029E509F0004690201D9 ++:10F17000D00300046900E05E2700378901585E274C ++:10F1800000142D01DA50B70010EE018760061090D0 ++:10F190008403BFDE02F0046D01BC600300142D0186 ++:10F1A00004C1070017A10068121F00047200B0120A ++:10F1B0001F0017A1009019FAF437A103BFDE02F077 ++:10F1C000047403225E02F004740103DE530017A1ED ++:10F1D00000B05E870017A202005EFF00047701BC4A ++:10F1E00060030037A200682B6F00047901BC600344 ++:10F1F0000037A202885E4B00047C00685E4B0684E8 ++:10F200007C01BC60030017A20068921F00047E010D ++:10F2100083DE86F297940183DE8684F4270281C21E ++:10F220001300048401865E8B0010E30186600700F2 ++:10F2300010C30181E00610908403BFDE02F0048653 ++:10F2400001865E8A1C70E3018660061870C302B8EE ++:10F2500047A70004C202A047B70004C403A95E0286 ++:10F26000F0048E01085E4B0017A100685E87002441 ++:10F27000C3021E509F00048E0185E0061C70E3014E ++:10F2800085E0061870C3011400630017A10068DE52 ++:10F290008700849700B001530017A20068DE8BFF3F ++:10F2A000E493006842470024940068DE8A84C4978F ++:10F2B000018560020910480186E0021C70E30186A6 ++:10F2C000E0061870C3011050070017A600685E9B87 ++:10F2D0000004C301BC60030011E4013A50070017A9 ++:10F2E0008000885E0300778000E000AEF0106400CC ++:10F2F00068DE9B0044A80207D0030004A201BC60A2 ++:10F300002B12B7A200E05E000B37A300025E02F0F2 ++:10F310000DE801BC602307978100E0418301706321 ++:10F3200000E0418F00B06500025E02F00DBD01BC3F ++:10F33000602307506401BC60470017A200025E0210 ++:10F34000F00E1000685E9B0044C401A46046F47196 ++:10F35000E00068DE9B00C4B601BC611300B7A102E7 ++:10F360000600F30004AF01BC601300B7A10192C214 ++:10F370001AF437A203295E02F004B401BC60030052 ++:10F3800011EE009042E70091EF0192E00EF437A2F7 ++:10F3900000B05E8B0011EC03BFDE02F004C4006815 ++:10F3A0005E9B0064BB00685E9B00A4BB00B0502F56 ++:10F3B0000011E200B050330011E203BFDE02F0049E ++:10F3C000C4018760023D11E80068DE9B00A4BE0115 ++:10F3D0008760063D11E801BC60030011EA0090421D ++:10F3E000E70091EB0192C21B00B7A201B85E8A3D13 ++:10F3F00011E803BFDE02F004C4018460070011E0DD ++:10F4000001BC600300112D00B0448300142C03A341 ++:10F41000DE02F004D901BC600300178E00685E4B69 ++:10F4200005A4CA020050030004D30183E0060910BA ++:10F430004800B0412300180001BC600304B78E03EC ++:10F44000A95E02F004D800685E4B0424D801BC60B9 ++:10F450000306378E00685E4B05A4D801BC60030626 ++:10F46000B78E03BFDE02F004D801816006F577ABEA ++:10F4700000B05E0F00178500025E02F00DA701BC10 ++:10F48000600300178C01BC600300178D0323DE02AC ++:10F49000F004DA0187E0061070830185E002F5B719 ++:10F4A000AD03295E02F004EE020300C70004E90088 ++:10F4B000B050CB0010650282D0C70004E100E05AD2 ++:10F4C0002300368803BFDE02F004E200E05A270082 ++:10F4D000368900682C970024E900E05ECB0037B243 ++:10F4E000010A5ECB0017A100E050CAF4306500D0DD ++:10F4F0006006F657A200205A1AF444E903BFDE0260 ++:10F50000F004E300025E02F00F9503D5DE02F00A7C ++:10F510004C03D6DE02F00A640350DE02F004E90375 ++:10F52000BFDE02F0051002055EAF0004F00187E0C7 ++:10F530000626713303BFDE02F000020190600A86E6 ++:10F5400034310282D0C70004FA013C5027001780F2 ++:10F550000109502B001781010750070017A10182F4 ++:10F560005E86F0378100B0501F00108A00B0500F47 ++:10F5700000111603BFDE02F005000138505F0017CE ++:10F5800080010A502B0017810107D0070017A10145 ++:10F59000825E86F0378100B0502300108A00B050A0 ++:10F5A0005B001116020300C7000505020CD0030022 ++:10F5B000050502085E07000505013854070017809D ++:10F5C0000190422AA1308A028050C700050E01BC7A ++:10F5D000600305B79203BFDE02F0028F0190600660 ++:10F5E000863431020300C70004F2020CD003000489 ++:10F5F000F200B0001F0017A100E05E8680741A03BD ++:10F60000BFDE02F004F201BC600306379203BFDEE6 ++:10F6100002F0028F02055EFF00051F01856002F700 ++:10F62000F7BF032BDE02F0051F020000F3000516F2 ++:10F6300000E8002300514201BC600A2851420394B3 ++:10F640005E02F0051B00B0058B00106400685803D3 ++:10F6500000051B00B0446700111200B058030011F0 ++:10F66000150068451F00051F03A25E02F0051F017B ++:10F6700085E006F577AB00025E02F00ED70201C20C ++:10F68000E3000549020300C700052400682C970029 ++:10F690002534006E4246F6453403BFDE02F00526EF ++:10F6A000006E4247002534020300C70005310355B0 ++:10F6B000DE02F00526018060028614300138508396 ++:10F6C0000017A100B050CB001065006DDA32F42AAB ++:10F6D0004C00A84123141048011400630010650079 ++:10F6E000E041970ED06500E05A0300368001BC620D ++:10F6F0001F0011E003BFDE02F000040181E0068676 ++:10F7000034310191600E84F42703BFDE02F0054915 ++:10F71000013C50670017A101AC5E861750BA01BCCE ++:10F7200060030190B8020300C70005430068AC976E ++:10F7300000253E0181E0021710B803D5DE02F00A71 ++:10F740004C03D6DE02F00A640350DE02F0053A03F1 ++:10F75000BFDE02F0054900E82C97002B2500B05EC3 ++:10F76000CB0010B500B000630870B4028342D30030 ++:10F77000054103BFDE02F005440186E0040310A04A ++:10F7800000025E02F0015A03D5DE02F00A4C03D6F5 ++:10F79000DE02F00A640350DE02F0054503BFDE021C ++:10F7A000F0031001BC600300F0A50182E002091023 ++:10F7B0004801BC621F0011E001BC60030011EC01B4 ++:10F7C000BC600F0011E80285500B000550018260FB ++:10F7D0000209104803A0DE02F0055403D5DE02F052 ++:10F7E0000A4C03D6DE02F00A6403205E02F00556DE ++:10F7F0000188600209104803BFDE02F0000401BC6A ++:10F8000060030037A100025E02F00C5303A3DE0286 ++:10F81000F00004020050C700056201BC6003001044 ++:10F820008001826006091048018060028634310040 ++:10F8300068921F0005600104C1070017A10183DE63 ++:10F8400086F2979400E001CB00207203BFDE02F045 ++:10F85000017D00B0010B0017A1006DDE840805A238 ++:10F8600000E844640877A1006E5E840825A2018741 ++:10F87000E006F577AB020200BF000575028881AB98 ++:10F88000000575028400C70005750129500B00179B ++:10F89000A10068DE870205750282DEBB00057502E5 ++:10F8A00003C5730005740283DEB30005740282DEB3 ++:10F8B000BB00057100682B07000575006DDE2F0188 ++:10F8C000E5750182E006F7F7BF00E04465564AB1EE ++:10F8D00003BFDE02F0000403BFDE02F005A20282D5 ++:10F8E0005EAF00058501826006F577AB00B0446726 ++:10F8F00000082300B0014B0017A20208421B0005BC ++:10F900007C00B0016B0017A200685E8B00058200CE ++:10F9100090452B0097A10080DE86F457A1006E2051 ++:10F92000D60DA58200B041B700083500E020D623EF ++:10F9300028360185E002F5B7AD02055EAF0005850A ++:10F9400001BC610300113300E844650477A500B0F1 ++:10F950004467000BDA006D5E97010080020200BF71 ++:10F960000005940068DE4B06A58B0184E002F7F7E2 ++:10F97000BF0068DE4B04058E0282DEB300058E01F7 ++:10F98000BC6003000B1202045EB30005910068DE48 ++:10F990004B06259100025E02F0112300025E02F088 ++:10F9A0000F9603A3DE02F005940183E002F597AC05 ++:10F9B00001BC60131497A100025E02F000A201BC1A ++:10F9C00063830017A100A04066F437A20068DE8AB6 ++:10F9D000F425A001BC60130E77A100025E02F000C6 ++:10F9E000A200A040673FF7A200985E8B0037A200FC ++:10F9F000685E8B00059F0068DE8B0FE5A001BC6090 ++:10FA00002300104301826002F577AB03D15E02F060 ++:10FA10000002020050C30005F10325DE02F005A636 ++:10FA20000183600684F42703BFDE02F005D8020CD0 ++:10FA3000D0030005D6020300C70005C5011400630A ++:10FA40000017A1006DDE870085D601BC600300179A ++:10FA50008000B050CB00106500B050CF00106401A2 ++:10FA60008160060D906C0182600686343100B05AC8 ++:10FA7000230017A101BC600300168801BC5A2AF4B8 ++:10FA800037A101BC600300168A00B05E8700148FA6 ++:10FA900000B05A270017A101BC600300168901BC01 ++:10FAA0005A2EF437A101BC600300168B00B05E87AC ++:10FAB00000149000B05A1B00148D00B05A1F00149F ++:10FAC0008E01BC60030016040068DE030005C2025C ++:10FAD0000350C70005C10100509F00178001805EE0 ++:10FAE0000291B48D01BC5E0292149001BC600300CF ++:10FAF000378000025E02F0128100B05E0300148CB9 ++:10FB000003BFDE02F005D10068C2470005CA0181CB ++:10FB1000E0068634310191600E84F42701BC600355 ++:10FB200000143003BFDE02F0000200B0509F001747 ++:10FB3000A100025E02F0015900B05E8700142701A7 ++:10FB400086E0040310A000B04283001800010CD02E ++:10FB5000030017A10068DE870065C5010250C700D9 ++:10FB600017A101805E8684F427018AE00E84F427C1 ++:10FB700000B050BF00142603BFDE02F005D8018696 ++:10FB8000E0040310A00200509F0005D80286C107C0 ++:10FB90000005EC03295E02F005DD00B052330014CD ++:10FBA0002D00B052370017A1019E5E8684F4270015 ++:10FBB000B0509F0017A10180DE86F437A100B0503D ++:10FBC000BB00108F00B050B700108E00B0509B00EB ++:10FBD000108D01806006F4308C020250C70005EBE6 ++:10FBE00000B0524300108F00B0523F00108E00B0A2 ++:10FBF000523B00108D011A52370017A10198DE8781 ++:10FC00000437A101B85E8691B08C0182600286340F ++:10FC100031018160020D906C0325DE02F005EF01D9 ++:10FC20009C600284F42703BFDE02F005F3028550D6 ++:10FC30000B0005F100A850C70D143101BC60030092 ++:10FC4000143001816002F5D7AE0183600284F4278D ++:10FC50000185E00209104801BC600300142E03A2D4 ++:10FC60005E02F0017D03BFDE02F000040323DE022A ++:10FC7000F0065C03A35E02F0065C03A2DE02F0065F ++:10FC80005C01816006F577AB03AA5E02F0065C01B9 ++:10FC900083E0020910480351DE02F0061B02045EF5 ++:10FCA000B300060801846002F597AC0183E0020905 ++:10FCB000104800B02B5F0017A1006D2B0EF420023E ++:10FCC00000E0027B00209E01BC6003000AC300022A ++:10FCD0005E02F0112603BFDE02F000020203DEB373 ++:10FCE0000006180183E002F597AC00E02A9B002A89 ++:10FCF000A602015EBB00061800B02A9F0017A100F3 ++:10FD00006D2A9AF4261301BC6003000AA600E002E3 ++:10FD10007F00209F03A95E02F006160191601A84FD ++:10FD2000F42703BFDE02F002CC01BC63FF1FF7A182 ++:10FD300000025E02F00C5303295E02F006180191E6 ++:10FD4000601A84F42703BFDE02F0061800E0026B9D ++:10FD500000209A0180E006F577AB03BFDE02F006D3 ++:10FD6000200301DE02F0061E00685E4F06261E011B ++:10FD7000BC60030017A803A45E02F0062003C1DEE6 ++:10FD800002F0065F01846002091048020400BF000F ++:10FD9000062501BC6003001115011400630017A1C2 ++:10FDA00000E06602F4306500025E02F00DAC0182F4 ++:10FDB000600209104803A95E02F0064000685E3B3D ++:10FDC00004A63001F0DE1700378500A05E16F0971C ++:10FDD0008500685E3B0626300201500300062F02B4 ++:10FDE0008780BF00062F0185E0060910480280D0F9 ++:10FDF0000300064000B05E1B0017A300B0008B009C ++:10FE000017A4020400BF000636006E419730663624 ++:10FE100001185A030017A3011A5A030017A4006817 ++:10FE2000C18318063900E002930020A403BFDE025C ++:10FE3000F0063B006D5E2EF4863B0182E0068634C0 ++:10FE40003100E05E3300378C0068DE32F4663E003D ++:10FE5000B05E0F001785006DDE2EF4664C03BFDE2A ++:10FE600002F0065700B05E1F0017A300B0008F001D ++:10FE700017A4020400BF000646006E419730664694 ++:10FE8000011C5A030017A3011E5A030017A4006D9A ++:10FE90005E2EF486480182E00686343100E05E374B ++:10FEA00000378D0068DE36F4664B00B05E0F001739 ++:10FEB00085006D5E2EF466570185E0020910480347 ++:10FEC000D1DE02F0064E00025E02F00DA70068418E ++:10FED0008318067A020300C7000655020CD00300FF ++:10FEE0000655028350C70006550068DE4B05A6552F ++:10FEF00003BFDE02F011FF0181E00686343103BF4B ++:10FF0000DE02F005A200025E02F00DA70181600290 ++:10FF100009104803295E02F0065C028300C7001145 ++:10FF2000FF03BFDE02F005A203D1DE02F0065D038F ++:10FF3000A5DE02F005A203BFDE02F00004020650B7 ++:10FF40000300066500B001030017A1006D810AF4EB ++:10FF5000266500E844640877A1006E5E8408266583 ++:10FF60000187E006F577AB01085E4B0017A100683A ++:10FF70005E8700266800B05E0F00178500025E02F3 ++:10FF8000F00DA700685E3B06266E01BC60030017FB ++:10FF90008C0200D00300067301BC600300178D03C0 ++:10FFA000BFDE02F0067301BC600300178C02030081 ++:10FFB000C700017D020CD00300017D019C6002841A ++:10FFC000F42703BFDE02F0017D0068418318067943 ++:10FFD0000180600684F42703295E02F005A20182F5 ++:10FFE0006006863431028300C70011FF03BFDE02C2 ++:10FFF000F005A200E002970020A50181600209102F ++:020000023000CC ++:100000004801BC600300081900E0017B00A05E010C ++:10001000BC601310D7A1006D017AF4200401BC600C ++:100020001309405E03BFDE02F0000400025E02F02E ++:100030000B160338DE02F00004039EDE02F000041B ++:1000400000E8444C00F7A100E85E840117A1006AB3 ++:10005000DE8401068A00E85E8401118701BC60032A ++:1000600000118801A5E02230118001BC600300115D ++:100070001301BC600300111400B044670017A10015 ++:10008000B0446B0017A200B05E8700110400B05EA0 ++:100090008B00110503B8DE02F0068C03BFDE02F010 ++:1000A000000401BC600304B79201BC60030417A103 ++:1000B00001BC63FF1FF0CB01BC63FF1FF0CC01BC90 ++:1000C00063FF1FF0CD01BC63FF1FF0CE01BC63FFD7 ++:1000D0001FF0CF01BC63FF1FF0D000B0521700101B ++:1000E000E801BC63FF1FF0C800B0521B0010E9011B ++:1000F000BC63FF1FF0C900B0521F0010EA01BC63CF ++:10010000FF1FF0CA01BC60030010E4028600C300B8 ++:1001100006AD00B0540F0017A20069DE8A9086A5D4 ++:1001200000E85212F450E40068A0630006AD01BC80 ++:1001300060030010E400B054270010E000B0542F1A ++:100140000010E103BFDE02F006B603A4DE02F008F1 ++:10015000AB03A9DE02F008AB01BC600301D7A1022A ++:100160000600C30006AF0280DE5F0006B400B05494 ++:10017000070010E0006820630006B201D2DE86A00E ++:1001800030E000B0540B0010E103BFDE02F006B611 ++:1001900001BC5E869010E001BC601F0010E101BC54 ++:1001A00060030010E200B052230010E501BC63FFC1 ++:1001B0001FF0C500B052270010E601BC63FF1FF01E ++:1001C000C600B0522B0010E701BC63FF1FF0C70050 ++:1001D000B0004700108601082063001781013852E3 ++:1001E000030017800102C0270017A600025E02F07C ++:1001F0001198006820630046C400B05407001780BF ++:1002000000025E02F00D8D006820630026CD0068BC ++:10021000A0630006C8021A54070006CD006800A7B4 ++:100220000106CB0103C0270017A103BFDE02F006C1 ++:10023000CC0106C03B0017A101825E8610D0860368 ++:10024000A9DE02F008EB00685E4F0426DF01BC6304 ++:10025000FF1FF0C300685E4F05A6D501BC60031AFE ++:1002600090E301BC600306B79200685E4F0526DF8D ++:1002700003BFDE02F006D901BC6003063792029884 ++:1002800044070009C0028046070009C001BC6003A2 ++:100290001890E300B0206300178100025E02F00DA9 ++:1002A0009A00E85E8400D7A1006A5E869086DF002F ++:1002B000E85212F430E403BFDE02F006E201BC6053 ++:1002C000030010E40338DE02F006E20187E0061CBA ++:1002D00090E40190600A09104801BC610304379161 ++:1002E00000685E4F05A9C003835E02F008AB03BF40 ++:1002F000DE02F0000201866002F7F7BF0182E00231 ++:10030000F5B7AD0185E002F5B7AD02044163000623 ++:10031000F2018460020B105802055EAF0006EE0188 ++:1003200087E006267133020400BF0006F10185E074 ++:1003300002F577AB00025E02F00ED703BFDE02F0DB ++:1003400000020283C0370006FA006CC4656C26FB0D ++:1003500001BC601B1A77A100025E02F000A20180BE ++:10036000E0060337A200025E02F000A80180E0026E ++:10037000F457A200025E02F000A800E044656C4B56 ++:10038000610285C52300070A018460060B1058022C ++:1003900000DEFF0007010180E002F7F7BF00682BD5 ++:1003A0006F00070100E044655B4ADB0207AC0F0009 ++:1003B000070A0280456F00070A01BC63FF1FF7A10F ++:1003C0000068DE862C270A01BC60130217A1000218 ++:1003D0005E02F000A201882C0E0337A200025E022A ++:1003E000F000A801BC6003000B0302055EAF00072C ++:1003F0000C01BC6103001133020580BF000712012C ++:10040000BC60131157A100025E02F000A2019660C9 ++:100410000E03301900B040670017A200025E02F020 ++:1004200000A80283C03700000400E0021F002087FC ++:100430000182600628914403BFDE02F000040281BD ++:100440004013000002020042030007190184600209 ++:10045000F597AC01BC600300108003A3DE02F00737 ++:100460001C0190600209104800B0446700179E000C ++:10047000B0446B00179D00B0446F00179C00B0445F ++:100480007300179B0068DE7A23271C00E00223001C ++:1004900020880115403B00179700B001430017A1C9 ++:1004A00001C9DE8405280501BC6003107795019120 ++:1004B000E0020D906C0286403700072A00E002BB84 ++:1004C0000020AE03BFDE02F00A8A01BC6003001404 ++:1004D0008001BC600300148101B8600A049024010B ++:1004E000BC600304082B01BC600300482A01BC6007 ++:1004F0000300D02A01B3600700100401BC600300B0 ++:10050000080E01BC600300080F01BC600300081066 ++:1005100001BC60030008110183E002F5D7AE028739 ++:10052000C037000A8600025E02F0117A00025E0205 ++:10053000F00F9503435E02F00736006D403300CAAA ++:10054000F700685E5F00474E00685E5F00274B0063 ++:100550006800A700C740006800A701074000688046 ++:10056000A700A74100E0446690283701BC62C300A1 ++:1005700017A102805203000744019652030017A1FD ++:100580000080DE8690379A0203520300074900E09C ++:100590005E6A90379A0207D20300074900E85E6B53 ++:1005A00000379A029E5E6B000AF703BFDE02F00777 ++:1005B000530152D2030017A10185D206F4379A03E2 ++:1005C000BFDE02F00753013C52030017A101BC52E9 ++:1005D00006F4379A006E5E680BAAF700682FC30016 ++:1005E0000753028E5207000AF70204C03B00075D62 ++:1005F0000181E0060D906C02874037000A8A0002F4 ++:100600005E02F0117A00025E02F00F950287C0AF21 ++:100610000007550287C0AF000A86015840AF001797 ++:100620009A01BC603F1E17A1006DDE6AF42A8603A2 ++:100630005B5E02F0075F01BC601300104300B04135 ++:100640002328104801806002F297940184E0020997 ++:100650001048015840AF00102A006840AB002A86BD ++:1006600001BB5E5600900402035E5700076E020055 ++:1006700047A300076B01BC621E3C11E001BC600394 ++:100680000011EA00B05E6B0011EB0198601E3D1195 ++:10069000E8020047B300076E00B05E6B0011EF0187 ++:1006A000B0E0CE3D91EC03835E02F0077200025E83 ++:1006B00002F0117A00025E02F00F95006D403304E3 ++:1006C000C76E03AADE02F0078E01BC63FF1FE4863B ++:1006D00001BC601B19D06401BC600300B7A101BC60 ++:1006E00063FF1FE66D00E04186F4306501BC63FFE7 ++:1006F0001FF60000E05E870077A100025E02F00CAA ++:10070000AE0200C077000784012940770017A200DD ++:100710006D5E8B04C78200E85E8B04D60001BC606E ++:100720001B0FF06300E0418EC01063010C56030004 ++:1007300004860068DE8701678400B05E8B00066D6A ++:10074000006DDE8701C78700E0419300306403BF7E ++:10075000DE02F0077703B05E02F0078D01836002CE ++:100760000D906C00681B3BFFE78E01BC601B0FF017 ++:100770006500E04194D9D06502005A0300078E015C ++:100780008360060D906C0020402F08A79001BC608C ++:100790000300048601BC60030008020188E00F002A ++:1007A0000803006D40330208A50129520F0017937A ++:1007B0000109520F0017AA01966002F2979400E017 ++:1007C000418701F06501BC600F0017A10028DE869B ++:1007D00090679C01866006F2979400E04197007054 ++:1007E0006500E020AF00C82B01065E530017A20091 ++:1007F000A05E4F0477A10068DE870447AA0186E067 ++:1008000006F2979400B85E8B0037A200B05A03003E ++:1008100017A0020ADA030007A401876006F2979482 ++:100820000284C03B0007AA0203DA030007AA03AB55 ++:100830005E02F007A8020441070007AA01806005D4 ++:1008400000680301065E530017A20182DE8A009051 ++:100850000403AADE02F007DB03AB5E02F007C50269 ++:1008600087D2130007DB00B0521300118601A5E008 ++:100870000A301180018460020D906C01BC63FF1F7F ++:10088000F79900B01B430017A20068DEAB0027B742 ++:1008900000A05E4FFF77A10068DE870727C303BF74 ++:1008A000DE02F007B90284520F0007C30204D20F20 ++:1008B0000007BC03B15E02F007C200B01B3F001787 ++:1008C000A203BFDE02F007BD03B35E02F007C2025F ++:1008D0000052170007C300685E8BFFE7C300E0010A ++:1008E0005EF4506502015A470007C300B019B70013 ++:1008F0001799018460060D906C020052170007DB07 ++:1009000003315E02F007DB01866002301180018056 ++:10091000E001620B10020052170007C90202AB4F40 ++:100920000007D60068DE5F0007D600B02BB70017BF ++:10093000A100682ABB0007D600B02BB30017A200A5 ++:100940006DAABAF447D60068DEAB0047D2006D2B23 ++:10095000BAF427D100B02C6B000B190184E006F724 ++:10096000F7BF0068DE4F0287D600025E02F0130C6C ++:100970000206DEFF0007D600E02BE7002AF9006838 ++:10098000DE5F0007D90068DEAB0047D90180E005D3 ++:10099000620B1000682B6F0007DB0180E006F7F7A1 ++:1009A000BF0207520F000856028047A300085302F7 ++:1009B0008047B300085300E020AF00882B00E820F8 ++:1009C000AB00882A01BC60030011E401BC63FF1F77 ++:1009D000F7A501BC600303D1E102065E530007E501 ++:1009E00001BC60030491E10206DE530007E900E068 ++:1009F00047870051E10207D20F0007E900E047876F ++:100A00000091E1006D403302C8A500685E4F058784 ++:100A1000EC0068DEAB00485603AB5E02F007EF0265 ++:100A2000005217000856020580F30007F500681908 ++:100A3000B7FFE7F200B019B70017A500E05E970016 ++:100A400097A50068DE97FFE7F50280521700085669 ++:100A5000020700BF00085601BC601F1417A20090D7 ++:100A6000478700306500E04196F4506500E0478715 ++:100A700001082103835E02F007FD00025E02F0110F ++:100A80007A00025E02F00F95006D40310427F900F4 ++:100A90006D40310428A501BC600B1D57A10068DE24 ++:100AA00097FFE80D010F5A070017A5031EDE02F09D ++:100AB000080D0200521700080D032C5E02F00856C4 ++:100AC00000685E67FFE80D00E05E6700979900E050 ++:100AD0005E66F43064012A58030017990100DE971E ++:100AE0000017A500E05E66F4B79900E05E67003786 ++:100AF00099011558030017A603BFDE02F0081D0078 ++:100B0000E05E96F43064012A5803001799020580CC ++:100B1000F300081C0182E002F3379902005217002B ++:100B2000081C0116D8030017A6010F5A070017A4C6 ++:100B3000010CD8030017A10068DE92F4281800E029 ++:100B40005E6702179903BFDE02F00821010DD8038A ++:100B50000017A10068DE92F4285600E05E670417D3 ++:100B60009903BFDE02F00821011058030017A60008 ++:100B700068DE9B00C8210181DA030017A100B85E7E ++:100B800086C017A10281DE8700085600885E6700D4 ++:100B9000778000E000AEF0106401AADE6500480234 ++:100BA0000068DE9B00483B0207818700082E006D2D ++:100BB000DE030C082E0285520F00082E0298523BCD ++:100BC00000082E0181E00500680300E05E000B379D ++:100BD000A300E05E8F0097A300E041870077A200AA ++:100BE000025E02F00DE800E820AB01082A01BC60BB ++:100BF0002307978100885E970077A100E85E86F45E ++:100C0000B06301BC60070E17A100E0418EF43063B1 ++:100C100000B056170017A100B0561B0017A20068BD ++:100C2000DE86D048560068DE8AD0685600025E0232 ++:100C3000F00DBD01BC602307506401BC624F00177A ++:100C4000A200025E02F00E1000685E9B0048530195 ++:100C5000BC621EF471E00068DE9B00C84601BC6106 ++:100C60001300B7A1020600F300084201BC601300A4 ++:100C7000B7A101BC60030011EE00B05E6B0011EF84 ++:100C80000192E00EF431EC03BFDE02F0085300687D ++:100C90005E9B0068480068DE9B00A85301986006D0 ++:100CA0003D11E800E020AF00882B00E820AB008871 ++:100CB0002A01BC60030011EA0068DE5F00484E00B4 ++:100CC000B05E6B0011EB0192DE5E3D11E8018760C2 ++:100CD000023D11E80068DE9B00A852018760063DD6 ++:100CE00011E8019860163D11E80181E00500480215 ++:100CF00001AADE6500480203BFDE02F0085B01BC0A ++:100D0000620F0011E001BC60030011E40181E00109 ++:100D100000680301BC600F0011E801BC6003001112 ++:100D2000EC0200200F00086200E020AAF3482A002D ++:100D3000B020AF00102500E820AA04A82A006AA06D ++:100D4000AB01C86201B860060490240182E006F29B ++:100D500097940188600A00900401BC60031877959D ++:100D600003A0DE02F0086F00685E4F06A874013829 ++:100D7000520300178000B05E5F0017810203DEB7E8 ++:100D800000086E00685E0700086D01BC6003017713 ++:100D90008001BC600300378103BFDE02F0086E01F2 ++:100DA000BC600301578000025E02F000AF0068DE05 ++:100DB000AB00487400A05E4F0477A100685E870016 ++:100DC0004A3500685E87044A3503BFDE02F00BE94E ++:100DD0000386DE02F00A870287C037000A86000217 ++:100DE0005E02F0117A00025E02F00F9503035E02CC ++:100DF000F0087403A9DE02F0088000025E02F01120 ++:100E00007A00025E02F00F950207403700087A036D ++:100E100086DE02F00A870287C037000A8600025E7B ++:100E200002F00C60006E40300208AB0301DE02F0FD ++:100E300008AB0068DEAB000892032B5E02F0088668 ++:100E400000E0022B00208A03BFDE02F0088A028045 ++:100E5000521700088900E0024300209003BFDE0221 ++:100E6000F0088A00E0025700209500685E4F040BEE ++:100E70006900685E4F028B6900685E4F0209C70017 ++:100E8000685E4F048A2E00685E4F050BDA00685ECC ++:100E90004F060BDA00685E4F068BE303BFDE02F0FD ++:100EA0000BE90068DEAB0028A3032B5E02F0089676 ++:100EB00000E0022F00208B03BFDE02F0089A0280C0 ++:100EC000521700089900E0024700209103BFDE029C ++:100ED000F0089A00E0025B00209600685E4F06A9C9 ++:100EE0009B00685E4F042C0100685E4F04AC01005B ++:100EF000685E4F05AA3B00685E4F06299B00685E4E ++:100F00004F052BD800A05E4FFF77A100685E8707D2 ++:100F10002BF403BFDE02F009C000E00213002084BE ++:100F200003BFDE02F009C400E0020F00208301BC11 ++:100F300060030011EC01BC600F0011E80284C03BAB ++:100F40000008560184E00609104803BFDE02F008DD ++:100F5000560200C09300000203A35E02F008AF0334 ++:100F6000C35E02F008AE03BFDE02F00AF300025EC9 ++:100F700002F0117A00025E02F00F950207C0AF0086 ++:100F800008B3020740370008AF0107C0AF0017A140 ++:100F900000B85E870037A101825E860D906C00B0BC ++:100FA000447F000804018360020910480287C037AB ++:100FB000000A860386DE02F00A8700025E02F01154 ++:100FC0007A00025E02F00F9503435E02F008B80259 ++:100FD00087C037000A860301DE02F008D303305EC3 ++:100FE00002F008D301BC601B1F506500E04194DF94 ++:100FF0003065012D406B0017A200885E8B0137A27F ++:101000000138402B001680028840270008C7018461 ++:101010006006D0168000B05A02F456800205C02740 ++:101020000008CA0187E006D0168001BC601B0DD7FE ++:10103000A100025E02F000A200B04067001681012C ++:10104000BC601B0DF7A100025E02F000A200B040E0 ++:101050006700168200E01BE70066F900691BE701E4 ++:1010600088D301BC60030006F90280200F0008D578 ++:10107000006E40300209960381DE02F008DF00E0D6 ++:10108000021700208503A9DE02F008DB0184E006D8 ++:101090000910480180E0020910480184E002F7F7D6 ++:1010A000BF0386DE02F00A87018060050048020166 ++:1010B000806006F2979403BFDE02F009620183604C ++:1010C00002F7F7BF0386DE02F00A87032B5E02F009 ++:1010D000090503A9DE02F008E80068DEAB00490557 ++:1010E00000B0523B00179F00B0523B0017BE01BC3E ++:1010F000600300280E03BFDE02F0090502875E537D ++:1011000000091203A0DE02F008F403BFDE02F006BD ++:10111000920182E0060D906C0190600A091048006F ++:10112000B0523B00179F00B0523B0017BE019E5EBD ++:101130008300B0EB0106520F0017A100B85E8700D4 ++:1011400037A10182DE86F577AB01BC6103003080F8 ++:1011500000E8523AF3F7A2006BD23AF3E8F700E85E ++:101160005E7E91D7A200905E8B0097A101BC6023A8 ++:1011700001D064006B523AF3E90201185E87001750 ++:10118000A2010A5E870017A300886006F457A20038 ++:10119000E04192F4706400B05802F45600006BDE37 ++:1011A000FA91C90500B0523B0017BE03BFDE02F042 ++:1011B000090500025E02F011EA00B0203B00280E93 ++:1011C00000B0523B00179F0320DE02F00912020715 ++:1011D0005E530009090180E00209104803BFDE02E6 ++:1011E000F009120068DE5F00090F021A54070009B7 ++:1011F0000D0103C0270017A101825E8610D0860171 ++:1012000002C0270017A100E0422AF4308A0180E0E2 ++:101210000500480203A9DE02F0091200B05E470093 ++:10122000108001085E4F0017A100685E8700293614 ++:1012300003AB5E02F0093A0200521700092500686C ++:10124000DEAB00491800E0025300209402865E5392 ++:101250000009620284520F000AF70284D20F0009CB ++:101260001D03AC5E02F0092303BFDE02F0092E036A ++:101270002C5E02F0092E00685E4F0409230106D29D ++:101280000F0017A10080921B0197A200E0015E0DE4 ++:10129000B0640181DE86C3F61F00685E4F020962FA ++:1012A00003BFDE02F00952031EDE02F0092B0331F8 ++:1012B0005E02F0092B0068DEAB00492B0080921B18 ++:1012C0000197A200E0015E0DB0640181E002C3F667 ++:1012D0001F0068DEAB00493000E0023F00208F03B2 ++:1012E000BFDE02F0093300685EAB00493302805272 ++:1012F0002F0009620202410700093300685E4F04B3 ++:10130000096200685E4F0289620284410700096237 ++:1013100001806006F2979403BFDE02F00962032B9E ++:101320005E02F0096200685E4F05A95200685E4FD8 ++:1013300005295203BFDE02F009620068DEAB0049F6 ++:101340004201BC6003000ABD01826002F5D7AE0213 ++:10135000805EFF00094000682B6F00094200E044F6 ++:10136000655B4ADB00682B8BFFC94200E02B8B00DA ++:101370002AE202065E5300094500E002630020985D ++:1013800003BFDE02F009620323DE02F0094D0129EA ++:10139000500B0017A30068DE8F05294D0187E0027E ++:1013A0001070830184600209104800B05E87001746 ++:1013B000A1006EE00300294C03D1DE02F0094D00CC ++:1013C00068DEAB00494F00E0022700208900685E1C ++:1013D0004F00096200685E4F01096200685E4F05B8 ++:1013E0008962028047C70009940329DE02F0095888 ++:1013F0000102DEAF0017A10106520F0017A200384C ++:101400005E86F449620182DE8AF577AB00B0522332 ++:101410000011F200B052270011F300B0522B00115E ++:10142000F40106520F0017A100E05E870031F500BD ++:10143000B0005B0011F000B047C30018000134C7D2 ++:10144000C70017A1006EDE8402A96201BC60030818 ++:1014500010420283C1070009660301DE02F009653C ++:1014600003B55E02F0096602805E53000AF700B021 ++:1014700040330017A10108A00F0017A200685E8B7F ++:1014800000696E00E840310577A10281200F000954 ++:101490006E00B020AF0017A10280A00F00096E00FF ++:1014A000B05E630017A1006E5E8402099600B05E14 ++:1014B000870007FA018160010048020202C01300A0 ++:1014C000097400E05E840347FA0181600500480268 ++:1014D0000201200F00098F01035E530017A101874D ++:1014E000DE850048020386DE02F00A8700025E0203 ++:1014F000F0117A00025E02F00F9503855E02F0099A ++:1015000077018E60023D11E80107C7830017A10132 ++:10151000825E850048020201A00F0009810103C715 ++:10152000970017A101825E8500680300B0204B0080 ++:1015300017A1018E5E850068030207C0AF000C444E ++:1015400001BC60030011EC01BC600F0011E80184D4 ++:10155000600500680300B040270007FC00B0402B86 ++:101560000007FD00B0406B0007FE00B0406F0007B1 ++:10157000FF0184600500680300025E02F00C600158 ++:10158000BC63FF1FD7A800025E02F00DAC00025E34 ++:1015900002F00C4401A8600A0090040201200F0030 ++:1015A00011D500A8401300500403BFDE02F005F877 ++:1015B00000E002870020A103BFDE02F0099700E0EF ++:1015C000020B00208203A9DE02F00AF70184600604 ++:1015D0000910480184E00609104803BFDE02F00A42 ++:1015E000F7032B5E02F009B80068DE4F06A99F00E2 ++:1015F000E0023B00208E03BFDE02F009A000E00203 ++:101600003700208D0323DE02F009C00068DE4EF1B2 ++:10161000C9C00187E002107083018460020910488C ++:1016200000B05E870017A1006EE0030029A603D179 ++:10163000DE02F009A700685E4F0629B601BC600310 ++:10164000000AA603295E02F009AC0203DEB300091A ++:10165000AD0191601A84F4270183E002F597AC0292 ++:101660000200BF0009B50203456F0009B00185E023 ++:10167000062B715B02045EB30009B50187E002101E ++:1016800070830183E00209104800025E02F0112716 ++:1016900003BFDE02F009C00205500B0009C0018241 ++:1016A000600609104803BFDE02F009C0028700C3CC ++:1016B0000009BD0068DE4F06A9BD0068D21300090D ++:1016C000BD01BC600300118301BC600300118200F6 ++:1016D00068DE4F0629C000E0024F00209303BFDE02 ++:1016E00002F009C003AB5E02F009C2020441070028 ++:1016F00009C5028341070008AB03BFDE02F009C53C ++:10170000028441070008AB01806006F2979403BF92 ++:10171000DE02F008AB039F5E02F009CA039EDE0200 ++:10172000F00BE902035E53000BE902048143000958 ++:10173000CE010001630017A10102C0270017A2001B ++:1017400038DE86F449C403AB5E02F009D0020052D1 ++:10175000170009C40280522F0009D203335E02F041 ++:101760000BE902181B330009F201BC601F15F0657C ++:1017700001BC60031BB7A400025E02F000E900B0E8 ++:101780005E8F0017A60068DE931BA9EE0207C197C3 ++:101790000009DF01385A070017A1013C5A0700175A ++:1017A000A201BC5A0AF457A2013C5A0B0017A3012C ++:1017B000BC5A0EF477A303BFDE02F009E2013C5AE3 ++:1017C000030017A100B05A070017A200B05A0B007F ++:1017D00017A3006D5E870089E801BC61BF0A17A5E9 ++:1017E0000068DE8AF4A9E801BC60271357A50068E9 ++:1017F000DE8EF4A9E803BFDE02F00A2A00D85E8775 ++:101800000037A100E14196F4306500E1C197003056 ++:101810006501F041970017A200E05E8B0077A200FF ++:101820006D5E8AF4C9D500E840330097A5006E5E6E ++:1018300096004A2A00B01B2F0017A10068DE840A18 ++:101840000BE9023C523F000A03013C523F0017A142 ++:101850000068DE84048A2801BC600316106401BCA1 ++:10186000601F16106500685E870029FF00B05A03EC ++:101870000017A20068DE8AC00A2800E04197003005 ++:101880006500E0419300306400E85E870057A100E6 ++:101890006A5E870029F800685E87000A0401385AEA ++:1018A000030017A1013858030017A20068DE86F470 ++:1018B0004A2803BFDE02F00A040285C107000BE9D3 ++:1018C00001BC601F15F06501BC600305B7A40002F0 ++:1018D0005E02F000E9028000C3000A2801BC601328 ++:1018E00010D7A600E0017F00B7A5006D5E96F4CA90 ++:1018F0000C01BC60130957A500685E940BCA2C004C ++:10190000B0017B00106500B052270017A200B05252 ++:101910002B0017A3006841940BEA170068DE8ED0F5 ++:101920004A1300685E8AD02A2800E0419700B0651B ++:10193000006D4196F4CA1001BC601309506503BFE5 ++:10194000DE02F00A1000E0028B0020A200B0017F4E ++:1019500000106500B0522300168000B05227001618 ++:101960008100B0522B0016820080921B0197A200CA ++:10197000E0015E0DB0640203587F000A2101BC60E3 ++:101980002F0037A103BFDE02F00A2201BC5202F28F ++:10199000F7A101A95E02F436830090446701168422 ++:1019A000020281AB000A260068DE9305AA270184A3 ++:1019B0006006D0968400B05E9700005F020781AB9E ++:1019C000000A2A01806006F2979403AB5E02F006DB ++:1019D000AA03BFDE02F008AB00E0028F0020A303E1 ++:1019E000BFDE02F009C4039EDE02F00BE903AB5E2A ++:1019F00002F00A31020052170009C403335E02F0FC ++:101A00000BE901846006F2979403AB5E02F006AA2C ++:101A100003BFDE02F008AB03835E02F00A38000267 ++:101A20005E02F0117A006D4033038A35006D403359 ++:101A30000389C4032B5E02F00BED03BFDE02F00648 ++:101A4000AA032B5E02F00A3E00E0023300208C0362 ++:101A5000BFDE02F006AC00E0024B0020920103C0A2 ++:101A60002700178101825E0503178100025E02F0E4 ++:101A70000D9A008800230037A200E05E8800F7A2DC ++:101A800000E05E86F451890186E00630118003BFD4 ++:101A9000DE02F009C003A2DE02F0008103A3DE0231 ++:101AA000F00A6400E001FF00207F01BC6003001722 ++:101AB000A303BFDE02F00A66018760040310A001E1 ++:101AC000BC60030051E400B0479300180001BC6003 ++:101AD0000302900401BC620F0011E001BC600F0121 ++:101AE00031E800B047A300180001BC600F0011E806 ++:101AF00001BC60030131EC00B047B300180001BC29 ++:101B000060030011EC018460060910480020601E8B ++:101B1000090A5B00E001FB00207E03BFDE02F00A41 ++:101B20006C01BC60030ED7A1011400630017A20072 ++:101B3000E05E86F4506500E05A0300368002030040 ++:101B4000C7000A6103A95E02F00A660291509F0075 ++:101B50000A650191601A84F42703BFDE02F00A656A ++:101B600000E001FF00207F01BC60030037A30323D6 ++:101B7000DE02F00A6C0183E0020910480184600271 ++:101B8000F597AC01BC600300178E0187E00210706E ++:101B9000830182600209104803D0DE02F00A6D035F ++:101BA000D05E02F00A6E0182E00209104803D5DE21 ++:101BB00002F00A7001BC60030010B401BC600300B5 ++:101BC000F7A1006800A7000A740185421AF437A142 ++:101BD00000025E02F000A200B040670017A501BC41 ++:101BE00063FF1FF7A200025E02F000A800886007F2 ++:101BF0000157A400B85E86F497A100025E02F000CF ++:101C0000A80283C21F000A7B00E044670117A102FB ++:101C1000044523000A80006B4466F42A7D00025EBE ++:101C200002F0116100685E8F0000020020E01E09D2 ++:101C30000A8400B05E9700142E03BFDE02F002CCCF ++:101C400000A8412300F04803BFDE02F00002018338 ++:101C5000600209104801BC6007001042006E40306D ++:101C6000020A8A00E0027700209D00025E02F01264 ++:101C7000A703A35E02F008AB03C6DE02F00A8D01E3 ++:101C800084E00609104803BFDE02F00AF70068206E ++:101C9000E3000A9500E844650717A101BC609F02B4 ++:101CA00017A2006D5E86F44A9501BC6003000838F7 ++:101CB00000025E02F00B160020E10209007C002009 ++:101CC000628A090A9900025E02F0117A03BFDE02FD ++:101CD000F0007C0284452300007C03915E02F0004A ++:101CE0007C0396DE02F0007C03965E02F0007C002E ++:101CF000025E02F00B1601BC600300602000680168 ++:101D000073000AAF00025E02F000D400B044670026 ++:101D1000083800B001730010E401BC600300000645 ++:101D200001BC600300005C01BC600301D78201D2EA ++:101D3000DE087570E000B00EB30010E100B000479F ++:101D400000108600B00ECF00108A01BC600300377F ++:101D50008100025E02F00D8D0190600A09104801B9 ++:101D6000BC610300308003BFDE02F0000201BC60F2 ++:101D7000030030420187E00224712300025E02F07A ++:101D8000109301BC600306778000680DEF000AB66F ++:101D900000B00DEF00178100025E02F00E440397C1 ++:101DA0005E02F00B2703125E02F00AB601BC60036C ++:101DB00000402001BC618300112500B0007B0011B0 ++:101DC0002701BC600702578000025E02F00E3F0050 ++:101DD000B05E07000B3001BC600702778000025E36 ++:101DE00002F00E3F00B05E07000B3101BC6013092A ++:101DF00097A100025E02F000A200B04067000B63F2 ++:101E000001BC601309405E01BC601309405F0180A2 ++:101E1000E006F5D7AE0107C1070017A101805E8675 ++:101E2000F577AB01BC600F0011E801BC620F001137 ++:101E3000E000025E02F00AD801BC61CF0C105C0128 ++:101E4000BC600300105D01BC61CF01F05E01BC60AD ++:101E50003B0AF05F00025E02F0106301BC60030009 ++:101E60000835020300C700000401BC60030006023D ++:101E700001BC600300060701BC600300060C01BC46 ++:101E8000600300061103BFDE02F0000401BC6043E2 ++:101E90000017BB00A04122F770480185E002F5B7AA ++:101EA000AD01BC63FF1FF05401BC63FF1FF055017F ++:101EB000BC63BF1FF05601BC63FF0FF05700025E0A ++:101EC00002F012A70187E00624712301BC60030021 ++:101ED000105401BC600300105501BC600300105693 ++:101EE00001BC600300105701BC600F002017010601 ++:101EF000C1070017A101825E8402E01701074107B4 ++:101F00000017A100B85E870037A10180DE870000BE ++:101F1000160002DE02F000000285C0370000020059 ++:101F2000025E02F0117A00025E02F00F9502864016 ++:101F300037000AEC00E0021B0020860386DE02F078 ++:101F40000A870287C037000A870158600300102AF9 ++:101F500001BC600300900400B040130017A103BF50 ++:101F6000DE02F0000401B8600A04902403AA5E02B5 ++:101F7000F00AFA0158600300102A01BC60030290C5 ++:101F80000400B040130018000183600209104801EA ++:101F9000BC60030051E400B0479300180001BC622C ++:101FA0000F0011E00180600100680300025E02F092 ++:101FB0000F9503855E02F00B0101BC620F0011E07A ++:101FC00001BC600F0131E800B047A300180001BC5C ++:101FD000600F0011E801BC60030157A100E85E87B3 ++:101FE0000037A10068DE87000B0801BC6003029087 ++:101FF0000400B0401300180001BC60030131EC0084 ++:10200000B047B300180001BC60030011EC0324DEEC ++:1020100002F005F801866006F577AB00025E02F07B ++:102020000B160180600610308100B05E870017A19A ++:102030000180600210308103BFDE02F005F801BCB0 ++:10204000610300108000B04203001800006EE0033E ++:10205000002B1903505E02F00B1C00015E02F00021 ++:102060000003BFDE02F002F401846002F597AC00C9 ++:10207000A8412304F048018260020910480206DEEC ++:10208000AF000B2203D5DE02F00B220350DE02F07C ++:102090000B2001BC60030010B40284C783000B2531 ++:1020A00001BC600B0011E0018E6002F577AB00020D ++:1020B000DE02F0000003A2DE02F0007C02BC4287D8 ++:1020C000000B2E01BC60030037A401BC60031FF7A6 ++:1020D000A3011400630017A200886006F457A2034E ++:1020E000BFDE02F00B33008860070117A401BC6358 ++:1020F000FF0017A3011400630017A200E05E8B012C ++:1021000017A200886006F457A201BC601311106585 ++:1021100001BC601B02506401BC60030017A50020D5 ++:10212000C286F48B3D00E0419706D06500E0419304 ++:1021300001F06400E05E970037A500885E930037E9 ++:10214000A400205E92F46B5C03BFDE02F00B36004D ++:1021500068DE92F44B4200680083006B4203A0DE0D ++:1021600002F00B420020C123160B3700025E02F082 ++:102170000B16006DDE93200B58020300C7000B4CBA ++:10218000006DDE97008B4C01BC600300160801BC9B ++:10219000600300160901BC600300160A01BC60035D ++:1021A00000160B01BC600300160C01BC6003001696 ++:1021B0000D01BC600300160E02005AC3000B57024B ++:1021C0003C5A9F000B5700680083006B570385DE65 ++:1021D00002F0007C03855E02F0007C03A2DE02F0C8 ++:1021E000007C03A3DE02F0007C0397DE02F0007C9B ++:1021F00000B041970010600191600A84F42703BF8A ++:10220000DE02F002CC01806002D616B000B05E9310 ++:102210000010A101836002F7F7BF01BC600300302A ++:102220004303BFDE02F00B370068808300607C034D ++:10223000BFDE02F00AB70283C21F00000200B05ED8 ++:10224000870017A103D0DE02F0051001BC60030473 ++:102250001042039EDE02F0000400B05E3F00114514 ++:1022600001BC600300178F00B05E4300178500B00B ++:102270005E0F00179000025E02F00B1603BFDE0235 ++:10228000F00004006D40330589C503AC5E02F00B1D ++:102290006E00685E4F028BC000E002670020990369 ++:1022A000BFDE02F00BC000685E4F028BC000E00290 ++:1022B0005F00209701856002F5B7AD01826002F5ED ++:1022C000D7AE01BC6003000ABD039EDE02F00B82A4 ++:1022D0000321DE02F00B8200E0026F00209B00026F ++:1022E0005E02F00B16018660020910480180600250 ++:1022F0000910480181E00209104801BC6003021086 ++:10230000420280441F000B8100B05E3F0011450176 ++:10231000BC600300178F00B05E4300178500B05EFD ++:102320000F00179003BFDE02F00B8200A044B6F04E ++:102330007145028200C3000BC000B000730017A1FA ++:1023400000E05E86B017A100E15E7AF4379E00E1FE ++:10235000DE7700179D00E1DE7300179C00E0DE6F62 ++:1023600000179B039EDE02F00B91006E5E6E924B97 ++:10237000D6006D5E6E924B91006E5E72922BD6000F ++:102380006D5E72922B91006E5E76920BD6006D5E42 ++:1023900076920B91006DDE7A91EBD6028201AB0052 ++:1023A0000BA200B0446700083400B0446B0008334F ++:1023B00000B0446F00083200B04473000831006878 ++:1023C000A0D2232B9100E920D2F3D79E00E9A0CE22 ++:1023D000F3B79D00E9A0CAF3979C00E8A0C6F37785 ++:1023E0009B00E15E7A91F7A100B05E8700111900B1 ++:1023F000E1DE7692111A00E1DE7292311B00E0DE1E ++:102400006E92511C0068DE86232B9B03BFDE02F018 ++:102410000BC000E9523EF3D7A100E9D242F3B7A2C4 ++:1024200000E9D246F397A300E8D24AF377A40088E4 ++:10243000121B0057A500E0015EF4B06400E95E865F ++:10244000C9A6D200E9DE8AC9C6D300E9DE8EC9E694 ++:10245000D400E8DE92CA06D50080921B0197A50140 ++:10246000BC601B11778000E05E020DB06500885AE9 ++:102470000F00B7A500B05E970217A50125DA0F007F ++:1024800017A600E95E94DA57A500E8DE98DA77A689 ++:10249000017ADE96F4D7A500685E96D06BC000E89E ++:1024A0005E96D077A600B05E9700168300685A1338 ++:1024B000000BBA00E05A16F4D68500685A1B000BD0 ++:1024C000BC00E05A1EF4D68700B05E8700164D00AF ++:1024D000B05E8B00164E00B05E8F00164F00B05EEF ++:1024E00093001650031EDE02F00BD6039F5E02F02F ++:1024F0000BD600685E4F028BD6032C5E02F00BD623 ++:1025000001BC601F16B06501BC600300B7A40002E7 ++:102510005E02F000E90068DE9300ABD60207C197C7 ++:10252000000BCC013C5A07001788013C5A0B0017DE ++:10253000A103BFDE02F00BCE01385A070017880155 ++:10254000385A0B0017A10080921B0197A200E001EE ++:102550005E0DB06400B05E230016280181DE86C3E4 ++:10256000F61F0187DE86249124020680F3000BD635 ++:102570000181E002C3F61F0187E00224912403AB2E ++:102580005E02F006AA03BFDE02F008AB032B5E0278 ++:10259000F009C403BFDE02F006AA03AB5E02F00B33 ++:1025A000DD032C5E02F009C403BFDE02F00BED0078 ++:1025B000B052230011F200B052270011F300B052C4 ++:1025C0002B0011F401BC60030091F500B0005B002A ++:1025D00011F003BFDE02F006AA0138523F0017A136 ++:1025E00002065E53000BE60138524B0017A100684B ++:1025F000DE87008BE903AB5E02F006AA03BFDE02B2 ++:10260000F008AB0068DE4F020BEC020781AB000B59 ++:10261000EC01806006F2979403AB5E02F006AA021A ++:102620000000F3000BF20206DE53000BF201185E0D ++:10263000830017A10068DE8700ABF201BC600B02CB ++:102640005142020052170009C403BFDE02F008AB7A ++:1026500001BC600300118301BC6003001182032CE4 ++:102660005E02F00BF90199E00620110003BFDE02C3 ++:10267000F00BFD0119402F0017A100685E870009CB ++:10268000C00199DE8620110003315E02F009C0000E ++:10269000A05E3B0097A200205E4EF449C00184601A ++:1026A0000209104803BFDE02F009C0032B5E02F0EE ++:1026B00009C00068DE4F042C0600B0523300179F9B ++:1026C00000B0522F0010EB0281522F00069200E062 ++:1026D00002AB0020AA0281522F0009A003295E024A ++:1026E000F00C0C0203DEB3000C0C0191601A84F4B0 ++:1026F000270183E002F597AC0208522F0006AA03D7 ++:10270000BFDE02F008AB01BC600300106701BC60D3 ++:10271000030010460180E0060930490282C11F0013 ++:102720000C1601BC602F1FF06501BC600300168011 ++:1027300000E841970030650069C197000C1301BCA7 ++:10274000600B00179401BC60030017AB01BC600371 ++:102750000017AC01BC60030017AD01BC600300179B ++:10276000AE01BC60030017BF01BC60030020200164 ++:10277000BC60030017A100025E02F000A201384015 ++:1027800067000028011C406700002901BC600300AD ++:10279000504901BC60030017A701BC60030017A8E3 ++:1027A00001BC60030017A901BC60030017AC01BCA9 ++:1027B00060030017AD0182E0060F10780206C1E346 ++:1027C000000C28006880A7000C2B03BFDE02F00C71 ++:1027D0002C006880A7008C2C01BC600B1EA000019F ++:1027E000BC600300200101BC634F01A00201BC6179 ++:1027F000DB06800301BC600300400401BC604309A8 ++:10280000200501BC601F14106101BC601317D0606B ++:1028100001BC600300082900B05E0F00178500A00E ++:1028200044B6F07145028741D7000C3701BC600304 ++:10283000000BF001BC600300107D01BC60030010C0 ++:102840007C01BC606300107B01BC600300107A0156 ++:10285000AC607F00107501BC63470897A10068C198 ++:10286000DAF42C43011A41DF0017A10068DE87016A ++:102870006C4301BC637B15ABF003BFDE02F00A9E24 ++:1028800001885E5CFF87FC01BC601F1F500701BC14 ++:102890006003019008018860060090040386DE0250 ++:1028A000F00A870305DE02F00C480386DE02F00A18 ++:1028B000870385DE02F00C4A00B05E870017A10096 ++:1028C0006EE003002C4E0386DE02F00A87006EC025 ++:1028D000146F2C5101BC60070010420207C0AF000A ++:1028E00007590002DE02F0000003215E02F00C57DF ++:1028F00000E02066F4281900B0206700178B03BFA2 ++:10290000DE02F00C5F028150C7000C5C011C509F7E ++:1029100000178B00E05E2EF4378B019C5E2E84F452 ++:102920002703BFDE02F00C5F011E509F00178B00D3 ++:10293000E05E2EF4378B019E5E2E84F4270002DECB ++:1029400002F000000107402700082800E020A30053 ++:1029500028280002DE02F0000000B044670017A241 ++:10296000017ADE8A2357A10090012F00B7A601BC8F ++:10297000601B11706501BC60030017A201BC601BE5 ++:102980000DD06401BC601B1B906300685A03000CEF ++:10299000A8006B5E86D06C7E00B05A030017A300BF ++:1029A000E05A0EF4D58000E05A0EF4768300E85A1F ++:1029B0002F00368B0069DA2F000C7200E85A0700EE ++:1029C000368B006CDA0EF42C6D01BC60030036000F ++:1029D00001BC600B00104301BC60030026DA00203C ++:1029E0005A0B080C7901BC60030026DB03BFDE0232 ++:1029F000F00C7E00205A0B140C7E01856006F5B7A2 ++:102A0000AD0088009B00D1260090009B0151280159 ++:102A1000BC6303001124006B5E86B00C8600685A0C ++:102A200013000C8301886006D0568200B056030064 ++:102A300017A400E05E92D0968500E05A0EF4D5808F ++:102A400000205A0B080C8601BC60030006DB0068FE ++:102A50005A13000C8E006B5E86D0AC8E0188600A23 ++:102A6000D0568200B056030017A400E05E92D096C4 ++:102A70008501BC600300360101BC600B00104301FE ++:102A8000BC60030026DA00685A1B000CA8006B5ECD ++:102A900086D0ECA802015A0B000C9D00E85A1B00DE ++:102AA000368600B05A270017A300E05A1EF4768736 ++:102AB00001BC601B1C106200E0418AF4506200B04F ++:102AC0005A2B0017A300E05402F475000202D4034D ++:102AD000000C9B00E05A1F003687012054030015AC ++:102AE0000001816002D0568203BFDE02F00CA0001C ++:102AF000B05A230017A300E05A1EF47687018160C4 ++:102B000006D0568200685A1B000CA2006CDA1EF434 ++:102B10002C9002015A0B000CA501BC600300360288 ++:102B200003BFDE02F00CA601BC600300360301BC4B ++:102B3000600B00104301BC60030026DA00E04197FF ++:102B400001906500E05E8B0037A200E041930090A9 ++:102B50006400E0418F003063006D5E8B008C6A0082 ++:102B600002DE02F0000000B05A0300101F00B05A4D ++:102B70000700102000B05A0B0010210180600700F0 ++:102B8000101D02804077000CB20002DE02F000004F ++:102B90000187E002F577AB03915E02F000020020AE ++:102BA000E3FE09000200025E02F00C6301BC601B40 ++:102BB00011706400E041930617A20068D82F000C42 ++:102BC000BC0281D80B00000200E041930190640038 ++:102BD0006D4192F44CBA0287C49300000200689BD6 ++:102BE0006F00000202815E53000CC90283411F0086 ++:102BF0000CC30281DE53000CCF01BC6003001151F5 ++:102C000001BC600300115201BC620300115301BCFE ++:102C1000600300515001896006F2979403BFDE0201 ++:102C2000F000020280C54300000201F0C547001118 ++:102C3000560107C5470017A101F0C54AF4315501F7 ++:102C400089600AF2979401BC60030810470392DE82 ++:102C500002F00D1C01BC601B11706501BC6003001B ++:102C600037A101BC63FF1FF7A201BC60030017A3DB ++:102C700001BC60030017A600685A03000D0B01BCDD ++:102C800060030017A502035A0B000CDE02805A0BEA ++:102C9000000D1C00E944080977BB00E8C40F0017C9 ++:102CA000A4017ADEEEF497A400685A13000CEA033C ++:102CB000BFDE02F00CE70203DA0B000CF200B05AA0 ++:102CC0000F0017A400685A07002CE300685A2F0071 ++:102CD0002CE301BC60030037A500685A13000CE721 ++:102CE000006CDE92D0ACE700B05A170017A401BC0C ++:102CF00060030037A5002019FAF42CEA00685A1B7B ++:102D0000000D0503BFDE02F00CED00885E87009722 ++:102D1000BB002019FAF76D1C02015A0B000D1C00B4 ++:102D20006CDE92D0ED0500B05A1F0017A4002019E8 ++:102D3000FAF42CF101BC60030037A503BFDE02F0FA ++:102D40000D050202DA0B000D0B0204C107000D1C79 ++:102D500000B05A0F0017A400E85A2F0037BB0069D3 ++:102D6000DEEF000CF800E85A070037BB013C016FAA ++:102D70000017800068DE03000CFE0138016F0017A9 ++:102D80008000685E03000D0100E85E030037BB03AE ++:102D9000BFDE02F00D0100E85E030037800080DE38 ++:102DA00002D0378000E05EEE0DB7BB00685EEF003A ++:102DB0000D0500E05E92D017A400E85EEF0037BB7F ++:102DC00003BFDE02F00D0100685E8F000D08006B8E ++:102DD0005E92F44D0903BFDE02F00D0B01BC6003EF ++:102DE0000037A300B05E930017A200B05E970017F3 ++:102DF000A600885E870037A100E04197019065003A ++:102E00006D5E87020CD500685E8F000D1C00B0441B ++:102E1000670017A5017ADE962357A500E85E8AF4BD ++:102E2000B7A400885E9300A6D700905E930166D891 ++:102E300000B0012B0017A300689B63000D17006E04 ++:102E40009B5EF46D1C03A65E02F00D1C00B05E9B41 ++:102E50000006D900E91B5EF4681400E89B630008D3 ++:102E60001503BFDE02F00D1E00681B6700000203A1 ++:102E7000BFDE02F00D6F01BC610300112300692069 ++:102E800057000D220180E006F2979403BFDE02F0A6 ++:102E90000D240180E002F2979403BFDE02F00002ED ++:102EA00000684127000D3002844523000D2500B045 ++:102EB00044670017A100E84466F437A2006D5E8BFA ++:102EC000004D270280C127000D2B0392DE02F00D7A ++:102ED0006F0392DE02F00ACA00025E02F010970051 ++:102EE000025E02F00E4F00025E02F00E4A00025E29 ++:102EF00002F00E5A01BC600F0011E8031EDE02F062 ++:102F00000D3701BC600300105C01BC600300105D64 ++:102F100001BC605304105E01BC600300105F03BF7E ++:102F2000DE02F00D3B01BC600B00105C01BC6003D5 ++:102F300000105D01BC604304105E01BC6003001022 ++:102F40005F01BC6003008020028500BF000D80008F ++:102F5000B0205300115100B02057001152006E20D4 ++:102F6000522A8D430068A057000D4300E0205223F1 ++:102F7000281603BFDE02F00D4500B04467000816B6 ++:102F800001BC600300315001BC60030C90400000A4 ++:102F9000DE02F000000068C103000D4A02804543D4 ++:102FA000000D45006B446502CD4501BC6003001176 ++:102FB0005002844543000D4B00B044670017A10048 ++:102FC000685E86232D4D01BC6003004020018660B1 ++:102FD0000620110000E920522A37A100E8A0562A55 ++:102FE00057A200E14466F4311900E1C46AF4511AB1 ++:102FF00000E1C46F00111B00E0C47300111C00B09D ++:10300000441F001800008844230157A30090442364 ++:1030100000D7A400B0440B0017A100B0440F001764 ++:10302000A200E95E862337A100E8DE8A2357A200CA ++:1030300069DE8B000D6500E1440AF4710200E0C412 ++:103040000EF4910300E02AF7002ABD00E85E230099 ++:1030500037880069DE23000D5900E8002700378813 ++:1030600003BFDE02F00D59018660022011000068E6 ++:10307000C103000D6F00681B67000D6F01BC60434A ++:103080000017A100E04466F4378001BC600300062D ++:10309000DA00025E02F00C63006C4466F00D6F0013 ++:1030A000681B6B000D6B03BFDE02F00CCF0200DE6D ++:1030B00053000D820180E002F2979400025E02F05C ++:1030C0000E4D01BC600300104003BFDE02F00D7521 ++:1030D000020080C3000D7900E044640957A100E8B4 ++:1030E0005E862137A1006CC466F42D7703BFDE0233 ++:1030F000F00D8200E8012A21281401BC60030008B9 ++:103100001500B0205300115101BC600300115201A1 ++:10311000BC600300315002804543000D7E03BFDEDA ++:1031200002F00D4F01BC600300104000B0012B0005 ++:1031300011090068AAE7000D8300B0012F001109F2 ++:1031400001BC61CF0C105C01BC600300105D01BCD0 ++:1031500061CF01F05E01BC603B0AF05F00025E02DD ++:10316000F00E5600025E02F00E5F00025E02F00EEC ++:103170005301BC60030006D903BFDE02F00ACA0196 ++:10318000885E0610D08601025E070017A101825EEC ++:103190008610D08601BC600306778000B00DEF007A ++:1031A00017810288421B000D9400B00DEB001781BF ++:1031B00000685E07000D9600025E02F00E44020BEE ++:1031C000421B000D9803BFDE02F00D99018B20A277 ++:1031D00010D0860002DE02F0000000B05413001789 ++:1031E000A10200DE07000DA100B0418B00106501B7 ++:1031F000BC600301D7A100025E02F011A500E05EF1 ++:103200008400F7A103BFDE02F00DA6020480F300E4 ++:103210000DA602025E07000DA602805E07000DA645 ++:103220000090001B0037A200E85412F457A10002DE ++:10323000DE02F00000020400BF000DAA00025E02E0 ++:10324000F00F4E03BFDE02F00DAB00A044B6F0B1AC ++:10325000450002DE02F00000020000BF000DBC00CD ++:1032600068AC0F000DBC00E05EA30037A8006D5EE7 ++:10327000A005CDBC00B02CB70017A100025E02F083 ++:1032800000A200B040670017A20068DEA3FFEDB9FE ++:1032900000B05E8965D7A2006D00A7008DB8006DF3 ++:1032A000A0A3004DBA03BFDE02F00DB90068A0A3D1 ++:1032B000000DBA00B85E8965D7A200025E02F00078 ++:1032C000A801BC60030017A80002DE02F0000000A5 ++:1032D000D85A030117A201B85A06F457A200B056F3 ++:1032E0000300083C00B0560700083D00B0560B0034 ++:1032F000083E00B0560F00083F00B05613000840CB ++:1033000000E05612F4484100B05A0300083A013870 ++:103310005E8B00083B00B021070017A401BC6003CE ++:103320000017A200B0419300106500B85E92D0175C ++:10333000A400E05E06F4506300F05E930017A30063 ++:10334000F05E930077A400E05E8B0037A200B85EC9 ++:1033500092F477A400E04192F4506500E05602F444 ++:10336000958000B056030017A4006EDE8B00ADCA36 ++:1033700000B85E92C0D7A200D85E8B0037A200E0F2 ++:1033800020F2F4483C00B020F30017A400B85E928D ++:10339000C0F7A200D85E8B0037A200E020F6F44808 ++:1033A0003D00D820F70037A200E020FAF4483E00A4 ++:1033B000D820FB0037A200E020FEF4483F00D820D0 ++:1033C000FF0037A200E02102F4484000D8210300AA ++:1033D00037A200E02106F4484100B021070017A2FF ++:1033E00000B85E8AC017A200905E8B0037A201BCB5 ++:1033F0005E8907683B0002DE02F000000180600683 ++:103400003C91E4018760063CD1E601A860023CD112 ++:10341000E6018B60023CD1E600B05E8F00106300D5 ++:10342000B056030011E700B056070011E700B05690 ++:103430000B0011E700B0560F0011E701A960423CF4 ++:1034400091E401A860023CD1E6018B60063CD1E624 ++:1034500000B05E8B00106301BC60030057A1020442 ++:103460005603000DF801BC60030117A100E0418E76 ++:10347000F4306300B056030011E700B056070011A6 ++:10348000E700B0560B0011E700B05E8B001063013F ++:10349000BC600300B7A10204D603000E0201BC60A9 ++:1034A000030117A102065E53000E0201BC60030176 ++:1034B00097A100E0418EF4306300B056030011E79D ++:1034C00000B056070011E700B0560B0011E701BC31 ++:1034D00060030017A10206DE53000E0D00B05E8BE4 ++:1034E00000106302065E53000E0C00A0563F01F769 ++:1034F000A103BFDE02F00E0D00A0563301F7A100BC ++:10350000B05E870011E701BC60030011E70002DE36 ++:1035100002F0000000685E9B00CE2A01BC6007023A ++:1035200011E30068DE9B004E1D00E847870111E1B2 ++:1035300001BC60030011E201BC60030011E201BCA8 ++:1035400060030011E201BC60030011E201BC6003F2 ++:103550000011E201BC60030011E201BC6003001134 ++:10356000E201BC60030011E200B06142F451E000EE ++:10357000B058030011E200B058070011E200B05843 ++:103580000B0011E200B0580F0011E200B058130018 ++:1035900011E200B058170011E200B0581B0011E210 ++:1035A00000B0581F0011E200B05E9B0017A4006835 ++:1035B000DE9B00AE2801BC60030077A40192DE937D ++:1035C0000217A30002DE02F0000001BC6007001138 ++:1035D000E300B058030011E200B058070011E20008 ++:1035E000B0580B0011E200B0580F0011E200B058C3 ++:1035F000130011E200B058170011E200B0581B0090 ++:1036000011E200B0581F0011E200E00146F0106422 ++:1036100001BC60070031E300B058030011E200B0C4 ++:1036200058070011E200B0580B0011E200B0580F2B ++:103630000011E200B058130011E200B05817001159 ++:10364000E200B0581B0011E200B0581F0011E20167 ++:1036500092E01B0017A30002DE02F0000002874088 ++:10366000C3000E3F01866006F01030028640C300A2 ++:103670000E4100B040C70017810002DE02F00000DA ++:10368000028740C3000E4400B05E0700103101867F ++:10369000E006F010300002DE02F00000006800A733 ++:1036A0000112E303BFDE02F00E5E00025E02F00EC6 ++:1036B0004D00025E02F00E5F0002DE02F00000002C ++:1036C0006800A70112AC0002DE02F0000001816078 ++:1036D00006093049006800A7008E5200025E02F021 ++:1036E0000E6F0002DE02F0000000025E02F00E6FBC ++:1036F000018160020930490002DE02F00000018809 ++:10370000E00E09304900B0412700180000B0002B3E ++:103710000010020002DE02F0000001BC6003001095 ++:10372000020182E0020F107801BC60030010490022 ++:10373000B041270018000002DE02F000000068001F ++:10374000A7010E600280DE53000E6601BC60130705 ++:1037500077A100025E02F000A2019060020337A28E ++:1037600000025E02F000A80002DE02F0000001BCD0 ++:1037700060130797A100025E02F000A20190601E94 ++:103780000337A200025E02F000A801BC60130777B5 ++:10379000A100025E02F000A20190601E0337A200A9 ++:1037A000025E02F000A80002DE02F000000100DE6E ++:1037B000530017A60181DE9A09304900B041270065 ++:1037C00018000002DE02F000000002DE02F000003D ++:1037D00000B044670017A2017D5E8A2357A300B0A2 ++:1037E0001C770017A100B85E84E3D7A2025A5E8B53 ++:1037F000000E7C0180E006F4271E01825E86F297AF ++:103800009400B05E8F00071B02001C7B000EC300FB ++:10381000E85E8CE377A2006D5E88E38EC300E0442F ++:10382000670287210285C523000EC00020E3FE0940 ++:103830000EC001BC60130997A100025E02F000A255 ++:103840000068C067000EC001BC60131617A100021B ++:103850005E02F000A20068C067000EC001BC6013E9 ++:1038600009D7A100025E02F000A20068C067000E46 ++:10387000C001BC63FF1FF7A10068DE862C2EC002CA ++:10388000009C7B000EB40180E000E3C71E01BC6019 ++:10389000230F57A100025E02F000A200B0406700B3 ++:1038A00077A400B05E930017A200025E02F000A8A9 ++:1038B00001BC601B1B57A100025E02F000A2018147 ++:1038C000E0060337A20186E006F457A200025E027A ++:1038D000F000A801BC601714D7A101BC600300B7B9 ++:1038E000A200025E02F000A801BC60171457A101FB ++:1038F000BC60031877A200025E02F000A801BC6061 ++:103900001714B7A101BC600300F7A200025E02F029 ++:1039100000A801BC60171077A101BC600F0417A2BA ++:1039200000025E02F000A801BC60171097A101BC64 ++:1039300060030017A200025E02F000A801BC60173D ++:1039400010B7A101BC600B0017A200025E02F000DC ++:10395000A801BC601710D7A101BC60030017A2002A ++:10396000025E02F000A801BC60171017A101BC6044 ++:103970000B0037A200025E02F000A801BC60230F1A ++:1039800057A100A85E930077A200025E02F000A893 ++:1039900001BC60171017A100025E02F000A2020035 ++:1039A0004067000EB9006CC464E42E8003BFDE02E1 ++:1039B000F00EC001BC60171277A100025E02F00099 ++:1039C000A20068C0671FEEC001806000E3C71E014F ++:1039D000BC600300904301806000E3C71E01826069 ++:1039E00002F297940180E004E3C71E01BC6003006B ++:1039F000071A03BFDE02F00EC30002DE02F0000071 ++:103A00000201C11F000ED602855EAF000EC90185FE ++:103A10006006F577AB00B0446700082500B0446B42 ++:103A200000082600E9446504B7A100E8C46904D78A ++:103A3000A200D05E870077A101E1DE8AF437A20000 ++:103A4000E95E862697A100E8DE8A26B7A200695EB5 ++:103A50008B000ED601BC610300113300E144DAF49F ++:103A6000313600E144DEF4513701856002F577AB71 ++:103A700001BC600301104701BC6003005043000219 ++:103A8000DE02F0000000B0451F00178100B005B74E ++:103A90000017A601BC600704106401BC601311107C ++:103AA0006501BC60030017A10205DEAF000EEF0048 ++:103AB000B0580F00178000685E842C2EF702005E5D ++:103AC0009B000EEF0280DA03000EE50118581F007C ++:103AD000178200E05E0B00378201985E0AC0F6078D ++:103AE00003BFDE02F00EE8011A581F00178200E043 ++:103AF0005E0B003782019A5E0AC0F60701F0DE0312 ++:103B000000378000A05E02C0578000B05E03001640 ++:103B10000300A044B6F0178200B05E0B001605004B ++:103B2000E05E0AC0960603BFDE02F00EF700B05852 ++:103B30001300178200E85E06F057A5006ADE9700C2 ++:103B40000EF500E85816F4B6050069D817000EF512 ++:103B500001BC600300160500B058170017A500E06F ++:103B60005812F4B60600E0419302106400E0419759 ++:103B700006D06500E05E870037A100905E9B0037AD ++:103B8000A60068DE87008EDC01BC600300114701DF ++:103B9000BC600300016D0002DE02F0000001BC60A9 ++:103BA0000300016C01BC600300016D01BC60070AE9 ++:103BB000106401BC60030077A100B0428F00178041 ++:103BC00000A05E0301F78000B05E0300016E01BC3F ++:103BD00063FF1FF7A20068DE03000F0901BC60034A ++:103BE0000017A200886006F43781002005BAF02F84 ++:103BF0000E0068DE8AC0CF0E00E005B300216C0025 ++:103C0000B005B6F0216D00685E03000F1200205E63 ++:103C100006F00F18006EDE8AC0CF1803BFDE02F078 ++:103C20000F13006DDE8AC0CF1800B05E870017A3A7 ++:103C300000B0419300016600B0581B0017A201BC00 ++:103C4000600300016C01BC600300016D00E841935A ++:103C500002106400E85E870037A10069DE87000F6C ++:103C60000900B05E8F0001650002DE02F000000076 ++:103C7000B0059B001064006E581B002F2100E05817 ++:103C80001B00314503BFDE02F00F2200B0581B00BD ++:103C9000114500B0059B00016200B005970001616D ++:103CA00000B0580F00178500B0580700178300B008 ++:103CB000580B0017840118581F00178C011A581F41 ++:103CC00000178D0002DE02F0000000B0059700171B ++:103CD0008000685E002C2F4D01BC600300111201B2 ++:103CE000BC600300111500B0059B00106402004584 ++:103CF00023000F3700B0451F00178100E80592F040 ++:103D00003780006ADE03000F3500B05E0300114506 ++:103D100003BFDE02F00F3801BC600300314503BF72 ++:103D2000DE02F00F3800B0059300114500B00583A6 ++:103D300000016900B0058B00016A00B0058F000129 ++:103D40006B00B0058700016800B005AB001065028C ++:103D5000845A1F000F4100B05E1700168301985E61 ++:103D600032D0F687019A5E36D0F68701846002D0A1 ++:103D7000F68700B0059300016000B0059B0001626A ++:103D800000B0059F00016300B0059700016100B01D ++:103D9000058B00106400B0580F00178500B058075D ++:103DA00000178300B0580B0017840198581EF19734 ++:103DB0008C019A581EF1B78D03BFDE02F00F4D0043 ++:103DC00002DE02F0000000B0058B001064006E41BE ++:103DD000932A0F5B00A044B6F0B7A100B05E870045 ++:103DE000160500E05812F4360600B0581B001145C5 ++:103DF000020000F3000F58006D4193280F58020095 ++:103E0000DEAF000F5801BC600B02514200B05E876C ++:103E100000016F02015EAF000F5B00B05E1700167D ++:103E20000301816002F577AB0002DE02F0000002C0 ++:103E3000014523000F660287C493000F660182606C ++:103E400002F5D7AE02012C43000F6300E02C4B00BB ++:103E50002B1201816001620B1002055EB7000F6634 ++:103E600000E02AF7002ABD01856002F5B7AD000227 ++:103E7000DE02F00000020200BF000F7400025E02CA ++:103E8000F00F960202DEB3000F6C0020428F000C90 ++:103E9000B403BFDE02F00002028881AB000F74029F ++:103EA000845EFF000F6A02845EB3000F6A0282DE46 ++:103EB000FF000F6A02822B4F000F7200682ABB00BE ++:103EC0000F740284DEAF000F6A02835EB7000F6AD0 ++:103ED00000B05E870017A10002DE02F00000018240 ++:103EE000E002F597AC0203DEFF000F7E028445235B ++:103EF000000F7E02012B4F000F7E0180E006F2973B ++:103F00009400025E02F00E6F0180E002F2979400CE ++:103F1000025E02F00E6F0180E002F29794028400CC ++:103F2000C7000E4803BFDE02F00E4A020400C700BD ++:103F30000F880284C56F000F9402844523000F850B ++:103F400002004203000F9400685E4B04AF940068C7 ++:103F50005E4B06AF9400685E4B062F940182E0062C ++:103F6000F597AC02844523000F8B0323DE02F00F8C ++:103F70008C0183E006F597AC0180E006F29794028D ++:103F80008400C7000E4800B02AF70017A2006DDEBB ++:103F900089560E4802872B4F000E4A02005EFF0032 ++:103FA0000E480287AB4F000E4A03BFDE02F00E48F8 ++:103FB0000002DE02F00000020200BF0013000068F1 ++:103FC0002B0B000F9B00E844655857A101BC63F719 ++:103FD0001D17A2006D5E86F44F9B00E84466F44A0C ++:103FE000C2006CC465576F9D00E84467002ABB029D ++:103FF00080456F000FD10203DEB70010580183E047 ++:1040000002F5B7AD0202DEB3000FA3018360062BF9 ++:10401000915C00025E02F00F7602835EBB000FA689 ++:1040200000E845895BF7A1006E5E8555AFBE0204CE ++:10403000DEB7000FBA00E02BB7002AED01BC600329 ++:10404000000AEF00682C67000FAB00E82C67002B1C ++:104050001900B02BB70017A201856002F5B7AD02B9 ++:1040600004DEFF000FB0006D5E895DCFB00184E01B ++:1040700002F7F7BF0206DEFF000FBA00E02BE702EF ++:104080000AF900B04467000B0401182BE70017A1E0 ++:10409000011A2BE70017A2006E5E87000FB8006DB3 ++:1040A000DE895F4FB803BFDE02F00FBA01BC6003C8 ++:1040B000000AF90186E002F7F7BF02025EFF001076 ++:1040C000580068AB0B00105800B02AE7000AC20085 ++:1040D00002DE02F000000182E002F7F7BF02025E9A ++:1040E000FF000FC8020600C7000FC102025EFF00FA ++:1040F0000FC800E845895BF7A1006DDE85614FC6FA ++:1041000000E844656177A1006D5E85618FC800B0ED ++:104110004467000AC20002DE02F000000204DEB7BB ++:10412000000FD000E8446556CABE00682C67000F37 ++:10413000CC00E82C67002B1900E02BBF002AEF0011 ++:10414000B02BC30017A1006D2BBEF42FD001BC60B3 ++:1041500003000AED0002DE02F000000203DEB700F9 ++:104160000FD80282DEB30010580203C57300104A54 ++:1041700000E844655737A1006D5E8556B05801834D ++:104180006006F5D7AE03BFDE02F0105801BC600335 ++:10419000000ADF006D45871F4FDB00B04587000A2E ++:1041A000DF00E044655BF7BB00E85EEE2C2AB90156 ++:1041B000836002F5D7AE0183E006F5B7AD0184E078 ++:1041C00002F5B7AD01826002F7F7BF01846002F526 ++:1041D000B7AD0101456F0017A101875E86F577AB8A ++:1041E00001BC6003000B0D00025E02F0130100E849 ++:1041F00044655737A1006D5E855ECFE6006D5E8534 ++:1042000056AFEA00E02B83002AE000B02AB3001783 ++:10421000B3020680C7000FED02075EAF000FF00289 ++:104220000680C7000FF20184600561AB0D03BFDE9D ++:1042300002F00FF201826006F7F7BF00B02AE70034 ++:104240000AC10200C56F000FF601846006F5B7AD24 ++:10425000020480C3000FF60184E00561AB0D020289 ++:10426000DEBB000FFC0284DEFF000FF90206DEFF5A ++:10427000000FFC00B02BB70017A1006DDE855DCFED ++:10428000FC0182E00561AB0D00E05ECD55B7B301E6 ++:10429000826002F5D7AE00B02C4B0017A100B02A07 ++:1042A000F70017A2006D5E8956100302855EB70005 ++:1042B000100C03BFDE02F01005006D5E8560F00E8D ++:1042C00002812C4300100C00B0440B0017A300B077 ++:1042D000440F0017A200E95E8E2337A300E8DE8AB0 ++:1042E0002357A200695E8B00100E0068DE8B001061 ++:1042F0000E006E5E8EF6700E01826006F5D7AE007F ++:10430000025E02F0114902045EB70010230206802B ++:10431000C700101102075EAF00102300682ADB00FF ++:10432000101C00E8446556D7A201BC60371597A35E ++:10433000006D5E8AF47023006E5E895D90230184B7 ++:10434000E006F5B7AD00685E8B00101C00B05E8B18 ++:10435000000AAE0182E006F5D7AE006E5E896110FC ++:104360001C0182600561AB0D00E844655737A10070 ++:10437000B044670017A300E85E8EF42AB60068AB6D ++:104380001708902200B02BCB0017A200E82ADAF41D ++:104390004AB601846002F7F7BF0282DEB30010580C ++:1043A0000203C57300104A00B02ACB0017A200B068 ++:1043B0002AD30017A300685E8F00102D00682B0B16 ++:1043C00000102D00E844655857A100E05E8EF457B8 ++:1043D000A2006D5E86F4502D0181600561AB0D0277 ++:1043E00081AB4F00103202005EFF00103202044524 ++:1043F0002300103203A0DE02F010320183E00561D9 ++:10440000AB0D0281AC4700104702862C37001058D4 ++:104410000286AC37001058028080BF00105802821C ++:104420005EBB00105802822BF30010470281AC37AC ++:104430000010470280AC3700104702812C37001073 ++:104440004702822C37001047028881AB00104702D8 ++:1044500082AC3700104002842C370010470284AC35 ++:10446000370010470283AC3700104702835EB70065 ++:1044700010460204DEAF0010460281DEBB0010468B ++:104480000184E002F577AB00025E02F0113303BF56 ++:10449000DE02F010580183E0022B915C020701ABB1 ++:1044A00000104A0180E00209D04E00E84465573709 ++:1044B000A1006D5E8555B058028101AB001050021D ++:1044C0000081AB00105202842C370010520280ACE5 ++:1044D00037001052018360022B915C03BFDE02F0B3 ++:1044E0001058018360022B915C00025E02F00F8184 ++:1044F00002835EB70010580184E006F577AB00E058 ++:104500002B47002AD103BFDE02F0111B0002DE029E ++:10451000F000000184E002F5B7AD01836002F5D739 ++:10452000AE0182E002F5D7AE0182E002F7F7BF01EB ++:1045300084E002F7F7BF01BC6003000ADB01BC6046 ++:1045400003000AD001BC6003000AC8018760016053 ++:104550006B030002DE02F00000020200BF001089BF ++:104560000283DEFF0010920183E006F7F7BF01BC73 ++:10457000600302115D00B02AB700115E018560067C ++:104580000B705B018560060BF05F0280456B0010CD ++:104590006D018B60022B915C0188600E2B515A00DB ++:1045A000682ADB00107001846006F7F7BF01BC6069 ++:1045B00003000AB600025E02F0105900E844696088 ++:1045C000D7A1006EDE8700307A00B02BF7000AF822 ++:1045D00001BC6003000AF700682B0B00107A00B0E2 ++:1045E0004467000AC100E84465564AC200B02AD3B5 ++:1045F0000017A100E82B0AF42AC2028080BF001035 ++:10460000800281DEBB0010840200456F0010800232 ++:1046100083C57300108001BC63FF1FF7A10068C54C ++:1046200086F43084018B600E2B915C0183E002F5EF ++:10463000B7AD0184E002F577AB03BFDE02F01126CF ++:10464000018360022B915C00025E02F00F81018306 ++:10465000E006F5B7AD0184E006F577AB03BFDE02F7 ++:10466000F01126018D60020BF05F0188600E2B5166 ++:104670005A028181AB00108E018B60062B915C0386 ++:10468000BFDE02F0108F018B60022B915C0183E092 ++:1046900002F5B7AD0184E002F577AB00025E02F0EF ++:1046A00010590002DE02F0000000B0446B000B065F ++:1046B0000202DEB3001097018360062B915C0002BA ++:1046C0005E02F00F76020200BF00109F0183E0023D ++:1046D000F7F7BF0203C57300109D020080BF0010F2 ++:1046E0009D018B600E2B915C03BFDE02F0109E01DA ++:1046F0008B60022B915C0182E002F597AC0002DE38 ++:1047000002F0000001BC600300701001BC63FF1FD9 ++:10471000F0C501BC63FF1FF0CB00B040470010E5BF ++:1047200000B040470010EB01BC600300901001BCDA ++:1047300063FF1FF0C601BC63FF1FF0CC00B0404711 ++:104740000010E600B040470010EC01BC600300B070 ++:104750001001BC63FF1FF0C701BC63FF1FF0CD0059 ++:10476000B040470010E700B040470010ED01BC60CA ++:104770000300101000B0404300180001BC63FF1F8D ++:10478000F0C800B040470010E801BC6003003010E2 ++:1047900000B0404300180001BC63FF1FF0C900B027 ++:1047A00040470010E901BC600300501000B04043D6 ++:1047B00000180001BC63FF1FF0CA00B040470010A2 ++:1047C000EA0002DE02F0000001BC60030037A20034 ++:1047D00020E3FE0910FA0020E0420D90FA02804228 ++:1047E000030010FA028445230010FA03915E02F0E0 ++:1047F00010FA0068AB6F0010FA0282DEFF0010FAB8 ++:1048000002805EFF00112F020180C7001126028284 ++:10481000DEB30010FA020480C70010E700685E8B68 ++:104820000010D300B02BA30017A1006EAB8AF430A8 ++:10483000D30203C5730010E700682ABB0010D20042 ++:10484000682ADB0010D300E8446556D7A100E82AA7 ++:10485000BAF437A1006ADE8555F0E7006ADE855BB1 ++:1048600050E700682B070010E70203DE530010D664 ++:1048700000B02BA7000AAF03BFDE02F0112601BC77 ++:10488000600302579201BC63FF1FF0C301BC6003C9 ++:104890000910E301865E8A1C70E3018460061C70C7 ++:1048A000E300682B0F0010DD0185E0061C70E301BA ++:1048B000BC600303978200025E02F0110401BC6336 ++:1048C000FF1FF0C400B054130010E400E043915CFB ++:1048D00030E400025E02F010A001BC60030010EEA4 ++:1048E00001BC63FF1FF0CE00E02B0F002AC303BF03 ++:1048F000DE02F010F402835EB70010FA00025E02DE ++:10490000F000D400B05ECF0010E400682ABB0010B5 ++:10491000F100B02AFB0010E40280456F0010F100A6 ++:10492000E8446556D7A100E82ABAF437A100695EC9 ++:10493000870010F100E05E8557D0E401BC60030100 ++:10494000D78200025E02F0110403BFDE02F010F411 ++:1049500000B0004700108600025E02F011980002CD ++:104960005E02F00D8D0190600A0910480184600616 ++:10497000F597AC01BC61330070800002DE02F000EC ++:104980000002805EFF0010FF0281DEBB0010FF020C ++:104990000180C7001126020480C700112601806033 ++:1049A00002F7F7BF0280C28F0011270201DEBB00B1 ++:1049B000112701BC60030017A203BFDE02F010BD87 ++:1049C00001BC63FF1FF0C001BC63FF1FF0C1028583 ++:1049D000DEFF00111400685E4B06310D00B02B574E ++:1049E0000017A1006DAB0EF4311401BC6003013758 ++:1049F0008000B02B5B0017A1006D2B0EF4310F026D ++:104A0000812BF300110F01BC600301778001BC60B2 ++:104A10000300378100025E02F000AF01D2DE0AA07F ++:104A200030E000B0540B0010E103BFDE02F0111AB9 ++:104A30000280ABF300110D01BC600301578001BC83 ++:104A4000600300178100025E02F000AF00B054075F ++:104A50000010E000885E0B0070E10002DE02F00052 ++:104A60000000682B130011260204DEAF001126009F ++:104A7000E844655897A4006E5E9155F12600885E63 ++:104A8000930037A4006D5E9155F12600025E02F09E ++:104A9000115603BFDE02F0113300E844655897A4B5 ++:104AA00000885E930037A400025E02F0115603BF37 ++:104AB000DE02F011330284DEAF00112A0181E00230 ++:104AC000F5D7AE03BFDE02F0113300682B8700116B ++:104AD0002F00E044655C2ADB00682B8B00112E0060 ++:104AE000E044655B4ADB0002DE02F000000180600A ++:104AF00006F7F7BF00682B1300113300E844655830 ++:104B000097A400025E02F0115601846002F597AC92 ++:104B100001BC6003000AC401BC6003000ADB01BCE5 ++:104B20006003000AC30104DEAF0017A101835E86A3 ++:104B3000F5B7AD0284DEAF00113C018060060D9038 ++:104B40006C0002DE02F00000028600C700113E0287 ++:104B5000025EFF00114400B02AAF0017A302040058 ++:104B6000C300114100B02ACF0017A30202DEBB0030 ++:104B7000114300B02AAB0017A300E04466F46ABBFF ++:104B800000B04467000B0B0183E0022B915C02072D ++:104B900001AB0011480180E00209D04E0002DE02A4 ++:104BA000F000000202DEB300114C018360062B917D ++:104BB0005C00025E02F00F760203C5730011510221 ++:104BC00084DEAF0011510281DEBB00115102805E14 ++:104BD000FF00115102035EB7001155018B600E2BCF ++:104BE000915C01836006F5B7AD0184E002F577AB17 ++:104BF00001BC6003000AC30002DE02F0000000688E ++:104C00002B7B00115800B02B7B0017A4006D5E9128 ++:104C100056515A00B02ACB0017A400882B27003722 ++:104C2000A500E82B2AF4AACA00885E930037A400E6 ++:104C3000E02B2AF48ACA00902B2B00AAC900B02BC3 ++:104C400027000AAF0002DE02F000000286410700E2 ++:104C5000116101BC60130917A100025E02F000A2FD ++:104C6000018760060337A200025E02F000A800B0D0 ++:104C70005E870017A100B05E870017A100B05E87B5 ++:104C80000017A101876002F457A200025E02F00043 ++:104C9000A801BC60130957A100025E02F000A20146 ++:104CA0008060060337A200025E02F000A800E00266 ++:104CB000B30020AC01806002F457A200025E02F053 ++:104CC00000A801BC60270857A100025E02F000A204 ++:104CD0000068C06701F17901BC60030017A20002FF ++:104CE0005E02F000A801BC600301F7A200025E02B0 ++:104CF000F000A80002DE02F0000003905E02F01156 ++:104D00008D03875E02F0118D0390DE02F0118D029B ++:104D10000445230011840283C21F00118D0068A086 ++:104D2000B700118100B0446700082D00E844650514 ++:104D3000B7A1006E5E877D118803BFDE02F0118E81 ++:104D40000286C03700118D00E0446700D7A102063B ++:104D5000403700118D006CC466F4318600025E029B ++:104D6000F00B1600025E02F0116101BC6003000846 ++:104D70002D00025E02F00AD803BFDE02F00004013B ++:104D8000BC600300082D0002DE02F0000002804239 ++:104D900003001197028545230011960285DEB700B6 ++:104DA00011940185E006F5B7AD00E0446B002B21BE ++:104DB000006CC46964319700025E02F011610185E4 ++:104DC000E002F5B7AD0002DE02F00000010C814305 ++:104DD0000017A101BC600300508A00685E07001143 ++:104DE0009C00685E8700119C00685E070011A401AA ++:104DF00090422AA1308A00685E070031A4019042E7 ++:104E00002AA0108A0109DE030017A2018F5E8A1111 ++:104E1000508A00685E8B0011A40191E00E11508A47 ++:104E20000002DE02F000000109DE030017A400E02A ++:104E30005A06F497A500905E96F497A50203DE0348 ++:104E40000011AC0282DE030011AC01BC61EF085717 ++:104E5000A60080DE96F4D7A50116DE870017A30012 ++:104E6000885E870077A100E15E8702D7A100E0DEBF ++:104E70008F0017A301BC60030017A2020E5E03009F ++:104E800011B301BC60030037A200905E96F457A5F1 ++:104E90000080DE96F437A100E141B7FFF7A600E1FC ++:104EA000DE8701F7A10080DE96F477A300E1DE86BD ++:104EB0000DB7A100E0DE8F0017A3017A5E86F477BC ++:104EC000A100885E86F457A100B05E870017A20299 ++:104ED00087DE030011C000885E870057A103BFDE94 ++:104EE00002F011CD02875E030011C701BC639B0C69 ++:104EF000D7A50080DE86F4B7A100E141B7FFF7A592 ++:104F000000E0DE870017A100885E870057A103BF7D ++:104F1000DE02F011CD00885E870057A101BC639BC3 ++:104F20000CF7A50080DE86F4B7A101BC6203001770 ++:104F3000A500E141B6F4B7A500E0DE870017A100A7 ++:104F4000E05E8400D7A10002DE02F0000002002033 ++:104F50000F0000040282DE530011D50188600204B4 ++:104F6000902400E020AEF3082B00E820AAF3082AE2 ++:104F700003BFDE02F0096201B8601604902401BC90 ++:104F8000600301D02503055E02F011E70287C037F8 ++:104F9000000A860386DE02F00A8700025E02F00F36 ++:104FA0009500025E02F0117A035CDE02F011D70078 ++:104FB000D8409B0117A100E05E8702379800A85EE9 ++:104FC000630077980102DE530017A10182E002F22C ++:104FD00097940188DE85006803006EA0AAF311E7AC ++:104FE00000E85E6301D02501B8600604902403BF89 ++:104FF000DE02F000020181600500680301B8600A6A ++:1050000004902403BFDE02F0000202285E87001134 ++:10501000FD00B041930017A400E0419300706401CB ++:105020000A5E870017A200E84192F4506301185EFF ++:10503000870017A100E86042F437A200885602F406 ++:1050400036000068418EF491F900E8418F0030632A ++:1050500000E8419300306400685E8B0211F100901B ++:105060005602F457A300B05806F4760103BFDE02DF ++:10507000F011F100684192F491FD00E84193003095 ++:105080006401BC600300160003BFDE02F011F900EA ++:10509000B05E870017A10002DE02F0000001806010 ++:1050A0000286143000B050CB0010650138508300E8 ++:1050B00017A10068DE3B06320500E05A3300368C4B ++:1050C000006EDA32F4200400B05A0B0017A200E0A0 ++:1050D00001F700207D00E001D2F4407401BC63FFC1 ++:1050E0001FF7A300B050CF001064006EDA32F43224 ++:1050F0000C00B05A370017A300B0581300178201F4 ++:10510000BC600300160401BC601B09D7B60102D0C5 ++:10511000C70017A100E04196F4306500E050CB00D5 ++:10512000D06401BC60030017B401BC6003001780A9 ++:1051300001BC6003003781018760040310A0009068 ++:1051400052330097A400E0418701B7B500685ED2F2 ++:10515000F0523300E05EDAF690630020D802F032BD ++:1051600027020250C700122D009056030097A1009D ++:10517000E85E86F497A1019E6002F437A1006DDE1F ++:105180008708122D010A5E870017A201DA6002F477 ++:1051900037A100E05ED6F4506300886006F437A1C2 ++:1051A00000205602F4322D00B05802F0360000E024 ++:1051B0005A2B00368A006ADED2F472290068DED2E9 ++:1051C000F0122E00E05E0300378000685E030032BC ++:1051D0002E0186E0040310A003BFDE02F0122E00B1 ++:1051E0006ADED2F4722900E05ED30037B400D05EEC ++:1051F0000700378102985ED300121800E041930047 ++:10520000306403BFDE02F0121800685E0300000481 ++:1052100003BFDE02F005AB0282D0C700123D00B032 ++:105220002A4F0017A101B82A4AF43684010250130C ++:10523000001685013C50830017A100B050A700174D ++:10524000A4006D5A32F432460182E00686343102FF ++:1052500088502B00124200B05A330017A1019E5E05 ++:105260008684F427018360068634310002DE02F072 ++:10527000000000B050730017A101B8506EF43684DE ++:105280000106D00700168500B050AB0017A400D06F ++:105290006006C0978000E0419700D7B5010A581317 ++:1052A0000017A100E05ED6F437B500B0580F00102B ++:1052B00063011656030017810068D81300125B01C2 ++:1052C0001400630017A10068DE87001251008801F6 ++:1052D0003B01168003BFDE02F012560068DE870035 ++:1052E000725400A0013BE0168003BFDE02F01256AC ++:1052F00000E05E870970620088540301168000E8B0 ++:105300005A0330168001BC600300168101BC6003A3 ++:1053100000168201BC600300168303BFDE02F01298 ++:105320006000E0418EC09063006EC18EC0326000AC ++:10533000E8418EC0306300E858030037A100E04127 ++:105340008EF43063013850A30017A500685813038A ++:10535000F27B0068418EC0527B006DDA0AF4B27BAA ++:10536000011656030017A10068DE86F0327B015853 ++:1053700056030017A100E05E870DD7A200B05ED7EC ++:105380000010620020DE02A0127200E05E86D037BC ++:10539000A300E05E8ED077A3006D5A02F4527B002A ++:1053A0006E5E8EF4927B00E86002F4368300B05E9D ++:1053B0008F00168100A05A0F00768300E05A0B0080 ++:1053C000368200E85A02F4568000D05E030037802F ++:1053D00000E0581300360400E0418F00306302986B ++:1053E000581300127800E05ED70037B5006EC18E0A ++:1053F000C0326100B0580300106303BFDE02F01238 ++:105400006100B058130017A10068DA3700127E005F ++:10541000B05E8700168D006DDE86D1B28000B05E72 ++:105420008700168D0002DE02F0000001BC60030060 ++:1054300017A1018760040310A001BC60030990B5A7 ++:1054400000B0006300F0B401BC60570490B601BC2A ++:1054500060030090B500B0006300B0B400B042D368 ++:105460000018000317DE02F012890397DE02F01223 ++:105470008A00B02A4B00142F018EE00C0310A0000C ++:105480006DDE02D1B29000E85A36F0168D03BFDE11 ++:1054900002F0129201BC600300168C01BC60030094 ++:1054A000168D006E5A3AF0129501BC600300168EFC ++:1054B00003BFDE02F0129600E85A3AF0168E00B0F2 ++:1054C00058070017A100E0580EF01603006ED80E22 ++:1054D000F4329C00E85E86C017A100E8580EF4364E ++:1054E0000300E8580F00360301185E030017A100FF ++:1054F0006DDE030212A400E86042F437A200905A65 ++:105500001AF4368600885A1EF457A200905A1EF4E8 ++:10551000368700B05A1AF4568603BFDE02F012A690 ++:1055200000905A1EF4368601BC6003001687000204 ++:10553000DE02F000000158600300102A01B8600A82 ++:1055400004902401BC60030290040189E0020D90E4 ++:105550006C0002DE02F000000200DE530012D101F6 ++:10556000BC601309B7A100025E02F000A201A560B1 ++:10557000020337A20199E002F457A200025E02F092 ++:1055800000A801BC60130997A100025E02F000A20E ++:1055900001A4607E0337A20199E03EF457A2000205 ++:1055A0005E02F000A801BC601316F7A100025E02C3 ++:1055B000F000A201B460020337A200025E02F00014 ++:1055C000A801BC60131637A100025E02F000A20120 ++:1055D00086E0020337A201856002F457A200025E52 ++:1055E00002F000A801BC60131617A100025E02F0D1 ++:1055F00000A20181E0060337A20185E006F457A26C ++:1056000001836006F457A200025E02F000A801BC0C ++:1056100060131F57A100025E02F000A20181E002A8 ++:105620000337A2028600C70012CB0181E0060337D0 ++:10563000A200025E02F000A801BC60131F37A100A7 ++:10564000025E02F000A20181E0060337A200025EC2 ++:1056500002F000A80002DE02F0000001BC601309A5 ++:1056600097A100025E02F000A201A460020337A22B ++:105670000199E002F457A201886002F457A20002E7 ++:105680005E02F000A801BC60131617A100025E02C2 ++:10569000F000A20181E0020337A20185E002F45785 ++:1056A000A201836002F457A200025E02F000A80289 ++:1056B0000600C70012E201BC60131F37A100025EA2 ++:1056C00002F000A20181E0020337A200025E02F0B4 ++:1056D00000A80002DE02F000000200DE530012D13A ++:1056E00001BC601309B7A100025E02F000A20187AD ++:1056F00060020337A20181E002F457A2018860062C ++:10570000F457A200025E02F000A801BC60130997E2 ++:10571000A100025E02F000A2020400C70012EF0125 ++:1057200088600E0337A203BFDE02F012F10186602B ++:10573000060337A20181E006F457A200025E02F0E0 ++:1057400000A803BFDE02F012C60068DE930012F765 ++:1057500000E05E030057A201095E8B0017A103BFA2 ++:10576000DE02F012FF0068DE930032FB01105E03E0 ++:105770000017A200E05E8B0097A103BFDE02F012CB ++:10578000FF01305E030017A200E05E8B0197A100CD ++:105790006D5E870592FF01BC60030597A10002DEE4 ++:1057A00002F000000200456F00130B02872C0F006F ++:1057B000130B01BC60130217A100025E02F000A2ED ++:1057C0000200C06700130B0287AC0F00130801082A ++:1057D0004067000B030187E005606B0301886006EA ++:1057E0000337A200025E02F000A801876005606B2B ++:1057F000030002DE02F0000000682BEB0013110032 ++:10580000B02C130017A100E05E8560B7A1006BDE2D ++:10581000862333110186E006F7F7BF0002DE02F0AF ++:10582000000000B05E8F00106400B05E870017A318 ++:1058300000B05E8B00106500B05A030017A100682D ++:10584000419300131A00025E02F000A200B040670C ++:1058500000160100E0419300506400B05A070017A1 ++:10586000A200025E02F000A800E04197005065002F ++:10587000E85E8F0037A30068DE8F0013150002DE9C ++:1058800002F0000000B05E8F00106400B05E870080 ++:1058900017A300B05E8B00106500B05A030017809C ++:1058A0000068419300132800025E02F00E3F00B032 ++:1058B0005E0700160100E0419300506400B05A07F3 ++:1058C00000178100025E02F00E4400E04197005094 ++:1058D0006500E85E8F0037A30068DE8F00132300A9 ++:1058E00002DE02F00000020200BF0001880203C5D0 ++:1058F000730001B1000000000000000057860000A6 ++:10590000A5C1E142055AC359DC0175513E5B2349EB ++:105910004728676945005E55F8F5C97D420AB30915 ++:1059200001BD32080100343333363261322D726FDB ++:105930006D6C2F7364696F2D672D706E6F2D706B9A ++:105940007466696C7465722D6B656570616C6976DF ++:10595000652D776170692D776D652D7032702056D9 ++:10596000657273696F6E3A20352E39302E313935B4 ++:105970002E3839204352433A20626431653365350D ++:105980006120446174653A204D6F6E2032303133AE ++:105990002D30342D32322031373A32343A343420FB ++:0559A0004353547D009B ++:00000001FF +diff --git a/firmware/ap6210/nvram_ap6210.txt.ihex b/firmware/ap6210/nvram_ap6210.txt.ihex +new file mode 100644 +index 0000000..250c1e9 +--- /dev/null ++++ b/firmware/ap6210/nvram_ap6210.txt.ihex +@@ -0,0 +1,75 @@ ++:10000000234150363231305F4E5652414D5F5631AA ++:100010002E325F30333139323031330D0A6D616E3B ++:100020006669643D30783264300D0A70726F6469BD ++:10003000643D30783439320D0A76656E6469643D0A ++:100040003078313465340D0A64657669643D307802 ++:10005000343334330D0A626F617264747970653DB4 ++:100060003078303539380D0A0D0A2320426F61721D ++:1000700064205265766973696F6E2069732050330E ++:1000800030372C2073616D65206E7672616D20664D ++:10009000696C652063616E206265207573656420FC ++:1000A000666F7220503330342C20503330352C2082 ++:1000B0005033303620616E64205033303720617306 ++:1000C0002074686520747373692070612070617298 ++:1000D000616D732075736564206172652073616D55 ++:1000E000650D0A23506C6561736520666F726365E8 ++:1000F00020746865206175746F6D61746963205246 ++:100100005820504552206461746120746F207468D7 ++:1001100065207265737065637469766520626F61CE ++:100120007264206469726563746F727920696620F5 ++:100130006E6F74207573696E67205033303720629C ++:100140006F6172642C20666F7220652E672E2066A8 ++:100150006F72205033303520626F61726473206695 ++:100160006F72636520746865206461746120696ED4 ++:10017000746F2074686520666F6C6C6F77696E674A ++:10018000206469726563746F7279202F70726F6A70 ++:10019000656374732F42434D34333336322F6131EC ++:1001A0005F6C6162646174612F626F617264746517 ++:1001B0007374732F726573756C74732F7364675FD8 ++:1001C000726576303330350D0A626F617264726524 ++:1001D000763D3078313330370D0A626F6172646E6C ++:1001E000756D3D3737370D0A7874616C66726571CD ++:1001F0003D32363030300D0A626F617264666C6178 ++:1002000067733D307838303230310D0A626F617279 ++:1002100064666C616773323D307838300D0A7372F2 ++:100220006F6D7265763D330D0A776C3069643D30D1 ++:1002300078343331620D0A6D6163616464723D30FC ++:10024000303A39303A34633A30373A37313A31322A ++:100250000D0A616132673D310D0A6167303D320D33 ++:100260000A6D617870326761303D37340D0A63631F ++:100270006B3267706F3D3078323232320D0A6F6602 ++:10028000646D3267706F3D307834343434343434D4 ++:10029000340D0A6D63733267706F303D30783636D7 ++:1002A00036360D0A6D63733267706F313D307836C4 ++:1002B0003636360D0A7061306D61787077723D3573 ++:1002C000360D0A0D0A23503230372050412070611C ++:1002D00072616D730D0A2370613062303D353434C4 ++:1002E000370D0A2370613062313D2D3635380D0AE5 ++:1002F0002370613062323D2D3137353C6469763E82 ++:100300003C2F6469763E0D0A0D0A2353616D65200A ++:10031000504120706172616D7320666F722050339E ++:1003200030342C503330352C20503330362C205084 ++:100330003330370D0A0D0A70613062303D35343488 ++:10034000370D0A70613062313D2D3630370D0A703D ++:10035000613062323D2D3136300D0A706130697482 ++:10036000737369743D36320D0A7061316974737349 ++:1003700069743D36320D0A0D0A0D0A63636B5077BE ++:10038000724F66667365743D350D0A63636F64650D ++:100390003D300D0A72737369736D6632673D307854 ++:1003A000610D0A72737369736D6332673D30783320 ++:1003B0000D0A7273736973617632673D3078370D59 ++:1003C0000A747269736F32673D300D0A6E6F69731C ++:1003D000655F63616C5F656E61626C655F32673D2E ++:1003E000300D0A6E6F6973655F63616C5F706F5F7C ++:1003F00032673D300D0A73776374726C6D61705FA4 ++:1004000032673D307830343034303430342C30780A ++:1004100030323032303230322C307830323032308C ++:100420003230322C30783031303130312C3078313C ++:1004300066660D0A74656D705F6164643D323937BC ++:1004400036370D0A74656D705F6D756C743D3432AE ++:10045000350D0A0D0A6274635F666C6167733D3027 ++:1004600078360D0A6274635F706172616D73303D3E ++:10047000353030300D0A6274635F706172616D7384 ++:10048000313D313030300D0A6274635F70617261EA ++:0A0490006D73363D36330D0A0D0A78 ++:00000001FF diff --git a/patch/u-boot/u-boot-dev/u-boot-99-opi-change-build-settings.patch b/patch/u-boot/u-boot-dev/u-boot-99-opi-change-build-settings.patch index 1b5f4fbad..0700db084 100644 --- a/patch/u-boot/u-boot-dev/u-boot-99-opi-change-build-settings.patch +++ b/patch/u-boot/u-boot-dev/u-boot-99-opi-change-build-settings.patch @@ -1,3 +1,13 @@ +diff --git a/configs/orangepi_pc_defconfig b/configs/orangepi_pc_defconfig +index 4e9051d..6fba0b0 100644 +--- a/configs/orangepi_pc_defconfig ++++ b/configs/orangepi_pc_defconfig +@@ -17,3 +17,5 @@ CONFIG_USB_EHCI_HCD=y + CONFIG_USB1_VBUS_PIN="" + CONFIG_USB2_VBUS_PIN="" + CONFIG_USB3_VBUS_PIN="" ++CONFIG_DM=y ++CONFIG_DM_GPIO=y diff -Nur a/configs/orangepi_h3_defconfig b/configs/orangepi_h3_defconfig --- a/configs/orangepi_h3_defconfig 1970-01-01 01:00:00.000000000 +0100 +++ b/configs/orangepi_h3_defconfig 2016-02-19 00:58:31.007705977 +0100 @@ -23,16 +33,6 @@ diff -Nur a/configs/orangepi_h3_defconfig b/configs/orangepi_h3_defconfig +CONFIG_USB3_VBUS_PIN="" +CONFIG_DM=y +CONFIG_DM_GPIO=y -diff --git a/configs/orangepi_pc_defconfig b/configs/orangepi_pc_defconfig -index 4e9051d..6fba0b0 100644 ---- a/configs/orangepi_pc_defconfig -+++ b/configs/orangepi_pc_defconfig -@@ -17,3 +17,5 @@ CONFIG_USB_EHCI_HCD=y - CONFIG_USB1_VBUS_PIN="" - CONFIG_USB2_VBUS_PIN="" - CONFIG_USB3_VBUS_PIN="" -+CONFIG_DM=y -+CONFIG_DM_GPIO=y diff --git a/configs/orangepi_plus_defconfig b/configs/orangepi_plus_defconfig index ff124bd..d78f8c7 100644 --- a/configs/orangepi_plus_defconfig @@ -43,3 +43,341 @@ index ff124bd..d78f8c7 100644 CONFIG_SYS_EXTRA_OPTIONS="SATAPWR=SUNXI_GPG(11)" +CONFIG_DM=y +CONFIG_DM_GPIO=y +diff --git a/configs/Sinovoip_BPI_M2_plus_defconfig b/configs/Sinovoip_BPI_M2_plus_defconfig +new file mode 100644 +index 0000000..2e7c095 +--- /dev/null ++++ b/configs/Sinovoip_BPI_M2_plus_defconfig +@@ -0,0 +1,17 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_SUNXI=y ++CONFIG_MACH_SUN8I_H3=y ++CONFIG_DRAM_CLK=672 ++CONFIG_DRAM_ZQ=3881979 ++CONFIG_DRAM_ODT_EN=y ++# CONFIG_VIDEO is not set ++CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-bananapi-m2plus" ++# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set ++CONFIG_SPL=y ++# CONFIG_CMD_IMLS is not set ++# CONFIG_CMD_FLASH is not set ++# CONFIG_CMD_FPGA is not set ++CONFIG_CMD_GPIO=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_DM=y ++CONFIG_DM_GPIO=y +diff --git a/arch/arm/dts/sun8i-h3-bananapi-m2plus.dts b/arch/arm/dts/sun8i-h3-bananapi-m2plus.dts +new file mode 100644 +index 0000000..da6481f +--- /dev/null ++++ b/arch/arm/dts/sun8i-h3-bananapi-m2plus.dts +@@ -0,0 +1,234 @@ ++/* ++ * Copyright (C) 2015 Jens Kuske ++ * ++ * This file is dual-licensed: you can use it either under the terms ++ * of the GPL or the X11 license, at your option. Note that this dual ++ * licensing only applies to this file, and not this project as a ++ * whole. ++ * ++ * a) This file is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This file is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Or, alternatively, ++ * ++ * b) Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, ++ * copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following ++ * conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/dts-v1/; ++#include "sun8i-h3.dtsi" ++#include "sunxi-common-regulators.dtsi" ++ ++#include ++#include ++#include ++ ++/ { ++ model = "Sinovoip Banana Pi M2 Plus"; ++ compatible = "sinovoip,bananapi-m2-plus", "allwinner,sun8i-h3"; ++ ++ aliases { ++ serial0 = &uart0; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&leds_r_opc>; ++ ++ status_led { ++ label = "bananapi:red:status"; ++ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; ++ default-state = "on"; ++ }; ++ }; ++ ++ r_gpio_keys { ++ compatible = "gpio-keys"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sw_r_opc>; ++ ++ sw2 { ++ label = "sw2"; ++ linux,code = ; ++ gpios = <&r_pio 0 4 GPIO_ACTIVE_LOW>; ++ }; ++ ++ sw4 { ++ label = "sw4"; ++ linux,code = ; ++ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++ ++ wifi_pwrseq: wifi_pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&wifi_pwrseq_pin_orangepi>; ++ reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 WIFI_EN */ ++ }; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&gmac_power_pin_orangepi>; ++ regulator-name = "gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++&ehci1 { ++ status = "okay"; ++}; ++ ++&ehci2 { ++ status = "okay"; ++}; ++ ++&ohci1 { ++ status = "okay"; ++}; ++ ++&ohci2 { ++ status = "okay"; ++}; ++ ++&ir { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ir_pins_a>; ++ status = "okay"; ++}; ++ ++&mmc0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin>; ++ vmmc-supply = <®_vcc3v3>; ++ bus-width = <4>; ++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */ ++ cd-inverted; ++ status = "okay"; ++}; ++ ++&mmc1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc1_pins_a>; ++ vmmc-supply = <®_vcc3v3>; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ bus-width = <4>; ++ non-removable; ++ status = "okay"; ++}; ++ ++&r_pio { ++ leds_r_opc: led_pins@0 { ++ allwinner,pins = "PL10"; ++ allwinner,function = "gpio_out"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++ ++ sw_r_opc: key_pins@0 { ++ allwinner,pins = "PL3", "PL4"; ++ allwinner,function = "gpio_in"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++ ++ wifi_pwrseq_pin_orangepi: wifi_pwrseq_pin@0 { ++ allwinner,pins = "PL7"; ++ allwinner,function = "gpio_out"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++}; ++ ++®_usb1_vbus { ++ gpio = <&pio 6 13 GPIO_ACTIVE_HIGH>; ++ status = "okay"; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins_a>; ++ status = "okay"; ++}; ++ ++&usb1_vbus_pin_a { ++ allwinner,pins = "PG13"; ++}; ++ ++&usbphy { ++ usb1_vbus-supply = <®_usb1_vbus>; ++ status = "okay"; ++}; ++ ++&mmc2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc2_8bit_pins>; ++ vmmc-supply = <®_vcc3v3>; ++ bus-width = <8>; ++ non-removable; ++ cap-mmc-hw-reset; ++ status = "okay"; ++}; ++ ++&mmc2_8bit_pins { ++ /* Increase drive strength for DDR modes */ ++ allwinner,drive = ; ++ /* eMMC is missing pull-ups */ ++ allwinner,pull = ; ++}; ++ ++&pio { ++ gmac_power_pin_orangepi: gmac_power_pin@0 { ++ allwinner,pins = "PD6"; ++ allwinner,function = "gpio_out"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emac_rgmii_pins>; ++ phy = <&phy1>; ++ phy-mode = "rgmii"; ++ phy-supply = <®_gmac_3v3>; ++ status = "okay"; ++ phy1: ethernet-phy@1 { ++ reg = <0>; ++ }; ++}; +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +old mode 100644 +new mode 100755 +index 01cf030..80c1630 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -208,7 +208,8 @@ dtb-$(CONFIG_MACH_SUN8I_A83T) += \ + dtb-$(CONFIG_MACH_SUN8I_H3) += \ + sun8i-h3-orangepi-2.dtb \ + sun8i-h3-orangepi-pc.dtb \ +- sun8i-h3-orangepi-plus.dtb ++ sun8i-h3-orangepi-plus.dtb \ ++ sun8i-h3-bananapi-m2plus.dtb + dtb-$(CONFIG_MACH_SUN50I) += \ + pine64_plus.dtb + dtb-$(CONFIG_MACH_SUN9I) += \ +diff --git a/arch/arm/dts/sun8i-h3.dtsi b/arch/arm/dts/sun8i-h3.dtsi +index c2f63c5..e7b6334 100644 +--- a/arch/arm/dts/sun8i-h3.dtsi ++++ b/arch/arm/dts/sun8i-h3.dtsi +@@ -501,6 +501,17 @@ + interrupt-controller; + #interrupt-cells = <3>; + ++ emac_rgmii_pins: emac0@0 { ++ allwinner,pins = "PD0", "PD1", "PD2", "PD3", ++ "PD4", "PD5", "PD7", ++ "PD8", "PD9", "PD10", ++ "PD12", "PD13", "PD15", ++ "PD16", "PD17"; ++ allwinner,function = "emac"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; ++ + uart0_pins_a: uart0@0 { + allwinner,pins = "PA4", "PA5"; + allwinner,function = "uart0"; +@@ -530,6 +541,16 @@ + allwinner,drive = ; + allwinner,pull = ; + }; ++ ++ mmc2_8bit_pins: mmc2_8bit { ++ allwinner,pins = "PC5", "PC6", "PC8", ++ "PC9", "PC10", "PC11", ++ "PC12", "PC13", "PC14", ++ "PC15", "PC16"; ++ allwinner,function = "mmc2"; ++ allwinner,drive = ; ++ allwinner,pull = ; ++ }; + }; + + ahb_rst: reset@01c202c0 { +@@ -616,6 +637,19 @@ + status = "disabled"; + }; + ++ emac: ethernet@1c30000 { ++ compatible = "allwinner,sun8i-h3-emac"; ++ reg = <0x01c30000 0x104>; ++ interrupts = ; ++ resets = <&ahb_rst 17>, <&ahb_rst 66>; ++ reset-names = "ahb", "ephy"; ++ clocks = <&bus_gates 17>, <&bus_gates 128>; ++ clock-names = "bus_gmac", "bus_ephy"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ + gic: interrupt-controller@01c81000 { + compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic"; + reg = <0x01c81000 0x1000>, diff --git a/patch/u-boot/u-boot-dev/u-boot-fix-3f9f8a5b83f8aec40c9f4ee496046a695e333c45-null-pointer-dereference.patch b/patch/u-boot/u-boot-dev/u-boot-fix-3f9f8a5b83f8aec40c9f4ee496046a695e333c45-null-pointer-dereference.patch new file mode 100644 index 000000000..056d8d1e1 --- /dev/null +++ b/patch/u-boot/u-boot-dev/u-boot-fix-3f9f8a5b83f8aec40c9f4ee496046a695e333c45-null-pointer-dereference.patch @@ -0,0 +1,15 @@ +diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c +index 598f444..fa5d584 100644 +--- a/drivers/usb/host/ehci-hcd.c ++++ b/drivers/usb/host/ehci-hcd.c +@@ -1615,8 +1615,8 @@ int ehci_register(struct udevice *dev, struct ehci_hccr *hccr, + if (ret) + goto err; + +- if (ops->init_after_reset) { +- ret = ops->init_after_reset(ctrl); ++ if (ctrl->ops.init_after_reset) { ++ ret = ctrl->ops.init_after_reset(ctrl); + if (ret) + goto err; + }