From 5a2c4a0f6b0dfed94801076376e8c3f36c372dd5 Mon Sep 17 00:00:00 2001 From: HurricanePootis <53066639+HurricanePootis@users.noreply.github.com> Date: Sat, 14 Mar 2026 02:01:13 -0500 Subject: [PATCH] Update to v11.016.00 --- Makefile | 4 +- r8127.h | 84 +- r8127_dash.c | 573 ++++++++++ r8127_dash.h | 2 +- r8127_fiber.c | 235 +++- r8127_fiber.h | 5 +- r8127_firmware.c | 2 +- r8127_firmware.h | 2 +- r8127_n.c | 2795 ++++++++++++++++++++++++++++++---------------- r8127_ptp.c | 16 +- r8127_ptp.h | 2 +- r8127_realwow.h | 2 +- r8127_rss.c | 4 +- r8127_rss.h | 2 +- rtl_eeprom.c | 2 +- rtl_eeprom.h | 2 +- rtltool.c | 2 +- rtltool.h | 2 +- 18 files changed, 2753 insertions(+), 983 deletions(-) create mode 100644 r8127_dash.c diff --git a/Makefile b/Makefile index 3ca5146..34fad90 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -32,7 +32,7 @@ CONFIG_SOC_LAN = y ENABLE_REALWOW_SUPPORT = n -ENABLE_DASH_SUPPORT = n +ENABLE_DASH_SUPPORT = y CONFIG_DOWN_SPEED_100 = n CONFIG_ASPM = y ENABLE_S5WOL = y diff --git a/r8127.h b/r8127.h index f7a3848..cf9eb4f 100644 --- a/r8127.h +++ b/r8127.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -213,6 +213,20 @@ static inline void fsleep(unsigned long usecs) } #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0) */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,4,92) +/* Iterate through singly-linked GSO fragments of an skb. */ +#define skb_list_walk_safe(first, skb, next_skb) \ + for ((skb) = (first), (next_skb) = (skb) ? (skb)->next : NULL; (skb); \ + (skb) = (next_skb), (next_skb) = (skb) ? (skb)->next : NULL) +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,4,92) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,217) +static inline void skb_mark_not_on_list(struct sk_buff *skb) +{ + skb->next = NULL; +} +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4,14,217) */ + #if LINUX_VERSION_CODE < KERNEL_VERSION(5,2,0) #define netdev_xmit_more() (0) #endif @@ -435,6 +449,13 @@ do { \ #if !defined(HAVE_FREE_NETDEV) && (LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0)) #define free_netdev(x) kfree(x) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) +#define RTL_NAPI_DEL(priv) +#else +#define RTL_NAPI_DEL(priv) netif_napi_del(&priv->napi) +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) +#else +#define RTL_NAPI_DEL(priv) #endif #ifndef SET_NETDEV_DEV @@ -618,12 +639,12 @@ static inline u32 rtl8127_ethtool_adv_to_mmd_eee_adv_cap2_t(u32 adv) #define RSS_SUFFIX "" #endif -#define RTL8127_VERSION "11.015.00" NAPI_SUFFIX DASH_SUFFIX REALWOW_SUFFIX PTP_SUFFIX RSS_SUFFIX +#define RTL8127_VERSION "11.016.00" NAPI_SUFFIX DASH_SUFFIX REALWOW_SUFFIX PTP_SUFFIX RSS_SUFFIX #define MODULENAME "r8127" #define PFX MODULENAME ": " #define GPL_CLAIM "\ -r8127 Copyright (C) 2025 Realtek NIC software team \n \ +r8127 Copyright (C) 2026 Realtek NIC software team \n \ This program comes with ABSOLUTELY NO WARRANTY; for details, please see . \n \ This is free software, and you are welcome to redistribute it under certain conditions; see . \n" @@ -698,6 +719,7 @@ This is free software, and you are welcome to redistribute it under certain cond #define Jumbo_Frame_7k (7*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN) #define Jumbo_Frame_8k (8*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN) #define Jumbo_Frame_9k (9*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN) +#define Jumbo_Frame_16k (16*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN) #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define RxEarly_off_V1 (0x07 << 11) #define RxEarly_off_V2 (1 << 11) @@ -727,11 +749,13 @@ This is free software, and you are welcome to redistribute it under certain cond #define R8127_MAX_MSIX_VEC 64 #define R8127_MAX_RX_QUEUES_VEC_V3 (16) #define R8127_MAX_RX_QUEUES_VEC_V4 (8) +#define R8127_RX_QUEUE_NUM (8) #define RTL8127_TX_TIMEOUT (6 * HZ) #define RTL8127_LINK_TIMEOUT (1 * HZ) #define RTL8127_ESD_TIMEOUT (2 * HZ) #define RTL8127_DASH_TIMEOUT (0) +#define RTL8127_CHECK_SDS_SFP_CAP_TIMEOUT (2 * HZ) #define rtl8127_rx_page_size(order) (PAGE_SIZE << order) @@ -752,11 +776,12 @@ This is free software, and you are welcome to redistribute it under certain cond #define RT_VALN_HLEN 4 /* 4(single vlan) bytes */ #endif -#define R8127_MAX_TX_QUEUES (2) +#define R8127_MAX_TX_QUEUES (8) #define R8127_MAX_RX_QUEUES_V2 (4) #define R8127_MAX_RX_QUEUES_V3 (16) #define R8127_MAX_RX_QUEUES R8127_MAX_RX_QUEUES_V3 #define R8127_MAX_QUEUES R8127_MAX_RX_QUEUES +#define R8127_TX_QUEUE_NUM (8) #define OCP_STD_PHY_BASE 0xa400 @@ -979,12 +1004,6 @@ typedef int napi_budget; #define RTL_NAPI_DISABLE(dev, napi) napi_disable(napi) #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) -#define RTL_NAPI_DEL(priv) -#else -#define RTL_NAPI_DEL(priv) netif_napi_del(&priv->napi) -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) - /*****************************************************************************/ #ifdef CONFIG_R8127_NAPI #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) @@ -1489,7 +1508,10 @@ enum RTL8127_registers { INT_CFG1_8125 = 0x7A, EPHY_RXER_NUM = 0x7C, EPHYAR = 0x80, + LEDSEL_2_8125 = 0x84, + LEDSEL_1_8125 = 0x86, TimeInt2 = 0x8C, + LEDSEL_3_8125 = 0x96, OCPDR = 0xB0, MACOCP = 0xB0, OCPAR = 0xB4, @@ -1934,6 +1956,10 @@ enum _DescStatusBit { LargeSend = (1 << 27), /* TCP Large Send Offload (TSO) */ GiantSendv4 = (1 << 26), /* TCP Giant Send Offload V4 (GSOv4) */ GiantSendv6 = (1 << 25), /* TCP Giant Send Offload V6 (GSOv6) */ + GiantSendEn_V3 = (1 << 16), /* Giant Send Offload Enable V3 */ + GiantSendv4_V3 = (1 << 29), /* IPv4 Giant Send Offload V3 */ + GiantSendv6_V3 = (0), /* IPv6 Giant Send Offload V3 */ + GiantSendTCP_V3 = (1 << 30), /* TCP Giant Send Offload V3 */ LargeSend_DP = (1 << 16), /* TCP Large Send Offload (TSO) */ MSSShift = 16, /* MSS value position */ MSSMask = 0x7FFU, /* MSS value 11 bits */ @@ -2065,6 +2091,10 @@ enum bits { BIT_31 = (1 << 31) }; +/* Phy Fuse Dout */ +#define R8127_PHY_FUSE_DOUT_NUM (32) +#define R8127_MAX_PHY_FUSE_DOUT_NUM R8127_PHY_FUSE_DOUT_NUM + #define RTL8127_CP_NUM 4 #define RTL8127_MAX_SUPPORT_CP_LEN 110 @@ -2087,14 +2117,11 @@ enum efuse { #define RsvdMaskV3 0x3fff8000 #define RsvdMaskV4 RsvdMaskV3 +/* Tx desc V3 */ struct TxDesc { u32 opts1; u32 opts2; u64 addr; - u32 reserved0; - u32 reserved1; - u32 reserved2; - u32 reserved3; }; struct RxDesc { @@ -2234,6 +2261,9 @@ enum r8127_flag { R8127_FLAG_TASK_ESD_CHECK_PENDING, R8127_FLAG_TASK_LINKCHG_CHECK_PENDING, R8127_FLAG_TASK_DASH_CHECK_PENDING, + R8127_FLAG_TASK_SDS_SFP_CAP_PENDING, + R8127_FLAG_SHUTDOWN, + R8127_FLAG_SUSPEND, R8127_FLAG_MAX }; @@ -2646,11 +2676,13 @@ struct rtl8127_private { struct work_struct esd_task; struct work_struct linkchg_task; struct work_struct dash_task; + struct sds_sfp_cap_task dash_task; #else struct delayed_work reset_task; struct delayed_work esd_task; struct delayed_work linkchg_task; struct delayed_work dash_task; + struct delayed_work sds_sfp_cap_task; #endif DECLARE_BITMAP(task_flags, R8127_FLAG_MAX); unsigned features; @@ -2691,11 +2723,13 @@ struct rtl8127_private { u8 RequirePhyMdiSwapPatch; + u32 HwSerDesSfpCap; + u32 HwFiberModeVer; u32 HwFiberStat; u8 HwSwitchMdiToFiber; - u16 NicCustLedValue; + u16 BackupLedSel[4]; u8 HwSuppMagicPktVer; @@ -2712,6 +2746,10 @@ struct rtl8127_private { u32 HwPcieSNOffset; + u8 HwSuppEsdVer; + u8 TestPhyOcpReg; + u16 BackupPhyFuseDout[R8127_MAX_PHY_FUSE_DOUT_NUM]; + u32 MaxTxDescPtrMask; u8 HwSuppTxNoCloseVer; u8 EnableTxNoClose; @@ -2731,6 +2769,8 @@ struct rtl8127_private { u8 ring_lib_enabled; + u8 recheck_desc_ownbit; + const char *fw_name; struct rtl8127_fw *rtl_fw; u32 ocp_base; @@ -2759,18 +2799,11 @@ struct rtl8127_private { u32 OobReqComplete; u32 OobAckComplete; - u8 RcvFwReqSysOkEvt; - u8 RcvFwDashOkEvt; - u8 SendFwHostOkEvt; - - u8 DashFwDisableRx; - u8 SendingToFw; u32 RecvFromDashFwCnt; u8 DashReqRegValue; - u16 HostReqValue; //Dash----------------- #endif //ENABLE_DASH_SUPPORT @@ -2837,6 +2870,7 @@ struct rtl8127_private { u16 MacMcuPageSize; u64 hw_mcu_patch_code_ver; u64 bin_mcu_patch_code_ver; + u8 hw_has_mac_mcu_patch_code; u8 HwSuppTcamVer; @@ -2943,7 +2977,7 @@ enum mcfg { //Ram Code Version #define NIC_RAMCODE_VERSION_CFG_METHOD_1 (0x0015) -#define NIC_RAMCODE_VERSION_CFG_METHOD_2 (0x0036) +#define NIC_RAMCODE_VERSION_CFG_METHOD_2 (0x0051) //hwoptimize #define HW_PATCH_SOC_LAN (BIT_0) @@ -2951,6 +2985,10 @@ enum mcfg { static const u16 other_q_intr_mask = (RxOK1 | RxDU1); +#define HW_PHY_STATUS_INI 1 +#define HW_PHY_STATUS_EXT_INI 2 +#define HW_PHY_STATUS_LAN_ON 3 + void rtl8127_mdio_write(struct rtl8127_private *tp, u16 RegAddr, u16 value); void rtl8127_mdio_prot_write(struct rtl8127_private *tp, u32 RegAddr, u32 value); void rtl8127_mdio_prot_direct_write_phy_ocp(struct rtl8127_private *tp, u32 RegAddr, u32 value); diff --git a/r8127_dash.c b/r8127_dash.c new file mode 100644 index 0000000..aceb205 --- /dev/null +++ b/r8127_dash.c @@ -0,0 +1,573 @@ +/* +################################################################################ +# +# r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. +# +# This program 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 program 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. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Author: +# Realtek NIC software team +# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan +# +################################################################################ +*/ + +/************************************************************************************ + * This product is covered by one or more of the following patents: + * US6,570,884, US6,115,776, and US6,327,625. + ***********************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "r8127.h" +#include "r8127_dash.h" +#include "rtl_eeprom.h" + +static void r8127_dash_set_ipc2_reg_bit(struct rtl8127_private *tp, unsigned long reg, u32 mask) +{ + RTL_DASH_IPC2_W32(tp, reg, RTL_DASH_IPC2_R32(tp, reg) | mask); +} + +/* +static void r8127_dash_clear_ipc2_reg_bit(struct rtl8127_private *tp, unsigned long reg, u32 mask) +{ + RTL_DASH_IPC2_W32(tp, reg, RTL_DASH_IPC2_R32(tp, reg) & ~mask); +} +*/ + +static void r8127_write_ipc2_tx_ack(struct rtl8127_private *tp) +{ + if (!tp->DASH) + return; + + if (!HW_DASH_SUPPORT_IPC2(tp)) + return; + + r8127_dash_set_ipc2_reg_bit(tp, IPC2_TX_SET_REG, IPC2_TX_ACK_BIT); +} + +static void r8127_write_ipc2_tx_polling(struct rtl8127_private *tp) +{ + if (!tp->DASH) + return; + + if (!HW_DASH_SUPPORT_IPC2(tp)) + return; + + r8127_dash_set_ipc2_reg_bit(tp, IPC2_TX_SET_REG, IPC2_TX_SEND_BIT); +} + +static unsigned long +r8127_get_ipc2_rx_buffer(struct rtl8127_private *tp) +{ + if (HW_DASH_SUPPORT_IPC2(tp)) + return IPC2_RX_BUFFER; + else + return 0; +} + +static u8 rtl8127_copy_from_ipc2(struct rtl8127_private *tp, u8 *dest, u32 len) +{ + unsigned long const data_reg = r8127_get_ipc2_rx_buffer(tp); + u32 offset = 0; + u32 *pDword; + u8 *pByte; + + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + goto exit; + + if (!dest) + goto exit; + + if (len == 0) + goto exit; + + pDword = (u32*)dest; + while (len > 3 && offset < (IPC2_BUFFER_LENGTH - 4)) { + *pDword++ = RTL_DASH_IPC2_R32(tp, data_reg + offset); + + len -= 4; + offset += 4; + } + + pByte = (u8*)pDword; + while (len > 0 && offset < (IPC2_BUFFER_LENGTH - 1)) { + *pByte++ = RTL_DASH_IPC2_R8(tp, data_reg + offset); + + len -= 1; + offset += 1; + } + +exit: + return (len == 0) ? TRUE : FALSE; +} + +static void RecvFromDashFwComplete(struct rtl8127_private *tp) +{ + if (!tp->DASH) + return; + + if (!HW_DASH_SUPPORT_IPC2(tp)) + return; + + if (tp->DashReqRegValue == DASH_OOB_HDR_TYPE_REQ) { //rok + RX_DASH_BUFFER_TYPE_2 rxDashBufferType2 = {0}; + u32 dataLen; + + if (!tp->OobReq) + goto exit; + + /* copy header for check data length */ + if (!rtl8127_copy_from_ipc2(tp, + (u8*)&rxDashBufferType2, + sizeof(rxDashBufferType2))) + goto exit; + + dataLen = (u16)rxDashBufferType2.oobhdr.len; + + tp->AfterRecvFromFwBufLen = dataLen + sizeof(OSOOBHdr); + if (tp->AfterRecvFromFwBufLen > tp->SizeOfRecvFromFwBuffer) { + tp->AfterRecvFromFwBufLen = tp->SizeOfRecvFromFwBuffer; + tp->RecvFromFwBufErrCnt++; + } + + /* copy data */ + rtl8127_copy_from_ipc2(tp, + tp->AfterRecvFromFwBuf, + tp->AfterRecvFromFwBufLen); + + r8127_write_ipc2_tx_ack(tp); + + tp->OobReqComplete = TRUE; + + tp->RecvFromDashFwCnt++; + } else if (tp->DashReqRegValue == DASH_OOB_HDR_TYPE_ACK) { //rx ack + if (!tp->OobAck) + goto exit; + + tp->OobAckComplete = TRUE; + + tp->RecvFromDashFwCnt++; + } + +exit: + return; +} + +static unsigned long r8127_get_ipc2_tx_buffer(struct rtl8127_private *tp) +{ + if (HW_DASH_SUPPORT_IPC2(tp)) + return IPC2_TX_BUFFER; + else + return 0; +} + +static u32 rtl8127_copy_to_ipc2(struct rtl8127_private *tp, u8 *src, u32 len) +{ + unsigned long const data_reg = r8127_get_ipc2_tx_buffer(tp); + u32 offset = 0; + u32 *pDword; + u8 *pByte; + + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + goto exit; + + if (!src) + goto exit; + + if (len == 0) + goto exit; + + pDword = (u32*)src; + while (len > 3 && offset < (IPC2_BUFFER_LENGTH - 4)) { + RTL_DASH_IPC2_W32(tp, data_reg + offset, *pDword++); + + len -= 4; + offset += 4; + } + + pByte = (u8*)pDword; + while (len > 0 && offset < (IPC2_BUFFER_LENGTH - 1)) { + RTL_DASH_IPC2_W8(tp, data_reg + offset, *pByte++); + + len -= 1; + offset += 1; + } + +exit: + return offset; +} + +static int SendToDashFw(struct rtl8127_private *tp, u8 *src, u16 len) +{ + POSOOBHdr pOobHdr; + int rc = -1; + + if (!tp->DASH) + goto exit; + + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + goto exit; + + if (TRUE == tp->SendingToFw) + goto exit; + + if (!src) + goto exit; + + if (len > tp->SizeOfSendToFwBuffer) + goto exit; + + if (len < sizeof(OSOOBHdr)) + goto exit; + + pOobHdr = (POSOOBHdr)src; + if (pOobHdr->hostReqV == DASH_OOB_HDR_TYPE_REQ) { + r8127_write_ipc2_tx_ack(tp); + rc = 0; + goto exit; + } + + tp->SendingToFw = TRUE; + + rtl8127_copy_to_ipc2(tp, src, len); + + r8127_write_ipc2_tx_polling(tp); + + tp->SendingToFw = FALSE; + + rc = 0; + +exit: + if (!rc) + tp->AfterSendToFwBufLen = len; + else + tp->AfterSendToFwBufLen = 0; + + return rc; +} + +static u32 rtl8127_get_ipc2_isr(struct rtl8127_private *tp) +{ + u32 isr = 0; + + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + goto exit; + + isr = RTL_DASH_IPC2_R32(tp, IPC2_RX_STATUS_REG); + + if (isr == ULONG_MAX) + isr = 0; + +exit: + return isr; +} + +static void rtl8127_set_ipc2_isr(struct rtl8127_private *tp, u32 val) +{ + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + return; + + RTL_DASH_IPC2_W32(tp, IPC2_RX_CLEAR_REG, val); +} + +void rtl8127_clear_ipc2_isr(struct rtl8127_private *tp) +{ + rtl8127_set_ipc2_isr(tp, rtl8127_get_ipc2_isr(tp)); +} + +void rtl8127_set_ipc2_soc_imr_bit(struct rtl8127_private *tp, u32 mask) +{ + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + return; + + RTL_W32(tp, RISC_IMR_8127AP, RTL_R16(tp, RISC_IMR_8127AP) | mask); +} + +void rtl8127_clear_ipc2_soc_imr_bit(struct rtl8127_private *tp, u32 mask) +{ + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + return; + + RTL_W32(tp, RISC_IMR_8127AP, RTL_R16(tp, RISC_IMR_8127AP) & ~mask); +} + +bool rtl8127_check_dash_interrupt(struct rtl8127_private *tp) +{ + bool rc = false; + u32 isr; + + if(!tp->DASH) + goto exit; + + if (FALSE == HW_DASH_SUPPORT_IPC2(tp)) + goto exit; + + isr = rtl8127_get_ipc2_isr(tp); + + if (isr & (IPC2_RX_ROK_BIT | IPC2_RX_ACK_BIT)) { + set_bit(R8127_RCV_REQ_DASH_OK, tp->dash_req_flags); + if (isr & IPC2_RX_ROK_BIT) + tp->DashReqRegValue = DASH_OOB_HDR_TYPE_REQ; + else + tp->DashReqRegValue = DASH_OOB_HDR_TYPE_ACK; + } + + rtl8127_set_ipc2_isr(tp, isr); + +exit: + return rc; +} + +void rtl8127_handle_dash_interrupt(struct net_device *dev) +{ + struct rtl8127_private *tp = netdev_priv(dev); + + if(!tp->DASH) + return; + + if (test_and_clear_bit(R8127_RCV_REQ_DASH_OK, tp->dash_req_flags)) + RecvFromDashFwComplete(tp); +} + +static int DashIoctlGetRcvFromFwData(struct net_device *dev, struct rtl_dash_ioctl_struct *prtl_dash_usrdata) +{ + struct rtl8127_private *tp = netdev_priv(dev); + u32 ulInfoLen; + void *InformationBuffer; + u32 InformationBufferLength; + void *pInfo; + u8 *pByte; + u16 *pWord; + u8 *tmpBuf; + int ret = -EFAULT; + + if (!tp->DASH) + goto exit; + + if (!tp->rtk_enable_diag) + goto exit; + + if (tp->AfterRecvFromFwBufLen == 0) + goto exit; + + InformationBufferLength = prtl_dash_usrdata->len; + InformationBuffer = prtl_dash_usrdata->data_buffer; + + ulInfoLen = tp->AfterRecvFromFwBufLen + 2 + 2; + if (InformationBufferLength < ulInfoLen) { + ret = -EFAULT; + goto exit; + } + + if (!(tmpBuf = kmalloc(ulInfoLen, GFP_ATOMIC))) { + ret = -ENOMEM; + goto exit; + } + + pInfo = (void*) tp->AfterRecvFromFwBuf; + pWord = (u16*) tmpBuf; + *pWord++ = tp->AfterRecvFromFwBufLen; + pByte = (u8*)pWord; + memcpy(pByte, pInfo, tp->AfterRecvFromFwBufLen); + pWord = (u16*)(pByte + tp->AfterRecvFromFwBufLen); + *pWord= tp->DashReqRegValue; + tp->AfterRecvFromFwBufLen = 0; + if (copy_to_user(InformationBuffer, tmpBuf, ulInfoLen)) { + kfree(tmpBuf); + ret = -EFAULT; + goto exit; + } + kfree(tmpBuf); + ret = 0; + +exit: + return ret; +} + +static int DashIoctlCheckSendBufferToFwComplete(struct net_device *dev, struct rtl_dash_ioctl_struct *prtl_dash_usrdata) +{ + struct rtl8127_private *tp = netdev_priv(dev); + u32 ulInfoLen; + void *InformationBuffer; + u32 InformationBufferLength; + u16 *pWord; + u8 *tmpBuf; + int ret = -EFAULT; + + if (!tp->DASH) + goto exit; + + if (!tp->rtk_enable_diag) + goto exit; + + InformationBufferLength = prtl_dash_usrdata->len; + InformationBuffer = prtl_dash_usrdata->data_buffer; + + if (tp->SendingToFw == FALSE) + ulInfoLen = tp->AfterSendToFwBufLen + sizeof(u16); + else + ulInfoLen = sizeof(u16); + + if (InformationBufferLength < ulInfoLen) { + ret = -EFAULT; + goto exit; + } + + if (!(tmpBuf = kmalloc(ulInfoLen, GFP_ATOMIC))) { + ret = -ENOMEM; + goto exit; + } + + pWord = (u16*) tmpBuf; + if (tp->SendingToFw == FALSE) { + *pWord++ = tp->AfterSendToFwBufLen; + memcpy(pWord, tp->AfterSendToFwBuf, tp->AfterSendToFwBufLen); + tp->AfterSendToFwBufLen = 0; + } else { + *pWord = 0xffff; + } + + if (copy_to_user(InformationBuffer, tmpBuf, ulInfoLen)) + ret = -EFAULT; + else + ret = 0; + + kfree(tmpBuf); + +exit: + return ret; +} + +static int DashIoctlCheckSendBufferToFw(struct net_device *dev, struct rtl_dash_ioctl_struct *prtl_dash_usrdata) +{ + struct rtl8127_private *tp = netdev_priv(dev); + u32 ulInfoLen; + void *InformationBuffer; + u32 InformationBufferLength; + u16 *pWord; + u16 SetDataSize; + int ret = -EFAULT; + + if (!tp->DASH) + goto exit; + + if (!tp->rtk_enable_diag) + goto exit; + + InformationBufferLength = prtl_dash_usrdata->len; + if (!(InformationBuffer = kmalloc(InformationBufferLength, GFP_KERNEL))) { + ret = -ENOMEM; + goto exit; + } + + if (copy_from_user(InformationBuffer, prtl_dash_usrdata->data_buffer, + InformationBufferLength)) { + ret = -EFAULT; + goto free_mem; + } + + ulInfoLen = sizeof(u16) + sizeof(u16); + + if (InformationBufferLength < ulInfoLen) + goto free_mem; + + pWord = (u16*) InformationBuffer; + SetDataSize = *pWord++; + + if (InformationBufferLength < (SetDataSize + sizeof(u16) + sizeof(u16))) { + ret = -EFAULT; + goto free_mem; + } + + ret = SendToDashFw(tp, (u8*)pWord, SetDataSize); + +free_mem: + kfree(InformationBuffer); + +exit: + return ret; +} + +int rtl8127_dash_ioctl(struct net_device *dev, struct ifreq *ifr) +{ + struct rtl8127_private *tp = netdev_priv(dev); + void *user_data = ifr->ifr_data; + struct rtl_dash_ioctl_struct rtl_dash_usrdata; + + int ret=0; + + if (FALSE == HW_DASH_SUPPORT_DASH(tp)) + return -EOPNOTSUPP; + + if (!tp->DASH) + return -EINVAL; + + if (copy_from_user(&rtl_dash_usrdata, user_data, + sizeof(struct rtl_dash_ioctl_struct))) + return -EFAULT; + + switch (rtl_dash_usrdata.cmd) { + case RTL_DASH_SEND_BUFFER_DATA_TO_DASH_FW: + ret = DashIoctlCheckSendBufferToFw(dev, &rtl_dash_usrdata); + break; + case RTL_DASH_CHECK_SEND_BUFFER_TO_DASH_FW_COMPLETE: + ret = DashIoctlCheckSendBufferToFwComplete(dev, + &rtl_dash_usrdata); + break; + case RTL_DASH_GET_RCV_FROM_FW_BUFFER_DATA: + ret = DashIoctlGetRcvFromFwData(dev, &rtl_dash_usrdata); + break; + case RTL_DASH_OOB_REQ: + tp->OobReq = TRUE; + tp->OobReqComplete = FALSE; + break; + case RTL_DASH_OOB_ACK: + tp->OobAck = TRUE; + tp->OobAckComplete = FALSE; + break; + case RTL_DASH_DETACH_OOB_REQ: + tp->OobReq = FALSE; + tp->OobReqComplete = FALSE; + break; + case RTL_DASH_DETACH_OOB_ACK: + tp->OobAck = FALSE; + tp->OobAckComplete = FALSE; + break; + default: + return -EOPNOTSUPP; + } + + return ret; +} diff --git a/r8127_dash.h b/r8127_dash.h index ebaccfb..eb9d330 100644 --- a/r8127_dash.h +++ b/r8127_dash.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/r8127_fiber.c b/r8127_fiber.c index daf28d7..8ec43df 100644 --- a/r8127_fiber.c +++ b/r8127_fiber.c @@ -4,7 +4,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -34,6 +34,173 @@ #include "r8127.h" #include "r8127_fiber.h" +#define R8127_SDS_IIC_EN 0xE26C +#define R8127_SDS_IIC_CON 0xE200 +#define R8127_SDS_IIC_TAR 0xE204 +#define R8127_SDS_IIC_DATA_CMD 0xE210 +#define R8127_SDS_IIC_SS_SCL_HCNT 0xE214 +#define R8127_SDS_IIC_SS_SCL_LCNT 0xE218 +#define R8127_SDS_IIC_FS_SCL_HCNT 0xE21C +#define R8127_SDS_IIC_FS_SCL_LCNT 0xE220 +#define R8127_SDS_IIC_INTR_MASK 0xE230 +#define R8127_SDS_IIC_RAW_INTR_STAT 0xE234 +#define R8127_SDS_IIC_RX_TL 0xE238 +#define R8127_SDS_IIC_TX_TL 0xE23C +#define R8127_SDS_IIC_STATUS 0xE270 + +#define R8127_SDS_IIC_TX_FIFO_NOT_FULL BIT_1 +#define R8127_SDS_IIC_RX_FIFO_NOT_EMPTY BIT_3 + +#define R8127_SDS_IIC_CMD_READ BIT_8 //1:read 0:write +#define R8127_SDS_IIC_CMD_STOP BIT_9 +#define R8127_SDS_IIC_CMD_RESTART BIT_10 + +enum { + R8127_SDS_IIC_WRITE_OPERATION = 0, + R8127_SDS_IIC_READ_OPERATION = 1, +}; + +enum { + R8127_SDS_IIC_WO_STOP = 0, + R8127_SDS_IIC_WI_STOP = 1, +}; + +enum { + R8127_SDS_IIC_WO_RESTART = 0, + R8127_SDS_IIC_WI_RESTART = 1, +}; + +static void +rtl8127_sds_If_i2c_Init(struct rtl8127_private *tp) +{ + const u8 dev_addr = 0xA0; + + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_EN, 0); + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_CON, 0x65); + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_TAR, dev_addr / 2); + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_FS_SCL_HCNT, 0x7A30); + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_FS_SCL_LCNT, 0x7A30); + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_EN, 1); +} + +static void +rtl8127_sds_If_i2c_disable(struct rtl8127_private *tp) +{ + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_EN, 0); +} + +static u16 +rtl8127_sds_If_i2c_status(struct rtl8127_private *tp) +{ + return rtl8127_mac_ocp_read(tp, R8127_SDS_IIC_STATUS); +} + +static u16 +rtl8127_sds_If_i2c_rx_full_flag(struct rtl8127_private *tp) +{ + return (rtl8127_sds_If_i2c_status(tp) & R8127_SDS_IIC_RX_FIFO_NOT_EMPTY); +} + +static bool +rtl8127_sds_If_i2c_wait_cmd_done(struct rtl8127_private *tp) +{ + u32 timeout = 0, waitcount = 1000; + + do { + if ((rtl8127_sds_If_i2c_status(tp) & R8127_SDS_IIC_TX_FIFO_NOT_FULL)) + return true; + else + udelay(1); + } while (++timeout < waitcount); + + return false; +} + +static u8 +rtl8127_sds_If_i2c_data_cmd_read_byte(struct rtl8127_private *tp) +{ + return (u8)rtl8127_mac_ocp_read(tp, R8127_SDS_IIC_DATA_CMD); +} + +static void +rtl8127_sds_If_i2c_send_cmd(struct rtl8127_private *tp, u8 rw, u8 stop_en, + u8 restart_en) +{ + u16 data; + + rtl8127_sds_If_i2c_wait_cmd_done(tp); + + data = 0; + if (rw == R8127_SDS_IIC_READ_OPERATION) + data |= R8127_SDS_IIC_CMD_READ; + if (stop_en == R8127_SDS_IIC_WI_STOP) + data |= R8127_SDS_IIC_CMD_STOP; + if (restart_en == R8127_SDS_IIC_WI_RESTART) + data |= R8127_SDS_IIC_CMD_RESTART; + + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_DATA_CMD, data); +} + +static void +rtl8127_sds_If_i2c_send_data(struct rtl8127_private *tp, u8 *wdata, u16 len, u8 stop_en) +{ + u16 data; + + if (!wdata) + return; + + while (len) { + rtl8127_sds_If_i2c_wait_cmd_done(tp); + + data = *wdata; + if (len == 1 && stop_en == R8127_SDS_IIC_WI_STOP) + data |= R8127_SDS_IIC_CMD_STOP; + rtl8127_mac_ocp_write(tp, R8127_SDS_IIC_DATA_CMD, data); + + len--; + wdata++; + } +} + +static u8 +rtl8127_sds_If_i2c_read_byte(struct rtl8127_private *tp, u8 addr) +{ + u32 timeout = 0, waitcount = 10000; + u8 data; + + rtl8127_sds_If_i2c_send_data(tp, &addr, 1, R8127_SDS_IIC_WO_STOP); + rtl8127_sds_If_i2c_send_cmd(tp, R8127_SDS_IIC_READ_OPERATION, R8127_SDS_IIC_WI_STOP, R8127_SDS_IIC_WI_RESTART); + while (rtl8127_sds_If_i2c_rx_full_flag(tp) == 0 && timeout++ < waitcount) + udelay(1); + + if (timeout < waitcount) + data = rtl8127_sds_If_i2c_data_cmd_read_byte(tp); + else + data = U8_MAX; + + return data; +} + +bool +rtl8127_sds_If_i2c_is_10g_sfp_cap(struct rtl8127_private *tp) +{ + bool b10gSfp; + u8 data; + + rtl8127_sds_If_i2c_Init(tp); + + data = rtl8127_sds_If_i2c_read_byte(tp, 0x0c); + + rtl8127_sds_If_i2c_disable(tp); + + if (data > 0x63 && data < 0x70) + b10gSfp = true; + else + b10gSfp = false; + + return b10gSfp; +} + // sds address #define R8127_SDS_8127_CMD 0x2348 #define R8127_SDS_8127_ADDR 0x234A @@ -148,11 +315,37 @@ rtl8127_sds_phy_reset(struct rtl8127_private *tp) } } +static void +rtl8127_sds_phy_enable_mod_abs_pin_8127(struct rtl8127_private *tp, bool enable) +{ + u16 val; + + val = RTL_R16(tp,0x2400); + if (enable) + val |= BIT_13; + else + val &= ~BIT_13; + RTL_W16(tp, 0x2400, val); +} + +bool +rtl8127_sds_sfp_connected_8127(struct rtl8127_private *tp) +{ + /* 0:connected 1:disconnected */ + return !(RTL_R16(tp, 0x2400) & BIT_12); +} + static void rtl8127_set_sds_phy_caps_1g_8127(struct rtl8127_private *tp) { u16 val; + if (tp->fcpause == rtl8127_fc_full) + rtl8127_set_sds_phy_bit(tp, 0, 2, 4, BIT_8 | BIT_7); + else + rtl8127_clear_sds_phy_bit(tp, 0, 2, 4, BIT_8 | BIT_7); + + rtl8127_set_sds_phy_bit(tp, 0, 1, 31, BIT_3); rtl8127_clear_and_set_sds_phy_bit(tp, 0, @@ -160,10 +353,11 @@ rtl8127_set_sds_phy_caps_1g_8127(struct rtl8127_private *tp) 0, BIT_13 | BIT_12 | BIT_6, BIT_12 | BIT_6); + rtl8127_set_sds_phy_bit(tp, 0, 0, 4, BIT_2); RTL_W16(tp, 0x233A, 0x8004); val = RTL_R16(tp, 0x233E); - val &= (BIT_13 | BIT_12 | BIT_1 | BIT_0); + val &= ~(BIT_13 | BIT_12 | BIT_1 | BIT_0); val |= BIT_1; RTL_W16(tp, 0x233E, val); @@ -175,6 +369,8 @@ rtl8127_set_sds_phy_caps_1g_8127(struct rtl8127_private *tp) 0xC804, 0x000F, 0x000C); + + tp->HwSerDesSfpCap = SPEED_1000; } static void @@ -196,10 +392,16 @@ rtl8127_set_sds_phy_caps_10g_8127(struct rtl8127_private *tp) { u16 val; + if (tp->fcpause == rtl8127_fc_full) + rtl8127_set_sds_phy_bit(tp, 0, 31, 11, BIT_3 | BIT_2); + else + rtl8127_clear_sds_phy_bit(tp, 0, 31, 11, BIT_3 | BIT_2); + + RTL_W16(tp, 0x233A, 0x801A); val = RTL_R16(tp, 0x233E); - val &= (BIT_13 | BIT_12 | BIT_1 | BIT_0); + val &= ~(BIT_13 | BIT_12 | BIT_1 | BIT_0); val |= BIT_12; RTL_W16(tp, 0x233E, val); @@ -211,14 +413,16 @@ rtl8127_set_sds_phy_caps_10g_8127(struct rtl8127_private *tp) 0xC804, 0x000F, 0x000C); + + tp->HwSerDesSfpCap = SPEED_10000; } -static void -rtl8127_set_sds_phy_caps_8127(struct rtl8127_private *tp) +void +_rtl8127_set_sds_phy_caps_8127(struct rtl8127_private *tp, u32 cap) { rtl8127_sds_phy_exit_1g_8127(tp); - switch (tp->speed) { + switch (cap) { case SPEED_10000: rtl8127_set_sds_phy_caps_10g_8127(tp); break; @@ -230,6 +434,25 @@ rtl8127_set_sds_phy_caps_8127(struct rtl8127_private *tp) } } +static void +rtl8127_set_sds_phy_caps_8127(struct rtl8127_private *tp) +{ + u32 cap; + + if (tp->autoneg == AUTONEG_ENABLE) { + if (rtl8127_sds_If_i2c_is_10g_sfp_cap(tp)) + cap = 10000; + else + cap = 1000; + } else { + cap = tp->speed; + } + + rtl8127_sds_phy_enable_mod_abs_pin_8127(tp, true); + + _rtl8127_set_sds_phy_caps_8127(tp, cap); +} + static void rtl8127_set_sds_phy_caps(struct rtl8127_private *tp) { diff --git a/r8127_fiber.h b/r8127_fiber.h index 00d59b6..50553a5 100644 --- a/r8127_fiber.h +++ b/r8127_fiber.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -51,5 +51,8 @@ void rtl8127_sds_phy_write_8127(struct rtl8127_private *tp, u16 index, u16 page, u16 reg, u16 val); void rtl8127_hw_fiber_phy_config(struct rtl8127_private *tp); bool rtl8127_check_fiber_mode_support(struct rtl8127_private *tp); +bool rtl8127_sds_If_i2c_is_10g_sfp_cap(struct rtl8127_private *tp); +bool rtl8127_sds_sfp_connected_8127(struct rtl8127_private *tp); +void _rtl8127_set_sds_phy_caps_8127(struct rtl8127_private *tp, u32 cap); #endif /* _LINUX_R8127_FIBER_H */ diff --git a/r8127_firmware.c b/r8127_firmware.c index 7ab59f6..79a4b81 100644 --- a/r8127_firmware.c +++ b/r8127_firmware.c @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/r8127_firmware.h b/r8127_firmware.h index 6b1acea..153c60f 100644 --- a/r8127_firmware.h +++ b/r8127_firmware.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/r8127_n.c b/r8127_n.c index 86573b6..2279527 100644 --- a/r8127_n.c +++ b/r8127_n.c @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -94,16 +94,15 @@ #include #endif -#define FIRMWARE_8127_1 "rtl_nic/rtl8127-1.fw" -#define FIRMWARE_8127_2 "rtl_nic/rtl8127-2.fw" +#define FIRMWARE_8127A_1 "rtl_nic/rtl8127a-1.fw" static const struct { const char *name; const char *fw_name; } rtl_chip_fw_infos[] = { /* PCI-E devices. */ - [CFG_METHOD_1] = {"RTL8127", FIRMWARE_8127_1}, - [CFG_METHOD_2] = {"RTL8127", FIRMWARE_8127_2}, + [CFG_METHOD_1] = {"RTL8127A", }, + [CFG_METHOD_2] = {"RTL8127A", FIRMWARE_8127A_1}, [CFG_METHOD_DEFAULT] = {"Unknown", }, }; @@ -121,13 +120,13 @@ static const struct { CFG_METHOD_1, Rx_Fetch_Number_8 | Rx_Close_Multiple | RxCfg_pause_slot_en | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST_512 << RxCfgDMAShift), 0xff7e5880, - Jumbo_Frame_9k), + Jumbo_Frame_16k), _R("RTL8127", CFG_METHOD_2, Rx_Fetch_Number_8 | Rx_Close_Multiple | RxCfg_pause_slot_en | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST_512 << RxCfgDMAShift), 0xff7e5880, - Jumbo_Frame_9k), + Jumbo_Frame_16k), _R("Unknown", CFG_METHOD_DEFAULT, @@ -263,8 +262,7 @@ MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); MODULE_LICENSE("GPL"); #ifdef ENABLE_USE_FIRMWARE_FILE -MODULE_FIRMWARE(FIRMWARE_8127_1); -MODULE_FIRMWARE(FIRMWARE_8127_2); +MODULE_FIRMWARE(FIRMWARE_8127A_1); #endif MODULE_VERSION(RTL8127_VERSION); @@ -321,6 +319,9 @@ static int rtl8127_set_speed(struct net_device *dev, u8 autoneg, u32 speed, u8 d static bool rtl8127_set_phy_mcu_patch_request(struct rtl8127_private *tp); static bool rtl8127_clear_phy_mcu_patch_request(struct rtl8127_private *tp); +static u32 rtl8127_pci_config_read(struct rtl8127_private *tp, u32 addr); +static void rtl8127_pci_config_write(struct rtl8127_private *tp, u32 addr, u32 value); + #ifdef CONFIG_R8127_NAPI static int rtl8127_poll(napi_ptr napi, napi_budget budget); #endif @@ -330,16 +331,19 @@ static void rtl8127_reset_task(void *_data); static void rtl8127_esd_task(void *_data); static void rtl8127_linkchg_task(void *_data); static void rtl8127_dash_task(void *_data); +static void rtl8127_sds_sfp_cap_task(void *_data); #else static void rtl8127_reset_task(struct work_struct *work); static void rtl8127_esd_task(struct work_struct *work); static void rtl8127_linkchg_task(struct work_struct *work); static void rtl8127_dash_task(struct work_struct *work); +static void rtl8127_sds_sfp_cap_task(struct work_struct *work); #endif static void rtl8127_schedule_reset_work(struct rtl8127_private *tp); static void rtl8127_schedule_esd_work(struct rtl8127_private *tp); static void rtl8127_schedule_linkchg_work(struct rtl8127_private *tp); void rtl8127_schedule_dash_work(struct rtl8127_private *tp); +static void rtl8127_schedule_sds_sfp_cap_work(struct rtl8127_private *tp); static void rtl8127_init_all_schedule_work(struct rtl8127_private *tp); static void rtl8127_cancel_all_schedule_work(struct rtl8127_private *tp); @@ -617,7 +621,7 @@ static inline struct mii_ioctl_data *if_mii(struct ifreq *rq) } #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7) -static u32 rtl8127_read_thermal_sensor(struct rtl8127_private *tp) +static u16 _rtl8127_read_thermal_sensor(struct rtl8127_private *tp) { u16 ts_digout; @@ -627,6 +631,17 @@ static u32 rtl8127_read_thermal_sensor(struct rtl8127_private *tp) return ts_digout; } +static int rtl8127_read_thermal_sensor(struct rtl8127_private *tp) +{ + int tmp; + + tmp = _rtl8127_read_thermal_sensor(tp); + if (tmp > 512) + return (0 - ((512 - (tmp - 512)) / 2)); + else + return (tmp / 2); +} + int rtl8127_dump_tally_counter(struct rtl8127_private *tp, dma_addr_t paddr) { u32 cmd; @@ -659,10 +674,6 @@ rtl8127_get_hw_clo_ptr(struct rtl8127_tx_ring *ring) struct rtl8127_private *tp = ring->priv; switch (tp->HwSuppTxNoCloseVer) { - case 3: - return RTL_R16(tp, ring->hw_clo_ptr_reg); - case 4: - case 5: case 6: return RTL_R32(tp, ring->hw_clo_ptr_reg); default: @@ -679,10 +690,6 @@ rtl8127_get_sw_tail_ptr(struct rtl8127_tx_ring *ring) struct rtl8127_private *tp = ring->priv; switch (tp->HwSuppTxNoCloseVer) { - case 3: - return RTL_R16(tp, ring->sw_tail_ptr_reg); - case 4: - case 5: case 6: return RTL_R32(tp, ring->sw_tail_ptr_reg); default: @@ -812,12 +819,11 @@ static void rtl8127_get_cp_len(struct rtl8127_private *tp, if (status & _10bps) { tmp_cp_len = -1; } else if (status & (_100bps | _1000bpsF)) { - rtl8127_mdio_write(tp, 0x1f, 0x0a88); - tmp_cp_len = rtl8127_mdio_read(tp, 0x10); - } else if (status & _2500bpsF) { - rtl8127_mdio_write(tp, 0x1f, 0x0acb); - tmp_cp_len = rtl8127_mdio_read(tp, 0x15); - tmp_cp_len >>= 2; + tmp_cp_len = rtl8127_mdio_direct_read_phy_ocp(tp, 0xA880); + } else if (status & (_10000bpsF | _10000bpsL | _5000bpsF | + _5000bpsL | _2500bpsF | _2500bpsL)) { + tmp_cp_len = rtl8127_mdio_direct_read_phy_ocp(tp, 0xAC2E); + tmp_cp_len >>= 5; } else tmp_cp_len = 0; } else @@ -843,12 +849,11 @@ static int __rtl8127_get_cp_status(u16 val) case 0x0060: return rtl8127_cp_normal; case 0x0048: + case 0x0042: return rtl8127_cp_open; case 0x0050: - return rtl8127_cp_short; - case 0x0042: case 0x0044: - return rtl8127_cp_mismatch; + return rtl8127_cp_short; default: return rtl8127_cp_normal; } @@ -862,7 +867,7 @@ static int _rtl8127_get_cp_status(struct rtl8127_private *tp, u8 pair_num) if (pair_num > 3) goto exit; - rtl8127_mdio_direct_write_phy_ocp(tp, 0xA436, 0x8027 + 4 * pair_num); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xA436, 0x8026 + 4 * pair_num); val = rtl8127_mdio_direct_read_phy_ocp(tp, 0xA438); cp_status = __rtl8127_get_cp_status(val); @@ -894,7 +899,7 @@ static u16 rtl8127_get_cp_pp(struct rtl8127_private *tp, u8 pair_num) if (pair_num > 3) goto exit; - rtl8127_mdio_direct_write_phy_ocp(tp, 0xA436, 0x8029 + 4 * pair_num); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xA436, 0x8028 + 4 * pair_num); pp = rtl8127_mdio_direct_read_phy_ocp(tp, 0xA438); pp &= 0x3fff; @@ -931,6 +936,11 @@ static void rtl8127_get_cp_status(struct rtl8127_private *tp, } } +static int rtl8127_cel_to_fah(int cel) +{ + return (cel * 9 / 5) + 32; +} + #ifdef ENABLE_R8127_PROCFS /**************************************************************************** * -----------------------------PROCFS STUFF------------------------- @@ -1003,6 +1013,7 @@ static int proc_get_driver_variable(struct seq_file *m, void *v) seq_printf(m, "HwIcVerUnknown\t0x%x\n", tp->HwIcVerUnknown); seq_printf(m, "NotWrRamCodeToMicroP\t0x%x\n", tp->NotWrRamCodeToMicroP); seq_printf(m, "NotWrMcuPatchCode\t0x%x\n", tp->NotWrMcuPatchCode); + seq_printf(m, "hw_has_mac_mcu_patch_code\t0x%x\n", tp->hw_has_mac_mcu_patch_code); seq_printf(m, "HwHasWrRamCodeToMicroP\t0x%x\n", tp->HwHasWrRamCodeToMicroP); seq_printf(m, "sw_ram_code_ver\t0x%x\n", tp->sw_ram_code_ver); seq_printf(m, "hw_ram_code_ver\t0x%x\n", tp->hw_ram_code_ver); @@ -1016,8 +1027,9 @@ static int proc_get_driver_variable(struct seq_file *m, void *v) seq_printf(m, "HwSuppNowIsOobVer\t0x%x\n", tp->HwSuppNowIsOobVer); seq_printf(m, "HwFiberModeVer\t0x%x\n", tp->HwFiberModeVer); seq_printf(m, "HwFiberStat\t0x%x\n", tp->HwFiberStat); + seq_printf(m, "HwSerDesSfpCap\t0x%x\n", tp->HwSerDesSfpCap); seq_printf(m, "HwSwitchMdiToFiber\t0x%x\n", tp->HwSwitchMdiToFiber); - seq_printf(m, "NicCustLedValue\t0x%x\n", tp->NicCustLedValue); + seq_printf(m, "Led0\t0x%x\n", tp->BackupLedSel[0]); seq_printf(m, "RequiredSecLanDonglePatch\t0x%x\n", tp->RequiredSecLanDonglePatch); seq_printf(m, "HwSuppDashVer\t0x%x\n", tp->HwSuppDashVer); seq_printf(m, "DASH\t0x%x\n", tp->DASH); @@ -1037,6 +1049,7 @@ static int proc_get_driver_variable(struct seq_file *m, void *v) seq_printf(m, "enable_double_vlan\t0x%x\n", enable_double_vlan); seq_printf(m, "eee_giga_lite\t0x%x\n", eee_giga_lite); seq_printf(m, "HwSuppMagicPktVer\t0x%x\n", tp->HwSuppMagicPktVer); + seq_printf(m, "HwSuppEsdVer\t0x%x\n", tp->HwSuppEsdVer); seq_printf(m, "HwSuppLinkChgWakeUpVer\t0x%x\n", tp->HwSuppLinkChgWakeUpVer); seq_printf(m, "HwSuppD0SpeedUpVer\t0x%x\n", tp->HwSuppD0SpeedUpVer); seq_printf(m, "D0SpeedUpSpeed\t0x%x\n", tp->D0SpeedUpSpeed); @@ -1170,17 +1183,21 @@ static int proc_get_registers(struct seq_file *m, void *v) seq_puts(m, "\nDump MAC Registers\n"); seq_puts(m, "Offset\tValue\n------\t-----\n"); - rtnl_lock(); - for (n = 0; n < max;) { seq_printf(m, "\n0x%04x:\t", n); + rtnl_lock(); + for (i = 0; i < 16 && n < max; i++, n++) { byte_rd = readb(ioaddr + n); seq_printf(m, "%02x ", byte_rd); } + + rtnl_unlock(); } + rtnl_lock(); + max = 0xB00; for (n = 0xA00; n < max;) { seq_printf(m, "\n0x%04x:\t", n); @@ -1229,20 +1246,20 @@ static int proc_get_all_registers(struct seq_file *m, void *v) seq_puts(m, "\nDump All MAC Registers\n"); seq_puts(m, "Offset\tValue\n------\t-----\n"); - rtnl_lock(); - max = pci_resource_len(pdev, 2); for (n = 0; n < max;) { seq_printf(m, "\n0x%04x:\t", n); + rtnl_lock(); + for (i = 0; i < 16 && n < max; i++, n++) { byte_rd = readb(ioaddr + n); seq_printf(m, "%02x ", byte_rd); } - } - rtnl_unlock(); + rtnl_unlock(); + } seq_printf(m, "\nTotal length:0x%X", max); @@ -1389,16 +1406,16 @@ static int proc_get_pci_registers(struct seq_file *m, void *v) seq_printf(m, "\n0x%03x:\t", n); for (i = 0; i < 4 && n < max; i++, n+=4) { - pci_read_config_dword(tp->pci_dev, n, &dword_rd); + dword_rd = rtl8127_pci_config_read(tp, n); seq_printf(m, "%08x ", dword_rd); } } n = 0x110; - pci_read_config_dword(tp->pci_dev, n, &dword_rd); + dword_rd = rtl8127_pci_config_read(tp, n); seq_printf(m, "\n0x%03x:\t%08x ", n, dword_rd); n = 0x70c; - pci_read_config_dword(tp->pci_dev, n, &dword_rd); + dword_rd = rtl8127_pci_config_read(tp, n); seq_printf(m, "\n0x%03x:\t%08x ", n, dword_rd); rtnl_unlock(); @@ -1411,8 +1428,8 @@ static int proc_get_temperature(struct seq_file *m, void *v) { struct net_device *dev = m->private; struct rtl8127_private *tp = netdev_priv(dev); - u16 ts_digout, tj, fah; unsigned long flags; + int cel, fah; seq_puts(m, "\nChip Temperature\n"); @@ -1427,24 +1444,17 @@ static int proc_get_temperature(struct seq_file *m, void *v) r8127_spin_lock(&tp->phy_lock, flags); netif_testing_on(dev); - ts_digout = rtl8127_read_thermal_sensor(tp); + cel = rtl8127_read_thermal_sensor(tp); netif_testing_off(dev); r8127_spin_unlock(&tp->phy_lock, flags); rtnl_unlock(); - if (ts_digout <= 512) { - tj = ts_digout / 2; - seq_printf(m, "Cel:%d\n", tj); - fah = tj * (9/5) + 32; - seq_printf(m, "Fah:%d\n", fah); - } else { - tj = (512 - (ts_digout - 512)) / 2; - seq_printf(m, "Cel:-%d\n", tj); - fah = tj * (9/5) + 32; - seq_printf(m, "Fah:-%d\n", fah); - } + fah = rtl8127_cel_to_fah(cel); + + seq_printf(m, "Cel:%d\n", cel); + seq_printf(m, "Fah:%d\n", fah); seq_putc(m, '\n'); return 0; @@ -1462,12 +1472,6 @@ static int _proc_get_cable_info(struct seq_file *m, void *v, bool poe_mode) unsigned long flags; int ret; - switch (tp->mcfg) { - default: - ret = -EOPNOTSUPP; - goto error_out; - } - rtnl_lock(); if (!rtl8127_sysfs_testmode_on(tp)) { @@ -1526,7 +1530,6 @@ static int _proc_get_cable_info(struct seq_file *m, void *v, bool poe_mode) error_unlock: rtnl_unlock(); -error_out: return ret; } @@ -1669,6 +1672,31 @@ static int proc_dump_msix_tbl(struct seq_file *m, void *v) return 0; } +static int proc_dump_mac_mcu_bp(struct seq_file *m, void *v) +{ + int i, j; + struct net_device *dev = m->private; + struct rtl8127_private *tp = netdev_priv(dev); + + rtnl_lock(); + + seq_printf(m, "\ndump MAC MCU BPs. \n"); + + seq_printf(m, "BP_EN 0x%04x \n", rtl8127_mac_ocp_read(tp, 0xFC48)); + + seq_printf(m, "BP Base 0x%04x \n", rtl8127_mac_ocp_read(tp, 0xFC26)); + + for (i=0xFC28, j=0; i<0xFC48; i+=2, j++) { + seq_printf(m, "BP%02d(0x%04x) 0x%04x \n", j, i, + rtl8127_mac_ocp_read(tp, i)); + } + + rtnl_unlock(); + + seq_putc(m, '\n'); + return 0; +} + #else //LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) static int proc_get_driver_variable(char *page, char **start, @@ -1740,6 +1768,7 @@ static int proc_get_driver_variable(char *page, char **start, "HwIcVerUnknown\t0x%x\n" "NotWrRamCodeToMicroP\t0x%x\n" "NotWrMcuPatchCode\t0x%x\n" + "hw_has_mac_mcu_patch_code\t0x%x\n" "HwHasWrRamCodeToMicroP\t0x%x\n" "sw_ram_code_ver\t0x%x\n" "hw_ram_code_ver\t0x%x\n" @@ -1753,8 +1782,9 @@ static int proc_get_driver_variable(char *page, char **start, "HwSuppNowIsOobVer\t0x%x\n" "HwFiberModeVer\t0x%x\n" "HwFiberStat\t0x%x\n" + "HwSerDesSfpCap\t0x%x\n" "HwSwitchMdiToFiber\t0x%x\n" - "NicCustLedValue\t0x%x\n" + "Led0\t0x%x\n" "RequiredSecLanDonglePatch\t0x%x\n" "HwSuppDashVer\t0x%x\n" "DASH\t0x%x\n" @@ -1774,6 +1804,7 @@ static int proc_get_driver_variable(char *page, char **start, "enable_double_vlan\t0x%x\n" "eee_giga_lite\t0x%x\n" "HwSuppMagicPktVer\t0x%x\n" + "HwSuppEsdVer\t0x%x\n" "HwSuppLinkChgWakeUpVer\t0x%x\n" "HwSuppD0SpeedUpVer\t0x%x\n" "D0SpeedUpSpeed\t0x%x\n" @@ -1871,6 +1902,7 @@ static int proc_get_driver_variable(char *page, char **start, tp->HwIcVerUnknown, tp->NotWrRamCodeToMicroP, tp->NotWrMcuPatchCode, + tp->hw_has_mac_mcu_patch_code, tp->HwHasWrRamCodeToMicroP, tp->sw_ram_code_ver, tp->hw_ram_code_ver, @@ -1884,8 +1916,9 @@ static int proc_get_driver_variable(char *page, char **start, tp->HwSuppNowIsOobVer, tp->HwFiberModeVer, tp->HwFiberStat, + tp->HwSerDesSfpCap, tp->HwSwitchMdiToFiber, - tp->NicCustLedValue, + tp->BackupLedSel[0], tp->RequiredSecLanDonglePatch, tp->HwSuppDashVer, tp->DASH, @@ -1905,6 +1938,7 @@ static int proc_get_driver_variable(char *page, char **start, enable_double_vlan, eee_giga_lite, tp->HwSuppMagicPktVer, + tp->HwSuppEsdVer, tp->HwSuppLinkChgWakeUpVer, tp->HwSuppD0SpeedUpVer, tp->D0SpeedUpSpeed, @@ -2092,21 +2126,25 @@ static int proc_get_registers(char *page, char **start, "\nDump MAC Registers\n" "Offset\tValue\n------\t-----\n"); - rtnl_lock(); - for (n = 0; n < max;) { len += snprintf(page + len, count - len, "\n0x%04x:\t", n); + rtnl_lock(); + for (i = 0; i < 16 && n < max; i++, n++) { byte_rd = readb(ioaddr + n); len += snprintf(page + len, count - len, "%02x ", byte_rd); } + + rtnl_unlock(); } + rtnl_lock(); + max = 0xB00; for (n = 0xA00; n < max;) { len += snprintf(page + len, count - len, @@ -2173,8 +2211,6 @@ static int proc_get_all_registers(char *page, char **start, "\nDump All MAC Registers\n" "Offset\tValue\n------\t-----\n"); - rtnl_lock(); - max = pci_resource_len(pdev, 2); for (n = 0; n < max;) { @@ -2182,15 +2218,17 @@ static int proc_get_all_registers(char *page, char **start, "\n0x%04x:\t", n); + rtnl_lock(); + for (i = 0; i < 16 && n < max; i++, n++) { byte_rd = readb(ioaddr + n); len += snprintf(page + len, count - len, "%02x ", byte_rd); } - } - rtnl_unlock(); + rtnl_unlock(); + } len += snprintf(page + len, count - len, "\nTotal length:0x%X", max); @@ -2401,7 +2439,7 @@ static int proc_get_pci_registers(char *page, char **start, n); for (i = 0; i < 4 && n < max; i++, n+=4) { - pci_read_config_dword(tp->pci_dev, n, &dword_rd); + dword_rd = rtl8127_pci_config_read(tp, n); len += snprintf(page + len, count - len, "%08x ", dword_rd); @@ -2409,13 +2447,13 @@ static int proc_get_pci_registers(char *page, char **start, } n = 0x110; - pci_read_config_dword(tp->pci_dev, n, &dword_rd); + dword_rd = rtl8127_pci_config_read(tp, n); len += snprintf(page + len, count - len, "\n0x%03x:\t%08x ", n, dword_rd); n = 0x70c; - pci_read_config_dword(tp->pci_dev, n, &dword_rd); + dword_rd = rtl8127_pci_config_read(tp, n); len += snprintf(page + len, count - len, "\n0x%03x:\t%08x ", n, @@ -2435,8 +2473,8 @@ static int proc_get_temperature(char *page, char **start, { struct net_device *dev = data; struct rtl8127_private *tp = netdev_priv(dev); - u16 ts_digout, tj, fah; unsigned long flags; + int cel, fah; int len = 0; len += snprintf(page + len, count - len, @@ -2451,29 +2489,17 @@ static int proc_get_temperature(char *page, char **start, } r8127_spin_lock(&tp->phy_lock, flags); - ts_digout = rtl8127_read_thermal_sensor(tp); + cel = rtl8127_read_thermal_sensor(tp); r8127_spin_unlock(&tp->phy_lock, flags); - if (ts_digout <= 512) { - tj = ts_digout / 2; - len += snprintf(page + len, count - len, - "Cel:%d\n", - tj); - fah = tj * (9/5) + 32; - len += snprintf(page + len, count - len, - "Fah:%d\n", - fah); + fah = rtl8127_cel_to_fah(cel); - } else { - tj = (512 - (ts_digout - 512)) / 2; - len += snprintf(page + len, count - len, - "Cel:-%d\n", - tj); - fah = tj * (9/5) + 32; - len += snprintf(page + len, count - len, - "Fah:-%d\n", - fah); - } + len += snprintf(page + len, count - len, + "Cel:%d\n", + cel); + len += snprintf(page + len, count - len, + "Fah:%d\n", + fah); len += snprintf(page + len, count - len, "\n"); @@ -2498,11 +2524,6 @@ static int _proc_get_cable_info(char *page, char **start, struct rtl8127_private *tp = netdev_priv(dev); const char *pair_str[RTL8127_CP_NUM] = {"1-2", "3-6", "4-5", "7-8"}; - switch (tp->mcfg) { - default: - return -EOPNOTSUPP; - } - rtnl_lock(); if (!rtl8127_sysfs_testmode_on(tp)) { @@ -2741,6 +2762,40 @@ static int proc_dump_msix_tbl(char *page, char **start, return 0; } +static int proc_dump_mac_mcu_bp(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + int i, j; + int len = 0; + struct net_device *dev = data; + struct rtl8127_private *tp = netdev_priv(dev); + + rtnl_lock(); + + len += snprintf(page + len, count - len, + "\ndump MAC MCU BPs. \n"); + + len += snprintf(page + len, count - len, "BP_EN 0x%04x \n", + rtl8127_mac_ocp_read(tp, 0xFC48)); + + len += snprintf(page + len, count - len, "BP Base 0x%04x \n", + rtl8127_mac_ocp_read(tp, 0xFC26)); + + for (i=0xFC28, j=0; i<0xFC48; i+=2, j++) { + len += snprintf(page + len, count - len, + "BP%02d(0x%04x) 0x%04x \n", j, i, + rtl8127_mac_ocp_read(tp, i)); + } + + rtnl_unlock(); + + len += snprintf(page + len, count - len, "\n"); + + *eof = 1; + return 0; +} + #endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) static void rtl8127_proc_module_init(void) @@ -2813,6 +2868,7 @@ static const struct rtl8127_proc_file rtl8127_debug_proc_files[] = { { "tx_desc", &proc_dump_tx_desc }, { "rx_desc", &proc_dump_rx_desc }, { "msix_tbl", &proc_dump_msix_tbl }, + { "mac_mcu_bp", &proc_dump_mac_mcu_bp }, { "", NULL } }; @@ -2986,9 +3042,11 @@ static ssize_t testmode_show(struct device *dev, struct net_device *netdev = to_net_dev(dev); struct rtl8127_private *tp = netdev_priv(netdev); - sprintf(buf, "%u\n", tp->testmode); - - return strlen(buf); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,4,103) + return sprintf(buf, "%u\n", tp->testmode); +#else + return sysfs_emit(buf, "%u\n", tp->testmode); +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,4,103) */ } static ssize_t testmode_store(struct device *dev, @@ -3990,6 +4048,34 @@ int rtl8127_eri_write(struct rtl8127_private *tp, int addr, int len, u32 value, return rtl8127_eri_write_with_oob_base_address(tp, addr, len, value, type, NO_BASE_ADDRESS); } +static u32 +rtl8127_pci_config_read(struct rtl8127_private *tp, + u32 addr) +{ + struct pci_dev *pdev = tp->pci_dev; + u32 val; + + if (pdev->cfg_size > (addr + 3) && + pci_read_config_dword(pdev, addr, &val) == PCIBIOS_SUCCESSFUL) + return val; + else + return rtl8127_csi_read(tp, addr); +} + +static void +rtl8127_pci_config_write(struct rtl8127_private *tp, + u32 addr, + u32 value) +{ + struct pci_dev *pdev = tp->pci_dev; + + if (pdev->cfg_size > (addr + 3) && + pci_write_config_dword(pdev, addr, value) == PCIBIOS_SUCCESSFUL) + return; + else + rtl8127_csi_write(tp, addr, value); +} + static void rtl8127_enable_rxdvgate(struct net_device *dev) { @@ -4126,14 +4212,6 @@ rtl8127_enable_hw_linkchg_interrupt(struct rtl8127_private *tp) case 6: RTL_W32(tp, IMR_V2_SET_REG_8125, ISRIMR_V6_LINKCHG); break; - case 5: - RTL_W32(tp, IMR_V2_SET_REG_8125, ISRIMR_V5_LINKCHG); - break; - case 4: - RTL_W32(tp, IMR_V2_SET_REG_8125, ISRIMR_V4_LINKCHG); - break; - case 2: - case 3: RTL_W32(tp, IMR_V2_SET_REG_8125, ISRIMR_V2_LINKCHG); break; case 1: @@ -4151,10 +4229,6 @@ static inline void rtl8127_enable_hw_interrupt(struct rtl8127_private *tp) { switch (tp->HwCurrIsrVer) { - case 2: - case 3: - case 4: - case 5: case 6: RTL_W32(tp, IMR_V2_SET_REG_8125, tp->intr_mask); break; @@ -4296,16 +4370,7 @@ rtl8127_hw_set_interrupt_type(struct rtl8127_private *tp, u8 isr_ver) switch (tp->HwSuppIsrVer) { case 6: tmp &= ~INT_CFG0_AVOID_MISS_INTR; - fallthrough; - case 4: - case 5: - if (tp->HwSuppIsrVer == 6) - tmp &= ~INT_CFG0_AUTO_CLEAR_IMR; - else - tmp &= ~INT_CFG0_MSIX_ENTRY_NUM_MODE; - fallthrough; - case 2: - case 3: + tmp &= ~INT_CFG0_AUTO_CLEAR_IMR; tmp &= ~(INT_CFG0_ENABLE_8125); if (isr_ver > 1) tmp |= INT_CFG0_ENABLE_8125; @@ -4335,28 +4400,12 @@ rtl8127_hw_clear_int_miti(struct net_device *dev) int i; switch (tp->HwSuppIntMitiVer) { - case 3: case 6: //IntMITI_0-IntMITI_31 for (i=0xA00; i<0xB00; i+=4) RTL_W32(tp, i, 0x0000); break; - case 4: - case 5: - //IntMITI_0-IntMITI_15 - for (i = 0xA00; i < 0xA80; i += 4) - RTL_W32(tp, i, 0x0000); - - if (tp->HwSuppIntMitiVer == 5) - RTL_W8(tp, INT_CFG0_8125, RTL_R8(tp, INT_CFG0_8125) & - ~(INT_CFG0_TIMEOUT0_BYPASS_8125 | - INT_CFG0_MITIGATION_BYPASS_8125 | - INT_CFG0_RDU_BYPASS_8126)); - else - RTL_W8(tp, INT_CFG0_8125, RTL_R8(tp, INT_CFG0_8125) & - ~(INT_CFG0_TIMEOUT0_BYPASS_8125 | INT_CFG0_MITIGATION_BYPASS_8125)); - - RTL_W16(tp, INT_CFG1_8125, 0x0000); + default: break; } } @@ -4372,36 +4421,11 @@ rtl8127_vec_2_tx_q_num( bool rc = false; switch (tp->HwSuppIsrVer) { - case 2: - if (messageId == 0x10) - whichQ = 0; - else if (messageId == 0x12 && tp->num_tx_rings > 1) - whichQ = 1; - break; - case 3: - case 4: - if (messageId == 0x00) - whichQ = 0; - else if (messageId == 0x01 && tp->num_tx_rings > 1) - whichQ = 1; - break; - case 5: - if (messageId == 0x10) - whichQ = 0; - else if (messageId == 0x11 && tp->num_tx_rings > 1) - whichQ = 1; - break; case 6: - if (messageId == 0x08) - whichQ = 0; - else if (messageId == 0x09 && tp->num_tx_rings > 1) - whichQ = 1; + if (messageId > 7 && messageId < 16) + whichQ = messageId - 8; break; - case 7: - if (messageId == 0x1B) - whichQ = 0; - else if (messageId == 0x1C && tp->num_tx_rings > 1) - whichQ = 1; + default: break; } @@ -4424,15 +4448,12 @@ rtl8127_vec_2_rx_q_num( bool rc = false; switch (tp->HwSuppIsrVer) { - case 2: - case 3: - case 4: - case 5: case 6: - case 7: if (messageId < tp->HwSuppNumRxQueues) whichQ = messageId; break; + default: + break; } if (whichQ != 0xffffffff) { @@ -4451,8 +4472,6 @@ rtl8127_hw_set_timer_int(struct rtl8127_private *tp, u32 qnum; switch (tp->HwSuppIntMitiVer) { - case 4: - case 5: case 6: //ROK if (rtl8127_vec_2_rx_q_num(tp, message_id, &qnum)) @@ -4461,6 +4480,8 @@ rtl8127_hw_set_timer_int(struct rtl8127_private *tp, if (rtl8127_vec_2_tx_q_num(tp, message_id, &qnum)) RTL_W8(tp,INT_MITI_V2_0_TX + 8 * qnum, timer_intmiti_val); break; + default: + break; } } @@ -4970,7 +4991,9 @@ rtl8127_set_pci_99_exit_driver_para(struct net_device *dev) if (tp->org_pci_offset_99 & BIT_2) rtl8127_issue_offset_99_event(tp); - rtl8127_disable_pci_offset_99(tp); + + if (test_bit(R8127_FLAG_SUSPEND | R8127_FLAG_SHUTDOWN, tp->task_flags)) + rtl8127_disable_pci_offset_99(tp); } static void @@ -5526,8 +5549,6 @@ rtl8127_powerdown_pll(struct net_device *dev, u8 from_suspend) return; rtl8127_phy_power_down(dev); - - RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_6); } static void rtl8127_powerup_pll(struct net_device *dev) @@ -6038,8 +6059,10 @@ rtl8127_rx_vlan_skb(struct rtl8127_private *tp, static netdev_features_t rtl8127_fix_features(struct net_device *dev, netdev_features_t features) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) if (dev->mtu > MSS_MAX || dev->mtu > ETH_DATA_LEN) features &= ~NETIF_F_ALL_TSO; +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) */ #ifndef CONFIG_R8127_VLAN features &= ~NETIF_F_ALL_CSUM; #endif @@ -6131,7 +6154,10 @@ static void rtl8127_gset_xmii(struct net_device *dev, if (HW_FIBER_MODE_ENABLED(tp)) { supported = SUPPORTED_1000baseT_Full | SUPPORTED_10000baseT_Full | - SUPPORTED_TP; + SUPPORTED_Autoneg | + SUPPORTED_FIBRE | + SUPPORTED_Pause | + SUPPORTED_Asym_Pause; } else { supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | @@ -6182,14 +6208,15 @@ static void rtl8127_gset_xmii(struct net_device *dev, rtl8127_mdio_write(tp, 0x1F, 0x0000); bmcr = rtl8127_mdio_read(tp, MII_BMCR); - if (bmcr & BMCR_ANENABLE) { + if ((supported & SUPPORTED_Autoneg) && (bmcr & BMCR_ANENABLE)) autoneg = AUTONEG_ENABLE; - advertising |= ADVERTISED_Autoneg; - } else { + else autoneg = AUTONEG_DISABLE; - } - advertising |= ADVERTISED_TP; + if (autoneg == AUTONEG_ENABLE) + advertising |= ADVERTISED_Autoneg; + + advertising |= HW_FIBER_MODE_ENABLED(tp) ? ADVERTISED_FIBRE :ADVERTISED_TP; status = rtl8127_get_phy_status(tp); if (netif_running(dev) && (status & LinkStatus)) @@ -6247,7 +6274,7 @@ static void rtl8127_gset_xmii(struct net_device *dev, cmd->autoneg = autoneg; cmd->speed = speed; cmd->duplex = duplex; - cmd->port = PORT_TP; + cmd->port = HW_FIBER_MODE_ENABLED(tp) ? PORT_FIBRE :PORT_TP; cmd->lp_advertising = (u32)lpa_adv; cmd->eth_tp_mdix = rtl8127_get_mdi_status(tp); #else @@ -6311,7 +6338,7 @@ static void rtl8127_gset_xmii(struct net_device *dev, cmd->base.autoneg = autoneg; cmd->base.speed = speed; cmd->base.duplex = duplex; - cmd->base.port = PORT_TP; + cmd->base.port = HW_FIBER_MODE_ENABLED(tp) ? PORT_FIBRE :PORT_TP; cmd->base.eth_tp_mdix = rtl8127_get_mdi_status(tp); #endif r8127_spin_unlock(&tp->phy_lock, flags); @@ -6577,7 +6604,7 @@ rtl8127_get_ethtool_stats(struct net_device *dev, counters = tp->tally_vaddr; paddr = tp->tally_paddr; - if (!counters) + if (!counters || test_bit(R8127_FLAG_SHUTDOWN, tp->task_flags)) return; rtl8127_dump_tally_counter(tp, paddr); @@ -6637,6 +6664,60 @@ rtl8127_get_strings(struct net_device *dev, } #endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,0,0) +static void +rtl8127_set_output_gpio(struct rtl8127_private *tp, u16 led_sel, bool enable) +{ + if (enable) { + /* enable LED output */ + rtl8127_set_mac_ocp_bit(tp, 0xDC4C, led_sel); + rtl8127_set_mac_ocp_bit(tp, 0xDC52, led_sel); + rtl8127_set_mac_ocp_bit(tp, 0xDC5E, led_sel); + rtl8127_set_mac_ocp_bit(tp, 0xDC46, led_sel); + } else { + /* disable GPIO Function */ + rtl8127_clear_mac_ocp_bit(tp, 0xDC5E, led_sel); + rtl8127_clear_mac_ocp_bit(tp, 0xDC46, led_sel); + } +} + +static void +rtl8127_set_led_on(struct rtl8127_private *tp, u16 led_sel, bool on) +{ + if (on) + rtl8127_set_mac_ocp_bit(tp, 0xDC52, led_sel); + else + rtl8127_clear_mac_ocp_bit(tp, 0xDC52, led_sel); +} + +static int +rtl8127_set_phys_id(struct net_device *dev, + enum ethtool_phys_id_state state) +{ + struct rtl8127_private *tp = netdev_priv(dev); + const u16 led_sel = 0x01a4; + + switch (state) { + case ETHTOOL_ID_ACTIVE: + rtl8127_set_output_gpio(tp, led_sel, true); + return 2; /* cycle on/off twice per second */ + case ETHTOOL_ID_ON: + rtl8127_set_led_on(tp, led_sel, true); + break; + case ETHTOOL_ID_OFF: + rtl8127_set_led_on(tp, led_sel, false); + break; + case ETHTOOL_ID_INACTIVE: + rtl8127_set_output_gpio(tp, led_sel, false); + break; + default: + break; + } + + return 0; +} +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(3,0,0) + static int rtl_get_eeprom_len(struct net_device *dev) { struct rtl8127_private *tp = netdev_priv(dev); @@ -6688,7 +6769,7 @@ static int rtl_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, if (ret) break; - pci_read_config_dword(tp->pci_dev, VPD_data, &eeprom_buff[i-start_w]); + eeprom_buff[i-start_w] = rtl8127_pci_config_read(tp, VPD_data); } rtl8127_disable_cfg9346_write(tp); @@ -7018,13 +7099,8 @@ rtl_ethtool_set_eee(struct net_device *net, struct ethtool_keee *edata) */ rtl8127_adv_to_linkmode(advertising, tp->advertising); - if (linkmode_empty(edata->advertised)) { + if (linkmode_empty(edata->advertised)) linkmode_and(edata->advertised, advertising, eee->supported); - } else if (linkmode_andnot(tmp, edata->advertised, advertising)) { - dev_printk(KERN_WARNING, tp_to_dev(tp), "EEE advertised must be a subset of autoneg advertised speeds\n"); - rc = -EINVAL; - goto out; - } if (linkmode_andnot(tmp, edata->advertised, eee->supported)) { dev_printk(KERN_WARNING, tp_to_dev(tp), "EEE advertised must be a subset of support \n"); @@ -7233,6 +7309,9 @@ static const struct ethtool_ops rtl8127_ethtool_ops = { .get_wol = rtl8127_get_wol, .set_wol = rtl8127_set_wol, .get_strings = rtl8127_get_strings, +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,0,0) + .set_phys_id = rtl8127_set_phys_id, +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) .get_stats_count = rtl8127_get_stats_count, #else @@ -7302,6 +7381,17 @@ static void rtl8127_get_mac_version(struct rtl8127_private *tp) tp->efuse_ver = EFUSE_NOT_SUPPORT; break; } + + switch (tp->mcfg) { + case CFG_METHOD_2: { + u8 tmp = (u8)rtl8127_mac_ocp_read(tp, 0xD006); + if (tmp == 0x03) + tp->HwSuppDashVer = 4; + } + break; + default: + break; + } } static void @@ -7370,6 +7460,32 @@ rtl8127_get_phy_state(struct rtl8127_private *tp) return (rtl8127_mdio_direct_read_phy_ocp(tp, 0xA420) & 0x7); } +static bool +rtl8127_wait_phy_state_ready(struct rtl8127_private *tp, u16 state, + u32 usec) +{ + u16 tmp_state; + u32 wait_cnt; + bool ready; + u32 i; + + wait_cnt = max(usec / 1000, 100); + + i = 0; + do { + tmp_state = rtl8127_get_phy_state(tp); + mdelay(1); + i++; + } while ((i < wait_cnt) && (tmp_state != state)); + + ready = (i == wait_cnt && tmp_state != state) ? FALSE : TRUE; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) + WARN_ON_ONCE(i == wait_cnt); +#endif + return ready; +} + static void rtl8127_wait_phy_ups_resume(struct net_device *dev, u16 PhyState) { @@ -7391,6 +7507,9 @@ rtl8127_wait_phy_ups_resume(struct net_device *dev, u16 PhyState) static void rtl8127_set_mcu_d3_stack(struct rtl8127_private *tp) { + if (!tp->hw_has_mac_mcu_patch_code) + return; + switch (tp->mcfg) { case CFG_METHOD_2: rtl8127_mac_ocp_write(tp, 0xD018, 0xC896); @@ -7684,7 +7803,7 @@ rtl8127_set_mac_mcu_8127a_1(struct net_device *dev) struct rtl8127_private *tp = netdev_priv(dev); static const u16 mcu_patch_code[] = { 0xE010, 0xE023, 0xE036, 0xE049, 0xE05C, 0xE075, 0xE0B1, 0xE117, 0xE11B, - 0xE11D, 0xE11F, 0xE121, 0xE123, 0xE125, 0xE127, 0xE129, 0x7020, 0xB405, + 0xE1F7, 0xE1F9, 0xE297, 0xE299, 0xE29B, 0xE29D, 0xE29F, 0x7020, 0xB405, 0xB404, 0xC50F, 0x74A0, 0xC50E, 0x4025, 0xF005, 0x4850, 0x4025, 0xF002, 0xE002, 0x4809, 0xB004, 0xB005, 0xC502, 0xBD00, 0x1522, 0xD006, 0x0004, 0x7760, 0xB405, 0xB404, 0xC50F, 0x74A0, 0xC50E, 0x4025, 0xF005, 0x4850, @@ -7715,10 +7834,51 @@ rtl8127_set_mac_mcu_8127a_1(struct net_device *dev) 0xB000, 0xB001, 0xB002, 0xB003, 0xB004, 0xB005, 0xB006, 0xB007, 0x2125, 0xC102, 0xB900, 0x1A6C, 0xD410, 0xC000, 0xE86C, 0xB600, 0xB800, 0xB40A, 0xE024, 0x5A00, 0x5A81, 0x0073, 0x5A80, 0x0042, 0x0001, 0xC104, 0xC202, - 0xBA00, 0x1A2E, 0xC896, 0xC302, 0xBB00, 0x0000, 0xC002, 0xB800, 0x0000, - 0xC002, 0xB800, 0x0000, 0xC502, 0xBD00, 0x0000, 0xC102, 0xB900, 0x0000, - 0xC102, 0xB900, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, - 0x6961, 0x0019, 0x050C, 0x140C + 0xBA00, 0x1A2E, 0xC896, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, + 0xB406, 0xB407, 0xC11F, 0xC21F, 0x9A24, 0xC21B, 0x9A26, 0xE83B, 0x7320, + 0x7422, 0xC010, 0x7200, 0x4822, 0x9A00, 0x7218, 0x4822, 0x9A18, 0x7206, + 0x4822, 0x9A06, 0x720C, 0x49C0, 0xF00D, 0x4822, 0x9A0C, 0xE00C, 0xDC46, + 0xD40C, 0xE008, 0xDEAD, 0xDE20, 0x0012, 0x3D02, 0xE8E0, 0x0168, 0x48A2, + 0x9A0C, 0x49CF, 0xF058, 0x1301, 0xF00A, 0x1302, 0xF00D, 0x1303, 0xF01B, + 0x1304, 0xF01F, 0x1305, 0xF024, 0xE043, 0xE858, 0xC7EC, 0xE863, 0xE893, + 0xE048, 0xE853, 0xC7E7, 0x4878, 0xE85D, 0xE88D, 0xE042, 0xE8E0, 0xF180, + 0xBD02, 0x8FFE, 0xC000, 0xC1DF, 0x6227, 0x49A6, 0xF1FD, 0xFF80, 0xE843, + 0xC7D7, 0x4879, 0xE84D, 0xE87D, 0xE032, 0xE83D, 0xC7D1, 0x4878, 0x4879, + 0xE846, 0xE876, 0xE02B, 0xC5C8, 0x76A0, 0x4868, 0x9EA0, 0xC5C3, 0x71A0, + 0xC5E7, 0x70A0, 0xC2E1, 0x9940, 0x9842, 0xC1DF, 0x9944, 0xC1DE, 0x9946, + 0xEFDF, 0x71A2, 0x70A4, 0xC2D7, 0x9940, 0x9842, 0xC16C, 0x9944, 0xC1D4, + 0x9946, 0xEFD5, 0xC5AE, 0x76A0, 0x48E8, 0x9EA0, 0xE856, 0xE00B, 0xC6A9, + 0xC2C8, 0x9E40, 0x9E42, 0xC1C6, 0x9944, 0xC1C5, 0x9946, 0xEFC6, 0xE84B, + 0xB007, 0xB006, 0xB005, 0xB004, 0xB003, 0xB002, 0xB001, 0xB000, 0x1100, + 0xC202, 0xBA00, 0x1A86, 0xC694, 0xE807, 0x1D00, 0x9DC0, 0xC5B2, 0x9DC2, + 0xE802, 0xFF80, 0xC18C, 0x7222, 0x49AE, 0xF1FD, 0xFF80, 0xC687, 0x9FC2, + 0xEFF9, 0x70C0, 0x0702, 0x9FC2, 0xEFF5, 0x71C0, 0xC235, 0x9940, 0x9842, + 0xC19C, 0x9944, 0xC12E, 0x9946, 0xEF9C, 0x0701, 0x9FC2, 0xEFE9, 0x70C0, + 0x0704, 0x9FC2, 0xEFE5, 0x71C0, 0xC225, 0x9940, 0x9842, 0xC123, 0x9944, + 0xC11E, 0x9946, 0xEF8C, 0x071A, 0x9FC2, 0xEFD9, 0x70C0, 0x0728, 0x9FC2, + 0xEFD5, 0x71C0, 0xC215, 0x9940, 0x9842, 0xC114, 0x9944, 0xC10E, 0x9946, + 0xEF7C, 0xFF80, 0x48CF, 0xC20B, 0x9B40, 0x9C42, 0xC107, 0x9944, 0xC104, + 0x9946, 0xEF72, 0xFF80, 0xBD02, 0xF168, 0xE8E0, 0xF184, 0xF188, 0xC502, + 0xBD00, 0x0000, 0xB400, 0xB401, 0xB402, 0xB403, 0xC079, 0xC377, 0x7160, + 0x9906, 0xC376, 0xE87C, 0xC073, 0x9900, 0x1906, 0xC371, 0xE884, 0xC170, + 0xC370, 0xE881, 0x1908, 0xC36B, 0xE87E, 0xC36C, 0xE86F, 0x1A88, 0x44CA, + 0xE879, 0xC367, 0x4833, 0xE869, 0x4816, 0xE874, 0xC362, 0x4838, 0xE864, + 0x1A88, 0x44CA, 0xE86E, 0xC35C, 0x4838, 0x4833, 0xE85D, 0x4816, 0xE868, + 0xC357, 0xE859, 0x1A88, 0x44CA, 0xE863, 0xC352, 0x4833, 0xE853, 0x4816, + 0xE85E, 0xC34D, 0x4838, 0xE84E, 0x1A88, 0x44CA, 0xE858, 0xC347, 0x4838, + 0x4833, 0xE847, 0x4816, 0xE852, 0xC342, 0xE843, 0x1A58, 0x44CA, 0xE84D, + 0xC33D, 0x4833, 0xE83D, 0x4816, 0xE848, 0xC338, 0x4838, 0xE838, 0x1A58, + 0x44CA, 0xE842, 0xC332, 0x4838, 0x4833, 0xE831, 0x4816, 0xE83C, 0xC32D, + 0xE82D, 0x1A58, 0x44CA, 0xE837, 0xC328, 0x4833, 0xE827, 0x4816, 0xE832, + 0xC323, 0x4838, 0xE822, 0x1A58, 0x44CA, 0xE82C, 0xC31D, 0x4838, 0x4833, + 0xE81B, 0x4816, 0xE826, 0xC010, 0x7100, 0xC30F, 0xE822, 0xC00C, 0x7106, + 0xC309, 0x9960, 0xB003, 0xB002, 0xB001, 0xB000, 0xC402, 0xBC00, 0x15B0, + 0xDE20, 0xDD26, 0x0FFE, 0x0000, 0x6F00, 0x8086, 0x8486, 0x8886, 0x8C86, + 0xC0F7, 0x7202, 0x49AE, 0xF1FD, 0x44D3, 0x4413, 0x48AF, 0x9A02, 0x7202, + 0x49AE, 0xF1FE, 0x7100, 0xFF80, 0xC0EA, 0x7202, 0x49AE, 0xF1FD, 0x9900, + 0x44D3, 0x4413, 0x482F, 0x9A02, 0x7202, 0x49AE, 0xF1FE, 0xFF80, 0xC502, + 0xBD00, 0x0000, 0xC102, 0xB900, 0x0000, 0xC102, 0xB900, 0x0000, 0xC602, + 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0x6961, 0x0019, 0x0A1E, 0x0F2A }; /* Get BIN mac mcu patch code version */ @@ -7737,8 +7897,10 @@ rtl8127_set_mac_mcu_8127a_1(struct net_device *dev) rtl8127_mac_ocp_write(tp, 0xFC32, 0x0166); rtl8127_mac_ocp_write(tp, 0xFC34, 0x1A6A); rtl8127_mac_ocp_write(tp, 0xFC36, 0x1A2C); + //rtl8127_mac_ocp_write(tp, 0xFC38, 0x1A84); + rtl8127_mac_ocp_write(tp, 0xFC3C, 0x1598); - rtl8127_mac_ocp_write(tp, 0xFC48, 0x00FF); + rtl8127_mac_ocp_write(tp, 0xFC48, 0x04FF); } static void @@ -7746,6 +7908,8 @@ rtl8127_hw_mac_mcu_config(struct net_device *dev) { struct rtl8127_private *tp = netdev_priv(dev); + tp->hw_has_mac_mcu_patch_code = FALSE; + if (tp->NotWrMcuPatchCode == TRUE) return; @@ -7762,8 +7926,10 @@ rtl8127_hw_mac_mcu_config(struct net_device *dev) rtl8127_set_mac_mcu_8127a_1(dev); break; default: - break; + return; } + + tp->hw_has_mac_mcu_patch_code = TRUE; } #endif @@ -7799,6 +7965,8 @@ static void rtl8127_apply_firmware(struct rtl8127_private *tp) tp->sw_ram_code_ver = tp->hw_ram_code_ver; tp->HwHasWrRamCodeToMicroP = TRUE; + tp->hw_has_mac_mcu_patch_code = TRUE; + r8127_spin_unlock(&tp->phy_lock, flags); } } @@ -7822,9 +7990,9 @@ rtl8127_hw_init(struct net_device *dev) #endif //Set PCIE uncorrectable error status mask pcie 0x108 - csi_tmp = rtl8127_csi_read(tp, 0x108); + csi_tmp = rtl8127_pci_config_read(tp, 0x108); csi_tmp |= BIT_20; - rtl8127_csi_write(tp, 0x108, csi_tmp); + rtl8127_pci_config_write(tp, 0x108, csi_tmp); rtl8127_enable_cfg9346_write(tp); rtl8127_disable_linkchg_wakeup(dev); @@ -10492,436 +10660,989 @@ static const u16 phy_mcu_ram_code_8127a_1[] = { 0xa436, 0xA08A, 0xa438, 0x01e7, 0xa436, 0xA088, 0xa438, 0x019c, 0xa436, 0xA086, 0xa438, 0x014e, 0xa436, 0xA084, 0xa438, 0x009d, 0xa436, 0xA082, 0xa438, 0x0117, 0xa436, 0xA080, 0xa438, 0x0027, - 0xa436, 0xA090, 0xa438, 0x00ff, 0xa436, 0xa016, 0xa438, 0x0020, - 0xa436, 0xa012, 0xa438, 0x0000, 0xa436, 0xa014, 0xa438, 0x1800, - 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x801d, 0xa438, 0x1800, - 0xa438, 0x803b, 0xa438, 0x1800, 0xa438, 0x8087, 0xa438, 0x1800, - 0xa438, 0x808e, 0xa438, 0x1800, 0xa438, 0x809d, 0xa438, 0x1800, - 0xa438, 0x80b7, 0xa438, 0x1800, 0xa438, 0x80c4, 0xa438, 0xd1bc, + 0xa436, 0xA090, 0xa438, 0x00ff, 0xa436, 0xA016, 0xa438, 0x0020, + 0xa436, 0xA012, 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, + 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x8663, 0xa438, 0x1800, + 0xa438, 0x8681, 0xa438, 0x1800, 0xa438, 0x86cd, 0xa438, 0x1800, + 0xa438, 0x86d4, 0xa438, 0x1800, 0xa438, 0x86e3, 0xa438, 0x1800, + 0xa438, 0x8944, 0xa438, 0x1800, 0xa438, 0x8951, 0xa438, 0xd1bc, 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, - 0xa438, 0x5fba, 0xa438, 0xd700, 0xa438, 0x273d, 0xa438, 0x801b, - 0xa438, 0x1800, 0xa438, 0x07d1, 0xa438, 0x1800, 0xa438, 0x080e, - 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x8032, 0xa438, 0x33a9, - 0xa438, 0x802a, 0xa438, 0xd705, 0xa438, 0x4084, 0xa438, 0xd1f4, - 0xa438, 0xd048, 0xa438, 0xf013, 0xa438, 0xd1b7, 0xa438, 0xd04b, - 0xa438, 0xf010, 0xa438, 0xd705, 0xa438, 0x4084, 0xa438, 0xd1f4, - 0xa438, 0xd048, 0xa438, 0xf00b, 0xa438, 0xd1b7, 0xa438, 0xd04b, - 0xa438, 0xf008, 0xa438, 0xd705, 0xa438, 0x4084, 0xa438, 0xd1f4, - 0xa438, 0xd048, 0xa438, 0xf003, 0xa438, 0xd1b7, 0xa438, 0xd04b, - 0xa438, 0x1800, 0xa438, 0x14cc, 0xa438, 0xd700, 0xa438, 0x2b59, - 0xa438, 0x803f, 0xa438, 0xf003, 0xa438, 0x1800, 0xa438, 0x118f, - 0xa438, 0x6060, 0xa438, 0x1800, 0xa438, 0x1167, 0xa438, 0xd700, - 0xa438, 0x60c7, 0xa438, 0xd704, 0xa438, 0x609f, 0xa438, 0xd705, - 0xa438, 0x4043, 0xa438, 0xf003, 0xa438, 0x1800, 0xa438, 0x1150, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8702, 0xa438, 0x8011, - 0xa438, 0x9503, 0xa438, 0x800a, 0xa438, 0x81a0, 0xa438, 0x8302, - 0xa438, 0x8480, 0xa438, 0x8686, 0xa438, 0xcde0, 0xa438, 0xd1ff, - 0xa438, 0xd049, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, - 0xa438, 0x5fba, 0xa438, 0xd705, 0xa438, 0x417e, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0xa011, 0xa438, 0x9503, 0xa438, 0xd1c8, - 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, - 0xa438, 0x5fba, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa702, - 0xa438, 0x9503, 0xa438, 0xa00a, 0xa438, 0xa1a0, 0xa438, 0xa480, - 0xa438, 0xa686, 0xa438, 0xd705, 0xa438, 0x605e, 0xa438, 0xa302, - 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x8083, - 0xa438, 0x33a9, 0xa438, 0x807f, 0xa438, 0xd178, 0xa438, 0xd04b, - 0xa438, 0x1800, 0xa438, 0x115d, 0xa438, 0xd1c8, 0xa438, 0xd04b, - 0xa438, 0x1800, 0xa438, 0x115d, 0xa438, 0xd1e6, 0xa438, 0xd04b, - 0xa438, 0x1800, 0xa438, 0x115d, 0xa438, 0xd71f, 0xa438, 0x6080, - 0xa438, 0xd704, 0xa438, 0x1800, 0xa438, 0x1bc0, 0xa438, 0x1800, - 0xa438, 0x1bc4, 0xa438, 0x4134, 0xa438, 0xd115, 0xa438, 0xd04f, - 0xa438, 0x1000, 0xa438, 0x1d0b, 0xa438, 0x1000, 0xa438, 0x80ad, - 0xa438, 0x1800, 0xa438, 0x01f2, 0xa438, 0x1000, 0xa438, 0x1d0b, - 0xa438, 0x1000, 0xa438, 0x80ad, 0xa438, 0x1800, 0xa438, 0x01f9, - 0xa438, 0x2969, 0xa438, 0x80a3, 0xa438, 0xd700, 0xa438, 0x606b, - 0xa438, 0xd701, 0xa438, 0x60b4, 0xa438, 0x1000, 0xa438, 0x80ad, - 0xa438, 0x1800, 0xa438, 0x0551, 0xa438, 0xd196, 0xa438, 0xd04d, - 0xa438, 0x1000, 0xa438, 0x80ad, 0xa438, 0x1800, 0xa438, 0x054d, - 0xa438, 0xd208, 0xa438, 0x0c09, 0xa438, 0x1301, 0xa438, 0x1000, - 0xa438, 0x1cd2, 0xa438, 0xd701, 0xa438, 0x5fa3, 0xa438, 0xb302, - 0xa438, 0xd200, 0xa438, 0x0800, 0xa438, 0xd705, 0xa438, 0x6064, - 0xa438, 0x1800, 0xa438, 0x140a, 0xa438, 0x8810, 0xa438, 0xd199, - 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, - 0xa438, 0x5fba, 0xa438, 0x1800, 0xa438, 0x140a, 0xa438, 0x8910, - 0xa438, 0xd704, 0xa438, 0x61a8, 0xa438, 0x8480, 0xa438, 0x8604, - 0xa438, 0x8302, 0xa438, 0x81a0, 0xa438, 0xd703, 0xa438, 0x4112, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa990, 0xa438, 0x9503, - 0xa438, 0xb904, 0xa438, 0xf002, 0xa438, 0x0000, 0xa438, 0x0800, - 0xa436, 0xa10e, 0xa438, 0x1de8, 0xa436, 0xa10c, 0xa438, 0x1352, - 0xa436, 0xa10a, 0xa438, 0x0545, 0xa436, 0xa108, 0xa438, 0x01ed, - 0xa436, 0xa106, 0xa438, 0x1bbf, 0xa436, 0xa104, 0xa438, 0x114b, - 0xa436, 0xa102, 0xa438, 0x14bf, 0xa436, 0xa100, 0xa438, 0x07ce, - 0xa436, 0xa110, 0xa438, 0x00ff, 0xa436, 0xA016, 0xa438, 0x0020, - 0xa436, 0xA012, 0xa438, 0x1ff8, 0xa436, 0xA014, 0xa438, 0xd1ce, - 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA164, - 0xa438, 0x07fc, 0xa436, 0xA166, 0xa438, 0x143d, 0xa436, 0xA168, - 0xa438, 0x3fff, 0xa436, 0xA16A, 0xa438, 0x3fff, 0xa436, 0xA16C, - 0xa438, 0x3fff, 0xa436, 0xA16E, 0xa438, 0x3fff, 0xa436, 0xA170, - 0xa438, 0x3fff, 0xa436, 0xA172, 0xa438, 0x3fff, 0xa436, 0xA162, - 0xa438, 0x0003, 0xa436, 0xb87c, 0xa438, 0x8994, 0xa436, 0xb87e, - 0xa438, 0xaf89, 0xa438, 0xacaf, 0xa438, 0x89e4, 0xa438, 0xaf89, - 0xa438, 0xecaf, 0xa438, 0x8a04, 0xa438, 0xaf8a, 0xa438, 0x2eaf, - 0xa438, 0x8a4a, 0xa438, 0xaf8d, 0xa438, 0x31af, 0xa438, 0x8dc6, - 0xa438, 0x1f55, 0xa438, 0xe18f, 0xa438, 0xe3a1, 0xa438, 0x0007, - 0xa438, 0xee86, 0xa438, 0xe900, 0xa438, 0xaf4f, 0xa438, 0x9ead, - 0xa438, 0x281b, 0xa438, 0xe18f, 0xa438, 0xfcef, 0xa438, 0x71bf, - 0xa438, 0x74f6, 0xa438, 0x027e, 0xa438, 0xd2ef, 0xa438, 0x641c, - 0xa438, 0x670d, 0xa438, 0x67ef, 0xa438, 0x461f, 0xa438, 0x00bf, - 0xa438, 0x74f6, 0xa438, 0x027e, 0xa438, 0xdee1, 0xa438, 0x8fe3, - 0xa438, 0x0d11, 0xa438, 0xe58f, 0xa438, 0xe313, 0xa438, 0xaeca, - 0xa438, 0x028d, 0xa438, 0xd1d3, 0xa438, 0x01af, 0xa438, 0x40d1, - 0xa438, 0xbf7a, 0xa438, 0x6102, 0xa438, 0x7d44, 0xa438, 0xa100, - 0xa438, 0x09e0, 0xa438, 0x8ffa, 0xa438, 0xe18f, 0xa438, 0xfbaf, - 0xa438, 0x683d, 0xa438, 0x027f, 0xa438, 0xa9af, 0xa438, 0x682c, - 0xa438, 0xbf8e, 0xa438, 0x4102, 0xa438, 0x7d44, 0xa438, 0xe58f, - 0xa438, 0xecbf, 0xa438, 0x74cc, 0xa438, 0x027d, 0xa438, 0x44e3, - 0xa438, 0x8fed, 0xa438, 0x0d31, 0xa438, 0xf63f, 0xa438, 0x0d11, - 0xa438, 0xf62f, 0xa438, 0x1b13, 0xa438, 0xad2f, 0xa438, 0x06bf, - 0xa438, 0x8e41, 0xa438, 0x027c, 0xa438, 0xf9d1, 0xa438, 0x01af, - 0xa438, 0x5974, 0xa438, 0xee88, 0xa438, 0x8600, 0xa438, 0xe08f, - 0xa438, 0xebad, 0xa438, 0x200b, 0xa438, 0xe18f, 0xa438, 0xecbf, - 0xa438, 0x8e41, 0xa438, 0x027d, 0xa438, 0x25ae, 0xa438, 0x04ee, - 0xa438, 0x8feb, 0xa438, 0x01af, 0xa438, 0x5945, 0xa438, 0xad28, - 0xa438, 0x2ce0, 0xa438, 0x8fea, 0xa438, 0xa000, 0xa438, 0x0502, - 0xa438, 0x8af0, 0xa438, 0xae1e, 0xa438, 0xa001, 0xa438, 0x0502, - 0xa438, 0x8b9f, 0xa438, 0xae16, 0xa438, 0xa002, 0xa438, 0x0502, - 0xa438, 0x8c0f, 0xa438, 0xae0e, 0xa438, 0xa003, 0xa438, 0x0502, - 0xa438, 0x8c95, 0xa438, 0xae06, 0xa438, 0xa004, 0xa438, 0x0302, - 0xa438, 0x8d08, 0xa438, 0xaf63, 0xa438, 0x8902, 0xa438, 0x8a7f, - 0xa438, 0xaf63, 0xa438, 0x81f8, 0xa438, 0xef49, 0xa438, 0xf8e0, - 0xa438, 0x8015, 0xa438, 0xad21, 0xa438, 0x19bf, 0xa438, 0x7bd8, - 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7bf3, 0xa438, 0x027d, - 0xa438, 0x44bf, 0xa438, 0x7bf6, 0xa438, 0x027c, 0xa438, 0xf902, - 0xa438, 0x638e, 0xa438, 0xee8f, 0xa438, 0xea00, 0xa438, 0xe080, - 0xa438, 0x16ad, 0xa438, 0x233d, 0xa438, 0xbf7b, 0xa438, 0xf302, - 0xa438, 0x7d44, 0xa438, 0xbf7a, 0xa438, 0x9402, 0xa438, 0x7cf9, - 0xa438, 0xbf8e, 0xa438, 0x4402, 0xa438, 0x7cf9, 0xa438, 0xbf7a, - 0xa438, 0xa602, 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa302, - 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa902, 0xa438, 0x7cf9, - 0xa438, 0xbf7a, 0xa438, 0xac02, 0xa438, 0x7cf9, 0xa438, 0xbf8e, - 0xa438, 0x4702, 0xa438, 0x7cf9, 0xa438, 0xbf8e, 0xa438, 0x4a02, - 0xa438, 0x7cf9, 0xa438, 0x0263, 0xa438, 0x8eee, 0xa438, 0x8fea, - 0xa438, 0x00bf, 0xa438, 0x7c02, 0xa438, 0x027c, 0xa438, 0xf9fc, - 0xa438, 0xef94, 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xfbef, - 0xa438, 0x79fb, 0xa438, 0xe080, 0xa438, 0x15ac, 0xa438, 0x2103, - 0xa438, 0xaf8b, 0xa438, 0x70ee, 0xa438, 0x8888, 0xa438, 0x00ee, - 0xa438, 0x888a, 0xa438, 0x00ee, 0xa438, 0x888b, 0xa438, 0x00bf, - 0xa438, 0x7bd8, 0xa438, 0x027d, 0xa438, 0x02bf, 0xa438, 0x6000, - 0xa438, 0xd788, 0xa438, 0x881f, 0xa438, 0x44d4, 0xa438, 0x000c, - 0xa438, 0x0273, 0xa438, 0x3b02, 0xa438, 0x7fa9, 0xa438, 0xac28, - 0xa438, 0x05ac, 0xa438, 0x290d, 0xa438, 0xae18, 0xa438, 0xe188, - 0xa438, 0x98bf, 0xa438, 0x7be1, 0xa438, 0x027d, 0xa438, 0x25ae, - 0xa438, 0x18e1, 0xa438, 0x8898, 0xa438, 0x0d11, 0xa438, 0xbf7b, - 0xa438, 0xe102, 0xa438, 0x7d25, 0xa438, 0xae0b, 0xa438, 0xe188, - 0xa438, 0x980d, 0xa438, 0x12bf, 0xa438, 0x7be1, 0xa438, 0x027d, - 0xa438, 0x25bf, 0xa438, 0x88a0, 0xa438, 0xda19, 0xa438, 0xdb19, - 0xa438, 0xd819, 0xa438, 0xd91f, 0xa438, 0x77bf, 0xa438, 0x88b1, - 0xa438, 0xde19, 0xa438, 0xdf19, 0xa438, 0xdc19, 0xa438, 0xdd19, - 0xa438, 0x17a7, 0xa438, 0x0004, 0xa438, 0xf302, 0xa438, 0x63cd, - 0xa438, 0xee8f, 0xa438, 0xea01, 0xa438, 0xe080, 0xa438, 0x16ad, - 0xa438, 0x2319, 0xa438, 0xee88, 0xa438, 0x8800, 0xa438, 0xee88, - 0xa438, 0x8a00, 0xa438, 0xee88, 0xa438, 0x8b00, 0xa438, 0xbf8e, - 0xa438, 0x4402, 0xa438, 0x7d02, 0xa438, 0x0263, 0xa438, 0xcdee, - 0xa438, 0x8fea, 0xa438, 0x0102, 0xa438, 0x70de, 0xa438, 0xbf7c, - 0xa438, 0x0202, 0xa438, 0x7d02, 0xa438, 0xffef, 0xa438, 0x97ff, - 0xa438, 0xfdfc, 0xa438, 0x04f8, 0xa438, 0xf9fa, 0xa438, 0xef69, - 0xa438, 0xfae0, 0xa438, 0x888a, 0xa438, 0xe188, 0xa438, 0x8b14, - 0xa438, 0xe488, 0xa438, 0x8ae5, 0xa438, 0x888b, 0xa438, 0xbf88, - 0xa438, 0x94d8, 0xa438, 0x19d9, 0xa438, 0xef64, 0xa438, 0xe088, - 0xa438, 0x8ae1, 0xa438, 0x888b, 0xa438, 0x1b46, 0xa438, 0x9f30, - 0xa438, 0x1f44, 0xa438, 0xe488, 0xa438, 0x8ae5, 0xa438, 0x888b, - 0xa438, 0xe080, 0xa438, 0x15ad, 0xa438, 0x211a, 0xa438, 0x0260, - 0xa438, 0xece0, 0xa438, 0x8016, 0xa438, 0xad23, 0xa438, 0x1602, - 0xa438, 0x7c86, 0xa438, 0xef47, 0xa438, 0xe48f, 0xa438, 0xe9e5, - 0xa438, 0x8fe8, 0xa438, 0xee8f, 0xa438, 0xea02, 0xa438, 0xae0b, - 0xa438, 0x028c, 0xa438, 0x2eae, 0xa438, 0x0602, 0xa438, 0x8bfe, - 0xa438, 0x0270, 0xa438, 0xdefe, 0xa438, 0xef96, 0xa438, 0xfefd, - 0xa438, 0xfc04, 0xa438, 0xf8e1, 0xa438, 0x8888, 0xa438, 0x11e5, - 0xa438, 0x8888, 0xa438, 0xad2a, 0xa438, 0x04ee, 0xa438, 0x8888, - 0xa438, 0x00fc, 0xa438, 0x04f8, 0xa438, 0xfafb, 0xa438, 0xe08f, - 0xa438, 0xe9e1, 0xa438, 0x8fe8, 0xa438, 0xef64, 0xa438, 0x1f00, - 0xa438, 0xe18f, 0xa438, 0xe6ef, 0xa438, 0x7402, 0xa438, 0x7ca1, - 0xa438, 0xad50, 0xa438, 0x0302, 0xa438, 0x8c2e, 0xa438, 0xfffe, - 0xa438, 0xfc04, 0xa438, 0xf8fa, 0xa438, 0xef69, 0xa438, 0xfbbf, - 0xa438, 0x7bf3, 0xa438, 0x027d, 0xa438, 0x44ac, 0xa438, 0x284c, - 0xa438, 0x0264, 0xa438, 0x1cbf, 0xa438, 0x8e47, 0xa438, 0x027d, - 0xa438, 0x02bf, 0xa438, 0x8e4a, 0xa438, 0x027d, 0xa438, 0x02d1, - 0xa438, 0x43b1, 0xa438, 0xfebf, 0xa438, 0x7aa6, 0xa438, 0x027c, - 0xa438, 0xf9bf, 0xa438, 0x7aa3, 0xa438, 0x027c, 0xa438, 0xf9bf, - 0xa438, 0x7aa9, 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aac, - 0xa438, 0x027d, 0xa438, 0x02d1, 0xa438, 0x80e0, 0xa438, 0x8888, - 0xa438, 0x100e, 0xa438, 0x11b0, 0xa438, 0xfcbf, 0xa438, 0x7a94, - 0xa438, 0x027d, 0xa438, 0x2502, 0xa438, 0x7c86, 0xa438, 0xef47, - 0xa438, 0xe48f, 0xa438, 0xe9e5, 0xa438, 0x8fe8, 0xa438, 0xee8f, - 0xa438, 0xea03, 0xa438, 0xae07, 0xa438, 0xee8f, 0xa438, 0xea01, - 0xa438, 0x0270, 0xa438, 0xdeff, 0xa438, 0xef96, 0xa438, 0xfefc, - 0xa438, 0x04f8, 0xa438, 0xf9fa, 0xa438, 0xfbef, 0xa438, 0x79fb, - 0xa438, 0xbf7a, 0xa438, 0x9402, 0xa438, 0x7d44, 0xa438, 0xef21, - 0xa438, 0xbf7a, 0xa438, 0xb802, 0xa438, 0x7d44, 0xa438, 0x1f21, - 0xa438, 0x9e19, 0xa438, 0xe08f, 0xa438, 0xe9e1, 0xa438, 0x8fe8, - 0xa438, 0xef64, 0xa438, 0x1f00, 0xa438, 0xe18f, 0xa438, 0xe4ef, - 0xa438, 0x7402, 0xa438, 0x7ca1, 0xa438, 0xad50, 0xa438, 0x3dee, - 0xa438, 0x8fe7, 0xa438, 0x01bf, 0xa438, 0x7a94, 0xa438, 0x027c, - 0xa438, 0xf9bf, 0xa438, 0x7aa6, 0xa438, 0x027c, 0xa438, 0xf9bf, - 0xa438, 0x7aa3, 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aa9, - 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aac, 0xa438, 0x027d, - 0xa438, 0x02bf, 0xa438, 0x8e47, 0xa438, 0x027c, 0xa438, 0xf9bf, - 0xa438, 0x8e4a, 0xa438, 0x027c, 0xa438, 0xf902, 0xa438, 0x7c86, - 0xa438, 0xef47, 0xa438, 0xe48f, 0xa438, 0xe9e5, 0xa438, 0x8fe8, - 0xa438, 0xee8f, 0xa438, 0xea04, 0xa438, 0xffef, 0xa438, 0x97ff, - 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xf8fa, 0xa438, 0xfbe0, - 0xa438, 0x8fe9, 0xa438, 0xe18f, 0xa438, 0xe8ef, 0xa438, 0x641f, - 0xa438, 0x00e1, 0xa438, 0x8fe5, 0xa438, 0xef74, 0xa438, 0x027c, - 0xa438, 0xa1ad, 0xa438, 0x500d, 0xa438, 0x0263, 0xa438, 0x8e02, - 0xa438, 0x8bfe, 0xa438, 0xee8f, 0xa438, 0xea01, 0xa438, 0x0270, - 0xa438, 0xdeff, 0xa438, 0xfefc, 0xa438, 0x04e3, 0xa438, 0x8fd8, - 0xa438, 0xe787, 0xa438, 0x75e4, 0xa438, 0x8fe1, 0xa438, 0xe58f, - 0xa438, 0xe2bf, 0xa438, 0x8fd9, 0xa438, 0xef32, 0xa438, 0x0c31, - 0xa438, 0x1a93, 0xa438, 0xdc19, 0xa438, 0xdd02, 0xa438, 0x7fa9, - 0xa438, 0xac2a, 0xa438, 0x18e0, 0xa438, 0x8fe1, 0xa438, 0xe18f, - 0xa438, 0xe2ef, 0xa438, 0x74e1, 0xa438, 0x8775, 0xa438, 0x1f00, - 0xa438, 0xef64, 0xa438, 0xe18f, 0xa438, 0xd8e5, 0xa438, 0x8775, - 0xa438, 0xaf4d, 0xa438, 0x72bf, 0xa438, 0x7b3c, 0xa438, 0xef32, - 0xa438, 0x4b03, 0xa438, 0x1a93, 0xa438, 0x027d, 0xa438, 0x44ef, - 0xa438, 0x64e1, 0xa438, 0x8fff, 0xa438, 0x1f00, 0xa438, 0xef74, - 0xa438, 0x1b67, 0xa438, 0xac4f, 0xa438, 0xcee0, 0xa438, 0x8ffd, - 0xa438, 0xe18f, 0xa438, 0xfeef, 0xa438, 0x64e0, 0xa438, 0x8fe1, - 0xa438, 0xe18f, 0xa438, 0xe2ef, 0xa438, 0x7402, 0xa438, 0x7c53, - 0xa438, 0xac50, 0xa438, 0x02ae, 0xa438, 0xb6e1, 0xa438, 0x8775, - 0xa438, 0x1f00, 0xa438, 0xef64, 0xa438, 0xe18f, 0xa438, 0xfcef, - 0xa438, 0x711c, 0xa438, 0x670d, 0xa438, 0x67ef, 0xa438, 0x46e5, - 0xa438, 0x8775, 0xa438, 0xef32, 0xa438, 0xd101, 0xa438, 0xa300, - 0xa438, 0x02ae, 0xa438, 0x050c, 0xa438, 0x1183, 0xa438, 0xaef6, - 0xa438, 0xe08f, 0xa438, 0xe31e, 0xa438, 0x10e5, 0xa438, 0x8fe3, - 0xa438, 0xae89, 0xa438, 0xe287, 0xa438, 0x75e6, 0xa438, 0x8fd8, - 0xa438, 0x1f22, 0xa438, 0xaf4d, 0xa438, 0x42f8, 0xa438, 0xf9ef, - 0xa438, 0x59fa, 0xa438, 0xfbbf, 0xa438, 0x8fee, 0xa438, 0x027f, - 0xa438, 0xa90d, 0xa438, 0x1149, 0xa438, 0x041a, 0xa438, 0x91d7, - 0xa438, 0x8df3, 0xa438, 0xd68e, 0xa438, 0x2302, 0xa438, 0x72aa, - 0xa438, 0xfffe, 0xa438, 0xef95, 0xa438, 0xfdfc, 0xa438, 0x0400, - 0xa438, 0x7591, 0xa438, 0x0275, 0xa438, 0x4404, 0xa438, 0x758e, - 0xa438, 0x2675, 0xa438, 0x4100, 0xa438, 0x8e26, 0xa438, 0x028e, - 0xa438, 0x2304, 0xa438, 0x759d, 0xa438, 0x2675, 0xa438, 0x4700, - 0xa438, 0x8e32, 0xa438, 0x028e, 0xa438, 0x2f04, 0xa438, 0x8e2c, - 0xa438, 0x268e, 0xa438, 0x2900, 0xa438, 0x8e3e, 0xa438, 0x028e, - 0xa438, 0x3b04, 0xa438, 0x8e38, 0xa438, 0x268e, 0xa438, 0x35fe, - 0xa438, 0xad96, 0xa438, 0xdcad, 0xa438, 0x96ba, 0xa438, 0xad96, - 0xa438, 0x98ad, 0xa438, 0x9676, 0xa438, 0xad98, 0xa438, 0x54ad, - 0xa438, 0x9876, 0xa438, 0xae38, 0xa438, 0x54ae, 0xa438, 0x38fe, - 0xa438, 0xae3a, 0xa438, 0xdcae, 0xa438, 0x3abb, 0xa438, 0xbf14, - 0xa438, 0x99bd, 0xa438, 0xe0cc, 0xa438, 0xbdc8, 0xa438, 0xddbd, - 0xa438, 0xc800, 0xa436, 0xb85e, 0xa438, 0x4f9a, 0xa436, 0xb860, - 0xa438, 0x40cf, 0xa436, 0xb862, 0xa438, 0x6829, 0xa436, 0xb864, - 0xa438, 0x5972, 0xa436, 0xb886, 0xa438, 0x5941, 0xa436, 0xb888, - 0xa438, 0x636b, 0xa436, 0xb88a, 0xa438, 0x4d6b, 0xa436, 0xb88c, - 0xa438, 0x4d40, 0xa436, 0xb838, 0xa438, 0x00ff, 0xb820, 0x0010, - 0xa436, 0x8608, 0xa438, 0xaf86, 0xa438, 0xdaaf, 0xa438, 0x894c, - 0xa438, 0xaf8a, 0xa438, 0xf8af, 0xa438, 0x8bf3, 0xa438, 0xaf8b, - 0xa438, 0xf3af, 0xa438, 0x8bf3, 0xa438, 0xaf8b, 0xa438, 0xf3af, - 0xa438, 0x8bf3, 0xa438, 0x006f, 0xa438, 0x4a03, 0xa438, 0x6f47, - 0xa438, 0x266f, 0xa438, 0x5900, 0xa438, 0x6f4d, 0xa438, 0x016f, - 0xa438, 0x5004, 0xa438, 0x6f56, 0xa438, 0x056f, 0xa438, 0x5f06, - 0xa438, 0x6f5c, 0xa438, 0x2774, 0xa438, 0x7800, 0xa438, 0x6f68, - 0xa438, 0x246f, 0xa438, 0x6b20, 0xa438, 0x6f6e, 0xa438, 0x206f, - 0xa438, 0x7410, 0xa438, 0x7469, 0xa438, 0x1074, 0xa438, 0x6c10, - 0xa438, 0x746f, 0xa438, 0x1074, 0xa438, 0x7225, 0xa438, 0x8bfc, - 0xa438, 0x008c, 0xa438, 0x0802, 0xa438, 0x8c02, 0xa438, 0x038b, - 0xa438, 0xff04, 0xa438, 0x6eed, 0xa438, 0x278c, 0xa438, 0x0520, - 0xa438, 0x74da, 0xa438, 0x2074, 0xa438, 0xdd20, 0xa438, 0x74e0, - 0xa438, 0x0074, 0xa438, 0xe300, 0xa438, 0x6ef3, 0xa438, 0x006e, - 0xa438, 0xf600, 0xa438, 0x6ef9, 0xa438, 0x006e, 0xa438, 0xfc00, - 0xa438, 0x6eff, 0xa438, 0x006f, 0xa438, 0x0200, 0xa438, 0x6f05, - 0xa438, 0x026f, 0xa438, 0x0802, 0xa438, 0x6f0b, 0xa438, 0x026f, - 0xa438, 0x0e02, 0xa438, 0x6f11, 0xa438, 0x026f, 0xa438, 0x1402, - 0xa438, 0x6f17, 0xa438, 0x226f, 0xa438, 0x1a00, 0xa438, 0x723e, - 0xa438, 0x016e, 0xa438, 0xed24, 0xa438, 0x6f50, 0xa438, 0x0072, - 0xa438, 0x4701, 0xa438, 0x724a, 0xa438, 0x0272, 0xa438, 0x4d23, - 0xa438, 0x7250, 0xa438, 0x1074, 0xa438, 0x6910, 0xa438, 0x746c, - 0xa438, 0x1074, 0xa438, 0x6f00, 0xa438, 0x7472, 0xa438, 0x158c, - 0xa438, 0x0b15, 0xa438, 0x8c0e, 0xa438, 0x158c, 0xa438, 0x1105, - 0xa438, 0x8c14, 0xa438, 0x006f, 0xa438, 0x4a03, 0xa438, 0x6f47, - 0xa438, 0x266f, 0xa438, 0x5900, 0xa438, 0x731f, 0xa438, 0x0273, - 0xa438, 0x2203, 0xa438, 0x8c08, 0xa438, 0xee84, 0xa438, 0x7100, - 0xa438, 0x0286, 0xa438, 0xece0, 0xa438, 0x8043, 0xa438, 0xf626, - 0xa438, 0xe480, 0xa438, 0x43af, 0xa438, 0x6611, 0xa438, 0xf8e0, - 0xa438, 0x8012, 0xa438, 0xac26, 0xa438, 0x03af, 0xa438, 0x86ff, - 0xa438, 0x0287, 0xa438, 0x0102, 0xa438, 0x8906, 0xa438, 0x0289, - 0xa438, 0x29fc, 0xa438, 0x04f8, 0xa438, 0xf9ef, 0xa438, 0x59f9, - 0xa438, 0xfaee, 0xa438, 0x8476, 0xa438, 0x00d6, 0xa438, 0x008f, - 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, - 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8fe7, 0xa438, 0xe58f, - 0xa438, 0xe8ae, 0xa438, 0x06e0, 0xa438, 0x8fe7, 0xa438, 0xe18f, - 0xa438, 0xe8ee, 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x00c0, - 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x00d6, - 0xa438, 0x0090, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, - 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8fe9, - 0xa438, 0xe58f, 0xa438, 0xeaae, 0xa438, 0x06e0, 0xa438, 0x8fe9, - 0xa438, 0xe18f, 0xa438, 0xeaee, 0xa438, 0x8476, 0xa438, 0x01d6, - 0xa438, 0x00c1, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, - 0xa438, 0x00d6, 0xa438, 0x0091, 0xa438, 0x0266, 0xa438, 0x53ef, - 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, - 0xa438, 0x8feb, 0xa438, 0xe58f, 0xa438, 0xecae, 0xa438, 0x06e0, - 0xa438, 0x8feb, 0xa438, 0xe18f, 0xa438, 0xecee, 0xa438, 0x8476, - 0xa438, 0x01d6, 0xa438, 0x00c2, 0xa438, 0x0266, 0xa438, 0x71ee, - 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x008f, 0xa438, 0x0266, - 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, - 0xa438, 0x08e4, 0xa438, 0x8fed, 0xa438, 0xe58f, 0xa438, 0xeeae, - 0xa438, 0x06e0, 0xa438, 0x8fed, 0xa438, 0xe18f, 0xa438, 0xeeee, - 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x00c0, 0xa438, 0x0266, - 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x0090, - 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, - 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8fef, 0xa438, 0xe58f, - 0xa438, 0xf0ae, 0xa438, 0x06e0, 0xa438, 0x8fef, 0xa438, 0xe18f, - 0xa438, 0xf0ee, 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x00c1, - 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x01d6, - 0xa438, 0x0091, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, - 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff1, - 0xa438, 0xe58f, 0xa438, 0xf2ae, 0xa438, 0x06e0, 0xa438, 0x8ff1, - 0xa438, 0xe18f, 0xa438, 0xf2ee, 0xa438, 0x8476, 0xa438, 0x02d6, - 0xa438, 0x00c2, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, - 0xa438, 0x02d6, 0xa438, 0x008f, 0xa438, 0x0266, 0xa438, 0x53ef, - 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, - 0xa438, 0x8ff3, 0xa438, 0xe58f, 0xa438, 0xf4ae, 0xa438, 0x06e0, - 0xa438, 0x8ff3, 0xa438, 0xe18f, 0xa438, 0xf4ee, 0xa438, 0x8476, - 0xa438, 0x04d6, 0xa438, 0x00c0, 0xa438, 0x0266, 0xa438, 0x71ee, - 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x0090, 0xa438, 0x0266, - 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, - 0xa438, 0x08e4, 0xa438, 0x8ff5, 0xa438, 0xe58f, 0xa438, 0xf6ae, - 0xa438, 0x06e0, 0xa438, 0x8ff5, 0xa438, 0xe18f, 0xa438, 0xf6ee, - 0xa438, 0x8476, 0xa438, 0x04d6, 0xa438, 0x00c1, 0xa438, 0x0266, - 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x0091, - 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, - 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff7, 0xa438, 0xe58f, - 0xa438, 0xf8ae, 0xa438, 0x06e0, 0xa438, 0x8ff7, 0xa438, 0xe18f, - 0xa438, 0xf8ee, 0xa438, 0x8476, 0xa438, 0x04d6, 0xa438, 0x00c2, - 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x03d6, - 0xa438, 0x008f, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, - 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff9, - 0xa438, 0xe58f, 0xa438, 0xfaae, 0xa438, 0x06e0, 0xa438, 0x8ff9, - 0xa438, 0xe18f, 0xa438, 0xfaee, 0xa438, 0x8476, 0xa438, 0x08d6, - 0xa438, 0x00c0, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, - 0xa438, 0x03d6, 0xa438, 0x0090, 0xa438, 0x0266, 0xa438, 0x53ef, - 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, - 0xa438, 0x8ffb, 0xa438, 0xe58f, 0xa438, 0xfcae, 0xa438, 0x06e0, - 0xa438, 0x8ffb, 0xa438, 0xe18f, 0xa438, 0xfcee, 0xa438, 0x8476, - 0xa438, 0x08d6, 0xa438, 0x00c1, 0xa438, 0x0266, 0xa438, 0x71ee, - 0xa438, 0x8476, 0xa438, 0x03d6, 0xa438, 0x0091, 0xa438, 0x0266, - 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, - 0xa438, 0x08e4, 0xa438, 0x8ffd, 0xa438, 0xe58f, 0xa438, 0xfeae, - 0xa438, 0x06e0, 0xa438, 0x8ffd, 0xa438, 0xe18f, 0xa438, 0xfeee, - 0xa438, 0x8476, 0xa438, 0x08d6, 0xa438, 0x00c2, 0xa438, 0x0266, - 0xa438, 0x71fe, 0xa438, 0xfdef, 0xa438, 0x95fd, 0xa438, 0xfc04, - 0xa438, 0xf8f9, 0xa438, 0xfad4, 0xa438, 0x0400, 0xa438, 0xd600, - 0xa438, 0x0dd3, 0xa438, 0x0fe7, 0xa438, 0x8476, 0xa438, 0x0266, - 0xa438, 0x71d4, 0xa438, 0x1400, 0xa438, 0xd600, 0xa438, 0x0dd3, - 0xa438, 0x0fe7, 0xa438, 0x8476, 0xa438, 0x0266, 0xa438, 0x71fe, - 0xa438, 0xfdfc, 0xa438, 0x04f8, 0xa438, 0xf9fa, 0xa438, 0xd410, - 0xa438, 0x00d6, 0xa438, 0x000d, 0xa438, 0xd30f, 0xa438, 0xe784, - 0xa438, 0x7602, 0xa438, 0x6671, 0xa438, 0xd400, 0xa438, 0x00d6, - 0xa438, 0x000d, 0xa438, 0xd30f, 0xa438, 0xe784, 0xa438, 0x7602, - 0xa438, 0x6671, 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xe080, - 0xa438, 0x4fac, 0xa438, 0x2317, 0xa438, 0xe080, 0xa438, 0x44ad, - 0xa438, 0x231a, 0xa438, 0x0289, 0xa438, 0x75e0, 0xa438, 0x8044, - 0xa438, 0xac23, 0xa438, 0x11bf, 0xa438, 0x6ecf, 0xa438, 0x0276, - 0xa438, 0x74ae, 0xa438, 0x0902, 0xa438, 0x8adb, 0xa438, 0x021f, - 0xa438, 0xe702, 0xa438, 0x1fbb, 0xa438, 0xaf1f, 0xa438, 0x95f8, - 0xa438, 0xf9ef, 0xa438, 0x59f9, 0xa438, 0xfafb, 0xa438, 0xe080, - 0xa438, 0x12ac, 0xa438, 0x2303, 0xa438, 0xaf8a, 0xa438, 0xd0d4, - 0xa438, 0x0120, 0xa438, 0xd600, 0xa438, 0x10d2, 0xa438, 0x0fe6, - 0xa438, 0x8476, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x846f, - 0xa438, 0x00d4, 0xa438, 0x000f, 0xa438, 0xbf72, 0xa438, 0x9e02, - 0xa438, 0x7697, 0xa438, 0x0275, 0xa438, 0xbeef, 0xa438, 0x47e4, - 0xa438, 0x8474, 0xa438, 0xe584, 0xa438, 0x75bf, 0xa438, 0x729b, - 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x846f, 0xa438, 0xef31, - 0xa438, 0xbf6e, 0xa438, 0x0602, 0xa438, 0x76b6, 0xa438, 0xef64, - 0xa438, 0xbf6e, 0xa438, 0x0902, 0xa438, 0x76b6, 0xa438, 0x1e64, - 0xa438, 0xbf6e, 0xa438, 0x0f02, 0xa438, 0x76b6, 0xa438, 0x1e64, - 0xa438, 0xac40, 0xa438, 0x05a3, 0xa438, 0x0f0c, 0xa438, 0xae26, - 0xa438, 0xa303, 0xa438, 0x02ae, 0xa438, 0x21a3, 0xa438, 0x0c02, - 0xa438, 0xae1c, 0xa438, 0xe084, 0xa438, 0x74e1, 0xa438, 0x8475, - 0xa438, 0xef64, 0xa438, 0xd000, 0xa438, 0xd196, 0xa438, 0xef74, - 0xa438, 0x0275, 0xa438, 0xd9ad, 0xa438, 0x50b7, 0xa438, 0xe083, - 0xa438, 0xecf7, 0xa438, 0x23e4, 0xa438, 0x83ec, 0xa438, 0xbf72, - 0xa438, 0x9e02, 0xa438, 0x766b, 0xa438, 0x0287, 0xa438, 0x0102, - 0xa438, 0x8906, 0xa438, 0xee83, 0xa438, 0xe800, 0xa438, 0xbf72, - 0xa438, 0x6b02, 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x6e02, - 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x7102, 0xa438, 0x766b, - 0xa438, 0xbf72, 0xa438, 0x7402, 0xa438, 0x766b, 0xa438, 0xbf72, - 0xa438, 0x7702, 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x7a02, - 0xa438, 0x766b, 0xa438, 0xd400, 0xa438, 0x0fbf, 0xa438, 0x7295, - 0xa438, 0x0276, 0xa438, 0x97d7, 0xa438, 0x0400, 0xa438, 0xbf6e, - 0xa438, 0x0602, 0xa438, 0x76b6, 0xa438, 0xef64, 0xa438, 0xbf6e, - 0xa438, 0x0902, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xbf6e, - 0xa438, 0x0f02, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xac40, - 0xa438, 0x0fbf, 0xa438, 0x7298, 0xa438, 0x0276, 0xa438, 0xb6e5, - 0xa438, 0x83e8, 0xa438, 0xa10f, 0xa438, 0x28af, 0xa438, 0x8a95, - 0xa438, 0xbf8b, 0xa438, 0xf302, 0xa438, 0x76b6, 0xa438, 0xac28, - 0xa438, 0x02ae, 0xa438, 0x0bbf, 0xa438, 0x8bf9, 0xa438, 0x0276, - 0xa438, 0xb6e5, 0xa438, 0x83e8, 0xa438, 0xae09, 0xa438, 0xbf8b, - 0xa438, 0xf602, 0xa438, 0x76b6, 0xa438, 0xe583, 0xa438, 0xe8a1, - 0xa438, 0x0303, 0xa438, 0xaf8a, 0xa438, 0x95b7, 0xa438, 0xafe2, - 0xa438, 0x83ec, 0xa438, 0xf735, 0xa438, 0xe683, 0xa438, 0xecbf, - 0xa438, 0x7295, 0xa438, 0x0276, 0xa438, 0x6bbf, 0xa438, 0x726b, - 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x726e, 0xa438, 0x0276, - 0xa438, 0x74bf, 0xa438, 0x7271, 0xa438, 0x0276, 0xa438, 0x74bf, - 0xa438, 0x7274, 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x7277, - 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x727a, 0xa438, 0x0276, - 0xa438, 0x7402, 0xa438, 0x8929, 0xa438, 0xd401, 0xa438, 0x28d6, - 0xa438, 0x0010, 0xa438, 0xd20f, 0xa438, 0xe684, 0xa438, 0x7602, - 0xa438, 0x6671, 0xa438, 0x021f, 0xa438, 0xbbff, 0xa438, 0xfefd, - 0xa438, 0xef95, 0xa438, 0xfdfc, 0xa438, 0x04f8, 0xa438, 0xf9ef, - 0xa438, 0x59f9, 0xa438, 0xe080, 0xa438, 0x12ad, 0xa438, 0x230c, - 0xa438, 0xbf72, 0xa438, 0x9e02, 0xa438, 0x766b, 0xa438, 0xbf72, - 0xa438, 0x9502, 0xa438, 0x766b, 0xa438, 0xfdef, 0xa438, 0x95fd, - 0xa438, 0xfc04, 0xa438, 0xbf6e, 0xa438, 0x0602, 0xa438, 0x76b6, + 0xa438, 0x5fba, 0xa438, 0xd700, 0xa438, 0x273d, 0xa438, 0x8056, + 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x802e, 0xa438, 0x33a9, + 0xa438, 0x8026, 0xa438, 0xd702, 0xa438, 0x6099, 0xa438, 0xd1b7, + 0xa438, 0xd05c, 0xa438, 0xf013, 0xa438, 0xd1b7, 0xa438, 0xd05c, + 0xa438, 0xf010, 0xa438, 0xd702, 0xa438, 0x6099, 0xa438, 0xd1b7, + 0xa438, 0xd05c, 0xa438, 0xf00b, 0xa438, 0xd1b7, 0xa438, 0xd05c, + 0xa438, 0xf008, 0xa438, 0xd702, 0xa438, 0x6099, 0xa438, 0xd199, + 0xa438, 0xd05d, 0xa438, 0xf003, 0xa438, 0xd199, 0xa438, 0xd05d, + 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x804a, 0xa438, 0x33a9, + 0xa438, 0x8042, 0xa438, 0xd702, 0xa438, 0x6099, 0xa438, 0xd1bf, + 0xa438, 0xd06d, 0xa438, 0xf013, 0xa438, 0xd1e5, 0xa438, 0xd06d, + 0xa438, 0xf010, 0xa438, 0xd702, 0xa438, 0x6099, 0xa438, 0xd1ec, + 0xa438, 0xd06d, 0xa438, 0xf00b, 0xa438, 0xd1bf, 0xa438, 0xd06d, + 0xa438, 0xf008, 0xa438, 0xd702, 0xa438, 0x6099, 0xa438, 0xd199, + 0xa438, 0xd06e, 0xa438, 0xf003, 0xa438, 0xd199, 0xa438, 0xd06e, + 0xa438, 0xd703, 0xa438, 0x6090, 0xa438, 0xd41a, 0xa438, 0x1000, + 0xa438, 0x1cc8, 0xa438, 0xd408, 0xa438, 0x1000, 0xa438, 0x1cc8, + 0xa438, 0xcd31, 0xa438, 0xd700, 0xa438, 0x2fa9, 0xa438, 0x8061, + 0xa438, 0x33c9, 0xa438, 0x8064, 0xa438, 0x6117, 0xa438, 0xf00a, + 0xa438, 0xd141, 0xa438, 0xd043, 0xa438, 0xf009, 0xa438, 0xd121, + 0xa438, 0xd043, 0xa438, 0xf006, 0xa438, 0xd122, 0xa438, 0xd042, + 0xa438, 0xf003, 0xa438, 0xd181, 0xa438, 0xd043, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd700, + 0xa438, 0x2969, 0xa438, 0x80da, 0xa438, 0xd700, 0xa438, 0x6ccb, + 0xa438, 0xd700, 0xa438, 0x6d67, 0xa438, 0x800a, 0xa438, 0x81a0, + 0xa438, 0x8312, 0xa438, 0x8480, 0xa438, 0x0c86, 0xa438, 0x0680, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8702, 0xa438, 0x9503, + 0xa438, 0xd407, 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xd703, + 0xa438, 0x6090, 0xa438, 0xd41a, 0xa438, 0x1000, 0xa438, 0x1cc8, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8380, 0xa438, 0x9503, + 0xa438, 0xd406, 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xcd39, + 0xa438, 0xd404, 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xd700, + 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, + 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce03, 0xa438, 0xf00a, + 0xa438, 0xce03, 0xa438, 0xf008, 0xa438, 0xce03, 0xa438, 0xf006, + 0xa438, 0xce03, 0xa438, 0xf004, 0xa438, 0xce03, 0xa438, 0xf002, + 0xa438, 0xce03, 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c07, 0xa438, 0x0c01, 0xa438, 0x8d07, + 0xa438, 0x0cc3, 0xa438, 0x0b40, 0xa438, 0x8d07, 0xa438, 0x9503, + 0xa438, 0xa810, 0xa438, 0xa00a, 0xa438, 0xa302, 0xa438, 0x0ca0, + 0xa438, 0x0480, 0xa438, 0xa684, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd706, 0xa438, 0x5fa7, 0xa438, 0xb920, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x8810, + 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, + 0xa438, 0x60e5, 0xa438, 0x5f94, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd706, 0xa438, 0x5fa7, 0xa438, 0xfff0, 0xa438, 0xb820, + 0xa438, 0xa810, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, + 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd706, 0xa438, 0x5f69, + 0xa438, 0xf010, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xae80, + 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x2b6d, 0xa438, 0x8184, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8380, 0xa438, 0x9503, + 0xa438, 0xd406, 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xcd32, + 0xa438, 0xd701, 0xa438, 0x6191, 0xa438, 0xa504, 0xa438, 0xcd3a, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x6067, + 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd701, 0xa438, 0x5f3a, + 0xa438, 0x8504, 0xa438, 0xd700, 0xa438, 0x2739, 0xa438, 0x817a, + 0xa438, 0xd707, 0xa438, 0x6061, 0xa438, 0x1800, 0xa438, 0x816c, + 0xa438, 0xd193, 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x5f7a, + 0xa438, 0xd706, 0xa438, 0x5f29, 0xa438, 0xd700, 0xa438, 0x60cf, + 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, 0xa438, 0x6157, + 0xa438, 0xf00b, 0xa438, 0xce06, 0xa438, 0xf00a, 0xa438, 0xce06, + 0xa438, 0xf008, 0xa438, 0xce06, 0xa438, 0xf006, 0xa438, 0xce06, + 0xa438, 0xf004, 0xa438, 0xce06, 0xa438, 0xf002, 0xa438, 0xce06, + 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x0c0f, 0xa438, 0x0b01, 0xa438, 0x0c3f, 0xa438, 0x0c08, + 0xa438, 0x8bc0, 0xa438, 0x9503, 0xa438, 0xd707, 0xa438, 0x409f, + 0xa438, 0x4062, 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, + 0xa438, 0xa120, 0xa438, 0xa420, 0xa438, 0xd193, 0xa438, 0xd048, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd700, 0xa438, 0x5f7a, 0xa438, 0xd706, 0xa438, 0x5f29, + 0xa438, 0xd700, 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, + 0xa438, 0x6135, 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce03, + 0xa438, 0xf00a, 0xa438, 0xce03, 0xa438, 0xf008, 0xa438, 0xce03, + 0xa438, 0xf006, 0xa438, 0xce03, 0xa438, 0xf004, 0xa438, 0xce03, + 0xa438, 0xf002, 0xa438, 0xce03, 0xa438, 0x1000, 0xa438, 0x1ce7, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c07, 0xa438, 0x0c01, + 0xa438, 0x9503, 0xa438, 0x8420, 0xa438, 0x800a, 0xa438, 0x8120, + 0xa438, 0x8312, 0xa438, 0x8480, 0xa438, 0x8604, 0xa438, 0xd419, + 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xd702, 0xa438, 0x4080, + 0xa438, 0xbb20, 0xa438, 0x1800, 0xa438, 0x8507, 0xa438, 0xa00a, + 0xa438, 0xa302, 0xa438, 0xa480, 0xa438, 0xa604, 0xa438, 0xd193, + 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x5f7a, 0xa438, 0xd706, + 0xa438, 0x5f29, 0xa438, 0x1800, 0xa438, 0x814f, 0xa438, 0x800a, + 0xa438, 0x8302, 0xa438, 0x8480, 0xa438, 0x8604, 0xa438, 0xd405, + 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xbb20, 0xa438, 0xa00a, + 0xa438, 0xa302, 0xa438, 0xa480, 0xa438, 0xa604, 0xa438, 0x1800, + 0xa438, 0x8507, 0xa438, 0xd405, 0xa438, 0x1000, 0xa438, 0x1cc8, + 0xa438, 0xd404, 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xd700, + 0xa438, 0x2b69, 0xa438, 0x8184, 0xa438, 0xf06d, 0xa438, 0xd700, + 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, + 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce03, 0xa438, 0xf00a, + 0xa438, 0xce03, 0xa438, 0xf008, 0xa438, 0xce03, 0xa438, 0xf006, + 0xa438, 0xce03, 0xa438, 0xf004, 0xa438, 0xce03, 0xa438, 0xf002, + 0xa438, 0xce03, 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c07, 0xa438, 0x0c01, 0xa438, 0x0c3f, + 0xa438, 0x0d08, 0xa438, 0x9503, 0xa438, 0xa810, 0xa438, 0xa00a, + 0xa438, 0xa302, 0xa438, 0x0ca0, 0xa438, 0x0480, 0xa438, 0xd700, + 0xa438, 0x2969, 0xa438, 0x0960, 0xa438, 0x60a4, 0xa438, 0xd704, + 0xa438, 0x407d, 0xa438, 0x8604, 0xa438, 0xf002, 0xa438, 0xa604, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa340, 0xa438, 0xd700, + 0xa438, 0x37cd, 0xa438, 0x81b4, 0xa438, 0x8310, 0xa438, 0x9503, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd706, 0xa438, 0x5fa7, + 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, + 0xa438, 0x7fb4, 0xa438, 0x8810, 0xa438, 0x9920, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x60e5, 0xa438, 0x5f94, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd706, 0xa438, 0x5fa7, + 0xa438, 0xfff0, 0xa438, 0xb820, 0xa438, 0xa810, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, + 0xa438, 0xd700, 0xa438, 0x2d59, 0xa438, 0x8507, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8c07, 0xa438, 0x9503, 0xa438, 0xa120, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x81e3, 0xa438, 0x60e4, + 0xa438, 0xd704, 0xa438, 0x40bd, 0xa438, 0xd704, 0xa438, 0x407b, + 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xd700, + 0xa438, 0x2969, 0xa438, 0x81ec, 0xa438, 0x60a4, 0xa438, 0xd704, + 0xa438, 0x407d, 0xa438, 0xa202, 0xa438, 0xf002, 0xa438, 0x8202, + 0xa438, 0xa420, 0xa438, 0x1800, 0xa438, 0x861d, 0xa438, 0x8810, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fbb, + 0xa438, 0xd17a, 0xa438, 0xd05a, 0xa438, 0xd700, 0xa438, 0x60cf, + 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, 0xa438, 0x6157, + 0xa438, 0xf00b, 0xa438, 0xce06, 0xa438, 0xf00a, 0xa438, 0xce06, + 0xa438, 0xf008, 0xa438, 0xce06, 0xa438, 0xf006, 0xa438, 0xce06, + 0xa438, 0xf004, 0xa438, 0xce06, 0xa438, 0xf002, 0xa438, 0xce06, + 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x0c0f, 0xa438, 0x0b04, 0xa438, 0x0c3f, 0xa438, 0x0c21, + 0xa438, 0x8d07, 0xa438, 0x9503, 0xa438, 0xa340, 0xa438, 0x1000, + 0xa438, 0x1d47, 0xa438, 0xa110, 0xa438, 0x1000, 0xa438, 0x1cef, + 0xa438, 0x8110, 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xa304, + 0xa438, 0xa440, 0xa438, 0xa8c0, 0xa438, 0x8810, 0xa438, 0xa00a, + 0xa438, 0xa120, 0xa438, 0xa310, 0xa438, 0xd704, 0xa438, 0x405d, + 0xa438, 0xa308, 0xa438, 0x0cfc, 0xa438, 0x0224, 0xa438, 0x0ca0, + 0xa438, 0x0480, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa340, + 0xa438, 0xd700, 0xa438, 0x37cd, 0xa438, 0x8231, 0xa438, 0x8310, + 0xa438, 0x9503, 0xa438, 0xd162, 0xa438, 0xd048, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0x8840, + 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd706, 0xa438, 0x6127, + 0xa438, 0xd700, 0xa438, 0x5f3b, 0xa438, 0x88c0, 0xa438, 0x800a, + 0xa438, 0x8120, 0xa438, 0x8350, 0xa438, 0x84a0, 0xa438, 0xffad, + 0xa438, 0xb920, 0xa438, 0xcd33, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x6065, 0xa438, 0x5f94, + 0xa438, 0xffee, 0xa438, 0xb820, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0x800a, + 0xa438, 0x8120, 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0xa108, + 0xa438, 0x1000, 0xa438, 0x1cef, 0xa438, 0x8108, 0xa438, 0x1000, + 0xa438, 0x1d50, 0xa438, 0xd704, 0xa438, 0x60bd, 0xa438, 0xd707, + 0xa438, 0x413f, 0xa438, 0x4100, 0xa438, 0xf004, 0xa438, 0x0cfd, + 0xa438, 0x0201, 0xa438, 0xf005, 0xa438, 0x0cfc, 0xa438, 0x02bc, + 0xa438, 0xf002, 0xa438, 0xa2fc, 0xa438, 0xa304, 0xa438, 0x8880, + 0xa438, 0x0cc0, 0xa438, 0x0440, 0xa438, 0xcd34, 0xa438, 0xd704, + 0xa438, 0x407d, 0xa438, 0x405b, 0xa438, 0xf006, 0xa438, 0xd704, + 0xa438, 0x60fd, 0xa438, 0xd707, 0xa438, 0x40bf, 0xa438, 0x4080, + 0xa438, 0x8310, 0xa438, 0x1000, 0xa438, 0x1d15, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8c07, 0xa438, 0xd704, 0xa438, 0x409d, + 0xa438, 0x8b0f, 0xa438, 0x8c38, 0xa438, 0xf004, 0xa438, 0x0c0f, + 0xa438, 0x0b07, 0xa438, 0xac38, 0xa438, 0x0c38, 0xa438, 0x0d10, + 0xa438, 0x9503, 0xa438, 0xa810, 0xa438, 0xa00a, 0xa438, 0xa120, + 0xa438, 0xd704, 0xa438, 0x607d, 0xa438, 0xa4a0, 0xa438, 0xa604, + 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x829f, 0xa438, 0xd17a, + 0xa438, 0xd049, 0xa438, 0xf003, 0xa438, 0xd19f, 0xa438, 0xd049, + 0xa438, 0xd704, 0xa438, 0x413d, 0xa438, 0xa00a, 0xa438, 0xa120, + 0xa438, 0xd704, 0xa438, 0x407b, 0xa438, 0x8310, 0xa438, 0xf002, + 0xa438, 0xa310, 0xa438, 0xa403, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd71f, 0xa438, 0x6a14, 0xa438, 0xd700, 0xa438, 0x409a, + 0xa438, 0xd706, 0xa438, 0x4988, 0xa438, 0xf014, 0xa438, 0xd704, + 0xa438, 0x6055, 0xa438, 0xfff5, 0xa438, 0x1000, 0xa438, 0x1d47, + 0xa438, 0x800a, 0xa438, 0x8120, 0xa438, 0x8310, 0xa438, 0xa380, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd705, 0xa438, 0x5f77, 0xa438, 0x8380, 0xa438, 0x1000, + 0xa438, 0x1d50, 0xa438, 0xffdd, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8b0f, 0xa438, 0x8c38, 0xa438, 0x8d38, 0xa438, 0x9503, + 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x82d8, 0xa438, 0x33a9, + 0xa438, 0x82d5, 0xa438, 0xd1f4, 0xa438, 0xd04b, 0xa438, 0xf006, + 0xa438, 0xd1b7, 0xa438, 0xd04b, 0xa438, 0xf003, 0xa438, 0xd1c6, + 0xa438, 0xd04c, 0xa438, 0xd704, 0xa438, 0x413d, 0xa438, 0xa00a, + 0xa438, 0xa120, 0xa438, 0xd704, 0xa438, 0x407b, 0xa438, 0x8310, + 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa403, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x62f4, 0xa438, 0xd700, + 0xa438, 0x405a, 0xa438, 0xf01a, 0xa438, 0xd704, 0xa438, 0x6055, + 0xa438, 0xfff7, 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0x800a, + 0xa438, 0x8120, 0xa438, 0x8310, 0xa438, 0xa380, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd705, + 0xa438, 0x5f77, 0xa438, 0x8380, 0xa438, 0x1000, 0xa438, 0x1d50, + 0xa438, 0xffdf, 0xa438, 0x8403, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd700, 0xa438, 0x629c, 0xa438, 0xfffb, 0xa438, 0x8403, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x6096, + 0xa438, 0xd700, 0xa438, 0x619c, 0xa438, 0xfffa, 0xa438, 0xd706, + 0xa438, 0x4128, 0xa438, 0xd702, 0xa438, 0x60b0, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xae80, 0xa438, 0x9503, 0xa438, 0x1800, + 0xa438, 0x8431, 0xa438, 0xd17a, 0xa438, 0xd05a, 0xa438, 0xd700, + 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, + 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce06, 0xa438, 0xf00a, + 0xa438, 0xce06, 0xa438, 0xf008, 0xa438, 0xce06, 0xa438, 0xf006, + 0xa438, 0xce06, 0xa438, 0xf004, 0xa438, 0xce06, 0xa438, 0xf002, + 0xa438, 0xce06, 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c0f, 0xa438, 0x0b04, 0xa438, 0x0c3f, + 0xa438, 0x0c21, 0xa438, 0x8d07, 0xa438, 0x0cc3, 0xa438, 0x0b40, + 0xa438, 0x0c3f, 0xa438, 0x0c24, 0xa438, 0x8d07, 0xa438, 0x9503, + 0xa438, 0xa340, 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0xa110, + 0xa438, 0x1000, 0xa438, 0x1cef, 0xa438, 0x8110, 0xa438, 0x1000, + 0xa438, 0x1d50, 0xa438, 0xa304, 0xa438, 0xa440, 0xa438, 0xa8c0, + 0xa438, 0x8810, 0xa438, 0xa00a, 0xa438, 0xa120, 0xa438, 0xa310, + 0xa438, 0xd704, 0xa438, 0x405d, 0xa438, 0xa308, 0xa438, 0x0cfc, + 0xa438, 0x0224, 0xa438, 0x0ca0, 0xa438, 0x0480, 0xa438, 0x8604, + 0xa438, 0xcd35, 0xa438, 0xd162, 0xa438, 0xd048, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0x8840, + 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd706, 0xa438, 0x6127, + 0xa438, 0xd700, 0xa438, 0x5f3b, 0xa438, 0x88c0, 0xa438, 0x800a, + 0xa438, 0x8120, 0xa438, 0x8350, 0xa438, 0x84a0, 0xa438, 0xffae, + 0xa438, 0xbb80, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, + 0xa438, 0x5fb4, 0xa438, 0xb920, 0xa438, 0xcd36, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, + 0xa438, 0x9b80, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, + 0xa438, 0x6065, 0xa438, 0x5f94, 0xa438, 0xffe8, 0xa438, 0xb820, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x7fa5, + 0xa438, 0x9820, 0xa438, 0x800a, 0xa438, 0x8120, 0xa438, 0x1000, + 0xa438, 0x1d47, 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x1cef, + 0xa438, 0x8108, 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xd704, + 0xa438, 0x60bd, 0xa438, 0xd707, 0xa438, 0x413f, 0xa438, 0x4100, + 0xa438, 0xf004, 0xa438, 0x0cfd, 0xa438, 0x0201, 0xa438, 0xf005, + 0xa438, 0x0cfc, 0xa438, 0x02bc, 0xa438, 0xf002, 0xa438, 0xa2fc, + 0xa438, 0xa304, 0xa438, 0x8880, 0xa438, 0x0cc0, 0xa438, 0x0440, + 0xa438, 0xcd37, 0xa438, 0xd704, 0xa438, 0x407d, 0xa438, 0x405b, + 0xa438, 0xf006, 0xa438, 0xd704, 0xa438, 0x60fd, 0xa438, 0xd707, + 0xa438, 0x40bf, 0xa438, 0x4080, 0xa438, 0x8310, 0xa438, 0x1000, + 0xa438, 0x1d15, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8c07, + 0xa438, 0x0cc0, 0xa438, 0x0b00, 0xa438, 0xd704, 0xa438, 0x40bd, + 0xa438, 0x8b0f, 0xa438, 0x8c38, 0xa438, 0x8c3f, 0xa438, 0xf005, + 0xa438, 0x0c0f, 0xa438, 0x0b07, 0xa438, 0xac38, 0xa438, 0xac3f, + 0xa438, 0x0c38, 0xa438, 0x0d10, 0xa438, 0x0c38, 0xa438, 0x0d10, + 0xa438, 0x9503, 0xa438, 0xa810, 0xa438, 0xa00a, 0xa438, 0xa120, + 0xa438, 0xd704, 0xa438, 0x607d, 0xa438, 0xa4a0, 0xa438, 0xa604, + 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x83d0, 0xa438, 0x33a9, + 0xa438, 0x83cd, 0xa438, 0xd17a, 0xa438, 0xd048, 0xa438, 0xf006, + 0xa438, 0xd17a, 0xa438, 0xd048, 0xa438, 0xf003, 0xa438, 0xd17a, + 0xa438, 0xd048, 0xa438, 0xd704, 0xa438, 0x413d, 0xa438, 0xa00a, + 0xa438, 0xa120, 0xa438, 0xd704, 0xa438, 0x407b, 0xa438, 0x8310, + 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa403, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd700, + 0xa438, 0x409a, 0xa438, 0xd706, 0xa438, 0x4048, 0xa438, 0xf014, + 0xa438, 0xd704, 0xa438, 0x6055, 0xa438, 0xfff5, 0xa438, 0x1000, + 0xa438, 0x1d47, 0xa438, 0x800a, 0xa438, 0x8120, 0xa438, 0x8310, + 0xa438, 0xa380, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd705, 0xa438, 0x5f77, 0xa438, 0x8380, + 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xffdd, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8b0f, 0xa438, 0x8c38, 0xa438, 0x8d38, + 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x8409, + 0xa438, 0x33a9, 0xa438, 0x8406, 0xa438, 0xd13d, 0xa438, 0xd04b, + 0xa438, 0xf006, 0xa438, 0xd17a, 0xa438, 0xd04a, 0xa438, 0xf003, + 0xa438, 0xd189, 0xa438, 0xd04c, 0xa438, 0xd704, 0xa438, 0x413d, + 0xa438, 0xa00a, 0xa438, 0xa120, 0xa438, 0xd704, 0xa438, 0x407b, + 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa403, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd700, 0xa438, 0x409a, 0xa438, 0xd706, 0xa438, 0x4048, + 0xa438, 0xf014, 0xa438, 0xd704, 0xa438, 0x6055, 0xa438, 0xfff5, + 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0x800a, 0xa438, 0x8120, + 0xa438, 0x8310, 0xa438, 0xa380, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd705, 0xa438, 0x5f77, + 0xa438, 0x8380, 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xffdd, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c07, 0xa438, 0x0d01, + 0xa438, 0x0c03, 0xa438, 0x0b01, 0xa438, 0x0c07, 0xa438, 0x0d01, + 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x60cf, 0xa438, 0x60f1, + 0xa438, 0x6113, 0xa438, 0x6135, 0xa438, 0x6157, 0xa438, 0xf00b, + 0xa438, 0xce08, 0xa438, 0xf00a, 0xa438, 0xce08, 0xa438, 0xf008, + 0xa438, 0xce08, 0xa438, 0xf006, 0xa438, 0xce08, 0xa438, 0xf004, + 0xa438, 0xce08, 0xa438, 0xf002, 0xa438, 0xce08, 0xa438, 0x1000, + 0xa438, 0x1ce7, 0xa438, 0xa180, 0xa438, 0xcd38, 0xa438, 0xd700, + 0xa438, 0x37c9, 0xa438, 0x8465, 0xa438, 0x33a9, 0xa438, 0x845d, + 0xa438, 0xd702, 0xa438, 0x4098, 0xa438, 0xd17a, 0xa438, 0xd04a, + 0xa438, 0xf013, 0xa438, 0xd100, 0xa438, 0xd049, 0xa438, 0xf010, + 0xa438, 0xd702, 0xa438, 0x4098, 0xa438, 0xd1b7, 0xa438, 0xd049, + 0xa438, 0xf00b, 0xa438, 0xd100, 0xa438, 0xd048, 0xa438, 0xf008, + 0xa438, 0xd702, 0xa438, 0x4098, 0xa438, 0xd17a, 0xa438, 0xd04b, + 0xa438, 0xf003, 0xa438, 0xd199, 0xa438, 0xd04a, 0xa438, 0xd13b, + 0xa438, 0xd055, 0xa438, 0xd704, 0xa438, 0x413d, 0xa438, 0xa00a, + 0xa438, 0xa1a0, 0xa438, 0xd704, 0xa438, 0x407b, 0xa438, 0x8310, + 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa403, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd700, + 0xa438, 0x405b, 0xa438, 0xf014, 0xa438, 0xd704, 0xa438, 0x6055, + 0xa438, 0xfff7, 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0x800a, + 0xa438, 0x81a0, 0xa438, 0x8310, 0xa438, 0xa380, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd705, + 0xa438, 0x5f77, 0xa438, 0x8380, 0xa438, 0x1000, 0xa438, 0x1d50, + 0xa438, 0xffdf, 0xa438, 0xa302, 0xa438, 0xd704, 0xa438, 0x415d, + 0xa438, 0xa00a, 0xa438, 0xa1a0, 0xa438, 0xd704, 0xa438, 0x407b, + 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa302, + 0xa438, 0xa403, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x409a, 0xa438, 0xd706, + 0xa438, 0x4048, 0xa438, 0xf014, 0xa438, 0xd704, 0xa438, 0x6055, + 0xa438, 0xfff5, 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0x800a, + 0xa438, 0x81a0, 0xa438, 0x8312, 0xa438, 0xa380, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd705, + 0xa438, 0x5f77, 0xa438, 0x8380, 0xa438, 0x1000, 0xa438, 0x1d50, + 0xa438, 0xffdc, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c0f, + 0xa438, 0x0b02, 0xa438, 0x0c38, 0xa438, 0x0c10, 0xa438, 0x0c3f, + 0xa438, 0x0c12, 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x37c9, + 0xa438, 0x84d8, 0xa438, 0x33a9, 0xa438, 0x84d0, 0xa438, 0xd702, + 0xa438, 0x4098, 0xa438, 0xd199, 0xa438, 0xd04a, 0xa438, 0xf013, + 0xa438, 0xd100, 0xa438, 0xd04a, 0xa438, 0xf010, 0xa438, 0xd702, + 0xa438, 0x4098, 0xa438, 0xd17a, 0xa438, 0xd04a, 0xa438, 0xf00b, + 0xa438, 0xd100, 0xa438, 0xd048, 0xa438, 0xf008, 0xa438, 0xd702, + 0xa438, 0x4098, 0xa438, 0xd199, 0xa438, 0xd04b, 0xa438, 0xf003, + 0xa438, 0xd16b, 0xa438, 0xd04b, 0xa438, 0xd704, 0xa438, 0x415d, + 0xa438, 0xa00a, 0xa438, 0xa1a0, 0xa438, 0xd704, 0xa438, 0x407b, + 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa302, + 0xa438, 0xa403, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x40ba, 0xa438, 0xd706, + 0xa438, 0x406a, 0xa438, 0x8403, 0xa438, 0xf014, 0xa438, 0xd704, + 0xa438, 0x6055, 0xa438, 0xfff4, 0xa438, 0x1000, 0xa438, 0x1d47, + 0xa438, 0x800a, 0xa438, 0x81a0, 0xa438, 0x8312, 0xa438, 0xa380, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd705, 0xa438, 0x5f77, 0xa438, 0x8380, 0xa438, 0x1000, + 0xa438, 0x1d50, 0xa438, 0xffdb, 0xa438, 0x81a0, 0xa438, 0x8310, + 0xa438, 0xa302, 0xa438, 0xa00a, 0xa438, 0xa480, 0xa438, 0x8420, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x8517, 0xa438, 0x60e4, + 0xa438, 0xd700, 0xa438, 0x40a7, 0xa438, 0xd704, 0xa438, 0x407d, + 0xa438, 0x8604, 0xa438, 0xf002, 0xa438, 0xa604, 0xa438, 0xd700, + 0xa438, 0x60c7, 0xa438, 0xa602, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xa702, 0xa438, 0x9503, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xa340, 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x60cf, + 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, 0xa438, 0x6157, + 0xa438, 0xf00b, 0xa438, 0xce03, 0xa438, 0xf00a, 0xa438, 0xce03, + 0xa438, 0xf008, 0xa438, 0xce03, 0xa438, 0xf006, 0xa438, 0xce03, + 0xa438, 0xf004, 0xa438, 0xce03, 0xa438, 0xf002, 0xa438, 0xce03, + 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x0c07, 0xa438, 0x0c01, 0xa438, 0x0c3f, 0xa438, 0x0d08, + 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x646d, 0xa438, 0x37c9, + 0xa438, 0x8558, 0xa438, 0x33a9, 0xa438, 0x854e, 0xa438, 0xd700, + 0xa438, 0x40c7, 0xa438, 0xd702, 0xa438, 0x6098, 0xa438, 0xd100, + 0xa438, 0xd048, 0xa438, 0xf01a, 0xa438, 0xd17a, 0xa438, 0xd049, + 0xa438, 0xf017, 0xa438, 0xd700, 0xa438, 0x40c7, 0xa438, 0xd702, + 0xa438, 0x6098, 0xa438, 0xd100, 0xa438, 0xd049, 0xa438, 0xf010, + 0xa438, 0xd17a, 0xa438, 0xd04c, 0xa438, 0xf00d, 0xa438, 0xd700, + 0xa438, 0x40c7, 0xa438, 0xd702, 0xa438, 0x6098, 0xa438, 0xd17a, + 0xa438, 0xd04a, 0xa438, 0xf006, 0xa438, 0xd17a, 0xa438, 0xd04a, + 0xa438, 0xf003, 0xa438, 0xd17a, 0xa438, 0xd048, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd700, + 0xa438, 0x5f7a, 0xa438, 0xd706, 0xa438, 0x5f29, 0xa438, 0xd700, + 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, + 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce06, 0xa438, 0xf00a, + 0xa438, 0xce06, 0xa438, 0xf008, 0xa438, 0xce06, 0xa438, 0xf006, + 0xa438, 0xce06, 0xa438, 0xf004, 0xa438, 0xce06, 0xa438, 0xf002, + 0xa438, 0xce06, 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c0f, 0xa438, 0x0b01, 0xa438, 0x0c3f, + 0xa438, 0x0c08, 0xa438, 0x9503, 0xa438, 0xa120, 0xa438, 0xd700, + 0xa438, 0x2969, 0xa438, 0x859c, 0xa438, 0x6224, 0xa438, 0xd700, + 0xa438, 0x4147, 0xa438, 0xd704, 0xa438, 0x409d, 0xa438, 0xd704, + 0xa438, 0x613b, 0xa438, 0xf00a, 0xa438, 0xd707, 0xa438, 0x411f, + 0xa438, 0x40e0, 0xa438, 0xf004, 0xa438, 0xd707, 0xa438, 0x409f, + 0xa438, 0x4062, 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x85a7, 0xa438, 0x60e4, + 0xa438, 0xd700, 0xa438, 0x40a7, 0xa438, 0xd704, 0xa438, 0x407d, + 0xa438, 0xa202, 0xa438, 0xf002, 0xa438, 0x8202, 0xa438, 0xa420, + 0xa438, 0xcd3b, 0xa438, 0xd700, 0xa438, 0x65ad, 0xa438, 0x43c7, + 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x85c2, 0xa438, 0x33a9, + 0xa438, 0x85ba, 0xa438, 0xd702, 0xa438, 0x4098, 0xa438, 0xd199, + 0xa438, 0xd04c, 0xa438, 0xf024, 0xa438, 0xd13d, 0xa438, 0xd04a, + 0xa438, 0xf021, 0xa438, 0xd702, 0xa438, 0x4098, 0xa438, 0xd1c6, + 0xa438, 0xd04c, 0xa438, 0xf01c, 0xa438, 0xd15c, 0xa438, 0xd04a, + 0xa438, 0xf019, 0xa438, 0xd702, 0xa438, 0x4098, 0xa438, 0xd199, + 0xa438, 0xd04c, 0xa438, 0xf014, 0xa438, 0xd17a, 0xa438, 0xd04c, + 0xa438, 0xf011, 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x85d5, + 0xa438, 0x33a9, 0xa438, 0x85d2, 0xa438, 0xd1e5, 0xa438, 0xd04c, + 0xa438, 0xf009, 0xa438, 0xd191, 0xa438, 0xd04d, 0xa438, 0xf006, + 0xa438, 0xd17a, 0xa438, 0xd04d, 0xa438, 0xf003, 0xa438, 0xd16b, + 0xa438, 0xd04c, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x5f7a, 0xa438, 0xd706, + 0xa438, 0x5f2c, 0xa438, 0xd700, 0xa438, 0x40e7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c07, 0xa438, 0x0d01, 0xa438, 0x9503, + 0xa438, 0xf006, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c07, + 0xa438, 0x0d02, 0xa438, 0x9503, 0xa438, 0xcd3c, 0xa438, 0xd700, + 0xa438, 0x644d, 0xa438, 0x43c7, 0xa438, 0xd700, 0xa438, 0x37c9, + 0xa438, 0x8608, 0xa438, 0x33a9, 0xa438, 0x8600, 0xa438, 0xd702, + 0xa438, 0x4098, 0xa438, 0xd17a, 0xa438, 0xd04a, 0xa438, 0xf019, + 0xa438, 0xd17a, 0xa438, 0xd048, 0xa438, 0xf016, 0xa438, 0xd702, + 0xa438, 0x4098, 0xa438, 0xd17a, 0xa438, 0xd04b, 0xa438, 0xf011, + 0xa438, 0xd17a, 0xa438, 0xd048, 0xa438, 0xf00e, 0xa438, 0xd702, + 0xa438, 0x4098, 0xa438, 0xd17a, 0xa438, 0xd04a, 0xa438, 0xf009, + 0xa438, 0xd17a, 0xa438, 0xd049, 0xa438, 0xf006, 0xa438, 0xd17a, + 0xa438, 0xd04b, 0xa438, 0xf003, 0xa438, 0xd17a, 0xa438, 0xd048, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd700, 0xa438, 0x5f7a, 0xa438, 0xd706, 0xa438, 0x5f2d, + 0xa438, 0xd700, 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, + 0xa438, 0x6135, 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce08, + 0xa438, 0xf00a, 0xa438, 0xce08, 0xa438, 0xf008, 0xa438, 0xce08, + 0xa438, 0xf006, 0xa438, 0xce08, 0xa438, 0xf004, 0xa438, 0xce08, + 0xa438, 0xf002, 0xa438, 0xce08, 0xa438, 0x1000, 0xa438, 0x1ce7, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c0f, 0xa438, 0x0b02, + 0xa438, 0x0c38, 0xa438, 0x0c10, 0xa438, 0x9503, 0xa438, 0xa180, + 0xa438, 0xcd3d, 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x865f, + 0xa438, 0x37c9, 0xa438, 0x8655, 0xa438, 0x33a9, 0xa438, 0x864b, + 0xa438, 0xd700, 0xa438, 0x40c7, 0xa438, 0xd702, 0xa438, 0x6098, + 0xa438, 0xd11f, 0xa438, 0xd04a, 0xa438, 0xf01a, 0xa438, 0xd199, + 0xa438, 0xd04b, 0xa438, 0xf017, 0xa438, 0xd700, 0xa438, 0x40c7, + 0xa438, 0xd702, 0xa438, 0x6098, 0xa438, 0xd11f, 0xa438, 0xd04a, + 0xa438, 0xf010, 0xa438, 0xd199, 0xa438, 0xd04b, 0xa438, 0xf00d, + 0xa438, 0xd700, 0xa438, 0x40c7, 0xa438, 0xd702, 0xa438, 0x6098, + 0xa438, 0xd17a, 0xa438, 0xd04c, 0xa438, 0xf006, 0xa438, 0xd199, + 0xa438, 0xd04c, 0xa438, 0xf003, 0xa438, 0xd17a, 0xa438, 0xd04b, + 0xa438, 0x1800, 0xa438, 0x0e04, 0xa438, 0xd700, 0xa438, 0x37c9, + 0xa438, 0x8678, 0xa438, 0x33a9, 0xa438, 0x8670, 0xa438, 0xd705, + 0xa438, 0x4084, 0xa438, 0xd1f4, 0xa438, 0xd048, 0xa438, 0xf013, + 0xa438, 0xd1b7, 0xa438, 0xd04b, 0xa438, 0xf010, 0xa438, 0xd705, + 0xa438, 0x4084, 0xa438, 0xd1f4, 0xa438, 0xd048, 0xa438, 0xf00b, + 0xa438, 0xd1b7, 0xa438, 0xd04b, 0xa438, 0xf008, 0xa438, 0xd705, + 0xa438, 0x4084, 0xa438, 0xd1f4, 0xa438, 0xd048, 0xa438, 0xf003, + 0xa438, 0xd1b7, 0xa438, 0xd04b, 0xa438, 0x1800, 0xa438, 0x14cc, + 0xa438, 0xd700, 0xa438, 0x2b59, 0xa438, 0x8685, 0xa438, 0xf003, + 0xa438, 0x1800, 0xa438, 0x118f, 0xa438, 0x6060, 0xa438, 0x1800, + 0xa438, 0x1167, 0xa438, 0xd700, 0xa438, 0x60c7, 0xa438, 0xd704, + 0xa438, 0x609f, 0xa438, 0xd705, 0xa438, 0x4043, 0xa438, 0xf003, + 0xa438, 0x1800, 0xa438, 0x1150, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8702, 0xa438, 0x8011, 0xa438, 0x9503, 0xa438, 0x800a, + 0xa438, 0x81a0, 0xa438, 0x8302, 0xa438, 0x8480, 0xa438, 0x8686, + 0xa438, 0xcde0, 0xa438, 0xd1ff, 0xa438, 0xd049, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd705, + 0xa438, 0x417e, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa011, + 0xa438, 0x9503, 0xa438, 0xd1c8, 0xa438, 0xd045, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa702, 0xa438, 0x9503, 0xa438, 0xa00a, + 0xa438, 0xa1a0, 0xa438, 0xa480, 0xa438, 0xa686, 0xa438, 0xd705, + 0xa438, 0x605e, 0xa438, 0xa302, 0xa438, 0x9503, 0xa438, 0xd700, + 0xa438, 0x37c9, 0xa438, 0x86c9, 0xa438, 0x33a9, 0xa438, 0x86c5, + 0xa438, 0xd178, 0xa438, 0xd04b, 0xa438, 0x1800, 0xa438, 0x115d, + 0xa438, 0xd1c8, 0xa438, 0xd04b, 0xa438, 0x1800, 0xa438, 0x115d, + 0xa438, 0xd1e6, 0xa438, 0xd04b, 0xa438, 0x1800, 0xa438, 0x115d, + 0xa438, 0xd71f, 0xa438, 0x6080, 0xa438, 0xd704, 0xa438, 0x1800, + 0xa438, 0x1bc0, 0xa438, 0x1800, 0xa438, 0x1bc4, 0xa438, 0x4134, + 0xa438, 0xd115, 0xa438, 0xd04f, 0xa438, 0x1000, 0xa438, 0x1d0b, + 0xa438, 0x1000, 0xa438, 0x893a, 0xa438, 0x1800, 0xa438, 0x01f2, + 0xa438, 0x1000, 0xa438, 0x1d0b, 0xa438, 0x1000, 0xa438, 0x893a, + 0xa438, 0x1800, 0xa438, 0x01f9, 0xa438, 0x2969, 0xa438, 0x86e9, + 0xa438, 0xd700, 0xa438, 0x606b, 0xa438, 0xd701, 0xa438, 0x60b4, + 0xa438, 0x1000, 0xa438, 0x893a, 0xa438, 0x1800, 0xa438, 0x0551, + 0xa438, 0xd196, 0xa438, 0xd04d, 0xa438, 0x1000, 0xa438, 0x893a, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, + 0xa438, 0x8802, 0xa438, 0xcd22, 0xa438, 0xd17a, 0xa438, 0xd05a, + 0xa438, 0xa501, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd701, + 0xa438, 0x5fbd, 0xa438, 0x8501, 0xa438, 0xa502, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd702, 0xa438, 0x5fbe, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8380, 0xa438, 0x9503, 0xa438, 0xd403, + 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0x8502, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8a80, 0xa438, 0x9503, 0xa438, 0xd40c, + 0xa438, 0x1000, 0xa438, 0x1cc8, 0xa438, 0xd707, 0xa438, 0x428f, + 0xa438, 0xd700, 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, + 0xa438, 0x6135, 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce06, + 0xa438, 0xf01d, 0xa438, 0xce06, 0xa438, 0xf01b, 0xa438, 0xce06, + 0xa438, 0xf019, 0xa438, 0xce06, 0xa438, 0xf017, 0xa438, 0xce06, + 0xa438, 0xf015, 0xa438, 0xce06, 0xa438, 0xf013, 0xa438, 0xd700, + 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, + 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce02, 0xa438, 0xf00a, + 0xa438, 0xce02, 0xa438, 0xf008, 0xa438, 0xce01, 0xa438, 0xf006, + 0xa438, 0xce01, 0xa438, 0xf004, 0xa438, 0xce01, 0xa438, 0xf002, + 0xa438, 0xce01, 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0xa340, + 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0xa110, 0xa438, 0x1000, + 0xa438, 0x1cef, 0xa438, 0x8110, 0xa438, 0x1000, 0xa438, 0x1d50, + 0xa438, 0xa304, 0xa438, 0xa440, 0xa438, 0xa8c0, 0xa438, 0xd707, + 0xa438, 0x40cf, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8d07, + 0xa438, 0x9503, 0xa438, 0xa00a, 0xa438, 0xa120, 0xa438, 0xa310, + 0xa438, 0x0ca0, 0xa438, 0x0480, 0xa438, 0xd700, 0xa438, 0x2969, + 0xa438, 0x05b7, 0xa438, 0x60a4, 0xa438, 0xd704, 0xa438, 0x407d, + 0xa438, 0xa308, 0xa438, 0xf002, 0xa438, 0x8308, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c60, 0xa438, 0x0340, 0xa438, 0x9503, + 0xa438, 0xcd23, 0xa438, 0xd162, 0xa438, 0xd048, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0x8840, + 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd706, 0xa438, 0x6327, + 0xa438, 0xd700, 0xa438, 0x5f3b, 0xa438, 0x88c0, 0xa438, 0x800a, + 0xa438, 0x8120, 0xa438, 0x8358, 0xa438, 0x8308, 0xa438, 0x84a0, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8360, 0xa438, 0x9503, + 0xa438, 0xd707, 0xa438, 0x2f7d, 0xa438, 0x86f7, 0xa438, 0xd17a, + 0xa438, 0xd05a, 0xa438, 0xa501, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd701, 0xa438, 0x5fbd, 0xa438, 0x8501, 0xa438, 0xff8b, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x5fb4, + 0xa438, 0xb920, 0xa438, 0xcd24, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0x9a20, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x6065, + 0xa438, 0x5f94, 0xa438, 0xffd9, 0xa438, 0xb820, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, + 0xa438, 0x800a, 0xa438, 0x8120, 0xa438, 0x1000, 0xa438, 0x1d47, + 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x1cef, 0xa438, 0x8108, + 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xd700, 0xa438, 0x2969, + 0xa438, 0x87b8, 0xa438, 0x6144, 0xa438, 0xd704, 0xa438, 0x60bd, + 0xa438, 0xd707, 0xa438, 0x417f, 0xa438, 0x4140, 0xa438, 0xf006, + 0xa438, 0x82fc, 0xa438, 0xa201, 0xa438, 0xf007, 0xa438, 0xa2fc, + 0xa438, 0xf005, 0xa438, 0x0cfc, 0xa438, 0x02bc, 0xa438, 0xf002, + 0xa438, 0xa2fc, 0xa438, 0xa304, 0xa438, 0x8880, 0xa438, 0x0cc0, + 0xa438, 0x0440, 0xa438, 0xcd25, 0xa438, 0xd700, 0xa438, 0x2969, + 0xa438, 0x87d7, 0xa438, 0x6224, 0xa438, 0xd704, 0xa438, 0x605d, + 0xa438, 0xf004, 0xa438, 0xd704, 0xa438, 0x613b, 0xa438, 0xf00b, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x87d7, 0xa438, 0x60eb, + 0xa438, 0xd707, 0xa438, 0x40bf, 0xa438, 0x4080, 0xa438, 0x8310, + 0xa438, 0x1000, 0xa438, 0x1d15, 0xa438, 0xd700, 0xa438, 0x60cf, + 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, 0xa438, 0x6157, + 0xa438, 0xf00b, 0xa438, 0xce06, 0xa438, 0xf00a, 0xa438, 0xce06, + 0xa438, 0xf008, 0xa438, 0xce06, 0xa438, 0xf006, 0xa438, 0xce06, + 0xa438, 0xf004, 0xa438, 0xce06, 0xa438, 0xf002, 0xa438, 0xce06, + 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8c07, 0xa438, 0x0c07, 0xa438, 0x0d03, 0xa438, 0xd700, + 0xa438, 0x2969, 0xa438, 0x87f9, 0xa438, 0x60c4, 0xa438, 0xd704, + 0xa438, 0x409d, 0xa438, 0x8b0f, 0xa438, 0x8c38, 0xa438, 0xf003, + 0xa438, 0xab07, 0xa438, 0xac38, 0xa438, 0x0c07, 0xa438, 0x0d03, + 0xa438, 0x9503, 0xa438, 0xa810, 0xa438, 0xa00a, 0xa438, 0xa120, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x8807, 0xa438, 0x6064, + 0xa438, 0xd704, 0xa438, 0x607d, 0xa438, 0xa4a0, 0xa438, 0xa605, + 0xa438, 0xd17a, 0xa438, 0xd049, 0xa438, 0xd700, 0xa438, 0x2969, + 0xa438, 0x8819, 0xa438, 0x6164, 0xa438, 0xd704, 0xa438, 0x413d, + 0xa438, 0xa00a, 0xa438, 0xa120, 0xa438, 0xd704, 0xa438, 0x407b, + 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, 0xa438, 0xa403, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd700, 0xa438, 0x409a, 0xa438, 0xd706, 0xa438, 0x4046, + 0xa438, 0xf014, 0xa438, 0xd704, 0xa438, 0x6055, 0xa438, 0xfff5, + 0xa438, 0x1000, 0xa438, 0x1d47, 0xa438, 0x800a, 0xa438, 0x8120, + 0xa438, 0x8310, 0xa438, 0xa380, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd705, 0xa438, 0x5f77, + 0xa438, 0x8380, 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xffdd, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8b0f, 0xa438, 0x8c38, + 0xa438, 0x8d38, 0xa438, 0x9503, 0xa438, 0xcd26, 0xa438, 0xd704, + 0xa438, 0x63d1, 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x8858, + 0xa438, 0x37c9, 0xa438, 0x8855, 0xa438, 0x33a9, 0xa438, 0x884d, + 0xa438, 0xd705, 0xa438, 0x6084, 0xa438, 0xd18a, 0xa438, 0xd04b, + 0xa438, 0xf014, 0xa438, 0xd14c, 0xa438, 0xd04b, 0xa438, 0xf011, + 0xa438, 0xd705, 0xa438, 0x6084, 0xa438, 0xd17a, 0xa438, 0xd04b, + 0xa438, 0xf00c, 0xa438, 0xd15c, 0xa438, 0xd04b, 0xa438, 0xf009, + 0xa438, 0xd1c6, 0xa438, 0xd04b, 0xa438, 0xf006, 0xa438, 0xd1b7, + 0xa438, 0xd04a, 0xa438, 0xf003, 0xa438, 0xd1c4, 0xa438, 0xd046, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x886b, 0xa438, 0x6164, + 0xa438, 0xd704, 0xa438, 0x413d, 0xa438, 0xa00a, 0xa438, 0xa120, + 0xa438, 0xd704, 0xa438, 0x407b, 0xa438, 0x8310, 0xa438, 0xf002, + 0xa438, 0xa310, 0xa438, 0xa403, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x409a, + 0xa438, 0xd706, 0xa438, 0x4048, 0xa438, 0xf014, 0xa438, 0xd704, + 0xa438, 0x6055, 0xa438, 0xfff5, 0xa438, 0x1000, 0xa438, 0x1d47, + 0xa438, 0x800a, 0xa438, 0x8120, 0xa438, 0x8310, 0xa438, 0xa380, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, + 0xa438, 0xd705, 0xa438, 0x5f77, 0xa438, 0x8380, 0xa438, 0x1000, + 0xa438, 0x1d50, 0xa438, 0xffdd, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x0c07, 0xa438, 0x0d01, 0xa438, 0x9503, 0xa438, 0xd700, + 0xa438, 0x60cf, 0xa438, 0x60f1, 0xa438, 0x6113, 0xa438, 0x6135, + 0xa438, 0x6157, 0xa438, 0xf00b, 0xa438, 0xce08, 0xa438, 0xf00a, + 0xa438, 0xce08, 0xa438, 0xf008, 0xa438, 0xce08, 0xa438, 0xf006, + 0xa438, 0xce08, 0xa438, 0xf004, 0xa438, 0xce08, 0xa438, 0xf002, + 0xa438, 0xce08, 0xa438, 0x1000, 0xa438, 0x1ce7, 0xa438, 0xa180, + 0xa438, 0xcd27, 0xa438, 0xd704, 0xa438, 0x6331, 0xa438, 0xd700, + 0xa438, 0x37c9, 0xa438, 0x88b9, 0xa438, 0x33a9, 0xa438, 0x88b1, + 0xa438, 0xd705, 0xa438, 0x6084, 0xa438, 0xd17a, 0xa438, 0xd04a, + 0xa438, 0xf011, 0xa438, 0xd13d, 0xa438, 0xd04a, 0xa438, 0xf00e, + 0xa438, 0xd705, 0xa438, 0x6084, 0xa438, 0xd1b7, 0xa438, 0xd049, + 0xa438, 0xf009, 0xa438, 0xd17a, 0xa438, 0xd049, 0xa438, 0xf006, + 0xa438, 0xd17a, 0xa438, 0xd04a, 0xa438, 0xf003, 0xa438, 0xd128, + 0xa438, 0xd044, 0xa438, 0xd13b, 0xa438, 0xd055, 0xa438, 0xd700, + 0xa438, 0x2969, 0xa438, 0x88ce, 0xa438, 0x6164, 0xa438, 0xd704, + 0xa438, 0x413d, 0xa438, 0xa00a, 0xa438, 0xa1a0, 0xa438, 0xd704, + 0xa438, 0x407b, 0xa438, 0x8310, 0xa438, 0xf002, 0xa438, 0xa310, + 0xa438, 0xa403, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd700, 0xa438, 0x405b, 0xa438, 0xf014, + 0xa438, 0xd704, 0xa438, 0x6055, 0xa438, 0xfff7, 0xa438, 0x1000, + 0xa438, 0x1d47, 0xa438, 0x800a, 0xa438, 0x81a0, 0xa438, 0x8310, + 0xa438, 0xa380, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd705, 0xa438, 0x5f77, 0xa438, 0x8380, + 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xffdf, 0xa438, 0xa302, + 0xa438, 0xd700, 0xa438, 0x2969, 0xa438, 0x0740, 0xa438, 0x6184, + 0xa438, 0xd704, 0xa438, 0x415d, 0xa438, 0xa00a, 0xa438, 0xa1a0, + 0xa438, 0xd704, 0xa438, 0x407b, 0xa438, 0x8310, 0xa438, 0xf002, + 0xa438, 0xa310, 0xa438, 0xa302, 0xa438, 0xa403, 0xa438, 0x1000, + 0xa438, 0x1cd2, 0xa438, 0x1000, 0xa438, 0x1d2b, 0xa438, 0xd700, + 0xa438, 0x409a, 0xa438, 0xd706, 0xa438, 0x4048, 0xa438, 0xf014, + 0xa438, 0xd704, 0xa438, 0x6055, 0xa438, 0xfff5, 0xa438, 0x1000, + 0xa438, 0x1d47, 0xa438, 0x800a, 0xa438, 0x81a0, 0xa438, 0x8312, + 0xa438, 0xa380, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0x1000, + 0xa438, 0x1d2b, 0xa438, 0xd705, 0xa438, 0x5f77, 0xa438, 0x8380, + 0xa438, 0x1000, 0xa438, 0x1d50, 0xa438, 0xffdc, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c0f, 0xa438, 0x0b02, 0xa438, 0x0c38, + 0xa438, 0x0c10, 0xa438, 0x9503, 0xa438, 0xcd28, 0xa438, 0xd704, + 0xa438, 0x6331, 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x8933, + 0xa438, 0x33a9, 0xa438, 0x892b, 0xa438, 0xd705, 0xa438, 0x6084, + 0xa438, 0xd199, 0xa438, 0xd04a, 0xa438, 0xf011, 0xa438, 0xd13d, + 0xa438, 0xd04a, 0xa438, 0xf00e, 0xa438, 0xd705, 0xa438, 0x6084, + 0xa438, 0xd17a, 0xa438, 0xd04a, 0xa438, 0xf009, 0xa438, 0xd13d, + 0xa438, 0xd04a, 0xa438, 0xf006, 0xa438, 0xd199, 0xa438, 0xd04a, + 0xa438, 0xf003, 0xa438, 0xd128, 0xa438, 0xd044, 0xa438, 0x1800, + 0xa438, 0x0776, 0xa438, 0xd208, 0xa438, 0x0c09, 0xa438, 0x1301, + 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd701, 0xa438, 0x5fa3, + 0xa438, 0xb302, 0xa438, 0xd200, 0xa438, 0x0800, 0xa438, 0xd705, + 0xa438, 0x6064, 0xa438, 0x1800, 0xa438, 0x140a, 0xa438, 0x8810, + 0xa438, 0xd199, 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x1cd2, + 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0x1800, 0xa438, 0x140a, + 0xa438, 0x8910, 0xa438, 0xd704, 0xa438, 0x61a8, 0xa438, 0x8480, + 0xa438, 0x8604, 0xa438, 0x8302, 0xa438, 0x81a0, 0xa438, 0xd703, + 0xa438, 0x4112, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa990, + 0xa438, 0x9503, 0xa438, 0xb904, 0xa438, 0xf002, 0xa438, 0x0000, + 0xa438, 0x0800, 0xa436, 0xA10E, 0xa438, 0x1de8, 0xa436, 0xA10C, + 0xa438, 0x1352, 0xa436, 0xA10A, 0xa438, 0x0545, 0xa436, 0xA108, + 0xa438, 0x01ed, 0xa436, 0xA106, 0xa438, 0x1bbf, 0xa436, 0xA104, + 0xa438, 0x114b, 0xa436, 0xA102, 0xa438, 0x14bf, 0xa436, 0xA100, + 0xa438, 0x07ce, 0xa436, 0xA110, 0xa438, 0x00ff, 0xa436, 0xA016, + 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x1ff8, 0xa436, 0xA014, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa436, 0xA164, 0xa438, 0x143d, 0xa436, 0xA166, 0xa438, 0x14d7, + 0xa436, 0xA168, 0xa438, 0x3fff, 0xa436, 0xA16A, 0xa438, 0x3fff, + 0xa436, 0xA16C, 0xa438, 0x3fff, 0xa436, 0xA16E, 0xa438, 0x3fff, + 0xa436, 0xA170, 0xa438, 0x3fff, 0xa436, 0xA172, 0xa438, 0x3fff, + 0xa436, 0xA162, 0xa438, 0x0003, 0xa436, 0xb87c, 0xa438, 0x8994, + 0xa436, 0xb87e, 0xa438, 0xaf89, 0xa438, 0xacaf, 0xa438, 0x89e8, + 0xa438, 0xaf89, 0xa438, 0xf0af, 0xa438, 0x8a08, 0xa438, 0xaf8a, + 0xa438, 0x32af, 0xa438, 0x8a4e, 0xa438, 0xaf8d, 0xa438, 0x44af, + 0xa438, 0x8de9, 0xa438, 0x1f55, 0xa438, 0xe18f, 0xa438, 0xe3a1, + 0xa438, 0x000b, 0xa438, 0xee8f, 0xa438, 0xd700, 0xa438, 0xee86, + 0xa438, 0xe900, 0xa438, 0xaf4f, 0xa438, 0x9ead, 0xa438, 0x281b, + 0xa438, 0xe18f, 0xa438, 0xfcef, 0xa438, 0x71bf, 0xa438, 0x74f6, + 0xa438, 0x027e, 0xa438, 0xd2ef, 0xa438, 0x641c, 0xa438, 0x670d, + 0xa438, 0x67ef, 0xa438, 0x461f, 0xa438, 0x00bf, 0xa438, 0x74f6, + 0xa438, 0x027e, 0xa438, 0xdee1, 0xa438, 0x8fe3, 0xa438, 0x0d11, + 0xa438, 0xe58f, 0xa438, 0xe313, 0xa438, 0xaec6, 0xa438, 0x028d, + 0xa438, 0xfbd3, 0xa438, 0x01af, 0xa438, 0x40d1, 0xa438, 0xbf7a, + 0xa438, 0x6102, 0xa438, 0x7d44, 0xa438, 0xa100, 0xa438, 0x09e0, + 0xa438, 0x8ffa, 0xa438, 0xe18f, 0xa438, 0xfbaf, 0xa438, 0x683d, + 0xa438, 0x027f, 0xa438, 0xa9af, 0xa438, 0x682c, 0xa438, 0xbf8e, + 0xa438, 0x6b02, 0xa438, 0x7d44, 0xa438, 0xe58f, 0xa438, 0xecbf, + 0xa438, 0x74cc, 0xa438, 0x027d, 0xa438, 0x44e3, 0xa438, 0x8fed, + 0xa438, 0x0d31, 0xa438, 0xf63f, 0xa438, 0x0d11, 0xa438, 0xf62f, + 0xa438, 0x1b13, 0xa438, 0xad2f, 0xa438, 0x06bf, 0xa438, 0x8e6b, + 0xa438, 0x027c, 0xa438, 0xf9d1, 0xa438, 0x01af, 0xa438, 0x5974, + 0xa438, 0xee88, 0xa438, 0x8600, 0xa438, 0xe08f, 0xa438, 0xebad, + 0xa438, 0x200b, 0xa438, 0xe18f, 0xa438, 0xecbf, 0xa438, 0x8e6b, + 0xa438, 0x027d, 0xa438, 0x25ae, 0xa438, 0x04ee, 0xa438, 0x8feb, + 0xa438, 0x01af, 0xa438, 0x5945, 0xa438, 0xad28, 0xa438, 0x2ce0, + 0xa438, 0x8fea, 0xa438, 0xa000, 0xa438, 0x0502, 0xa438, 0x8af4, + 0xa438, 0xae1e, 0xa438, 0xa001, 0xa438, 0x0502, 0xa438, 0x8ba3, + 0xa438, 0xae16, 0xa438, 0xa002, 0xa438, 0x0502, 0xa438, 0x8c13, + 0xa438, 0xae0e, 0xa438, 0xa003, 0xa438, 0x0502, 0xa438, 0x8c9f, + 0xa438, 0xae06, 0xa438, 0xa004, 0xa438, 0x0302, 0xa438, 0x8d1b, + 0xa438, 0xaf63, 0xa438, 0x8902, 0xa438, 0x8a83, 0xa438, 0xaf63, + 0xa438, 0x81f8, 0xa438, 0xef49, 0xa438, 0xf8e0, 0xa438, 0x8015, + 0xa438, 0xad21, 0xa438, 0x19bf, 0xa438, 0x7bd8, 0xa438, 0x027c, + 0xa438, 0xf9bf, 0xa438, 0x7bf3, 0xa438, 0x027d, 0xa438, 0x44bf, + 0xa438, 0x7bf6, 0xa438, 0x027c, 0xa438, 0xf902, 0xa438, 0x638e, + 0xa438, 0xee8f, 0xa438, 0xea00, 0xa438, 0xe080, 0xa438, 0x16ad, + 0xa438, 0x233d, 0xa438, 0xbf7b, 0xa438, 0xf302, 0xa438, 0x7d44, + 0xa438, 0xbf7a, 0xa438, 0x9402, 0xa438, 0x7cf9, 0xa438, 0xbf8e, + 0xa438, 0x6e02, 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa602, + 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa302, 0xa438, 0x7cf9, + 0xa438, 0xbf7a, 0xa438, 0xa902, 0xa438, 0x7cf9, 0xa438, 0xbf7a, + 0xa438, 0xac02, 0xa438, 0x7cf9, 0xa438, 0xbf8e, 0xa438, 0x7102, + 0xa438, 0x7cf9, 0xa438, 0xbf8e, 0xa438, 0x7402, 0xa438, 0x7cf9, + 0xa438, 0x0263, 0xa438, 0x8eee, 0xa438, 0x8fea, 0xa438, 0x00bf, + 0xa438, 0x7c02, 0xa438, 0x027c, 0xa438, 0xf9fc, 0xa438, 0xef94, + 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xfbef, 0xa438, 0x79fb, + 0xa438, 0xe080, 0xa438, 0x15ac, 0xa438, 0x2103, 0xa438, 0xaf8b, + 0xa438, 0x74ee, 0xa438, 0x8888, 0xa438, 0x00ee, 0xa438, 0x888a, + 0xa438, 0x00ee, 0xa438, 0x888b, 0xa438, 0x00bf, 0xa438, 0x7bd8, + 0xa438, 0x027d, 0xa438, 0x02bf, 0xa438, 0x6000, 0xa438, 0xd788, + 0xa438, 0x881f, 0xa438, 0x44d4, 0xa438, 0x000c, 0xa438, 0x0273, + 0xa438, 0x3b02, 0xa438, 0x7fa9, 0xa438, 0xac28, 0xa438, 0x05ac, + 0xa438, 0x290d, 0xa438, 0xae18, 0xa438, 0xe188, 0xa438, 0x98bf, + 0xa438, 0x7be1, 0xa438, 0x027d, 0xa438, 0x25ae, 0xa438, 0x18e1, + 0xa438, 0x8898, 0xa438, 0x0d11, 0xa438, 0xbf7b, 0xa438, 0xe102, + 0xa438, 0x7d25, 0xa438, 0xae0b, 0xa438, 0xe188, 0xa438, 0x980d, + 0xa438, 0x12bf, 0xa438, 0x7be1, 0xa438, 0x027d, 0xa438, 0x25bf, + 0xa438, 0x88a0, 0xa438, 0xda19, 0xa438, 0xdb19, 0xa438, 0xd819, + 0xa438, 0xd91f, 0xa438, 0x77bf, 0xa438, 0x88b1, 0xa438, 0xde19, + 0xa438, 0xdf19, 0xa438, 0xdc19, 0xa438, 0xdd19, 0xa438, 0x17a7, + 0xa438, 0x0004, 0xa438, 0xf302, 0xa438, 0x63cd, 0xa438, 0xee8f, + 0xa438, 0xea01, 0xa438, 0xe080, 0xa438, 0x16ad, 0xa438, 0x2319, + 0xa438, 0xee88, 0xa438, 0x8800, 0xa438, 0xee88, 0xa438, 0x8a00, + 0xa438, 0xee88, 0xa438, 0x8b00, 0xa438, 0xbf8e, 0xa438, 0x6e02, + 0xa438, 0x7d02, 0xa438, 0x0263, 0xa438, 0xcdee, 0xa438, 0x8fea, + 0xa438, 0x0102, 0xa438, 0x70de, 0xa438, 0xbf7c, 0xa438, 0x0202, + 0xa438, 0x7d02, 0xa438, 0xffef, 0xa438, 0x97ff, 0xa438, 0xfdfc, + 0xa438, 0x04f8, 0xa438, 0xf9fa, 0xa438, 0xef69, 0xa438, 0xfae0, + 0xa438, 0x888a, 0xa438, 0xe188, 0xa438, 0x8b14, 0xa438, 0xe488, + 0xa438, 0x8ae5, 0xa438, 0x888b, 0xa438, 0xbf88, 0xa438, 0x94d8, + 0xa438, 0x19d9, 0xa438, 0xef64, 0xa438, 0xe088, 0xa438, 0x8ae1, + 0xa438, 0x888b, 0xa438, 0x1b46, 0xa438, 0x9f30, 0xa438, 0x1f44, + 0xa438, 0xe488, 0xa438, 0x8ae5, 0xa438, 0x888b, 0xa438, 0xe080, + 0xa438, 0x15ad, 0xa438, 0x211a, 0xa438, 0x0260, 0xa438, 0xece0, + 0xa438, 0x8016, 0xa438, 0xad23, 0xa438, 0x1602, 0xa438, 0x7c86, + 0xa438, 0xef47, 0xa438, 0xe48f, 0xa438, 0xe9e5, 0xa438, 0x8fe8, + 0xa438, 0xee8f, 0xa438, 0xea02, 0xa438, 0xae0b, 0xa438, 0x028c, + 0xa438, 0x32ae, 0xa438, 0x0602, 0xa438, 0x8c02, 0xa438, 0x0270, + 0xa438, 0xdefe, 0xa438, 0xef96, 0xa438, 0xfefd, 0xa438, 0xfc04, + 0xa438, 0xf8e1, 0xa438, 0x8888, 0xa438, 0x11e5, 0xa438, 0x8888, + 0xa438, 0xad2a, 0xa438, 0x04ee, 0xa438, 0x8888, 0xa438, 0x00fc, + 0xa438, 0x04f8, 0xa438, 0xfafb, 0xa438, 0xe08f, 0xa438, 0xe9e1, + 0xa438, 0x8fe8, 0xa438, 0xef64, 0xa438, 0x1f00, 0xa438, 0xe18f, + 0xa438, 0xe6ef, 0xa438, 0x7402, 0xa438, 0x7ca1, 0xa438, 0xad50, + 0xa438, 0x0302, 0xa438, 0x8c32, 0xa438, 0xfffe, 0xa438, 0xfc04, + 0xa438, 0xf8fa, 0xa438, 0xef69, 0xa438, 0xfbe0, 0xa438, 0x8fd6, + 0xa438, 0xac20, 0xa438, 0x55bf, 0xa438, 0x7bf3, 0xa438, 0x027d, + 0xa438, 0x44ac, 0xa438, 0x284c, 0xa438, 0x0264, 0xa438, 0x1cbf, + 0xa438, 0x8e71, 0xa438, 0x027d, 0xa438, 0x02bf, 0xa438, 0x8e74, + 0xa438, 0x027d, 0xa438, 0x02d1, 0xa438, 0x43b1, 0xa438, 0xfebf, + 0xa438, 0x7aa6, 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aa3, + 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aa9, 0xa438, 0x027c, + 0xa438, 0xf9bf, 0xa438, 0x7aac, 0xa438, 0x027d, 0xa438, 0x02d1, + 0xa438, 0x80e0, 0xa438, 0x8888, 0xa438, 0x100e, 0xa438, 0x11b0, + 0xa438, 0xfcbf, 0xa438, 0x7a94, 0xa438, 0x027d, 0xa438, 0x2502, + 0xa438, 0x7c86, 0xa438, 0xef47, 0xa438, 0xe48f, 0xa438, 0xe9e5, + 0xa438, 0x8fe8, 0xa438, 0xee8f, 0xa438, 0xea03, 0xa438, 0xae07, + 0xa438, 0xee8f, 0xa438, 0xea01, 0xa438, 0x0270, 0xa438, 0xdeff, + 0xa438, 0xef96, 0xa438, 0xfefc, 0xa438, 0x04f8, 0xa438, 0xf9fa, + 0xa438, 0xfbef, 0xa438, 0x79fb, 0xa438, 0xbf7b, 0xa438, 0xf302, + 0xa438, 0x7d44, 0xa438, 0xac28, 0xa438, 0x2bbf, 0xa438, 0x7a94, + 0xa438, 0x027d, 0xa438, 0x44ef, 0xa438, 0x21bf, 0xa438, 0x7ab8, + 0xa438, 0x027d, 0xa438, 0x441f, 0xa438, 0x219e, 0xa438, 0x19e0, + 0xa438, 0x8fe9, 0xa438, 0xe18f, 0xa438, 0xe8ef, 0xa438, 0x641f, + 0xa438, 0x00e1, 0xa438, 0x8fe4, 0xa438, 0xef74, 0xa438, 0x027c, + 0xa438, 0xa1ad, 0xa438, 0x503d, 0xa438, 0xee8f, 0xa438, 0xe701, + 0xa438, 0xbf7a, 0xa438, 0x9402, 0xa438, 0x7cf9, 0xa438, 0xbf7a, + 0xa438, 0xa602, 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa302, + 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa902, 0xa438, 0x7cf9, + 0xa438, 0xbf7a, 0xa438, 0xac02, 0xa438, 0x7d02, 0xa438, 0xbf8e, + 0xa438, 0x7102, 0xa438, 0x7cf9, 0xa438, 0xbf8e, 0xa438, 0x7402, + 0xa438, 0x7cf9, 0xa438, 0x027c, 0xa438, 0x86ef, 0xa438, 0x47e4, + 0xa438, 0x8fe9, 0xa438, 0xe58f, 0xa438, 0xe8ee, 0xa438, 0x8fea, + 0xa438, 0x04ff, 0xa438, 0xef97, 0xa438, 0xfffe, 0xa438, 0xfdfc, + 0xa438, 0x04f8, 0xa438, 0xfafb, 0xa438, 0xe08f, 0xa438, 0xe9e1, + 0xa438, 0x8fe8, 0xa438, 0xef64, 0xa438, 0x1f00, 0xa438, 0xe18f, + 0xa438, 0xe5ef, 0xa438, 0x7402, 0xa438, 0x7ca1, 0xa438, 0xad50, + 0xa438, 0x0d02, 0xa438, 0x638e, 0xa438, 0x028c, 0xa438, 0x02ee, + 0xa438, 0x8fea, 0xa438, 0x0102, 0xa438, 0x70de, 0xa438, 0xfffe, + 0xa438, 0xfc04, 0xa438, 0xe38f, 0xa438, 0xd7a3, 0xa438, 0x000a, + 0xa438, 0xe387, 0xa438, 0x75e7, 0xa438, 0x8fd8, 0xa438, 0xee8f, + 0xa438, 0xd701, 0xa438, 0xe38f, 0xa438, 0xd8e7, 0xa438, 0x8775, + 0xa438, 0xe48f, 0xa438, 0xe1e5, 0xa438, 0x8fe2, 0xa438, 0xbf8f, + 0xa438, 0xd9ef, 0xa438, 0x320c, 0xa438, 0x311a, 0xa438, 0x93dc, + 0xa438, 0x19dd, 0xa438, 0x027f, 0xa438, 0xa9ac, 0xa438, 0x2a18, + 0xa438, 0xe08f, 0xa438, 0xe1e1, 0xa438, 0x8fe2, 0xa438, 0xef74, + 0xa438, 0xe187, 0xa438, 0x751f, 0xa438, 0x00ef, 0xa438, 0x64e1, + 0xa438, 0x8fd8, 0xa438, 0xe587, 0xa438, 0x75af, 0xa438, 0x4d72, + 0xa438, 0xbf7b, 0xa438, 0x3cef, 0xa438, 0x324b, 0xa438, 0x031a, + 0xa438, 0x9302, 0xa438, 0x7d44, 0xa438, 0xef64, 0xa438, 0xe18f, + 0xa438, 0xff1f, 0xa438, 0x00ef, 0xa438, 0x741b, 0xa438, 0x67ac, + 0xa438, 0x4fce, 0xa438, 0xe08f, 0xa438, 0xfde1, 0xa438, 0x8ffe, + 0xa438, 0xef64, 0xa438, 0xe08f, 0xa438, 0xe1e1, 0xa438, 0x8fe2, + 0xa438, 0xef74, 0xa438, 0x027c, 0xa438, 0x53ac, 0xa438, 0x5002, + 0xa438, 0xaeb6, 0xa438, 0xe187, 0xa438, 0x751f, 0xa438, 0x00ef, + 0xa438, 0x64e1, 0xa438, 0x8ffc, 0xa438, 0xef71, 0xa438, 0x1c67, + 0xa438, 0x0d67, 0xa438, 0xef46, 0xa438, 0xe587, 0xa438, 0x75ef, + 0xa438, 0x32d1, 0xa438, 0x01a3, 0xa438, 0x0002, 0xa438, 0xae05, + 0xa438, 0x0c11, 0xa438, 0x83ae, 0xa438, 0xf6e0, 0xa438, 0x8fe3, + 0xa438, 0x1e10, 0xa438, 0xe58f, 0xa438, 0xe3ae, 0xa438, 0x89bf, + 0xa438, 0x7bf3, 0xa438, 0x027d, 0xa438, 0x44e5, 0xa438, 0x8fd6, + 0xa438, 0xad28, 0xa438, 0x03af, 0xa438, 0x606b, 0xa438, 0xaf60, + 0xa438, 0xa0f8, 0xa438, 0xf9ef, 0xa438, 0x59fa, 0xa438, 0xfbbf, + 0xa438, 0x8fee, 0xa438, 0x027f, 0xa438, 0xa90d, 0xa438, 0x1149, + 0xa438, 0x041a, 0xa438, 0x91d7, 0xa438, 0x8e1d, 0xa438, 0xd68e, + 0xa438, 0x4d02, 0xa438, 0x72aa, 0xa438, 0xfffe, 0xa438, 0xef95, + 0xa438, 0xfdfc, 0xa438, 0x0400, 0xa438, 0x7591, 0xa438, 0x0275, + 0xa438, 0x4404, 0xa438, 0x758e, 0xa438, 0x2675, 0xa438, 0x4100, + 0xa438, 0x8e50, 0xa438, 0x028e, 0xa438, 0x4d04, 0xa438, 0x759d, + 0xa438, 0x2675, 0xa438, 0x4700, 0xa438, 0x8e5c, 0xa438, 0x028e, + 0xa438, 0x5904, 0xa438, 0x8e56, 0xa438, 0x268e, 0xa438, 0x5300, + 0xa438, 0x8e68, 0xa438, 0x028e, 0xa438, 0x6504, 0xa438, 0x8e62, + 0xa438, 0x268e, 0xa438, 0x5ffe, 0xa438, 0xad96, 0xa438, 0xdcad, + 0xa438, 0x96ba, 0xa438, 0xad96, 0xa438, 0x98ad, 0xa438, 0x9676, + 0xa438, 0xad98, 0xa438, 0x54ad, 0xa438, 0x9876, 0xa438, 0xae38, + 0xa438, 0x54ae, 0xa438, 0x38fe, 0xa438, 0xae3a, 0xa438, 0xdcae, + 0xa438, 0x3abb, 0xa438, 0xbf14, 0xa438, 0x99bd, 0xa438, 0xe0cc, + 0xa438, 0xbdc8, 0xa438, 0xddbd, 0xa438, 0xc800, 0xa436, 0xb85e, + 0xa438, 0x4f9a, 0xa436, 0xb860, 0xa438, 0x40cf, 0xa436, 0xb862, + 0xa438, 0x6829, 0xa436, 0xb864, 0xa438, 0x5972, 0xa436, 0xb886, + 0xa438, 0x5941, 0xa436, 0xb888, 0xa438, 0x636b, 0xa436, 0xb88a, + 0xa438, 0x4d6b, 0xa436, 0xb88c, 0xa438, 0x6062, 0xa436, 0xb838, + 0xa438, 0x00ff, 0xb820, 0x0010, 0xa436, 0x8608, 0xa438, 0xaf86, + 0xa438, 0xdaaf, 0xa438, 0x894c, 0xa438, 0xaf8a, 0xa438, 0xf8af, + 0xa438, 0x8bf3, 0xa438, 0xaf8b, 0xa438, 0xf3af, 0xa438, 0x8bf3, + 0xa438, 0xaf8b, 0xa438, 0xf3af, 0xa438, 0x8bf3, 0xa438, 0x006f, + 0xa438, 0x4a03, 0xa438, 0x6f47, 0xa438, 0x266f, 0xa438, 0x5900, + 0xa438, 0x6f4d, 0xa438, 0x016f, 0xa438, 0x5004, 0xa438, 0x6f56, + 0xa438, 0x056f, 0xa438, 0x5f06, 0xa438, 0x6f5c, 0xa438, 0x2774, + 0xa438, 0x7800, 0xa438, 0x6f68, 0xa438, 0x246f, 0xa438, 0x6b20, + 0xa438, 0x6f6e, 0xa438, 0x206f, 0xa438, 0x7410, 0xa438, 0x7469, + 0xa438, 0x1074, 0xa438, 0x6c10, 0xa438, 0x746f, 0xa438, 0x1074, + 0xa438, 0x7225, 0xa438, 0x8bfc, 0xa438, 0x008c, 0xa438, 0x0802, + 0xa438, 0x8c02, 0xa438, 0x038b, 0xa438, 0xff04, 0xa438, 0x6eed, + 0xa438, 0x278c, 0xa438, 0x0520, 0xa438, 0x74da, 0xa438, 0x2074, + 0xa438, 0xdd20, 0xa438, 0x74e0, 0xa438, 0x0074, 0xa438, 0xe300, + 0xa438, 0x6ef3, 0xa438, 0x006e, 0xa438, 0xf600, 0xa438, 0x6ef9, + 0xa438, 0x006e, 0xa438, 0xfc00, 0xa438, 0x6eff, 0xa438, 0x006f, + 0xa438, 0x0200, 0xa438, 0x6f05, 0xa438, 0x026f, 0xa438, 0x0802, + 0xa438, 0x6f0b, 0xa438, 0x026f, 0xa438, 0x0e02, 0xa438, 0x6f11, + 0xa438, 0x026f, 0xa438, 0x1402, 0xa438, 0x6f17, 0xa438, 0x226f, + 0xa438, 0x1a00, 0xa438, 0x723e, 0xa438, 0x016e, 0xa438, 0xed24, + 0xa438, 0x6f50, 0xa438, 0x0072, 0xa438, 0x4701, 0xa438, 0x724a, + 0xa438, 0x0272, 0xa438, 0x4d23, 0xa438, 0x7250, 0xa438, 0x1074, + 0xa438, 0x6910, 0xa438, 0x746c, 0xa438, 0x1074, 0xa438, 0x6f00, + 0xa438, 0x7472, 0xa438, 0x158c, 0xa438, 0x0b15, 0xa438, 0x8c0e, + 0xa438, 0x158c, 0xa438, 0x1105, 0xa438, 0x8c14, 0xa438, 0x006f, + 0xa438, 0x4a03, 0xa438, 0x6f47, 0xa438, 0x266f, 0xa438, 0x5900, + 0xa438, 0x731f, 0xa438, 0x0273, 0xa438, 0x2203, 0xa438, 0x8c08, + 0xa438, 0xee84, 0xa438, 0x7100, 0xa438, 0x0286, 0xa438, 0xece0, + 0xa438, 0x8043, 0xa438, 0xf626, 0xa438, 0xe480, 0xa438, 0x43af, + 0xa438, 0x6611, 0xa438, 0xf8e0, 0xa438, 0x8012, 0xa438, 0xac26, + 0xa438, 0x03af, 0xa438, 0x86ff, 0xa438, 0x0287, 0xa438, 0x0102, + 0xa438, 0x8906, 0xa438, 0x0289, 0xa438, 0x29fc, 0xa438, 0x04f8, + 0xa438, 0xf9ef, 0xa438, 0x59f9, 0xa438, 0xfaee, 0xa438, 0x8476, + 0xa438, 0x00d6, 0xa438, 0x008f, 0xa438, 0x0266, 0xa438, 0x53ef, + 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, + 0xa438, 0x8fe7, 0xa438, 0xe58f, 0xa438, 0xe8ae, 0xa438, 0x06e0, + 0xa438, 0x8fe7, 0xa438, 0xe18f, 0xa438, 0xe8ee, 0xa438, 0x8476, + 0xa438, 0x01d6, 0xa438, 0x00c0, 0xa438, 0x0266, 0xa438, 0x71ee, + 0xa438, 0x8476, 0xa438, 0x00d6, 0xa438, 0x0090, 0xa438, 0x0266, + 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, + 0xa438, 0x08e4, 0xa438, 0x8fe9, 0xa438, 0xe58f, 0xa438, 0xeaae, + 0xa438, 0x06e0, 0xa438, 0x8fe9, 0xa438, 0xe18f, 0xa438, 0xeaee, + 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x00c1, 0xa438, 0x0266, + 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x00d6, 0xa438, 0x0091, + 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, + 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8feb, 0xa438, 0xe58f, + 0xa438, 0xecae, 0xa438, 0x06e0, 0xa438, 0x8feb, 0xa438, 0xe18f, + 0xa438, 0xecee, 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x00c2, + 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x01d6, + 0xa438, 0x008f, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, + 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8fed, + 0xa438, 0xe58f, 0xa438, 0xeeae, 0xa438, 0x06e0, 0xa438, 0x8fed, + 0xa438, 0xe18f, 0xa438, 0xeeee, 0xa438, 0x8476, 0xa438, 0x02d6, + 0xa438, 0x00c0, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, + 0xa438, 0x01d6, 0xa438, 0x0090, 0xa438, 0x0266, 0xa438, 0x53ef, + 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, + 0xa438, 0x8fef, 0xa438, 0xe58f, 0xa438, 0xf0ae, 0xa438, 0x06e0, + 0xa438, 0x8fef, 0xa438, 0xe18f, 0xa438, 0xf0ee, 0xa438, 0x8476, + 0xa438, 0x02d6, 0xa438, 0x00c1, 0xa438, 0x0266, 0xa438, 0x71ee, + 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x0091, 0xa438, 0x0266, + 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, + 0xa438, 0x08e4, 0xa438, 0x8ff1, 0xa438, 0xe58f, 0xa438, 0xf2ae, + 0xa438, 0x06e0, 0xa438, 0x8ff1, 0xa438, 0xe18f, 0xa438, 0xf2ee, + 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x00c2, 0xa438, 0x0266, + 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x008f, + 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, + 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff3, 0xa438, 0xe58f, + 0xa438, 0xf4ae, 0xa438, 0x06e0, 0xa438, 0x8ff3, 0xa438, 0xe18f, + 0xa438, 0xf4ee, 0xa438, 0x8476, 0xa438, 0x04d6, 0xa438, 0x00c0, + 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x02d6, + 0xa438, 0x0090, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, + 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff5, + 0xa438, 0xe58f, 0xa438, 0xf6ae, 0xa438, 0x06e0, 0xa438, 0x8ff5, + 0xa438, 0xe18f, 0xa438, 0xf6ee, 0xa438, 0x8476, 0xa438, 0x04d6, + 0xa438, 0x00c1, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, + 0xa438, 0x02d6, 0xa438, 0x0091, 0xa438, 0x0266, 0xa438, 0x53ef, + 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, + 0xa438, 0x8ff7, 0xa438, 0xe58f, 0xa438, 0xf8ae, 0xa438, 0x06e0, + 0xa438, 0x8ff7, 0xa438, 0xe18f, 0xa438, 0xf8ee, 0xa438, 0x8476, + 0xa438, 0x04d6, 0xa438, 0x00c2, 0xa438, 0x0266, 0xa438, 0x71ee, + 0xa438, 0x8476, 0xa438, 0x03d6, 0xa438, 0x008f, 0xa438, 0x0266, + 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, + 0xa438, 0x08e4, 0xa438, 0x8ff9, 0xa438, 0xe58f, 0xa438, 0xfaae, + 0xa438, 0x06e0, 0xa438, 0x8ff9, 0xa438, 0xe18f, 0xa438, 0xfaee, + 0xa438, 0x8476, 0xa438, 0x08d6, 0xa438, 0x00c0, 0xa438, 0x0266, + 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x03d6, 0xa438, 0x0090, + 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, + 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ffb, 0xa438, 0xe58f, + 0xa438, 0xfcae, 0xa438, 0x06e0, 0xa438, 0x8ffb, 0xa438, 0xe18f, + 0xa438, 0xfcee, 0xa438, 0x8476, 0xa438, 0x08d6, 0xa438, 0x00c1, + 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x03d6, + 0xa438, 0x0091, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, + 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ffd, + 0xa438, 0xe58f, 0xa438, 0xfeae, 0xa438, 0x06e0, 0xa438, 0x8ffd, + 0xa438, 0xe18f, 0xa438, 0xfeee, 0xa438, 0x8476, 0xa438, 0x08d6, + 0xa438, 0x00c2, 0xa438, 0x0266, 0xa438, 0x71fe, 0xa438, 0xfdef, + 0xa438, 0x95fd, 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xfad4, + 0xa438, 0x0400, 0xa438, 0xd600, 0xa438, 0x0dd3, 0xa438, 0x0fe7, + 0xa438, 0x8476, 0xa438, 0x0266, 0xa438, 0x71d4, 0xa438, 0x1400, + 0xa438, 0xd600, 0xa438, 0x0dd3, 0xa438, 0x0fe7, 0xa438, 0x8476, + 0xa438, 0x0266, 0xa438, 0x71fe, 0xa438, 0xfdfc, 0xa438, 0x04f8, + 0xa438, 0xf9fa, 0xa438, 0xd410, 0xa438, 0x00d6, 0xa438, 0x000d, + 0xa438, 0xd30f, 0xa438, 0xe784, 0xa438, 0x7602, 0xa438, 0x6671, + 0xa438, 0xd400, 0xa438, 0x00d6, 0xa438, 0x000d, 0xa438, 0xd30f, + 0xa438, 0xe784, 0xa438, 0x7602, 0xa438, 0x6671, 0xa438, 0xfefd, + 0xa438, 0xfc04, 0xa438, 0xe080, 0xa438, 0x4fac, 0xa438, 0x2317, + 0xa438, 0xe080, 0xa438, 0x44ad, 0xa438, 0x231a, 0xa438, 0x0289, + 0xa438, 0x75e0, 0xa438, 0x8044, 0xa438, 0xac23, 0xa438, 0x11bf, + 0xa438, 0x6ecf, 0xa438, 0x0276, 0xa438, 0x74ae, 0xa438, 0x0902, + 0xa438, 0x8adb, 0xa438, 0x021f, 0xa438, 0xe702, 0xa438, 0x1fbb, + 0xa438, 0xaf1f, 0xa438, 0x95f8, 0xa438, 0xf9ef, 0xa438, 0x59f9, + 0xa438, 0xfafb, 0xa438, 0xe080, 0xa438, 0x12ac, 0xa438, 0x2303, + 0xa438, 0xaf8a, 0xa438, 0xd0d4, 0xa438, 0x0120, 0xa438, 0xd600, + 0xa438, 0x10d2, 0xa438, 0x0fe6, 0xa438, 0x8476, 0xa438, 0x0266, + 0xa438, 0x71ee, 0xa438, 0x846f, 0xa438, 0x00d4, 0xa438, 0x000f, + 0xa438, 0xbf72, 0xa438, 0x9e02, 0xa438, 0x7697, 0xa438, 0x0275, + 0xa438, 0xbeef, 0xa438, 0x47e4, 0xa438, 0x8474, 0xa438, 0xe584, + 0xa438, 0x75bf, 0xa438, 0x729b, 0xa438, 0x0276, 0xa438, 0xb6e5, + 0xa438, 0x846f, 0xa438, 0xef31, 0xa438, 0xbf6e, 0xa438, 0x0602, + 0xa438, 0x76b6, 0xa438, 0xef64, 0xa438, 0xbf6e, 0xa438, 0x0902, + 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xbf6e, 0xa438, 0x0f02, + 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xac40, 0xa438, 0x05a3, + 0xa438, 0x0f0c, 0xa438, 0xae26, 0xa438, 0xa303, 0xa438, 0x02ae, + 0xa438, 0x21a3, 0xa438, 0x0c02, 0xa438, 0xae1c, 0xa438, 0xe084, + 0xa438, 0x74e1, 0xa438, 0x8475, 0xa438, 0xef64, 0xa438, 0xd000, + 0xa438, 0xd196, 0xa438, 0xef74, 0xa438, 0x0275, 0xa438, 0xd9ad, + 0xa438, 0x50b7, 0xa438, 0xe083, 0xa438, 0xecf7, 0xa438, 0x23e4, + 0xa438, 0x83ec, 0xa438, 0xbf72, 0xa438, 0x9e02, 0xa438, 0x766b, + 0xa438, 0x0287, 0xa438, 0x0102, 0xa438, 0x8906, 0xa438, 0xee83, + 0xa438, 0xe800, 0xa438, 0xbf72, 0xa438, 0x6b02, 0xa438, 0x766b, + 0xa438, 0xbf72, 0xa438, 0x6e02, 0xa438, 0x766b, 0xa438, 0xbf72, + 0xa438, 0x7102, 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x7402, + 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x7702, 0xa438, 0x766b, + 0xa438, 0xbf72, 0xa438, 0x7a02, 0xa438, 0x766b, 0xa438, 0xd400, + 0xa438, 0x0fbf, 0xa438, 0x7295, 0xa438, 0x0276, 0xa438, 0x97d7, + 0xa438, 0x0400, 0xa438, 0xbf6e, 0xa438, 0x0602, 0xa438, 0x76b6, 0xa438, 0xef64, 0xa438, 0xbf6e, 0xa438, 0x0902, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xbf6e, 0xa438, 0x0f02, 0xa438, 0x76b6, - 0xa438, 0x1e64, 0xa438, 0xac40, 0xa438, 0x0ebf, 0xa438, 0x7298, - 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x8478, 0xa438, 0xa10f, - 0xa438, 0x26ae, 0xa438, 0x47bf, 0xa438, 0x8bf3, 0xa438, 0x0276, - 0xa438, 0xb6ac, 0xa438, 0x2802, 0xa438, 0xae0b, 0xa438, 0xbf8b, - 0xa438, 0xf902, 0xa438, 0x76b6, 0xa438, 0xe584, 0xa438, 0x78ae, - 0xa438, 0x09bf, 0xa438, 0x8bf6, 0xa438, 0x0276, 0xa438, 0xb6e5, - 0xa438, 0x8478, 0xa438, 0xa103, 0xa438, 0x02ae, 0xa438, 0x23e0, - 0xa438, 0x8474, 0xa438, 0xe184, 0xa438, 0x75ef, 0xa438, 0x64e0, - 0xa438, 0x83fc, 0xa438, 0xe183, 0xa438, 0xfdef, 0xa438, 0x7402, - 0xa438, 0x75d9, 0xa438, 0xad50, 0xa438, 0x0ae0, 0xa438, 0x83ec, - 0xa438, 0xf721, 0xa438, 0xe483, 0xa438, 0xecae, 0xa438, 0x03af, - 0xa438, 0x68e4, 0xa438, 0xbf72, 0xa438, 0x9502, 0xa438, 0x766b, - 0xa438, 0xe083, 0xa438, 0xebad, 0xa438, 0x2170, 0xa438, 0xbf73, - 0xa438, 0x7f02, 0xa438, 0x766b, 0xa438, 0xd700, 0xa438, 0x64bf, - 0xa438, 0x73c4, 0xa438, 0x0276, 0xa438, 0xb6a4, 0xa438, 0x0000, - 0xa438, 0x02ae, 0xa438, 0x0d87, 0xa438, 0xa700, 0xa438, 0x00ef, - 0xa438, 0xe183, 0xa438, 0xecf7, 0xa438, 0x2ae5, 0xa438, 0x83ec, - 0xa438, 0xbf73, 0xa438, 0xbe02, 0xa438, 0x766b, 0xa438, 0xbf73, - 0xa438, 0xb802, 0xa438, 0x766b, 0xa438, 0xbf73, 0xa438, 0xc102, - 0xa438, 0x766b, 0xa438, 0xbf73, 0xa438, 0xbb02, 0xa438, 0x766b, - 0xa438, 0xe084, 0xa438, 0x9ee1, 0xa438, 0x849f, 0xa438, 0xbf72, - 0xa438, 0x7d02, 0xa438, 0x7697, 0xa438, 0xbf72, 0xa438, 0x8002, - 0xa438, 0x7697, 0xa438, 0xbf72, 0xa438, 0x8302, 0xa438, 0x7697, - 0xa438, 0xbf72, 0xa438, 0x8602, 0xa438, 0x7697, 0xa438, 0xbf72, - 0xa438, 0x8902, 0xa438, 0x7674, 0xa438, 0xbf72, 0xa438, 0x8c02, - 0xa438, 0x7674, 0xa438, 0xbf72, 0xa438, 0x8f02, 0xa438, 0x7674, - 0xa438, 0xbf72, 0xa438, 0x9202, 0xa438, 0x7674, 0xa438, 0xee84, - 0xa438, 0x7700, 0xa438, 0xe080, 0xa438, 0x44f6, 0xa438, 0x21e4, - 0xa438, 0x8044, 0xa438, 0xaf68, 0xa438, 0xe411, 0xa438, 0xd1a4, - 0xa438, 0x10bc, 0xa438, 0x7432, 0xa438, 0xbc74, 0xa438, 0xbbbf, - 0xa438, 0x14cc, 0xa438, 0xbfaa, 0xa438, 0x00bf, 0xa438, 0x9055, - 0xa438, 0xbf06, 0xa438, 0x10bf, 0xa438, 0xb876, 0xa438, 0xbe02, - 0xa438, 0x54be, 0xa438, 0x0232, 0xa438, 0xbe02, 0xa438, 0x10be, - 0xa438, 0x0200, 0xa436, 0x8fe7, 0xa438, 0x1200, 0xa436, 0x8fe9, - 0xa438, 0x1200, 0xa436, 0x8feb, 0xa438, 0x1200, 0xa436, 0x8fed, - 0xa438, 0x1200, 0xa436, 0x8fef, 0xa438, 0x1200, 0xa436, 0x8ff1, - 0xa438, 0x1200, 0xa436, 0x8ff3, 0xa438, 0x1200, 0xa436, 0x8ff5, - 0xa438, 0x1200, 0xa436, 0x8ff7, 0xa438, 0x1200, 0xa436, 0x8ff9, - 0xa438, 0x1200, 0xa436, 0x8ffb, 0xa438, 0x1200, 0xa436, 0x8ffd, - 0xa438, 0x1200, 0xa436, 0xb818, 0xa438, 0x6602, 0xa436, 0xb81a, - 0xa438, 0x1f75, 0xa436, 0xb81c, 0xa438, 0x67eb, 0xa436, 0xb81e, - 0xa438, 0xffff, 0xa436, 0xb850, 0xa438, 0xffff, 0xa436, 0xb852, - 0xa438, 0xffff, 0xa436, 0xb878, 0xa438, 0xffff, 0xa436, 0xb884, - 0xa438, 0xffff, 0xa436, 0xb832, 0xa438, 0x0007, 0xB82E, 0x0000, - 0xa436, 0x8023, 0xa438, 0x0000, 0xB820, 0x0000, 0xFFFF, 0xFFFF + 0xa438, 0x1e64, 0xa438, 0xac40, 0xa438, 0x0fbf, 0xa438, 0x7298, + 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x83e8, 0xa438, 0xa10f, + 0xa438, 0x28af, 0xa438, 0x8a95, 0xa438, 0xbf8b, 0xa438, 0xf302, + 0xa438, 0x76b6, 0xa438, 0xac28, 0xa438, 0x02ae, 0xa438, 0x0bbf, + 0xa438, 0x8bf9, 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x83e8, + 0xa438, 0xae09, 0xa438, 0xbf8b, 0xa438, 0xf602, 0xa438, 0x76b6, + 0xa438, 0xe583, 0xa438, 0xe8a1, 0xa438, 0x0303, 0xa438, 0xaf8a, + 0xa438, 0x95b7, 0xa438, 0xafe2, 0xa438, 0x83ec, 0xa438, 0xf735, + 0xa438, 0xe683, 0xa438, 0xecbf, 0xa438, 0x7295, 0xa438, 0x0276, + 0xa438, 0x6bbf, 0xa438, 0x726b, 0xa438, 0x0276, 0xa438, 0x74bf, + 0xa438, 0x726e, 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x7271, + 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x7274, 0xa438, 0x0276, + 0xa438, 0x74bf, 0xa438, 0x7277, 0xa438, 0x0276, 0xa438, 0x74bf, + 0xa438, 0x727a, 0xa438, 0x0276, 0xa438, 0x7402, 0xa438, 0x8929, + 0xa438, 0xd401, 0xa438, 0x28d6, 0xa438, 0x0010, 0xa438, 0xd20f, + 0xa438, 0xe684, 0xa438, 0x7602, 0xa438, 0x6671, 0xa438, 0x021f, + 0xa438, 0xbbff, 0xa438, 0xfefd, 0xa438, 0xef95, 0xa438, 0xfdfc, + 0xa438, 0x04f8, 0xa438, 0xf9ef, 0xa438, 0x59f9, 0xa438, 0xe080, + 0xa438, 0x12ad, 0xa438, 0x230c, 0xa438, 0xbf72, 0xa438, 0x9e02, + 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x9502, 0xa438, 0x766b, + 0xa438, 0xfdef, 0xa438, 0x95fd, 0xa438, 0xfc04, 0xa438, 0xbf6e, + 0xa438, 0x0602, 0xa438, 0x76b6, 0xa438, 0xef64, 0xa438, 0xbf6e, + 0xa438, 0x0902, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xbf6e, + 0xa438, 0x0f02, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xac40, + 0xa438, 0x0ebf, 0xa438, 0x7298, 0xa438, 0x0276, 0xa438, 0xb6e5, + 0xa438, 0x8478, 0xa438, 0xa10f, 0xa438, 0x26ae, 0xa438, 0x47bf, + 0xa438, 0x8bf3, 0xa438, 0x0276, 0xa438, 0xb6ac, 0xa438, 0x2802, + 0xa438, 0xae0b, 0xa438, 0xbf8b, 0xa438, 0xf902, 0xa438, 0x76b6, + 0xa438, 0xe584, 0xa438, 0x78ae, 0xa438, 0x09bf, 0xa438, 0x8bf6, + 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x8478, 0xa438, 0xa103, + 0xa438, 0x02ae, 0xa438, 0x23e0, 0xa438, 0x8474, 0xa438, 0xe184, + 0xa438, 0x75ef, 0xa438, 0x64e0, 0xa438, 0x83fc, 0xa438, 0xe183, + 0xa438, 0xfdef, 0xa438, 0x7402, 0xa438, 0x75d9, 0xa438, 0xad50, + 0xa438, 0x0ae0, 0xa438, 0x83ec, 0xa438, 0xf721, 0xa438, 0xe483, + 0xa438, 0xecae, 0xa438, 0x03af, 0xa438, 0x68e4, 0xa438, 0xbf72, + 0xa438, 0x9502, 0xa438, 0x766b, 0xa438, 0xe083, 0xa438, 0xebad, + 0xa438, 0x2170, 0xa438, 0xbf73, 0xa438, 0x7f02, 0xa438, 0x766b, + 0xa438, 0xd700, 0xa438, 0x64bf, 0xa438, 0x73c4, 0xa438, 0x0276, + 0xa438, 0xb6a4, 0xa438, 0x0000, 0xa438, 0x02ae, 0xa438, 0x0d87, + 0xa438, 0xa700, 0xa438, 0x00ef, 0xa438, 0xe183, 0xa438, 0xecf7, + 0xa438, 0x2ae5, 0xa438, 0x83ec, 0xa438, 0xbf73, 0xa438, 0xbe02, + 0xa438, 0x766b, 0xa438, 0xbf73, 0xa438, 0xb802, 0xa438, 0x766b, + 0xa438, 0xbf73, 0xa438, 0xc102, 0xa438, 0x766b, 0xa438, 0xbf73, + 0xa438, 0xbb02, 0xa438, 0x766b, 0xa438, 0xe084, 0xa438, 0x9ee1, + 0xa438, 0x849f, 0xa438, 0xbf72, 0xa438, 0x7d02, 0xa438, 0x7697, + 0xa438, 0xbf72, 0xa438, 0x8002, 0xa438, 0x7697, 0xa438, 0xbf72, + 0xa438, 0x8302, 0xa438, 0x7697, 0xa438, 0xbf72, 0xa438, 0x8602, + 0xa438, 0x7697, 0xa438, 0xbf72, 0xa438, 0x8902, 0xa438, 0x7674, + 0xa438, 0xbf72, 0xa438, 0x8c02, 0xa438, 0x7674, 0xa438, 0xbf72, + 0xa438, 0x8f02, 0xa438, 0x7674, 0xa438, 0xbf72, 0xa438, 0x9202, + 0xa438, 0x7674, 0xa438, 0xee84, 0xa438, 0x7700, 0xa438, 0xe080, + 0xa438, 0x44f6, 0xa438, 0x21e4, 0xa438, 0x8044, 0xa438, 0xaf68, + 0xa438, 0xe411, 0xa438, 0xd1a4, 0xa438, 0x10bc, 0xa438, 0x7432, + 0xa438, 0xbc74, 0xa438, 0xbbbf, 0xa438, 0x14cc, 0xa438, 0xbfaa, + 0xa438, 0x00bf, 0xa438, 0x9055, 0xa438, 0xbf06, 0xa438, 0x10bf, + 0xa438, 0xb876, 0xa438, 0xbe02, 0xa438, 0x54be, 0xa438, 0x0232, + 0xa438, 0xbe02, 0xa438, 0x10be, 0xa438, 0x0200, 0xa436, 0x8fe7, + 0xa438, 0x1200, 0xa436, 0x8fe9, 0xa438, 0x1200, 0xa436, 0x8feb, + 0xa438, 0x1200, 0xa436, 0x8fed, 0xa438, 0x1200, 0xa436, 0x8fef, + 0xa438, 0x1200, 0xa436, 0x8ff1, 0xa438, 0x1200, 0xa436, 0x8ff3, + 0xa438, 0x1200, 0xa436, 0x8ff5, 0xa438, 0x1200, 0xa436, 0x8ff7, + 0xa438, 0x1200, 0xa436, 0x8ff9, 0xa438, 0x1200, 0xa436, 0x8ffb, + 0xa438, 0x1200, 0xa436, 0x8ffd, 0xa438, 0x1200, 0xa436, 0xb818, + 0xa438, 0x6602, 0xa436, 0xb81a, 0xa438, 0x1f75, 0xa436, 0xb81c, + 0xa438, 0x67eb, 0xa436, 0xb81e, 0xa438, 0xffff, 0xa436, 0xb850, + 0xa438, 0xffff, 0xa436, 0xb852, 0xa438, 0xffff, 0xa436, 0xb878, + 0xa438, 0xffff, 0xa436, 0xb884, 0xa438, 0xffff, 0xa436, 0xb832, + 0xa438, 0x0007, 0xB82E, 0x0000, 0xa436, 0x8023, 0xa438, 0x0000, + 0xB820, 0x0000, 0xFFFF, 0xFFFF }; static const u16 phy_mcu_ram_code_8127a_2[] = { @@ -10941,7 +11662,42 @@ static const u16 phy_mcu_ram_code_8127a_2[] = { 0xB890, 0x5060, 0xB890, 0xE0D0, 0xB890, 0xA000, 0xB890, 0x3030, 0xB890, 0x4070, 0xB890, 0xE0E0, 0xB890, 0xD080, 0xB890, 0xA010, 0xB890, 0xE040, 0xB890, 0x80B0, 0xB890, 0x50B0, 0xB890, 0x2090, - 0xB820, 0x0000, 0xFFFF, 0xFFFF + 0xB88E, 0xC110, 0xB890, 0xE8F4, 0xB890, 0xF4F4, 0xB88E, 0xC14E, + 0xB890, 0x26EF, 0xB890, 0xEFEF, 0xB88E, 0xC374, 0xB890, 0x00FA, + 0xB890, 0x008C, 0xB890, 0x03D2, 0xB890, 0x0373, 0xB890, 0x03B9, + 0xB890, 0x0006, 0xB890, 0x0013, 0xB890, 0x03FE, 0xB890, 0x03DE, + 0xB890, 0x0008, 0xB890, 0x0008, 0xB890, 0x000D, 0xB890, 0x03F3, + 0xB890, 0x0010, 0xB890, 0x000A, 0xB890, 0x000E, 0xB890, 0x03F5, + 0xB890, 0x0001, 0xB890, 0x03FF, 0xB890, 0x0000, 0xB890, 0x0005, + 0xB890, 0x000A, 0xB890, 0x03F3, 0xB890, 0x0003, 0xB890, 0x03F1, + 0xB890, 0x0003, 0xB890, 0x000C, 0xB890, 0x000E, 0xB890, 0x03FA, + 0xB890, 0x0007, 0xB890, 0x0008, 0xB890, 0x0010, 0xB890, 0x03EE, + 0xB890, 0x000E, 0xB890, 0x03F6, 0xB890, 0x0007, 0xB890, 0x03FC, + 0xB890, 0x000B, 0xB890, 0x03FB, 0xB890, 0x000F, 0xB890, 0x03F6, + 0xB890, 0x0016, 0xB890, 0x03F9, 0xB890, 0x03FF, 0xB890, 0x03FF, + 0xB890, 0x0007, 0xB890, 0x03FD, 0xB890, 0x000D, 0xB890, 0x03FE, + 0xB890, 0x0003, 0xB890, 0x03F1, 0xB890, 0x000B, 0xB890, 0x0000, + 0xB890, 0x0012, 0xB890, 0x03FD, 0xB890, 0x03FC, 0xB890, 0x0004, + 0xB890, 0x000F, 0xB890, 0x03EF, 0xB890, 0x03F9, 0xB890, 0x000D, + 0xB890, 0x0002, 0xB890, 0x000C, 0xB890, 0x0003, 0xB890, 0x0069, + 0xB890, 0x0064, 0xB890, 0x004F, 0xB890, 0x001E, 0xB890, 0x03ED, + 0xB890, 0x03DC, 0xB890, 0x03BC, 0xB890, 0x03D1, 0xB890, 0x03C5, + 0xB890, 0x03E4, 0xB890, 0x03EA, 0xB890, 0x03FF, 0xB890, 0x03FA, + 0xB890, 0x0007, 0xB890, 0x03FF, 0xB890, 0x03E5, 0xB890, 0x03FA, + 0xB890, 0x03F1, 0xB890, 0x03F8, 0xB890, 0x03EF, 0xB890, 0x0007, + 0xB890, 0x0002, 0xB890, 0x0016, 0xB890, 0x0001, 0xB890, 0x000A, + 0xB890, 0x03F6, 0xB890, 0x0000, 0xB890, 0x03F7, 0xB890, 0x0004, + 0xB890, 0x0002, 0xB890, 0x0010, 0xB890, 0x0004, 0xB890, 0x03FD, + 0xB890, 0x03F2, 0xB890, 0x03EE, 0xB890, 0x03FA, 0xB890, 0x03F1, + 0xB890, 0x03FE, 0xB890, 0x03FB, 0xB890, 0x0008, 0xB890, 0x03EE, + 0xB890, 0x000F, 0xB890, 0x03F0, 0xB890, 0x000F, 0xB890, 0x03F3, + 0xB890, 0x0004, 0xB890, 0x03F3, 0xB890, 0x0003, 0xB890, 0x03F5, + 0xB890, 0x03FE, 0xB890, 0x03F5, 0xB890, 0x0008, 0xB890, 0x03F7, + 0xB890, 0x000A, 0xB890, 0x03F9, 0xB890, 0x0000, 0xB890, 0x03FB, + 0xB890, 0x000C, 0xB890, 0x03EC, 0xB890, 0x03FB, 0xB890, 0x03EE, + 0xB890, 0x000E, 0xB890, 0x03F5, 0xB890, 0x0007, 0xB88E, 0xC128, + 0xB890, 0xF0F0, 0xB890, 0xF0EB, 0xB88E, 0xC166, 0xB890, 0xEAEA, + 0xB890, 0xEA0E, 0xB820, 0x0000, 0xFFFF, 0xFFFF }; static void @@ -11789,6 +12545,27 @@ rtl8127_hw_phy_config_8127a_1(struct net_device *dev) 0xF000, 0x4000); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x83A5); + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xB87E, + 0xFF00, + 0x0400); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x83A6); + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xB87E, + 0xFF00, + 0x0400); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x83A7); + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xB87E, + 0xFF00, + 0x0400); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x83A8); + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xB87E, + 0xFF00, + 0x0400); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x84AC); rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0000); @@ -11805,7 +12582,7 @@ rtl8127_hw_phy_config_8127a_1(struct net_device *dev) rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FFC); rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87E, 0x6008); rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FFE); - rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF450); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF4FF); rtl8127_mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8015); rtl8127_set_eth_phy_ocp_bit(tp, 0xB87E, BIT_9); @@ -12007,9 +12784,12 @@ rtl8127_hw_phy_config_8127a_1(struct net_device *dev) rtl8127_set_eth_phy_ocp_bit(tp, 0xA430, BIT_1 | BIT_0); + rtl8127_set_eth_phy_ocp_bit(tp, 0xA442, BIT_7); + rtl8127_clear_eth_phy_ocp_bit(tp, 0xA430, BIT_12); - if (aspm && HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) + if (aspm && !HW_FIBER_MODE_ENABLED(tp) && + HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) rtl8127_enable_phy_aldps(tp); } @@ -12143,35 +12923,14 @@ rtl8127_setup_interrupt_mask(struct rtl8127_private *tp) int i; if (tp->HwCurrIsrVer == 6) { - tp->intr_mask = ISRIMR_V6_LINKCHG | ISRIMR_V6_TOK_Q0; - if (tp->num_tx_rings > 1) - tp->intr_mask |= ISRIMR_V6_TOK_Q1; + tp->intr_mask = ISRIMR_V6_LINKCHG; + for (i = 0; i < tp->num_tx_rings; i++) + tp->intr_mask |= ISRIMR_V6_TOK_Q0 << i; for (i = 0; i < tp->num_rx_rings; i++) tp->intr_mask |= ISRIMR_V6_ROK_Q0 << i; if (tp->DASH) tp->intr_l2_mask |= ISRIMR_V6_L2_MISC_INTR; - } else if (tp->HwCurrIsrVer == 5) { - tp->intr_mask = ISRIMR_V5_LINKCHG | ISRIMR_V5_TOK_Q0; - if (tp->num_tx_rings > 1) - tp->intr_mask |= ISRIMR_V5_TOK_Q1; - for (i = 0; i < tp->num_rx_rings; i++) - tp->intr_mask |= ISRIMR_V5_ROK_Q0 << i; - } else if (tp->HwCurrIsrVer == 4) { - tp->intr_mask = ISRIMR_V4_LINKCHG; - for (i = 0; i < tp->num_rx_rings; i++) - tp->intr_mask |= ISRIMR_V4_ROK_Q0 << i; - } else if (tp->HwCurrIsrVer == 3) { - tp->intr_mask = ISRIMR_V2_LINKCHG; - for (i = 0; i < max(tp->num_tx_rings, tp->num_rx_rings); i++) - tp->intr_mask |= ISRIMR_V2_ROK_Q0 << i; - } else if (tp->HwCurrIsrVer == 2) { - tp->intr_mask = ISRIMR_V2_LINKCHG | ISRIMR_TOK_Q0; - if (tp->num_tx_rings > 1) - tp->intr_mask |= ISRIMR_TOK_Q1; - - for (i = 0; i < tp->num_rx_rings; i++) - tp->intr_mask |= ISRIMR_V2_ROK_Q0 << i; } else { tp->intr_mask = LinkChg | RxDescUnavail | TxOK | RxOK | SWInt; tp->timer_intr_mask = LinkChg | PCSTimeout; @@ -12200,21 +12959,12 @@ rtl8127_setup_mqs_reg(struct rtl8127_private *tp) tp->tx_ring[i].tdsar_reg = (u16)(TNPDS_Q1_LOW_8125 + (i - 1) * 8); switch (tp->HwSuppTxNoCloseVer) { - case 4: - case 5: - hw_clo_ptr0_reg = HW_CLO_PTR0_8126; - sw_tail_ptr0_reg = SW_TAIL_PTR0_8126; - reg_len = 4; - break; case 6: hw_clo_ptr0_reg = HW_CLO_PTR0_8125BP; sw_tail_ptr0_reg = SW_TAIL_PTR0_8125BP; reg_len = 8; break; default: - hw_clo_ptr0_reg = HW_CLO_PTR0_8125; - sw_tail_ptr0_reg = SW_TAIL_PTR0_8125; - reg_len = 4; break; } @@ -12237,6 +12987,80 @@ rtl8127_setup_mqs_reg(struct rtl8127_private *tp) tp->imr_reg[i] = (u16)(IMR1_8125 + (i - 1) * 4); } +static void +rtl8127_backup_led_select(struct rtl8127_private *tp) +{ + tp->BackupLedSel[1] = RTL_R16(tp, LEDSEL_1_8125); + tp->BackupLedSel[2] = RTL_R16(tp, LEDSEL_2_8125); + tp->BackupLedSel[3] = RTL_R16(tp, LEDSEL_3_8125); + tp->BackupLedSel[0] = RTL_R16(tp, CustomLED); +} + +static void +rtl8127_restore_led_select(struct rtl8127_private *tp) +{ + RTL_W16(tp, LEDSEL_1_8125, tp->BackupLedSel[1]); + RTL_W16(tp, LEDSEL_2_8125, tp->BackupLedSel[2]); + RTL_W16(tp, LEDSEL_3_8125, tp->BackupLedSel[3]); + RTL_W16(tp, CustomLED, tp->BackupLedSel[0]); +} + +static bool +_rtl8127_backup_phy_fuse_dout_v4(struct rtl8127_private *tp) +{ + u16 i; + + for (i = 0; i < R8127_PHY_FUSE_DOUT_NUM; i++) { + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xA460, + 0x001F, + i); + tp->BackupPhyFuseDout[i] = rtl8127_mdio_direct_read_phy_ocp(tp, 0xA462); + } + + if (tp->HwSuppEsdVer == 6) { + tp->BackupPhyFuseDout[30] = USHRT_MAX; + tp->BackupPhyFuseDout[31] = USHRT_MAX; + } + + return TRUE; +} + +static bool +rtl8127_backup_phy_fuse_dout(struct rtl8127_private *tp) +{ + if (tp->HwSuppEsdVer == 6) + return _rtl8127_backup_phy_fuse_dout_v4(tp); + else + return FALSE; +} + +static void +_rtl8127_restore_phy_fuse_dout_v4(struct rtl8127_private *tp) +{ + u16 i; + + for (i = 0; i < R8127_PHY_FUSE_DOUT_NUM; i++) { + if (tp->BackupPhyFuseDout[i] == USHRT_MAX) + continue; + + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xA460, + 0x001F, + i); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xA462, tp->BackupPhyFuseDout[i]); + } +} + +static void +rtl8127_restore_phy_fuse_dout(struct rtl8127_private *tp) +{ + if (tp->HwSuppEsdVer == 6) + _rtl8127_restore_phy_fuse_dout_v4(tp); + else + return; +} + static void rtl8127_init_software_variable(struct net_device *dev) { @@ -12246,16 +13070,6 @@ rtl8127_init_software_variable(struct net_device *dev) #ifdef ENABLE_LIB_SUPPORT tp->ring_lib_enabled = 1; #endif - - switch (tp->mcfg) { - case CFG_METHOD_2: { - u8 tmp = (u8)rtl8127_mac_ocp_read(tp, 0xD006); - if (tmp == 0x03) - tp->HwSuppDashVer = 4; - } - break; - } - switch (tp->mcfg) { case CFG_METHOD_2: if (HW_DASH_SUPPORT_DASH(tp)) @@ -12314,6 +13128,18 @@ rtl8127_init_software_variable(struct net_device *dev) tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_V3; + switch (tp->mcfg) { + case CFG_METHOD_2: + tp->HwSuppEsdVer = 6; + break; + default: + tp->HwSuppEsdVer = 1; + break; + } + + if (rtl8127_backup_phy_fuse_dout(tp)) + tp->TestPhyOcpReg = TRUE; + tp->HwSuppLinkChgWakeUpVer = 3; tp->HwSuppD0SpeedUpVer = 2; @@ -12323,16 +13149,9 @@ rtl8127_init_software_variable(struct net_device *dev) tp->HwSuppTxNoCloseVer = 6; switch (tp->HwSuppTxNoCloseVer) { - case 5: case 6: tp->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4; break; - case 4: - tp->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3; - break; - case 3: - tp->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2; - break; default: tx_no_close_enable = 0; break; @@ -12361,8 +13180,8 @@ rtl8127_init_software_variable(struct net_device *dev) tp->MacMcuPageSize = RTL8127_MAC_MCU_PAGE_SIZE; - tp->HwSuppNumTxQueues = 2; - tp->HwSuppNumRxQueues = 4; + tp->HwSuppNumTxQueues = R8127_TX_QUEUE_NUM; + tp->HwSuppNumRxQueues = R8127_RX_QUEUE_NUM; //init interrupt tp->HwSuppIsrVer = 6; @@ -12380,8 +13199,7 @@ rtl8127_init_software_variable(struct net_device *dev) tp->num_tx_rings = tp->HwSuppNumTxQueues; #endif #endif - if (tp->HwCurrIsrVer < 2 || - (tp->HwCurrIsrVer == 2 && tp->irq_nvecs < 19)) + if (tp->HwCurrIsrVer < 2) tp->num_tx_rings = 1; //RSS @@ -12396,9 +13214,7 @@ rtl8127_init_software_variable(struct net_device *dev) #else if (tp->HwSuppRssVer > 0 && tp->HwCurrIsrVer > 1) { u8 rss_queue_num = netif_get_num_default_rss_queues(); - tp->num_rx_rings = (tp->HwSuppNumRxQueues > rss_queue_num)? - rss_queue_num : tp->HwSuppNumRxQueues; - + tp->num_rx_rings = min(tp->HwSuppNumRxQueues, rss_queue_num); if (!(tp->num_rx_rings >= 2 && tp->irq_nvecs >= tp->num_rx_rings)) tp->num_rx_rings = 1; @@ -12459,7 +13275,7 @@ rtl8127_init_software_variable(struct net_device *dev) else if (tp->InitRxDescType == RX_DESC_RING_TYPE_4) tp->rtl8127_rx_config &= ~EnableRxDescV4_1; - tp->NicCustLedValue = RTL_R16(tp, CustomLED); + rtl8127_backup_led_select(tp); tp->wol_opts = rtl8127_get_hw_wol(tp); tp->wol_enabled = (tp->wol_opts) ? WOL_ENABLED : WOL_DISABLED; @@ -13287,6 +14103,7 @@ static int rtl8127_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd) { struct rtl8127_private *tp = netdev_priv(dev); + struct ifreq ifrdata = { .ifr_data = data }; int ret = 0; switch (cmd) { @@ -13301,7 +14118,7 @@ static int rtl8127_siocdevprivate(struct net_device *dev, struct ifreq *ifr, break; } - ret = rtl8127_dash_ioctl(dev, ifr); + ret = rtl8127_dash_ioctl(dev, &ifrdata); break; #endif @@ -13312,7 +14129,7 @@ static int rtl8127_siocdevprivate(struct net_device *dev, struct ifreq *ifr, break; } - ret = rtl8127_realwow_ioctl(dev, ifr); + ret = rtl8127_realwow_ioctl(dev, &ifrdata); break; #endif @@ -13322,7 +14139,7 @@ static int rtl8127_siocdevprivate(struct net_device *dev, struct ifreq *ifr, break; } - ret = rtl8127_tool_ioctl(tp, ifr); + ret = rtl8127_tool_ioctl(tp, &ifrdata); break; default: @@ -13486,7 +14303,9 @@ rtl8127_init_board(struct pci_dev *pdev, tp->msg_enable = netif_msg_init(debug.msg_enable, R8127_MSG_DEFAULT); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) - if (!aspm) + if (aspm) + pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S); + else pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM); #endif @@ -13622,6 +14441,102 @@ rtl8127_init_board(struct pci_dev *pdev, goto out; } +static bool +rtl8127_test_phy_ocp_v6(struct rtl8127_private *tp) +{ + bool restore = FALSE; + u8 phy_fatal_err; + u32 wait_cnt; + + if (FALSE == HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) + goto exit; + + phy_fatal_err = rtl8127_mdio_direct_read_phy_ocp(tp, 0xB98C); + + if (phy_fatal_err == 0) + goto exit; + + rtl8127_set_eth_phy_ocp_bit(tp, 0xBC4C, 0x0003); + rtl8127_set_eth_phy_ocp_bit(tp, 0xBC0E, 0x00C0); + rtl8127_set_eth_phy_ocp_bit(tp, 0xBC02, 0x0003); + rtl8127_set_eth_phy_ocp_bit(tp, 0xBC04, 0x0003); + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xC400, + 0x001F, + 0x0004); + rtl8127_set_eth_phy_ocp_bit(tp, 0xC400, BIT_8); + + rtl8127_set_eth_phy_ocp_bit(tp, 0xC418, BIT_0); + + rtl8127_wait_phy_state_ready(tp, HW_PHY_STATUS_INI, 5000000); + + rtl8127_set_eth_phy_ocp_bit(tp, 0xBC04, 0x0003); + udelay(10); + rtl8127_clear_eth_phy_ocp_bit(tp, 0xBC04, 0x0003); + + wait_cnt = 0; + while ((rtl8127_mdio_direct_read_phy_ocp(tp, 0xC404) & BIT_0) && wait_cnt < 50) { + mdelay(100); + wait_cnt++; + } + + rtl8127_restore_phy_fuse_dout(tp); + + if (tp->pci_dev->revision != 0x01) { + rtl8127_clear_eth_phy_ocp_bit(tp, 0xA448, BIT_10); + rtl8127_clear_eth_phy_ocp_bit(tp, 0xA586, BIT_10); + rtl8127_clear_and_set_eth_phy_ocp_bit(tp, + 0xBFA0, + 0x001F, + 0x000C); + } + + rtl8127_set_eth_phy_ocp_bit(tp, 0xA468, BIT_0); + + rtl8127_clear_phy_ups_reg(tp->dev); + + rtl8127_wait_phy_state_ready(tp, HW_PHY_STATUS_LAN_ON, 100000); + + rtl8127_mdio_direct_write_phy_ocp(tp, 0xA436, 0x801C); + rtl8127_mdio_direct_write_phy_ocp(tp, 0xA438, phy_fatal_err); + + rtl8127_restore_led_select(tp); + + tp->HwHasWrRamCodeToMicroP = FALSE; + + restore = TRUE; + +exit: + rtl8127_mdio_write(tp, 0x1F, 0x0000); + + return restore; +} + +static bool +rtl8127_test_phy_ocp(struct rtl8127_private *tp) +{ + unsigned long flags; + bool reset = false; + + r8127_spin_lock(&tp->phy_lock, flags); + + if (tp->TestPhyOcpReg == FALSE) + goto unlock; + + switch (tp->HwSuppEsdVer) { + case 6: + reset = rtl8127_test_phy_ocp_v6(tp); + break; + default: + goto unlock; + } + +unlock: + r8127_spin_unlock(&tp->phy_lock, flags); + + return reset; +} + static void rtl8127_esd_checker(struct rtl8127_private *tp) { @@ -13746,21 +14661,24 @@ rtl8127_esd_checker(struct rtl8127_private *tp) } if (tp->HwPcieSNOffset > 0) { - pci_sn_l = rtl8127_csi_read(tp, tp->HwPcieSNOffset); + pci_sn_l = rtl8127_pci_config_read(tp, tp->HwPcieSNOffset); if (pci_sn_l != tp->pci_cfg_space.pci_sn_l) { printk(KERN_ERR "%s: pci_sn_l = 0x%08x, should be 0x%08x \n.", dev->name, pci_sn_l, tp->pci_cfg_space.pci_sn_l); - rtl8127_csi_write(tp, tp->HwPcieSNOffset, tp->pci_cfg_space.pci_sn_l); + rtl8127_pci_config_write(tp, tp->HwPcieSNOffset, tp->pci_cfg_space.pci_sn_l); tp->esd_flag |= BIT_13; } - pci_sn_h = rtl8127_csi_read(tp, tp->HwPcieSNOffset + 4); + pci_sn_h = rtl8127_pci_config_read(tp, tp->HwPcieSNOffset + 4); if (pci_sn_h != tp->pci_cfg_space.pci_sn_h) { printk(KERN_ERR "%s: pci_sn_h = 0x%08x, should be 0x%08x \n.", dev->name, pci_sn_h, tp->pci_cfg_space.pci_sn_h); - rtl8127_csi_write(tp, tp->HwPcieSNOffset + 4, tp->pci_cfg_space.pci_sn_h); + rtl8127_pci_config_write(tp, tp->HwPcieSNOffset + 4, tp->pci_cfg_space.pci_sn_h); tp->esd_flag |= BIT_14; } } + if (tp->TestPhyOcpReg && rtl8127_test_phy_ocp(tp)) + tp->esd_flag |= BIT_15; + if (tp->esd_flag != 0) { printk(KERN_ERR "%s: esd_flag = 0x%04x\n.\n", dev->name, tp->esd_flag); netif_carrier_off(dev); @@ -13777,6 +14695,30 @@ rtl8127_esd_checker(struct rtl8127_private *tp) exit: return; } + +static void +rtl8127_sds_sfp_cap_checker(struct rtl8127_private *tp) +{ + unsigned long flags; + + r8127_spin_lock(&tp->phy_lock, flags); + + /* SFP is connected */ + if (!rtl8127_sds_sfp_connected_8127(tp)) + goto unlock; + + u32 currCap = rtl8127_sds_If_i2c_is_10g_sfp_cap(tp) ? 10000 : 1000; + + currCap = min(currCap, tp->speed); + if (tp->HwSerDesSfpCap != currCap) + _rtl8127_set_sds_phy_caps_8127(tp, currCap); + +unlock: + r8127_spin_unlock(&tp->phy_lock, flags); + + return; +} + /* static void #if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) @@ -13956,7 +14898,7 @@ rtl8127_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) struct rtl8127_counters *counters = tp->tally_vaddr; dma_addr_t paddr = tp->tally_paddr; - if (!counters) + if (!counters || test_bit(R8127_FLAG_SHUTDOWN, tp->task_flags)) return; netdev_stats_to_stats64(stats, &dev->stats); @@ -14076,50 +15018,6 @@ static int rtl8127_poll(napi_ptr napi, napi_budget budget) return RTL_NAPI_RETURN_VALUE; } -static int rtl8127_poll_msix_ring(napi_ptr napi, napi_budget budget) -{ - struct r8127_napi *r8127napi = RTL_GET_PRIV(napi, struct r8127_napi); - struct rtl8127_private *tp = r8127napi->priv; - RTL_GET_NETDEV(tp) - unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); - unsigned int work_done = 0; - const int message_id = r8127napi->index; - - if (message_id < tp->num_tx_rings) - rtl8127_tx_interrupt_with_vector(tp, message_id, budget); - - if (message_id < tp->num_rx_rings) - work_done += rtl8127_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); - - RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); - - if (work_done < work_to_do) { -#ifdef ENABLE_DASH_SUPPORT - if (message_id == MSIX_ID_V6_L2_MISC_INTR) - if (rtl8127_check_dash_interrupt(tp)) - rtl8127_schedule_dash_work(tp); -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) - if (RTL_NETIF_RX_COMPLETE(dev, napi, work_done) == FALSE) - return RTL_NAPI_RETURN_VALUE; -#else - RTL_NETIF_RX_COMPLETE(dev, napi, work_done); -#endif - /* - * 20040426: the barrier is not strictly required but the - * behavior of the irq handler could be less predictable - * without it. Btw, the lack of flush for the posted pci - * write is safe - FR - */ - smp_wmb(); - - rtl8127_enable_hw_layered_interrupt(tp, message_id); - } - - return RTL_NAPI_RETURN_VALUE; -} - static int rtl8127_poll_msix_tx(napi_ptr napi, napi_budget budget) { struct r8127_napi *r8127napi = RTL_GET_PRIV(napi, struct r8127_napi); @@ -14261,33 +15159,12 @@ static void rtl8127_init_napi(struct rtl8127_private *tp) case 6: if (i < R8127_MAX_RX_QUEUES_VEC_V4) poll = rtl8127_poll_msix_rx; - else if (i == 8 || i == 9) - poll = rtl8127_poll_msix_tx; - else - poll = rtl8127_poll_msix_other; - break; - case 5: - if (i < R8127_MAX_RX_QUEUES_VEC_V3) - poll = rtl8127_poll_msix_rx; - else if (i == 16 || i == 17) - poll = rtl8127_poll_msix_tx; - else - poll = rtl8127_poll_msix_other; - break; - case 2: - if (i < R8127_MAX_RX_QUEUES_VEC_V3) - poll = rtl8127_poll_msix_rx; - else if (i == 16 || i == 18) + else if (i > 7 && i < 16) poll = rtl8127_poll_msix_tx; else poll = rtl8127_poll_msix_other; break; - case 3: - case 4: - if (i < R8127_MAX_RX_QUEUES_VEC_V3) - poll = rtl8127_poll_msix_ring; - else - poll = rtl8127_poll_msix_other; + default: break; } } @@ -14494,7 +15371,7 @@ rtl8127_init_one(struct pci_dev *pdev, rtl8127_sysfs_init(dev); #endif /* ENABLE_R8127_SYSFS */ - printk("%s", GPL_CLAIM); + printk(KERN_INFO "%s", GPL_CLAIM); out: return rc; @@ -14861,6 +15738,8 @@ int rtl8127_open(struct net_device *dev) rtl8127_schedule_esd_work(tp); } + rtl8127_schedule_sds_sfp_cap_work(tp); + //rtl8127_request_link_timer(dev); rtl8127_enable_hw_linkchg_interrupt(tp); @@ -14886,8 +15765,8 @@ _rtl8127_set_l1_l0s_entry_latency(struct rtl8127_private *tp, u8 setting) /*set PCI configuration space offset 0x70F to setting*/ /*When the register offset of PCI configuration space larger than 0xff, use CSI to access it.*/ - csi_tmp = rtl8127_csi_read(tp, 0x70c) & 0xc0ffffff; - rtl8127_csi_write(tp, 0x70c, csi_tmp | temp); + csi_tmp = rtl8127_pci_config_read(tp, 0x70c) & 0xc0ffffff; + rtl8127_pci_config_write(tp, 0x70c, csi_tmp | temp); } static void @@ -14922,7 +15801,7 @@ rtl8127_set_mrrs(struct rtl8127_private *tp) static void rtl8127_disable_l1_timeout(struct rtl8127_private *tp) { - rtl8127_csi_write(tp, 0x890, rtl8127_csi_read(tp, 0x890) & ~BIT(0)); + rtl8127_pci_config_write(tp, 0x890, rtl8127_pci_config_read(tp, 0x890) & ~BIT(0)); } void @@ -15116,13 +15995,15 @@ rtl8127_hw_config(struct net_device *dev) //new tx desc format mac_ocp_data = rtl8127_mac_ocp_read(tp, 0xEB58); mac_ocp_data &= ~(BIT_0 | BIT_1); - mac_ocp_data |= (BIT_0); + mac_ocp_data |= BIT_1; /* Tx desc V3 */ rtl8127_mac_ocp_write(tp, 0xEB58, mac_ocp_data); - if (tp->EnableTxNoClose) - RTL_W8(tp, 0x20E4, RTL_R8(tp, 0x20E4) | BIT_2); - else - RTL_W8(tp, 0x20E4, RTL_R8(tp, 0x20E4) & ~BIT_2); + if (tp->mcfg == CFG_METHOD_1) { + if (tp->EnableTxNoClose) + RTL_W8(tp, 0x20E4, RTL_R8(tp, 0x20E4) | BIT_2); + else + RTL_W8(tp, 0x20E4, RTL_R8(tp, 0x20E4) & ~BIT_2); + } if (tp->HwSuppRxDescType == RX_DESC_RING_TYPE_4) { if (tp->InitRxDescType == RX_DESC_RING_TYPE_4) @@ -15194,11 +16075,15 @@ rtl8127_hw_config(struct net_device *dev) mac_ocp_data |= 0x45F; rtl8127_mac_ocp_write(tp, 0xD430, mac_ocp_data); - //rtl8127_mac_ocp_write(tp, 0xE0C0, 0x4F87); - if (!tp->DASH) - RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6 | BIT_7); - else - RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~(BIT_6 | BIT_7)); + if (tp->DASH) { + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_6); + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_6); + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_7); + } else { + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6); + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6); + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7); + } rtl8127_disable_eee_plus(tp); @@ -15217,7 +16102,7 @@ rtl8127_hw_config(struct net_device *dev) tp->tx_tcp_csum_cmd = TxTCPCS_C; tp->tx_udp_csum_cmd = TxUDPCS_C; tp->tx_ip_csum_cmd = TxIPCS_C; - tp->tx_ipv6_csum_cmd = TxIPV6F_C; + tp->tx_ipv6_csum_cmd = 0; /* config interrupt type for RTL8125B */ if (tp->HwSuppIsrVer > 1) @@ -15280,8 +16165,8 @@ rtl8127_hw_config(struct net_device *dev) pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &tp->pci_cfg_space.resv_0x2c_l); pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID + 2, &tp->pci_cfg_space.resv_0x2c_h); if (tp->HwPcieSNOffset > 0) { - tp->pci_cfg_space.pci_sn_l = rtl8127_csi_read(tp, tp->HwPcieSNOffset); - tp->pci_cfg_space.pci_sn_h = rtl8127_csi_read(tp, tp->HwPcieSNOffset + 4); + tp->pci_cfg_space.pci_sn_l = rtl8127_pci_config_read(tp, tp->HwPcieSNOffset); + tp->pci_cfg_space.pci_sn_h = rtl8127_pci_config_read(tp, tp->HwPcieSNOffset + 4); } tp->pci_cfg_is_read = 1; @@ -15874,10 +16759,22 @@ static void rtl8127_schedule_dash_work(struct rtl8127_private *tp) #endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) } +static void rtl8127_schedule_sds_sfp_cap_work(struct rtl8127_private *tp) +{ + if (tp->HwFiberModeVer != FIBER_MODE_RTL8127ATF) + return; + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + set_bit(R8127_FLAG_TASK_SDS_SFP_CAP_PENDING, tp->task_flags); + schedule_delayed_work(&tp->sds_sfp_cap_task, RTL8127_CHECK_SDS_SFP_CAP_TIMEOUT); +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) +} + #define rtl8127_cancel_schedule_reset_work(a) #define rtl8127_cancel_schedule_esd_work(a) #define rtl8127_cancel_schedule_linkchg_work(a) #define rtl8127_cancel_schedule_dash_work(a) +#define rtl8127_cancel_schedule_sds_sfp_cap_work(a) #else static void rtl8127_schedule_reset_work(struct rtl8127_private *tp) @@ -15943,6 +16840,22 @@ static void rtl8127_cancel_schedule_dash_work(struct rtl8127_private *tp) cancel_delayed_work_sync(&tp->dash_task); } + +static void rtl8127_schedule_sds_sfp_cap_work(struct rtl8127_private *tp) +{ + set_bit(R8127_FLAG_TASK_SDS_SFP_CAP_PENDING, tp->task_flags); + schedule_delayed_work(&tp->sds_sfp_cap_task, RTL8127_CHECK_SDS_SFP_CAP_TIMEOUT); +} + +static void rtl8127_cancel_schedule_sds_sfp_cap_work(struct rtl8127_private *tp) +{ + struct work_struct *work = &tp->sds_sfp_cap_task.work; + + if (!work->func) + return; + + cancel_delayed_work_sync(&tp->sds_sfp_cap_task); +} #endif static void rtl8127_init_all_schedule_work(struct rtl8127_private *tp) @@ -15952,11 +16865,13 @@ static void rtl8127_init_all_schedule_work(struct rtl8127_private *tp) INIT_WORK(&tp->esd_task, rtl8127_esd_task, dev); INIT_WORK(&tp->linkchg_task, rtl8127_linkchg_task, dev); INIT_WORK(&tp->dash_task, rtl8127_dash_task, dev); + INIT_WORK(&tp->sds_sfp_cap_task, rtl8127_sds_sfp_cap_task, dev); #else INIT_DELAYED_WORK(&tp->reset_task, rtl8127_reset_task); INIT_DELAYED_WORK(&tp->esd_task, rtl8127_esd_task); INIT_DELAYED_WORK(&tp->linkchg_task, rtl8127_linkchg_task); INIT_DELAYED_WORK(&tp->dash_task, rtl8127_dash_task); + INIT_DELAYED_WORK(&tp->sds_sfp_cap_task, rtl8127_sds_sfp_cap_task); #endif } @@ -15966,6 +16881,7 @@ static void rtl8127_cancel_all_schedule_work(struct rtl8127_private *tp) rtl8127_cancel_schedule_esd_work(tp); rtl8127_cancel_schedule_linkchg_work(tp); rtl8127_cancel_schedule_dash_work(tp); + rtl8127_cancel_schedule_sds_sfp_cap_work(tp); } static void @@ -15990,11 +16906,6 @@ _rtl8127_wait_for_quiescence(struct net_device *dev) rtl8127_disable_napi(tp); #endif//CONFIG_R8127_NAPI -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,67) - /* Give a racing hard_start_xmit a few cycles to complete. */ - synchronize_net(); -#endif - rtl8127_irq_mask_and_ack(tp); rtl8127_wait_for_irq_complete(tp); @@ -16162,6 +17073,33 @@ static void rtl8127_dash_task(struct work_struct *work) rtnl_unlock(); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +static void rtl8127_sds_sfp_cap_task(void *_data) +{ + struct net_device *dev = _data; + struct rtl8127_private *tp = netdev_priv(dev); +#else +static void rtl8127_sds_sfp_cap_task(struct work_struct *work) +{ + struct rtl8127_private *tp = + container_of(work, struct rtl8127_private, sds_sfp_cap_task.work); + struct net_device *dev = tp->dev; +#endif + rtnl_lock(); + + if (!netif_running(dev) || + test_bit(R8127_FLAG_DOWN, tp->task_flags) || + !test_and_clear_bit(R8127_FLAG_TASK_SDS_SFP_CAP_PENDING, tp->task_flags)) + goto out_unlock; + + rtl8127_sds_sfp_cap_checker(tp); + + rtl8127_schedule_sds_sfp_cap_work(tp); + +out_unlock: + rtnl_unlock(); +} + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) static void rtl8127_tx_timeout(struct net_device *dev, unsigned int txqueue) @@ -16295,6 +17233,7 @@ u8 rtl8127_get_l4_protocol(struct sk_buff *skb) return ip_protocol; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) static bool rtl8127_skb_pad_with_len(struct sk_buff *skb, unsigned int len) { if (skb_padto(skb, len)) @@ -16302,6 +17241,7 @@ static bool rtl8127_skb_pad_with_len(struct sk_buff *skb, unsigned int len) skb_put(skb, len - skb->len); return true; } +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) static bool rtl8127_skb_pad(struct sk_buff *skb) { @@ -16337,68 +17277,14 @@ static int msdn_giant_send_check(struct sk_buff *skb) } #endif -static bool rtl8127_require_pad_ptp_pkt(struct rtl8127_private *tp) -{ - return false; -} - -#define MIN_PATCH_LEN (47) static u32 -rtl8127_get_patch_pad_len(struct rtl8127_private *tp, - struct sk_buff *skb) -{ - u32 pad_len = 0; - int trans_data_len; - u32 hdr_len; - u32 pkt_len = skb->len; - u8 ip_protocol; - bool has_trans = skb_transport_header_was_set(skb); - - if (!rtl8127_require_pad_ptp_pkt(tp)) - goto no_padding; - - if (!(has_trans && (pkt_len < 175))) //128 + MIN_PATCH_LEN - goto no_padding; - - ip_protocol = rtl8127_get_l4_protocol(skb); - if (!(ip_protocol == IPPROTO_TCP || ip_protocol == IPPROTO_UDP)) - goto no_padding; - - trans_data_len = pkt_len - - (skb->transport_header - - skb_headroom(skb)); - if (ip_protocol == IPPROTO_UDP) { - if (trans_data_len > 3 && trans_data_len < MIN_PATCH_LEN) { - u16 dest_port = 0; - - skb_copy_bits(skb, skb->transport_header - skb_headroom(skb) + 2, &dest_port, 2); - dest_port = ntohs(dest_port); - - if (dest_port == 0x13f || - dest_port == 0x140) { - pad_len = MIN_PATCH_LEN - trans_data_len; - goto out; - } - } - } - - hdr_len = 0; - if (ip_protocol == IPPROTO_TCP) - hdr_len = 20; - else if (ip_protocol == IPPROTO_UDP) - hdr_len = 8; - if (trans_data_len < hdr_len) - pad_len = hdr_len - trans_data_len; - -out: - if ((pkt_len + pad_len) < ETH_ZLEN) - pad_len = ETH_ZLEN - pkt_len; - - return pad_len; - -no_padding: - - return 0; +rtl8127_get_skb_mss(struct sk_buff *skb) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) + return skb_shinfo(skb)->tso_size; +#else + return skb_shinfo(skb)->gso_size; +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) } static bool @@ -16409,18 +17295,12 @@ rtl8127_tso_csum(struct sk_buff *skb, unsigned short *gso_segs) { struct rtl8127_private *tp = netdev_priv(dev); - unsigned long large_send = 0; u32 csum_cmd = 0; u8 sw_calc_csum = false; - u8 check_patch_required = true; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) if (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) - u32 mss = skb_shinfo(skb)->tso_size; -#else - u32 mss = skb_shinfo(skb)->gso_size; -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) + u32 mss = rtl8127_get_skb_mss(skb); /* TCP Segmentation Offload (or TCP Large Send) */ if (mss) { @@ -16444,10 +17324,10 @@ rtl8127_tso_csum(struct sk_buff *skb, switch (get_protocol(skb)) { case __constant_htons(ETH_P_IP): if (l4_offset <= GTTCPHO_MAX) { - opts[0] |= GiantSendv4; + opts[1] |= GiantSendEn_V3 | GiantSendv4_V3; opts[0] |= l4_offset << GTTCPHO_SHIFT; opts[1] |= min(mss, MSS_MAX) << 18; - large_send = 1; + opts[1] |= GiantSendTCP_V3; } break; case __constant_htons(ETH_P_IPV6): @@ -16456,21 +17336,17 @@ rtl8127_tso_csum(struct sk_buff *skb, return false; #endif if (l4_offset <= GTTCPHO_MAX) { - opts[0] |= GiantSendv6; + opts[1] |= GiantSendEn_V3 | GiantSendv6_V3; opts[0] |= l4_offset << GTTCPHO_SHIFT; opts[1] |= min(mss, MSS_MAX) << 18; - large_send = 1; + opts[1] |= GiantSendTCP_V3; } break; default: if (unlikely(net_ratelimit())) dprintk("tso proto=%x!\n", skb->protocol); - break; - } - - if (large_send == 0) return false; - + } /* compute length of segmentation header */ hdr_len = (l4.tcp->doff * 4) + l4_offset; @@ -16510,7 +17386,7 @@ rtl8127_tso_csum(struct sk_buff *skb, if (skb_transport_offset(skb) > 0 && skb_transport_offset(skb) <= TCPHO_MAX) { ip_protocol = ipv6_hdr(skb)->nexthdr; csum_cmd = tp->tx_ipv6_csum_cmd; - csum_cmd |= skb_transport_offset(skb) << TCPHO_SHIFT; + opts[0] |= skb_transport_offset(skb) << TCPHO_SHIFT; } } break; @@ -16531,21 +17407,6 @@ rtl8127_tso_csum(struct sk_buff *skb, WARN_ON(1); /* we need a WARN() */ #endif } - - if (ip_protocol == IPPROTO_TCP) - check_patch_required = false; - } - - if (check_patch_required) { - u32 pad_len = rtl8127_get_patch_pad_len(tp, skb); - - if (pad_len > 0) { - if (!rtl8127_skb_pad_with_len(skb, skb->len + pad_len)) - return false; - - if (csum_cmd != 0) - sw_calc_csum = true; - } } if (skb->len < ETH_ZLEN) { @@ -16604,8 +17465,8 @@ static void rtl8127_doorbell(struct rtl8127_private *tp, } static netdev_tx_t -rtl8127_start_xmit(struct sk_buff *skb, - struct net_device *dev) +_rtl8127_start_xmit(struct sk_buff *skb, + struct net_device *dev) { struct rtl8127_private *tp = netdev_priv(dev); unsigned int bytecount; @@ -16763,6 +17624,74 @@ rtl8127_start_xmit(struct sk_buff *skb, goto out; } +static bool +rtl8127_tso_quirk_gso_check(struct net_device *dev, struct sk_buff *skb) +{ + if ((dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) && + (rtl8127_get_skb_mss(skb) > MSS_MAX)) + return true; + else + return false; +} + +static int rtl8127_tso_quirk(struct net_device *dev, struct sk_buff *skb) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) + return _rtl8127_start_xmit(skb, dev); +#else + const u16 queue_mapping = skb_get_queue_mapping(skb); + struct rtl8127_private *tp = netdev_priv(dev); + struct sk_buff *segs, *seg, *next; + struct rtl8127_tx_ring *ring; + + ring = &tp->tx_ring[queue_mapping]; + + /* Estimate the number of fragments in the worst case */ + if (unlikely(!rtl8127_tx_slots_avail(tp, ring))) { + netif_stop_subqueue(dev, queue_mapping); + + smp_mb(); + if (!rtl8127_tx_slots_avail(tp, ring)) + return NETDEV_TX_BUSY; + + netif_start_subqueue(dev, queue_mapping); + } + + segs = skb_gso_segment(skb, dev->features & + ~(NETIF_F_TSO | NETIF_F_TSO6)); + if (IS_ERR(segs) || !segs) { + RTLDEV->stats.tx_dropped++; + goto exit; + } + + skb_list_walk_safe(segs, seg, next) { + skb_mark_not_on_list(seg); + _rtl8127_start_xmit(seg, dev); + } + +exit: + dev_consume_skb_any(skb); + + return NETDEV_TX_OK; +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) */ +} + +static netdev_tx_t +rtl8127_start_xmit(struct sk_buff *skb, + struct net_device *dev) +{ + if (rtl8127_tso_quirk_gso_check(dev, skb)) + return rtl8127_tso_quirk(dev, skb); + else + return _rtl8127_start_xmit(skb, dev); +} + +static void +rtl8127_desc_quirk(struct rtl8127_private *tp) +{ + RTL_R8(tp, tp->imr_reg[0]); +} + /* recycle tx no close desc*/ static int rtl8127_tx_interrupt_noclose(struct rtl8127_tx_ring *ring, int budget) @@ -16832,6 +17761,7 @@ rtl8127_tx_interrupt_close(struct rtl8127_tx_ring *ring, int budget) struct net_device *dev = tp->dev; unsigned int dirty_tx, tx_left; unsigned int count = 0; + u32 status; dirty_tx = ring->dirty_tx; tx_left = READ_ONCE(ring->cur_tx) - dirty_tx; @@ -16840,8 +17770,18 @@ rtl8127_tx_interrupt_close(struct rtl8127_tx_ring *ring, int budget) unsigned int entry = dirty_tx % ring->num_tx_desc; struct ring_info *tx_skb = ring->tx_skb + entry; - if (le32_to_cpu(READ_ONCE(ring->TxDescArray[entry].opts1)) & DescOwn) - break; + status = le32_to_cpu(READ_ONCE(ring->TxDescArray[entry].opts1)); + if (status & DescOwn) { + if (!tp->recheck_desc_ownbit) + break; + + tp->recheck_desc_ownbit = FALSE; + + rtl8127_desc_quirk(tp); + status = le32_to_cpu(READ_ONCE(ring->TxDescArray[entry].opts1)); + if (status & DescOwn) + break; + } rtl8127_unmap_tx_skb(tp->pci_dev, tx_skb, @@ -16902,34 +17842,14 @@ rtl8127_tx_interrupt_with_vector(struct rtl8127_private *tp, int count = 0; switch (tp->HwCurrIsrVer) { - case 3: - case 4: - if (message_id < tp->num_tx_rings) - count += rtl8127_tx_interrupt(&tp->tx_ring[message_id], budget); - break; - case 5: - if (message_id == 16) - count += rtl8127_tx_interrupt(&tp->tx_ring[0], budget); -#ifdef ENABLE_MULTIPLE_TX_QUEUE - else if (message_id == 17 && tp->num_tx_rings > 1) - count += rtl8127_tx_interrupt(&tp->tx_ring[1], budget); -#endif - break; case 6: - if (message_id == 8) - count += rtl8127_tx_interrupt(&tp->tx_ring[0], budget); -#ifdef ENABLE_MULTIPLE_TX_QUEUE - else if (message_id == 9 && tp->num_tx_rings > 1) - count += rtl8127_tx_interrupt(&tp->tx_ring[1], budget); -#endif + if (message_id > 7 && message_id < 16) { + u32 idx = message_id - 8; + count += rtl8127_tx_interrupt(&tp->tx_ring[idx], + budget); + } break; default: - if (message_id == 16) - count += rtl8127_tx_interrupt(&tp->tx_ring[0], budget); -#ifdef ENABLE_MULTIPLE_TX_QUEUE - else if (message_id == 18 && tp->num_tx_rings > 1) - count += rtl8127_tx_interrupt(&tp->tx_ring[1], budget); -#endif break; } @@ -17255,7 +18175,12 @@ rtl8127_rx_interrupt(struct net_device *dev, desc = rtl8127_get_rxdesc(tp, ring->RxDescArray, entry); status = le32_to_cpu(rtl8127_rx_desc_opts1(tp, desc)); if (status & DescOwn) { - RTL_R8(tp, tp->imr_reg[0]); + if (!tp->recheck_desc_ownbit) + break; + + tp->recheck_desc_ownbit = FALSE; + + rtl8127_desc_quirk(tp); status = le32_to_cpu(rtl8127_rx_desc_opts1(tp, desc)); if (status & DescOwn) break; @@ -17342,14 +18267,15 @@ rtl8127_rx_interrupt(struct net_device *dev, } else skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rxb->page, rxb->page_offset, pkt_size, tp->rx_buf_page_size / 2); - //recycle desc - rtl8127_put_rx_buffer(tp, ring, cur_rx, rxb); dma_sync_single_range_for_cpu(tp_to_dev(tp), rxb->dma, rxb->page_offset, tp->rx_buf_sz, DMA_FROM_DEVICE); + + //recycle desc + rtl8127_put_rx_buffer(tp, ring, cur_rx, rxb); #else //ENABLE_PAGE_REUSE skb = RTL_ALLOC_SKB_INTR(&tp->r8127napi[ring->index].napi, pkt_size + R8127_RX_ALIGN); if (!skb) { @@ -17465,13 +18391,6 @@ static bool rtl8127_linkchg_interrupt(struct rtl8127_private *tp, u32 status) { switch (tp->HwCurrIsrVer) { - case 2: - case 3: - return status & ISRIMR_V2_LINKCHG; - case 4: - return status & ISRIMR_V4_LINKCHG; - case 5: - return status & ISRIMR_V5_LINKCHG; case 6: return status & ISRIMR_V6_LINKCHG; default: @@ -17483,11 +18402,8 @@ static u32 rtl8127_get_linkchg_message_id(struct rtl8127_private *tp) { switch (tp->HwCurrIsrVer) { - case 4: case 6: return MSIX_ID_V4_LINKCHG; - case 5: - return MSIX_ID_V5_LINKCHG; default: return MSIX_ID_V2_LINKCHG; } @@ -17538,11 +18454,13 @@ static irqreturn_t rtl8127_interrupt(int irq, void *dev_instance) rtl8127_schedule_linkchg_work(tp); #ifdef ENABLE_DASH_SUPPORT - if ((status & ISRIMR_V6_LAYER2_INTR_STS) && + if ((status & ISRIMR_DASH_INTR_EN) && rtl8127_check_dash_interrupt(tp)) rtl8127_schedule_dash_work(tp); #endif + tp->recheck_desc_ownbit = TRUE; + #ifdef CONFIG_R8127_NAPI if (status & tp->intr_mask || tp->keep_intr_cnt-- > 0) { if (status & tp->intr_mask) @@ -17574,12 +18492,6 @@ static irqreturn_t rtl8127_interrupt(int irq, void *dev_instance) rtl8127_rx_interrupt(dev, tp, &tp->rx_ring[0], budget); #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) -#ifdef ENABLE_DASH_SUPPORT - if ((status & ISRIMR_V6_LAYER2_INTR_STS) && - rtl8127_check_dash_interrupt(tp)) - rtl8127_schedule_dash_work(tp); -#endif - rtl8127_switch_to_timer_interrupt(tp); } else { tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT; @@ -17629,19 +18541,18 @@ static irqreturn_t rtl8127_interrupt_msix(int irq, void *dev_instance) } #endif + tp->recheck_desc_ownbit = TRUE; + + rtl8127_disable_hw_layered_interrupt(tp, message_id); + + rtl8127_clear_hw_isr_v2(tp, message_id); #ifdef CONFIG_R8127_NAPI - if (likely(RTL_NETIF_RX_SCHEDULE_PREP(dev, &r8127napi->napi))) { - rtl8127_disable_hw_layered_interrupt(tp, message_id); + if (likely(RTL_NETIF_RX_SCHEDULE_PREP(dev, &r8127napi->napi))) __RTL_NETIF_RX_SCHEDULE(dev, &r8127napi->napi); - } else if (netif_msg_intr(tp)) + else if (netif_msg_intr(tp)) printk(KERN_INFO "%s: interrupt message id %d in poll_msix\n", dev->name, message_id); - rtl8127_clear_hw_isr_v2(tp, message_id); #else - rtl8127_disable_hw_layered_interrupt(tp, message_id); - - rtl8127_clear_hw_isr_v2(tp, message_id); - rtl8127_tx_interrupt_with_vector(tp, message_id, ~(u32)0); if (message_id < tp->num_rx_rings) { @@ -17732,8 +18643,12 @@ static void rtl8127_shutdown(struct pci_dev *pdev) struct net_device *dev = pci_get_drvdata(pdev); struct rtl8127_private *tp = netdev_priv(dev); + rtl8127_cancel_all_schedule_work(tp); + rtnl_lock(); + set_bit(R8127_FLAG_SHUTDOWN, tp->task_flags); + if (HW_DASH_SUPPORT_DASH(tp)) rtl8127_driver_stop(tp); @@ -17783,6 +18698,8 @@ rtl8127_suspend(struct pci_dev *pdev, pm_message_t state) #endif rtnl_lock(); + set_bit(R8127_FLAG_SUSPEND, tp->task_flags); + if (!netif_running(dev)) goto out; @@ -17870,6 +18787,8 @@ rtl8127_resume(struct device *device) rtnl_lock(); + clear_bit(R8127_FLAG_SUSPEND, tp->task_flags); + err = pci_enable_device(pdev); if (err) { dev_err(&pdev->dev, "Cannot enable PCI device from suspend\n"); @@ -17911,6 +18830,8 @@ rtl8127_resume(struct device *device) rtl8127_schedule_esd_work(tp); + rtl8127_schedule_sds_sfp_cap_work(tp); + //mod_timer(&tp->esd_timer, jiffies + RTL8127_ESD_TIMEOUT); //mod_timer(&tp->link_timer, jiffies + RTL8127_LINK_TIMEOUT); out_unlock: diff --git a/r8127_ptp.c b/r8127_ptp.c index 9840010..a84dbe5 100644 --- a/r8127_ptp.c +++ b/r8127_ptp.c @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -293,6 +293,8 @@ static int rtl8127_phc_settime(struct ptp_clock_info *ptp, return ret; } +#define R8127_PPS_TIMER_INTERVAL 1000000000 + static void _rtl8127_phc_enable(struct ptp_clock_info *ptp, struct ptp_clock_request *rq, int on) { @@ -327,7 +329,7 @@ static void _rtl8127_phc_enable(struct ptp_clock_info *ptp, r8127_spin_unlock(&tp->phy_lock, flags); /* start hrtimer */ - hrtimer_start(&tp->pps_timer, 1000000000, HRTIMER_MODE_REL); + hrtimer_start(&tp->pps_timer, ktime_set(0, R8127_PPS_TIMER_INTERVAL), HRTIMER_MODE_REL); } else tp->pps_enable = 0; } @@ -724,7 +726,7 @@ rtl8127_hrtimer_for_pps(struct hrtimer *timer) { r8127_spin_unlock(&tp->phy_lock, flags); - hrtimer_forward_now(&tp->pps_timer, 1000000000); //rekick + hrtimer_forward_now(&tp->pps_timer, ktime_set(0, R8127_PPS_TIMER_INTERVAL)); //rekick return HRTIMER_RESTART; } else return HRTIMER_NORESTART; @@ -751,8 +753,16 @@ void rtl8127_ptp_init(struct rtl8127_private *tp) /* init a hrtimer for pps */ tp->pps_enable = 0; +#if LINUX_VERSION_CODE < KERNEL_VERSION(6,13,0) hrtimer_init(&tp->pps_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); tp->pps_timer.function = rtl8127_hrtimer_for_pps; +#else + hrtimer_setup(&tp->pps_timer, rtl8127_hrtimer_for_pps, CLOCK_MONOTONIC, + HRTIMER_MODE_REL); +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(6,13,0) */ + + tp->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; + tp->hwtstamp_config.tx_type = HWTSTAMP_TX_OFF; /* reset the PTP related hardware bits */ rtl8127_ptp_reset(tp); diff --git a/r8127_ptp.h b/r8127_ptp.h index 3365c0b..ce463f0 100644 --- a/r8127_ptp.h +++ b/r8127_ptp.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/r8127_realwow.h b/r8127_realwow.h index a869b6c..711c0e6 100644 --- a/r8127_realwow.h +++ b/r8127_realwow.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/r8127_rss.c b/r8127_rss.c index e364621..cf1bc06 100644 --- a/r8127_rss.c +++ b/r8127_rss.c @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 @@ -576,6 +576,8 @@ void rtl8127_init_rss(struct rtl8127_private *tp) { int i; + tp->rss_flags = RTL8127_UDP_RSS_FLAGS; + for (i = 0; i < rtl8127_rss_indir_tbl_entries(tp); i++) tp->rss_indir_tbl[i] = ethtool_rxfh_indir_default(i, tp->num_rx_rings); diff --git a/r8127_rss.h b/r8127_rss.h index 8e92bb8..57e8b16 100644 --- a/r8127_rss.h +++ b/r8127_rss.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/rtl_eeprom.c b/rtl_eeprom.c index 094b31c..6de65fb 100644 --- a/rtl_eeprom.c +++ b/rtl_eeprom.c @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/rtl_eeprom.h b/rtl_eeprom.h index e4d8c6c..963ab79 100644 --- a/rtl_eeprom.h +++ b/rtl_eeprom.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/rtltool.c b/rtltool.c index a37495b..5e0d298 100644 --- a/rtltool.c +++ b/rtltool.c @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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 diff --git a/rtltool.h b/rtltool.h index 42e6405..718ee5e 100644 --- a/rtltool.h +++ b/rtltool.h @@ -5,7 +5,7 @@ # r8127 is the Linux device driver released for Realtek 10 Gigabit Ethernet # controllers with PCI-Express interface. # -# Copyright(c) 2025 Realtek Semiconductor Corp. All rights reserved. +# Copyright(c) 2026 Realtek Semiconductor Corp. All rights reserved. # # This program 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